summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rwxr-xr-x.travis-build.sh67
-rwxr-xr-x.travis-deps.sh40
-rwxr-xr-x.travis-upload.sh129
-rw-r--r--.travis.yml45
-rwxr-xr-x.travis/clang-format/script.sh37
-rwxr-xr-x.travis/common/post-upload.sh22
-rwxr-xr-x.travis/common/pre-upload.sh6
-rwxr-xr-x.travis/linux/build.sh3
-rwxr-xr-x.travis/linux/deps.sh3
-rwxr-xr-x.travis/linux/docker.sh17
-rwxr-xr-x.travis/linux/upload.sh14
-rwxr-xr-x.travis/macos/build.sh12
-rwxr-xr-x.travis/macos/deps.sh4
-rwxr-xr-x.travis/macos/upload.sh110
-rw-r--r--CMakeLists.txt43
-rw-r--r--CMakeModules/DownloadExternals.cmake18
-rw-r--r--README.md2
-rw-r--r--appveyor.yml167
-rw-r--r--dist/citra.icnsbin1027012 -> 211056 bytes
-rw-r--r--dist/citra.icobin509287 -> 370070 bytes
-rw-r--r--dist/citra.manifest24
-rw-r--r--dist/citra.svg80
-rw-r--r--dist/doc-icon.pngbin8791 -> 7768 bytes
-rw-r--r--dist/icons/checked.pngbin0 -> 451 bytes
-rw-r--r--dist/icons/failed.pngbin0 -> 428 bytes
-rw-r--r--dist/icons/icons.qrc6
-rw-r--r--externals/CMakeLists.txt23
m---------externals/cryptopp/cryptopp0
m---------externals/dynarmic0
m---------externals/enet0
m---------externals/soundtouch0
-rw-r--r--src/audio_core/codec.cpp4
-rw-r--r--src/audio_core/codec.h4
-rw-r--r--src/audio_core/hle/source.cpp49
-rw-r--r--src/audio_core/hle/source.h2
-rw-r--r--src/audio_core/interpolate.cpp86
-rw-r--r--src/audio_core/interpolate.h31
-rw-r--r--src/citra/citra.cpp2
-rw-r--r--src/citra/citra.rc8
-rw-r--r--src/citra/config.cpp11
-rw-r--r--src/citra/default_ini.h29
-rw-r--r--src/citra/emu_window/emu_window_sdl2.cpp10
-rw-r--r--src/citra/emu_window/emu_window_sdl2.h4
-rw-r--r--src/citra_qt/CMakeLists.txt8
-rw-r--r--src/citra_qt/bootmanager.cpp10
-rw-r--r--src/citra_qt/bootmanager.h4
-rw-r--r--src/citra_qt/citra-qt.rc12
-rw-r--r--src/citra_qt/configuration/config.cpp23
-rw-r--r--src/citra_qt/configuration/configure.ui15
-rw-r--r--src/citra_qt/configuration/configure_dialog.cpp1
-rw-r--r--src/citra_qt/configuration/configure_graphics.ui33
-rw-r--r--src/citra_qt/configuration/configure_system.cpp3
-rw-r--r--src/citra_qt/configuration/configure_web.cpp102
-rw-r--r--src/citra_qt/configuration/configure_web.h40
-rw-r--r--src/citra_qt/configuration/configure_web.ui190
-rw-r--r--src/citra_qt/debugger/graphics/graphics_cmdlists.cpp4
-rw-r--r--src/citra_qt/debugger/graphics/graphics_surface.cpp3
-rw-r--r--src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp41
-rw-r--r--src/citra_qt/main.cpp48
-rw-r--r--src/citra_qt/main.h2
-rw-r--r--src/citra_qt/ui_settings.h2
-rw-r--r--src/common/common_types.h4
-rw-r--r--src/common/quaternion.h5
-rw-r--r--src/common/scm_rev.cpp.in2
-rw-r--r--src/common/scm_rev.h1
-rw-r--r--src/common/string_util.cpp2
-rw-r--r--src/common/string_util.h2
-rw-r--r--src/common/vector_math.h29
-rw-r--r--src/core/CMakeLists.txt20
-rw-r--r--src/core/arm/arm_interface.h22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp93
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h17
-rw-r--r--src/core/arm/dyncom/arm_dyncom.cpp19
-rw-r--r--src/core/arm/dyncom/arm_dyncom.h5
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp8
-rw-r--r--src/core/arm/skyeye_common/armstate.h2
-rw-r--r--src/core/core.cpp12
-rw-r--r--src/core/core.h9
-rw-r--r--src/core/core_timing.cpp36
-rw-r--r--src/core/core_timing.h6
-rw-r--r--src/core/file_sys/archive_backend.cpp2
-rw-r--r--src/core/file_sys/archive_ncch.cpp29
-rw-r--r--src/core/file_sys/archive_sdmc.cpp41
-rw-r--r--src/core/file_sys/archive_selfncch.cpp60
-rw-r--r--src/core/file_sys/archive_selfncch.h13
-rw-r--r--src/core/file_sys/ncch_container.cpp423
-rw-r--r--src/core/file_sys/ncch_container.h274
-rw-r--r--src/core/file_sys/savedata_archive.cpp41
-rw-r--r--src/core/file_sys/title_metadata.cpp212
-rw-r--r--src/core/file_sys/title_metadata.h125
-rw-r--r--src/core/frontend/emu_window.cpp97
-rw-r--r--src/core/frontend/emu_window.h114
-rw-r--r--src/core/frontend/framebuffer_layout.cpp36
-rw-r--r--src/core/frontend/framebuffer_layout.h11
-rw-r--r--src/core/frontend/input.h25
-rw-r--r--src/core/frontend/motion_emu.cpp89
-rw-r--r--src/core/frontend/motion_emu.h52
-rw-r--r--src/core/gdbstub/gdbstub.cpp24
-rw-r--r--src/core/hle/applets/erreula.cpp4
-rw-r--r--src/core/hle/applets/mii_selector.cpp10
-rw-r--r--src/core/hle/applets/mii_selector.h57
-rw-r--r--src/core/hle/applets/mint.cpp4
-rw-r--r--src/core/hle/applets/swkbd.cpp4
-rw-r--r--src/core/hle/function_wrappers.h108
-rw-r--r--src/core/hle/ipc.h8
-rw-r--r--src/core/hle/ipc_helpers.h12
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/kernel.h5
-rw-r--r--src/core/hle/kernel/memory.cpp30
-rw-r--r--src/core/hle/kernel/memory.h2
-rw-r--r--src/core/hle/kernel/mutex.cpp5
-rw-r--r--src/core/hle/kernel/mutex.h3
-rw-r--r--src/core/hle/kernel/process.cpp3
-rw-r--r--src/core/hle/kernel/resource_limit.cpp2
-rw-r--r--src/core/hle/kernel/resource_limit.h2
-rw-r--r--src/core/hle/kernel/semaphore.cpp3
-rw-r--r--src/core/hle/kernel/semaphore.h3
-rw-r--r--src/core/hle/kernel/shared_memory.cpp30
-rw-r--r--src/core/hle/kernel/shared_memory.h2
-rw-r--r--src/core/hle/kernel/thread.cpp68
-rw-r--r--src/core/hle/kernel/thread.h48
-rw-r--r--src/core/hle/kernel/vm_manager.cpp19
-rw-r--r--src/core/hle/kernel/vm_manager.h6
-rw-r--r--src/core/hle/kernel/wait_object.cpp13
-rw-r--r--src/core/hle/lock.cpp11
-rw-r--r--src/core/hle/lock.h18
-rw-r--r--src/core/hle/service/apt/apt.cpp729
-rw-r--r--src/core/hle/service/apt/apt.h20
-rw-r--r--src/core/hle/service/apt/apt_s.cpp8
-rw-r--r--src/core/hle/service/cam/cam.cpp2
-rw-r--r--src/core/hle/service/cfg/cfg.cpp6
-rw-r--r--src/core/hle/service/cfg/cfg.h2
-rw-r--r--src/core/hle/service/csnd_snd.cpp2
-rw-r--r--src/core/hle/service/dlp/dlp_clnt.cpp21
-rw-r--r--src/core/hle/service/dlp/dlp_fkcl.cpp18
-rw-r--r--src/core/hle/service/dlp/dlp_srvr.cpp9
-rw-r--r--src/core/hle/service/dsp_dsp.cpp7
-rw-r--r--src/core/hle/service/fs/archive.cpp20
-rw-r--r--src/core/hle/service/fs/archive.h7
-rw-r--r--src/core/hle/service/hid/hid.cpp44
-rw-r--r--src/core/hle/service/hid/hid.h2
-rw-r--r--src/core/hle/service/ir/ir_rst.cpp2
-rw-r--r--src/core/hle/service/ldr_ro/cro_helper.h6
-rw-r--r--src/core/hle/service/nim/nim.cpp18
-rw-r--r--src/core/hle/service/nim/nim.h11
-rw-r--r--src/core/hle/service/nim/nim_u.cpp2
-rw-r--r--src/core/hle/service/ns/ns.cpp16
-rw-r--r--src/core/hle/service/ns/ns.h16
-rw-r--r--src/core/hle/service/ns/ns_s.cpp34
-rw-r--r--src/core/hle/service/ns/ns_s.h (renamed from src/core/hle/service/ns_s.h)9
-rw-r--r--src/core/hle/service/ns_s.cpp33
-rw-r--r--src/core/hle/service/nwm/nwm_uds.cpp485
-rw-r--r--src/core/hle/service/nwm/nwm_uds.h12
-rw-r--r--src/core/hle/service/nwm/uds_beacon.cpp7
-rw-r--r--src/core/hle/service/nwm/uds_beacon.h30
-rw-r--r--src/core/hle/service/nwm/uds_connection.cpp88
-rw-r--r--src/core/hle/service/nwm/uds_connection.h56
-rw-r--r--src/core/hle/service/nwm/uds_data.cpp103
-rw-r--r--src/core/hle/service/nwm/uds_data.h86
-rw-r--r--src/core/hle/service/service.cpp5
-rw-r--r--src/core/hle/service/sm/sm.cpp4
-rw-r--r--src/core/hle/service/sm/sm.h3
-rw-r--r--src/core/hle/service/sm/srv.cpp28
-rw-r--r--src/core/hle/service/sm/srv.h1
-rw-r--r--src/core/hw/gpu.cpp20
-rw-r--r--src/core/hw/gpu.h4
-rw-r--r--src/core/loader/3dsx.cpp20
-rw-r--r--src/core/loader/3dsx.h2
-rw-r--r--src/core/loader/elf.cpp16
-rw-r--r--src/core/loader/elf.h2
-rw-r--r--src/core/loader/loader.h35
-rw-r--r--src/core/loader/ncch.cpp371
-rw-r--r--src/core/loader/ncch.h203
-rw-r--r--src/core/loader/nro.cpp12
-rw-r--r--src/core/loader/nro.h2
-rw-r--r--src/core/loader/nso.cpp12
-rw-r--r--src/core/loader/nso.h2
-rw-r--r--src/core/memory.cpp354
-rw-r--r--src/core/memory.h91
-rw-r--r--src/core/memory_setup.h10
-rw-r--r--src/core/settings.cpp2
-rw-r--r--src/core/settings.h11
-rw-r--r--src/core/telemetry_session.cpp86
-rw-r--r--src/core/telemetry_session.h22
-rw-r--r--src/input_common/CMakeLists.txt2
-rw-r--r--src/input_common/main.cpp15
-rw-r--r--src/input_common/main.h7
-rw-r--r--src/input_common/motion_emu.cpp168
-rw-r--r--src/input_common/motion_emu.h46
-rw-r--r--src/input_common/sdl/sdl.cpp2
-rw-r--r--src/network/packet.cpp40
-rw-r--r--src/network/packet.h4
-rw-r--r--src/network/room.cpp89
-rw-r--r--src/network/room.h21
-rw-r--r--src/network/room_member.cpp128
-rw-r--r--src/network/room_member.h59
-rw-r--r--src/tests/CMakeLists.txt4
-rw-r--r--src/tests/core/arm/arm_test_common.cpp137
-rw-r--r--src/tests/core/arm/arm_test_common.h84
-rw-r--r--src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp50
-rw-r--r--src/tests/core/arm/dyncom/vfp_vadd_f32.inc13456
-rw-r--r--src/tests/core/memory/memory.cpp56
-rw-r--r--src/video_core/CMakeLists.txt4
-rw-r--r--src/video_core/command_processor.cpp492
-rw-r--r--src/video_core/geometry_pipeline.cpp274
-rw-r--r--src/video_core/geometry_pipeline.h49
-rw-r--r--src/video_core/pica.cpp21
-rw-r--r--src/video_core/pica_state.h13
-rw-r--r--src/video_core/pica_types.h18
-rw-r--r--src/video_core/primitive_assembly.cpp15
-rw-r--r--src/video_core/primitive_assembly.h7
-rw-r--r--src/video_core/regs_framebuffer.h10
-rw-r--r--src/video_core/regs_pipeline.h43
-rw-r--r--src/video_core/regs_rasterizer.h14
-rw-r--r--src/video_core/regs_shader.h7
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp56
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h9
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp115
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp13
-rw-r--r--src/video_core/renderer_opengl/gl_state.h3
-rw-r--r--src/video_core/shader/shader.cpp44
-rw-r--r--src/video_core/shader/shader.h49
-rw-r--r--src/video_core/shader/shader_interpreter.cpp18
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.cpp49
-rw-r--r--src/video_core/shader/shader_jit_x64_compiler.h2
-rw-r--r--src/video_core/swrasterizer/clipper.cpp46
-rw-r--r--src/video_core/swrasterizer/framebuffer.cpp2
-rw-r--r--src/video_core/swrasterizer/lighting.cpp308
-rw-r--r--src/video_core/swrasterizer/lighting.h19
-rw-r--r--src/video_core/swrasterizer/rasterizer.cpp29
-rw-r--r--src/video_core/swrasterizer/rasterizer.h6
-rw-r--r--src/video_core/swrasterizer/texturing.cpp4
-rw-r--r--src/video_core/utils.h14
-rw-r--r--src/web_service/CMakeLists.txt2
-rw-r--r--src/web_service/telemetry_json.cpp3
-rw-r--r--src/web_service/telemetry_json.h7
-rw-r--r--src/web_service/verify_login.cpp28
-rw-r--r--src/web_service/verify_login.h24
-rw-r--r--src/web_service/web_backend.cpp138
-rw-r--r--src/web_service/web_backend.h32
241 files changed, 20955 insertions, 2730 deletions
diff --git a/.gitignore b/.gitignore
index ec74b0fa4..7999a40e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,12 +9,16 @@ src/common/scm_rev.cpp
# Project/editor files
*.swp
.idea/
+.vs/
.vscode/
# *nix related
# Common convention for backup or temporary files
*~
+# Visual Studio CMake settings
+CMakeSettings.json
+
# OSX global filetypes
# Created by Finder or Spotlight in directories for various OS functionality (indexing, etc)
.DS_Store
diff --git a/.travis-build.sh b/.travis-build.sh
deleted file mode 100755
index df6e236b6..000000000
--- a/.travis-build.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-
-set -e
-set -x
-
-if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
- dist/*.svg dist/*.xml; then
- echo Trailing whitespace found, aborting
- exit 1
-fi
-
-# Only run clang-format on Linux because we don't have 4.0 on OS X images
-if [ "$TRAVIS_OS_NAME" = "linux" ]; then
- # Default clang-format points to default 3.5 version one
- CLANG_FORMAT=clang-format-3.9
- $CLANG_FORMAT --version
-
- if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
- # Get list of every file modified in this pull request
- files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
- else
- # Check everything for branch pushes
- files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
- fi
-
- # Turn off tracing for this because it's too verbose
- set +x
-
- for f in $files_to_lint; do
- d=$(diff -u "$f" <($CLANG_FORMAT "$f") || true)
- if ! [ -z "$d" ]; then
- echo "!!! $f not compliant to coding style, here is the fix:"
- echo "$d"
- fail=1
- fi
- done
-
- set -x
-
- if [ "$fail" = 1 ]; then
- exit 1
- fi
-fi
-
-#if OS is linux or is not set
-if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
- export CC=gcc-6
- export CXX=g++-6
- export PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig:$PKG_CONFIG_PATH
-
- mkdir build && cd build
- cmake ..
- make -j4
-
- ctest -VV -C Release
-elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
- set -o pipefail
-
- export MACOSX_DEPLOYMENT_TARGET=10.9
- export Qt5_DIR=$(brew --prefix)/opt/qt5
-
- mkdir build && cd build
- cmake .. -GXcode
- xcodebuild -configuration Release
-
- ctest -VV -C Release
-fi
diff --git a/.travis-deps.sh b/.travis-deps.sh
deleted file mode 100755
index 451886984..000000000
--- a/.travis-deps.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-
-set -e
-set -x
-
-#if OS is linux or is not set
-if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
- export CC=gcc-6
- export CXX=g++-6
- mkdir -p $HOME/.local
-
- if [ ! -e $HOME/.local/bin/cmake ]; then
- echo "CMake not found in the cache, get and extract it..."
- curl -L http://www.cmake.org/files/v3.6/cmake-3.6.3-Linux-x86_64.tar.gz \
- | tar -xz -C $HOME/.local --strip-components=1
- else
- echo "Using cached CMake"
- fi
-
- if [ ! -e $HOME/.local/lib/libSDL2.la ]; then
- echo "SDL2 not found in cache, get and build it..."
- wget http://libsdl.org/release/SDL2-2.0.5.tar.gz -O - | tar xz
- cd SDL2-2.0.5
- ./configure --prefix=$HOME/.local
- make -j4 && make install
- else
- echo "Using cached SDL2"
- fi
-
- export DEBIAN_FRONTEND=noninteractive
- # Amazing placebo security
- curl http://apt.llvm.org/llvm-snapshot.gpg.key | sudo -E apt-key add -
- sudo -E add-apt-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.9 main"
- sudo -E apt-get -yq update
- sudo -E apt-get -yq install clang-format-3.9
-
-elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
- brew update
- brew install qt5 sdl2 dylibbundler
-fi
diff --git a/.travis-upload.sh b/.travis-upload.sh
deleted file mode 100755
index 2cc968298..000000000
--- a/.travis-upload.sh
+++ /dev/null
@@ -1,129 +0,0 @@
-if [ "$TRAVIS_EVENT_TYPE" = "push" ]&&[ "$TRAVIS_BRANCH" = "master" ]; then
- GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
- GITREV="`git show -s --format='%h'`"
- mkdir -p artifacts
-
- if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
- REV_NAME="citra-linux-${GITDATE}-${GITREV}"
- ARCHIVE_NAME="${REV_NAME}.tar.xz"
- COMPRESSION_FLAGS="-cJvf"
- mkdir "$REV_NAME"
-
- cp build/src/citra/citra "$REV_NAME"
- cp build/src/citra_qt/citra-qt "$REV_NAME"
- elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
- REV_NAME="citra-osx-${GITDATE}-${GITREV}"
- ARCHIVE_NAME="${REV_NAME}.tar.gz"
- COMPRESSION_FLAGS="-czvf"
- mkdir "$REV_NAME"
-
- cp build/src/citra/Release/citra "$REV_NAME"
- cp -r build/src/citra_qt/Release/citra-qt.app "$REV_NAME"
-
- # move qt libs into app bundle for deployment
- $(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
-
- # move SDL2 libs into folder for deployment
- dylibbundler -b -x "${REV_NAME}/citra" -cd -d "${REV_NAME}/libs" -p "@executable_path/libs/"
-
- # Make the changes to make the citra-qt app standalone (i.e. not dependent on the current brew installation).
- # To do this, the absolute references to each and every QT framework must be re-written to point to the local frameworks
- # (in the Contents/Frameworks folder).
- # The "install_name_tool" is used to do so.
-
- # Coreutils is a hack to coerce Homebrew to point to the absolute Cellar path (symlink dereferenced). i.e:
- # ls -l /usr/local/opt/qt5:: /usr/local/opt/qt5 -> ../Cellar/qt5/5.6.1-1
- # grealpath ../Cellar/qt5/5.6.1-1:: /usr/local/Cellar/qt5/5.6.1-1
- brew install coreutils
-
- REV_NAME_ALT=$REV_NAME/
- # grealpath is located in coreutils, there is no "realpath" for OS X :(
- QT_BREWS_PATH=$(grealpath "$(brew --prefix qt5)")
- BREW_PATH=$(brew --prefix)
- QT_VERSION_NUM=5
-
- $BREW_PATH/opt/qt5/bin/macdeployqt "${REV_NAME_ALT}citra-qt.app" \
- -executable="${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt"
-
- # These are the files that macdeployqt packed into Contents/Frameworks/ - we don't want those, so we replace them.
- declare -a macos_libs=("QtCore" "QtWidgets" "QtGui" "QtOpenGL" "QtPrintSupport")
-
- for macos_lib in "${macos_libs[@]}"
- do
- SC_FRAMEWORK_PART=$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib
- # Replace macdeployqt versions of the Frameworks with our own (from /usr/local/opt/qt5/lib/)
- cp "$BREW_PATH/opt/qt5/lib/$SC_FRAMEWORK_PART" "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
-
- # Replace references within the embedded Framework files with "internal" versions.
- for macos_lib2 in "${macos_libs[@]}"
- do
- # Since brew references both the non-symlinked and symlink paths of QT5, it needs to be duplicated.
- # /usr/local/Cellar/qt5/5.6.1-1/lib and /usr/local/opt/qt5/lib both resolve to the same files.
- # So the two lines below are effectively duplicates when resolved as a path, but as strings, they aren't.
- RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
- install_name_tool -change \
- $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
- @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
- "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
- install_name_tool -change \
- "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
- @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
- "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
- done
- done
-
- # Handles `This application failed to start because it could not find or load the Qt platform plugin "cocoa"`
- # Which manifests itself as:
- # "Exception Type: EXC_CRASH (SIGABRT) | Exception Codes: 0x0000000000000000, 0x0000000000000000 | Exception Note: EXC_CORPSE_NOTIFY"
- # There may be more dylibs needed to be fixed...
- declare -a macos_plugins=("Plugins/platforms/libqcocoa.dylib")
-
- for macos_lib in "${macos_plugins[@]}"
- do
- install_name_tool -id @executable_path/../$macos_lib "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
- for macos_lib2 in "${macos_libs[@]}"
- do
- RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
- install_name_tool -change \
- $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
- @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
- "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
- install_name_tool -change \
- "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
- @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
- "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
- done
- done
-
- for macos_lib in "${macos_libs[@]}"
- do
- # Debugging info for Travis-CI
- otool -L "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib"
- done
-
- # Make the citra-qt.app application launch a debugging terminal.
- # Store away the actual binary
- mv ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt-bin
-
- cat > ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt <<EOL
-#!/usr/bin/env bash
-cd "\`dirname "\$0"\`"
-chmod +x citra-qt-bin
-open citra-qt-bin --args "\$@"
-EOL
- # Content that will serve as the launching script for citra (within the .app folder)
-
- # Make the launching script executable
- chmod +x ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt
-
- fi
-
- # Copy documentation
- cp license.txt "$REV_NAME"
- cp README.md "$REV_NAME"
-
- tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
-
- # move the compiled archive into the artifacts directory to be uploaded by travis releases
- mv "$ARCHIVE_NAME" artifacts/
-fi
diff --git a/.travis.yml b/.travis.yml
index cdb638f7a..8bad23208 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,38 +2,39 @@ language: cpp
matrix:
include:
- os: linux
+ env: NAME="linux build"
sudo: required
dist: trusty
+ services: docker
+ addons:
+ apt:
+ packages:
+ - p7zip-full
+ install: "./.travis/linux/deps.sh"
+ script: "./.travis/linux/build.sh"
+ after_success: "./.travis/linux/upload.sh"
- os: osx
+ env: NAME="macos build"
sudo: false
osx_image: xcode7.3
-
-addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-6
- - g++-6
- - qt5-default
- - libqt5opengl5-dev
- - xorg-dev
- - lib32stdc++6 # For CMake
-
-cache:
- directories:
- - "$HOME/.local"
-
-install: "./.travis-deps.sh"
-script: "./.travis-build.sh"
-after_success: "./.travis-upload.sh"
+ install: "./.travis/macos/deps.sh"
+ script: "./.travis/macos/build.sh"
+ after_success: "./.travis/macos/upload.sh"
+ - os: linux
+ env: NAME="clang-format"
+ dist: trusty
+ addons:
+ apt:
+ packages:
+ - clang-format-3.9
+ script: "./.travis/clang-format/script.sh"
deploy:
provider: releases
api_key:
secure: Mck15DIWaJdxDiS3aYVlM9N3G6y8VKUI1rnwII7/iolfm1s94U+tgvbheZDmT7SSbFyaGaYO/E8HrV/uZR9Vvs7ev20sHsTN1u60OTWfDIIyHs9SqjhcGbtq95m9/dMFschOYqTOR+gAs5BsxjuoeAotHdhpQEwvkO2oo5oR0zhGy45gjFnVvtcxT/IfpZBIpVgcK3aLb9zT6ekcJbSiPmEB15iLq3xXd0nFUNtEZdX3D6Veye4n5jB6n72qN8JVoKvPZAwaC2K0pZxpcGJaXDchLsw1q+4eCvdz6UJfUemeQ/uMAmjfeQ3wrzYGXe3nCM3WmX5wosCsB0mw4zYatzl3si6CZ1W+0GkV4Rwlx03dfp7v3EeFhTsXYCaXqhwuLZnWOLUik8t9vaSoFUx4nUIRwfO9kAMUJQSpLuHNO2nT01s3GxvqxzczuLQ9he5nGSi0RRodUzDwek1qUp6I4uV3gRHKz4B07YIc1i2fK88NLXjyQ0uLVZ+7Oq1+kgDp6+N7vvXXZ5qZ17tdaysSbKEE0Y8zsoXw7Rk1tPN19vrCS+TSpomNMyQyne1k+I5iZ/qkxPTLAS5qI6Utc2dL3GJdxWRAEfGNO9AIX3GV/jmmKfdcvwGsCYP8hxqs5vLYfgacw3D8NLf1941lQUwavC17jm9EV9g5G3Pn1Cp516E=
file_glob: true
- file: "artifacts/*.tar.*"
+ file: "artifacts/*"
skip_cleanup: true
on:
- repo: citra-emu/citra-nightly
+ tags: true
diff --git a/.travis/clang-format/script.sh b/.travis/clang-format/script.sh
new file mode 100755
index 000000000..80a0f47e5
--- /dev/null
+++ b/.travis/clang-format/script.sh
@@ -0,0 +1,37 @@
+#!/bin/bash -ex
+
+if grep -nr '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
+ dist/*.svg dist/*.xml; then
+ echo Trailing whitespace found, aborting
+ exit 1
+fi
+
+# Default clang-format points to default 3.5 version one
+CLANG_FORMAT=clang-format-3.9
+$CLANG_FORMAT --version
+
+if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
+ # Get list of every file modified in this pull request
+ files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
+else
+ # Check everything for branch pushes
+ files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
+fi
+
+# Turn off tracing for this because it's too verbose
+set +x
+
+for f in $files_to_lint; do
+ d=$(diff -u "$f" <($CLANG_FORMAT "$f") || true)
+ if ! [ -z "$d" ]; then
+ echo "!!! $f not compliant to coding style, here is the fix:"
+ echo "$d"
+ fail=1
+ fi
+done
+
+set -x
+
+if [ "$fail" = 1 ]; then
+ exit 1
+fi
diff --git a/.travis/common/post-upload.sh b/.travis/common/post-upload.sh
new file mode 100755
index 000000000..90deaaec8
--- /dev/null
+++ b/.travis/common/post-upload.sh
@@ -0,0 +1,22 @@
+#!/bin/bash -ex
+
+# Copy documentation
+cp license.txt "$REV_NAME"
+cp README.md "$REV_NAME"
+
+tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
+
+# Find out what release we are building
+if [ -z $TRAVIS_TAG ]; then
+ RELEASE_NAME=head
+else
+ RELEASE_NAME=$(echo $TRAVIS_TAG | cut -d- -f1)
+fi
+
+mv "$REV_NAME" $RELEASE_NAME
+
+7z a "$REV_NAME.7z" $RELEASE_NAME
+
+# move the compiled archive into the artifacts directory to be uploaded by travis releases
+mv "$ARCHIVE_NAME" artifacts/
+mv "$REV_NAME.7z" artifacts/
diff --git a/.travis/common/pre-upload.sh b/.travis/common/pre-upload.sh
new file mode 100755
index 000000000..3c2fc79a2
--- /dev/null
+++ b/.travis/common/pre-upload.sh
@@ -0,0 +1,6 @@
+#!/bin/bash -ex
+
+GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
+GITREV="`git show -s --format='%h'`"
+
+mkdir -p artifacts
diff --git a/.travis/linux/build.sh b/.travis/linux/build.sh
new file mode 100755
index 000000000..98433d184
--- /dev/null
+++ b/.travis/linux/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash -ex
+
+docker run -v $(pwd):/citra ubuntu:16.04 /bin/bash /citra/.travis/linux/docker.sh
diff --git a/.travis/linux/deps.sh b/.travis/linux/deps.sh
new file mode 100755
index 000000000..be3f6bece
--- /dev/null
+++ b/.travis/linux/deps.sh
@@ -0,0 +1,3 @@
+#!/bin/sh -ex
+
+docker pull ubuntu:16.04
diff --git a/.travis/linux/docker.sh b/.travis/linux/docker.sh
new file mode 100755
index 000000000..e27af5600
--- /dev/null
+++ b/.travis/linux/docker.sh
@@ -0,0 +1,17 @@
+#!/bin/bash -ex
+
+cd /citra
+
+apt-get update
+apt-get install -y build-essential libsdl2-dev qtbase5-dev libqt5opengl5-dev libcurl4-openssl-dev libssl-dev wget git
+
+# Get a recent version of CMake
+wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.sh
+echo y | sh cmake-3.9.0-Linux-x86_64.sh --prefix=cmake
+export PATH=/citra/cmake/cmake-3.9.0-Linux-x86_64/bin:$PATH
+
+mkdir build && cd build
+cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_BUILD_TYPE=Release
+make -j4
+
+ctest -VV -C Release
diff --git a/.travis/linux/upload.sh b/.travis/linux/upload.sh
new file mode 100755
index 000000000..dd265e0fd
--- /dev/null
+++ b/.travis/linux/upload.sh
@@ -0,0 +1,14 @@
+#!/bin/bash -ex
+
+. .travis/common/pre-upload.sh
+
+REV_NAME="citra-linux-${GITDATE}-${GITREV}"
+ARCHIVE_NAME="${REV_NAME}.tar.xz"
+COMPRESSION_FLAGS="-cJvf"
+
+mkdir "$REV_NAME"
+
+cp build/src/citra/citra "$REV_NAME"
+cp build/src/citra_qt/citra-qt "$REV_NAME"
+
+. .travis/common/post-upload.sh
diff --git a/.travis/macos/build.sh b/.travis/macos/build.sh
new file mode 100755
index 000000000..c957cdf21
--- /dev/null
+++ b/.travis/macos/build.sh
@@ -0,0 +1,12 @@
+#!/bin/bash -ex
+
+set -o pipefail
+
+export MACOSX_DEPLOYMENT_TARGET=10.9
+export Qt5_DIR=$(brew --prefix)/opt/qt5
+
+mkdir build && cd build
+cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h" -DCMAKE_BUILD_TYPE=Release
+make -j4
+
+ctest -VV -C Release
diff --git a/.travis/macos/deps.sh b/.travis/macos/deps.sh
new file mode 100755
index 000000000..30ec99b62
--- /dev/null
+++ b/.travis/macos/deps.sh
@@ -0,0 +1,4 @@
+#!/bin/sh -ex
+
+brew update
+brew install qt5 sdl2 dylibbundler p7zip
diff --git a/.travis/macos/upload.sh b/.travis/macos/upload.sh
new file mode 100755
index 000000000..19c80fdf0
--- /dev/null
+++ b/.travis/macos/upload.sh
@@ -0,0 +1,110 @@
+#!/bin/bash -ex
+
+. .travis/common/pre-upload.sh
+
+REV_NAME="citra-osx-${GITDATE}-${GITREV}"
+ARCHIVE_NAME="${REV_NAME}.tar.gz"
+COMPRESSION_FLAGS="-czvf"
+
+mkdir "$REV_NAME"
+
+cp build/src/citra/citra "$REV_NAME"
+cp -r build/src/citra_qt/citra-qt.app "$REV_NAME"
+
+# move qt libs into app bundle for deployment
+$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
+
+# move SDL2 libs into folder for deployment
+dylibbundler -b -x "${REV_NAME}/citra" -cd -d "${REV_NAME}/libs" -p "@executable_path/libs/"
+
+# Make the changes to make the citra-qt app standalone (i.e. not dependent on the current brew installation).
+# To do this, the absolute references to each and every QT framework must be re-written to point to the local frameworks
+# (in the Contents/Frameworks folder).
+# The "install_name_tool" is used to do so.
+
+# Coreutils is a hack to coerce Homebrew to point to the absolute Cellar path (symlink dereferenced). i.e:
+# ls -l /usr/local/opt/qt5:: /usr/local/opt/qt5 -> ../Cellar/qt5/5.6.1-1
+# grealpath ../Cellar/qt5/5.6.1-1:: /usr/local/Cellar/qt5/5.6.1-1
+brew install coreutils || brew upgrade coreutils || true
+
+REV_NAME_ALT=$REV_NAME/
+# grealpath is located in coreutils, there is no "realpath" for OS X :(
+QT_BREWS_PATH=$(grealpath "$(brew --prefix qt5)")
+BREW_PATH=$(brew --prefix)
+QT_VERSION_NUM=5
+
+$BREW_PATH/opt/qt5/bin/macdeployqt "${REV_NAME_ALT}citra-qt.app" \
+ -executable="${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt"
+
+# These are the files that macdeployqt packed into Contents/Frameworks/ - we don't want those, so we replace them.
+declare -a macos_libs=("QtCore" "QtWidgets" "QtGui" "QtOpenGL" "QtPrintSupport")
+
+for macos_lib in "${macos_libs[@]}"
+do
+ SC_FRAMEWORK_PART=$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib
+ # Replace macdeployqt versions of the Frameworks with our own (from /usr/local/opt/qt5/lib/)
+ cp "$BREW_PATH/opt/qt5/lib/$SC_FRAMEWORK_PART" "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
+
+ # Replace references within the embedded Framework files with "internal" versions.
+ for macos_lib2 in "${macos_libs[@]}"
+ do
+ # Since brew references both the non-symlinked and symlink paths of QT5, it needs to be duplicated.
+ # /usr/local/Cellar/qt5/5.6.1-1/lib and /usr/local/opt/qt5/lib both resolve to the same files.
+ # So the two lines below are effectively duplicates when resolved as a path, but as strings, they aren't.
+ RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
+ install_name_tool -change \
+ $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
+ @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
+ "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
+ install_name_tool -change \
+ "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
+ @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
+ "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$SC_FRAMEWORK_PART"
+ done
+done
+
+# Handles `This application failed to start because it could not find or load the Qt platform plugin "cocoa"`
+# Which manifests itself as:
+# "Exception Type: EXC_CRASH (SIGABRT) | Exception Codes: 0x0000000000000000, 0x0000000000000000 | Exception Note: EXC_CORPSE_NOTIFY"
+# There may be more dylibs needed to be fixed...
+declare -a macos_plugins=("Plugins/platforms/libqcocoa.dylib")
+
+for macos_lib in "${macos_plugins[@]}"
+do
+ install_name_tool -id @executable_path/../$macos_lib "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
+ for macos_lib2 in "${macos_libs[@]}"
+ do
+ RM_FRAMEWORK_PART=$macos_lib2.framework/Versions/$QT_VERSION_NUM/$macos_lib2
+ install_name_tool -change \
+ $QT_BREWS_PATH/lib/$RM_FRAMEWORK_PART \
+ @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
+ "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
+ install_name_tool -change \
+ "$BREW_PATH/opt/qt5/lib/$RM_FRAMEWORK_PART" \
+ @executable_path/../Frameworks/$RM_FRAMEWORK_PART \
+ "${REV_NAME_ALT}citra-qt.app/Contents/$macos_lib"
+ done
+done
+
+for macos_lib in "${macos_libs[@]}"
+do
+ # Debugging info for Travis-CI
+ otool -L "${REV_NAME_ALT}citra-qt.app/Contents/Frameworks/$macos_lib.framework/Versions/$QT_VERSION_NUM/$macos_lib"
+done
+
+# Make the citra-qt.app application launch a debugging terminal.
+# Store away the actual binary
+mv ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt-bin
+
+cat > ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt <<EOL
+#!/usr/bin/env bash
+cd "\`dirname "\$0"\`"
+chmod +x citra-qt-bin
+open citra-qt-bin --args "\$@"
+EOL
+# Content that will serve as the launching script for citra (within the .app folder)
+
+# Make the launching script executable
+chmod +x ${REV_NAME_ALT}citra-qt.app/Contents/MacOS/citra-qt
+
+. .travis/common/post-upload.sh
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9151ff786..d9c2f78a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,7 @@
cmake_minimum_required(VERSION 3.6)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
+include(DownloadExternals)
project(citra)
@@ -12,6 +13,15 @@ option(ENABLE_QT "Enable the Qt frontend" ON)
option(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" OFF)
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
+option(CITRA_USE_BUNDLED_CURL "FOR MINGW ONLY: Download curl configured against winssl instead of openssl" OFF)
+if (ENABLE_WEB_SERVICE AND CITRA_USE_BUNDLED_CURL AND WINDOWS AND MSVC)
+ message("Turning off use bundled curl as msvc can compile curl on cpr")
+ SET(CITRA_USE_BUNDLED_CURL OFF CACHE BOOL "" FORCE)
+endif()
+if (ENABLE_WEB_SERVICE AND NOT CITRA_USE_BUNDLED_CURL AND MINGW)
+ message(AUTHOR_WARNING "Turning on CITRA_USE_BUNDLED_CURL. Override it only if you know what you are doing.")
+ SET(CITRA_USE_BUNDLED_CURL ON CACHE BOOL "" FORCE)
+endif()
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit)
message(STATUS "Copying pre-commit hook")
@@ -129,8 +139,8 @@ else()
set(CMAKE_C_FLAGS_RELEASE "/O2 /GS- /MD" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "" FORCE)
- set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE)
- set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
+ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
endif()
# Set file offset size to 64 bits.
@@ -151,24 +161,6 @@ set_property(DIRECTORY APPEND PROPERTY
# System imported libraries
# ======================
-# This function downloads a binary library package from our external repo.
-# Params:
-# remote_path: path to the file to download, relative to the remote repository root
-# prefix_var: name of a variable which will be set with the path to the extracted contents
-function(download_bundled_external remote_path lib_name prefix_var)
- set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
- if (NOT EXISTS "${prefix}")
- message(STATUS "Downloading binaries for ${lib_name}...")
- file(DOWNLOAD
- https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
- "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
- execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
- WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
- endif()
- message(STATUS "Using bundled binaries at ${prefix}")
- set(${prefix_var} "${prefix}" PARENT_SCOPE)
-endfunction()
-
find_package(PNG QUIET)
if (NOT PNG_FOUND)
message(STATUS "libpng not found. Some debugging features have been disabled.")
@@ -295,15 +287,22 @@ function(create_directory_groups)
endforeach()
endfunction()
-# generate git revision information
+# Gets a UTC timstamp and sets the provided variable to it
+function(get_timestamp _var)
+ string(TIMESTAMP timestamp UTC)
+ set(${_var} "${timestamp}" PARENT_SCOPE)
+endfunction()
+
+# generate git/build information
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REF_SPEC GIT_REV)
git_describe(GIT_DESC --always --long --dirty)
git_branch_name(GIT_BRANCH)
+get_timestamp(BUILD_DATE)
+enable_testing()
add_subdirectory(externals)
add_subdirectory(src)
-enable_testing()
# Installation instructions
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
new file mode 100644
index 000000000..138a15d5a
--- /dev/null
+++ b/CMakeModules/DownloadExternals.cmake
@@ -0,0 +1,18 @@
+
+# This function downloads a binary library package from our external repo.
+# Params:
+# remote_path: path to the file to download, relative to the remote repository root
+# prefix_var: name of a variable which will be set with the path to the extracted contents
+function(download_bundled_external remote_path lib_name prefix_var)
+set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
+if (NOT EXISTS "${prefix}")
+ message(STATUS "Downloading binaries for ${lib_name}...")
+ file(DOWNLOAD
+ https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
+ "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
+ execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
+endif()
+message(STATUS "Using bundled binaries at ${prefix}")
+set(${prefix_var} "${prefix}" PARENT_SCOPE)
+endfunction() \ No newline at end of file
diff --git a/README.md b/README.md
index e766918f7..31f5afe27 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ For development discussion, please join us @ #citra on freenode.
Most of the development happens on GitHub. It's also where [our central repository](https://github.com/citra-emu/citra) is hosted.
-If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md), [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should as well contact any of the developers in the forum in order to know about the current state of the emulator.
+If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should as well contact any of the developers in the forum in order to know about the current state of the emulator because the [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) isn't maintained anymore.
### Building
diff --git a/appveyor.yml b/appveyor.yml
index 9a6206a8b..5524eb576 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,15 +1,21 @@
# shallow clone
clone_depth: 10
-# don't build on tag
-skip_tags: true
-
cache:
- C:\ProgramData\chocolatey\bin -> appveyor.yml
- C:\ProgramData\chocolatey\lib -> appveyor.yml
os: Visual Studio 2017
+environment:
+ # Tell msys2 to add mingw64 to the path
+ MSYSTEM: MINGW64
+ # Tell msys2 to inherit the current directory when starting the shell
+ CHERE_INVOKING: 1
+ matrix:
+ - BUILD_TYPE: mingw
+ - BUILD_TYPE: msvc
+
platform:
- x64
@@ -18,59 +24,150 @@ configuration:
install:
- git submodule update --init --recursive
+ - ps: |
+ if ($env:BUILD_TYPE -eq 'mingw') {
+ $dependencies = "mingw64/mingw-w64-x86_64-cmake",
+ "mingw64/mingw-w64-x86_64-qt5",
+ "mingw64/mingw-w64-x86_64-curl",
+ "mingw64/mingw-w64-x86_64-SDL2"
+ # redirect err to null to prevent warnings from becoming errors
+ # workaround to prevent pacman from failing due to cyclical dependencies
+ C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw64/mingw-w64-x86_64-freetype mingw64/mingw-w64-x86_64-fontconfig" 2> $null
+ C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S $dependencies" 2> $null
+ }
before_build:
- - mkdir build
- - cd build
- - cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCMAKE_USE_OPENSSL=0 ..
+ - mkdir %BUILD_TYPE%_build
+ - cd %BUILD_TYPE%_build
+ - ps: |
+ if ($env:BUILD_TYPE -eq 'msvc') {
+ # redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning
+ cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCMAKE_USE_OPENSSL=0 .. 2>&1 && exit 0'
+ } else {
+ C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DUSE_SYSTEM_CURL=1 -DCITRA_USE_BUNDLED_CURL=1 -DCMAKE_BUILD_TYPE=Release .. 2>&1"
+ }
- cd ..
-build:
- project: build/citra.sln
- parallel: true
+build_script:
+ - ps: |
+ if ($env:BUILD_TYPE -eq 'msvc') {
+ # https://www.appveyor.com/docs/build-phase
+ msbuild msvc_build/citra.sln /maxcpucount /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+ } else {
+ C:\msys64\usr\bin\bash.exe -lc 'mingw32-make -C mingw_build/ 2>&1'
+ }
after_build:
- ps: |
$GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
$GITREV = $(git show -s --format='%h')
- $GIT_LONG_HASH = $(git rev-parse HEAD)
- # Where are these spaces coming from? Regardless, let's remove them
- $MSVC_BUILD_NAME = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
- $MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
- $BINTRAY_VERSION = "nightly-$GIT_LONG_HASH" -replace " ", ""
- # set the build names as env vars so the artifacts can upload them
- $env:MSVC_BUILD_NAME = $MSVC_BUILD_NAME
- $env:MSVC_BUILD_PDB = $MSVC_BUILD_PDB
- $env:GITREV = $GITREV
+ # Find out which kind of release we are producing by tag name
+ if ($env:APPVEYOR_REPO_TAG_NAME) {
+ $RELEASE_DIST, $RELEASE_VERSION = $env:APPVEYOR_REPO_TAG_NAME.split('-')
+ } else {
+ # There is no repo tag - make assumptions
+ $RELEASE_DIST = "head"
+ }
+
+ if ($env:BUILD_TYPE -eq 'msvc') {
+ # Where are these spaces coming from? Regardless, let's remove them
+ $MSVC_BUILD_ZIP = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
+ $MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
+ $MSVC_SEVENZIP = "citra-windows-msvc-$GITDATE-$GITREV.7z" -replace " ", ""
+
+ # set the build names as env vars so the artifacts can upload them
+ $env:BUILD_ZIP = $MSVC_BUILD_ZIP
+ $env:BUILD_SYMBOLS = $MSVC_BUILD_PDB
+ $env:BUILD_UPDATE = $MSVC_SEVENZIP
+
+ 7z a -tzip $MSVC_BUILD_PDB .\msvc_build\bin\release\*.pdb
+ rm .\msvc_build\bin\release\*.pdb
+
+ mkdir $RELEASE_DIST
+ Copy-Item .\msvc_build\bin\release\* -Destination $RELEASE_DIST -Recurse
+ Copy-Item .\license.txt -Destination $RELEASE_DIST
+ Copy-Item .\README.md -Destination $RELEASE_DIST
+ 7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\*
+ 7z a $MSVC_SEVENZIP $RELEASE_DIST
+ } else {
+ $MINGW_BUILD_ZIP = "citra-windows-mingw-$GITDATE-$GITREV.zip" -replace " ", ""
+ $MINGW_SEVENZIP = "citra-windows-mingw-$GITDATE-$GITREV.7z" -replace " ", ""
+ # not going to bother adding separate debug symbols for mingw, so just upload a README for it
+ # if someone wants to add them, change mingw to compile with -g and use objdump and strip to separate the symbols from the binary
+ $MINGW_NO_DEBUG_SYMBOLS = "README_No_Debug_Symbols.txt"
+ Set-Content -Path $MINGW_NO_DEBUG_SYMBOLS -Value "This is a workaround for Appveyor since msvc has debug symbols but mingw doesnt" -Force
- 7z a -tzip $MSVC_BUILD_PDB .\build\bin\release\*.pdb
- rm .\build\bin\release\*.pdb
- 7z a -tzip $MSVC_BUILD_NAME .\build\bin\release\* .\license.txt .\README.md
+ # store the build information in env vars so we can use them as artifacts
+ $env:BUILD_ZIP = $MINGW_BUILD_ZIP
+ $env:BUILD_SYMBOLS = $MINGW_NO_DEBUG_SYMBOLS
+ $env:BUILD_UPDATE = $MINGW_SEVENZIP
+
+ $CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER"
+ $CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build"
+ $RELEASE_DIST = $RELEASE_DIST + "-mingw"
+
+ mkdir $RELEASE_DIST
+ mkdir $RELEASE_DIST/platforms
+
+ # copy the compiled binaries and other release files to the release folder
+ Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "citra*.exe" | Copy-Item -destination $RELEASE_DIST
+ # copy the libcurl dll
+ Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "libcurl.dll" | Copy-Item -destination $RELEASE_DIST
+ Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST
+ Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST
+ # copy all the dll dependencies to the release folder
+ # hardcoded list because we don't build static and determining the list of dlls from the binary is a pain.
+ $MingwDLLs = "Qt5Core.dll","Qt5Widgets.dll","Qt5Gui.dll","Qt5OpenGL.dll",
+ # QT dll dependencies
+ "libbz2-*.dll","libicudt*.dll","libicuin*.dll","libicuuc*.dll","libffi-*.dll",
+ "libfreetype-*.dll","libglib-*.dll","libgobject-*.dll","libgraphite2.dll","libiconv-*.dll",
+ "libharfbuzz-*.dll","libintl-*.dll","libpcre-*.dll","libpcre16-*.dll","libpng16-*.dll",
+ # Runtime/Other dependencies
+ "libgcc_s_seh-*.dll","libstdc++-*.dll","libwinpthread-*.dll","SDL2.dll","zlib1.dll"
+ foreach ($file in $MingwDLLs) {
+ Copy-Item -path "C:/msys64/mingw64/bin/$file" -force -destination "$RELEASE_DIST"
+ }
+ # the above list copies a few extra debug dlls that aren't needed (thanks globbing patterns!)
+ # so we can remove them by hardcoding another list of extra dlls to remove
+ $DebugDLLs = "libicudtd*.dll","libicuind*.dll","libicuucd*.dll"
+ foreach ($file in $DebugDLLs) {
+ Remove-Item -path "$RELEASE_DIST/$file"
+ }
+
+ # copy the qt windows plugin dll to platforms
+ Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/platforms/qwindows.dll" -force -destination "$RELEASE_DIST/platforms"
+
+ 7z a -tzip $MINGW_BUILD_ZIP $RELEASE_DIST\*
+ 7z a $MINGW_SEVENZIP $RELEASE_DIST
+ }
test_script:
- - cd build && ctest -VV -C Release && cd ..
+ - cd %BUILD_TYPE%_build
+ - ps: |
+ if ($env:BUILD_TYPE -eq 'msvc') {
+ ctest -VV -C Release
+ } else {
+ C:\msys64\usr\bin\bash.exe -lc "ctest -VV -C Release"
+ }
+ - cd ..
artifacts:
- - path: $(MSVC_BUILD_NAME)
- name: msvcbuild
- type: zip
- - path: $(MSVC_BUILD_PDB)
- name: msvcdebug
+ - path: $(BUILD_ZIP)
+ name: build
type: zip
+ - path: $(BUILD_SYMBOLS)
+ name: debugsymbols
+ - path: $(BUILD_UPDATE)
+ name: update
deploy:
provider: GitHub
- release: nightly-$(appveyor_build_number)
- description: |
- Citra nightly releases. Please choose the correct download for your operating system from the list below.
-
- Short Commit Hash $(GITREV)
+ release: $(appveyor_repo_tag_name)
auth_token:
secure: "dbpsMC/MgPKWFNJCXpQl4cR8FYhepkPLjgNp/pRMktZ8oLKTqPYErfreaIxb/4P1"
- artifact: msvcbuild
+ artifact: update,build
draft: false
prerelease: false
on:
- branch: master
- appveyor_repo_name: citra-emu/citra-nightly
+ appveyor_repo_tag: true
diff --git a/dist/citra.icns b/dist/citra.icns
index 9d3dcca83..ef7bf4e6e 100644
--- a/dist/citra.icns
+++ b/dist/citra.icns
Binary files differ
diff --git a/dist/citra.ico b/dist/citra.ico
index 4fef651e2..2c408b935 100644
--- a/dist/citra.ico
+++ b/dist/citra.ico
Binary files differ
diff --git a/dist/citra.manifest b/dist/citra.manifest
new file mode 100644
index 000000000..fd30b656f
--- /dev/null
+++ b/dist/citra.manifest
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings>
+ <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
+ <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
+ </windowsSettings>
+ </application>
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+ </application>
+ </compatibility>
+</assembly> \ No newline at end of file
diff --git a/dist/citra.svg b/dist/citra.svg
index 7b299cd89..b6abc1ccf 100644
--- a/dist/citra.svg
+++ b/dist/citra.svg
@@ -1,80 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright 2014 Citra Emulator Project
- Licensed under GPLv2 or any later version
- Refer to the license.txt file included.
--->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 341.071 338.846">
- <radialGradient id="a" cx="170.5356" cy="167.271" r="170.5332" gradientTransform="matrix(1 0 0 0.9935 0 3.2396)" gradientUnits="userSpaceOnUse">
- <stop offset="0.5193" stop-color="#FFFFFF" stop-opacity="0.1"/>
- <stop offset="0.9415" stop-color="#000000" stop-opacity="0.5"/>
- <stop offset="1" stop-color="#1A1818" stop-opacity="0"/>
- </radialGradient>
- <ellipse fill="url(#a)" cx="170.535" cy="169.423" rx="170.535" ry="169.423"/>
- <circle fill="#D16F17" cx="170.536" cy="167.885" r="161.557"/>
- <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="234.4458" y1="33.5771" x2="97.5655" y2="321.2358">
- <stop offset="0" stop-color="#FFF8BD"/>
- <stop offset="1" stop-color="#F6DCAE"/>
- </linearGradient>
- <circle fill="url(#b)" cx="170.536" cy="167.885" r="155.295"/>
- <g>
- <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="332.436" y1="91.7446" x2="111.1593" y2="342.0988">
- <stop offset="0" stop-color="#F7A076"/>
- <stop offset="0.4455" stop-color="#F3816C"/>
- <stop offset="1" stop-color="#F06878"/>
- </linearGradient>
- <path fill="url(#c)" stroke="#F06564" stroke-miterlimit="10" d="M309.704,123.138
- c-5.9-7.802-128.517,44.681-128.517,44.681S303.803,221.01,309.704,212.5C322.434,194.142,323.182,140.957,309.704,123.138z"/>
- <linearGradient id="d" gradientUnits="userSpaceOnUse" x1="285.5845" y1="50.3345" x2="64.3074" y2="300.6891">
- <stop offset="0" stop-color="#9DC63B"/>
- <stop offset="1" stop-color="#9BC183"/>
- </linearGradient>
- <path fill="url(#d)" stroke="#72AA42" stroke-miterlimit="10" d="M300.518,100.96c-3.98-21.983-41.059-60.12-63.189-63.188
- c-9.688-1.345-59.28,122.469-59.28,122.469S302.364,111.149,300.518,100.96z"/>
- <linearGradient id="e" gradientUnits="userSpaceOnUse" x1="229.4995" y1="0.7637" x2="8.2231" y2="251.1176">
- <stop offset="0" stop-color="#D5DE26"/>
- <stop offset="1" stop-color="#C5D94B"/>
- </linearGradient>
- <path fill="url(#e)" stroke="#BECD30" stroke-miterlimit="10" d="M215.151,28.584c-18.357-12.73-71.543-13.478-89.362,0.001
- c-7.801,5.899,44.682,128.516,44.682,128.516S223.663,34.484,215.151,28.584z"/>
- <linearGradient id="f" gradientUnits="userSpaceOnUse" x1="219.3823" y1="-8.1782" x2="-1.8941" y2="242.1756">
- <stop offset="0" stop-color="#F2D200"/>
- <stop offset="1" stop-color="#FDEF52"/>
- </linearGradient>
- <path fill="url(#f)" stroke="#E1BE29" stroke-miterlimit="10" d="M162.893,160.239c0,0-49.092-124.315-59.281-122.469
- c-21.982,3.979-60.12,41.058-63.188,63.189C39.078,110.646,162.893,160.239,162.893,160.239z"/>
- <linearGradient id="g" gradientUnits="userSpaceOnUse" x1="226.0718" y1="-2.2656" x2="4.7951" y2="248.0886">
- <stop offset="0" stop-color="#FFCD10"/>
- <stop offset="1" stop-color="#F29634"/>
- </linearGradient>
- <path fill="url(#g)" stroke="#F79421" stroke-miterlimit="10" d="M31.236,123.136c-12.73,18.357-13.479,71.543,0,89.362
- c5.898,7.801,128.516-44.682,128.516-44.682S37.135,114.625,31.236,123.136z"/>
- <linearGradient id="h" gradientUnits="userSpaceOnUse" x1="272.9214" y1="39.144" x2="51.6446" y2="289.4984">
- <stop offset="0" stop-color="#F79F1C"/>
- <stop offset="0.4455" stop-color="#F08021"/>
- <stop offset="1" stop-color="#ED693C"/>
- </linearGradient>
- <path fill="url(#h)" stroke="#F16622" stroke-miterlimit="10" d="M40.422,234.676c3.979,21.982,41.057,60.12,63.188,63.188
- c9.687,1.346,59.279-122.468,59.279-122.468S38.574,224.487,40.422,234.676z"/>
- <linearGradient id="i" gradientUnits="userSpaceOnUse" x1="329.0083" y1="88.7129" x2="107.7311" y2="339.0677">
- <stop offset="0" stop-color="#E47C26"/>
- <stop offset="0.4455" stop-color="#DF5B27"/>
- <stop offset="1" stop-color="#DD3A3A"/>
- </linearGradient>
- <path fill="url(#i)" stroke="#E03827" stroke-miterlimit="10" d="M125.787,307.051c18.357,12.73,71.543,13.48,89.362,0
- c7.801-5.898-44.681-128.515-44.681-128.515S117.275,301.153,125.787,307.051z"/>
- <linearGradient id="j" gradientUnits="userSpaceOnUse" x1="339.1245" y1="97.6562" x2="117.8478" y2="348.0104">
- <stop offset="0" stop-color="#F3783C"/>
- <stop offset="0.4455" stop-color="#EF5339"/>
- <stop offset="1" stop-color="#ED294A"/>
- </linearGradient>
- <path fill="url(#j)" stroke="#ED2836" stroke-miterlimit="10" d="M178.047,175.398c0,0,49.09,124.315,59.28,122.467
- c21.982-3.979,60.121-41.057,63.189-63.188C301.86,224.991,178.047,175.398,178.047,175.398z"/>
- </g>
- <linearGradient id="k" gradientUnits="userSpaceOnUse" x1="170.5352" y1="6.3281" x2="170.5351" y2="329.4424">
- <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.2"/>
- <stop offset="0.4504" stop-color="#908E8E" stop-opacity="0.05"/>
- <stop offset="1" stop-color="#030003" stop-opacity="0.2"/>
- </linearGradient>
- <circle fill="url(#k)" cx="170.536" cy="167.885" r="161.557"/>
-</svg>
+<svg version="1.1" viewBox="0 0 433.93 397.43" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="linearGradient7230"><stop stop-color="#f15a24" offset="0"/><stop stop-color="#f15a24" stop-opacity="0" offset="1"/></linearGradient><radialGradient id="radialGradient4297" cx="0" cy="0" r="1" fx=".33908" fy="-.55275" gradientTransform="matrix(135.72 53.102 32.823 -83.888 479.47 287.23)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffff87" offset="0"/><stop stop-color="#ffff87" offset=".12648"/><stop stop-color="#ffc503" offset=".14449"/><stop stop-color="#ffc503" offset=".21612"/><stop stop-color="#ffc503" offset=".39528"/><stop stop-color="#ffc503" offset=".4406"/><stop stop-color="#ffc003" offset=".49983"/><stop stop-color="#ffc003" offset=".62818"/><stop stop-color="#ffc003" offset=".72864"/><stop stop-color="#ff8904" stop-opacity=".86935" offset=".84938"/><stop stop-color="#ff8904" offset=".98742"/><stop stop-color="#ff8904" offset="1"/></radialGradient><radialGradient id="radialGradient4331" cx="-.042447" cy=".042662" r="1" gradientTransform="matrix(97.003 -81.357 -81.357 -97.003 516.33 432.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset=".66567"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4351" cx="0" cy="0" r="1" gradientTransform="matrix(-12.353 -91.85 -91.85 12.353 493.83 420.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4371" cx="0" cy="0" r="1" fx="-.89202" fy="-.452" gradientTransform="matrix(58.797 44.174 44.174 -58.797 591.5 452.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4391" cx="0" cy="0" r="1" gradientTransform="matrix(-63.936 -51.968 -51.968 63.936 480.5 419.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4413" cx="-.27681" cy="-.01256" r="1" gradientTransform="matrix(166.21 117.68 75.941 -107.26 545.45 466.23)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffee05" offset=".49699"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4433" cx=".0693" cy=".0013088" r="1" gradientTransform="matrix(92.166 1.56 1.3981 -82.601 484.17 431.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4453" cx="0" cy="0" r="1" gradientTransform="matrix(112.47 78.731 51.056 -72.937 527.5 460.5)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffba05" offset="1"/></radialGradient><radialGradient id="radialGradient4475" cx=".13237" cy="-.0012055" r="1" fx="-.080444" fy=".038791" gradientTransform="matrix(64.042 -58.572 -66.76 -72.994 505.91 439.83)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff0" offset="0"/><stop stop-color="#ffcf05" offset=".62977"/><stop stop-color="#ffcf05" offset="1"/></radialGradient><linearGradient id="linearGradient7248-9" x1="382.8" x2="662.93" y1="393.32" y2="393.32" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient7230"/><clipPath id="clipPath4307-2"><path d="m640.25 512.56c0.366-0.686 1.015-1.901 1.507-3.229 0.237-0.588 0.284-0.774 0.375-1.057 0.174-0.52 0.277-0.819 0.368-1.099 0.09-0.28 0.019-0.115 0.107-0.392 0.087-0.277 0.181-0.577 0.264-0.852 0.082-0.276 0.15-0.659 0.224-0.934 0.076-0.276 0.167-0.604 0.233-0.881 0.066-0.276 0.257-1.337 0.312-1.615 0.316-1.599 0.241-2.12 0.401-3.701 0.16-1.58 0.244-3.151 0.26-4.712 0.016-1.563-0.038-3.115-0.154-4.66-0.117-1.545-0.296-3.081-0.533-4.61-0.237-1.528-0.531-3.049-0.877-4.562-0.345-1.513-0.742-3.02-1.184-4.518-0.442-1.5-0.93-2.992-1.457-4.478-0.527-1.485-1.094-2.964-1.694-4.438-1.181-2.896-2.451-5.732-3.805-8.51-1.353-2.778-2.789-5.5-4.302-8.169-1.512-2.671-3.099-5.288-4.755-7.858-1.656-2.571-3.38-5.093-5.165-7.574-1.785-2.48-3.631-4.918-5.53-7.318-1.9-2.4-3.853-4.762-5.852-7.09s-4.044-4.624-6.129-6.89c-2.084-2.267-4.207-4.506-6.362-6.72-2.218-2.28-4.472-4.518-6.76-6.714-2.287-2.197-4.608-4.353-6.961-6.47s-4.737-4.196-7.152-6.237-4.86-4.046-7.334-6.016c-2.473-1.969-4.975-3.904-7.504-5.806-2.528-1.902-5.084-3.771-7.664-5.609-2.581-1.838-5.187-3.645-7.816-5.423-2.63-1.778-5.282-3.527-7.957-5.247-3.325-2.142-6.677-4.217-10.058-6.225-3.381-2.007-6.792-3.946-10.232-5.813-3.441-1.867-6.912-3.661-10.416-5.38s-7.041-3.362-10.611-4.924c-3.571-1.563-7.177-3.046-10.818-4.446-1.846-0.709-3.702-1.398-5.566-2.064-1.814-0.648-3.636-1.274-5.468-1.88-3.716-1.228-7.47-2.37-11.263-3.42-3.794-1.049-7.627-2.009-11.502-2.872-1.624-0.362-3.249-0.695-4.876-1-1.627-0.304-3.255-0.578-4.886-0.823-1.631-0.244-3.262-0.457-4.896-0.638s-3.269-0.33-4.907-0.445c-1.636-0.116-3.275-0.197-4.915-0.245-1.639-0.046-3.28-0.058-4.923-0.034-1.641 0.024-3.285 0.085-4.929 0.183-1.645 0.097-3.29 0.233-4.937 0.408-1.337 0.142-2.664 0.317-3.979 0.531s-2.617 0.466-3.906 0.759c-1.288 0.294-2.562 0.627-3.819 1.007-1.256 0.38-2.496 0.805-3.717 1.278-1.22 0.475-2.422 0.997-3.602 1.571-1.179 0.575-2.337 1.201-3.471 1.884-1.133 0.683-2.244 1.421-3.326 2.22-1.084 0.798-2.656 1.973-3.685 2.893l-3.143-7.259c-3.143-7.26 1.5-6 3.143-8.5 1.644-2.5 0.357-9 0.217-15s6.64-11.5 9.64-14.5c3-3.001 10-10.5 14.5-11.82 4.5-1.319 23.5-16.18 30-18.181 6.5-1.999 13.5-6.999 22-8.499s19-3 27.5-3 26.5-0.5 38.5 0 27 3 33 4 20 2.5 27.5 4.5 23.5 8 27 11.5 28 13.999 33.5 20c5.5 6 24 39.5 25 45.5s14 47.499 17 53c3 5.5 0 39.499 0 45.5 0 6-10 45-10 45l-13.5 28.5-14 14.5z"/></clipPath><radialGradient id="radialGradient7556" cx="698.21" cy="478.94" r="186.38" gradientTransform="matrix(1.2034 -.41433 .38181 1.1089 -338.27 245.75)" gradientUnits="userSpaceOnUse"><stop stop-color="#f15a24" stop-opacity="0" offset="0"/><stop stop-color="#f15a24" stop-opacity="0" offset=".68534"/><stop stop-color="#f14a24" offset="1"/></radialGradient></defs><g transform="translate(-265.81 -357.85)"><g transform="translate(-206,70)"><path d="m651.83 684.53c-17.986-2.258-43.941-8.1382-59.303-13.436-45.416-15.66-91.627-51.387-112.29-86.813-7.3922-12.675-9.8553-29.065-7.6405-50.846 1.5707-15.448 4.2385-24.955 10.938-38.978 20.81-43.561 55.611-85.05 100.64-119.99 33.898-26.298 69.589-47.881 101.64-61.46 27.534-11.666 61.915-21.532 84.068-24.123 27.343-3.1985 56.096 1.1638 74.647 11.325 18.752 10.271 30.61 25.375 43.922 55.939 12.492 28.684 17.312 55.294 17.291 95.461-0.0151 34.075-4.1728 58.552-14.29 84.174-8.402 21.279-21.718 44.014-36.542 62.391-6.6008 8.1824-26.727 28.053-35.45 35-19.832 15.793-45.654 30.387-66.248 37.441-17.156 5.8765-39.99 11.132-59.144 13.612-9.676 1.253-33.307 1.4198-42.243 0.29802z" fill="#fff" stroke-width=".75166"/><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m508.37 418.38c-1.948-9.873-2.175-19.875-2.148-30.734 0.105-4.803-8e-3 -10.436 0.607-16.082 1.248-11.467 5.143-14.109 15.617-9.51 17.862 7.84 33.696 18.829 47.854 32.241 3.988 3.779 8.185 7.422 11.089 12.202 2.673 4.397 2.097 6.88-2.266 9.608-1.396 0.873-2.949 1.54-4.502 2.103-5.181 1.881-10.542 3.121-15.918 4.281-12.621 2.721-25.222 5.644-38.216 5.823-0.08 1e-3 -0.159 1e-3 -0.239 1e-3 -6.452 0-10.63-3.605-11.878-9.933" fill="url(#radialGradient4331)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m492.04 416.52c-3.243-1.617-5.823-4.156-8.361-6.684-16.977-16.905-32.998-34.704-48.672-52.819-4.26-4.924-8.651-9.823-11.376-15.886-1.919-4.27-0.934-6.454 3.654-7.668 4.725-1.249 9.544-1.787 14.436-1.358 11.696 1.026 22.799 4.32 33.655 8.677 10.044 4.032 16.339 11.18 18.544 21.838 2.891 13.979 3.907 28.175 4.618 42.392 0 2.182 0.021 4.364-0.013 6.545-0.01 0.636-0.15 1.274-0.276 1.902-0.545 2.722-1.447 4.01-3.104 4.01-0.83 0-1.848-0.323-3.105-0.949" fill="url(#radialGradient4351)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m623.43 485.96c-2.879-0.515-5.736-1.318-8.503-2.282-15.719-5.482-30.649-12.847-45.782-19.703-12.92-5.855-25.833-11.785-38.083-19.013-2.413-1.425-5.354-3.1-4.765-6.319 0.504-2.751 3.758-2.789 6.016-3.319 17.339-4.073 35.01-5.712 51.316-7.058 10.474 0.119 18.926 1.786 25.516 8.829 6.88 7.354 12.632 15.489 16.919 24.601 2.691 5.72 4.477 11.786 4.479 18.169 2e-3 4.153-1.835 6.272-5.267 6.272-0.571 0-1.188-0.059-1.846-0.177" fill="url(#radialGradient4371)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m475.92 419.25c-0.367-0.104-0.71-0.292-1.065-0.437-22.555-9.166-44.21-20.249-65.865-31.321-5.464-2.792-10.748-5.939-15.684-9.652-5.297-3.984-8.316-8.98-7.651-15.694 0-0.89-0.035-1.662 5e-3 -2.431 0.397-7.627 4.249-12.981 10.812-16.559 6.098-3.323 11.35-1.172 16.365 2.52 1.236 0.911 2.498 1.799 3.649 2.811 22.843 20.104 43.28 42.565 63.347 65.381 1.264 1.437 3.447 3.141 2.012 5.299-0.613 0.922-1.333 1.232-2.102 1.231-1.232 0-2.589-0.797-3.823-1.148" fill="url(#radialGradient4391)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m589.81 520.12c-2.155-1.598-4.18-3.381-6.195-5.159-14.338-12.647-27.085-26.892-40.259-40.697-5.472-5.734-10.87-11.588-15.617-17.981-0.828-1.116-1.856-2.369-0.83-3.824 0.972-1.379 2.519-1.147 3.87-0.737 1.831 0.556 3.62 1.272 5.386 2.018 23.705 10.024 46.647 21.655 69.496 33.464 6.568 3.394 13.185 6.854 18.588 12.131 2.02 1.974 3.277 4.24 3.342 7.436-0.072 2.307-0.943 4.698-2.221 6.96-4.063 7.191-12.308 11.156-20.705 11.156-5.215 0-10.489-1.53-14.855-4.767" fill="url(#radialGradient4413)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m413.44 432.07c-5.861-6.67-11.407-13.524-15.914-21.172-2.874-4.876-5.175-10.064-6.355-15.632-0.819-3.866 0.412-5.458 3.711-5.517 2.078 0.023 4.038 0.607 5.971 1.3 18.942 6.786 36.964 15.693 55.17 24.173 7.774 3.62 15.486 7.375 22.781 11.914 2.187 1.361 4.634 2.997 4.191 5.914-0.396 2.604-3.356 2.319-5.257 3.169-0.692 0.308-1.469 0.436-2.215 0.612-11.727 2.765-23.679 4.039-35.625 5.305-1.381 0.147-2.734 0.221-4.058 0.221-8.707 0-16.182-3.211-22.4-10.287" fill="url(#radialGradient4433)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m567.31 526.82c-14.169-1.46-27.39-6.06-40.199-12.109-7.73-3.652-12.567-9.493-14.146-17.954-1.793-9.597-3.042-19.253-2.904-29.045 0-2.697-0.068-5.395 0.022-8.089 0.067-1.997-0.399-4.391 1.83-5.503 2.219-1.108 4.351 0.084 6.055 1.392 2.834 2.177 5.567 4.529 8.099 7.054 14.061 14.024 27.283 28.841 40.42 43.726 4.051 4.589 8.321 9.1 10.964 14.772 1.594 3.423 0.812 4.978-2.88 5.7-1.112 0.218-2.231 0.3-3.353 0.3-1.302 0-2.607-0.11-3.908-0.244" fill="url(#radialGradient4453)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m493.43 497.7c-3.943-1.236-7.454-3.334-11.002-5.368-14.602-8.364-28.162-18.128-39.782-30.405-5.392-5.696-4.536-9.429 2.935-11.564 13.892-3.97 27.998-7.036 42.519-7.395 7.646-0.189 11.495 3.378 12.86 10.836 1.395 7.615 1.69 15.275 1.485 25.395-0.22 3.072 0.784 8.645-0.687 14.051-0.943 3.472-2.527 5.026-5.134 5.025-0.929 0-1.988-0.197-3.194-0.575" fill="url(#radialGradient4475)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)"><path d="m641.75 509.34c0.237-0.588 0.284-0.774 0.375-1.057 0.174-0.52 0.277-0.819 0.368-1.099 0.09-0.28 0.019-0.115 0.107-0.392 0.087-0.277 0.181-0.577 0.264-0.852 0.082-0.276 0.15-0.659 0.224-0.934 0.076-0.276 0.167-0.604 0.233-0.881 0.066-0.276 0.257-1.337 0.312-1.615 0.316-1.599 0.241-2.12 0.401-3.701 0.16-1.58 0.244-3.151 0.26-4.712 0.016-1.563-0.038-3.115-0.154-4.66-0.117-1.545-0.296-3.081-0.533-4.61-0.237-1.528-0.531-3.049-0.877-4.562-0.345-1.513-0.742-3.02-1.184-4.518-0.442-1.5-0.93-2.992-1.457-4.478-0.527-1.485-1.094-2.964-1.694-4.438-1.181-2.896-2.451-5.732-3.805-8.51-1.353-2.778-2.789-5.5-4.302-8.169-1.512-2.671-3.099-5.288-4.755-7.858-1.656-2.571-3.38-5.093-5.165-7.574-1.785-2.48-3.631-4.918-5.53-7.318-1.9-2.4-3.853-4.762-5.852-7.09s-4.044-4.624-6.129-6.89c-2.084-2.267-4.207-4.506-6.362-6.72-2.218-2.28-4.472-4.518-6.76-6.714-2.287-2.197-4.608-4.353-6.961-6.47s-4.737-4.196-7.152-6.237-4.86-4.046-7.334-6.016c-2.473-1.969-4.975-3.904-7.504-5.806-2.528-1.902-5.084-3.771-7.664-5.609-2.581-1.838-5.187-3.645-7.816-5.423-2.63-1.778-5.282-3.527-7.957-5.247-3.325-2.142-6.677-4.217-10.058-6.225-3.381-2.007-6.792-3.946-10.232-5.813-3.441-1.867-6.912-3.661-10.416-5.38s-7.041-3.362-10.611-4.924c-3.571-1.563-7.177-3.046-10.818-4.446-1.846-0.709-3.702-1.398-5.566-2.064-1.814-0.648-3.636-1.274-5.468-1.88-3.716-1.228-7.47-2.37-11.263-3.42-3.794-1.049-7.627-2.009-11.502-2.872-1.624-0.362-3.249-0.695-4.876-1-1.627-0.304-3.255-0.578-4.886-0.823-1.631-0.244-3.262-0.457-4.896-0.638s-3.269-0.33-4.907-0.445c-1.636-0.116-3.275-0.197-4.915-0.245-1.639-0.046-3.28-0.058-4.923-0.034-1.641 0.024-3.285 0.085-4.929 0.183-1.645 0.097-3.29 0.233-4.937 0.408-1.337 0.142-2.664 0.317-3.979 0.531s-2.617 0.466-3.906 0.759c-1.288 0.294-2.562 0.627-3.819 1.007-1.256 0.38-2.496 0.805-3.717 1.278-1.22 0.475-2.422 0.997-3.602 1.571-0.749 0.365-1.489 0.751-2.22 1.159-0.522 0.286-1.038 0.583-1.55 0.891-1.134 0.683-2.243 1.421-3.327 2.219-0.744 0.549-1.475 1.125-2.194 1.731-0.282 0.225-0.554 0.448-0.806 0.662 5.18-5.701 10.508-11.008 15.987-15.904 5.538-4.95 11.227-9.48 17.07-13.573 5.843-4.094 11.839-7.751 17.987-10.956 6.148-3.204 12.449-5.954 18.901-8.236 6.453-2.28 13.059-4.091 19.816-5.415 6.758-1.325 13.668-2.162 20.731-2.495s14.278-0.163 21.645 0.528c7.368 0.692 14.887 1.904 22.56 3.654 8.186 1.866 15.978 4.164 23.376 6.884 7.397 2.719 14.401 5.861 21.012 9.414 6.611 3.555 12.828 7.522 18.655 11.891 5.826 4.371 11.261 9.143 16.304 14.311 5.045 5.167 9.698 10.729 13.962 16.675 4.264 5.947 8.14 12.278 11.626 18.985 3.487 6.707 6.586 13.789 9.296 21.238 2.712 7.449 5.037 15.264 6.975 23.436 0.548 2.31 1.025 4.624 1.432 6.944 0.408 2.318 0.747 4.641 1.023 6.968 0.275 2.327 0.486 4.658 0.637 6.991 0.15 2.333 0.241 4.671 0.276 7.01 0.034 2.339 0.013 4.681-0.061 7.024-0.074 2.345-0.2 4.69-0.374 7.037-0.174 2.348-0.396 4.697-0.664 7.046-0.266 2.349-0.577 4.699-0.928 7.049-0.39 2.617-0.912 5.345-1.535 8.125-0.623 2.779-1.346 5.609-2.142 8.427-0.795 2.819-1.66 5.626-2.569 8.359-0.907 2.733-1.855 5.391-2.816 7.915-0.959 2.523-1.931 4.909-2.883 7.098-0.953 2.189-1.888 4.179-2.773 5.909-0.886 1.73-1.723 3.199-2.481 4.346-0.475 0.717-1.25 1.831-1.946 2.775 0.215-0.462 0.433-0.967 0.627-1.49" fill="url(#radialGradient4297)"/></g><g transform="matrix(1.3333 0 0 -1.3333 0 1024)" fill="url(#linearGradient7248-9)"><g clip-path="url(#clipPath4307-2)" fill="url(#linearGradient7248-9)"><g transform="translate(382.92 331.6)" fill="url(#linearGradient7248-9)"><path d="m0 0c6.615-7.221 13.678-14.033 21.222-20.267 7.539-6.237 15.577-11.868 24.046-16.747 8.468-4.879 17.397-8.961 26.656-12.07 9.256-3.117 18.837-5.252 28.533-6.374 9.697-1.126 19.503-1.24 29.23-0.453 9.731 0.785 19.379 2.465 28.846 4.853 18.922 4.75 37.215 12.333 53.364 23.285 8.065 5.472 15.569 11.768 22.33 18.787 6.768 7.012 12.789 14.739 18.015 22.967 10.462 16.478 17.733 34.859 22.474 53.789l0.439 1.778 0.209 0.872 0.186 0.899 0.747 3.597 0.373 1.798 0.093 0.45 0.024 0.112c-7e-3 -0.038 7e-3 0.055 0.01 0.076l0.034 0.227 0.134 0.908 0.539 3.634 0.269 1.817c0.077 0.534 0.118 1.199 0.18 1.791l0.338 3.658 0.164 1.796 0.075 1.835 0.15 3.671c0.264 9.752-0.472 19.521-1.882 29.184-1.502 9.646-4.173 19.05-7.353 28.281l-1.228 3.463-0.307 0.865-0.144 0.409-0.173 0.426-0.689 1.702-1.379 3.405-0.685 1.671-0.778 1.664-1.557 3.327-0.371 0.788-0.455 0.798-0.909 1.596-1.8039 3.187c-12.883 30.325-179.5-236.54-259.07-177.56zm-8e-3 8e-3c92.186-40.479 231.35 107.76 257.54 180.96 0.828-0.982 1.523-1.975 2.238-2.986 0.351-0.52 0.707-0.981 1.036-1.569l0.913-1.594 0.912-1.594 0.457-0.797c0.183-0.358 0.275-0.576 0.417-0.871l2.346-4.986c0.271-0.617 0.473-1.148 0.713-1.726l1.387-3.402 0.693-1.701 0.173-0.425 0.164-0.457 0.309-0.865 1.235-3.459c3.22-9.271 5.937-18.782 7.475-28.508 1.444-9.716 2.213-19.555 1.972-29.393l-0.14-3.671-0.069-1.836-0.164-1.863-0.329-3.659c-0.063-0.625-0.09-1.185-0.183-1.864l-0.264-1.818-0.528-3.635-0.132-0.909-0.033-0.227-0.024-0.152-0.023-0.112-0.092-0.45-0.369-1.8-0.736-3.599-0.185-0.9-0.216-0.915-0.436-1.79c-2.367-9.534-5.355-18.932-9.077-28.033-3.717-9.105-8.196-17.911-13.474-26.221-5.276-8.31-11.358-16.118-18.197-23.206-6.832-7.094-14.416-13.459-22.563-18.989-8.15-5.528-16.852-10.229-25.9-14.096-9.054-3.857-18.44-6.901-27.983-9.247-9.54-2.354-19.27-3.997-29.075-4.737-9.804-0.741-19.683-0.576-29.444 0.61-9.761 1.181-19.397 3.381-28.694 6.565-9.3 3.177-18.256 7.329-26.737 12.275-8.488 4.941-16.474 10.71-23.972 17.028-7.497 6.325-14.5 13.22-21.044 20.512z" fill="url(#linearGradient7248-9)"/></g></g></g><path d="m853.83 340.91z" fill="none" stroke="#000" stroke-width="1px"/><path d="m512.59 583.25c24.074 19.047 61.695 18.896 102.99 7.7902 41.299-11.105 86.278-33.164 124.63-62.438 43.462-33.178 74.436-61.06 97.049-98.852 10.211-17.065 16.881-32.679 20.405-47.4 3.5243-14.721 2.1355-27.046-3.4171-40.626 0 0 22.052 31.822 28.025 81.607 2.9864 24.893 1.4477 59.407-11.26 93.337-11.843 31.622-27.743 61.223-54.874 85.55-1.0301 0.92357-12.207 12.478-32.938 24.374-25.596 14.688-46.884 22.5-75.534 27.634-34.926 6.2583-59.469 4.4522-85.833-1.8111-36.815-8.7462-71.794-28.542-110.24-69.041" fill="url(#radialGradient7556)"/></g></g></svg>
diff --git a/dist/doc-icon.png b/dist/doc-icon.png
index 420b1546f..9b5773214 100644
--- a/dist/doc-icon.png
+++ b/dist/doc-icon.png
Binary files differ
diff --git a/dist/icons/checked.png b/dist/icons/checked.png
new file mode 100644
index 000000000..c277e6b40
--- /dev/null
+++ b/dist/icons/checked.png
Binary files differ
diff --git a/dist/icons/failed.png b/dist/icons/failed.png
new file mode 100644
index 000000000..ac10f174a
--- /dev/null
+++ b/dist/icons/failed.png
Binary files differ
diff --git a/dist/icons/icons.qrc b/dist/icons/icons.qrc
new file mode 100644
index 000000000..f0c44862f
--- /dev/null
+++ b/dist/icons/icons.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="icons">
+ <file>checked.png</file>
+ <file>failed.png</file>
+ </qresource>
+</RCC>
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index b809d76d8..8f42f4fdc 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -1,5 +1,8 @@
# Definitions for all external bundled libraries
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
+include(DownloadExternals)
+
# Catch
add_library(catch-single-include INTERFACE)
target_include_directories(catch-single-include INTERFACE catch/single_include)
@@ -46,6 +49,10 @@ add_subdirectory(soundtouch)
# The SoundTouch target doesn't export the necessary include paths as properties by default
target_include_directories(SoundTouch INTERFACE ./soundtouch/include)
+# Unicorn
+add_library(unicorn-headers INTERFACE)
+target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
+
# Xbyak
if (ARCHITECTURE_x86_64)
# Defined before "dynarmic" above
@@ -59,9 +66,21 @@ add_subdirectory(enet)
target_include_directories(enet INTERFACE ./enet/include)
if (ENABLE_WEB_SERVICE)
+ # msys installed curl is configured to use openssl, but that isn't portable
+ # since it relies on having the bundled certs install in the home folder for SSL
+ # by default on mingw, download the precompiled curl thats linked against windows native ssl
+ if (MINGW AND CITRA_USE_BUNDLED_CURL)
+ download_bundled_external("curl/" "curl-7_55_1" CURL_PREFIX)
+ set(CURL_PREFIX "${CMAKE_BINARY_DIR}/externals/curl-7_55_1")
+ set(CURL_FOUND YES)
+ set(CURL_INCLUDE_DIR "${CURL_PREFIX}/include" CACHE PATH "Path to curl headers")
+ set(CURL_LIBRARY "${CURL_PREFIX}/lib/libcurldll.a" CACHE PATH "Path to curl library")
+ set(CURL_DLL_DIR "${CURL_PREFIX}/lib/" CACHE PATH "Path to curl.dll")
+ set(USE_SYSTEM_CURL ON CACHE BOOL "")
+ endif()
# CPR
- option(BUILD_TESTING OFF)
- option(BUILD_CPR_TESTS OFF)
+ set(BUILD_TESTING OFF CACHE BOOL "")
+ set(BUILD_CPR_TESTS OFF CACHE BOOL "")
add_subdirectory(cpr)
target_include_directories(cpr INTERFACE ./cpr/include)
diff --git a/externals/cryptopp/cryptopp b/externals/cryptopp/cryptopp
-Subproject 841c37e34765487a2968357369ab74db8b10a62
+Subproject 24bc2b85674254fb294e717eb5b47d9f53e786b
diff --git a/externals/dynarmic b/externals/dynarmic
-Subproject 8f15e3f70cb96e56705e5de6ba97b5d09423a56
+Subproject 69eccf826d657a6cfb1d731b00629939d230ec5
diff --git a/externals/enet b/externals/enet
-Subproject a84c120eff13d2fa3eadb41ef7afe0f7819f4d6
+Subproject 9d9ba122d4818f7ae1aef2197933ac696edb233
diff --git a/externals/soundtouch b/externals/soundtouch
-Subproject 5274ec4dec498bd88ccbcd28862a0f78a3b95ef
+Subproject 019d2089bbadf70d73ba85aa8ea51490b071262
diff --git a/src/audio_core/codec.cpp b/src/audio_core/codec.cpp
index 7a3bd7eb3..6fba9fdae 100644
--- a/src/audio_core/codec.cpp
+++ b/src/audio_core/codec.cpp
@@ -117,7 +117,9 @@ StereoBuffer16 DecodePCM16(const unsigned num_channels, const u8* const data,
ret[i].fill(sample);
}
} else {
- std::memcpy(ret.data(), data, sample_count * 2 * sizeof(u16));
+ for (size_t i = 0; i < sample_count; ++i) {
+ std::memcpy(&ret[i], data + i * sizeof(s16) * 2, 2 * sizeof(s16));
+ }
}
return ret;
diff --git a/src/audio_core/codec.h b/src/audio_core/codec.h
index 2b0c395e6..877b2202d 100644
--- a/src/audio_core/codec.h
+++ b/src/audio_core/codec.h
@@ -5,13 +5,13 @@
#pragma once
#include <array>
-#include <vector>
+#include <deque>
#include "common/common_types.h"
namespace Codec {
/// A variable length buffer of signed PCM16 stereo samples.
-using StereoBuffer16 = std::vector<std::array<s16, 2>>;
+using StereoBuffer16 = std::deque<std::array<s16, 2>>;
/// See: Codec::DecodeADPCM
struct ADPCMState {
diff --git a/src/audio_core/hle/source.cpp b/src/audio_core/hle/source.cpp
index 92484c526..c12287700 100644
--- a/src/audio_core/hle/source.cpp
+++ b/src/audio_core/hle/source.cpp
@@ -244,17 +244,27 @@ void Source::GenerateFrame() {
break;
}
- const size_t size_to_copy =
- std::min(state.current_buffer.size(), current_frame.size() - frame_position);
-
- std::copy(state.current_buffer.begin(), state.current_buffer.begin() + size_to_copy,
- current_frame.begin() + frame_position);
- state.current_buffer.erase(state.current_buffer.begin(),
- state.current_buffer.begin() + size_to_copy);
-
- frame_position += size_to_copy;
- state.next_sample_number += static_cast<u32>(size_to_copy);
+ switch (state.interpolation_mode) {
+ case InterpolationMode::None:
+ AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ case InterpolationMode::Linear:
+ AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ case InterpolationMode::Polyphase:
+ // TODO(merry): Implement polyphase interpolation
+ LOG_DEBUG(Audio_DSP, "Polyphase interpolation unimplemented; falling back to linear");
+ AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier,
+ current_frame, frame_position);
+ break;
+ default:
+ UNIMPLEMENTED();
+ break;
+ }
}
+ state.next_sample_number += static_cast<u32>(frame_position);
state.filters.ProcessFrame(current_frame);
}
@@ -305,25 +315,6 @@ bool Source::DequeueBuffer() {
return true;
}
- switch (state.interpolation_mode) {
- case InterpolationMode::None:
- state.current_buffer =
- AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- case InterpolationMode::Linear:
- state.current_buffer =
- AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- case InterpolationMode::Polyphase:
- // TODO(merry): Implement polyphase interpolation
- state.current_buffer =
- AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier);
- break;
- default:
- UNIMPLEMENTED();
- break;
- }
-
// the first playthrough starts at play_position, loops start at the beginning of the buffer
state.current_sample_number = (!buf.has_played) ? buf.play_position : 0;
state.next_sample_number = state.current_sample_number;
diff --git a/src/audio_core/hle/source.h b/src/audio_core/hle/source.h
index ccb7f064f..c4d2debc2 100644
--- a/src/audio_core/hle/source.h
+++ b/src/audio_core/hle/source.h
@@ -108,7 +108,7 @@ private:
u32 current_sample_number = 0;
u32 next_sample_number = 0;
- std::vector<std::array<s16, 2>> current_buffer;
+ AudioInterp::StereoBuffer16 current_buffer;
// buffer_id state
diff --git a/src/audio_core/interpolate.cpp b/src/audio_core/interpolate.cpp
index 8a5d4181a..83573d772 100644
--- a/src/audio_core/interpolate.cpp
+++ b/src/audio_core/interpolate.cpp
@@ -13,74 +13,64 @@ namespace AudioInterp {
constexpr u64 scale_factor = 1 << 24;
constexpr u64 scale_mask = scale_factor - 1;
-/// Here we step over the input in steps of rate_multiplier, until we consume all of the input.
+/// Here we step over the input in steps of rate, until we consume all of the input.
/// Three adjacent samples are passed to fn each step.
template <typename Function>
-static StereoBuffer16 StepOverSamples(State& state, const StereoBuffer16& input,
- float rate_multiplier, Function fn) {
- ASSERT(rate_multiplier > 0);
+static void StepOverSamples(State& state, StereoBuffer16& input, float rate,
+ DSP::HLE::StereoFrame16& output, size_t& outputi, Function fn) {
+ ASSERT(rate > 0);
- if (input.size() < 2)
- return {};
+ if (input.empty())
+ return;
- StereoBuffer16 output;
- output.reserve(static_cast<size_t>(input.size() / rate_multiplier));
+ input.insert(input.begin(), {state.xn2, state.xn1});
- u64 step_size = static_cast<u64>(rate_multiplier * scale_factor);
+ const u64 step_size = static_cast<u64>(rate * scale_factor);
+ u64 fposition = state.fposition;
+ size_t inputi = 0;
- u64 fposition = 0;
- const u64 max_fposition = input.size() * scale_factor;
+ while (outputi < output.size()) {
+ inputi = static_cast<size_t>(fposition / scale_factor);
- while (fposition < 1 * scale_factor) {
- u64 fraction = fposition & scale_mask;
-
- output.push_back(fn(fraction, state.xn2, state.xn1, input[0]));
-
- fposition += step_size;
- }
-
- while (fposition < 2 * scale_factor) {
- u64 fraction = fposition & scale_mask;
-
- output.push_back(fn(fraction, state.xn1, input[0], input[1]));
-
- fposition += step_size;
- }
+ if (inputi + 2 >= input.size()) {
+ inputi = input.size() - 2;
+ break;
+ }
- while (fposition < max_fposition) {
u64 fraction = fposition & scale_mask;
-
- size_t index = static_cast<size_t>(fposition / scale_factor);
- output.push_back(fn(fraction, input[index - 2], input[index - 1], input[index]));
+ output[outputi++] = fn(fraction, input[inputi], input[inputi + 1], input[inputi + 2]);
fposition += step_size;
}
- state.xn2 = input[input.size() - 2];
- state.xn1 = input[input.size() - 1];
+ state.xn2 = input[inputi];
+ state.xn1 = input[inputi + 1];
+ state.fposition = fposition - inputi * scale_factor;
- return output;
+ input.erase(input.begin(), std::next(input.begin(), inputi + 2));
}
-StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier) {
- return StepOverSamples(
- state, input, rate_multiplier,
+void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi) {
+ StepOverSamples(
+ state, input, rate, output, outputi,
[](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { return x0; });
}
-StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) {
+void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi) {
// Note on accuracy: Some values that this produces are +/- 1 from the actual firmware.
- return StepOverSamples(state, input, rate_multiplier,
- [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
- // This is a saturated subtraction. (Verified by black-box fuzzing.)
- s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
- s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
-
- return std::array<s16, 2>{
- static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
- static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
- };
- });
+ StepOverSamples(state, input, rate, output, outputi,
+ [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
+ // This is a saturated subtraction. (Verified by black-box fuzzing.)
+ s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
+ s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
+
+ return std::array<s16, 2>{
+ static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
+ static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
+ };
+ });
}
} // namespace AudioInterp
diff --git a/src/audio_core/interpolate.h b/src/audio_core/interpolate.h
index 19a7b66cb..8dff6111a 100644
--- a/src/audio_core/interpolate.h
+++ b/src/audio_core/interpolate.h
@@ -5,40 +5,45 @@
#pragma once
#include <array>
-#include <vector>
+#include <deque>
+#include "audio_core/hle/common.h"
#include "common/common_types.h"
namespace AudioInterp {
/// A variable length buffer of signed PCM16 stereo samples.
-using StereoBuffer16 = std::vector<std::array<s16, 2>>;
+using StereoBuffer16 = std::deque<std::array<s16, 2>>;
struct State {
- // Two historical samples.
+ /// Two historical samples.
std::array<s16, 2> xn1 = {}; ///< x[n-1]
std::array<s16, 2> xn2 = {}; ///< x[n-2]
+ /// Current fractional position.
+ u64 fposition = 0;
};
/**
* No interpolation. This is equivalent to a zero-order hold. There is a two-sample predelay.
* @param state Interpolation state.
* @param input Input buffer.
- * @param rate_multiplier Stretch factor. Must be a positive non-zero value.
- * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
- * performs upsampling.
- * @return The resampled audio buffer.
+ * @param rate Stretch factor. Must be a positive non-zero value.
+ * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
+ * @param output The resampled audio buffer.
+ * @param outputi The index of output to start writing to.
*/
-StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier);
+void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi);
/**
* Linear interpolation. This is equivalent to a first-order hold. There is a two-sample predelay.
* @param state Interpolation state.
* @param input Input buffer.
- * @param rate_multiplier Stretch factor. Must be a positive non-zero value.
- * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
- * performs upsampling.
- * @return The resampled audio buffer.
+ * @param rate Stretch factor. Must be a positive non-zero value.
+ * rate > 1.0 performs decimation and rate < 1.0 performs upsampling.
+ * @param output The resampled audio buffer.
+ * @param outputi The index of output to start writing to.
*/
-StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier);
+void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output,
+ size_t& outputi);
} // namespace AudioInterp
diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index 14574e56c..e524c5535 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -165,6 +165,8 @@ int main(int argc, char** argv) {
break; // Expected case
}
+ Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "SDL");
+
while (emu_window->IsOpen()) {
system.RunLoop();
}
diff --git a/src/citra/citra.rc b/src/citra/citra.rc
index fea603004..c490ef302 100644
--- a/src/citra/citra.rc
+++ b/src/citra/citra.rc
@@ -1,3 +1,4 @@
+#include "winresrc.h"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
@@ -7,3 +8,10 @@
// remains consistent on all systems.
CITRA_ICON ICON "../../dist/citra.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// RT_MANIFEST
+//
+
+1 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra/config.cpp b/src/citra/config.cpp
index 69247b166..45c28ad09 100644
--- a/src/citra/config.cpp
+++ b/src/citra/config.cpp
@@ -76,6 +76,11 @@ void Config::ReadValues() {
Settings::values.analogs[i] = default_param;
}
+ Settings::values.motion_device = sdl2_config->Get(
+ "Controls", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01");
+ Settings::values.touch_device =
+ sdl2_config->Get("Controls", "touch_device", "engine:emu_window");
+
// Core
Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true);
@@ -153,8 +158,14 @@ void Config::ReadValues() {
static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689));
// Web Service
+ Settings::values.enable_telemetry =
+ sdl2_config->GetBoolean("WebService", "enable_telemetry", true);
Settings::values.telemetry_endpoint_url = sdl2_config->Get(
"WebService", "telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry");
+ Settings::values.verify_endpoint_url = sdl2_config->Get(
+ "WebService", "verify_endpoint_url", "https://services.citra-emu.org/api/profile");
+ Settings::values.citra_username = sdl2_config->Get("WebService", "citra_username", "");
+ Settings::values.citra_token = sdl2_config->Get("WebService", "citra_token", "");
}
void Config::Reload() {
diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h
index a12498e0f..59faf773f 100644
--- a/src/citra/default_ini.h
+++ b/src/citra/default_ini.h
@@ -12,7 +12,7 @@ const char* sdl2_config_file = R"(
# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..."
# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values
-# for button input, the following devices are avaible:
+# for button input, the following devices are available:
# - "keyboard" (default) for keyboard input. Required parameters:
# - "code": the code of the key to bind
# - "sdl" for joystick input using SDL. Required parameters:
@@ -21,7 +21,7 @@ const char* sdl2_config_file = R"(
# - "hat"(optional): the index of the hat to bind as direction buttons
# - "axis"(optional): the index of the axis to bind
# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right"
-# - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is
+# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
# triggered if the axis value crosses
# - "direction"(only used for axis): "+" means the button is triggered when the axis value
# is greater than the threshold; "-" means the button is triggered when the axis value
@@ -42,8 +42,8 @@ button_zl=
button_zr=
button_home=
-# for analog input, the following devices are avaible:
-# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
+# for analog input, the following devices are available:
+# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
# - "up", "down", "left", "right": sub-devices for each direction.
# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00"
# - "modifier": sub-devices as a modifier.
@@ -56,6 +56,16 @@ button_home=
circle_pad=
c_stick=
+# for motion input, the following devices are available:
+# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
+# - "update_period": update period in milliseconds (default to 100)
+# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01)
+motion_device=
+
+# for touch input, the following devices are available:
+# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required
+touch_device=
+
[Core]
# Whether to use the Just-In-Time (JIT) compiler for CPU emulation
# 0: Interpreter (slow), 1 (default): JIT (fast)
@@ -170,7 +180,16 @@ use_gdbstub=false
gdbstub_port=24689
[WebService]
+# Whether or not to enable telemetry
+# 0: No, 1 (default): Yes
+enable_telemetry =
# Endpoint URL for submitting telemetry data
-telemetry_endpoint_url =
+telemetry_endpoint_url = https://services.citra-emu.org/api/telemetry
+# Endpoint URL to verify the username and token
+verify_endpoint_url = https://services.citra-emu.org/api/profile
+# Username and token for Citra Web Service
+# See https://services.citra-emu.org/ for more info
+citra_username =
+citra_token =
)";
}
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp
index b0f808399..25643715a 100644
--- a/src/citra/emu_window/emu_window_sdl2.cpp
+++ b/src/citra/emu_window/emu_window_sdl2.cpp
@@ -16,11 +16,12 @@
#include "core/settings.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#include "network/network.h"
void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0));
- motion_emu->Tilt(x, y);
+ InputCommon::GetMotionEmu()->Tilt(x, y);
}
void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
@@ -32,9 +33,9 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
}
} else if (button == SDL_BUTTON_RIGHT) {
if (state == SDL_PRESSED) {
- motion_emu->BeginTilt(x, y);
+ InputCommon::GetMotionEmu()->BeginTilt(x, y);
} else {
- motion_emu->EndTilt();
+ InputCommon::GetMotionEmu()->EndTilt();
}
}
}
@@ -61,8 +62,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
InputCommon::Init();
Network::Init();
- motion_emu = std::make_unique<Motion::MotionEmu>(*this);
-
SDL_SetMainReady();
// Initialize the window
@@ -117,7 +116,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
EmuWindow_SDL2::~EmuWindow_SDL2() {
SDL_GL_DeleteContext(gl_context);
SDL_Quit();
- motion_emu = nullptr;
Network::Shutdown();
InputCommon::Shutdown();
diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h
index 1ce2991f7..3664d2fbe 100644
--- a/src/citra/emu_window/emu_window_sdl2.h
+++ b/src/citra/emu_window/emu_window_sdl2.h
@@ -7,7 +7,6 @@
#include <memory>
#include <utility>
#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
struct SDL_Window;
@@ -57,7 +56,4 @@ private:
using SDL_GLContext = void*;
/// The OpenGL context associated with the window
SDL_GLContext gl_context;
-
- /// Motion sensors emulation
- std::unique_ptr<Motion::MotionEmu> motion_emu;
};
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index f364b2284..add7566c2 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SRCS
configuration/configure_graphics.cpp
configuration/configure_input.cpp
configuration/configure_system.cpp
+ configuration/configure_web.cpp
debugger/graphics/graphics.cpp
debugger/graphics/graphics_breakpoint_observer.cpp
debugger/graphics/graphics_breakpoints.cpp
@@ -42,6 +43,7 @@ set(HEADERS
configuration/configure_graphics.h
configuration/configure_input.h
configuration/configure_system.h
+ configuration/configure_web.h
debugger/graphics/graphics.h
debugger/graphics/graphics_breakpoint_observer.h
debugger/graphics/graphics_breakpoints.h
@@ -71,11 +73,13 @@ set(UIS
configuration/configure_graphics.ui
configuration/configure_input.ui
configuration/configure_system.ui
+ configuration/configure_web.ui
debugger/registers.ui
hotkeys.ui
main.ui
)
+file(GLOB_RECURSE ICONS ${CMAKE_SOURCE_DIR}/dist/icons/*)
file(GLOB_RECURSE THEMES ${CMAKE_SOURCE_DIR}/dist/qt_themes/*)
create_directory_groups(${SRCS} ${HEADERS} ${UIS})
@@ -89,10 +93,10 @@ endif()
if (APPLE)
set(MACOSX_ICON "../../dist/citra.icns")
set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
- add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES} ${MACOSX_ICON})
+ add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES} ${MACOSX_ICON})
set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
else()
- add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES})
+ add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES})
endif()
target_link_libraries(citra-qt PRIVATE audio_core common core input_common network video_core)
target_link_libraries(citra-qt PRIVATE Boost::boost glad nihstro-headers Qt5::OpenGL Qt5::Widgets)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 30554890f..7107bfc60 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -17,6 +17,7 @@
#include "core/settings.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#include "network/network.h"
EmuThread::EmuThread(GRenderWindow* render_window)
@@ -201,7 +202,6 @@ qreal GRenderWindow::windowPixelRatio() {
}
void GRenderWindow::closeEvent(QCloseEvent* event) {
- motion_emu = nullptr;
emit Closed();
QWidget::closeEvent(event);
}
@@ -221,7 +221,7 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
static_cast<unsigned>(pos.y() * pixelRatio));
} else if (event->button() == Qt::RightButton) {
- motion_emu->BeginTilt(pos.x(), pos.y());
+ InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y());
}
}
@@ -230,14 +230,14 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
qreal pixelRatio = windowPixelRatio();
this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
- motion_emu->Tilt(pos.x(), pos.y());
+ InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y());
}
void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton)
this->TouchReleased();
else if (event->button() == Qt::RightButton)
- motion_emu->EndTilt();
+ InputCommon::GetMotionEmu()->EndTilt();
}
void GRenderWindow::focusOutEvent(QFocusEvent* event) {
@@ -290,13 +290,11 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(
}
void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
- motion_emu = std::make_unique<Motion::MotionEmu>(*this);
this->emu_thread = emu_thread;
child->DisablePainting();
}
void GRenderWindow::OnEmulationStopping() {
- motion_emu = nullptr;
emu_thread = nullptr;
child->EnablePainting();
}
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 4b3a3b3cc..6974edcbb 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -12,7 +12,6 @@
#include "common/thread.h"
#include "core/core.h"
#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
class QKeyEvent;
class QScreen;
@@ -158,9 +157,6 @@ private:
EmuThread* emu_thread;
- /// Motion sensors emulation
- std::unique_ptr<Motion::MotionEmu> motion_emu;
-
protected:
void showEvent(QShowEvent* event) override;
};
diff --git a/src/citra_qt/citra-qt.rc b/src/citra_qt/citra-qt.rc
index fea603004..a48a9440d 100644
--- a/src/citra_qt/citra-qt.rc
+++ b/src/citra_qt/citra-qt.rc
@@ -1,3 +1,4 @@
+#include "winresrc.h"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
@@ -5,5 +6,14 @@
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
-CITRA_ICON ICON "../../dist/citra.ico"
+// QT requires that the default application icon is named IDI_ICON1
+IDI_ICON1 ICON "../../dist/citra.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// RT_MANIFEST
+//
+
+1 RT_MANIFEST "../../dist/citra.manifest"
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index 75abb4ce6..5261f4c4c 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -57,6 +57,13 @@ void Config::ReadValues() {
Settings::values.analogs[i] = default_param;
}
+ Settings::values.motion_device =
+ qt_config->value("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01")
+ .toString()
+ .toStdString();
+ Settings::values.touch_device =
+ qt_config->value("touch_device", "engine:emu_window").toString().toStdString();
+
qt_config->endGroup();
qt_config->beginGroup("Core");
@@ -134,10 +141,17 @@ void Config::ReadValues() {
qt_config->endGroup();
qt_config->beginGroup("WebService");
+ Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool();
Settings::values.telemetry_endpoint_url =
qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry")
.toString()
.toStdString();
+ Settings::values.verify_endpoint_url =
+ qt_config->value("verify_endpoint_url", "https://services.citra-emu.org/api/profile")
+ .toString()
+ .toStdString();
+ Settings::values.citra_username = qt_config->value("citra_username").toString().toStdString();
+ Settings::values.citra_token = qt_config->value("citra_token").toString().toStdString();
qt_config->endGroup();
qt_config->beginGroup("UI");
@@ -189,6 +203,7 @@ void Config::ReadValues() {
UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool();
UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool();
UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
+ UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
qt_config->endGroup();
}
@@ -203,6 +218,8 @@ void Config::SaveValues() {
qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]),
QString::fromStdString(Settings::values.analogs[i]));
}
+ qt_config->setValue("motion_device", QString::fromStdString(Settings::values.motion_device));
+ qt_config->setValue("touch_device", QString::fromStdString(Settings::values.touch_device));
qt_config->endGroup();
qt_config->beginGroup("Core");
@@ -277,8 +294,13 @@ void Config::SaveValues() {
qt_config->endGroup();
qt_config->beginGroup("WebService");
+ qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry);
qt_config->setValue("telemetry_endpoint_url",
QString::fromStdString(Settings::values.telemetry_endpoint_url));
+ qt_config->setValue("verify_endpoint_url",
+ QString::fromStdString(Settings::values.verify_endpoint_url));
+ qt_config->setValue("citra_username", QString::fromStdString(Settings::values.citra_username));
+ qt_config->setValue("citra_token", QString::fromStdString(Settings::values.citra_token));
qt_config->endGroup();
qt_config->beginGroup("UI");
@@ -314,6 +336,7 @@ void Config::SaveValues() {
qt_config->setValue("showStatusBar", UISettings::values.show_status_bar);
qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing);
qt_config->setValue("firstStart", UISettings::values.first_start);
+ qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
qt_config->endGroup();
}
diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui
index 85e206e42..6abd1917e 100644
--- a/src/citra_qt/configuration/configure.ui
+++ b/src/citra_qt/configuration/configure.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>441</width>
- <height>501</height>
+ <width>740</width>
+ <height>500</height>
</rect>
</property>
<property name="windowTitle">
@@ -49,6 +49,11 @@
<string>Debug</string>
</attribute>
</widget>
+ <widget class="ConfigureWeb" name="webTab">
+ <attribute name="title">
+ <string>Web</string>
+ </attribute>
+ </widget>
</widget>
</item>
<item>
@@ -97,6 +102,12 @@
<header>configuration/configure_graphics.h</header>
<container>1</container>
</customwidget>
+ <customwidget>
+ <class>ConfigureWeb</class>
+ <extends>QWidget</extends>
+ <header>configuration/configure_web.h</header>
+ <container>1</container>
+ </customwidget>
</customwidgets>
<resources/>
<connections>
diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp
index dfc8c03a7..b87dc0e6c 100644
--- a/src/citra_qt/configuration/configure_dialog.cpp
+++ b/src/citra_qt/configuration/configure_dialog.cpp
@@ -23,5 +23,6 @@ void ConfigureDialog::applyConfiguration() {
ui->graphicsTab->applyConfiguration();
ui->audioTab->applyConfiguration();
ui->debugTab->applyConfiguration();
+ ui->webTab->applyConfiguration();
Settings::Apply();
}
diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui
index 228f2a869..5667b14b6 100644
--- a/src/citra_qt/configuration/configure_graphics.ui
+++ b/src/citra_qt/configuration/configure_graphics.ui
@@ -63,57 +63,57 @@
<widget class="QComboBox" name="resolution_factor_combobox">
<item>
<property name="text">
- <string notr="true">Auto (Window Size)</string>
+ <string>Auto (Window Size)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Native (400x240)</string>
+ <string>Native (400x240)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">2x Native (800x480)</string>
+ <string>2x Native (800x480)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">3x Native (1200x720)</string>
+ <string>3x Native (1200x720)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">4x Native (1600x960)</string>
+ <string>4x Native (1600x960)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">5x Native (2000x1200)</string>
+ <string>5x Native (2000x1200)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">6x Native (2400x1440)</string>
+ <string>6x Native (2400x1440)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">7x Native (2800x1680)</string>
+ <string>7x Native (2800x1680)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">8x Native (3200x1920)</string>
+ <string>8x Native (3200x1920)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">9x Native (3600x2160)</string>
+ <string>9x Native (3600x2160)</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">10x Native (4000x2400)</string>
+ <string>10x Native (4000x2400)</string>
</property>
</item>
</widget>
@@ -146,17 +146,22 @@
<widget class="QComboBox" name="layout_combobox">
<item>
<property name="text">
- <string notr="true">Default</string>
+ <string>Default</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Single Screen</string>
+ <string>Single Screen</string>
</property>
</item>
<item>
<property name="text">
- <string notr="true">Large Screen</string>
+ <string>Large Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Side by Side</string>
</property>
</item>
</widget>
diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp
index 9b1e6711d..88a067c12 100644
--- a/src/citra_qt/configuration/configure_system.cpp
+++ b/src/citra_qt/configuration/configure_system.cpp
@@ -78,7 +78,8 @@ void ConfigureSystem::ReadSystemSettings() {
// set the console id
u64 console_id = Service::CFG::GetConsoleUniqueId();
- ui->label_console_id->setText("Console ID: 0x" + QString::number(console_id, 16).toUpper());
+ ui->label_console_id->setText(
+ tr("Console ID: 0x%1").arg(QString::number(console_id, 16).toUpper()));
}
void ConfigureSystem::applyConfiguration() {
diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp
new file mode 100644
index 000000000..bf8c21ac7
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.cpp
@@ -0,0 +1,102 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <QMessageBox>
+#include "citra_qt/configuration/configure_web.h"
+#include "core/settings.h"
+#include "core/telemetry_session.h"
+#include "ui_configure_web.h"
+
+ConfigureWeb::ConfigureWeb(QWidget* parent)
+ : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) {
+ ui->setupUi(this);
+ connect(ui->button_regenerate_telemetry_id, &QPushButton::clicked, this,
+ &ConfigureWeb::RefreshTelemetryID);
+ connect(ui->button_verify_login, &QPushButton::clicked, this, &ConfigureWeb::VerifyLogin);
+ connect(this, &ConfigureWeb::LoginVerified, this, &ConfigureWeb::OnLoginVerified);
+
+ this->setConfiguration();
+}
+
+ConfigureWeb::~ConfigureWeb() {}
+
+void ConfigureWeb::setConfiguration() {
+ ui->web_credentials_disclaimer->setWordWrap(true);
+ ui->telemetry_learn_more->setOpenExternalLinks(true);
+ ui->telemetry_learn_more->setText(tr("<a "
+ "href='https://citra-emu.org/entry/"
+ "telemetry-and-why-thats-a-good-thing/'>Learn more</a>"));
+
+ ui->web_signup_link->setOpenExternalLinks(true);
+ ui->web_signup_link->setText(tr("<a href='https://services.citra-emu.org/'>Sign up</a>"));
+ ui->web_token_info_link->setOpenExternalLinks(true);
+ ui->web_token_info_link->setText(
+ tr("<a href='https://citra-emu.org/wiki/citra-web-service/'>What is my token?</a>"));
+
+ ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry);
+ ui->edit_username->setText(QString::fromStdString(Settings::values.citra_username));
+ ui->edit_token->setText(QString::fromStdString(Settings::values.citra_token));
+ // Connect after setting the values, to avoid calling OnLoginChanged now
+ connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
+ connect(ui->edit_username, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged);
+ ui->label_telemetry_id->setText(
+ tr("Telemetry ID: 0x%1").arg(QString::number(Core::GetTelemetryId(), 16).toUpper()));
+ user_verified = true;
+}
+
+void ConfigureWeb::applyConfiguration() {
+ Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked();
+ if (user_verified) {
+ Settings::values.citra_username = ui->edit_username->text().toStdString();
+ Settings::values.citra_token = ui->edit_token->text().toStdString();
+ } else {
+ QMessageBox::warning(this, tr("Username and token not verfied"),
+ tr("Username and token were not verified. The changes to your "
+ "username and/or token have not been saved."));
+ }
+ Settings::Apply();
+}
+
+void ConfigureWeb::RefreshTelemetryID() {
+ const u64 new_telemetry_id{Core::RegenerateTelemetryId()};
+ ui->label_telemetry_id->setText(
+ tr("Telemetry ID: 0x%1").arg(QString::number(new_telemetry_id, 16).toUpper()));
+}
+
+void ConfigureWeb::OnLoginChanged() {
+ if (ui->edit_username->text().isEmpty() && ui->edit_token->text().isEmpty()) {
+ user_verified = true;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ } else {
+ user_verified = false;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ }
+}
+
+void ConfigureWeb::VerifyLogin() {
+ verified =
+ Core::VerifyLogin(ui->edit_username->text().toStdString(),
+ ui->edit_token->text().toStdString(), [&]() { emit LoginVerified(); });
+ ui->button_verify_login->setDisabled(true);
+ ui->button_verify_login->setText(tr("Verifying"));
+}
+
+void ConfigureWeb::OnLoginVerified() {
+ ui->button_verify_login->setEnabled(true);
+ ui->button_verify_login->setText(tr("Verify"));
+ if (verified.get()) {
+ user_verified = true;
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png"));
+ } else {
+ ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png"));
+ QMessageBox::critical(
+ this, tr("Verification failed"),
+ tr("Verification failed. Check that you have entered your username and token "
+ "correctly, and that your internet connection is working."));
+ }
+}
diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h
new file mode 100644
index 000000000..ad2d58f6e
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.h
@@ -0,0 +1,40 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <future>
+#include <memory>
+#include <QWidget>
+
+namespace Ui {
+class ConfigureWeb;
+}
+
+class ConfigureWeb : public QWidget {
+ Q_OBJECT
+
+public:
+ explicit ConfigureWeb(QWidget* parent = nullptr);
+ ~ConfigureWeb();
+
+ void applyConfiguration();
+
+public slots:
+ void RefreshTelemetryID();
+ void OnLoginChanged();
+ void VerifyLogin();
+ void OnLoginVerified();
+
+signals:
+ void LoginVerified();
+
+private:
+ void setConfiguration();
+
+ bool user_verified = true;
+ std::future<bool> verified;
+
+ std::unique_ptr<Ui::ConfigureWeb> ui;
+};
diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui
new file mode 100644
index 000000000..dd996ab62
--- /dev/null
+++ b/src/citra_qt/configuration/configure_web.ui
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfigureWeb</class>
+ <widget class="QWidget" name="ConfigureWeb">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>926</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="groupBoxWebConfig">
+ <property name="title">
+ <string>Citra Web Service</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayoutCitraWebService">
+ <item>
+ <widget class="QLabel" name="web_credentials_disclaimer">
+ <property name="text">
+ <string>By providing your username and token, you agree to allow Citra to collect additional usage data, which may include user identifying information.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutCitraUsername">
+ <item row="2" column="3">
+ <widget class="QPushButton" name="button_verify_login">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Verify</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="web_signup_link">
+ <property name="text">
+ <string>Sign up</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="3">
+ <widget class="QLineEdit" name="edit_username">
+ <property name="maxLength">
+ <number>36</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_token">
+ <property name="text">
+ <string>Token: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QLabel" name="label_token_verified">
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_username">
+ <property name="text">
+ <string>Username: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QLabel" name="label_username_verified">
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3">
+ <widget class="QLineEdit" name="edit_token">
+ <property name="maxLength">
+ <number>36</number>
+ </property>
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="web_token_info_link">
+ <property name="text">
+ <string>What is my token?</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Telemetry</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="toggle_telemetry">
+ <property name="text">
+ <string>Share anonymous usage data with the Citra team</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="telemetry_learn_more">
+ <property name="text">
+ <string>Learn more</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayoutTelemetryId">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_telemetry_id">
+ <property name="text">
+ <string>Telemetry ID:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="button_regenerate_telemetry_id">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text">
+ <string>Regenerate</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
index 7d06ec28a..ce2b9fa50 100644
--- a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
@@ -26,8 +26,8 @@
namespace {
QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) {
QImage decoded_image(info.width, info.height, QImage::Format_ARGB32);
- for (int y = 0; y < info.height; ++y) {
- for (int x = 0; x < info.width; ++x) {
+ for (u32 y = 0; y < info.height; ++y) {
+ for (u32 x = 0; x < info.width; ++x) {
Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true);
decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a()));
}
diff --git a/src/citra_qt/debugger/graphics/graphics_surface.cpp b/src/citra_qt/debugger/graphics/graphics_surface.cpp
index 47d9924e1..c974545ef 100644
--- a/src/citra_qt/debugger/graphics/graphics_surface.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_surface.cpp
@@ -273,7 +273,8 @@ void GraphicsSurfaceWidget::Pick(int x, int y) {
surface_picker_x_control->setValue(x);
surface_picker_y_control->setValue(y);
- if (x < 0 || x >= surface_width || y < 0 || y >= surface_height) {
+ if (x < 0 || x >= static_cast<int>(surface_width) || y < 0 ||
+ y >= static_cast<int>(surface_height)) {
surface_info_label->setText(tr("Pixel out of bounds"));
surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
return;
diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
index e3f3194db..7f4ec0c52 100644
--- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
@@ -183,23 +183,13 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
print_input(output, src1, swizzle.negate_src1,
SelectorToString(swizzle.src1_selector));
AlignToColumn(kInputOperandColumnWidth);
- if (src_is_inverted) {
- print_input(output, src2, swizzle.negate_src2,
- SelectorToString(swizzle.src2_selector));
- } else {
- print_input(output, src2, swizzle.negate_src2,
- SelectorToString(swizzle.src2_selector), true,
- instr.mad.AddressRegisterName());
- }
+ print_input(output, src2, swizzle.negate_src2,
+ SelectorToString(swizzle.src2_selector), true,
+ src_is_inverted ? "" : instr.mad.AddressRegisterName());
AlignToColumn(kInputOperandColumnWidth);
- if (src_is_inverted) {
- print_input(output, src3, swizzle.negate_src3,
- SelectorToString(swizzle.src3_selector), true,
- instr.mad.AddressRegisterName());
- } else {
- print_input(output, src3, swizzle.negate_src3,
- SelectorToString(swizzle.src3_selector));
- }
+ print_input(output, src3, swizzle.negate_src3,
+ SelectorToString(swizzle.src3_selector), true,
+ src_is_inverted ? instr.mad.AddressRegisterName() : "");
AlignToColumn(kInputOperandColumnWidth);
break;
}
@@ -222,16 +212,15 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
SourceRegister src1 = instr.common.GetSrc1(src_is_inverted);
print_input(output, src1, swizzle.negate_src1,
swizzle.SelectorToString(false), true,
- instr.common.AddressRegisterName());
+ src_is_inverted ? "" : instr.common.AddressRegisterName());
AlignToColumn(kInputOperandColumnWidth);
}
- // TODO: In some cases, the Address Register is used as an index for SRC2
- // instead of SRC1
if (opcode_info.subtype & OpCode::Info::Src2) {
SourceRegister src2 = instr.common.GetSrc2(src_is_inverted);
print_input(output, src2, swizzle.negate_src2,
- swizzle.SelectorToString(true));
+ swizzle.SelectorToString(true), true,
+ src_is_inverted ? instr.common.AddressRegisterName() : "");
AlignToColumn(kInputOperandColumnWidth);
}
break;
@@ -247,7 +236,9 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
switch (opcode.EffectiveOpCode()) {
case OpCode::Id::LOOP:
- output << "(unknown instruction format)";
+ output << 'i' << instr.flow_control.int_uniform_id << " (end on 0x"
+ << std::setw(4) << std::right << std::setfill('0') << std::hex
+ << (4 * instr.flow_control.dest_offset) << ")";
break;
default:
@@ -255,7 +246,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
output << '(';
if (instr.flow_control.op != instr.flow_control.JustY) {
- if (instr.flow_control.refx)
+ if (!instr.flow_control.refx)
output << '!';
output << "cc.x";
}
@@ -267,13 +258,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
}
if (instr.flow_control.op != instr.flow_control.JustX) {
- if (instr.flow_control.refy)
+ if (!instr.flow_control.refy)
output << '!';
output << "cc.y";
}
output << ") ";
} else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) {
+ if (opcode.EffectiveOpCode() == OpCode::Id::JMPU &&
+ (instr.flow_control.num_instructions & 1) == 1) {
+ output << '!';
+ }
output << 'b' << instr.flow_control.bool_uniform_id << ' ';
}
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 02bfdca3d..8adbcfe86 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -48,6 +48,47 @@
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
#endif
+/**
+ * "Callouts" are one-time instructional messages shown to the user. In the config settings, there
+ * is a bitfield "callout_flags" options, used to track if a message has already been shown to the
+ * user. This is 32-bits - if we have more than 32 callouts, we should retire and recyle old ones.
+ */
+enum class CalloutFlag : uint32_t {
+ Telemetry = 0x1,
+};
+
+static void ShowCalloutMessage(const QString& message, CalloutFlag flag) {
+ if (UISettings::values.callout_flags & static_cast<uint32_t>(flag)) {
+ return;
+ }
+
+ UISettings::values.callout_flags |= static_cast<uint32_t>(flag);
+
+ QMessageBox msg;
+ msg.setText(message);
+ msg.setStandardButtons(QMessageBox::Ok);
+ msg.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ msg.setStyleSheet("QLabel{min-width: 900px;}");
+ msg.exec();
+}
+
+void GMainWindow::ShowCallouts() {
+ static const QString telemetry_message =
+ tr("To help improve Citra, the Citra Team collects anonymous usage data. No private or "
+ "personally identifying information is collected. This data helps us to understand how "
+ "people use Citra and prioritize our efforts. Furthermore, it helps us to more easily "
+ "identify emulation bugs and performance issues. This data includes:<ul><li>Information"
+ " about the version of Citra you are using</li><li>Performance data about the games you "
+ "play</li><li>Your configuration settings</li><li>Information about your computer "
+ "hardware</li><li>Emulation errors and crash information</li></ul>By default, this "
+ "feature is enabled. To disable this feature, click 'Emulation' from the menu and then "
+ "select 'Configure...'. Then, on the 'Web' tab, uncheck 'Share anonymous usage data with"
+ " the Citra team'. <br/><br/>By using this software, you agree to the above terms.<br/>"
+ "<br/><a href='https://citra-emu.org/entry/telemetry-and-why-thats-a-good-thing/'>Learn "
+ "more</a>");
+ ShowCalloutMessage(telemetry_message, CalloutFlag::Telemetry);
+}
+
GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
Pica::g_debug_context = Pica::DebugContext::Construct();
setAcceptDrops(true);
@@ -73,6 +114,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
UpdateUITheme();
+ // Show one-time "callout" messages to the user
+ ShowCallouts();
+
QStringList args = QApplication::arguments();
if (args.length() >= 2) {
BootGame(args[1]);
@@ -311,7 +355,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
if (!gladLoadGL()) {
QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"),
- tr("Your GPU may not support OpenGL 3.3, or you do not"
+ tr("Your GPU may not support OpenGL 3.3, or you do not "
"have the latest graphics driver."));
return false;
}
@@ -320,6 +364,8 @@ bool GMainWindow::LoadROM(const QString& filename) {
const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())};
+ Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
+
if (result != Core::System::ResultStatus::Success) {
switch (result) {
case Core::System::ResultStatus::ErrorGetLoader:
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 360de2ced..d59a6d67d 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -80,6 +80,8 @@ private:
void BootGame(const QString& filename);
void ShutdownGame();
+ void ShowCallouts();
+
/**
* Stores the filename in the recently loaded files list.
* The new filename is stored at the beginning of the recently loaded files list.
diff --git a/src/citra_qt/ui_settings.h b/src/citra_qt/ui_settings.h
index 025c73f84..d85c92765 100644
--- a/src/citra_qt/ui_settings.h
+++ b/src/citra_qt/ui_settings.h
@@ -48,6 +48,8 @@ struct Values {
// Shortcut name <Shortcut, context>
std::vector<Shortcut> shortcuts;
+
+ uint32_t callout_flags;
};
extern Values values;
diff --git a/src/common/common_types.h b/src/common/common_types.h
index e8f7ac6be..844d34965 100644
--- a/src/common/common_types.h
+++ b/src/common/common_types.h
@@ -24,6 +24,7 @@
#pragma once
+#include <array>
#include <cstdint>
#ifdef _MSC_VER
@@ -50,6 +51,9 @@ typedef double f64; ///< 64-bit floating point
typedef u64 VAddr; ///< Represents a pointer in the userspace virtual address space.
typedef u64 PAddr; ///< Represents a pointer in the ARM11 physical address space.
+using u128 = std::array<std::uint64_t, 2>;
+static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide");
+
// An inheritable class to disallow the copy constructor and operator= functions
class NonCopyable {
protected:
diff --git a/src/common/quaternion.h b/src/common/quaternion.h
index 84ac82ed3..77f626bcb 100644
--- a/src/common/quaternion.h
+++ b/src/common/quaternion.h
@@ -30,6 +30,11 @@ public:
return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz),
w * other.w - Dot(xyz, other.xyz)};
}
+
+ Quaternion<T> Normalized() const {
+ T length = std::sqrt(xyz.Length2() + w * w);
+ return {xyz / length, w / length};
+ }
};
template <typename T>
diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in
index 0080db5d5..4083095d5 100644
--- a/src/common/scm_rev.cpp.in
+++ b/src/common/scm_rev.cpp.in
@@ -8,6 +8,7 @@
#define GIT_BRANCH "@GIT_BRANCH@"
#define GIT_DESC "@GIT_DESC@"
#define BUILD_NAME "@REPO_NAME@"
+#define BUILD_DATE "@BUILD_DATE@"
namespace Common {
@@ -15,6 +16,7 @@ const char g_scm_rev[] = GIT_REV;
const char g_scm_branch[] = GIT_BRANCH;
const char g_scm_desc[] = GIT_DESC;
const char g_build_name[] = BUILD_NAME;
+const char g_build_date[] = BUILD_DATE;
} // namespace
diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h
index e22389803..18aaa1735 100644
--- a/src/common/scm_rev.h
+++ b/src/common/scm_rev.h
@@ -10,5 +10,6 @@ extern const char g_scm_rev[];
extern const char g_scm_branch[];
extern const char g_scm_desc[];
extern const char g_build_name[];
+extern const char g_build_date[];
} // namespace
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index bad311793..6959915fa 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -117,7 +117,7 @@ std::string StringFromFormat(const char* format, ...) {
}
// For Debugging. Read out an u8 array.
-std::string ArrayToString(const u8* data, u32 size, int line_len, bool spaces) {
+std::string ArrayToString(const u8* data, size_t size, int line_len, bool spaces) {
std::ostringstream oss;
oss << std::setfill('0') << std::hex;
diff --git a/src/common/string_util.h b/src/common/string_util.h
index 075bf4ecb..259360aec 100644
--- a/src/common/string_util.h
+++ b/src/common/string_util.h
@@ -33,7 +33,7 @@ inline void CharArrayFromFormat(char (&out)[Count], const char* format, ...) {
}
// Good
-std::string ArrayToString(const u8* data, u32 size, int line_len = 20, bool spaces = true);
+std::string ArrayToString(const u8* data, size_t size, int line_len = 20, bool spaces = true);
std::string StripSpaces(const std::string& s);
std::string StripQuotes(const std::string& s);
diff --git a/src/common/vector_math.h b/src/common/vector_math.h
index c7a461a1e..3f0057d9e 100644
--- a/src/common/vector_math.h
+++ b/src/common/vector_math.h
@@ -90,8 +90,9 @@ public:
x -= other.x;
y -= other.y;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec2<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec2<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y);
}
Vec2<decltype(T{} * T{})> operator*(const Vec2& other) const {
@@ -103,8 +104,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
+ *this = *this * f;
}
template <typename V>
Vec2<decltype(T{} / V{})> operator/(const V& f) const {
@@ -247,8 +247,9 @@ public:
y -= other.y;
z -= other.z;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec3<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec3<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y, -z);
}
Vec3<decltype(T{} * T{})> operator*(const Vec3& other) const {
@@ -260,9 +261,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
- z *= f;
+ *this = *this * f;
}
template <typename V>
Vec3<decltype(T{} / V{})> operator/(const V& f) const {
@@ -462,8 +461,9 @@ public:
z -= other.z;
w -= other.w;
}
- template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type>
- Vec4<decltype(-T{})> operator-() const {
+
+ template <typename U = T>
+ Vec4<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const {
return MakeVec(-x, -y, -z, -w);
}
Vec4<decltype(T{} * T{})> operator*(const Vec4& other) const {
@@ -475,10 +475,7 @@ public:
}
template <typename V>
void operator*=(const V& f) {
- x *= f;
- y *= f;
- z *= f;
- w *= f;
+ *this = *this * f;
}
template <typename V>
Vec4<decltype(T{} / V{})> operator/(const V& f) const {
@@ -721,4 +718,4 @@ static inline Vec4<T> MakeVec(const T& x, const Vec3<T>& yzw) {
return MakeVec(x, yzw[0], yzw[1], yzw[2]);
}
-} // namespace
+} // namespace Math
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 33ce8dc81..8b25eaf0a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -6,6 +6,8 @@ set(SRCS
arm/dyncom/arm_dyncom_interpreter.cpp
arm/dyncom/arm_dyncom_thumb.cpp
arm/dyncom/arm_dyncom_trans.cpp
+ arm/unicorn/arm_unicorn.cpp
+ arm/unicorn/unicorn_dynload.c
arm/skyeye_common/armstate.cpp
arm/skyeye_common/armsupp.cpp
arm/skyeye_common/vfp/vfp.cpp
@@ -26,14 +28,15 @@ set(SRCS
file_sys/archive_systemsavedata.cpp
file_sys/disk_archive.cpp
file_sys/ivfc_archive.cpp
+ file_sys/ncch_container.cpp
file_sys/path_parser.cpp
file_sys/savedata_archive.cpp
+ file_sys/title_metadata.cpp
frontend/camera/blank_camera.cpp
frontend/camera/factory.cpp
frontend/camera/interface.cpp
frontend/emu_window.cpp
frontend/framebuffer_layout.cpp
- frontend/motion_emu.cpp
gdbstub/gdbstub.cpp
hle/config_mem.cpp
hle/applets/applet.cpp
@@ -60,6 +63,7 @@ set(SRCS
hle/kernel/timer.cpp
hle/kernel/vm_manager.cpp
hle/kernel/wait_object.cpp
+ hle/lock.cpp
hle/romfs.cpp
hle/service/ac/ac.cpp
hle/service/ac/ac_i.cpp
@@ -135,7 +139,8 @@ set(SRCS
hle/service/nim/nim_aoc.cpp
hle/service/nim/nim_s.cpp
hle/service/nim/nim_u.cpp
- hle/service/ns_s.cpp
+ hle/service/ns/ns.cpp
+ hle/service/ns/ns_s.cpp
hle/service/nwm/nwm.cpp
hle/service/nwm/nwm_cec.cpp
hle/service/nwm/nwm_ext.cpp
@@ -145,6 +150,7 @@ set(SRCS
hle/service/nwm/nwm_tst.cpp
hle/service/nwm/nwm_uds.cpp
hle/service/nwm/uds_beacon.cpp
+ hle/service/nwm/uds_connection.cpp
hle/service/nwm/uds_data.cpp
hle/service/pm_app.cpp
hle/service/ptm/ptm.cpp
@@ -198,6 +204,8 @@ set(HEADERS
arm/dyncom/arm_dyncom_run.h
arm/dyncom/arm_dyncom_thumb.h
arm/dyncom/arm_dyncom_trans.h
+ arm/unicorn/arm_unicorn.h
+ arm/unicorn/unicorn_dynload.h
arm/skyeye_common/arm_regformat.h
arm/skyeye_common/armstate.h
arm/skyeye_common/armsupp.h
@@ -229,7 +237,6 @@ set(HEADERS
frontend/emu_window.h
frontend/framebuffer_layout.h
frontend/input.h
- frontend/motion_emu.h
gdbstub/gdbstub.h
hle/config_mem.h
hle/function_wrappers.h
@@ -261,6 +268,7 @@ set(HEADERS
hle/kernel/timer.h
hle/kernel/vm_manager.h
hle/kernel/wait_object.h
+ hle/lock.h
hle/result.h
hle/romfs.h
hle/service/ac/ac.h
@@ -337,7 +345,8 @@ set(HEADERS
hle/service/nim/nim_aoc.h
hle/service/nim/nim_s.h
hle/service/nim/nim_u.h
- hle/service/ns_s.h
+ hle/service/ns/ns.h
+ hle/service/ns/ns_s.h
hle/service/nwm/nwm.h
hle/service/nwm/nwm_cec.h
hle/service/nwm/nwm_ext.h
@@ -347,6 +356,7 @@ set(HEADERS
hle/service/nwm/nwm_tst.h
hle/service/nwm/nwm_uds.h
hle/service/nwm/uds_beacon.h
+ hle/service/nwm/uds_connection.h
hle/service/nwm/uds_data.h
hle/service/pm_app.h
hle/service/ptm/ptm.h
@@ -394,7 +404,7 @@ set(HEADERS
create_directory_groups(${SRCS} ${HEADERS})
add_library(core STATIC ${SRCS} ${HEADERS})
-target_link_libraries(core PUBLIC common PRIVATE audio_core video_core)
+target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core)
target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp dynarmic fmt lz4_static)
if (ENABLE_WEB_SERVICE)
target_link_libraries(core PUBLIC json-headers web_service)
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index f613556dd..0b3096347 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -5,6 +5,7 @@
#pragma once
#include "common/common_types.h"
+#include "core/hle/kernel/vm_manager.h"
#include "core/arm/skyeye_common/arm_regformat.h"
#include "core/arm/skyeye_common/vfp/asm_vfp.h"
@@ -19,10 +20,11 @@ public:
u64 sp;
u64 pc;
u64 cpsr;
- u64 fpu_registers[64];
+ u128 fpu_registers[32];
u64 fpscr;
u64 fpexc;
+
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
VAddr tls_address;
};
@@ -41,9 +43,14 @@ public:
Run(1);
}
+ virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {}
+
/// Clear all instruction cache
virtual void ClearInstructionCache() = 0;
+ /// Notify CPU emulation that page tables have changed
+ virtual void PageTableChanged() = 0;
+
/**
* Set the Program Counter to an address
* @param addr Address to set PC to
@@ -70,6 +77,10 @@ public:
*/
virtual void SetReg(int index, u64 value) = 0;
+ virtual const u128& GetExtReg(int index) const = 0;
+
+ virtual void SetExtReg(int index, u128& value) = 0;
+
/**
* Gets the value of a VFP register
* @param index Register index (0-31)
@@ -129,12 +140,6 @@ public:
virtual void SetTlsAddress(VAddr address) = 0;
/**
- * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
- * @param ticks Number of ticks to advance the CPU core
- */
- virtual void AddTicks(u64 ticks) = 0;
-
- /**
* Saves the current CPU context
* @param ctx Thread context to save
*/
@@ -154,9 +159,6 @@ public:
return num_instructions;
}
- s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
- /// decreased by the cpu run loop
-
protected:
/**
* Executes the given number of instructions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 0ea1d76e4..6dcab5bab 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -16,24 +16,6 @@
static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) {
UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!");
- //ARMul_State* state = static_cast<ARMul_State*>(user_arg);
-
- //state->Reg = jit->Regs();
- //state->Cpsr = jit->Cpsr();
- //state->Reg[15] = static_cast<u32>(pc);
- //state->ExtReg = jit->ExtRegs();
- //state->VFP[VFP_FPSCR] = jit->Fpscr();
- //state->NumInstrsToExecute = 1;
-
- //InterpreterMainLoop(state);
-
- //bool is_thumb = (state->Cpsr & (1 << 5)) != 0;
- //state->Reg[15] &= (is_thumb ? 0xFFFFFFFE : 0xFFFFFFFC);
-
- //jit->Regs() = state->Reg;
- //jit->Cpsr() = state->Cpsr;
- //jit->ExtRegs() = state->ExtReg;
- //jit->SetFpscr(state->VFP[VFP_FPSCR]);
}
static bool IsReadOnlyMemory(u64 vaddr) {
@@ -73,11 +55,10 @@ void MemoryWrite64(const u64 addr, const u64 data) {
Memory::Write64(static_cast<VAddr>(addr), data);
}
-static Dynarmic::UserCallbacks GetUserCallbacks(
- const std::shared_ptr<ARMul_State>& interpeter_state) {
+static Dynarmic::UserCallbacks GetUserCallbacks(ARM_Dynarmic* this_) {
Dynarmic::UserCallbacks user_callbacks{};
- //user_callbacks.InterpreterFallback = &InterpreterFallback;
- //user_callbacks.user_arg = static_cast<void*>(interpeter_state.get());
+ user_callbacks.InterpreterFallback = &InterpreterFallback;
+ user_callbacks.user_arg = static_cast<void*>(this_);
user_callbacks.CallSVC = &SVC::CallSVC;
user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory;
user_callbacks.memory.ReadCode = &MemoryRead32;
@@ -90,13 +71,13 @@ static Dynarmic::UserCallbacks GetUserCallbacks(
user_callbacks.memory.Write32 = &MemoryWrite32;
user_callbacks.memory.Write64 = &MemoryWrite64;
//user_callbacks.page_table = Memory::GetCurrentPageTablePointers();
- user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state);
return user_callbacks;
}
ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) {
- interpreter_state = std::make_shared<ARMul_State>(initial_mode);
- jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state), Dynarmic::Arch::ARM64);
+}
+
+void ARM_Dynarmic::MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {
}
void ARM_Dynarmic::SetPC(u64 pc) {
@@ -115,30 +96,26 @@ void ARM_Dynarmic::SetReg(int index, u64 value) {
jit->Regs64()[index] = value;
}
+const u128& ARM_Dynarmic::GetExtReg(int index) const {
+ return jit->ExtRegs64()[index];
+}
+
+void ARM_Dynarmic::SetExtReg(int index, u128& value) {
+ jit->ExtRegs64()[index] = value;
+}
+
u32 ARM_Dynarmic::GetVFPReg(int index) const {
- return jit->ExtRegs()[index];
+ return {};
}
void ARM_Dynarmic::SetVFPReg(int index, u32 value) {
- jit->ExtRegs()[index] = value;
}
u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const {
- if (reg == VFP_FPSCR) {
- return jit->Fpscr();
- }
-
- // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
- return interpreter_state->VFP[reg];
+ return {};
}
void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) {
- if (reg == VFP_FPSCR) {
- jit->SetFpscr(value);
- }
-
- // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state
- interpreter_state->VFP[reg] = value;
}
u32 ARM_Dynarmic::GetCPSR() const {
@@ -150,11 +127,10 @@ void ARM_Dynarmic::SetCPSR(u32 cpsr) {
}
u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) {
- return interpreter_state->CP15[reg];
+ return {};
}
void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) {
- interpreter_state->CP15[reg] = value;
}
VAddr ARM_Dynarmic::GetTlsAddress() const {
@@ -165,51 +141,39 @@ void ARM_Dynarmic::SetTlsAddress(VAddr address) {
jit->TlsAddr() = address;
}
-void ARM_Dynarmic::AddTicks(u64 ticks) {
- down_count -= ticks;
- if (down_count < 0) {
- CoreTiming::Advance();
- }
-}
-
MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64));
void ARM_Dynarmic::ExecuteInstructions(int num_instructions) {
+ ASSERT(Memory::GetCurrentPageTable() == current_page_table);
MICROPROFILE_SCOPE(ARM_Jit);
- unsigned ticks_executed = jit->Run(1 /*static_cast<unsigned>(num_instructions)*/);
+ std::size_t ticks_executed = jit->Run(static_cast<unsigned>(num_instructions));
- AddTicks(ticks_executed);
+ CoreTiming::AddTicks(ticks_executed);
}
void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) {
memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers));
- //memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers));
+ memcpy(ctx.fpu_registers, jit->ExtRegs64().data(), sizeof(ctx.fpu_registers));
ctx.lr = jit->Regs64()[30];
ctx.sp = jit->Regs64()[31];
ctx.pc = jit->Regs64()[32];
ctx.cpsr = jit->Cpsr();
- ctx.fpscr = jit->Fpscr();
- ctx.fpexc = interpreter_state->VFP[VFP_FPEXC];
-
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
ctx.tls_address = jit->TlsAddr();
}
void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) {
memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers));
- //memcpy(jit->ExtRegs().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers));
+ memcpy(jit->ExtRegs64().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers));
jit->Regs64()[30] = ctx.lr;
jit->Regs64()[31] = ctx.sp;
jit->Regs64()[32] = ctx.pc;
jit->Cpsr() = ctx.cpsr;
- jit->SetFpscr(ctx.fpscr);
- interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc;
-
// TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT
jit->TlsAddr() = ctx.tls_address;
}
@@ -223,3 +187,16 @@ void ARM_Dynarmic::PrepareReschedule() {
void ARM_Dynarmic::ClearInstructionCache() {
jit->ClearCache();
}
+
+void ARM_Dynarmic::PageTableChanged() {
+ current_page_table = Memory::GetCurrentPageTable();
+
+ auto iter = jits.find(current_page_table);
+ if (iter != jits.end()) {
+ jit = iter->second.get();
+ return;
+ }
+
+ jit = new Dynarmic::Jit(GetUserCallbacks(this), Dynarmic::Arch::ARM64);
+ jits.emplace(current_page_table, std::unique_ptr<Dynarmic::Jit>(jit));
+}
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index fcdc1c0e0..6567359b0 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -4,20 +4,29 @@
#pragma once
+#include <map>
#include <memory>
#include <dynarmic/dynarmic.h>
#include "common/common_types.h"
#include "core/arm/arm_interface.h"
#include "core/arm/skyeye_common/armstate.h"
+namespace Memory {
+struct PageTable;
+} // namespace Memory
+
class ARM_Dynarmic final : public ARM_Interface {
public:
ARM_Dynarmic(PrivilegeMode initial_mode);
+ void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) override;
+
void SetPC(u64 pc) override;
u64 GetPC() const override;
u64 GetReg(int index) const override;
void SetReg(int index, u64 value) override;
+ const u128& GetExtReg(int index) const override;
+ void SetExtReg(int index, u128& value) override;
u32 GetVFPReg(int index) const override;
void SetVFPReg(int index, u32 value) override;
u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -29,8 +38,6 @@ public:
VAddr GetTlsAddress() const override;
void SetTlsAddress(VAddr address) override;
- void AddTicks(u64 ticks) override;
-
void SaveContext(ThreadContext& ctx) override;
void LoadContext(const ThreadContext& ctx) override;
@@ -38,8 +45,10 @@ public:
void ExecuteInstructions(int num_instructions) override;
void ClearInstructionCache() override;
+ void PageTableChanged() override;
private:
- std::unique_ptr<Dynarmic::Jit> jit;
- std::shared_ptr<ARMul_State> interpreter_state;
+ Dynarmic::Jit* jit = nullptr;
+ Memory::PageTable* current_page_table = nullptr;
+ std::map<Memory::PageTable*, std::unique_ptr<Dynarmic::Jit>> jits;
};
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp
index 99758fc2a..5ebf7a2f1 100644
--- a/src/core/arm/dyncom/arm_dyncom.cpp
+++ b/src/core/arm/dyncom/arm_dyncom.cpp
@@ -29,6 +29,10 @@ void ARM_DynCom::SetPC(u64 pc) {
state->Reg[15] = pc;
}
+void ARM_DynCom::PageTableChanged() {
+ ClearInstructionCache();
+}
+
u64 ARM_DynCom::GetPC() const {
return state->Reg[15];
}
@@ -41,6 +45,13 @@ void ARM_DynCom::SetReg(int index, u64 value) {
state->Reg[index] = value;
}
+const u128& ARM_DynCom::GetExtReg(int index) const {
+ return {};
+}
+
+void ARM_DynCom::SetExtReg(int index, u128& value) {
+}
+
u32 ARM_DynCom::GetVFPReg(int index) const {
return state->ExtReg[index];
}
@@ -80,12 +91,6 @@ VAddr ARM_DynCom::GetTlsAddress() const {
void ARM_DynCom::SetTlsAddress(VAddr /*address*/) {
}
-void ARM_DynCom::AddTicks(u64 ticks) {
- down_count -= ticks;
- if (down_count < 0)
- CoreTiming::Advance();
-}
-
void ARM_DynCom::ExecuteInstructions(int num_instructions) {
state->NumInstrsToExecute = num_instructions;
@@ -93,7 +98,7 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) {
// executing one instruction at a time. Otherwise, if a block is being executed, more
// instructions may actually be executed than specified.
unsigned ticks_executed = InterpreterMainLoop(state.get());
- AddTicks(ticks_executed);
+ CoreTiming::AddTicks(ticks_executed);
}
void ARM_DynCom::SaveContext(ThreadContext& ctx) {
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h
index 44e674ae2..cc3c0f3da 100644
--- a/src/core/arm/dyncom/arm_dyncom.h
+++ b/src/core/arm/dyncom/arm_dyncom.h
@@ -16,11 +16,14 @@ public:
~ARM_DynCom();
void ClearInstructionCache() override;
+ void PageTableChanged() override;
void SetPC(u64 pc) override;
u64 GetPC() const override;
u64 GetReg(int index) const override;
void SetReg(int index, u64 value) override;
+ const u128& GetExtReg(int index) const override;
+ void SetExtReg(int index, u128& value) override;
u32 GetVFPReg(int index) const override;
void SetVFPReg(int index, u32 value) override;
u32 GetVFPSystemReg(VFPSystemRegister reg) const override;
@@ -32,8 +35,6 @@ public:
VAddr GetTlsAddress() const override;
void SetTlsAddress(VAddr address) override;
- void AddTicks(u64 ticks) override;
-
void SaveContext(ThreadContext& ctx) override;
void LoadContext(const ThreadContext& ctx) override;
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index f4fbb8d04..3522d1e82 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -759,7 +759,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins
ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size);
if (ret == ThumbDecodeStatus::BRANCH) {
int inst_index;
- int table_length = arm_instruction_trans_len;
+ int table_length = static_cast<int>(arm_instruction_trans_len);
u32 tinstr = GetThumbInstruction(inst, addr);
switch ((tinstr & 0xF800) >> 11) {
@@ -838,7 +838,7 @@ static unsigned int InterpreterTranslateInstruction(const ARMul_State* cpu, cons
return inst_size;
}
-static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) {
+static int InterpreterTranslateBlock(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
MICROPROFILE_SCOPE(DynCom_Decode);
// Decode instruction, get index
@@ -871,7 +871,7 @@ static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr)
return KEEP_GOING;
}
-static int InterpreterTranslateSingle(ARMul_State* cpu, int& bb_start, u32 addr) {
+static int InterpreterTranslateSingle(ARMul_State* cpu, std::size_t& bb_start, u32 addr) {
MICROPROFILE_SCOPE(DynCom_Decode);
ARM_INST_PTR inst_base = nullptr;
@@ -1620,7 +1620,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
unsigned int addr;
unsigned int num_instrs = 0;
- int ptr;
+ std::size_t ptr;
LOAD_NZCVT;
DISPATCH : {
diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h
index 1a707ff7e..893877797 100644
--- a/src/core/arm/skyeye_common/armstate.h
+++ b/src/core/arm/skyeye_common/armstate.h
@@ -230,7 +230,7 @@ public:
// TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per
// process for our purposes), not per ARMul_State (which tracks CPU core state).
- std::unordered_map<u32, int> instruction_cache;
+ std::unordered_map<u32, std::size_t> instruction_cache;
private:
void ResetMPCoreCP15Registers();
diff --git a/src/core/core.cpp b/src/core/core.cpp
index d08f18623..c5448630f 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -9,16 +9,19 @@
#include "core/arm/arm_interface.h"
#include "core/arm/dynarmic/arm_dynarmic.h"
#include "core/arm/dyncom/arm_dyncom.h"
+#include "core/arm/unicorn/arm_unicorn.h"
#include "core/core.h"
#include "core/core_timing.h"
#include "core/gdbstub/gdbstub.h"
#include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/process.h"
#include "core/hle/kernel/thread.h"
#include "core/hle/service/service.h"
#include "core/hw/hw.h"
#include "core/loader/loader.h"
#include "core/memory_setup.h"
#include "core/settings.h"
+#include "network/network.h"
#include "video_core/video_core.h"
namespace Core {
@@ -99,7 +102,7 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
return init_result;
}
- const Loader::ResultStatus load_result{app_loader->Load()};
+ const Loader::ResultStatus load_result{app_loader->Load(Kernel::g_current_process)};
if (Loader::ResultStatus::Success != load_result) {
LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
System::Shutdown();
@@ -136,7 +139,6 @@ void System::Reschedule() {
}
System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
- Memory::InitMemoryMap();
LOG_DEBUG(HW_Memory, "initialized OK");
if (Settings::values.use_cpu_jit) {
@@ -188,8 +190,12 @@ void System::Shutdown() {
cpu_core = nullptr;
app_loader = nullptr;
telemetry_session = nullptr;
+ if (auto room_member = Network::GetRoomMember().lock()) {
+ Network::GameInfo game_info{};
+ room_member->SendGameInfo(game_info);
+ }
LOG_DEBUG(Core, "Shutdown OK");
}
-} // namespace
+} // namespace Core
diff --git a/src/core/core.h b/src/core/core.h
index 4e3b6b409..9805cc694 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -7,6 +7,7 @@
#include <memory>
#include <string>
#include "common/common_types.h"
+#include "core/loader/loader.h"
#include "core/memory.h"
#include "core/perf_stats.h"
#include "core/telemetry_session.h"
@@ -14,10 +15,6 @@
class EmuWindow;
class ARM_Interface;
-namespace Loader {
-class AppLoader;
-}
-
namespace Core {
class System {
@@ -119,6 +116,10 @@ public:
return status_details;
}
+ Loader::AppLoader& GetAppLoader() const {
+ return *app_loader;
+ }
+
private:
/**
* Initialize the emulated system.
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 276ecfdf6..5e2a5d00f 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -57,6 +57,9 @@ static s64 idled_cycles;
static s64 last_global_time_ticks;
static s64 last_global_time_us;
+static s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
+ /// decreased by the cpu run loop
+
static std::recursive_mutex external_event_section;
// Warning: not included in save state.
@@ -146,7 +149,7 @@ void UnregisterAllEvents() {
}
void Init() {
- Core::CPU().down_count = INITIAL_SLICE_LENGTH;
+ down_count = INITIAL_SLICE_LENGTH;
g_slice_length = INITIAL_SLICE_LENGTH;
global_timer = 0;
idled_cycles = 0;
@@ -185,8 +188,15 @@ void Shutdown() {
}
}
+void AddTicks(u64 ticks) {
+ down_count -= ticks;
+ if (down_count < 0) {
+ Advance();
+ }
+}
+
u64 GetTicks() {
- return (u64)global_timer + g_slice_length - Core::CPU().down_count;
+ return (u64)global_timer + g_slice_length - down_count;
}
u64 GetIdleTicks() {
@@ -460,18 +470,18 @@ void MoveEvents() {
}
void ForceCheck() {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
global_timer += cycles_executed;
// This will cause us to check for new events immediately.
- Core::CPU().down_count = 0;
+ down_count = 0;
// But let's not eat a bunch more time in Advance() because of this.
g_slice_length = 0;
}
void Advance() {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
global_timer += cycles_executed;
- Core::CPU().down_count = g_slice_length;
+ down_count = g_slice_length;
if (has_ts_events)
MoveEvents();
@@ -480,7 +490,7 @@ void Advance() {
if (!first) {
if (g_slice_length < 10000) {
g_slice_length += 10000;
- Core::CPU().down_count += g_slice_length;
+ down_count += g_slice_length;
}
} else {
// Note that events can eat cycles as well.
@@ -490,7 +500,7 @@ void Advance() {
const int diff = target - g_slice_length;
g_slice_length += diff;
- Core::CPU().down_count += diff;
+ down_count += diff;
}
if (advance_callback)
advance_callback(static_cast<int>(cycles_executed));
@@ -506,12 +516,12 @@ void LogPendingEvents() {
}
void Idle(int max_idle) {
- s64 cycles_down = Core::CPU().down_count;
+ s64 cycles_down = down_count;
if (max_idle != 0 && cycles_down > max_idle)
cycles_down = max_idle;
if (first && cycles_down > 0) {
- s64 cycles_executed = g_slice_length - Core::CPU().down_count;
+ s64 cycles_executed = g_slice_length - down_count;
s64 cycles_next_event = first->time - global_timer;
if (cycles_next_event < cycles_executed + cycles_down) {
@@ -526,9 +536,9 @@ void Idle(int max_idle) {
cycles_down / (float)(g_clock_rate_arm11 * 0.001f));
idled_cycles += cycles_down;
- Core::CPU().down_count -= cycles_down;
- if (Core::CPU().down_count == 0)
- Core::CPU().down_count = -1;
+ down_count -= cycles_down;
+ if (down_count == 0)
+ down_count = -1;
}
std::string GetScheduledEventsSummary() {
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index d2f85cd4d..897350801 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -67,6 +67,12 @@ void Shutdown();
typedef void (*MHzChangeCallback)();
typedef std::function<void(u64 userdata, int cycles_late)> TimedCallback;
+/**
+* Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
+* @param ticks Number of ticks to advance the CPU core
+*/
+void AddTicks(u64 ticks);
+
u64 GetTicks();
u64 GetIdleTicks();
u64 GetGlobalTimeUs();
diff --git a/src/core/file_sys/archive_backend.cpp b/src/core/file_sys/archive_backend.cpp
index 1fae0ede0..87a240d7a 100644
--- a/src/core/file_sys/archive_backend.cpp
+++ b/src/core/file_sys/archive_backend.cpp
@@ -90,6 +90,8 @@ std::u16string Path::AsU16Str() const {
LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
return {};
}
+
+ UNREACHABLE();
}
std::vector<u8> Path::AsBinary() const {
diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp
index 6d9007731..e8c5be983 100644
--- a/src/core/file_sys/archive_ncch.cpp
+++ b/src/core/file_sys/archive_ncch.cpp
@@ -13,7 +13,10 @@
#include "core/file_sys/archive_ncch.h"
#include "core/file_sys/errors.h"
#include "core/file_sys/ivfc_archive.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/file_sys/title_metadata.h"
#include "core/hle/service/fs/archive.h"
+#include "core/loader/loader.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace
@@ -25,8 +28,18 @@ static std::string GetNCCHContainerPath(const std::string& nand_directory) {
}
static std::string GetNCCHPath(const std::string& mount_point, u32 high, u32 low) {
- return Common::StringFromFormat("%s%08x/%08x/content/00000000.app.romfs", mount_point.c_str(),
- high, low);
+ u32 content_id = 0;
+
+ // TODO(shinyquagsire23): Title database should be doing this path lookup
+ std::string content_path =
+ Common::StringFromFormat("%s%08x/%08x/content/", mount_point.c_str(), high, low);
+ std::string tmd_path = content_path + "00000000.tmd";
+ TitleMetadata tmd(tmd_path);
+ if (tmd.Load() == Loader::ResultStatus::Success) {
+ content_id = tmd.GetBootContentID();
+ }
+
+ return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
}
ArchiveFactory_NCCH::ArchiveFactory_NCCH(const std::string& nand_directory)
@@ -38,9 +51,14 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
u32 high = data[1];
u32 low = data[0];
std::string file_path = GetNCCHPath(mount_point, high, low);
- auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
- if (!file->IsOpen()) {
+ std::shared_ptr<FileUtil::IOFile> romfs_file;
+ u64 romfs_offset = 0;
+ u64 romfs_size = 0;
+ auto ncch_container = NCCHContainer(file_path);
+
+ if (ncch_container.ReadRomFS(romfs_file, romfs_offset, romfs_size) !=
+ Loader::ResultStatus::Success) {
// High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list).
constexpr u32 shared_data_archive = 0x0004009B;
constexpr u32 system_data_archive = 0x000400DB;
@@ -74,9 +92,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
}
return ERROR_NOT_FOUND;
}
- auto size = file->GetSize();
- auto archive = std::make_unique<IVFCArchive>(file, 0, size);
+ auto archive = std::make_unique<IVFCArchive>(romfs_file, romfs_offset, romfs_size);
return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
}
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index 679909d06..fe3dce5d4 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -121,7 +121,25 @@ ResultCode SDMCArchive::DeleteFile(const Path& path) const {
}
ResultCode SDMCArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) {
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
}
@@ -260,8 +278,27 @@ ResultCode SDMCArchive::CreateDirectory(const Path& path) const {
}
ResultCode SDMCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString()))
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
+ }
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
// exist or similar. Verify.
diff --git a/src/core/file_sys/archive_selfncch.cpp b/src/core/file_sys/archive_selfncch.cpp
index 298a37a44..3222000cf 100644
--- a/src/core/file_sys/archive_selfncch.cpp
+++ b/src/core/file_sys/archive_selfncch.cpp
@@ -3,12 +3,14 @@
// Refer to the license.txt file included.
#include <array>
+#include <cinttypes>
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/swap.h"
#include "core/file_sys/archive_selfncch.h"
#include "core/file_sys/errors.h"
#include "core/file_sys/ivfc_archive.h"
+#include "core/hle/kernel/process.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace
@@ -102,8 +104,7 @@ public:
switch (static_cast<SelfNCCHFilePathType>(file_path.type)) {
case SelfNCCHFilePathType::UpdateRomFS:
- LOG_WARNING(Service_FS, "(STUBBED) open update RomFS");
- return OpenRomFS();
+ return OpenUpdateRomFS();
case SelfNCCHFilePathType::RomFS:
return OpenRomFS();
@@ -179,6 +180,17 @@ private:
}
}
+ ResultVal<std::unique_ptr<FileBackend>> OpenUpdateRomFS() const {
+ if (ncch_data.update_romfs_file) {
+ return MakeResult<std::unique_ptr<FileBackend>>(std::make_unique<IVFCFile>(
+ ncch_data.update_romfs_file, ncch_data.update_romfs_offset,
+ ncch_data.update_romfs_size));
+ } else {
+ LOG_INFO(Service_FS, "Unable to read update RomFS");
+ return ERROR_ROMFS_NOT_FOUND;
+ }
+ }
+
ResultVal<std::unique_ptr<FileBackend>> OpenExeFS(const std::string& filename) const {
if (filename == "icon") {
if (ncch_data.icon) {
@@ -217,31 +229,59 @@ private:
NCCHData ncch_data;
};
-ArchiveFactory_SelfNCCH::ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader) {
+void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) {
+ u64 program_id = 0;
+ if (app_loader.ReadProgramId(program_id) != Loader::ResultStatus::Success) {
+ LOG_WARNING(
+ Service_FS,
+ "Could not read program id when registering with SelfNCCH, this might be a 3dsx file");
+ }
+
+ LOG_DEBUG(Service_FS, "Registering program %016" PRIX64 " with the SelfNCCH archive factory",
+ program_id);
+
+ if (ncch_data.find(program_id) != ncch_data.end()) {
+ LOG_WARNING(Service_FS, "Registering program %016" PRIX64
+ " with SelfNCCH will override existing mapping",
+ program_id);
+ }
+
+ NCCHData& data = ncch_data[program_id];
+
std::shared_ptr<FileUtil::IOFile> romfs_file_;
if (Loader::ResultStatus::Success ==
- app_loader.ReadRomFS(romfs_file_, ncch_data.romfs_offset, ncch_data.romfs_size)) {
+ app_loader.ReadRomFS(romfs_file_, data.romfs_offset, data.romfs_size)) {
+
+ data.romfs_file = std::move(romfs_file_);
+ }
+
+ std::shared_ptr<FileUtil::IOFile> update_romfs_file;
+ if (Loader::ResultStatus::Success ==
+ app_loader.ReadUpdateRomFS(update_romfs_file, data.update_romfs_offset,
+ data.update_romfs_size)) {
- ncch_data.romfs_file = std::move(romfs_file_);
+ data.update_romfs_file = std::move(update_romfs_file);
}
std::vector<u8> buffer;
if (Loader::ResultStatus::Success == app_loader.ReadIcon(buffer))
- ncch_data.icon = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.icon = std::make_shared<std::vector<u8>>(std::move(buffer));
buffer.clear();
if (Loader::ResultStatus::Success == app_loader.ReadLogo(buffer))
- ncch_data.logo = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.logo = std::make_shared<std::vector<u8>>(std::move(buffer));
buffer.clear();
if (Loader::ResultStatus::Success == app_loader.ReadBanner(buffer))
- ncch_data.banner = std::make_shared<std::vector<u8>>(std::move(buffer));
+ data.banner = std::make_shared<std::vector<u8>>(std::move(buffer));
}
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SelfNCCH::Open(const Path& path) {
- auto archive = std::make_unique<SelfNCCHArchive>(ncch_data);
- return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
+ //auto archive = std::make_unique<SelfNCCHArchive>(
+ // ncch_data[Kernel::g_current_process->codeset->program_id]);
+ //return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive));
+ return {};
}
ResultCode ArchiveFactory_SelfNCCH::Format(const Path&, const FileSys::ArchiveFormatInfo&) {
diff --git a/src/core/file_sys/archive_selfncch.h b/src/core/file_sys/archive_selfncch.h
index f1b971296..0d6d6766e 100644
--- a/src/core/file_sys/archive_selfncch.h
+++ b/src/core/file_sys/archive_selfncch.h
@@ -6,6 +6,7 @@
#include <memory>
#include <string>
+#include <unordered_map>
#include <vector>
#include "common/common_types.h"
#include "core/file_sys/archive_backend.h"
@@ -24,12 +25,19 @@ struct NCCHData {
std::shared_ptr<FileUtil::IOFile> romfs_file;
u64 romfs_offset = 0;
u64 romfs_size = 0;
+
+ std::shared_ptr<FileUtil::IOFile> update_romfs_file;
+ u64 update_romfs_offset = 0;
+ u64 update_romfs_size = 0;
};
/// File system interface to the SelfNCCH archive
class ArchiveFactory_SelfNCCH final : public ArchiveFactory {
public:
- explicit ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader);
+ ArchiveFactory_SelfNCCH() = default;
+
+ /// Registers a loaded application so that we can open its SelfNCCH archive when requested.
+ void Register(Loader::AppLoader& app_loader);
std::string GetName() const override {
return "SelfNCCH";
@@ -39,7 +47,8 @@ public:
ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override;
private:
- NCCHData ncch_data;
+ /// Mapping of ProgramId -> NCCHData
+ std::unordered_map<u64, NCCHData> ncch_data;
};
} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp
new file mode 100644
index 000000000..b9fb940c7
--- /dev/null
+++ b/src/core/file_sys/ncch_container.cpp
@@ -0,0 +1,423 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cinttypes>
+#include <cstring>
+#include <memory>
+#include "common/common_types.h"
+#include "common/logging/log.h"
+#include "core/core.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs
+static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
+
+/**
+ * Get the decompressed size of an LZSS compressed ExeFS file
+ * @param buffer Buffer of compressed file
+ * @param size Size of compressed buffer
+ * @return Size of decompressed buffer
+ */
+static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
+ u32 offset_size = *(u32*)(buffer + size - 4);
+ return offset_size + size;
+}
+
+/**
+ * Decompress ExeFS file (compressed with LZSS)
+ * @param compressed Compressed buffer
+ * @param compressed_size Size of compressed buffer
+ * @param decompressed Decompressed buffer
+ * @param decompressed_size Size of decompressed buffer
+ * @return True on success, otherwise false
+ */
+static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
+ u32 decompressed_size) {
+ const u8* footer = compressed + compressed_size - 8;
+ u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
+ u32 out = decompressed_size;
+ u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
+ u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
+
+ memset(decompressed, 0, decompressed_size);
+ memcpy(decompressed, compressed, compressed_size);
+
+ while (index > stop_index) {
+ u8 control = compressed[--index];
+
+ for (unsigned i = 0; i < 8; i++) {
+ if (index <= stop_index)
+ break;
+ if (index <= 0)
+ break;
+ if (out <= 0)
+ break;
+
+ if (control & 0x80) {
+ // Check if compression is out of bounds
+ if (index < 2)
+ return false;
+ index -= 2;
+
+ u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
+ u32 segment_size = ((segment_offset >> 12) & 15) + 3;
+ segment_offset &= 0x0FFF;
+ segment_offset += 2;
+
+ // Check if compression is out of bounds
+ if (out < segment_size)
+ return false;
+
+ for (unsigned j = 0; j < segment_size; j++) {
+ // Check if compression is out of bounds
+ if (out + segment_offset >= decompressed_size)
+ return false;
+
+ u8 data = decompressed[out + segment_offset];
+ decompressed[--out] = data;
+ }
+ } else {
+ // Check if compression is out of bounds
+ if (out < 1)
+ return false;
+ decompressed[--out] = compressed[--index];
+ }
+ control <<= 1;
+ }
+ }
+ return true;
+}
+
+NCCHContainer::NCCHContainer(const std::string& filepath) : filepath(filepath) {
+ file = FileUtil::IOFile(filepath, "rb");
+}
+
+Loader::ResultStatus NCCHContainer::OpenFile(const std::string& filepath) {
+ this->filepath = filepath;
+ file = FileUtil::IOFile(filepath, "rb");
+
+ if (!file.IsOpen()) {
+ LOG_WARNING(Service_FS, "Failed to open %s", filepath.c_str());
+ return Loader::ResultStatus::Error;
+ }
+
+ LOG_DEBUG(Service_FS, "Opened %s", filepath.c_str());
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::Load() {
+ if (is_loaded)
+ return Loader::ResultStatus::Success;
+
+ if (file.IsOpen()) {
+ // Reset read pointer in case this file has been read before.
+ file.Seek(0, SEEK_SET);
+
+ if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
+ return Loader::ResultStatus::Error;
+
+ // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
+ if (Loader::MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
+ LOG_DEBUG(Service_FS, "Only loading the first (bootable) NCCH within the NCSD file!");
+ ncch_offset = 0x4000;
+ file.Seek(ncch_offset, SEEK_SET);
+ file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
+ }
+
+ // Verify we are loading the correct file type...
+ if (Loader::MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
+ return Loader::ResultStatus::ErrorInvalidFormat;
+
+ has_header = true;
+
+ // System archives and DLC don't have an extended header but have RomFS
+ if (ncch_header.extended_header_size) {
+ if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) !=
+ sizeof(ExHeader_Header))
+ return Loader::ResultStatus::Error;
+
+ is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
+ u32 entry_point = exheader_header.codeset_info.text.address;
+ u32 code_size = exheader_header.codeset_info.text.code_size;
+ u32 stack_size = exheader_header.codeset_info.stack_size;
+ u32 bss_size = exheader_header.codeset_info.bss_size;
+ u32 core_version = exheader_header.arm11_system_local_caps.core_version;
+ u8 priority = exheader_header.arm11_system_local_caps.priority;
+ u8 resource_limit_category =
+ exheader_header.arm11_system_local_caps.resource_limit_category;
+
+ LOG_DEBUG(Service_FS, "Name: %s",
+ exheader_header.codeset_info.name);
+ LOG_DEBUG(Service_FS, "Program ID: %016" PRIX64,
+ ncch_header.program_id);
+ LOG_DEBUG(Service_FS, "Code compressed: %s", is_compressed ? "yes" : "no");
+ LOG_DEBUG(Service_FS, "Entry point: 0x%08X", entry_point);
+ LOG_DEBUG(Service_FS, "Code size: 0x%08X", code_size);
+ LOG_DEBUG(Service_FS, "Stack size: 0x%08X", stack_size);
+ LOG_DEBUG(Service_FS, "Bss size: 0x%08X", bss_size);
+ LOG_DEBUG(Service_FS, "Core version: %d", core_version);
+ LOG_DEBUG(Service_FS, "Thread priority: 0x%X", priority);
+ LOG_DEBUG(Service_FS, "Resource limit category: %d", resource_limit_category);
+ LOG_DEBUG(Service_FS, "System Mode: %d",
+ static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
+
+ if (exheader_header.system_info.jump_id != ncch_header.program_id) {
+ LOG_ERROR(Service_FS,
+ "ExHeader Program ID mismatch: the ROM is probably encrypted.");
+ return Loader::ResultStatus::ErrorEncrypted;
+ }
+
+ has_exheader = true;
+ }
+
+ // DLC can have an ExeFS and a RomFS but no extended header
+ if (ncch_header.exefs_size) {
+ exefs_offset = ncch_header.exefs_offset * kBlockSize;
+ u32 exefs_size = ncch_header.exefs_size * kBlockSize;
+
+ LOG_DEBUG(Service_FS, "ExeFS offset: 0x%08X", exefs_offset);
+ LOG_DEBUG(Service_FS, "ExeFS size: 0x%08X", exefs_size);
+
+ file.Seek(exefs_offset + ncch_offset, SEEK_SET);
+ if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
+ return Loader::ResultStatus::Error;
+
+ exefs_file = FileUtil::IOFile(filepath, "rb");
+ has_exefs = true;
+ }
+
+ if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0)
+ has_romfs = true;
+ }
+
+ LoadOverrides();
+
+ // We need at least one of these or overrides, practically
+ if (!(has_exefs || has_romfs || is_tainted))
+ return Loader::ResultStatus::Error;
+
+ is_loaded = true;
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::LoadOverrides() {
+ // Check for split-off files, mark the archive as tainted if we will use them
+ std::string romfs_override = filepath + ".romfs";
+ if (FileUtil::Exists(romfs_override)) {
+ is_tainted = true;
+ }
+
+ // If we have a split-off exefs file/folder, it takes priority
+ std::string exefs_override = filepath + ".exefs";
+ std::string exefsdir_override = filepath + ".exefsdir/";
+ if (FileUtil::Exists(exefs_override)) {
+ exefs_file = FileUtil::IOFile(exefs_override, "rb");
+
+ if (exefs_file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) == sizeof(ExeFs_Header)) {
+ LOG_DEBUG(Service_FS, "Loading ExeFS section from %s", exefs_override.c_str());
+ exefs_offset = 0;
+ is_tainted = true;
+ has_exefs = true;
+ } else {
+ exefs_file = FileUtil::IOFile(filepath, "rb");
+ }
+ } else if (FileUtil::Exists(exefsdir_override) && FileUtil::IsDirectory(exefsdir_override)) {
+ is_tainted = true;
+ }
+
+ if (is_tainted)
+ LOG_WARNING(Service_FS,
+ "Loaded NCCH %s is tainted, application behavior may not be as expected!",
+ filepath.c_str());
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ // Check if we have files that can drop-in and replace
+ result = LoadOverrideExeFSSection(name, buffer);
+ if (result == Loader::ResultStatus::Success || !has_exefs)
+ return result;
+
+ // If we don't have any separate files, we'll need a full ExeFS
+ if (!exefs_file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ LOG_DEBUG(Service_FS, "%d sections:", kMaxSections);
+ // Iterate through the ExeFs archive until we find a section with the specified name...
+ for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
+ const auto& section = exefs_header.section[section_number];
+
+ // Load the specified section...
+ if (strcmp(section.name, name) == 0) {
+ LOG_DEBUG(Service_FS, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
+ section.offset, section.size, section.name);
+
+ s64 section_offset =
+ (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
+ exefs_file.Seek(section_offset, SEEK_SET);
+
+ if (strcmp(section.name, ".code") == 0 && is_compressed) {
+ // Section is compressed, read compressed .code section...
+ std::unique_ptr<u8[]> temp_buffer;
+ try {
+ temp_buffer.reset(new u8[section.size]);
+ } catch (std::bad_alloc&) {
+ return Loader::ResultStatus::ErrorMemoryAllocationFailed;
+ }
+
+ if (exefs_file.ReadBytes(&temp_buffer[0], section.size) != section.size)
+ return Loader::ResultStatus::Error;
+
+ // Decompress .code section...
+ u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
+ buffer.resize(decompressed_size);
+ if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
+ return Loader::ResultStatus::ErrorInvalidFormat;
+ } else {
+ // Section is uncompressed...
+ buffer.resize(section.size);
+ if (exefs_file.ReadBytes(&buffer[0], section.size) != section.size)
+ return Loader::ResultStatus::Error;
+ }
+ return Loader::ResultStatus::Success;
+ }
+ }
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::LoadOverrideExeFSSection(const char* name,
+ std::vector<u8>& buffer) {
+ std::string override_name;
+
+ // Map our section name to the extracted equivalent
+ if (!strcmp(name, ".code"))
+ override_name = "code.bin";
+ else if (!strcmp(name, "icon"))
+ override_name = "code.bin";
+ else if (!strcmp(name, "banner"))
+ override_name = "banner.bnr";
+ else if (!strcmp(name, "logo"))
+ override_name = "logo.bcma.lz";
+ else
+ return Loader::ResultStatus::Error;
+
+ std::string section_override = filepath + ".exefsdir/" + override_name;
+ FileUtil::IOFile section_file(section_override, "rb");
+
+ if (section_file.IsOpen()) {
+ auto section_size = section_file.GetSize();
+ buffer.resize(section_size);
+
+ section_file.Seek(0, SEEK_SET);
+ if (section_file.ReadBytes(&buffer[0], section_size) == section_size) {
+ LOG_WARNING(Service_FS, "File %s overriding built-in ExeFS file",
+ section_override.c_str());
+ return Loader::ResultStatus::Success;
+ }
+ }
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ if (ReadOverrideRomFS(romfs_file, offset, size) == Loader::ResultStatus::Success)
+ return Loader::ResultStatus::Success;
+
+ if (!has_romfs) {
+ LOG_DEBUG(Service_FS, "RomFS requested from NCCH which has no RomFS");
+ return Loader::ResultStatus::ErrorNotUsed;
+ }
+
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000;
+ u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
+
+ LOG_DEBUG(Service_FS, "RomFS offset: 0x%08X", romfs_offset);
+ LOG_DEBUG(Service_FS, "RomFS size: 0x%08X", romfs_size);
+
+ if (file.GetSize() < romfs_offset + romfs_size)
+ return Loader::ResultStatus::Error;
+
+ // We reopen the file, to allow its position to be independent from file's
+ romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb");
+ if (!romfs_file->IsOpen())
+ return Loader::ResultStatus::Error;
+
+ offset = romfs_offset;
+ size = romfs_size;
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus NCCHContainer::ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ // Check for RomFS overrides
+ std::string split_filepath = filepath + ".romfs";
+ if (FileUtil::Exists(split_filepath)) {
+ romfs_file = std::make_shared<FileUtil::IOFile>(split_filepath, "rb");
+ if (romfs_file->IsOpen()) {
+ LOG_WARNING(Service_FS, "File %s overriding built-in RomFS", split_filepath.c_str());
+ offset = 0;
+ size = romfs_file->GetSize();
+ return Loader::ResultStatus::Success;
+ }
+ }
+
+ return Loader::ResultStatus::ErrorNotUsed;
+}
+
+Loader::ResultStatus NCCHContainer::ReadProgramId(u64_le& program_id) {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return result;
+
+ if (!has_header)
+ return Loader::ResultStatus::ErrorNotUsed;
+
+ program_id = ncch_header.program_id;
+ return Loader::ResultStatus::Success;
+}
+
+bool NCCHContainer::HasExeFS() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_exefs;
+}
+
+bool NCCHContainer::HasRomFS() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_romfs;
+}
+
+bool NCCHContainer::HasExHeader() {
+ Loader::ResultStatus result = Load();
+ if (result != Loader::ResultStatus::Success)
+ return false;
+
+ return has_exheader;
+}
+
+} // namespace FileSys
diff --git a/src/core/file_sys/ncch_container.h b/src/core/file_sys/ncch_container.h
new file mode 100644
index 000000000..2cc9d13dc
--- /dev/null
+++ b/src/core/file_sys/ncch_container.h
@@ -0,0 +1,274 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <cstddef>
+#include <memory>
+#include <string>
+#include <vector>
+#include "common/bit_field.h"
+#include "common/common_types.h"
+#include "common/file_util.h"
+#include "common/swap.h"
+#include "core/core.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
+
+struct NCCH_Header {
+ u8 signature[0x100];
+ u32_le magic;
+ u32_le content_size;
+ u8 partition_id[8];
+ u16_le maker_code;
+ u16_le version;
+ u8 reserved_0[4];
+ u64_le program_id;
+ u8 reserved_1[0x10];
+ u8 logo_region_hash[0x20];
+ u8 product_code[0x10];
+ u8 extended_header_hash[0x20];
+ u32_le extended_header_size;
+ u8 reserved_2[4];
+ u8 flags[8];
+ u32_le plain_region_offset;
+ u32_le plain_region_size;
+ u32_le logo_region_offset;
+ u32_le logo_region_size;
+ u32_le exefs_offset;
+ u32_le exefs_size;
+ u32_le exefs_hash_region_size;
+ u8 reserved_3[4];
+ u32_le romfs_offset;
+ u32_le romfs_size;
+ u32_le romfs_hash_region_size;
+ u8 reserved_4[4];
+ u8 exefs_super_block_hash[0x20];
+ u8 romfs_super_block_hash[0x20];
+};
+
+static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// ExeFS (executable file system) headers
+
+struct ExeFs_SectionHeader {
+ char name[8];
+ u32 offset;
+ u32 size;
+};
+
+struct ExeFs_Header {
+ ExeFs_SectionHeader section[8];
+ u8 reserved[0x80];
+ u8 hashes[8][0x20];
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// ExHeader (executable file system header) headers
+
+struct ExHeader_SystemInfoFlags {
+ u8 reserved[5];
+ u8 flag;
+ u8 remaster_version[2];
+};
+
+struct ExHeader_CodeSegmentInfo {
+ u32 address;
+ u32 num_max_pages;
+ u32 code_size;
+};
+
+struct ExHeader_CodeSetInfo {
+ u8 name[8];
+ ExHeader_SystemInfoFlags flags;
+ ExHeader_CodeSegmentInfo text;
+ u32 stack_size;
+ ExHeader_CodeSegmentInfo ro;
+ u8 reserved[4];
+ ExHeader_CodeSegmentInfo data;
+ u32 bss_size;
+};
+
+struct ExHeader_DependencyList {
+ u8 program_id[0x30][8];
+};
+
+struct ExHeader_SystemInfo {
+ u64 save_data_size;
+ u64_le jump_id;
+ u8 reserved_2[0x30];
+};
+
+struct ExHeader_StorageInfo {
+ u8 ext_save_data_id[8];
+ u8 system_save_data_id[8];
+ u8 reserved[8];
+ u8 access_info[7];
+ u8 other_attributes;
+};
+
+struct ExHeader_ARM11_SystemLocalCaps {
+ u64_le program_id;
+ u32_le core_version;
+ u8 reserved_flags[2];
+ union {
+ u8 flags0;
+ BitField<0, 2, u8> ideal_processor;
+ BitField<2, 2, u8> affinity_mask;
+ BitField<4, 4, u8> system_mode;
+ };
+ u8 priority;
+ u8 resource_limit_descriptor[0x10][2];
+ ExHeader_StorageInfo storage_info;
+ u8 service_access_control[0x20][8];
+ u8 ex_service_access_control[0x2][8];
+ u8 reserved[0xf];
+ u8 resource_limit_category;
+};
+
+struct ExHeader_ARM11_KernelCaps {
+ u32_le descriptors[28];
+ u8 reserved[0x10];
+};
+
+struct ExHeader_ARM9_AccessControl {
+ u8 descriptors[15];
+ u8 descversion;
+};
+
+struct ExHeader_Header {
+ ExHeader_CodeSetInfo codeset_info;
+ ExHeader_DependencyList dependency_list;
+ ExHeader_SystemInfo system_info;
+ ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
+ ExHeader_ARM11_KernelCaps arm11_kernel_caps;
+ ExHeader_ARM9_AccessControl arm9_access_control;
+ struct {
+ u8 signature[0x100];
+ u8 ncch_public_key_modulus[0x100];
+ ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
+ ExHeader_ARM11_KernelCaps arm11_kernel_caps;
+ ExHeader_ARM9_AccessControl arm9_access_control;
+ } access_desc;
+};
+
+static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+/**
+ * Helper which implements an interface to deal with NCCH containers which can
+ * contain ExeFS archives or RomFS archives for games or other applications.
+ */
+class NCCHContainer {
+public:
+ NCCHContainer(const std::string& filepath);
+ NCCHContainer() {}
+
+ Loader::ResultStatus OpenFile(const std::string& filepath);
+
+ /**
+ * Ensure ExeFS and exheader is loaded and ready for reading sections
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus Load();
+
+ /**
+ * Attempt to find overridden sections for the NCCH and mark the container as tainted
+ * if any are found.
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadOverrides();
+
+ /**
+ * Reads an application ExeFS section of an NCCH file (e.g. .code, .logo, etc.)
+ * @param name Name of section to read out of NCCH file
+ * @param buffer Vector to read data into
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
+
+ /**
+ * Reads an application ExeFS section from external files instead of an NCCH file,
+ * (e.g. code.bin, logo.bcma.lz, icon.icn, banner.bnr)
+ * @param name Name of section to read from external files
+ * @param buffer Vector to read data into
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus LoadOverrideExeFSSection(const char* name, std::vector<u8>& buffer);
+
+ /**
+ * Get the RomFS of the NCCH container
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size);
+
+ /**
+ * Get the override RomFS of the NCCH container
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size);
+
+ /**
+ * Get the Program ID of the NCCH container
+ * @return ResultStatus result of function
+ */
+ Loader::ResultStatus ReadProgramId(u64_le& program_id);
+
+ /**
+ * Checks whether the NCCH container contains an ExeFS
+ * @return bool check result
+ */
+ bool HasExeFS();
+
+ /**
+ * Checks whether the NCCH container contains a RomFS
+ * @return bool check result
+ */
+ bool HasRomFS();
+
+ /**
+ * Checks whether the NCCH container contains an ExHeader
+ * @return bool check result
+ */
+ bool HasExHeader();
+
+ NCCH_Header ncch_header;
+ ExeFs_Header exefs_header;
+ ExHeader_Header exheader_header;
+
+private:
+ bool has_header = false;
+ bool has_exheader = false;
+ bool has_exefs = false;
+ bool has_romfs = false;
+
+ bool is_tainted = false; // Are there parts of this container being overridden?
+ bool is_loaded = false;
+ bool is_compressed = false;
+
+ u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
+ u32 exefs_offset = 0;
+
+ std::string filepath;
+ FileUtil::IOFile file;
+ FileUtil::IOFile exefs_file;
+};
+
+} // namespace FileSys
diff --git a/src/core/file_sys/savedata_archive.cpp b/src/core/file_sys/savedata_archive.cpp
index f540c4a93..f8f811ba0 100644
--- a/src/core/file_sys/savedata_archive.cpp
+++ b/src/core/file_sys/savedata_archive.cpp
@@ -106,7 +106,25 @@ ResultCode SaveDataArchive::DeleteFile(const Path& path) const {
}
ResultCode SaveDataArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) {
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
}
@@ -247,8 +265,27 @@ ResultCode SaveDataArchive::CreateDirectory(const Path& path) const {
}
ResultCode SaveDataArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
- if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString()))
+ const PathParser path_parser_src(src_path);
+
+ // TODO: Verify these return codes with HW
+ if (!path_parser_src.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const PathParser path_parser_dest(dest_path);
+
+ if (!path_parser_dest.IsValid()) {
+ LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str());
+ return ERROR_INVALID_PATH;
+ }
+
+ const auto src_path_full = path_parser_src.BuildHostPath(mount_point);
+ const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point);
+
+ if (FileUtil::Rename(src_path_full, dest_path_full)) {
return RESULT_SUCCESS;
+ }
// TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't
// exist or similar. Verify.
diff --git a/src/core/file_sys/title_metadata.cpp b/src/core/file_sys/title_metadata.cpp
new file mode 100644
index 000000000..1ef8840a0
--- /dev/null
+++ b/src/core/file_sys/title_metadata.cpp
@@ -0,0 +1,212 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cinttypes>
+#include <cryptopp/sha.h>
+#include "common/alignment.h"
+#include "common/file_util.h"
+#include "common/logging/log.h"
+#include "core/file_sys/title_metadata.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+static u32 GetSignatureSize(u32 signature_type) {
+ switch (signature_type) {
+ case Rsa4096Sha1:
+ case Rsa4096Sha256:
+ return 0x200;
+
+ case Rsa2048Sha1:
+ case Rsa2048Sha256:
+ return 0x100;
+
+ case EllipticSha1:
+ case EcdsaSha256:
+ return 0x3C;
+ }
+}
+
+Loader::ResultStatus TitleMetadata::Load() {
+ FileUtil::IOFile file(filepath, "rb");
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ if (!file.ReadBytes(&signature_type, sizeof(u32_be)))
+ return Loader::ResultStatus::Error;
+
+ // Signature lengths are variable, and the body follows the signature
+ u32 signature_size = GetSignatureSize(signature_type);
+
+ tmd_signature.resize(signature_size);
+ if (!file.ReadBytes(&tmd_signature[0], signature_size))
+ return Loader::ResultStatus::Error;
+
+ // The TMD body start position is rounded to the nearest 0x40 after the signature
+ size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
+ file.Seek(body_start, SEEK_SET);
+
+ // Read our TMD body, then load the amount of ContentChunks specified
+ if (file.ReadBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
+ return Loader::ResultStatus::Error;
+
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ ContentChunk chunk;
+ if (file.ReadBytes(&chunk, sizeof(ContentChunk)) == sizeof(ContentChunk)) {
+ tmd_chunks.push_back(chunk);
+ } else {
+ LOG_ERROR(Service_FS, "Malformed TMD %s, failed to load content chunk index %u!",
+ filepath.c_str(), i);
+ return Loader::ResultStatus::ErrorInvalidFormat;
+ }
+ }
+
+ return Loader::ResultStatus::Success;
+}
+
+Loader::ResultStatus TitleMetadata::Save() {
+ FileUtil::IOFile file(filepath, "wb");
+ if (!file.IsOpen())
+ return Loader::ResultStatus::Error;
+
+ if (!file.WriteBytes(&signature_type, sizeof(u32_be)))
+ return Loader::ResultStatus::Error;
+
+ // Signature lengths are variable, and the body follows the signature
+ u32 signature_size = GetSignatureSize(signature_type);
+
+ if (!file.WriteBytes(tmd_signature.data(), signature_size))
+ return Loader::ResultStatus::Error;
+
+ // The TMD body start position is rounded to the nearest 0x40 after the signature
+ size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40);
+ file.Seek(body_start, SEEK_SET);
+
+ // Update our TMD body values and hashes
+ tmd_body.content_count = static_cast<u16>(tmd_chunks.size());
+
+ // TODO(shinyquagsire23): Do TMDs with more than one contentinfo exist?
+ // For now we'll just adjust the first index to hold all content chunks
+ // and ensure that no further content info data exists.
+ tmd_body.contentinfo = {};
+ tmd_body.contentinfo[0].index = 0;
+ tmd_body.contentinfo[0].command_count = static_cast<u16>(tmd_chunks.size());
+
+ CryptoPP::SHA256 chunk_hash;
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ chunk_hash.Update(reinterpret_cast<u8*>(&tmd_chunks[i]), sizeof(ContentChunk));
+ }
+ chunk_hash.Final(tmd_body.contentinfo[0].hash.data());
+
+ CryptoPP::SHA256 contentinfo_hash;
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ chunk_hash.Update(reinterpret_cast<u8*>(&tmd_body.contentinfo[i]), sizeof(ContentInfo));
+ }
+ chunk_hash.Final(tmd_body.contentinfo_hash.data());
+
+ // Write our TMD body, then write each of our ContentChunks
+ if (file.WriteBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body))
+ return Loader::ResultStatus::Error;
+
+ for (u16 i = 0; i < tmd_body.content_count; i++) {
+ ContentChunk chunk = tmd_chunks[i];
+ if (file.WriteBytes(&chunk, sizeof(ContentChunk)) != sizeof(ContentChunk))
+ return Loader::ResultStatus::Error;
+ }
+
+ return Loader::ResultStatus::Success;
+}
+
+u64 TitleMetadata::GetTitleID() const {
+ return tmd_body.title_id;
+}
+
+u32 TitleMetadata::GetTitleType() const {
+ return tmd_body.title_type;
+}
+
+u16 TitleMetadata::GetTitleVersion() const {
+ return tmd_body.title_version;
+}
+
+u64 TitleMetadata::GetSystemVersion() const {
+ return tmd_body.system_version;
+}
+
+size_t TitleMetadata::GetContentCount() const {
+ return tmd_chunks.size();
+}
+
+u32 TitleMetadata::GetBootContentID() const {
+ return tmd_chunks[TMDContentIndex::Main].id;
+}
+
+u32 TitleMetadata::GetManualContentID() const {
+ return tmd_chunks[TMDContentIndex::Manual].id;
+}
+
+u32 TitleMetadata::GetDLPContentID() const {
+ return tmd_chunks[TMDContentIndex::DLP].id;
+}
+
+void TitleMetadata::SetTitleID(u64 title_id) {
+ tmd_body.title_id = title_id;
+}
+
+void TitleMetadata::SetTitleType(u32 type) {
+ tmd_body.title_type = type;
+}
+
+void TitleMetadata::SetTitleVersion(u16 version) {
+ tmd_body.title_version = version;
+}
+
+void TitleMetadata::SetSystemVersion(u64 version) {
+ tmd_body.system_version = version;
+}
+
+void TitleMetadata::AddContentChunk(const ContentChunk& chunk) {
+ tmd_chunks.push_back(chunk);
+}
+
+void TitleMetadata::Print() const {
+ LOG_DEBUG(Service_FS, "%s - %u chunks", filepath.c_str(),
+ static_cast<u32>(tmd_body.content_count));
+
+ // Content info describes ranges of content chunks
+ LOG_DEBUG(Service_FS, "Content info:");
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ if (tmd_body.contentinfo[i].command_count == 0)
+ break;
+
+ LOG_DEBUG(Service_FS, " Index %04X, Command Count %04X",
+ static_cast<u32>(tmd_body.contentinfo[i].index),
+ static_cast<u32>(tmd_body.contentinfo[i].command_count));
+ }
+
+ // For each content info, print their content chunk range
+ for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) {
+ u16 index = static_cast<u16>(tmd_body.contentinfo[i].index);
+ u16 count = static_cast<u16>(tmd_body.contentinfo[i].command_count);
+
+ if (count == 0)
+ continue;
+
+ LOG_DEBUG(Service_FS, "Content chunks for content info index %zu:", i);
+ for (u16 j = index; j < index + count; j++) {
+ // Don't attempt to print content we don't have
+ if (j > tmd_body.content_count)
+ break;
+
+ const ContentChunk& chunk = tmd_chunks[j];
+ LOG_DEBUG(Service_FS, " ID %08X, Index %04X, Type %04x, Size %016" PRIX64,
+ static_cast<u32>(chunk.id), static_cast<u32>(chunk.index),
+ static_cast<u32>(chunk.type), static_cast<u64>(chunk.size));
+ }
+ }
+}
+} // namespace FileSys
diff --git a/src/core/file_sys/title_metadata.h b/src/core/file_sys/title_metadata.h
new file mode 100644
index 000000000..1fc157bf3
--- /dev/null
+++ b/src/core/file_sys/title_metadata.h
@@ -0,0 +1,125 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include "common/common_types.h"
+#include "common/swap.h"
+
+namespace Loader {
+enum class ResultStatus;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+enum TMDSignatureType : u32 {
+ Rsa4096Sha1 = 0x10000,
+ Rsa2048Sha1 = 0x10001,
+ EllipticSha1 = 0x10002,
+ Rsa4096Sha256 = 0x10003,
+ Rsa2048Sha256 = 0x10004,
+ EcdsaSha256 = 0x10005
+};
+
+enum TMDContentTypeFlag : u16 {
+ Encrypted = 1 << 1,
+ Disc = 1 << 2,
+ CFM = 1 << 3,
+ Optional = 1 << 14,
+ Shared = 1 << 15
+};
+
+/**
+ * Helper which implements an interface to read and write Title Metadata (TMD) files.
+ * If a file path is provided and the file exists, it can be parsed and used, otherwise
+ * it must be created. The TMD file can then be interpreted, modified and/or saved.
+ */
+class TitleMetadata {
+public:
+ struct ContentChunk {
+ u32_be id;
+ u16_be index;
+ u16_be type;
+ u64_be size;
+ std::array<u8, 0x20> hash;
+ };
+
+ static_assert(sizeof(ContentChunk) == 0x30, "TMD ContentChunk structure size is wrong");
+
+ struct ContentInfo {
+ u16_be index;
+ u16_be command_count;
+ std::array<u8, 0x20> hash;
+ };
+
+ static_assert(sizeof(ContentInfo) == 0x24, "TMD ContentInfo structure size is wrong");
+
+#pragma pack(push, 1)
+
+ struct Body {
+ std::array<u8, 0x40> issuer;
+ u8 version;
+ u8 ca_crl_version;
+ u8 signer_crl_version;
+ u8 reserved;
+ u64_be system_version;
+ u64_be title_id;
+ u32_be title_type;
+ u16_be group_id;
+ u32_be savedata_size;
+ u32_be srl_private_savedata_size;
+ std::array<u8, 4> reserved_2;
+ u8 srl_flag;
+ std::array<u8, 0x31> reserved_3;
+ u32_be access_rights;
+ u16_be title_version;
+ u16_be content_count;
+ u16_be boot_content;
+ std::array<u8, 2> reserved_4;
+ std::array<u8, 0x20> contentinfo_hash;
+ std::array<ContentInfo, 64> contentinfo;
+ };
+
+ static_assert(sizeof(Body) == 0x9C4, "TMD body structure size is wrong");
+
+#pragma pack(pop)
+
+ explicit TitleMetadata(std::string& path) : filepath(std::move(path)) {}
+ Loader::ResultStatus Load();
+ Loader::ResultStatus Save();
+
+ u64 GetTitleID() const;
+ u32 GetTitleType() const;
+ u16 GetTitleVersion() const;
+ u64 GetSystemVersion() const;
+ size_t GetContentCount() const;
+ u32 GetBootContentID() const;
+ u32 GetManualContentID() const;
+ u32 GetDLPContentID() const;
+
+ void SetTitleID(u64 title_id);
+ void SetTitleType(u32 type);
+ void SetTitleVersion(u16 version);
+ void SetSystemVersion(u64 version);
+ void AddContentChunk(const ContentChunk& chunk);
+
+ void Print() const;
+
+private:
+ enum TMDContentIndex { Main = 0, Manual = 1, DLP = 2 };
+
+ Body tmd_body;
+ u32_be signature_type;
+ std::vector<u8> tmd_signature;
+ std::vector<ContentChunk> tmd_chunks;
+
+ std::string filepath;
+};
+
+} // namespace FileSys
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index 4f7d54a33..e67394177 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -2,14 +2,55 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <algorithm>
#include <cmath>
-#include "common/assert.h"
-#include "core/3ds.h"
-#include "core/core.h"
+#include <mutex>
#include "core/frontend/emu_window.h"
+#include "core/frontend/input.h"
#include "core/settings.h"
+class EmuWindow::TouchState : public Input::Factory<Input::TouchDevice>,
+ public std::enable_shared_from_this<TouchState> {
+public:
+ std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage&) override {
+ return std::make_unique<Device>(shared_from_this());
+ }
+
+ std::mutex mutex;
+
+ bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false
+
+ float touch_x = 0.0f; ///< Touchpad X-position
+ float touch_y = 0.0f; ///< Touchpad Y-position
+
+private:
+ class Device : public Input::TouchDevice {
+ public:
+ explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {}
+ std::tuple<float, float, bool> GetStatus() const override {
+ if (auto state = touch_state.lock()) {
+ std::lock_guard<std::mutex> guard(state->mutex);
+ return std::make_tuple(state->touch_x, state->touch_y, state->touch_pressed);
+ }
+ return std::make_tuple(0.0f, 0.0f, false);
+ }
+
+ private:
+ std::weak_ptr<TouchState> touch_state;
+ };
+};
+
+EmuWindow::EmuWindow() {
+ // TODO: Find a better place to set this.
+ config.min_client_area_size = std::make_pair(400u, 480u);
+ active_config = config;
+ touch_state = std::make_shared<TouchState>();
+ Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state);
+}
+
+EmuWindow::~EmuWindow() {
+ Input::UnregisterFactory<Input::TouchDevice>("emu_window");
+}
+
/**
* Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout
* @param layout FramebufferLayout object describing the framebuffer size and screen positions
@@ -38,22 +79,26 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) {
if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
return;
- touch_x = Core::kScreenBottomWidth * (framebuffer_x - framebuffer_layout.bottom_screen.left) /
- (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left);
- touch_y = Core::kScreenBottomHeight * (framebuffer_y - framebuffer_layout.bottom_screen.top) /
- (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top);
+ std::lock_guard<std::mutex> guard(touch_state->mutex);
+ touch_state->touch_x =
+ static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left) /
+ (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left);
+ touch_state->touch_y =
+ static_cast<float>(framebuffer_y - framebuffer_layout.bottom_screen.top) /
+ (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top);
- touch_pressed = true;
+ touch_state->touch_pressed = true;
}
void EmuWindow::TouchReleased() {
- touch_pressed = false;
- touch_x = 0;
- touch_y = 0;
+ std::lock_guard<std::mutex> guard(touch_state->mutex);
+ touch_state->touch_pressed = false;
+ touch_state->touch_x = 0;
+ touch_state->touch_y = 0;
}
void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
- if (!touch_pressed)
+ if (!touch_state->touch_pressed)
return;
if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y))
@@ -62,29 +107,6 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
TouchPressed(framebuffer_x, framebuffer_y);
}
-void EmuWindow::AccelerometerChanged(float x, float y, float z) {
- constexpr float coef = 512;
-
- std::lock_guard<std::mutex> lock(accel_mutex);
-
- // TODO(wwylele): do a time stretch as it in GyroscopeChanged
- // The time stretch formula should be like
- // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
- accel_x = static_cast<s16>(x * coef);
- accel_y = static_cast<s16>(y * coef);
- accel_z = static_cast<s16>(z * coef);
-}
-
-void EmuWindow::GyroscopeChanged(float x, float y, float z) {
- constexpr float FULL_FPS = 60;
- float coef = GetGyroscopeRawToDpsCoefficient();
- float stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
- std::lock_guard<std::mutex> lock(gyro_mutex);
- gyro_x = static_cast<s16>(x * coef * stretch);
- gyro_y = static_cast<s16>(y * coef * stretch);
- gyro_z = static_cast<s16>(z * coef * stretch);
-}
-
void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) {
Layout::FramebufferLayout layout;
if (Settings::values.custom_layout == true) {
@@ -97,6 +119,9 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height)
case Settings::LayoutOption::LargeScreen:
layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen);
break;
+ case Settings::LayoutOption::SideScreen:
+ layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen);
+ break;
case Settings::LayoutOption::Default:
default:
layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen);
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h
index 9414123a4..c10dee51b 100644
--- a/src/core/frontend/emu_window.h
+++ b/src/core/frontend/emu_window.h
@@ -4,11 +4,10 @@
#pragma once
-#include <mutex>
+#include <memory>
#include <tuple>
#include <utility>
#include "common/common_types.h"
-#include "common/math_util.h"
#include "core/frontend/framebuffer_layout.h"
/**
@@ -69,84 +68,6 @@ public:
void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y);
/**
- * Signal accelerometer state has changed.
- * @param x X-axis accelerometer value
- * @param y Y-axis accelerometer value
- * @param z Z-axis accelerometer value
- * @note all values are in unit of g (gravitational acceleration).
- * e.g. x = 1.0 means 9.8m/s^2 in x direction.
- * @see GetAccelerometerState for axis explanation.
- */
- void AccelerometerChanged(float x, float y, float z);
-
- /**
- * Signal gyroscope state has changed.
- * @param x X-axis accelerometer value
- * @param y Y-axis accelerometer value
- * @param z Z-axis accelerometer value
- * @note all values are in deg/sec.
- * @see GetGyroscopeState for axis explanation.
- */
- void GyroscopeChanged(float x, float y, float z);
-
- /**
- * Gets the current touch screen state (touch X/Y coordinates and whether or not it is pressed).
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @todo Fix this function to be thread-safe.
- * @return std::tuple of (x, y, pressed) where `x` and `y` are the touch coordinates and
- * `pressed` is true if the touch screen is currently being pressed
- */
- std::tuple<u16, u16, bool> GetTouchState() const {
- return std::make_tuple(touch_x, touch_y, touch_pressed);
- }
-
- /**
- * Gets the current accelerometer state (acceleration along each three axis).
- * Axis explained:
- * +x is the same direction as LEFT on D-pad.
- * +y is normal to the touch screen, pointing outward.
- * +z is the same direction as UP on D-pad.
- * Units:
- * 1 unit of return value = 1/512 g (measured by hw test),
- * where g is the gravitational acceleration (9.8 m/sec2).
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @return std::tuple of (x, y, z)
- */
- std::tuple<s16, s16, s16> GetAccelerometerState() {
- std::lock_guard<std::mutex> lock(accel_mutex);
- return std::make_tuple(accel_x, accel_y, accel_z);
- }
-
- /**
- * Gets the current gyroscope state (angular rates about each three axis).
- * Axis explained:
- * +x is the same direction as LEFT on D-pad.
- * +y is normal to the touch screen, pointing outward.
- * +z is the same direction as UP on D-pad.
- * Orientation is determined by right-hand rule.
- * Units:
- * 1 unit of return value = (1/coef) deg/sec,
- * where coef is the return value of GetGyroscopeRawToDpsCoefficient().
- * @note This should be called by the core emu thread to get a state set by the window thread.
- * @return std::tuple of (x, y, z)
- */
- std::tuple<s16, s16, s16> GetGyroscopeState() {
- std::lock_guard<std::mutex> lock(gyro_mutex);
- return std::make_tuple(gyro_x, gyro_y, gyro_z);
- }
-
- /**
- * Gets the coefficient for units conversion of gyroscope state.
- * The conversion formula is r = coefficient * v,
- * where v is angular rate in deg/sec,
- * and r is the gyroscope state.
- * @return float-type coefficient
- */
- f32 GetGyroscopeRawToDpsCoefficient() const {
- return 14.375f; // taken from hw test, and gyroscope's document
- }
-
- /**
* Returns currently active configuration.
* @note Accesses to the returned object need not be consistent because it may be modified in
* another thread
@@ -180,21 +101,8 @@ public:
void UpdateCurrentFramebufferLayout(unsigned width, unsigned height);
protected:
- EmuWindow() {
- // TODO: Find a better place to set this.
- config.min_client_area_size = std::make_pair(400u, 480u);
- active_config = config;
- touch_x = 0;
- touch_y = 0;
- touch_pressed = false;
- accel_x = 0;
- accel_y = -512;
- accel_z = 0;
- gyro_x = 0;
- gyro_y = 0;
- gyro_z = 0;
- }
- virtual ~EmuWindow() {}
+ EmuWindow();
+ virtual ~EmuWindow();
/**
* Processes any pending configuration changes from the last SetConfig call.
@@ -250,20 +158,8 @@ private:
/// ProcessConfigurationChanges)
WindowConfig active_config; ///< Internal active configuration
- bool touch_pressed; ///< True if touchpad area is currently pressed, otherwise false
-
- u16 touch_x; ///< Touchpad X-position in native 3DS pixel coordinates (0-320)
- u16 touch_y; ///< Touchpad Y-position in native 3DS pixel coordinates (0-240)
-
- std::mutex accel_mutex;
- s16 accel_x; ///< Accelerometer X-axis value in native 3DS units
- s16 accel_y; ///< Accelerometer Y-axis value in native 3DS units
- s16 accel_z; ///< Accelerometer Z-axis value in native 3DS units
-
- std::mutex gyro_mutex;
- s16 gyro_x; ///< Gyroscope X-axis value in native 3DS units
- s16 gyro_y; ///< Gyroscope Y-axis value in native 3DS units
- s16 gyro_z; ///< Gyroscope Z-axis value in native 3DS units
+ class TouchState;
+ std::shared_ptr<TouchState> touch_state;
/**
* Clip the provided coordinates to be inside the touchscreen area.
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp
index d2d02f9ff..e9f778fcb 100644
--- a/src/core/frontend/framebuffer_layout.cpp
+++ b/src/core/frontend/framebuffer_layout.cpp
@@ -141,6 +141,40 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped
return res;
}
+FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) {
+ ASSERT(width > 0);
+ ASSERT(height > 0);
+
+ FramebufferLayout res{width, height, true, true, {}, {}};
+ // Aspect ratio of both screens side by side
+ const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
+ (Core::kScreenTopWidth + Core::kScreenBottomWidth);
+ float window_aspect_ratio = static_cast<float>(height) / width;
+ MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
+ // Find largest Rectangle that can fit in the window size with the given aspect ratio
+ MathUtil::Rectangle<unsigned> screen_rect =
+ maxRectangle(screen_window_area, emulation_aspect_ratio);
+ // Find sizes of top and bottom screen
+ MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
+ MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
+
+ if (window_aspect_ratio < emulation_aspect_ratio) {
+ // Apply borders to the left and right sides of the window.
+ u32 shift_horizontal = (screen_window_area.GetWidth() - screen_rect.GetWidth()) / 2;
+ top_screen = top_screen.TranslateX(shift_horizontal);
+ bot_screen = bot_screen.TranslateX(shift_horizontal);
+ } else {
+ // Window is narrower than the emulation content => apply borders to the top and bottom
+ u32 shift_vertical = (screen_window_area.GetHeight() - screen_rect.GetHeight()) / 2;
+ top_screen = top_screen.TranslateY(shift_vertical);
+ bot_screen = bot_screen.TranslateY(shift_vertical);
+ }
+ // Move the top screen to the right if we are swapped.
+ res.top_screen = swapped ? top_screen.TranslateX(bot_screen.GetWidth()) : top_screen;
+ res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateX(top_screen.GetWidth());
+ return res;
+}
+
FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
ASSERT(width > 0);
ASSERT(height > 0);
@@ -158,4 +192,4 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
res.bottom_screen = bot_screen;
return res;
}
-}
+} // namespace Layout
diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h
index 9a7738969..4983cf103 100644
--- a/src/core/frontend/framebuffer_layout.h
+++ b/src/core/frontend/framebuffer_layout.h
@@ -54,6 +54,17 @@ FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool is_swa
FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped);
/**
+* Factory method for constructing a Frame with the Top screen and bottom
+* screen side by side
+* This is useful for devices with small screens, like the GPDWin
+* @param width Window framebuffer width in pixels
+* @param height Window framebuffer height in pixels
+* @param is_swapped if true, the bottom screen will be the left display
+* @return Newly created FramebufferLayout object with default screen regions initialized
+*/
+FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool is_swapped);
+
+/**
* Factory method for constructing a custom FramebufferLayout
* @param width Window framebuffer width in pixels
* @param height Window framebuffer height in pixels
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h
index 0a5713dc0..8c256beb5 100644
--- a/src/core/frontend/input.h
+++ b/src/core/frontend/input.h
@@ -11,6 +11,7 @@
#include <utility>
#include "common/logging/log.h"
#include "common/param_package.h"
+#include "common/vector_math.h"
namespace Input {
@@ -107,4 +108,28 @@ using ButtonDevice = InputDevice<bool>;
*/
using AnalogDevice = InputDevice<std::tuple<float, float>>;
+/**
+ * A motion device is an input device that returns a tuple of accelerometer state vector and
+ * gyroscope state vector.
+ *
+ * For both vectors:
+ * x+ is the same direction as LEFT on D-pad.
+ * y+ is normal to the touch screen, pointing outward.
+ * z+ is the same direction as UP on D-pad.
+ *
+ * For accelerometer state vector
+ * Units: g (gravitational acceleration)
+ *
+ * For gyroscope state vector:
+ * Orientation is determined by right-hand rule.
+ * Units: deg/sec
+ */
+using MotionDevice = InputDevice<std::tuple<Math::Vec3<float>, Math::Vec3<float>>>;
+
+/**
+ * A touch device is an input device that returns a tuple of two floats and a bool. The floats are
+ * x and y coordinates in the range 0.0 - 1.0, and the bool indicates whether it is pressed.
+ */
+using TouchDevice = InputDevice<std::tuple<float, float, bool>>;
+
} // namespace Input
diff --git a/src/core/frontend/motion_emu.cpp b/src/core/frontend/motion_emu.cpp
deleted file mode 100644
index 9a5b3185d..000000000
--- a/src/core/frontend/motion_emu.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "common/math_util.h"
-#include "common/quaternion.h"
-#include "core/frontend/emu_window.h"
-#include "core/frontend/motion_emu.h"
-
-namespace Motion {
-
-static constexpr int update_millisecond = 100;
-static constexpr auto update_duration =
- std::chrono::duration_cast<std::chrono::steady_clock::duration>(
- std::chrono::milliseconds(update_millisecond));
-
-MotionEmu::MotionEmu(EmuWindow& emu_window)
- : motion_emu_thread(&MotionEmu::MotionEmuThread, this, std::ref(emu_window)) {}
-
-MotionEmu::~MotionEmu() {
- if (motion_emu_thread.joinable()) {
- shutdown_event.Set();
- motion_emu_thread.join();
- }
-}
-
-void MotionEmu::MotionEmuThread(EmuWindow& emu_window) {
- auto update_time = std::chrono::steady_clock::now();
- Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
- Math::Quaternion<float> old_q;
-
- while (!shutdown_event.WaitUntil(update_time)) {
- update_time += update_duration;
- old_q = q;
-
- {
- std::lock_guard<std::mutex> guard(tilt_mutex);
-
- // Find the quaternion describing current 3DS tilting
- q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
- tilt_angle);
- }
-
- auto inv_q = q.Inverse();
-
- // Set the gravity vector in world space
- auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
-
- // Find the angular rate vector in world space
- auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
- angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
-
- // Transform the two vectors from world space to 3DS space
- gravity = QuaternionRotate(inv_q, gravity);
- angular_rate = QuaternionRotate(inv_q, angular_rate);
-
- // Update the sensor state
- emu_window.AccelerometerChanged(gravity.x, gravity.y, gravity.z);
- emu_window.GyroscopeChanged(angular_rate.x, angular_rate.y, angular_rate.z);
- }
-}
-
-void MotionEmu::BeginTilt(int x, int y) {
- mouse_origin = Math::MakeVec(x, y);
- is_tilting = true;
-}
-
-void MotionEmu::Tilt(int x, int y) {
- constexpr float SENSITIVITY = 0.01f;
- auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
- if (is_tilting) {
- std::lock_guard<std::mutex> guard(tilt_mutex);
- if (mouse_move.x == 0 && mouse_move.y == 0) {
- tilt_angle = 0;
- } else {
- tilt_direction = mouse_move.Cast<float>();
- tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * SENSITIVITY, 0.0f,
- MathUtil::PI * 0.5f);
- }
- }
-}
-
-void MotionEmu::EndTilt() {
- std::lock_guard<std::mutex> guard(tilt_mutex);
- tilt_angle = 0;
- is_tilting = false;
-}
-
-} // namespace Motion
diff --git a/src/core/frontend/motion_emu.h b/src/core/frontend/motion_emu.h
deleted file mode 100644
index 99d41a726..000000000
--- a/src/core/frontend/motion_emu.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-#include "common/thread.h"
-#include "common/vector_math.h"
-
-class EmuWindow;
-
-namespace Motion {
-
-class MotionEmu final {
-public:
- MotionEmu(EmuWindow& emu_window);
- ~MotionEmu();
-
- /**
- * Signals that a motion sensor tilt has begun.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- */
- void BeginTilt(int x, int y);
-
- /**
- * Signals that a motion sensor tilt is occurring.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- */
- void Tilt(int x, int y);
-
- /**
- * Signals that a motion sensor tilt has ended.
- */
- void EndTilt();
-
-private:
- Math::Vec2<int> mouse_origin;
-
- std::mutex tilt_mutex;
- Math::Vec2<float> tilt_direction;
- float tilt_angle = 0;
-
- bool is_tilting = false;
-
- Common::Event shutdown_event;
- std::thread motion_emu_thread;
-
- void MotionEmuThread(EmuWindow& emu_window);
-};
-
-} // namespace Motion
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 123fe7cd4..d6be16ef6 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -644,7 +644,7 @@ static void ReadMemory() {
auto start_offset = command_buffer + 1;
auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
- PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
+ VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
start_offset = addr_pos + 1;
u32 len =
@@ -656,12 +656,14 @@ static void ReadMemory() {
SendReply("E01");
}
- const u8* data = Memory::GetPointer(addr);
- if (!data) {
+ if (!Memory::IsValidVirtualAddress(addr)) {
return SendReply("E00");
}
- MemToGdbHex(reply, data, len);
+ std::vector<u8> data(len);
+ Memory::ReadBlock(addr, data.data(), len);
+
+ MemToGdbHex(reply, data.data(), len);
reply[len * 2] = '\0';
SendReply(reinterpret_cast<char*>(reply));
}
@@ -670,18 +672,20 @@ static void ReadMemory() {
static void WriteMemory() {
auto start_offset = command_buffer + 1;
auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
- PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
+ VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset));
start_offset = addr_pos + 1;
auto len_pos = std::find(start_offset, command_buffer + command_length, ':');
u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset));
- u8* dst = Memory::GetPointer(addr);
- if (!dst) {
+ if (!Memory::IsValidVirtualAddress(addr)) {
return SendReply("E00");
}
- GdbHexToMem(dst, len_pos + 1, len);
+ std::vector<u8> data(len);
+
+ GdbHexToMem(data.data(), len_pos + 1, len);
+ Memory::WriteBlock(addr, data.data(), len);
SendReply("OK");
}
@@ -946,7 +950,7 @@ static void Init(u16 port) {
WSAStartup(MAKEWORD(2, 2), &InitData);
#endif
- int tmpsock = socket(PF_INET, SOCK_STREAM, 0);
+ int tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0));
if (tmpsock == -1) {
LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket");
}
@@ -973,7 +977,7 @@ static void Init(u16 port) {
sockaddr_in saddr_client;
sockaddr* client_addr = reinterpret_cast<sockaddr*>(&saddr_client);
socklen_t client_addrlen = sizeof(saddr_client);
- gdbserver_socket = accept(tmpsock, client_addr, &client_addrlen);
+ gdbserver_socket = static_cast<int>(accept(tmpsock, client_addr, &client_addrlen));
if (gdbserver_socket < 0) {
// In the case that we couldn't start the server for whatever reason, just start CPU
// execution like normal.
diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp
index 75d7fd9fc..518f371f5 100644
--- a/src/core/hle/applets/erreula.cpp
+++ b/src/core/hle/applets/erreula.cpp
@@ -31,8 +31,8 @@ ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& param
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "ErrEula Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "ErrEula Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp
index 89f08daa2..f225c23a5 100644
--- a/src/core/hle/applets/mii_selector.cpp
+++ b/src/core/hle/applets/mii_selector.cpp
@@ -38,8 +38,8 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "MiiSelector Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "MiiSelector Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
@@ -66,7 +66,7 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
// continue.
MiiResult result;
memset(&result, 0, sizeof(result));
- result.result_code = 0;
+ result.return_code = 0;
// Let the application know that we're closing
Service::APT::MessageParameter message;
@@ -82,5 +82,5 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
}
void MiiSelector::Update() {}
-}
-} // namespace
+} // namespace Applets
+} // namespace HLE
diff --git a/src/core/hle/applets/mii_selector.h b/src/core/hle/applets/mii_selector.h
index ec00e29d2..136ce8948 100644
--- a/src/core/hle/applets/mii_selector.h
+++ b/src/core/hle/applets/mii_selector.h
@@ -16,51 +16,46 @@ namespace HLE {
namespace Applets {
struct MiiConfig {
- u8 unk_000;
- u8 unk_001;
- u8 unk_002;
- u8 unk_003;
- u8 unk_004;
+ u8 enable_cancel_button;
+ u8 enable_guest_mii;
+ u8 show_on_top_screen;
+ INSERT_PADDING_BYTES(5);
+ u16 title[0x40];
+ INSERT_PADDING_BYTES(4);
+ u8 show_guest_miis;
INSERT_PADDING_BYTES(3);
- u16 unk_008;
- INSERT_PADDING_BYTES(0x82);
- u8 unk_08C;
- INSERT_PADDING_BYTES(3);
- u16 unk_090;
+ u32 initially_selected_mii_index;
+ u8 guest_mii_whitelist[6];
+ u8 user_mii_whitelist[0x64];
INSERT_PADDING_BYTES(2);
- u32 unk_094;
- u16 unk_098;
- u8 unk_09A[0x64];
- u8 unk_0FE;
- u8 unk_0FF;
- u32 unk_100;
+ u32 magic_value;
};
-
static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size");
#define ASSERT_REG_POSITION(field_name, position) \
static_assert(offsetof(MiiConfig, field_name) == position, \
"Field " #field_name " has invalid position")
-ASSERT_REG_POSITION(unk_008, 0x08);
-ASSERT_REG_POSITION(unk_08C, 0x8C);
-ASSERT_REG_POSITION(unk_090, 0x90);
-ASSERT_REG_POSITION(unk_094, 0x94);
-ASSERT_REG_POSITION(unk_0FE, 0xFE);
+ASSERT_REG_POSITION(title, 0x08);
+ASSERT_REG_POSITION(show_guest_miis, 0x8C);
+ASSERT_REG_POSITION(initially_selected_mii_index, 0x90);
+ASSERT_REG_POSITION(guest_mii_whitelist, 0x94);
#undef ASSERT_REG_POSITION
struct MiiResult {
- u32 result_code;
- u8 unk_04;
- INSERT_PADDING_BYTES(7);
- u8 unk_0C[0x60];
- u8 unk_6C[0x16];
+ u32 return_code;
+ u32 is_guest_mii_selected;
+ u32 selected_guest_mii_index;
+ // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii
+ u8 selected_mii_data[0x5C];
INSERT_PADDING_BYTES(2);
+ u16 mii_data_checksum;
+ u16 guest_mii_name[0xC];
};
static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size");
#define ASSERT_REG_POSITION(field_name, position) \
static_assert(offsetof(MiiResult, field_name) == position, \
"Field " #field_name " has invalid position")
-ASSERT_REG_POSITION(unk_0C, 0x0C);
-ASSERT_REG_POSITION(unk_6C, 0x6C);
+ASSERT_REG_POSITION(selected_mii_data, 0x0C);
+ASSERT_REG_POSITION(guest_mii_name, 0x6C);
#undef ASSERT_REG_POSITION
class MiiSelector final : public Applet {
@@ -79,5 +74,5 @@ private:
MiiConfig config;
};
-}
-} // namespace
+} // namespace Applets
+} // namespace HLE
diff --git a/src/core/hle/applets/mint.cpp b/src/core/hle/applets/mint.cpp
index 31a79ea17..50d79190b 100644
--- a/src/core/hle/applets/mint.cpp
+++ b/src/core/hle/applets/mint.cpp
@@ -31,8 +31,8 @@ ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& paramete
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "Mint Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "Mint Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp
index fdf8807b0..0bc471a3a 100644
--- a/src/core/hle/applets/swkbd.cpp
+++ b/src/core/hle/applets/swkbd.cpp
@@ -41,8 +41,8 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con
heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
// Create a SharedMemory that directly points to this heap block.
framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
- heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
- MemoryPermission::ReadWrite, "SoftwareKeyboard Memory");
+ heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
+ "SoftwareKeyboard Memory");
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index bc81c06b4..31fda6db3 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) {
Core::CPU().SetReg(0, res);
}
-/**
- * HLE a function return (64-bit) from the current ARM11 userland process
- * @param res Result to return (64-bit)
- * @todo Verify that this function is correct
- */
-static inline void FuncReturn64(u64 res) {
- Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF));
- Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF));
-}
-
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function wrappers that return type ResultCode
+template <ResultCode func(u64)>
+void Wrap() {
+ FuncReturn(func(PARAM(0)).raw);
+}
+
+template <ResultCode func(u32, u64, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
+template <ResultCode func(u64, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1)).raw);
+}
+
+template <ResultCode func(u64, u64, u64)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
+template <ResultCode func(u64*, u64, u64, u64)>
+void Wrap() {
+ u64 param_1 = 0;
+ u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
+ Core::CPU().SetReg(1, param_1);
+ FuncReturn(retval);
+}
+
template <ResultCode func(u32, u32, u32, u32)>
void Wrap() {
FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw);
@@ -58,22 +76,21 @@ void Wrap() {
FuncReturn(retval);
}
-template <ResultCode func(s32*, u32*, s32, bool, s64)>
+template <ResultCode func(s32*, VAddr, s32, bool, s64)>
void Wrap() {
s32 param_1 = 0;
- s32 retval = func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2),
- (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
- .raw;
+ s32 retval =
+ func(&param_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
+ .raw;
Core::CPU().SetReg(1, (u32)param_1);
FuncReturn(retval);
}
-template <ResultCode func(s32*, u32*, s32, u32)>
+template <ResultCode func(s32*, VAddr, s32, u32)>
void Wrap() {
s32 param_1 = 0;
- u32 retval =
- func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw;
+ u32 retval = func(&param_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
Core::CPU().SetReg(1, (u32)param_1);
FuncReturn(retval);
@@ -85,6 +102,14 @@ void Wrap() {
func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw);
}
+template <ResultCode func(u32, u64*)>
+void Wrap() {
+ u64 param_1 = 0;
+ u32 retval = func(PARAM(0), &param_1).raw;
+ Core::CPU().SetReg(1, param_1);
+ FuncReturn(retval);
+}
+
template <ResultCode func(u32*)>
void Wrap() {
u32 param_1 = 0;
@@ -100,16 +125,17 @@ void Wrap() {
FuncReturn(retval);
}
-template <ResultCode func(MemoryInfo*, PageInfo*, u32)>
+template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
void Wrap() {
MemoryInfo memory_info = {};
PageInfo page_info = {};
u32 retval = func(&memory_info, &page_info, PARAM(2)).raw;
- Core::CPU().SetReg(1, memory_info.base_address);
- Core::CPU().SetReg(2, memory_info.size);
- Core::CPU().SetReg(3, memory_info.permission);
- Core::CPU().SetReg(4, memory_info.state);
- Core::CPU().SetReg(5, page_info.flags);
+
+ Memory::Write64(PARAM(0), memory_info.base_address);
+ Memory::Write64(PARAM(0) + 8, memory_info.size);
+ Memory::Write64(PARAM(0) + 16, memory_info.permission);
+ Memory::Write64(PARAM(0) + 24, memory_info.state);
+
FuncReturn(retval);
}
@@ -139,7 +165,7 @@ void Wrap() {
FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
}
-template <ResultCode func(u32*, u32)>
+template <ResultCode func(u32*, u64)>
void Wrap() {
u32 param_1 = 0;
u32 retval = func(&param_1, PARAM(1)).raw;
@@ -152,21 +178,6 @@ void Wrap() {
FuncReturn(func(PARAM(0)).raw);
}
-template <ResultCode func(s64*, u32, u32*, u32)>
-void Wrap() {
- FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1),
- (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3))
- .raw);
-}
-
-template <ResultCode func(u32*, const char*)>
-void Wrap() {
- u32 param_1 = 0;
- u32 retval = func(&param_1, (char*)Memory::GetPointer(PARAM(1))).raw;
- Core::CPU().SetReg(1, param_1);
- FuncReturn(retval);
-}
-
template <ResultCode func(u32*, s32, s32)>
void Wrap() {
u32 param_1 = 0;
@@ -222,13 +233,11 @@ void Wrap() {
FuncReturn(func(PARAM(0), PARAM(1)).raw);
}
-template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)>
+template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
void Wrap() {
Kernel::Handle param_1 = 0;
Kernel::Handle param_2 = 0;
- u32 retval = func(&param_1, &param_2,
- reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3))
- .raw;
+ u32 retval = func(&param_1, &param_2, PARAM(2), PARAM(3)).raw;
Core::CPU().SetReg(1, param_1);
Core::CPU().SetReg(2, param_2);
FuncReturn(retval);
@@ -244,6 +253,11 @@ void Wrap() {
FuncReturn(retval);
}
+template <ResultCode func(u32, u32, u32)>
+void Wrap() {
+ FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
+}
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function wrappers that return type u32
@@ -268,14 +282,14 @@ void Wrap() {
func(((s64)PARAM(1) << 32) | PARAM(0));
}
-template <void func(const char*, int len)>
+template <void func(VAddr, int len)>
void Wrap() {
- func((char*)Memory::GetPointer(PARAM(0)), PARAM(1));
+ func(PARAM(0), PARAM(1));
}
-template <void func(u8)>
+template <void func(u64, u64, u64)>
void Wrap() {
- func((u8)PARAM(0));
+ func(PARAM(0), PARAM(1), PARAM(2));
}
#undef PARAM
diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h
index f7f96125a..87ed85df6 100644
--- a/src/core/hle/ipc.h
+++ b/src/core/hle/ipc.h
@@ -122,11 +122,11 @@ union StaticBufferDescInfo {
BitField<14, 18, u32> size;
};
-inline u32 StaticBufferDesc(u32 size, u8 buffer_id) {
+inline u32 StaticBufferDesc(size_t size, u8 buffer_id) {
StaticBufferDescInfo info{};
info.descriptor_type.Assign(StaticBuffer);
info.buffer_id.Assign(buffer_id);
- info.size.Assign(size);
+ info.size.Assign(static_cast<u32>(size));
return info.raw;
}
@@ -160,11 +160,11 @@ union MappedBufferDescInfo {
BitField<4, 28, u32> size;
};
-inline u32 MappedBufferDesc(u32 size, MappedBufferPermissions perms) {
+inline u32 MappedBufferDesc(size_t size, MappedBufferPermissions perms) {
MappedBufferDescInfo info{};
info.flags.Assign(MappedBuffer);
info.perms.Assign(perms);
- info.size.Assign(size);
+ info.size.Assign(static_cast<u32>(size));
return info.raw;
}
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index f0d89cffe..7cb95cbac 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -117,9 +117,9 @@ public:
void PushCurrentPIDHandle();
- void PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id);
+ void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id);
- void PushMappedBuffer(VAddr buffer_vaddr, u32 size, MappedBufferPermissions perms);
+ void PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms);
};
/// Push ///
@@ -190,12 +190,12 @@ inline void RequestBuilder::PushCurrentPIDHandle() {
Push(u32(0));
}
-inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id) {
+inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id) {
Push(StaticBufferDesc(size, buffer_id));
Push(buffer_vaddr);
}
-inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size,
+inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, size_t size,
MappedBufferPermissions perms) {
Push(MappedBufferDesc(size, perms));
Push(buffer_vaddr);
@@ -227,8 +227,8 @@ public:
bool validateHeader = true) {
if (validateHeader)
ValidateHeader();
- Header builderHeader{
- MakeHeader(header.command_id, normal_params_size, translate_params_size)};
+ Header builderHeader{MakeHeader(static_cast<u16>(header.command_id), normal_params_size,
+ translate_params_size)};
if (context != nullptr)
return {*context, builderHeader};
else
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 5ebe2eca4..6020e9764 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -37,7 +37,7 @@ SharedPtr<Object> HLERequestContext::GetIncomingHandle(u32 id_from_cmdbuf) const
u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) {
request_handles.push_back(std::move(object));
- return request_handles.size() - 1;
+ return static_cast<u32>(request_handles.size() - 1);
}
void HLERequestContext::ClearIncomingObjects() {
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 9cf288b08..73fab3981 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -8,6 +8,7 @@
#include <string>
#include <utility>
#include <boost/smart_ptr/intrusive_ptr.hpp>
+#include "common/assert.h"
#include "common/common_types.h"
namespace Kernel {
@@ -84,6 +85,8 @@ public:
case HandleType::ClientSession:
return false;
}
+
+ UNREACHABLE();
}
public:
@@ -129,4 +132,4 @@ void Init(u32 system_mode);
/// Shutdown the kernel
void Shutdown();
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp
index 496d07cb5..7f27e9655 100644
--- a/src/core/hle/kernel/memory.cpp
+++ b/src/core/hle/kernel/memory.cpp
@@ -8,7 +8,6 @@
#include <memory>
#include <utility>
#include <vector>
-#include "audio_core/audio_core.h"
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
@@ -24,7 +23,7 @@
namespace Kernel {
-static MemoryRegionInfo memory_regions[3];
+MemoryRegionInfo memory_regions[3];
/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system
/// memory configuration type.
@@ -96,9 +95,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region) {
}
}
-std::array<u8, Memory::VRAM_SIZE> vram;
-std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
-
void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping) {
using namespace Memory;
@@ -143,30 +139,14 @@ void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mappin
return;
}
- // TODO(yuriks): Use GetPhysicalPointer when that becomes independent of the virtual
- // mappings.
- u8* target_pointer = nullptr;
- switch (area->paddr_base) {
- case VRAM_PADDR:
- target_pointer = vram.data();
- break;
- case DSP_RAM_PADDR:
- target_pointer = AudioCore::GetDspMemory().data();
- break;
- case N3DS_EXTRA_RAM_PADDR:
- target_pointer = n3ds_extra_ram.data();
- break;
- default:
- UNREACHABLE();
- }
+ u8* target_pointer = Memory::GetPhysicalPointer(area->paddr_base + offset_into_region);
// TODO(yuriks): This flag seems to have some other effect, but it's unknown what
MemoryState memory_state = mapping.unk_flag ? MemoryState::Static : MemoryState::IO;
- auto vma = address_space
- .MapBackingMemory(mapping.address, target_pointer + offset_into_region,
- mapping.size, memory_state)
- .Unwrap();
+ auto vma =
+ address_space.MapBackingMemory(mapping.address, target_pointer, mapping.size, memory_state)
+ .Unwrap();
address_space.Reprotect(vma,
mapping.read_only ? VMAPermission::Read : VMAPermission::ReadWrite);
}
diff --git a/src/core/hle/kernel/memory.h b/src/core/hle/kernel/memory.h
index 08c1a9989..da6bb3563 100644
--- a/src/core/hle/kernel/memory.h
+++ b/src/core/hle/kernel/memory.h
@@ -26,4 +26,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region);
void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping);
void MapSharedPages(VMManager& address_space);
+
+extern MemoryRegionInfo memory_regions[3];
} // namespace Kernel
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index cef961289..30dade552 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -25,10 +25,11 @@ void ReleaseThreadMutexes(Thread* thread) {
Mutex::Mutex() {}
Mutex::~Mutex() {}
-SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) {
+SharedPtr<Mutex> Mutex::Create(bool initial_locked, VAddr addr, std::string name) {
SharedPtr<Mutex> mutex(new Mutex);
mutex->lock_count = 0;
+ mutex->addr = addr;
mutex->name = std::move(name);
mutex->holding_thread = nullptr;
@@ -90,7 +91,7 @@ void Mutex::UpdatePriority() {
if (!holding_thread)
return;
- s32 best_priority = THREADPRIO_LOWEST;
+ u32 best_priority = THREADPRIO_LOWEST;
for (auto& waiter : GetWaitingThreads()) {
if (waiter->current_priority < best_priority)
best_priority = waiter->current_priority;
diff --git a/src/core/hle/kernel/mutex.h b/src/core/hle/kernel/mutex.h
index bacacd690..503d3ee75 100644
--- a/src/core/hle/kernel/mutex.h
+++ b/src/core/hle/kernel/mutex.h
@@ -21,7 +21,7 @@ public:
* @param name Optional name of mutex
* @return Pointer to new Mutex object
*/
- static SharedPtr<Mutex> Create(bool initial_locked, std::string name = "Unknown");
+ static SharedPtr<Mutex> Create(bool initial_locked, VAddr addr, std::string name = "Unknown");
std::string GetTypeName() const override {
return "Mutex";
@@ -39,6 +39,7 @@ public:
u32 priority; ///< The priority of the mutex, used for priority inheritance.
std::string name; ///< Name of mutex (optional)
SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex
+ VAddr addr;
/**
* Elevate the mutex priority to the best priority
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 84ebdbc58..9e145866f 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -129,7 +129,8 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
}
vm_manager.LogLayout(Log::Level::Debug);
- Kernel::SetupMainThread(entry_point, main_thread_priority);
+
+ Kernel::SetupMainThread(entry_point, main_thread_priority, this);
}
void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp
index a8f10a3ee..517dc47a8 100644
--- a/src/core/hle/kernel/resource_limit.cpp
+++ b/src/core/hle/kernel/resource_limit.cpp
@@ -61,7 +61,7 @@ s32 ResourceLimit::GetCurrentResourceValue(u32 resource) const {
}
}
-s32 ResourceLimit::GetMaxResourceValue(u32 resource) const {
+u32 ResourceLimit::GetMaxResourceValue(u32 resource) const {
switch (resource) {
case PRIORITY:
return max_priority;
diff --git a/src/core/hle/kernel/resource_limit.h b/src/core/hle/kernel/resource_limit.h
index 6cdfbcf8d..42874eb8d 100644
--- a/src/core/hle/kernel/resource_limit.h
+++ b/src/core/hle/kernel/resource_limit.h
@@ -67,7 +67,7 @@ public:
* @param resource Requested resource type
* @returns The max value of the resource type
*/
- s32 GetMaxResourceValue(u32 resource) const;
+ u32 GetMaxResourceValue(u32 resource) const;
/// Name of resource limit object.
std::string name;
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp
index fcf586728..2605b2595 100644
--- a/src/core/hle/kernel/semaphore.cpp
+++ b/src/core/hle/kernel/semaphore.cpp
@@ -13,7 +13,7 @@ namespace Kernel {
Semaphore::Semaphore() {}
Semaphore::~Semaphore() {}
-ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count,
+ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, VAddr address,
std::string name) {
if (initial_count > max_count)
@@ -25,6 +25,7 @@ ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_cou
// and the rest is reserved for the caller thread
semaphore->max_count = max_count;
semaphore->available_count = initial_count;
+ semaphore->address = address;
semaphore->name = std::move(name);
return MakeResult<SharedPtr<Semaphore>>(std::move(semaphore));
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index 7b0cacf2e..77c491a24 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -22,7 +22,7 @@ public:
* @param name Optional name of semaphore
* @return The created semaphore
*/
- static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count,
+ static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, VAddr address,
std::string name = "Unknown");
std::string GetTypeName() const override {
@@ -39,6 +39,7 @@ public:
s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have
s32 available_count; ///< Number of free slots left in the semaphore
+ VAddr address;
std::string name; ///< Name of semaphore (optional)
bool ShouldWait(Thread* thread) const override;
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp
index a7b66142f..d45daca35 100644
--- a/src/core/hle/kernel/shared_memory.cpp
+++ b/src/core/hle/kernel/shared_memory.cpp
@@ -42,7 +42,8 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
memory_region->used += size;
shared_memory->linear_heap_phys_address =
- Memory::FCRAM_PADDR + memory_region->base + shared_memory->backing_block_offset;
+ Memory::FCRAM_PADDR + memory_region->base +
+ static_cast<PAddr>(shared_memory->backing_block_offset);
// Increase the amount of used linear heap memory for the owner process.
if (shared_memory->owner_process != nullptr) {
@@ -54,22 +55,19 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
Kernel::g_current_process->vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
}
} else {
- // TODO(Subv): What happens if an application tries to create multiple memory blocks
- // pointing to the same address?
auto& vm_manager = shared_memory->owner_process->vm_manager;
// The memory is already available and mapped in the owner process.
- auto vma = vm_manager.FindVMA(address)->second;
- // Copy it over to our own storage
- shared_memory->backing_block = std::make_shared<std::vector<u8>>(
- vma.backing_block->data() + vma.offset, vma.backing_block->data() + vma.offset + size);
- shared_memory->backing_block_offset = 0;
- // Unmap the existing pages
- vm_manager.UnmapRange(address, size);
- // Map our own block into the address space
- vm_manager.MapMemoryBlock(address, shared_memory->backing_block, 0, size,
- MemoryState::Shared);
- // Reprotect the block with the new permissions
- vm_manager.ReprotectRange(address, size, ConvertPermissions(permissions));
+ auto vma = vm_manager.FindVMA(address);
+ ASSERT_MSG(vma != vm_manager.vma_map.end(), "Invalid memory address");
+ ASSERT_MSG(vma->second.backing_block, "Backing block doesn't exist for address");
+
+ // The returned VMA might be a bigger one encompassing the desired address.
+ auto vma_offset = address - vma->first;
+ ASSERT_MSG(vma_offset + size <= vma->second.size,
+ "Shared memory exceeds bounds of mapped block");
+
+ shared_memory->backing_block = vma->second.backing_block;
+ shared_memory->backing_block_offset = vma->second.offset + vma_offset;
}
shared_memory->base_address = address;
@@ -183,4 +181,4 @@ u8* SharedMemory::GetPointer(u32 offset) {
return backing_block->data() + backing_block_offset + offset;
}
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h
index 94b335ed1..93a6f2182 100644
--- a/src/core/hle/kernel/shared_memory.h
+++ b/src/core/hle/kernel/shared_memory.h
@@ -114,7 +114,7 @@ public:
/// Backing memory for this shared memory block.
std::shared_ptr<std::vector<u8>> backing_block;
/// Offset into the backing block for this shared memory.
- u32 backing_block_offset;
+ size_t backing_block_offset;
/// Size of the memory block. Page-aligned.
u32 size;
/// Permission restrictions applied to the process which created the block.
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index c01d08ebb..75df49ac2 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -111,7 +111,7 @@ void Thread::Stop() {
Thread* ArbitrateHighestPriorityThread(u32 address) {
Thread* highest_priority_thread = nullptr;
- s32 priority = THREADPRIO_LOWEST;
+ u32 priority = THREADPRIO_LOWEST;
// Iterate through threads, find highest priority thread that is waiting to be arbitrated...
for (auto& thread : thread_list) {
@@ -171,15 +171,24 @@ static void SwitchContext(Thread* new_thread) {
// Cancel any outstanding wakeup events for this thread
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, new_thread->callback_handle);
+ auto previous_process = Kernel::g_current_process;
+
current_thread = new_thread;
ready_queue.remove(new_thread->current_priority, new_thread);
new_thread->status = THREADSTATUS_RUNNING;
+ if (previous_process != current_thread->owner_process) {
+ Kernel::g_current_process = current_thread->owner_process;
+ SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
+ }
+
Core::CPU().LoadContext(new_thread->context);
Core::CPU().SetCP15Register(CP15_THREAD_URO, new_thread->GetTLSAddress());
} else {
current_thread = nullptr;
+ // Note: We do not reset the current process and current page table when idling because
+ // technically we haven't changed processes, our threads are just paused.
}
}
@@ -238,12 +247,15 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) {
if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) {
- thread->wait_set_output = false;
+
+ // Invoke the wakeup callback before clearing the wait objects
+ if (thread->wakeup_callback)
+ thread->wakeup_callback(ThreadWakeupReason::Timeout, thread, nullptr);
+
// Remove the thread from each of its waiting objects' waitlists
for (auto& object : thread->wait_objects)
object->RemoveWaitingThread(thread.get());
thread->wait_objects.clear();
- thread->SetWaitSynchronizationResult(RESULT_TIMEOUT);
}
thread->ResumeFromWait();
@@ -269,6 +281,9 @@ void Thread::ResumeFromWait() {
break;
case THREADSTATUS_READY:
+ // The thread's wakeup callback must have already been cleared when the thread was first
+ // awoken.
+ ASSERT(wakeup_callback == nullptr);
// If the thread is waiting on multiple wait objects, it might be awoken more than once
// before actually resuming. We can ignore subsequent wakeups if the thread status has
// already been set to THREADSTATUS_READY.
@@ -284,6 +299,8 @@ void Thread::ResumeFromWait() {
return;
}
+ wakeup_callback = nullptr;
+
ready_queue.push_back(current_priority, this);
status = THREADSTATUS_READY;
Core::System::GetInstance().PrepareReschedule();
@@ -302,7 +319,7 @@ static void DebugThreadQueue() {
}
for (auto& t : thread_list) {
- s32 priority = ready_queue.contains(t.get());
+ u32 priority = ready_queue.contains(t.get());
if (priority != -1) {
LOG_DEBUG(Kernel, "0x%02X %u", priority, t->GetObjectId());
}
@@ -352,7 +369,8 @@ static void ResetThreadContext(ARM_Interface::ThreadContext& context, VAddr stac
}
ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, u32 priority,
- u32 arg, s32 processor_id, VAddr stack_top) {
+ u32 arg, s32 processor_id, VAddr stack_top,
+ SharedPtr<Process> owner_process) {
// Check if priority is in ranged. Lowest priority -> highest priority id.
if (priority > THREADPRIO_LOWEST) {
LOG_ERROR(Kernel_SVC, "Invalid thread priority: %d", priority);
@@ -366,7 +384,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
// TODO(yuriks): Other checks, returning 0xD9001BEA
- if (!Memory::IsValidVirtualAddress(entry_point)) {
+ if (!Memory::IsValidVirtualAddress(*owner_process, entry_point)) {
LOG_ERROR(Kernel_SVC, "(name=%s): invalid entry %08x", name.c_str(), entry_point);
// TODO: Verify error
return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel,
@@ -385,15 +403,14 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
thread->nominal_priority = thread->current_priority = priority;
thread->last_running_ticks = CoreTiming::GetTicks();
thread->processor_id = processor_id;
- thread->wait_set_output = false;
thread->wait_objects.clear();
thread->wait_address = 0;
thread->name = std::move(name);
thread->callback_handle = wakeup_callback_handle_table.Create(thread).Unwrap();
- thread->owner_process = g_current_process;
+ thread->owner_process = owner_process;
// Find the next available TLS index, and mark it as used
- auto& tls_slots = Kernel::g_current_process->tls_slots;
+ auto& tls_slots = owner_process->tls_slots;
bool needs_allocation = true;
u32 available_page; // Which allocated page has free space
u32 available_slot; // Which slot within the page is free
@@ -412,18 +429,18 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
return ERR_OUT_OF_MEMORY;
}
- u32 offset = linheap_memory->size();
+ size_t offset = linheap_memory->size();
// Allocate some memory from the end of the linear heap for this region.
linheap_memory->insert(linheap_memory->end(), Memory::PAGE_SIZE, 0);
memory_region->used += Memory::PAGE_SIZE;
- Kernel::g_current_process->linear_heap_used += Memory::PAGE_SIZE;
+ owner_process->linear_heap_used += Memory::PAGE_SIZE;
tls_slots.emplace_back(0); // The page is completely available at the start
- available_page = tls_slots.size() - 1;
+ available_page = static_cast<u32>(tls_slots.size() - 1);
available_slot = 0; // Use the first slot in the new page
- auto& vm_manager = Kernel::g_current_process->vm_manager;
+ auto& vm_manager = owner_process->vm_manager;
vm_manager.RefreshMemoryBlockMappings(linheap_memory.get());
// Map the page to the current process' address space.
@@ -447,7 +464,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
return MakeResult<SharedPtr<Thread>>(std::move(thread));
}
-void Thread::SetPriority(s32 priority) {
+void Thread::SetPriority(u32 priority) {
ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST,
"Invalid priority value.");
// If thread was ready, adjust queues
@@ -460,7 +477,7 @@ void Thread::SetPriority(s32 priority) {
}
void Thread::UpdatePriority() {
- s32 best_priority = nominal_priority;
+ u32 best_priority = nominal_priority;
for (auto& mutex : held_mutexes) {
if (mutex->priority < best_priority)
best_priority = mutex->priority;
@@ -468,7 +485,7 @@ void Thread::UpdatePriority() {
BoostPriority(best_priority);
}
-void Thread::BoostPriority(s32 priority) {
+void Thread::BoostPriority(u32 priority) {
// If thread was ready, adjust queues
if (status == THREADSTATUS_READY)
ready_queue.move(this, current_priority, priority);
@@ -477,21 +494,20 @@ void Thread::BoostPriority(s32 priority) {
current_priority = priority;
}
-SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority) {
- DEBUG_ASSERT(!GetCurrentThread());
+SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process) {
+ // Setup page table so we can write to memory
+ SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table);
// Initialize new "main" thread
auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0,
- Memory::HEAP_VADDR_END);
+ Memory::HEAP_VADDR_END, owner_process);
SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
thread->context.fpscr =
FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010
- // Run new "main" thread
- SwitchContext(thread.get());
-
+ // Note: The newly created thread will be run when the scheduler fires.
return thread;
}
@@ -525,7 +541,13 @@ void Thread::SetWaitSynchronizationOutput(s32 output) {
s32 Thread::GetWaitObjectIndex(WaitObject* object) const {
ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything");
auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object);
- return std::distance(match, wait_objects.rend()) - 1;
+ return static_cast<s32>(std::distance(match, wait_objects.rend()) - 1);
+}
+
+VAddr Thread::GetCommandBufferAddress() const {
+ // Offset from the start of TLS at which the IPC command buffer begins.
+ static constexpr int CommandHeaderOffset = 0x80;
+ return GetTLSAddress() + CommandHeaderOffset;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 2cadb91db..fafcab156 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -15,7 +15,7 @@
#include "core/hle/kernel/wait_object.h"
#include "core/hle/result.h"
-enum ThreadPriority : s32 {
+enum ThreadPriority : u32 {
THREADPRIO_HIGHEST = 0, ///< Highest thread priority
THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps
THREADPRIO_DEFAULT = 48, ///< Default thread priority for userland apps
@@ -41,6 +41,11 @@ enum ThreadStatus {
THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated
};
+enum class ThreadWakeupReason {
+ Signal, // The thread was woken up by WakeupAllWaitingThreads due to an object signal.
+ Timeout // The thread was woken up due to a wait timeout.
+};
+
namespace Kernel {
class Mutex;
@@ -56,10 +61,12 @@ public:
* @param arg User data to pass to the thread
* @param processor_id The ID(s) of the processors on which the thread is desired to be run
* @param stack_top The address of the thread's stack top
+ * @param owner_process The parent process for the thread
* @return A shared pointer to the newly created thread
*/
static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, u32 priority,
- u32 arg, s32 processor_id, VAddr stack_top);
+ u32 arg, s32 processor_id, VAddr stack_top,
+ SharedPtr<Process> owner_process);
std::string GetName() const override {
return name;
@@ -80,7 +87,7 @@ public:
* Gets the thread's current priority
* @return The current thread's priority
*/
- s32 GetPriority() const {
+ u32 GetPriority() const {
return current_priority;
}
@@ -88,7 +95,7 @@ public:
* Sets the thread's current priority
* @param priority The new priority
*/
- void SetPriority(s32 priority);
+ void SetPriority(u32 priority);
/**
* Boost's a thread's priority to the best priority among the thread's held mutexes.
@@ -100,7 +107,7 @@ public:
* Temporarily boosts the thread's priority until the next time it is scheduled
* @param priority The new priority
*/
- void BoostPriority(s32 priority);
+ void BoostPriority(u32 priority);
/**
* Gets the thread's thread ID
@@ -116,9 +123,9 @@ public:
void ResumeFromWait();
/**
- * Schedules an event to wake up the specified thread after the specified delay
- * @param nanoseconds The time this thread will be allowed to sleep for
- */
+ * Schedules an event to wake up the specified thread after the specified delay
+ * @param nanoseconds The time this thread will be allowed to sleep for
+ */
void WakeAfterDelay(s64 nanoseconds);
/**
@@ -157,6 +164,12 @@ public:
return tls_address;
}
+ /*
+ * Returns the address of the current thread's command buffer, located in the TLS.
+ * @returns VAddr of the thread's command buffer.
+ */
+ VAddr GetCommandBufferAddress() const;
+
/**
* Returns whether this thread is waiting for all the objects in
* its wait list to become ready, as a result of a WaitSynchronizationN call
@@ -174,8 +187,8 @@ public:
VAddr entry_point;
VAddr stack_top;
- s32 nominal_priority; ///< Nominal thread priority, as set by the emulated application
- s32 current_priority; ///< Current thread priority, can be temporarily changed
+ u32 nominal_priority; ///< Nominal thread priority, as set by the emulated application
+ u32 current_priority; ///< Current thread priority, can be temporarily changed
u64 last_running_ticks; ///< CPU tick when thread was last running
@@ -197,14 +210,18 @@ public:
VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address
- /// True if the WaitSynchronizationN output parameter should be set on thread wakeup.
- bool wait_set_output;
-
std::string name;
/// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
Handle callback_handle;
+ using WakeupCallback = void(ThreadWakeupReason reason, SharedPtr<Thread> thread,
+ SharedPtr<WaitObject> object);
+ // Callback that will be invoked when the thread is resumed from a waiting state. If the thread
+ // was waiting via WaitSynchronizationN then the object will be the last object that became
+ // available. In case of a timeout, the object will be nullptr.
+ std::function<WakeupCallback> wakeup_callback;
+
private:
Thread();
~Thread() override;
@@ -214,9 +231,10 @@ private:
* Sets up the primary application thread
* @param entry_point The address at which the thread should start execution
* @param priority The priority to give the main thread
+ * @param owner_process The parent process for the main thread
* @return A shared pointer to the main thread
*/
-SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority);
+SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process);
/**
* Returns whether there are any threads that are ready to run.
@@ -276,4 +294,4 @@ void ThreadingShutdown();
*/
const std::vector<SharedPtr<Thread>>& GetThreadList();
-} // namespace
+} // namespace Kernel
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index f70c32501..9762ef535 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -4,8 +4,10 @@
#include <iterator>
#include "common/assert.h"
+#include "core/arm/arm_interface.h"
#include "core/hle/kernel/errors.h"
#include "core/hle/kernel/vm_manager.h"
+#include "core/core.h"
#include "core/memory.h"
#include "core/memory_setup.h"
#include "core/mmio.h"
@@ -56,6 +58,10 @@ void VMManager::Reset() {
initial_vma.size = MAX_ADDRESS;
vma_map.emplace(initial_vma.base, initial_vma);
+ page_table.pointers.fill(nullptr);
+ page_table.attributes.fill(Memory::PageType::Unmapped);
+ page_table.cached_res_count.fill(0);
+
//UpdatePageTableForVMA(initial_vma);
}
@@ -79,6 +85,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,
VirtualMemoryArea& final_vma = vma_handle->second;
ASSERT(final_vma.size == size);
+ Core::CPU().MapBackingMemory(target, size, block->data() + offset, VMAPermission::ReadWriteExecute);
+
final_vma.type = VMAType::AllocatedMemoryBlock;
final_vma.permissions = VMAPermission::ReadWrite;
final_vma.meminfo_state = state;
@@ -98,6 +106,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me
VirtualMemoryArea& final_vma = vma_handle->second;
ASSERT(final_vma.size == size);
+ Core::CPU().MapBackingMemory(target, size, memory, VMAPermission::ReadWriteExecute);
+
final_vma.type = VMAType::BackingMemory;
final_vma.permissions = VMAPermission::ReadWrite;
final_vma.meminfo_state = state;
@@ -328,16 +338,17 @@ VMManager::VMAIter VMManager::MergeAdjacent(VMAIter iter) {
void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
switch (vma.type) {
case VMAType::Free:
- Memory::UnmapRegion(vma.base, vma.size);
+ Memory::UnmapRegion(page_table, vma.base, vma.size);
break;
case VMAType::AllocatedMemoryBlock:
- Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_block->data() + vma.offset);
+ Memory::MapMemoryRegion(page_table, vma.base, vma.size,
+ vma.backing_block->data() + vma.offset);
break;
case VMAType::BackingMemory:
- Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_memory);
+ Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory);
break;
case VMAType::MMIO:
- Memory::MapIoRegion(vma.base, vma.size, vma.mmio_handler);
+ Memory::MapIoRegion(page_table, vma.base, vma.size, vma.mmio_handler);
break;
}
}
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h
index aa2265ce6..cb5bb8243 100644
--- a/src/core/hle/kernel/vm_manager.h
+++ b/src/core/hle/kernel/vm_manager.h
@@ -9,6 +9,7 @@
#include <vector>
#include "common/common_types.h"
#include "core/hle/result.h"
+#include "core/memory.h"
#include "core/mmio.h"
namespace Kernel {
@@ -102,7 +103,6 @@ struct VirtualMemoryArea {
* - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/
*/
class VMManager final {
- // TODO(yuriks): Make page tables switchable to support multiple VMManagers
public:
/**
* The maximum amount of address space managed by the kernel. Addresses above this are never
@@ -184,6 +184,10 @@ public:
/// Dumps the address space layout to the log, for debugging
void LogLayout(Log::Level log_level) const;
+ /// Each VMManager has its own page table, which is set as the main one when the owning process
+ /// is scheduled.
+ Memory::PageTable page_table;
+
private:
using VMAIter = decltype(vma_map)::iterator;
diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp
index f245eda6c..469554908 100644
--- a/src/core/hle/kernel/wait_object.cpp
+++ b/src/core/hle/kernel/wait_object.cpp
@@ -34,7 +34,7 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
Thread* candidate = nullptr;
- s32 candidate_priority = THREADPRIO_LOWEST + 1;
+ u32 candidate_priority = THREADPRIO_LOWEST + 1;
for (const auto& thread : waiting_threads) {
// The list of waiting threads must not contain threads that are not waiting to be awakened.
@@ -71,23 +71,20 @@ void WaitObject::WakeupAllWaitingThreads() {
while (auto thread = GetHighestPriorityReadyThread()) {
if (!thread->IsSleepingOnWaitAll()) {
Acquire(thread.get());
- // Set the output index of the WaitSynchronizationN call to the index of this object.
- if (thread->wait_set_output) {
- thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(this));
- thread->wait_set_output = false;
- }
} else {
for (auto& object : thread->wait_objects) {
object->Acquire(thread.get());
}
- // Note: This case doesn't update the output index of WaitSynchronizationN.
}
+ // Invoke the wakeup callback before clearing the wait objects
+ if (thread->wakeup_callback)
+ thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this);
+
for (auto& object : thread->wait_objects)
object->RemoveWaitingThread(thread.get());
thread->wait_objects.clear();
- thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
thread->ResumeFromWait();
}
}
diff --git a/src/core/hle/lock.cpp b/src/core/hle/lock.cpp
new file mode 100644
index 000000000..1c24c7ce9
--- /dev/null
+++ b/src/core/hle/lock.cpp
@@ -0,0 +1,11 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <core/hle/lock.h>
+
+namespace HLE {
+std::recursive_mutex g_hle_lock;
+}
diff --git a/src/core/hle/lock.h b/src/core/hle/lock.h
new file mode 100644
index 000000000..5c99fe996
--- /dev/null
+++ b/src/core/hle/lock.h
@@ -0,0 +1,18 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <mutex>
+
+namespace HLE {
+/*
+ * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest
+ * application thread performs a syscall. It should be acquired by any host threads that read or
+ * modify the HLE kernel state. Note: Any operation that directly or indirectly reads from or writes
+ * to the emulated memory is not protected by this mutex, and should be avoided in any threads other
+ * than the CPU thread.
+ */
+extern std::recursive_mutex g_hle_lock;
+} // namespace HLE
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp
index 5c44b43bb..912ab550d 100644
--- a/src/core/hle/service/apt/apt.cpp
+++ b/src/core/hle/service/apt/apt.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <boost/optional.hpp>
#include "common/common_paths.h"
#include "common/file_util.h"
#include "common/logging/log.h"
@@ -18,6 +19,7 @@
#include "core/hle/service/apt/apt_s.h"
#include "core/hle/service/apt/apt_u.h"
#include "core/hle/service/apt/bcfnt/bcfnt.h"
+#include "core/hle/service/cfg/cfg.h"
#include "core/hle/service/fs/archive.h"
#include "core/hle/service/ptm/ptm.h"
#include "core/hle/service/service.h"
@@ -33,8 +35,6 @@ static bool shared_font_loaded = false;
static bool shared_font_relocated = false;
static Kernel::SharedPtr<Kernel::Mutex> lock;
-static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event
-static Kernel::SharedPtr<Kernel::Event> parameter_event; ///< APT parameter event
static u32 cpu_percent; ///< CPU time available to the running application
@@ -43,43 +43,344 @@ static u8 unknown_ns_state_field;
static ScreencapPostPermission screen_capture_post_permission;
-/// Parameter data to be returned in the next call to Glance/ReceiveParameter
-static MessageParameter next_parameter;
+/// Parameter data to be returned in the next call to Glance/ReceiveParameter.
+/// TODO(Subv): Use std::optional once we migrate to C++17.
+static boost::optional<MessageParameter> next_parameter;
+
+enum class AppletPos { Application = 0, Library = 1, System = 2, SysLibrary = 3, Resident = 4 };
+
+static constexpr size_t NumAppletSlot = 4;
+
+enum class AppletSlot : u8 {
+ Application,
+ SystemApplet,
+ HomeMenu,
+ LibraryApplet,
+
+ // An invalid tag
+ Error,
+};
+
+union AppletAttributes {
+ u32 raw;
+
+ BitField<0, 3, u32> applet_pos;
+ BitField<29, 1, u32> is_home_menu;
+
+ AppletAttributes() : raw(0) {}
+ AppletAttributes(u32 attributes) : raw(attributes) {}
+};
+
+struct AppletSlotData {
+ AppletId applet_id;
+ AppletSlot slot;
+ bool registered;
+ AppletAttributes attributes;
+ Kernel::SharedPtr<Kernel::Event> notification_event;
+ Kernel::SharedPtr<Kernel::Event> parameter_event;
+};
+
+// Holds data about the concurrently running applets in the system.
+static std::array<AppletSlotData, NumAppletSlot> applet_slots = {};
+
+// This overload returns nullptr if no applet with the specified id has been started.
+static AppletSlotData* GetAppletSlotData(AppletId id) {
+ auto GetSlot = [](AppletSlot slot) -> AppletSlotData* {
+ return &applet_slots[static_cast<size_t>(slot)];
+ };
+
+ if (id == AppletId::Application) {
+ auto* slot = GetSlot(AppletSlot::Application);
+ if (slot->applet_id != AppletId::None)
+ return slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::AnySystemApplet) {
+ auto* system_slot = GetSlot(AppletSlot::SystemApplet);
+ if (system_slot->applet_id != AppletId::None)
+ return system_slot;
+
+ // The Home Menu is also a system applet, but it lives in its own slot to be able to run
+ // concurrently with other system applets.
+ auto* home_slot = GetSlot(AppletSlot::HomeMenu);
+ if (home_slot->applet_id != AppletId::None)
+ return home_slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::AnyLibraryApplet || id == AppletId::AnySysLibraryApplet) {
+ auto* slot = GetSlot(AppletSlot::LibraryApplet);
+ if (slot->applet_id == AppletId::None)
+ return nullptr;
+
+ u32 applet_pos = slot->attributes.applet_pos;
+
+ if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library))
+ return slot;
+
+ if (id == AppletId::AnySysLibraryApplet &&
+ applet_pos == static_cast<u32>(AppletPos::SysLibrary))
+ return slot;
+
+ return nullptr;
+ }
+
+ if (id == AppletId::HomeMenu || id == AppletId::AlternateMenu) {
+ auto* slot = GetSlot(AppletSlot::HomeMenu);
+ if (slot->applet_id != AppletId::None)
+ return slot;
+
+ return nullptr;
+ }
+
+ for (auto& slot : applet_slots) {
+ if (slot.applet_id == id)
+ return &slot;
+ }
+
+ return nullptr;
+}
+
+static AppletSlotData* GetAppletSlotData(AppletAttributes attributes) {
+ // Mapping from AppletPos to AppletSlot
+ static constexpr std::array<AppletSlot, 6> applet_position_slots = {
+ AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet,
+ AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet};
+
+ u32 applet_pos = attributes.applet_pos;
+ if (applet_pos >= applet_position_slots.size())
+ return nullptr;
+
+ AppletSlot slot = applet_position_slots[applet_pos];
+
+ if (slot == AppletSlot::Error)
+ return nullptr;
+
+ // The Home Menu is a system applet, however, it has its own applet slot so that it can run
+ // concurrently with other system applets.
+ if (slot == AppletSlot::SystemApplet && attributes.is_home_menu)
+ return &applet_slots[static_cast<size_t>(AppletSlot::HomeMenu)];
+
+ return &applet_slots[static_cast<size_t>(slot)];
+}
void SendParameter(const MessageParameter& parameter) {
next_parameter = parameter;
- // Signal the event to let the application know that a new parameter is ready to be read
- parameter_event->Signal();
+ // Signal the event to let the receiver know that a new parameter is ready to be read
+ auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id));
+ if (slot_data == nullptr) {
+ LOG_DEBUG(Service_APT, "No applet was registered with the id %03X",
+ parameter.destination_id);
+ return;
+ }
+
+ slot_data->parameter_event->Signal();
}
void Initialize(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x2, 2, 0); // 0x20080
u32 app_id = rp.Pop<u32>();
- u32 flags = rp.Pop<u32>();
+ u32 attributes = rp.Pop<u32>();
+
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, attributes=0x%08X", app_id, attributes);
+
+ auto* const slot_data = GetAppletSlotData(attributes);
+
+ // Note: The real NS service does not check if the attributes value is valid before accessing
+ // the data in the array
+ ASSERT_MSG(slot_data, "Invalid application attributes");
+
+ if (slot_data->registered) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ slot_data->applet_id = static_cast<AppletId>(app_id);
+ slot_data->attributes.raw = attributes;
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 3);
rb.Push(RESULT_SUCCESS);
- rb.PushCopyHandles(Kernel::g_handle_table.Create(notification_event).Unwrap(),
- Kernel::g_handle_table.Create(parameter_event).Unwrap());
+ rb.PushCopyHandles(Kernel::g_handle_table.Create(slot_data->notification_event).Unwrap(),
+ Kernel::g_handle_table.Create(slot_data->parameter_event).Unwrap());
+
+ if (slot_data->applet_id == AppletId::Application ||
+ slot_data->applet_id == AppletId::HomeMenu) {
+ // Initialize the APT parameter to wake up the application.
+ next_parameter.emplace();
+ next_parameter->signal = static_cast<u32>(SignalType::Wakeup);
+ next_parameter->sender_id = static_cast<u32>(AppletId::None);
+ next_parameter->destination_id = app_id;
+ // Not signaling the parameter event will cause the application (or Home Menu) to hang
+ // during startup. In the real console, it is usually the Kernel and Home Menu who cause NS
+ // to signal the HomeMenu and Application parameter events, respectively.
+ slot_data->parameter_event->Signal();
+ }
+}
- // TODO(bunnei): Check if these events are cleared every time Initialize is called.
- notification_event->Clear();
- parameter_event->Clear();
+static u32 DecompressLZ11(const u8* in, u8* out) {
+ u32_le decompressed_size;
+ memcpy(&decompressed_size, in, sizeof(u32));
+ in += 4;
+
+ u8 type = decompressed_size & 0xFF;
+ ASSERT(type == 0x11);
+ decompressed_size >>= 8;
- ASSERT_MSG((nullptr != lock), "Cannot initialize without lock");
- lock->Release();
+ u32 current_out_size = 0;
+ u8 flags = 0, mask = 1;
+ while (current_out_size < decompressed_size) {
+ if (mask == 1) {
+ flags = *(in++);
+ mask = 0x80;
+ } else {
+ mask >>= 1;
+ }
- LOG_DEBUG(Service_APT, "called app_id=0x%08X, flags=0x%08X", app_id, flags);
+ if (flags & mask) {
+ u8 byte1 = *(in++);
+ u32 length = byte1 >> 4;
+ u32 offset;
+ if (length == 0) {
+ u8 byte2 = *(in++);
+ u8 byte3 = *(in++);
+ length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
+ offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
+ } else if (length == 1) {
+ u8 byte2 = *(in++);
+ u8 byte3 = *(in++);
+ u8 byte4 = *(in++);
+ length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
+ offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
+ } else {
+ u8 byte2 = *(in++);
+ length = (byte1 >> 4) + 0x1;
+ offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
+ }
+
+ for (u32 i = 0; i < length; i++) {
+ *out = *(out - offset);
+ ++out;
+ }
+
+ current_out_size += length;
+ } else {
+ *(out++) = *(in++);
+ current_out_size++;
+ }
+ }
+ return decompressed_size;
+}
+
+static bool LoadSharedFont() {
+ u8 font_region_code;
+ switch (CFG::GetRegionValue()) {
+ case 4: // CHN
+ font_region_code = 2;
+ break;
+ case 5: // KOR
+ font_region_code = 3;
+ break;
+ case 6: // TWN
+ font_region_code = 4;
+ break;
+ default: // JPN/EUR/USA
+ font_region_code = 1;
+ break;
+ }
+
+ const u64_le shared_font_archive_id_low = 0x0004009b00014002 | ((font_region_code - 1) << 8);
+ const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
+ std::vector<u8> shared_font_archive_id(16);
+ std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
+ std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
+ FileSys::Path archive_path(shared_font_archive_id);
+ auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
+ if (archive_result.Failed())
+ return false;
+
+ std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
+ FileSys::Path file_path(romfs_path);
+ FileSys::Mode open_mode = {};
+ open_mode.read_flag.Assign(1);
+ auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
+ if (file_result.Failed())
+ return false;
+
+ auto romfs = std::move(file_result).Unwrap();
+ std::vector<u8> romfs_buffer(romfs->backend->GetSize());
+ romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
+ romfs->backend->Close();
+
+ const char16_t* file_name[4] = {u"cbf_std.bcfnt.lz", u"cbf_zh-Hans-CN.bcfnt.lz",
+ u"cbf_ko-Hang-KR.bcfnt.lz", u"cbf_zh-Hant-TW.bcfnt.lz"};
+ const u8* font_file =
+ RomFS::GetFilePointer(romfs_buffer.data(), {file_name[font_region_code - 1]});
+ if (font_file == nullptr)
+ return false;
+
+ struct {
+ u32_le status;
+ u32_le region;
+ u32_le decompressed_size;
+ INSERT_PADDING_WORDS(0x1D);
+ } shared_font_header{};
+ static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
+
+ shared_font_header.status = 2; // successfully loaded
+ shared_font_header.region = font_region_code;
+ shared_font_header.decompressed_size =
+ DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
+ std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
+ *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
+
+ return true;
+}
+
+static bool LoadLegacySharedFont() {
+ // This is the legacy method to load shared font.
+ // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
+ // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
+ // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
+ // "shared_font.bin" in the Citra "sysdata" directory.
+ std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
+
+ FileUtil::CreateFullPath(filepath); // Create path if not already created
+ FileUtil::IOFile file(filepath, "rb");
+ if (file.IsOpen()) {
+ file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
+ return true;
+ }
+
+ return false;
}
void GetSharedFont(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
+
+ // Log in telemetry if the game uses the shared font
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", true);
+
if (!shared_font_loaded) {
- LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
- rb.Push<u32>(-1); // TODO: Find the right error code
- rb.Skip(1 + 2, true);
- Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont);
- return;
+ // On real 3DS, font loading happens on booting. However, we load it on demand to coordinate
+ // with CFG region auto configuration, which happens later than APT initialization.
+ if (LoadSharedFont()) {
+ shared_font_loaded = true;
+ } else if (LoadLegacySharedFont()) {
+ LOG_WARNING(Service_APT, "Loaded shared font by legacy method");
+ shared_font_loaded = true;
+ } else {
+ LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds");
+ rb.Push<u32>(-1); // TODO: Find the right error code
+ rb.Skip(1 + 2, true);
+ Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont);
+ return;
+ }
}
// The shared font has to be relocated to the new address before being passed to the
@@ -115,7 +416,12 @@ void GetLockHandle(Service::Interface* self) {
// this will cause the app to wait until parameter_event is signaled.
u32 applet_attributes = rp.Pop<u32>();
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
- rb.Push(RESULT_SUCCESS); // No error
+ rb.Push(RESULT_SUCCESS); // No error
+
+ // TODO(Subv): The output attributes should have an AppletPos of either Library or System |
+ // Library (depending on the type of the last launched applet) if the input attributes'
+ // AppletPos has the Library bit set.
+
rb.Push(applet_attributes); // Applet Attributes, this value is passed to Enable.
rb.Push<u32>(0); // Least significant bit = power button state
Kernel::Handle handle_copy = Kernel::g_handle_table.Create(lock).Unwrap();
@@ -128,10 +434,22 @@ void GetLockHandle(Service::Interface* self) {
void Enable(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3, 1, 0); // 0x30040
u32 attributes = rp.Pop<u32>();
+
+ LOG_DEBUG(Service_APT, "called attributes=0x%08X", attributes);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- rb.Push(RESULT_SUCCESS); // No error
- parameter_event->Signal(); // Let the application know that it has been started
- LOG_WARNING(Service_APT, "(STUBBED) called attributes=0x%08X", attributes);
+
+ auto* const slot_data = GetAppletSlotData(attributes);
+
+ if (!slot_data) {
+ rb.Push(ResultCode(ErrCodes::InvalidAppletSlot, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ slot_data->registered = true;
+
+ rb.Push(RESULT_SUCCESS);
}
void GetAppletManInfo(Service::Interface* self) {
@@ -149,22 +467,27 @@ void GetAppletManInfo(Service::Interface* self) {
void IsRegistered(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x9, 1, 0); // 0x90040
- u32 app_id = rp.Pop<u32>();
+ AppletId app_id = static_cast<AppletId>(rp.Pop<u32>());
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(RESULT_SUCCESS); // No error
- // TODO(Subv): An application is considered "registered" if it has already called APT::Enable
- // handle this properly once we implement multiprocess support.
- bool is_registered = false; // Set to not registered by default
+ auto* const slot_data = GetAppletSlotData(app_id);
+
+ // Check if an LLE applet was registered first, then fallback to HLE applets
+ bool is_registered = slot_data && slot_data->registered;
- if (app_id == static_cast<u32>(AppletId::AnyLibraryApplet)) {
- is_registered = HLE::Applets::IsLibraryAppletRunning();
- } else if (auto applet = HLE::Applets::Applet::Get(static_cast<AppletId>(app_id))) {
- is_registered = true; // Set to registered
+ if (!is_registered) {
+ if (app_id == AppletId::AnyLibraryApplet) {
+ is_registered = HLE::Applets::IsLibraryAppletRunning();
+ } else if (auto applet = HLE::Applets::Applet::Get(app_id)) {
+ // The applet exists, set it as registered.
+ is_registered = true;
+ }
}
+
rb.Push(is_registered);
- LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X", app_id);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X", static_cast<u32>(app_id));
}
void InquireNotification(Service::Interface* self) {
@@ -186,14 +509,17 @@ void SendParameter(Service::Interface* self) {
size_t size;
VAddr buffer = rp.PopStaticBuffer(&size);
- std::shared_ptr<HLE::Applets::Applet> dest_applet =
- HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id));
+ LOG_DEBUG(Service_APT,
+ "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
+ "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X",
+ src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- if (dest_applet == nullptr) {
- LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id);
- rb.Push<u32>(-1); // TODO(Subv): Find the right error code
+ // A new parameter can not be sent if the previous one hasn't been consumed yet
+ if (next_parameter) {
+ rb.Push(ResultCode(ErrCodes::ParameterPresent, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
return;
}
@@ -205,12 +531,14 @@ void SendParameter(Service::Interface* self) {
param.buffer.resize(buffer_size);
Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size());
- rb.Push(dest_applet->ReceiveParameter(param));
+ SendParameter(param);
- LOG_WARNING(Service_APT,
- "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
- "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X",
- src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer);
+ // If the applet is running in HLE mode, use the HLE interface to communicate with it.
+ if (auto dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id))) {
+ rb.Push(dest_applet->ReceiveParameter(param));
+ } else {
+ rb.Push(RESULT_SUCCESS);
+ }
}
void ReceiveParameter(Service::Interface* self) {
@@ -226,21 +554,40 @@ void ReceiveParameter(Service::Interface* self) {
"buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
buffer_size, static_buff_size);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+
+ if (!next_parameter) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (next_parameter->destination_id != app_id) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
+ ErrorLevel::Status));
+ return;
+ }
+
IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
+
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(next_parameter.sender_id);
- rb.Push(next_parameter.signal); // Signal type
- ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !");
- rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size
+ rb.Push(next_parameter->sender_id);
+ rb.Push(next_parameter->signal); // Signal type
+ ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
+ rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
- rb.PushMoveHandles((next_parameter.object != nullptr)
- ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap()
+ rb.PushMoveHandles((next_parameter->object != nullptr)
+ ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
: 0);
- rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
- Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size());
+ rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
+
+ Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
- LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+ // Clear the parameter
+ next_parameter = boost::none;
}
void GlanceParameter(Service::Interface* self) {
@@ -256,37 +603,74 @@ void GlanceParameter(Service::Interface* self) {
"buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)",
buffer_size, static_buff_size);
+ LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+
+ if (!next_parameter) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (next_parameter->destination_id != app_id) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound,
+ ErrorLevel::Status));
+ return;
+ }
+
IPC::RequestBuilder rb = rp.MakeBuilder(4, 4);
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(next_parameter.sender_id);
- rb.Push(next_parameter.signal); // Signal type
- ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !");
- rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size
+ rb.Push(next_parameter->sender_id);
+ rb.Push(next_parameter->signal); // Signal type
+ ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !");
+ rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size
- rb.PushCopyHandles((next_parameter.object != nullptr)
- ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap()
+ rb.PushMoveHandles((next_parameter->object != nullptr)
+ ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap()
: 0);
- rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0);
- Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size());
+ rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0);
+
+ Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size());
- LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size);
+ // Note: The NS module always clears the DSPSleep and DSPWakeup signals even in GlanceParameter.
+ if (next_parameter->signal == static_cast<u32>(SignalType::DspSleep) ||
+ next_parameter->signal == static_cast<u32>(SignalType::DspWakeup))
+ next_parameter = boost::none;
}
void CancelParameter(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100
- u32 check_sender = rp.Pop<u32>();
+ bool check_sender = rp.Pop<bool>();
u32 sender_appid = rp.Pop<u32>();
- u32 check_receiver = rp.Pop<u32>();
+ bool check_receiver = rp.Pop<bool>();
u32 receiver_appid = rp.Pop<u32>();
+
+ bool cancellation_success = true;
+
+ if (!next_parameter) {
+ cancellation_success = false;
+ } else {
+ if (check_sender && next_parameter->sender_id != sender_appid)
+ cancellation_success = false;
+
+ if (check_receiver && next_parameter->destination_id != receiver_appid)
+ cancellation_success = false;
+ }
+
+ if (cancellation_success)
+ next_parameter = boost::none;
+
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
+
rb.Push(RESULT_SUCCESS); // No error
- rb.Push(true); // Set to Success
+ rb.Push(cancellation_success);
- LOG_WARNING(Service_APT, "(STUBBED) called check_sender=0x%08X, sender_appid=0x%08X, "
- "check_receiver=0x%08X, receiver_appid=0x%08X",
- check_sender, sender_appid, check_receiver, receiver_appid);
+ LOG_DEBUG(Service_APT, "called check_sender=%u, sender_appid=0x%08X, "
+ "check_receiver=%u, receiver_appid=0x%08X",
+ check_sender, sender_appid, check_receiver, receiver_appid);
}
void PrepareToStartApplication(Service::Interface* self) {
@@ -383,7 +767,12 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): Launch the requested applet application.
+
auto applet = HLE::Applets::Applet::Get(applet_id);
if (applet) {
LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -391,14 +780,32 @@ void PrepareToStartLibraryApplet(Service::Interface* self) {
} else {
rb.Push(HLE::Applets::Applet::Create(applet_id));
}
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+}
+
+void PrepareToStartNewestHomeMenu(Service::Interface* self) {
+ IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); // 0x1A0000
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): This command can only be called by a System Applet (return 0xC8A0CC04 otherwise).
+
+ // This command must return an error when called, otherwise the Home Menu will try to reboot the
+ // system.
+ rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+
+ LOG_DEBUG(Service_APT, "called");
}
void PreloadLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
+
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+
+ // TODO(Subv): Launch the requested applet application.
+
auto applet = HLE::Applets::Applet::Get(applet_id);
if (applet) {
LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id);
@@ -406,34 +813,40 @@ void PreloadLibraryApplet(Service::Interface* self) {
} else {
rb.Push(HLE::Applets::Applet::Create(applet_id));
}
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
}
void StartLibraryApplet(Service::Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084
AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>());
- std::shared_ptr<HLE::Applets::Applet> applet = HLE::Applets::Applet::Get(applet_id);
-
- LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
-
- if (applet == nullptr) {
- LOG_ERROR(Service_APT, "unknown applet id=%08X", applet_id);
- IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, false);
- rb.Push<u32>(-1); // TODO(Subv): Find the right error code
- return;
- }
size_t buffer_size = rp.Pop<u32>();
Kernel::Handle handle = rp.PopHandle();
VAddr buffer_addr = rp.PopStaticBuffer();
- AppletStartupParameter parameter;
- parameter.object = Kernel::g_handle_table.GetGeneric(handle);
- parameter.buffer.resize(buffer_size);
- Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
+ LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- rb.Push(applet->Start(parameter));
+
+ // Send the Wakeup signal to the applet
+ MessageParameter param;
+ param.destination_id = static_cast<u32>(applet_id);
+ param.sender_id = static_cast<u32>(AppletId::Application);
+ param.object = Kernel::g_handle_table.GetGeneric(handle);
+ param.signal = static_cast<u32>(SignalType::Wakeup);
+ param.buffer.resize(buffer_size);
+ Memory::ReadBlock(buffer_addr, param.buffer.data(), param.buffer.size());
+ SendParameter(param);
+
+ // In case the applet is being HLEd, attempt to communicate with it.
+ if (auto applet = HLE::Applets::Applet::Get(applet_id)) {
+ AppletStartupParameter parameter;
+ parameter.object = Kernel::g_handle_table.GetGeneric(handle);
+ parameter.buffer.resize(buffer_size);
+ Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size());
+ rb.Push(applet->Start(parameter));
+ } else {
+ rb.Push(RESULT_SUCCESS);
+ }
}
void CancelLibraryApplet(Service::Interface* self) {
@@ -647,125 +1060,6 @@ void CheckNew3DS(Service::Interface* self) {
LOG_WARNING(Service_APT, "(STUBBED) called");
}
-static u32 DecompressLZ11(const u8* in, u8* out) {
- u32_le decompressed_size;
- memcpy(&decompressed_size, in, sizeof(u32));
- in += 4;
-
- u8 type = decompressed_size & 0xFF;
- ASSERT(type == 0x11);
- decompressed_size >>= 8;
-
- u32 current_out_size = 0;
- u8 flags = 0, mask = 1;
- while (current_out_size < decompressed_size) {
- if (mask == 1) {
- flags = *(in++);
- mask = 0x80;
- } else {
- mask >>= 1;
- }
-
- if (flags & mask) {
- u8 byte1 = *(in++);
- u32 length = byte1 >> 4;
- u32 offset;
- if (length == 0) {
- u8 byte2 = *(in++);
- u8 byte3 = *(in++);
- length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11;
- offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1;
- } else if (length == 1) {
- u8 byte2 = *(in++);
- u8 byte3 = *(in++);
- u8 byte4 = *(in++);
- length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111;
- offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1;
- } else {
- u8 byte2 = *(in++);
- length = (byte1 >> 4) + 0x1;
- offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1;
- }
-
- for (u32 i = 0; i < length; i++) {
- *out = *(out - offset);
- ++out;
- }
-
- current_out_size += length;
- } else {
- *(out++) = *(in++);
- current_out_size++;
- }
- }
- return decompressed_size;
-}
-
-static bool LoadSharedFont() {
- // TODO (wwylele): load different font archive for region CHN/KOR/TWN
- const u64_le shared_font_archive_id_low = 0x0004009b00014002;
- const u64_le shared_font_archive_id_high = 0x00000001ffffff00;
- std::vector<u8> shared_font_archive_id(16);
- std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64));
- std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64));
- FileSys::Path archive_path(shared_font_archive_id);
- auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path);
- if (archive_result.Failed())
- return false;
-
- std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS
- FileSys::Path file_path(romfs_path);
- FileSys::Mode open_mode = {};
- open_mode.read_flag.Assign(1);
- auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode);
- if (file_result.Failed())
- return false;
-
- auto romfs = std::move(file_result).Unwrap();
- std::vector<u8> romfs_buffer(romfs->backend->GetSize());
- romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data());
- romfs->backend->Close();
-
- const u8* font_file = RomFS::GetFilePointer(romfs_buffer.data(), {u"cbf_std.bcfnt.lz"});
- if (font_file == nullptr)
- return false;
-
- struct {
- u32_le status;
- u32_le region;
- u32_le decompressed_size;
- INSERT_PADDING_WORDS(0x1D);
- } shared_font_header{};
- static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size");
-
- shared_font_header.status = 2; // successfully loaded
- shared_font_header.region = 1; // region JPN/EUR/USA
- shared_font_header.decompressed_size =
- DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80));
- std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header));
- *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"
-
- return true;
-}
-
-static bool LoadLegacySharedFont() {
- // This is the legacy method to load shared font.
- // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
- // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
- // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
- // "shared_font.bin" in the Citra "sysdata" directory.
- std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
-
- FileUtil::CreateFullPath(filepath); // Create path if not already created
- FileUtil::IOFile file(filepath, "rb");
- if (file.IsOpen()) {
- file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize());
- return true;
- }
-
- return false;
-}
-
void Init() {
AddService(new APT_A_Interface);
AddService(new APT_S_Interface);
@@ -789,19 +1083,24 @@ void Init() {
shared_font_loaded = false;
}
- lock = Kernel::Mutex::Create(false, "APT_U:Lock");
+ lock = Kernel::Mutex::Create(false, 0, "APT_U:Lock");
cpu_percent = 0;
unknown_ns_state_field = 0;
screen_capture_post_permission =
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
- // TODO(bunnei): Check if these are created in Initialize or on APT process startup.
- notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification");
- parameter_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Start");
-
- next_parameter.signal = static_cast<u32>(SignalType::Wakeup);
- next_parameter.destination_id = 0x300;
+ for (size_t slot = 0; slot < applet_slots.size(); ++slot) {
+ auto& slot_data = applet_slots[slot];
+ slot_data.slot = static_cast<AppletSlot>(slot);
+ slot_data.applet_id = AppletId::None;
+ slot_data.attributes.raw = 0;
+ slot_data.registered = false;
+ slot_data.notification_event =
+ Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification");
+ slot_data.parameter_event =
+ Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Parameter");
+ }
}
void Shutdown() {
@@ -809,10 +1108,14 @@ void Shutdown() {
shared_font_loaded = false;
shared_font_relocated = false;
lock = nullptr;
- notification_event = nullptr;
- parameter_event = nullptr;
- next_parameter.object = nullptr;
+ for (auto& slot : applet_slots) {
+ slot.registered = false;
+ slot.notification_event = nullptr;
+ slot.parameter_event = nullptr;
+ }
+
+ next_parameter = boost::none;
HLE::Applets::Shutdown();
}
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h
index ee80926d2..7b79e1f3e 100644
--- a/src/core/hle/service/apt/apt.h
+++ b/src/core/hle/service/apt/apt.h
@@ -72,6 +72,8 @@ enum class SignalType : u32 {
/// App Id's used by APT functions
enum class AppletId : u32 {
+ None = 0,
+ AnySystemApplet = 0x100,
HomeMenu = 0x101,
AlternateMenu = 0x103,
Camera = 0x110,
@@ -83,6 +85,7 @@ enum class AppletId : u32 {
Miiverse = 0x117,
MiiversePost = 0x118,
AmiiboSettings = 0x119,
+ AnySysLibraryApplet = 0x200,
SoftwareKeyboard1 = 0x201,
Ed1 = 0x202,
PnoteApp = 0x204,
@@ -116,6 +119,13 @@ enum class ScreencapPostPermission : u32 {
DisableScreenshotPostingToMiiverse = 3
};
+namespace ErrCodes {
+enum {
+ ParameterPresent = 2,
+ InvalidAppletSlot = 4,
+};
+} // namespace ErrCodes
+
/// Send a parameter to the currently-running application, which will read it via ReceiveParameter
void SendParameter(const MessageParameter& parameter);
@@ -410,6 +420,16 @@ void GetAppCpuTimeLimit(Service::Interface* self);
void PrepareToStartLibraryApplet(Service::Interface* self);
/**
+ * APT::PrepareToStartNewestHomeMenu service function
+ * Inputs:
+ * 0 : Command header [0x001A0000]
+ * Outputs:
+ * 0 : Return header
+ * 1 : Result of function
+ */
+void PrepareToStartNewestHomeMenu(Service::Interface* self);
+
+/**
* APT::PreloadLibraryApplet service function
* Inputs:
* 0 : Command header [0x00160040]
diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp
index ec5668d05..bb78ee7d7 100644
--- a/src/core/hle/service/apt/apt_s.cpp
+++ b/src/core/hle/service/apt/apt_s.cpp
@@ -17,10 +17,10 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00060040, GetAppletInfo, "GetAppletInfo"},
{0x00070000, nullptr, "GetLastSignaledAppletId"},
{0x00080000, nullptr, "CountRegisteredApplet"},
- {0x00090040, nullptr, "IsRegistered"},
+ {0x00090040, IsRegistered, "IsRegistered"},
{0x000A0040, nullptr, "GetAttribute"},
{0x000B0040, InquireNotification, "InquireNotification"},
- {0x000C0104, nullptr, "SendParameter"},
+ {0x000C0104, SendParameter, "SendParameter"},
{0x000D0080, ReceiveParameter, "ReceiveParameter"},
{0x000E0080, GlanceParameter, "GlanceParameter"},
{0x000F0100, nullptr, "CancelParameter"},
@@ -34,11 +34,11 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00170040, nullptr, "FinishPreloadingLibraryApplet"},
{0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"},
{0x00190040, nullptr, "PrepareToStartSystemApplet"},
- {0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"},
+ {0x001A0000, PrepareToStartNewestHomeMenu, "PrepareToStartNewestHomeMenu"},
{0x001B00C4, nullptr, "StartApplication"},
{0x001C0000, nullptr, "WakeupApplication"},
{0x001D0000, nullptr, "CancelApplication"},
- {0x001E0084, nullptr, "StartLibraryApplet"},
+ {0x001E0084, StartLibraryApplet, "StartLibraryApplet"},
{0x001F0084, nullptr, "StartSystemApplet"},
{0x00200044, nullptr, "StartNewestHomeMenu"},
{0x00210000, nullptr, "OrderToCloseApplication"},
diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp
index c9f9e9d95..8172edae8 100644
--- a/src/core/hle/service/cam/cam.cpp
+++ b/src/core/hle/service/cam/cam.cpp
@@ -177,7 +177,7 @@ void CompletionEventCallBack(u64 port_id, int) {
LOG_ERROR(Service_CAM, "The destination size (%u) doesn't match the source (%zu)!",
port.dest_size, buffer_size);
}
- Memory::WriteBlock(port.dest, buffer.data(), std::min<u32>(port.dest_size, buffer_size));
+ Memory::WriteBlock(port.dest, buffer.data(), std::min<size_t>(port.dest_size, buffer_size));
}
port.is_receiving = false;
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 6624f1711..f78c25fb2 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -141,7 +141,7 @@ void GetCountryCodeString(Service::Interface* self) {
void GetCountryCodeID(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
- u16 country_code = cmd_buff[1];
+ u16 country_code = static_cast<u16>(cmd_buff[1]);
u16 country_code_id = 0;
// The following algorithm will fail if the first country code isn't 0.
@@ -168,7 +168,7 @@ void GetCountryCodeID(Service::Interface* self) {
cmd_buff[2] = country_code_id;
}
-static u32 GetRegionValue() {
+u32 GetRegionValue() {
if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT)
return preferred_region_code;
@@ -681,7 +681,7 @@ void GenerateConsoleUniqueId(u32& random_number, u64& console_id) {
CryptoPP::AutoSeededRandomPool rng;
random_number = rng.GenerateWord32(0, 0xFFFF);
u64_le local_friend_code_seed;
- rng.GenerateBlock(reinterpret_cast<byte*>(&local_friend_code_seed),
+ rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&local_friend_code_seed),
sizeof(local_friend_code_seed));
console_id = (local_friend_code_seed & 0x3FFFFFFFF) | (static_cast<u64>(random_number) << 48);
}
diff --git a/src/core/hle/service/cfg/cfg.h b/src/core/hle/service/cfg/cfg.h
index 1659ebf32..282b6936b 100644
--- a/src/core/hle/service/cfg/cfg.h
+++ b/src/core/hle/service/cfg/cfg.h
@@ -101,6 +101,8 @@ void GetCountryCodeString(Service::Interface* self);
*/
void GetCountryCodeID(Service::Interface* self);
+u32 GetRegionValue();
+
/**
* CFG::SecureInfoGetRegion service function
* Inputs:
diff --git a/src/core/hle/service/csnd_snd.cpp b/src/core/hle/service/csnd_snd.cpp
index 9471ec1ef..aac903ccb 100644
--- a/src/core/hle/service/csnd_snd.cpp
+++ b/src/core/hle/service/csnd_snd.cpp
@@ -47,7 +47,7 @@ static void Initialize(Interface* self) {
MemoryPermission::ReadWrite, 0,
Kernel::MemoryRegion::BASE, "CSND:SharedMemory");
- mutex = Kernel::Mutex::Create(false, "CSND:mutex");
+ mutex = Kernel::Mutex::Create(false, 0, "CSND:mutex");
cmd_buff[1] = RESULT_SUCCESS.raw;
cmd_buff[2] = IPC::CopyHandleDesc(2);
diff --git a/src/core/hle/service/dlp/dlp_clnt.cpp b/src/core/hle/service/dlp/dlp_clnt.cpp
index 56f934b3f..6f2bf2061 100644
--- a/src/core/hle/service/dlp/dlp_clnt.cpp
+++ b/src/core/hle/service/dlp/dlp_clnt.cpp
@@ -8,7 +8,26 @@ namespace Service {
namespace DLP {
const Interface::FunctionInfo FunctionTable[] = {
- {0x000100C3, nullptr, "Initialize"}, {0x00110000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x000100C3, nullptr, "Initialize"},
+ {0x00020000, nullptr, "Finalize"},
+ {0x00030000, nullptr, "GetEventDesc"},
+ {0x00040000, nullptr, "GetChannel"},
+ {0x00050180, nullptr, "StartScan"},
+ {0x00060000, nullptr, "StopScan"},
+ {0x00070080, nullptr, "GetServerInfo"},
+ {0x00080100, nullptr, "GetTitleInfo"},
+ {0x00090040, nullptr, "GetTitleInfoInOrder"},
+ {0x000A0080, nullptr, "DeleteScanInfo"},
+ {0x000B0100, nullptr, "PrepareForSystemDownload"},
+ {0x000C0000, nullptr, "StartSystemDownload"},
+ {0x000D0100, nullptr, "StartTitleDownload"},
+ {0x000E0000, nullptr, "GetMyStatus"},
+ {0x000F0040, nullptr, "GetConnectingNodes"},
+ {0x00100040, nullptr, "GetNodeInfo"},
+ {0x00110000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00120000, nullptr, "StopSession"},
+ {0x00130100, nullptr, "GetCupVersion"},
+ {0x00140100, nullptr, "GetDupAvailability"},
};
DLP_CLNT_Interface::DLP_CLNT_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_fkcl.cpp b/src/core/hle/service/dlp/dlp_fkcl.cpp
index 29b9d52e0..fe6be7d32 100644
--- a/src/core/hle/service/dlp/dlp_fkcl.cpp
+++ b/src/core/hle/service/dlp/dlp_fkcl.cpp
@@ -8,7 +8,23 @@ namespace Service {
namespace DLP {
const Interface::FunctionInfo FunctionTable[] = {
- {0x00010083, nullptr, "Initialize"}, {0x000F0000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00010083, nullptr, "Initialize"},
+ {0x00020000, nullptr, "Finalize"},
+ {0x00030000, nullptr, "GetEventDesc"},
+ {0x00040000, nullptr, "GetChannels"},
+ {0x00050180, nullptr, "StartScan"},
+ {0x00060000, nullptr, "StopScan"},
+ {0x00070080, nullptr, "GetServerInfo"},
+ {0x00080100, nullptr, "GetTitleInfo"},
+ {0x00090040, nullptr, "GetTitleInfoInOrder"},
+ {0x000A0080, nullptr, "DeleteScanInfo"},
+ {0x000B0100, nullptr, "StartFakeSession"},
+ {0x000C0000, nullptr, "GetMyStatus"},
+ {0x000D0040, nullptr, "GetConnectingNodes"},
+ {0x000E0040, nullptr, "GetNodeInfo"},
+ {0x000F0000, nullptr, "GetWirelessRebootPassphrase"},
+ {0x00100000, nullptr, "StopSession"},
+ {0x00110203, nullptr, "Initialize2"},
};
DLP_FKCL_Interface::DLP_FKCL_Interface() {
diff --git a/src/core/hle/service/dlp/dlp_srvr.cpp b/src/core/hle/service/dlp/dlp_srvr.cpp
index 32cfa2c44..1bcea43d3 100644
--- a/src/core/hle/service/dlp/dlp_srvr.cpp
+++ b/src/core/hle/service/dlp/dlp_srvr.cpp
@@ -11,7 +11,7 @@
namespace Service {
namespace DLP {
-static void unk_0x000E0040(Interface* self) {
+static void IsChild(Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
cmd_buff[1] = RESULT_SUCCESS.raw;
@@ -24,14 +24,19 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00010183, nullptr, "Initialize"},
{0x00020000, nullptr, "Finalize"},
{0x00030000, nullptr, "GetServerState"},
+ {0x00040000, nullptr, "GetEventDescription"},
{0x00050080, nullptr, "StartAccepting"},
+ {0x00060000, nullptr, "EndAccepting"},
{0x00070000, nullptr, "StartDistribution"},
{0x000800C0, nullptr, "SendWirelessRebootPassphrase"},
{0x00090040, nullptr, "AcceptClient"},
+ {0x000A0040, nullptr, "DisconnectClient"},
{0x000B0042, nullptr, "GetConnectingClients"},
{0x000C0040, nullptr, "GetClientInfo"},
{0x000D0040, nullptr, "GetClientState"},
- {0x000E0040, unk_0x000E0040, "unk_0x000E0040"},
+ {0x000E0040, IsChild, "IsChild"},
+ {0x000F0303, nullptr, "InitializeWithName"},
+ {0x00100000, nullptr, "GetDupNoticeNeed"},
};
DLP_SRVR_Interface::DLP_SRVR_Interface() {
diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp
index 7d746054f..42f8950f9 100644
--- a/src/core/hle/service/dsp_dsp.cpp
+++ b/src/core/hle/service/dsp_dsp.cpp
@@ -147,9 +147,10 @@ static void LoadComponent(Service::Interface* self) {
LOG_INFO(Service_DSP, "Firmware hash: %#" PRIx64,
Common::ComputeHash64(component_data.data(), component_data.size()));
// Some versions of the firmware have the location of DSP structures listed here.
- ASSERT(size > 0x37C);
- LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64,
- Common::ComputeHash64(component_data.data() + 0x340, 60));
+ if (size > 0x37C) {
+ LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64,
+ Common::ComputeHash64(component_data.data() + 0x340, 60));
+ }
LOG_WARNING(Service_DSP,
"(STUBBED) called size=0x%X, prog_mask=0x%08X, data_mask=0x%08X, buffer=0x%08X",
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index 033fbc9aa..4ee7df73c 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -20,6 +20,7 @@
#include "core/file_sys/archive_savedata.h"
#include "core/file_sys/archive_sdmc.h"
#include "core/file_sys/archive_sdmcwriteonly.h"
+#include "core/file_sys/archive_selfncch.h"
#include "core/file_sys/archive_systemsavedata.h"
#include "core/file_sys/directory_backend.h"
#include "core/file_sys/errors.h"
@@ -48,7 +49,7 @@ struct hash<Service::FS::ArchiveIdCode> {
return std::hash<Type>()(static_cast<Type>(id_code));
}
};
-}
+} // namespace std
static constexpr Kernel::Handle INVALID_HANDLE{};
@@ -216,7 +217,7 @@ void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serve
LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count);
// Number of entries actually read
- u32 read = backend->Read(entries.size(), entries.data());
+ u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data());
cmd_buff[2] = read;
Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry));
break;
@@ -564,6 +565,21 @@ void RegisterArchiveTypes() {
auto systemsavedata_factory =
std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory);
RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData);
+
+ auto selfncch_factory = std::make_unique<FileSys::ArchiveFactory_SelfNCCH>();
+ RegisterArchiveType(std::move(selfncch_factory), ArchiveIdCode::SelfNCCH);
+}
+
+void RegisterSelfNCCH(Loader::AppLoader& app_loader) {
+ auto itr = id_code_map.find(ArchiveIdCode::SelfNCCH);
+ if (itr == id_code_map.end()) {
+ LOG_ERROR(Service_FS,
+ "Could not register a new NCCH because the SelfNCCH archive hasn't been created");
+ return;
+ }
+
+ auto* factory = static_cast<FileSys::ArchiveFactory_SelfNCCH*>(itr->second.get());
+ factory->Register(app_loader);
}
void UnregisterArchiveTypes() {
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index 3a3371c88..e3c8fc2ef 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -21,6 +21,10 @@ static constexpr char SYSTEM_ID[]{"00000000000000000000000000000000"};
/// The scrambled SD card CID, also known as ID1
static constexpr char SDCARD_ID[]{"00000000000000000000000000000000"};
+namespace Loader {
+class AppLoader;
+}
+
namespace Service {
namespace FS {
@@ -259,6 +263,9 @@ void ArchiveInit();
/// Shutdown archives
void ArchiveShutdown();
+/// Registers a new NCCH file with the SelfNCCH archive factory
+void RegisterSelfNCCH(Loader::AppLoader& app_loader);
+
/// Register all archive types
void RegisterArchiveTypes();
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 2014b8461..379fbd71c 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -7,8 +7,9 @@
#include <cmath>
#include <memory>
#include "common/logging/log.h"
+#include "core/3ds.h"
+#include "core/core.h"
#include "core/core_timing.h"
-#include "core/frontend/emu_window.h"
#include "core/frontend/input.h"
#include "core/hle/ipc.h"
#include "core/hle/kernel/event.h"
@@ -18,7 +19,6 @@
#include "core/hle/service/hid/hid_spvr.h"
#include "core/hle/service/hid/hid_user.h"
#include "core/hle/service/service.h"
-#include "video_core/video_core.h"
namespace Service {
namespace HID {
@@ -50,10 +50,15 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234;
constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104;
constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101;
+constexpr float accelerometer_coef = 512.0f; // measured from hw test result
+constexpr float gyroscope_coef = 14.375f; // got from hwtest GetGyroscopeLowRawToDpsCoefficient call
+
static std::atomic<bool> is_device_reload_pending;
static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>
buttons;
static std::unique_ptr<Input::AnalogDevice> circle_pad;
+static std::unique_ptr<Input::MotionDevice> motion_device;
+static std::unique_ptr<Input::TouchDevice> touch_device;
DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) {
// 30 degree and 60 degree are angular thresholds for directions
@@ -90,6 +95,8 @@ static void LoadInputDevices() {
buttons.begin(), Input::CreateDevice<Input::ButtonDevice>);
circle_pad = Input::CreateDevice<Input::AnalogDevice>(
Settings::values.analogs[Settings::NativeAnalog::CirclePad]);
+ motion_device = Input::CreateDevice<Input::MotionDevice>(Settings::values.motion_device);
+ touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.touch_device);
}
static void UnloadInputDevices() {
@@ -97,6 +104,8 @@ static void UnloadInputDevices() {
button.reset();
}
circle_pad.reset();
+ motion_device.reset();
+ touch_device.reset();
}
static void UpdatePadCallback(u64 userdata, int cycles_late) {
@@ -165,8 +174,10 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) {
// Get the current touch entry
TouchDataEntry& touch_entry = mem->touch.entries[mem->touch.index];
bool pressed = false;
-
- std::tie(touch_entry.x, touch_entry.y, pressed) = VideoCore::g_emu_window->GetTouchState();
+ float x, y;
+ std::tie(x, y, pressed) = touch_device->GetStatus();
+ touch_entry.x = static_cast<u16>(x * Core::kScreenBottomWidth);
+ touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
touch_entry.valid.Assign(pressed ? 1 : 0);
// TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
@@ -193,10 +204,19 @@ static void UpdateAccelerometerCallback(u64 userdata, int cycles_late) {
mem->accelerometer.index = next_accelerometer_index;
next_accelerometer_index = (next_accelerometer_index + 1) % mem->accelerometer.entries.size();
+ Math::Vec3<float> accel;
+ std::tie(accel, std::ignore) = motion_device->GetStatus();
+ accel *= accelerometer_coef;
+ // TODO(wwylele): do a time stretch like the one in UpdateGyroscopeCallback
+ // The time stretch formula should be like
+ // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity
+
AccelerometerDataEntry& accelerometer_entry =
mem->accelerometer.entries[mem->accelerometer.index];
- std::tie(accelerometer_entry.x, accelerometer_entry.y, accelerometer_entry.z) =
- VideoCore::g_emu_window->GetAccelerometerState();
+
+ accelerometer_entry.x = static_cast<s16>(accel.x);
+ accelerometer_entry.y = static_cast<s16>(accel.y);
+ accelerometer_entry.z = static_cast<s16>(accel.z);
// Make up "raw" entry
// TODO(wwylele):
@@ -227,8 +247,14 @@ static void UpdateGyroscopeCallback(u64 userdata, int cycles_late) {
next_gyroscope_index = (next_gyroscope_index + 1) % mem->gyroscope.entries.size();
GyroscopeDataEntry& gyroscope_entry = mem->gyroscope.entries[mem->gyroscope.index];
- std::tie(gyroscope_entry.x, gyroscope_entry.y, gyroscope_entry.z) =
- VideoCore::g_emu_window->GetGyroscopeState();
+
+ Math::Vec3<float> gyro;
+ std::tie(std::ignore, gyro) = motion_device->GetStatus();
+ double stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale();
+ gyro *= gyroscope_coef * static_cast<float>(stretch);
+ gyroscope_entry.x = static_cast<s16>(gyro.x);
+ gyroscope_entry.y = static_cast<s16>(gyro.y);
+ gyroscope_entry.z = static_cast<s16>(gyro.z);
// Make up "raw" entry
mem->gyroscope.raw_entry.x = gyroscope_entry.x;
@@ -326,7 +352,7 @@ void GetGyroscopeLowRawToDpsCoefficient(Service::Interface* self) {
cmd_buff[1] = RESULT_SUCCESS.raw;
- f32 coef = VideoCore::g_emu_window->GetGyroscopeRawToDpsCoefficient();
+ f32 coef = gyroscope_coef;
memcpy(&cmd_buff[2], &coef, 4);
}
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 1ef972e70..ef25926b5 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -24,7 +24,7 @@ namespace HID {
*/
struct PadState {
union {
- u32 hex;
+ u32 hex{};
BitField<0, 1, u32> a;
BitField<1, 1, u32> b;
diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp
index 837413f93..0912d5756 100644
--- a/src/core/hle/service/ir/ir_rst.cpp
+++ b/src/core/hle/service/ir/ir_rst.cpp
@@ -18,7 +18,7 @@ namespace Service {
namespace IR {
union PadState {
- u32_le hex;
+ u32_le hex{};
BitField<14, 1, u32_le> zl;
BitField<15, 1, u32_le> zr;
diff --git a/src/core/hle/service/ldr_ro/cro_helper.h b/src/core/hle/service/ldr_ro/cro_helper.h
index 3bc10dbdc..57b4fb6df 100644
--- a/src/core/hle/service/ldr_ro/cro_helper.h
+++ b/src/core/hle/service/ldr_ro/cro_helper.h
@@ -413,7 +413,8 @@ private:
*/
template <typename T>
void GetEntry(std::size_t index, T& data) const {
- Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T));
+ Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
+ &data, sizeof(T));
}
/**
@@ -425,7 +426,8 @@ private:
*/
template <typename T>
void SetEntry(std::size_t index, const T& data) {
- Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T));
+ Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)),
+ &data, sizeof(T));
}
/**
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index d5624fe54..b10d5852b 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -5,6 +5,8 @@
#include "common/common_types.h"
#include "common/logging/log.h"
#include "core/hle/ipc.h"
+#include "core/hle/ipc_helpers.h"
+#include "core/hle/kernel/event.h"
#include "core/hle/service/nim/nim.h"
#include "core/hle/service/nim/nim_aoc.h"
#include "core/hle/service/nim/nim_s.h"
@@ -14,6 +16,16 @@
namespace Service {
namespace NIM {
+static Kernel::SharedPtr<Kernel::Event> nim_system_update_event;
+
+void CheckForSysUpdateEvent(Service::Interface* self) {
+ IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x5, 0, 0); // 0x50000
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
+ rb.Push(RESULT_SUCCESS);
+ rb.PushCopyHandles(Kernel::g_handle_table.Create(nim_system_update_event).Unwrap());
+ LOG_TRACE(Service_NIM, "called");
+}
+
void CheckSysUpdateAvailable(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
@@ -29,9 +41,13 @@ void Init() {
AddService(new NIM_AOC_Interface);
AddService(new NIM_S_Interface);
AddService(new NIM_U_Interface);
+
+ nim_system_update_event = Kernel::Event::Create(ResetType::OneShot, "NIM System Update Event");
}
-void Shutdown() {}
+void Shutdown() {
+ nim_system_update_event = nullptr;
+}
} // namespace NIM
diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h
index c3106f18b..dbf605e5a 100644
--- a/src/core/hle/service/nim/nim.h
+++ b/src/core/hle/service/nim/nim.h
@@ -11,6 +11,17 @@ class Interface;
namespace NIM {
/**
+ * NIM::CheckForSysUpdateEvent service function
+ * Inputs:
+ * 1 : None
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Copy handle descriptor
+ * 3 : System Update event handle
+ */
+void CheckForSysUpdateEvent(Service::Interface* self);
+
+/**
* NIM::CheckSysUpdateAvailable service function
* Inputs:
* 1 : None
diff --git a/src/core/hle/service/nim/nim_u.cpp b/src/core/hle/service/nim/nim_u.cpp
index 7664bad60..569660278 100644
--- a/src/core/hle/service/nim/nim_u.cpp
+++ b/src/core/hle/service/nim/nim_u.cpp
@@ -12,7 +12,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00010000, nullptr, "StartSysUpdate"},
{0x00020000, nullptr, "GetUpdateDownloadProgress"},
{0x00040000, nullptr, "FinishTitlesInstall"},
- {0x00050000, nullptr, "CheckForSysUpdateEvent"},
+ {0x00050000, CheckForSysUpdateEvent, "CheckForSysUpdateEvent"},
{0x00090000, CheckSysUpdateAvailable, "CheckSysUpdateAvailable"},
{0x000A0000, nullptr, "GetState"},
{0x000B0000, nullptr, "GetSystemTitleHash"},
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
new file mode 100644
index 000000000..9e19c38bf
--- /dev/null
+++ b/src/core/hle/service/ns/ns.cpp
@@ -0,0 +1,16 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/ns/ns.h"
+#include "core/hle/service/ns/ns_s.h"
+
+namespace Service {
+namespace NS {
+
+void InstallInterfaces(SM::ServiceManager& service_manager) {
+ std::make_shared<NS_S>()->InstallAsService(service_manager);
+}
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
new file mode 100644
index 000000000..c3d67d98c
--- /dev/null
+++ b/src/core/hle/service/ns/ns.h
@@ -0,0 +1,16 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service {
+namespace NS {
+
+/// Registers all NS services with the specified service manager.
+void InstallInterfaces(SM::ServiceManager& service_manager);
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns/ns_s.cpp b/src/core/hle/service/ns/ns_s.cpp
new file mode 100644
index 000000000..d952888dc
--- /dev/null
+++ b/src/core/hle/service/ns/ns_s.cpp
@@ -0,0 +1,34 @@
+// Copyright 2015 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/ns/ns_s.h"
+
+namespace Service {
+namespace NS {
+
+NS_S::NS_S() : ServiceFramework("ns:s", 2) {
+ static const FunctionInfo functions[] = {
+ {0x000100C0, nullptr, "LaunchFIRM"},
+ {0x000200C0, nullptr, "LaunchTitle"},
+ {0x00030000, nullptr, "TerminateApplication"},
+ {0x00040040, nullptr, "TerminateProcess"},
+ {0x000500C0, nullptr, "LaunchApplicationFIRM"},
+ {0x00060042, nullptr, "SetFIRMParams4A0"},
+ {0x00070042, nullptr, "CardUpdateInitialize"},
+ {0x00080000, nullptr, "CardUpdateShutdown"},
+ {0x000D0140, nullptr, "SetTWLBannerHMAC"},
+ {0x000E0000, nullptr, "ShutdownAsync"},
+ {0x00100180, nullptr, "RebootSystem"},
+ {0x00110100, nullptr, "TerminateTitle"},
+ {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
+ {0x00150140, nullptr, "LaunchApplication"},
+ {0x00160000, nullptr, "RebootSystemClean"},
+ };
+ RegisterHandlers(functions);
+}
+
+NS_S::~NS_S() = default;
+
+} // namespace NS
+} // namespace Service
diff --git a/src/core/hle/service/ns_s.h b/src/core/hle/service/ns/ns_s.h
index 90288a521..660ae453f 100644
--- a/src/core/hle/service/ns_s.h
+++ b/src/core/hle/service/ns/ns_s.h
@@ -4,18 +4,17 @@
#pragma once
+#include "core/hle/kernel/kernel.h"
#include "core/hle/service/service.h"
namespace Service {
namespace NS {
-class NS_S final : public Interface {
+/// Interface to "ns:s" service
+class NS_S final : public ServiceFramework<NS_S> {
public:
NS_S();
-
- std::string GetPortName() const override {
- return "ns:s";
- }
+ ~NS_S();
};
} // namespace NS
diff --git a/src/core/hle/service/ns_s.cpp b/src/core/hle/service/ns_s.cpp
deleted file mode 100644
index 215c9aacc..000000000
--- a/src/core/hle/service/ns_s.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "core/hle/service/ns_s.h"
-
-namespace Service {
-namespace NS {
-
-const Interface::FunctionInfo FunctionTable[] = {
- {0x000100C0, nullptr, "LaunchFIRM"},
- {0x000200C0, nullptr, "LaunchTitle"},
- {0x00030000, nullptr, "TerminateApplication"},
- {0x00040040, nullptr, "TerminateProcess"},
- {0x000500C0, nullptr, "LaunchApplicationFIRM"},
- {0x00060042, nullptr, "SetFIRMParams4A0"},
- {0x00070042, nullptr, "CardUpdateInitialize"},
- {0x00080000, nullptr, "CardUpdateShutdown"},
- {0x000D0140, nullptr, "SetTWLBannerHMAC"},
- {0x000E0000, nullptr, "ShutdownAsync"},
- {0x00100180, nullptr, "RebootSystem"},
- {0x00110100, nullptr, "TerminateTitle"},
- {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"},
- {0x00150140, nullptr, "LaunchApplication"},
- {0x00160000, nullptr, "RebootSystemClean"},
-};
-
-NS_S::NS_S() {
- Register(FunctionTable);
-}
-
-} // namespace NS
-} // namespace Service
diff --git a/src/core/hle/service/nwm/nwm_uds.cpp b/src/core/hle/service/nwm/nwm_uds.cpp
index 6dbdff044..87a6b0eca 100644
--- a/src/core/hle/service/nwm/nwm_uds.cpp
+++ b/src/core/hle/service/nwm/nwm_uds.cpp
@@ -2,8 +2,11 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include <array>
#include <cstring>
+#include <list>
+#include <mutex>
#include <unordered_map>
#include <vector>
#include "common/common_types.h"
@@ -12,11 +15,14 @@
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/event.h"
#include "core/hle/kernel/shared_memory.h"
+#include "core/hle/lock.h"
#include "core/hle/result.h"
#include "core/hle/service/nwm/nwm_uds.h"
#include "core/hle/service/nwm/uds_beacon.h"
+#include "core/hle/service/nwm/uds_connection.h"
#include "core/hle/service/nwm/uds_data.h"
#include "core/memory.h"
+#include "network/network.h"
namespace Service {
namespace NWM {
@@ -34,9 +40,12 @@ static ConnectionStatus connection_status{};
/* Node information about the current network.
* The amount of elements in this vector is always the maximum number
* of nodes specified in the network configuration.
- * The first node is always the host, so this always contains at least 1 entry.
+ * The first node is always the host.
*/
-static NodeList node_info(1);
+static NodeList node_info;
+
+// Node information about our own system.
+static NodeInfo current_node;
// Mapping of bind node ids to their respective events.
static std::unordered_map<u32, Kernel::SharedPtr<Kernel::Event>> bind_node_events;
@@ -51,6 +60,298 @@ static NetworkInfo network_info;
// Event that will generate and send the 802.11 beacon frames.
static int beacon_broadcast_event;
+// Mutex to synchronize access to the connection status between the emulation thread and the
+// network thread.
+static std::mutex connection_status_mutex;
+
+// Mutex to synchronize access to the list of received beacons between the emulation thread and the
+// network thread.
+static std::mutex beacon_mutex;
+
+// Number of beacons to store before we start dropping the old ones.
+// TODO(Subv): Find a more accurate value for this limit.
+constexpr size_t MaxBeaconFrames = 15;
+
+// List of the last <MaxBeaconFrames> beacons received from the network.
+static std::list<Network::WifiPacket> received_beacons;
+
+/**
+ * Returns a list of received 802.11 beacon frames from the specified sender since the last call.
+ */
+std::list<Network::WifiPacket> GetReceivedBeacons(const MacAddress& sender) {
+ std::lock_guard<std::mutex> lock(beacon_mutex);
+ if (sender != Network::BroadcastMac) {
+ std::list<Network::WifiPacket> filtered_list;
+ const auto beacon = std::find_if(received_beacons.begin(), received_beacons.end(),
+ [&sender](const Network::WifiPacket& packet) {
+ return packet.transmitter_address == sender;
+ });
+ if (beacon != received_beacons.end()) {
+ filtered_list.push_back(*beacon);
+ // TODO(B3N30): Check if the complete deque is cleared or just the fetched entries
+ received_beacons.erase(beacon);
+ }
+ return filtered_list;
+ }
+ return std::move(received_beacons);
+}
+
+/// Sends a WifiPacket to the room we're currently connected to.
+void SendPacket(Network::WifiPacket& packet) {
+ // TODO(Subv): Implement.
+}
+
+/*
+ * Returns an available index in the nodes array for the
+ * currently-hosted UDS network.
+ */
+static u16 GetNextAvailableNodeId() {
+ for (u16 index = 0; index < connection_status.max_nodes; ++index) {
+ if ((connection_status.node_bitmask & (1 << index)) == 0)
+ return index;
+ }
+
+ // Any connection attempts to an already full network should have been refused.
+ ASSERT_MSG(false, "No available connection slots in the network");
+}
+
+// Inserts the received beacon frame in the beacon queue and removes any older beacons if the size
+// limit is exceeded.
+void HandleBeaconFrame(const Network::WifiPacket& packet) {
+ std::lock_guard<std::mutex> lock(beacon_mutex);
+ const auto unique_beacon =
+ std::find_if(received_beacons.begin(), received_beacons.end(),
+ [&packet](const Network::WifiPacket& new_packet) {
+ return new_packet.transmitter_address == packet.transmitter_address;
+ });
+ if (unique_beacon != received_beacons.end()) {
+ // We already have a beacon from the same mac in the deque, remove the old one;
+ received_beacons.erase(unique_beacon);
+ }
+
+ received_beacons.emplace_back(packet);
+
+ // Discard old beacons if the buffer is full.
+ if (received_beacons.size() > MaxBeaconFrames)
+ received_beacons.pop_front();
+}
+
+void HandleAssociationResponseFrame(const Network::WifiPacket& packet) {
+ auto assoc_result = GetAssociationResult(packet.data);
+
+ ASSERT_MSG(std::get<AssocStatus>(assoc_result) == AssocStatus::Successful,
+ "Could not join network");
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::Connecting));
+ }
+
+ // Send the EAPoL-Start packet to the server.
+ using Network::WifiPacket;
+ WifiPacket eapol_start;
+ eapol_start.channel = network_channel;
+ eapol_start.data = GenerateEAPoLStartFrame(std::get<u16>(assoc_result), current_node);
+ // TODO(B3N30): Encrypt the packet.
+ eapol_start.destination_address = packet.transmitter_address;
+ eapol_start.type = WifiPacket::PacketType::Data;
+
+ SendPacket(eapol_start);
+}
+
+static void HandleEAPoLPacket(const Network::WifiPacket& packet) {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ if (GetEAPoLFrameType(packet.data) == EAPoLStartMagic) {
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ auto node = DeserializeNodeInfoFromFrame(packet.data);
+
+ if (connection_status.max_nodes == connection_status.total_nodes) {
+ // Reject connection attempt
+ LOG_ERROR(Service_NWM, "Reached maximum nodes, but reject packet wasn't sent.");
+ // TODO(B3N30): Figure out what packet is sent here
+ return;
+ }
+
+ // Get an unused network node id
+ u16 node_id = GetNextAvailableNodeId();
+ node.network_node_id = node_id + 1;
+
+ connection_status.node_bitmask |= 1 << node_id;
+ connection_status.changed_nodes |= 1 << node_id;
+ connection_status.nodes[node_id] = node.network_node_id;
+ connection_status.total_nodes++;
+
+ u8 current_nodes = network_info.total_nodes;
+ node_info[current_nodes] = node;
+
+ network_info.total_nodes++;
+
+ // Send the EAPoL-Logoff packet.
+ using Network::WifiPacket;
+ WifiPacket eapol_logoff;
+ eapol_logoff.channel = network_channel;
+ eapol_logoff.data =
+ GenerateEAPoLLogoffFrame(packet.transmitter_address, node.network_node_id, node_info,
+ network_info.max_nodes, network_info.total_nodes);
+ // TODO(Subv): Encrypt the packet.
+ eapol_logoff.destination_address = packet.transmitter_address;
+ eapol_logoff.type = WifiPacket::PacketType::Data;
+
+ SendPacket(eapol_logoff);
+ // TODO(B3N30): Broadcast updated node list
+ // The 3ds does this presumably to support spectators.
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ connection_status_event->Signal();
+ } else {
+ if (connection_status.status != static_cast<u32>(NetworkStatus::NotConnected)) {
+ LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+ auto logoff = ParseEAPoLLogoffFrame(packet.data);
+
+ network_info.total_nodes = logoff.connected_nodes;
+ network_info.max_nodes = logoff.max_nodes;
+
+ connection_status.network_node_id = logoff.assigned_node_id;
+ connection_status.total_nodes = logoff.connected_nodes;
+ connection_status.max_nodes = logoff.max_nodes;
+
+ node_info.clear();
+ node_info.reserve(network_info.max_nodes);
+ for (size_t index = 0; index < logoff.connected_nodes; ++index) {
+ connection_status.node_bitmask |= 1 << index;
+ connection_status.changed_nodes |= 1 << index;
+ connection_status.nodes[index] = logoff.nodes[index].network_node_id;
+
+ node_info.emplace_back(DeserializeNodeInfo(logoff.nodes[index]));
+ }
+
+ // We're now connected, signal the application
+ connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsClient);
+ // Some games require ConnectToNetwork to block, for now it doesn't
+ // If blocking is implemented this lock needs to be changed,
+ // otherwise it might cause deadlocks
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ connection_status_event->Signal();
+ }
+}
+
+/*
+ * Start a connection sequence with an UDS server. The sequence starts by sending an 802.11
+ * authentication frame with SEQ1.
+ */
+void StartConnectionSequence(const MacAddress& server) {
+ using Network::WifiPacket;
+ WifiPacket auth_request;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::NotConnected));
+
+ // TODO(Subv): Handle timeout.
+
+ // Send an authentication frame with SEQ1
+ auth_request.channel = network_channel;
+ auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ1);
+ auth_request.destination_address = server;
+ auth_request.type = WifiPacket::PacketType::Authentication;
+ }
+
+ SendPacket(auth_request);
+}
+
+/// Sends an Association Response frame to the specified mac address
+void SendAssociationResponseFrame(const MacAddress& address) {
+ using Network::WifiPacket;
+ WifiPacket assoc_response;
+
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_ERROR(Service_NWM, "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ assoc_response.channel = network_channel;
+ // TODO(Subv): This will cause multiple clients to end up with the same association id, but
+ // we're not using that for anything.
+ u16 association_id = 1;
+ assoc_response.data = GenerateAssocResponseFrame(AssocStatus::Successful, association_id,
+ network_info.network_id);
+ assoc_response.destination_address = address;
+ assoc_response.type = WifiPacket::PacketType::AssociationResponse;
+ }
+
+ SendPacket(assoc_response);
+}
+
+/*
+ * Handles the authentication request frame and sends the authentication response and association
+ * response frames. Once an Authentication frame with SEQ1 is received by the server, it responds
+ * with an Authentication frame containing SEQ2, and immediately sends an Association response frame
+ * containing the details of the access point and the assigned association id for the new client.
+ */
+void HandleAuthenticationFrame(const Network::WifiPacket& packet) {
+ // Only the SEQ1 auth frame is handled here, the SEQ2 frame doesn't need any special behavior
+ if (GetAuthenticationSeqNumber(packet.data) == AuthenticationSeq::SEQ1) {
+ using Network::WifiPacket;
+ WifiPacket auth_request;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ LOG_ERROR(Service_NWM,
+ "Connection sequence aborted, because connection status is %u",
+ connection_status.status);
+ return;
+ }
+
+ // Respond with an authentication response frame with SEQ2
+ auth_request.channel = network_channel;
+ auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ2);
+ auth_request.destination_address = packet.transmitter_address;
+ auth_request.type = WifiPacket::PacketType::Authentication;
+ }
+ SendPacket(auth_request);
+
+ SendAssociationResponseFrame(packet.transmitter_address);
+ }
+}
+
+static void HandleDataFrame(const Network::WifiPacket& packet) {
+ switch (GetFrameEtherType(packet.data)) {
+ case EtherType::EAPoL:
+ HandleEAPoLPacket(packet);
+ break;
+ case EtherType::SecureData:
+ // TODO(B3N30): Handle SecureData packets
+ break;
+ }
+}
+
+/// Callback to parse and handle a received wifi packet.
+void OnWifiPacketReceived(const Network::WifiPacket& packet) {
+ switch (packet.type) {
+ case Network::WifiPacket::PacketType::Beacon:
+ HandleBeaconFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::Authentication:
+ HandleAuthenticationFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::AssociationResponse:
+ HandleAssociationResponseFrame(packet);
+ break;
+ case Network::WifiPacket::PacketType::Data:
+ HandleDataFrame(packet);
+ break;
+ }
+}
+
/**
* NWM_UDS::Shutdown service function
* Inputs:
@@ -111,11 +412,10 @@ static void RecvBeaconBroadcastData(Interface* self) {
u32 total_size = sizeof(BeaconDataReplyHeader);
// Retrieve all beacon frames that were received from the desired mac address.
- std::deque<WifiPacket> beacons =
- GetReceivedPackets(WifiPacket::PacketType::Beacon, mac_address);
+ auto beacons = GetReceivedBeacons(mac_address);
BeaconDataReplyHeader data_reply_header{};
- data_reply_header.total_entries = beacons.size();
+ data_reply_header.total_entries = static_cast<u32>(beacons.size());
data_reply_header.max_output_size = out_buffer_size;
Memory::WriteBlock(current_buffer_pos, &data_reply_header, sizeof(BeaconDataReplyHeader));
@@ -125,8 +425,8 @@ static void RecvBeaconBroadcastData(Interface* self) {
for (const auto& beacon : beacons) {
BeaconEntryHeader entry{};
// TODO(Subv): Figure out what this size is used for.
- entry.unk_size = sizeof(BeaconEntryHeader) + beacon.data.size();
- entry.total_size = sizeof(BeaconEntryHeader) + beacon.data.size();
+ entry.unk_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
+ entry.total_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
entry.wifi_channel = beacon.channel;
entry.header_size = sizeof(BeaconEntryHeader);
entry.mac_address = beacon.transmitter_address;
@@ -137,9 +437,9 @@ static void RecvBeaconBroadcastData(Interface* self) {
current_buffer_pos += sizeof(BeaconEntryHeader);
Memory::WriteBlock(current_buffer_pos, beacon.data.data(), beacon.data.size());
- current_buffer_pos += beacon.data.size();
+ current_buffer_pos += static_cast<VAddr>(beacon.data.size());
- total_size += sizeof(BeaconEntryHeader) + beacon.data.size();
+ total_size += static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size());
}
// Update the total size in the structure and write it to the buffer again.
@@ -174,7 +474,7 @@ static void InitializeWithVersion(Interface* self) {
u32 sharedmem_size = rp.Pop<u32>();
// Update the node information with the data the game gave us.
- rp.PopRaw(node_info[0]);
+ rp.PopRaw(current_node);
u16 version = rp.Pop<u16>();
@@ -184,15 +484,22 @@ static void InitializeWithVersion(Interface* self) {
ASSERT_MSG(recv_buffer_memory->size == sharedmem_size, "Invalid shared memory size.");
- // Reset the connection status, it contains all zeros after initialization,
- // except for the actual status value.
- connection_status = {};
- connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ // Reset the connection status, it contains all zeros after initialization,
+ // except for the actual status value.
+ connection_status = {};
+ connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ }
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
rb.Push(RESULT_SUCCESS);
rb.PushCopyHandles(Kernel::g_handle_table.Create(connection_status_event).Unwrap());
+ // TODO(Subv): Connect the OnWifiPacketReceived function to the wifi packet received callback of
+ // the room we're currently in.
+
LOG_DEBUG(Service_NWM, "called sharedmem_size=0x%08X, version=0x%08X, sharedmem_handle=0x%08X",
sharedmem_size, version, sharedmem_handle);
}
@@ -214,12 +521,16 @@ static void GetConnectionStatus(Interface* self) {
IPC::RequestBuilder rb = rp.MakeBuilder(13, 0);
rb.Push(RESULT_SUCCESS);
- rb.PushRaw(connection_status);
-
- // Reset the bitmask of changed nodes after each call to this
- // function to prevent falsely informing games of outstanding
- // changes in subsequent calls.
- connection_status.changed_nodes = 0;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ rb.PushRaw(connection_status);
+
+ // Reset the bitmask of changed nodes after each call to this
+ // function to prevent falsely informing games of outstanding
+ // changes in subsequent calls.
+ // TODO(Subv): Find exactly where the NWM module resets this value.
+ connection_status.changed_nodes = 0;
+ }
LOG_DEBUG(Service_NWM, "called");
}
@@ -300,31 +611,36 @@ static void BeginHostingNetwork(Interface* self) {
// The real UDS module throws a fatal error if this assert fails.
ASSERT_MSG(network_info.max_nodes > 1, "Trying to host a network of only one member.");
- connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost);
-
- // Ensure the application data size is less than the maximum value.
- ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize, "Data size is too big.");
-
- // Set up basic information for this network.
- network_info.oui_value = NintendoOUI;
- network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo);
-
- connection_status.max_nodes = network_info.max_nodes;
-
- // Resize the nodes list to hold max_nodes.
- node_info.resize(network_info.max_nodes);
-
- // There's currently only one node in the network (the host).
- connection_status.total_nodes = 1;
- network_info.total_nodes = 1;
- // The host is always the first node
- connection_status.network_node_id = 1;
- node_info[0].network_node_id = 1;
- connection_status.nodes[0] = connection_status.network_node_id;
- // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
- connection_status.node_bitmask |= 1;
- // Notify the application that the first node was set.
- connection_status.changed_nodes |= 1;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost);
+
+ // Ensure the application data size is less than the maximum value.
+ ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize,
+ "Data size is too big.");
+
+ // Set up basic information for this network.
+ network_info.oui_value = NintendoOUI;
+ network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo);
+
+ connection_status.max_nodes = network_info.max_nodes;
+
+ // Resize the nodes list to hold max_nodes.
+ node_info.resize(network_info.max_nodes);
+
+ // There's currently only one node in the network (the host).
+ connection_status.total_nodes = 1;
+ network_info.total_nodes = 1;
+ // The host is always the first node
+ connection_status.network_node_id = 1;
+ current_node.network_node_id = 1;
+ connection_status.nodes[0] = connection_status.network_node_id;
+ // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
+ connection_status.node_bitmask |= 1;
+ // Notify the application that the first node was set.
+ connection_status.changed_nodes |= 1;
+ node_info[0] = current_node;
+ }
// If the game has a preferred channel, use that instead.
if (network_info.channel != 0)
@@ -361,9 +677,13 @@ static void DestroyNetwork(Interface* self) {
// Unschedule the beacon broadcast event.
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
- // TODO(Subv): Check if connection_status is indeed reset after this call.
- connection_status = {};
- connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+
+ // TODO(Subv): Check if connection_status is indeed reset after this call.
+ connection_status = {};
+ connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
+ }
connection_status_event->Signal();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
@@ -406,17 +726,24 @@ static void SendTo(Interface* self) {
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
- if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) &&
- connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
- rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
- ErrorSummary::InvalidState, ErrorLevel::Status));
- return;
- }
+ u16 network_node_id;
- if (dest_node_id == connection_status.network_node_id) {
- rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS,
- ErrorSummary::WrongArgument, ErrorLevel::Status));
- return;
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) &&
+ connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) {
+ rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS,
+ ErrorSummary::InvalidState, ErrorLevel::Status));
+ return;
+ }
+
+ if (dest_node_id == connection_status.network_node_id) {
+ rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS,
+ ErrorSummary::WrongArgument, ErrorLevel::Status));
+ return;
+ }
+
+ network_node_id = connection_status.network_node_id;
}
// TODO(Subv): Do something with the flags.
@@ -433,8 +760,8 @@ static void SendTo(Interface* self) {
// TODO(Subv): Increment the sequence number after each sent packet.
u16 sequence_number = 0;
- std::vector<u8> data_payload = GenerateDataPayload(
- data, data_channel, dest_node_id, connection_status.network_node_id, sequence_number);
+ std::vector<u8> data_payload =
+ GenerateDataPayload(data, data_channel, dest_node_id, network_node_id, sequence_number);
// TODO(Subv): Retrieve the MAC address of the dest_node_id and our own to encrypt
// and encapsulate the payload.
@@ -461,6 +788,7 @@ static void GetChannel(Interface* self) {
IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
bool is_connected = connection_status.status != static_cast<u32>(NetworkStatus::NotConnected);
u8 channel = is_connected ? network_channel : 0;
@@ -610,37 +938,29 @@ static void BeaconBroadcastCallback(u64 userdata, int cycles_late) {
if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost))
return;
- // TODO(Subv): Actually send the beacon.
std::vector<u8> frame = GenerateBeaconFrame(network_info, node_info);
+ using Network::WifiPacket;
+ WifiPacket packet;
+ packet.type = WifiPacket::PacketType::Beacon;
+ packet.data = std::move(frame);
+ packet.destination_address = Network::BroadcastMac;
+ packet.channel = network_channel;
+
+ SendPacket(packet);
+
// Start broadcasting the network, send a beacon frame every 102.4ms.
CoreTiming::ScheduleEvent(msToCycles(DefaultBeaconInterval * MillisecondsPerTU) - cycles_late,
beacon_broadcast_event, 0);
}
/*
- * Returns an available index in the nodes array for the
- * currently-hosted UDS network.
- */
-static u32 GetNextAvailableNodeId() {
- ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
- "Can not accept clients if we're not hosting a network");
-
- for (unsigned index = 0; index < connection_status.max_nodes; ++index) {
- if ((connection_status.node_bitmask & (1 << index)) == 0)
- return index;
- }
-
- // Any connection attempts to an already full network should have been refused.
- ASSERT_MSG(false, "No available connection slots in the network");
-}
-
-/*
* Called when a client connects to an UDS network we're hosting,
* updates the connection status and signals the update event.
* @param network_node_id Network Node Id of the connecting client.
*/
void OnClientConnected(u16 network_node_id) {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost),
"Can not accept clients if we're not hosting a network");
ASSERT_MSG(connection_status.total_nodes < connection_status.max_nodes,
@@ -655,7 +975,7 @@ void OnClientConnected(u16 network_node_id) {
}
const Interface::FunctionInfo FunctionTable[] = {
- {0x00010442, nullptr, "Initialize (deprecated)"},
+ {0x000102C2, nullptr, "Initialize (deprecated)"},
{0x00020000, nullptr, "Scrap"},
{0x00030000, Shutdown, "Shutdown"},
{0x00040402, nullptr, "CreateNetwork (deprecated)"},
@@ -702,8 +1022,11 @@ NWM_UDS::~NWM_UDS() {
connection_status_event = nullptr;
recv_buffer_memory = nullptr;
- connection_status = {};
- connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ {
+ std::lock_guard<std::mutex> lock(connection_status_mutex);
+ connection_status = {};
+ connection_status.status = static_cast<u32>(NetworkStatus::NotConnected);
+ }
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
}
diff --git a/src/core/hle/service/nwm/nwm_uds.h b/src/core/hle/service/nwm/nwm_uds.h
index 141f49f9c..f1caaf974 100644
--- a/src/core/hle/service/nwm/nwm_uds.h
+++ b/src/core/hle/service/nwm/nwm_uds.h
@@ -42,6 +42,7 @@ using NodeList = std::vector<NodeInfo>;
enum class NetworkStatus {
NotConnected = 3,
ConnectedAsHost = 6,
+ Connecting = 7,
ConnectedAsClient = 9,
ConnectedAsSpectator = 10,
};
@@ -85,6 +86,17 @@ static_assert(offsetof(NetworkInfo, oui_value) == 0xC, "oui_value is at the wron
static_assert(offsetof(NetworkInfo, wlan_comm_id) == 0x10, "wlancommid is at the wrong offset.");
static_assert(sizeof(NetworkInfo) == 0x108, "NetworkInfo has incorrect size.");
+/// Additional block tag ids in the Beacon and Association Response frames
+enum class TagId : u8 {
+ SSID = 0,
+ SupportedRates = 1,
+ DSParameterSet = 2,
+ TrafficIndicationMap = 5,
+ CountryInformation = 7,
+ ERPInformation = 42,
+ VendorSpecific = 221
+};
+
class NWM_UDS final : public Interface {
public:
NWM_UDS();
diff --git a/src/core/hle/service/nwm/uds_beacon.cpp b/src/core/hle/service/nwm/uds_beacon.cpp
index 6332b404c..73a80d940 100644
--- a/src/core/hle/service/nwm/uds_beacon.cpp
+++ b/src/core/hle/service/nwm/uds_beacon.cpp
@@ -243,7 +243,7 @@ std::vector<u8> GenerateNintendoFirstEncryptedDataTag(const NetworkInfo& network
EncryptedDataTag tag{};
tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
- tag.header.length = sizeof(tag) - sizeof(TagHeader) + payload_size;
+ tag.header.length = static_cast<u8>(sizeof(tag) - sizeof(TagHeader) + payload_size);
tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData0);
tag.oui = NintendoOUI;
@@ -279,7 +279,7 @@ std::vector<u8> GenerateNintendoSecondEncryptedDataTag(const NetworkInfo& networ
EncryptedDataTag tag{};
tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific);
- tag.header.length = tag_length;
+ tag.header.length = static_cast<u8>(tag_length);
tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData1);
tag.oui = NintendoOUI;
@@ -325,8 +325,5 @@ std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeL
return buffer;
}
-std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender) {
- return {};
-}
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_beacon.h b/src/core/hle/service/nwm/uds_beacon.h
index caacf4c6f..50cc76da2 100644
--- a/src/core/hle/service/nwm/uds_beacon.h
+++ b/src/core/hle/service/nwm/uds_beacon.h
@@ -17,17 +17,6 @@ namespace NWM {
using MacAddress = std::array<u8, 6>;
constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32};
-/// Additional block tag ids in the Beacon frames
-enum class TagId : u8 {
- SSID = 0,
- SupportedRates = 1,
- DSParameterSet = 2,
- TrafficIndicationMap = 5,
- CountryInformation = 7,
- ERPInformation = 42,
- VendorSpecific = 221
-};
-
/**
* Internal vendor-specific tag ids as stored inside
* VendorSpecific blocks in the Beacon frames.
@@ -135,20 +124,6 @@ struct BeaconData {
static_assert(sizeof(BeaconData) == 0x12, "BeaconData has incorrect size.");
-/// Information about a received WiFi packet.
-/// Acts as our own 802.11 header.
-struct WifiPacket {
- enum class PacketType { Beacon, Data };
-
- PacketType type; ///< The type of 802.11 frame, Beacon / Data.
-
- /// Raw 802.11 frame data, starting at the management frame header for management frames.
- std::vector<u8> data;
- MacAddress transmitter_address; ///< Mac address of the transmitter.
- MacAddress destination_address; ///< Mac address of the receiver.
- u8 channel; ///< WiFi channel where this frame was transmitted.
-};
-
/**
* Decrypts the beacon data buffer for the network described by `network_info`.
*/
@@ -161,10 +136,5 @@ void DecryptBeaconData(const NetworkInfo& network_info, std::vector<u8>& buffer)
*/
std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeList& nodes);
-/**
- * Returns a list of received 802.11 frames from the specified sender
- * matching the type since the last call.
- */
-std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender);
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.cpp b/src/core/hle/service/nwm/uds_connection.cpp
new file mode 100644
index 000000000..c74f51253
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.cpp
@@ -0,0 +1,88 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/nwm/nwm_uds.h"
+#include "core/hle/service/nwm/uds_connection.h"
+#include "fmt/format.h"
+
+namespace Service {
+namespace NWM {
+
+// Note: These values were taken from a packet capture of an o3DS XL
+// broadcasting a Super Smash Bros. 4 lobby.
+constexpr u16 DefaultExtraCapabilities = 0x0431;
+
+std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq) {
+ AuthenticationFrame frame{};
+ frame.auth_seq = static_cast<u16>(seq);
+
+ std::vector<u8> data(sizeof(frame));
+ std::memcpy(data.data(), &frame, sizeof(frame));
+
+ return data;
+}
+
+AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body) {
+ AuthenticationFrame frame;
+ std::memcpy(&frame, body.data(), sizeof(frame));
+
+ return static_cast<AuthenticationSeq>(frame.auth_seq);
+}
+
+/**
+ * Generates an SSID tag of an 802.11 Beacon frame with an 8-byte character representation of the
+ * specified network id as the SSID value.
+ * @param network_id The network id to use.
+ * @returns A buffer with the SSID tag.
+ */
+static std::vector<u8> GenerateSSIDTag(u32 network_id) {
+ constexpr u8 SSIDSize = 8;
+
+ struct {
+ u8 id = static_cast<u8>(TagId::SSID);
+ u8 size = SSIDSize;
+ } tag_header;
+
+ std::vector<u8> buffer(sizeof(tag_header) + SSIDSize);
+
+ std::memcpy(buffer.data(), &tag_header, sizeof(tag_header));
+
+ std::string network_name = fmt::format("{0:08X}", network_id);
+
+ std::memcpy(buffer.data() + sizeof(tag_header), network_name.c_str(), SSIDSize);
+
+ return buffer;
+}
+
+std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id) {
+ AssociationResponseFrame frame{};
+ frame.capabilities = DefaultExtraCapabilities;
+ frame.status_code = static_cast<u16>(status);
+ // The association id is ORed with this magic value (0xC000)
+ constexpr u16 AssociationIdMagic = 0xC000;
+ frame.assoc_id = association_id | AssociationIdMagic;
+
+ std::vector<u8> data(sizeof(frame));
+ std::memcpy(data.data(), &frame, sizeof(frame));
+
+ auto ssid_tag = GenerateSSIDTag(network_id);
+ data.insert(data.end(), ssid_tag.begin(), ssid_tag.end());
+
+ // TODO(Subv): Add the SupportedRates tag.
+ // TODO(Subv): Add the DSParameterSet tag.
+ // TODO(Subv): Add the ERPInformation tag.
+ return data;
+}
+
+std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body) {
+ AssociationResponseFrame frame;
+ memcpy(&frame, body.data(), sizeof(frame));
+
+ constexpr u16 AssociationIdMask = 0x3FFF;
+ return std::make_tuple(static_cast<AssocStatus>(frame.status_code),
+ frame.assoc_id & AssociationIdMask);
+}
+
+} // namespace NWM
+} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_connection.h b/src/core/hle/service/nwm/uds_connection.h
new file mode 100644
index 000000000..a664f8471
--- /dev/null
+++ b/src/core/hle/service/nwm/uds_connection.h
@@ -0,0 +1,56 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <tuple>
+#include <vector>
+#include "common/common_types.h"
+#include "common/swap.h"
+#include "core/hle/service/service.h"
+
+namespace Service {
+namespace NWM {
+
+/// Sequence number of the 802.11 authentication frames.
+enum class AuthenticationSeq : u16 { SEQ1 = 1, SEQ2 = 2 };
+
+enum class AuthAlgorithm : u16 { OpenSystem = 0 };
+
+enum class AuthStatus : u16 { Successful = 0 };
+
+enum class AssocStatus : u16 { Successful = 0 };
+
+struct AuthenticationFrame {
+ u16_le auth_algorithm = static_cast<u16>(AuthAlgorithm::OpenSystem);
+ u16_le auth_seq;
+ u16_le status_code = static_cast<u16>(AuthStatus::Successful);
+};
+
+static_assert(sizeof(AuthenticationFrame) == 6, "AuthenticationFrame has wrong size");
+
+struct AssociationResponseFrame {
+ u16_le capabilities;
+ u16_le status_code;
+ u16_le assoc_id;
+};
+
+static_assert(sizeof(AssociationResponseFrame) == 6, "AssociationResponseFrame has wrong size");
+
+/// Generates an 802.11 authentication frame, starting at the frame body.
+std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq);
+
+/// Returns the sequence number from the body of an Authentication frame.
+AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body);
+
+/// Generates an 802.11 association response frame with the specified status, association id and
+/// network id, starting at the frame body.
+std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id);
+
+/// Returns a tuple of (association status, association id) from the body of an AssociationResponse
+/// frame.
+std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body);
+
+} // namespace NWM
+} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.cpp b/src/core/hle/service/nwm/uds_data.cpp
index 8c6742dba..4b389710f 100644
--- a/src/core/hle/service/nwm/uds_data.cpp
+++ b/src/core/hle/service/nwm/uds_data.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include <cstring>
#include <cryptopp/aes.h>
#include <cryptopp/ccm.h>
@@ -197,7 +198,7 @@ static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload
df.ChannelMessageEnd(CryptoPP::DEFAULT_CHANNEL);
df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
- int size = df.MaxRetrievable();
+ size_t size = df.MaxRetrievable();
std::vector<u8> pdata(size);
df.Get(pdata.data(), size);
@@ -251,7 +252,7 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL);
- int size = df.MaxRetrievable();
+ size_t size = df.MaxRetrievable();
std::vector<u8> cipher(size);
df.Get(cipher.data(), size);
@@ -266,13 +267,107 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload,
std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
u16 src_node, u16 sequence_number) {
std::vector<u8> buffer = GenerateLLCHeader(EtherType::SecureData);
- std::vector<u8> securedata_header =
- GenerateSecureDataHeader(data.size(), channel, dest_node, src_node, sequence_number);
+ std::vector<u8> securedata_header = GenerateSecureDataHeader(
+ static_cast<u16>(data.size()), channel, dest_node, src_node, sequence_number);
buffer.insert(buffer.end(), securedata_header.begin(), securedata_header.end());
buffer.insert(buffer.end(), data.begin(), data.end());
return buffer;
}
+std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info) {
+ EAPoLStartPacket eapol_start{};
+ eapol_start.association_id = association_id;
+ eapol_start.node.friend_code_seed = node_info.friend_code_seed;
+
+ std::copy(node_info.username.begin(), node_info.username.end(),
+ eapol_start.node.username.begin());
+
+ // Note: The network_node_id and unknown bytes seem to be uninitialized in the NWM module.
+ // TODO(B3N30): The last 8 bytes seem to have a fixed value of 07 88 15 00 04 e9 13 00 in
+ // EAPoL-Start packets from different 3DSs to the same host during a Super Smash Bros. 4 game.
+ // Find out what that means.
+
+ std::vector<u8> eapol_buffer(sizeof(EAPoLStartPacket));
+ std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start));
+
+ std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
+ buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
+ return buffer;
+}
+
+EtherType GetFrameEtherType(const std::vector<u8>& frame) {
+ LLCHeader header;
+ std::memcpy(&header, frame.data(), sizeof(header));
+
+ u16 ethertype = header.protocol;
+ return static_cast<EtherType>(ethertype);
+}
+
+u16 GetEAPoLFrameType(const std::vector<u8>& frame) {
+ // Ignore the LLC header
+ u16_be eapol_type;
+ std::memcpy(&eapol_type, frame.data() + sizeof(LLCHeader), sizeof(eapol_type));
+ return eapol_type;
+}
+
+NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame) {
+ EAPoLStartPacket eapol_start;
+
+ // Skip the LLC header
+ std::memcpy(&eapol_start, frame.data() + sizeof(LLCHeader), sizeof(eapol_start));
+
+ NodeInfo node{};
+ node.friend_code_seed = eapol_start.node.friend_code_seed;
+
+ std::copy(eapol_start.node.username.begin(), eapol_start.node.username.end(),
+ node.username.begin());
+
+ return node;
+}
+
+NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node) {
+ NodeInfo node_info{};
+ node_info.friend_code_seed = node.friend_code_seed;
+ node_info.network_node_id = node.network_node_id;
+
+ std::copy(node.username.begin(), node.username.end(), node_info.username.begin());
+
+ return node_info;
+}
+
+std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
+ const NodeList& nodes, u8 max_nodes, u8 total_nodes) {
+ EAPoLLogoffPacket eapol_logoff{};
+ eapol_logoff.assigned_node_id = network_node_id;
+ eapol_logoff.connected_nodes = total_nodes;
+ eapol_logoff.max_nodes = max_nodes;
+
+ for (size_t index = 0; index < total_nodes; ++index) {
+ const auto& node_info = nodes[index];
+ auto& node = eapol_logoff.nodes[index];
+
+ node.friend_code_seed = node_info.friend_code_seed;
+ node.network_node_id = node_info.network_node_id;
+
+ std::copy(node_info.username.begin(), node_info.username.end(), node.username.begin());
+ }
+
+ std::vector<u8> eapol_buffer(sizeof(EAPoLLogoffPacket));
+ std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff));
+
+ std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL);
+ buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end());
+ return buffer;
+}
+
+EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame) {
+ EAPoLLogoffPacket eapol_logoff;
+
+ // Skip the LLC header
+ std::memcpy(&eapol_logoff, frame.data() + sizeof(LLCHeader), sizeof(eapol_logoff));
+ return eapol_logoff;
+}
+
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/nwm/uds_data.h b/src/core/hle/service/nwm/uds_data.h
index a23520a41..76bccb1bf 100644
--- a/src/core/hle/service/nwm/uds_data.h
+++ b/src/core/hle/service/nwm/uds_data.h
@@ -8,6 +8,7 @@
#include <vector>
#include "common/common_types.h"
#include "common/swap.h"
+#include "core/hle/service/nwm/uds_beacon.h"
#include "core/hle/service/service.h"
namespace Service {
@@ -67,6 +68,49 @@ struct DataFrameCryptoCTR {
static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wrong size");
+struct EAPoLNodeInfo {
+ u64_be friend_code_seed;
+ std::array<u16_be, 10> username;
+ INSERT_PADDING_BYTES(4);
+ u16_be network_node_id;
+ INSERT_PADDING_BYTES(6);
+};
+
+static_assert(sizeof(EAPoLNodeInfo) == 0x28, "EAPoLNodeInfo has the wrong size");
+
+constexpr u16 EAPoLStartMagic = 0x201;
+
+/*
+ * Nintendo EAPoLStartPacket, is used to initaliaze a connection between client and host
+ */
+struct EAPoLStartPacket {
+ u16_be magic = EAPoLStartMagic;
+ u16_be association_id;
+ // This value is hardcoded to 1 in the NWM module.
+ u16_be unknown = 1;
+ INSERT_PADDING_BYTES(2);
+ EAPoLNodeInfo node;
+};
+
+static_assert(sizeof(EAPoLStartPacket) == 0x30, "EAPoLStartPacket has the wrong size");
+
+constexpr u16 EAPoLLogoffMagic = 0x202;
+
+struct EAPoLLogoffPacket {
+ u16_be magic = EAPoLLogoffMagic;
+ INSERT_PADDING_BYTES(2);
+ u16_be assigned_node_id;
+ MacAddress client_mac_address;
+ INSERT_PADDING_BYTES(6);
+ u8 connected_nodes;
+ u8 max_nodes;
+ INSERT_PADDING_BYTES(4);
+
+ std::array<EAPoLNodeInfo, UDSMaxNodes> nodes;
+};
+
+static_assert(sizeof(EAPoLLogoffPacket) == 0x298, "EAPoLLogoffPacket has the wrong size");
+
/**
* Generates an unencrypted 802.11 data payload.
* @returns The generated frame payload.
@@ -74,5 +118,47 @@ static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wron
std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node,
u16 src_node, u16 sequence_number);
+/*
+ * Generates an unencrypted 802.11 data frame body with the EAPoL-Start format for UDS
+ * communication.
+ * @returns The generated frame body.
+ */
+std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info);
+
+/*
+ * Returns the EtherType of the specified 802.11 frame.
+ */
+EtherType GetFrameEtherType(const std::vector<u8>& frame);
+
+/*
+ * Returns the EAPoL type (Start / Logoff) of the specified 802.11 frame.
+ * Note: The frame *must* be an EAPoL frame.
+ */
+u16 GetEAPoLFrameType(const std::vector<u8>& frame);
+
+/*
+ * Returns a deserialized NodeInfo structure from the information inside an EAPoL-Start packet
+ * encapsulated in an 802.11 data frame.
+ */
+NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame);
+
+/*
+ * Returns a NodeInfo constructed from the data in the specified EAPoLNodeInfo.
+ */
+NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node);
+
+/*
+ * Generates an unencrypted 802.11 data frame body with the EAPoL-Logoff format for UDS
+ * communication.
+ * @returns The generated frame body.
+ */
+std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id,
+ const NodeList& nodes, u8 max_nodes, u8 total_nodes);
+
+/*
+ * Returns a EAPoLLogoffPacket representing the specified 802.11-encapsulated data frame.
+ */
+EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame);
+
} // namespace NWM
} // namespace Service
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index aad950e50..f267aad74 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -38,7 +38,7 @@
#include "core/hle/service/news/news.h"
#include "core/hle/service/nfc/nfc.h"
#include "core/hle/service/nim/nim.h"
-#include "core/hle/service/ns_s.h"
+#include "core/hle/service/ns/ns.h"
#include "core/hle/service/nwm/nwm.h"
#include "core/hle/service/pm_app.h"
#include "core/hle/service/ptm/ptm.h"
@@ -215,6 +215,8 @@ void Init() {
SM::g_service_manager = std::make_shared<SM::ServiceManager>();
SM::ServiceManager::InstallInterfaces(SM::g_service_manager);
+ NS::InstallInterfaces(*SM::g_service_manager);
+
AddNamedPort(new ERR::ERR_F);
FS::ArchiveInit();
@@ -246,7 +248,6 @@ void Init() {
AddService(new HTTP::HTTP_C);
AddService(new LDR::LDR_RO);
AddService(new MIC::MIC_U);
- AddService(new NS::NS_S);
AddService(new PM::PM_APP);
AddService(new SOC::SOC_U);
AddService(new SSL::SSL_C);
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index 5e7fc68f9..854ab9a05 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -36,6 +36,10 @@ ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService
std::string name, unsigned int max_sessions) {
CASCADE_CODE(ValidateServiceName(name));
+
+ if (registered_services.find(name) != registered_services.end())
+ return ERR_ALREADY_REGISTERED;
+
Kernel::SharedPtr<Kernel::ServerPort> server_port;
Kernel::SharedPtr<Kernel::ClientPort> client_port;
std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name);
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index 8f0dbf2db..9f60a7965 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -32,6 +32,9 @@ constexpr ResultCode ERR_ACCESS_DENIED(6, ErrorModule::SRV, ErrorSummary::Invali
ErrorLevel::Permanent); // 0xD8E06406
constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument,
ErrorLevel::Permanent); // 0xD9006407
+constexpr ResultCode ERR_ALREADY_REGISTERED(ErrorDescription::AlreadyExists, ErrorModule::OS,
+ ErrorSummary::WrongArgument,
+ ErrorLevel::Permanent); // 0xD9001BFC
class ServiceManager {
public:
diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp
index 352941e69..fb873981c 100644
--- a/src/core/hle/service/sm/srv.cpp
+++ b/src/core/hle/service/sm/srv.cpp
@@ -13,6 +13,7 @@
#include "core/hle/kernel/errors.h"
#include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/semaphore.h"
+#include "core/hle/kernel/server_port.h"
#include "core/hle/kernel/server_session.h"
#include "core/hle/service/sm/sm.h"
#include "core/hle/service/sm/srv.h"
@@ -61,7 +62,7 @@ void SRV::EnableNotification(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x2, 0, 0);
notification_semaphore =
- Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap();
+ Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, 0, "SRV:Notification").Unwrap();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
rb.Push(RESULT_SUCCESS);
@@ -184,12 +185,35 @@ void SRV::PublishToSubscriber(Kernel::HLERequestContext& ctx) {
flags);
}
+void SRV::RegisterService(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp(ctx, 0x3, 4, 0);
+
+ auto name_buf = rp.PopRaw<std::array<char, 8>>();
+ size_t name_len = rp.Pop<u32>();
+ u32 max_sessions = rp.Pop<u32>();
+
+ std::string name(name_buf.data(), std::min(name_len, name_buf.size()));
+
+ auto port = service_manager->RegisterService(name, max_sessions);
+
+ if (port.Failed()) {
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
+ rb.Push(port.Code());
+ LOG_ERROR(Service_SRV, "called service=%s -> error 0x%08X", name.c_str(), port.Code().raw);
+ return;
+ }
+
+ IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
+ rb.Push(RESULT_SUCCESS);
+ rb.PushObjects(port.Unwrap());
+}
+
SRV::SRV(std::shared_ptr<ServiceManager> service_manager)
: ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) {
static const FunctionInfo functions[] = {
{0x00010002, &SRV::RegisterClient, "RegisterClient"},
{0x00020000, &SRV::EnableNotification, "EnableNotification"},
- {0x00030100, nullptr, "RegisterService"},
+ {0x00030100, &SRV::RegisterService, "RegisterService"},
{0x000400C0, nullptr, "UnregisterService"},
{0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"},
{0x000600C2, nullptr, "RegisterPort"},
diff --git a/src/core/hle/service/sm/srv.h b/src/core/hle/service/sm/srv.h
index 75cca5184..aad839563 100644
--- a/src/core/hle/service/sm/srv.h
+++ b/src/core/hle/service/sm/srv.h
@@ -28,6 +28,7 @@ private:
void Subscribe(Kernel::HLERequestContext& ctx);
void Unsubscribe(Kernel::HLERequestContext& ctx);
void PublishToSubscriber(Kernel::HLERequestContext& ctx);
+ void RegisterService(Kernel::HLERequestContext& ctx);
std::shared_ptr<ServiceManager> service_manager;
Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore;
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 6838e449c..d1bfe51e6 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -29,7 +29,7 @@ namespace GPU {
Regs g_regs;
/// 268MHz CPU clocks / 60Hz frames per second
-const u64 frame_ticks = BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE;
+const u64 frame_ticks = static_cast<u64>(BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE);
/// Event id for CoreTiming
static int vblank_event;
@@ -515,15 +515,15 @@ template void Write<u8>(u32 addr, const u8 data);
/// Update hardware
static void VBlankCallback(u64 userdata, int cycles_late) {
- VideoCore::g_renderer->SwapBuffers();
-
- // Signal to GSP that GPU interrupt has occurred
- // TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub
- // screen, or if both use the same interrupts and these two instead determine the
- // beginning and end of the VBlank period. If needed, split the interrupt firing into
- // two different intervals.
- Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0);
- Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1);
+ //VideoCore::g_renderer->SwapBuffers();
+
+ //// Signal to GSP that GPU interrupt has occurred
+ //// TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub
+ //// screen, or if both use the same interrupts and these two instead determine the
+ //// beginning and end of the VBlank period. If needed, split the interrupt firing into
+ //// two different intervals.
+ //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0);
+ //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1);
// Reschedule recurrent event
CoreTiming::ScheduleEvent(frame_ticks - cycles_late, vblank_event);
diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h
index 21b127fee..e3d0a0e08 100644
--- a/src/core/hw/gpu.h
+++ b/src/core/hw/gpu.h
@@ -74,9 +74,9 @@ struct Regs {
case PixelFormat::RGB5A1:
case PixelFormat::RGBA4:
return 2;
- default:
- UNIMPLEMENTED();
}
+
+ UNREACHABLE();
}
INSERT_PADDING_WORDS(0x4);
diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp
index 209328347..7b0342cc9 100644
--- a/src/core/loader/3dsx.cpp
+++ b/src/core/loader/3dsx.cpp
@@ -91,8 +91,8 @@ static u32 TranslateAddr(u32 addr, const THREEloadinfo* loadinfo, u32* offsets)
return loadinfo->seg_addrs[2] + addr - offsets[1];
}
-using Kernel::SharedPtr;
using Kernel::CodeSet;
+using Kernel::SharedPtr;
static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr,
SharedPtr<CodeSet>* out_codeset) {
@@ -255,7 +255,7 @@ FileType AppLoader_THREEDSX::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
-ResultStatus AppLoader_THREEDSX::Load() {
+ResultStatus AppLoader_THREEDSX::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
@@ -267,19 +267,17 @@ ResultStatus AppLoader_THREEDSX::Load() {
return ResultStatus::Error;
codeset->name = filename;
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
// Attach the default resource limit (APPLICATION) to the process
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
+ process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
- Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
-
- Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this),
- Service::FS::ArchiveIdCode::SelfNCCH);
+ Service::FS::RegisterSelfNCCH(*this);
is_loaded = true;
return ResultStatus::Success;
diff --git a/src/core/loader/3dsx.h b/src/core/loader/3dsx.h
index 3f376778a..1e59bbb9d 100644
--- a/src/core/loader/3dsx.h
+++ b/src/core/loader/3dsx.h
@@ -31,7 +31,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
ResultStatus ReadIcon(std::vector<u8>& buffer) override;
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 2efc67ff8..9969a8c39 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -13,8 +13,8 @@
#include "core/loader/elf.h"
#include "core/memory.h"
-using Kernel::SharedPtr;
using Kernel::CodeSet;
+using Kernel::SharedPtr;
////////////////////////////////////////////////////////////////////////////////////////////////////
// ELF Header Constants
@@ -382,7 +382,7 @@ FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
-ResultStatus AppLoader_ELF::Load() {
+ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
@@ -401,16 +401,16 @@ ResultStatus AppLoader_ELF::Load() {
SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR);
codeset->name = filename;
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
// Attach the default resource limit (APPLICATION) to the process
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE);
is_loaded = true;
return ResultStatus::Success;
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index 862aa90d8..113da5917 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -30,7 +30,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
std::string filename;
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index ac26f31fa..311785d05 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -13,10 +13,12 @@
#include <boost/optional.hpp>
#include "common/common_types.h"
#include "common/file_util.h"
+#include "core/hle/kernel/kernel.h"
namespace Kernel {
struct AddressMapping;
-}
+class Process;
+} // namespace Kernel
////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
@@ -94,10 +96,11 @@ public:
virtual FileType GetFileType() = 0;
/**
- * Load the application
- * @return ResultStatus result of function
+ * Load the application and return the created Process instance
+ * @param process The newly created process.
+ * @return The status result of the operation.
*/
- virtual ResultStatus Load() = 0;
+ virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0;
/**
* Loads the system mode that this application needs.
@@ -168,6 +171,28 @@ public:
return ResultStatus::ErrorNotImplemented;
}
+ /**
+ * Get the update RomFS of the application
+ * Since the RomFS can be huge, we return a file reference instead of copying to a buffer
+ * @param romfs_file The file containing the RomFS
+ * @param offset The offset the romfs begins on
+ * @param size The size of the romfs
+ * @return ResultStatus result of function
+ */
+ virtual ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size) {
+ return ResultStatus::ErrorNotImplemented;
+ }
+
+ /**
+ * Get the title of the application
+ * @param title Reference to store the application title into
+ * @return ResultStatus result of function
+ */
+ virtual ResultStatus ReadTitle(std::string& title) {
+ return ResultStatus::ErrorNotImplemented;
+ }
+
protected:
FileUtil::IOFile file;
bool is_loaded = false;
@@ -186,4 +211,4 @@ extern const std::initializer_list<Kernel::AddressMapping> default_address_mappi
*/
std::unique_ptr<AppLoader> GetLoader(const std::string& filename);
-} // namespace
+} // namespace Loader
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index 728886ea8..e33a37b2e 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -4,13 +4,17 @@
#include <algorithm>
#include <cinttypes>
+#include <codecvt>
#include <cstring>
+#include <locale>
#include <memory>
#include "common/logging/log.h"
#include "common/string_util.h"
#include "common/swap.h"
#include "core/core.h"
#include "core/file_sys/archive_selfncch.h"
+#include "core/file_sys/ncch_container.h"
+#include "core/file_sys/title_metadata.h"
#include "core/hle/kernel/process.h"
#include "core/hle/kernel/resource_limit.h"
#include "core/hle/service/cfg/cfg.h"
@@ -18,93 +22,14 @@
#include "core/loader/ncch.h"
#include "core/loader/smdh.h"
#include "core/memory.h"
+#include "network/network.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
namespace Loader {
-static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs
-static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes)
-
-/**
- * Get the decompressed size of an LZSS compressed ExeFS file
- * @param buffer Buffer of compressed file
- * @param size Size of compressed buffer
- * @return Size of decompressed buffer
- */
-static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) {
- u32 offset_size = *(u32*)(buffer + size - 4);
- return offset_size + size;
-}
-
-/**
- * Decompress ExeFS file (compressed with LZSS)
- * @param compressed Compressed buffer
- * @param compressed_size Size of compressed buffer
- * @param decompressed Decompressed buffer
- * @param decompressed_size Size of decompressed buffer
- * @return True on success, otherwise false
- */
-static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed,
- u32 decompressed_size) {
- const u8* footer = compressed + compressed_size - 8;
- u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer);
- u32 out = decompressed_size;
- u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
- u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
-
- memset(decompressed, 0, decompressed_size);
- memcpy(decompressed, compressed, compressed_size);
-
- while (index > stop_index) {
- u8 control = compressed[--index];
-
- for (unsigned i = 0; i < 8; i++) {
- if (index <= stop_index)
- break;
- if (index <= 0)
- break;
- if (out <= 0)
- break;
-
- if (control & 0x80) {
- // Check if compression is out of bounds
- if (index < 2)
- return false;
- index -= 2;
-
- u32 segment_offset = compressed[index] | (compressed[index + 1] << 8);
- u32 segment_size = ((segment_offset >> 12) & 15) + 3;
- segment_offset &= 0x0FFF;
- segment_offset += 2;
-
- // Check if compression is out of bounds
- if (out < segment_size)
- return false;
-
- for (unsigned j = 0; j < segment_size; j++) {
- // Check if compression is out of bounds
- if (out + segment_offset >= decompressed_size)
- return false;
-
- u8 data = decompressed[out + segment_offset];
- decompressed[--out] = data;
- }
- } else {
- // Check if compression is out of bounds
- if (out < 1)
- return false;
- decompressed[--out] = compressed[--index];
- }
- control <<= 1;
- }
- }
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// AppLoader_NCCH class
+static const u64 UPDATE_MASK = 0x0000000e00000000;
FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
u32 magic;
@@ -121,203 +46,105 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
return FileType::Error;
}
+static std::string GetUpdateNCCHPath(u64_le program_id) {
+ u32 high = static_cast<u32>((program_id | UPDATE_MASK) >> 32);
+ u32 low = static_cast<u32>((program_id | UPDATE_MASK) & 0xFFFFFFFF);
+
+ // TODO(shinyquagsire23): Title database should be doing this path lookup
+ std::string content_path = Common::StringFromFormat(
+ "%sNintendo 3DS/%s/%s/title/%08x/%08x/content/", FileUtil::GetUserPath(D_SDMC_IDX).c_str(),
+ SYSTEM_ID, SDCARD_ID, high, low);
+ std::string tmd_path = content_path + "00000000.tmd";
+
+ u32 content_id = 0;
+ FileSys::TitleMetadata tmd(tmd_path);
+ if (tmd.Load() == ResultStatus::Success) {
+ content_id = tmd.GetBootContentID();
+ }
+
+ return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id);
+}
+
std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() {
if (!is_loaded) {
- ResultStatus res = LoadExeFS();
+ ResultStatus res = base_ncch.Load();
if (res != ResultStatus::Success) {
return std::make_pair(boost::none, res);
}
}
+
// Set the system mode as the one from the exheader.
- return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(),
+ return std::make_pair(overlay_ncch->exheader_header.arm11_system_local_caps.system_mode.Value(),
ResultStatus::Success);
}
-ResultStatus AppLoader_NCCH::LoadExec() {
- using Kernel::SharedPtr;
+ResultStatus AppLoader_NCCH::LoadExec(Kernel::SharedPtr<Kernel::Process>& process) {
using Kernel::CodeSet;
+ using Kernel::SharedPtr;
if (!is_loaded)
return ResultStatus::ErrorNotLoaded;
std::vector<u8> code;
- if (ResultStatus::Success == ReadCode(code)) {
+ u64_le program_id;
+ if (ResultStatus::Success == ReadCode(code) &&
+ ResultStatus::Success == ReadProgramId(program_id)) {
std::string process_name = Common::StringFromFixedZeroTerminatedBuffer(
- (const char*)exheader_header.codeset_info.name, 8);
+ (const char*)overlay_ncch->exheader_header.codeset_info.name, 8);
- SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, ncch_header.program_id);
+ SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, program_id);
codeset->code.offset = 0;
- codeset->code.addr = exheader_header.codeset_info.text.address;
- codeset->code.size = exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE;
+ codeset->code.addr = overlay_ncch->exheader_header.codeset_info.text.address;
+ codeset->code.size =
+ overlay_ncch->exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE;
codeset->rodata.offset = codeset->code.offset + codeset->code.size;
- codeset->rodata.addr = exheader_header.codeset_info.ro.address;
- codeset->rodata.size = exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE;
+ codeset->rodata.addr = overlay_ncch->exheader_header.codeset_info.ro.address;
+ codeset->rodata.size =
+ overlay_ncch->exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE;
// TODO(yuriks): Not sure if the bss size is added to the page-aligned .data size or just
// to the regular size. Playing it safe for now.
- u32 bss_page_size = (exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF;
+ u32 bss_page_size = (overlay_ncch->exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF;
code.resize(code.size() + bss_page_size, 0);
codeset->data.offset = codeset->rodata.offset + codeset->rodata.size;
- codeset->data.addr = exheader_header.codeset_info.data.address;
+ codeset->data.addr = overlay_ncch->exheader_header.codeset_info.data.address;
codeset->data.size =
- exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE + bss_page_size;
+ overlay_ncch->exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE +
+ bss_page_size;
codeset->entrypoint = codeset->code.addr;
codeset->memory = std::make_shared<std::vector<u8>>(std::move(code));
- Kernel::g_current_process = Kernel::Process::Create("main");
- Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint);
+ process = Kernel::Process::Create("main");
+ process->LoadModule(codeset, codeset->entrypoint);
// Attach a resource limit to the process based on the resource limit category
- Kernel::g_current_process->resource_limit =
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(static_cast<Kernel::ResourceLimitCategory>(
- exheader_header.arm11_system_local_caps.resource_limit_category));
+ overlay_ncch->exheader_header.arm11_system_local_caps.resource_limit_category));
// Set the default CPU core for this process
- Kernel::g_current_process->ideal_processor =
- exheader_header.arm11_system_local_caps.ideal_processor;
+ process->ideal_processor =
+ overlay_ncch->exheader_header.arm11_system_local_caps.ideal_processor;
// Copy data while converting endianness
- std::array<u32, ARRAY_SIZE(exheader_header.arm11_kernel_caps.descriptors)> kernel_caps;
- std::copy_n(exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(),
+ std::array<u32, ARRAY_SIZE(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors)>
+ kernel_caps;
+ std::copy_n(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(),
begin(kernel_caps));
- Kernel::g_current_process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size());
+ process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size());
- s32 priority = exheader_header.arm11_system_local_caps.priority;
- u32 stack_size = exheader_header.codeset_info.stack_size;
- Kernel::g_current_process->Run(codeset->entrypoint, priority, stack_size);
+ s32 priority = overlay_ncch->exheader_header.arm11_system_local_caps.priority;
+ u32 stack_size = overlay_ncch->exheader_header.codeset_info.stack_size;
+ process->Run(codeset->entrypoint, priority, stack_size);
return ResultStatus::Success;
}
return ResultStatus::Error;
}
-ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) {
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- ResultStatus result = LoadExeFS();
- if (result != ResultStatus::Success)
- return result;
-
- LOG_DEBUG(Loader, "%d sections:", kMaxSections);
- // Iterate through the ExeFs archive until we find a section with the specified name...
- for (unsigned section_number = 0; section_number < kMaxSections; section_number++) {
- const auto& section = exefs_header.section[section_number];
-
- // Load the specified section...
- if (strcmp(section.name, name) == 0) {
- LOG_DEBUG(Loader, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number,
- section.offset, section.size, section.name);
-
- s64 section_offset =
- (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset);
- file.Seek(section_offset, SEEK_SET);
-
- if (strcmp(section.name, ".code") == 0 && is_compressed) {
- // Section is compressed, read compressed .code section...
- std::unique_ptr<u8[]> temp_buffer;
- try {
- temp_buffer.reset(new u8[section.size]);
- } catch (std::bad_alloc&) {
- return ResultStatus::ErrorMemoryAllocationFailed;
- }
-
- if (file.ReadBytes(&temp_buffer[0], section.size) != section.size)
- return ResultStatus::Error;
-
- // Decompress .code section...
- u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size);
- buffer.resize(decompressed_size);
- if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size))
- return ResultStatus::ErrorInvalidFormat;
- } else {
- // Section is uncompressed...
- buffer.resize(section.size);
- if (file.ReadBytes(&buffer[0], section.size) != section.size)
- return ResultStatus::Error;
- }
- return ResultStatus::Success;
- }
- }
- return ResultStatus::ErrorNotUsed;
-}
-
-ResultStatus AppLoader_NCCH::LoadExeFS() {
- if (is_exefs_loaded)
- return ResultStatus::Success;
-
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- // Reset read pointer in case this file has been read before.
- file.Seek(0, SEEK_SET);
-
- if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header))
- return ResultStatus::Error;
-
- // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
- if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
- LOG_DEBUG(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
- ncch_offset = 0x4000;
- file.Seek(ncch_offset, SEEK_SET);
- file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
- }
-
- // Verify we are loading the correct file type...
- if (MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic)
- return ResultStatus::ErrorInvalidFormat;
-
- // Read ExHeader...
-
- if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) != sizeof(ExHeader_Header))
- return ResultStatus::Error;
-
- is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1;
- entry_point = exheader_header.codeset_info.text.address;
- code_size = exheader_header.codeset_info.text.code_size;
- stack_size = exheader_header.codeset_info.stack_size;
- bss_size = exheader_header.codeset_info.bss_size;
- core_version = exheader_header.arm11_system_local_caps.core_version;
- priority = exheader_header.arm11_system_local_caps.priority;
- resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category;
-
- LOG_DEBUG(Loader, "Name: %s", exheader_header.codeset_info.name);
- LOG_DEBUG(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
- LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no");
- LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point);
- LOG_DEBUG(Loader, "Code size: 0x%08X", code_size);
- LOG_DEBUG(Loader, "Stack size: 0x%08X", stack_size);
- LOG_DEBUG(Loader, "Bss size: 0x%08X", bss_size);
- LOG_DEBUG(Loader, "Core version: %d", core_version);
- LOG_DEBUG(Loader, "Thread priority: 0x%X", priority);
- LOG_DEBUG(Loader, "Resource limit category: %d", resource_limit_category);
- LOG_DEBUG(Loader, "System Mode: %d",
- static_cast<int>(exheader_header.arm11_system_local_caps.system_mode));
-
- if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) {
- LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted.");
- return ResultStatus::ErrorEncrypted;
- }
-
- // Read ExeFS...
-
- exefs_offset = ncch_header.exefs_offset * kBlockSize;
- u32 exefs_size = ncch_header.exefs_size * kBlockSize;
-
- LOG_DEBUG(Loader, "ExeFS offset: 0x%08X", exefs_offset);
- LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size);
-
- file.Seek(exefs_offset + ncch_offset, SEEK_SET);
- if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header))
- return ResultStatus::Error;
-
- is_exefs_loaded = true;
- return ResultStatus::Success;
-}
-
void AppLoader_NCCH::ParseRegionLockoutInfo() {
std::vector<u8> smdh_buffer;
if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) {
@@ -335,28 +162,43 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() {
}
}
-ResultStatus AppLoader_NCCH::Load() {
+ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr<Kernel::Process>& process) {
+ u64_le ncch_program_id;
+
if (is_loaded)
return ResultStatus::ErrorAlreadyLoaded;
- ResultStatus result = LoadExeFS();
+ ResultStatus result = base_ncch.Load();
if (result != ResultStatus::Success)
return result;
- std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)};
+ ReadProgramId(ncch_program_id);
+ std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_program_id)};
LOG_INFO(Loader, "Program ID: %s", program_id.c_str());
+ update_ncch.OpenFile(GetUpdateNCCHPath(ncch_program_id));
+ result = update_ncch.Load();
+ if (result == ResultStatus::Success) {
+ overlay_ncch = &update_ncch;
+ }
+
Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id);
+ if (auto room_member = Network::GetRoomMember().lock()) {
+ Network::GameInfo game_info;
+ ReadTitle(game_info.name);
+ game_info.id = ncch_program_id;
+ room_member->SendGameInfo(game_info);
+ }
+
is_loaded = true; // Set state to loaded
- result = LoadExec(); // Load the executable into memory for booting
+ result = LoadExec(process); // Load the executable into memory for booting
if (ResultStatus::Success != result)
return result;
- Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this),
- Service::FS::ArchiveIdCode::SelfNCCH);
+ Service::FS::RegisterSelfNCCH(*this);
ParseRegionLockoutInfo();
@@ -364,61 +206,58 @@ ResultStatus AppLoader_NCCH::Load() {
}
ResultStatus AppLoader_NCCH::ReadCode(std::vector<u8>& buffer) {
- return LoadSectionExeFS(".code", buffer);
+ return overlay_ncch->LoadSectionExeFS(".code", buffer);
}
ResultStatus AppLoader_NCCH::ReadIcon(std::vector<u8>& buffer) {
- return LoadSectionExeFS("icon", buffer);
+ return overlay_ncch->LoadSectionExeFS("icon", buffer);
}
ResultStatus AppLoader_NCCH::ReadBanner(std::vector<u8>& buffer) {
- return LoadSectionExeFS("banner", buffer);
+ return overlay_ncch->LoadSectionExeFS("banner", buffer);
}
ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) {
- return LoadSectionExeFS("logo", buffer);
+ return overlay_ncch->LoadSectionExeFS("logo", buffer);
}
ResultStatus AppLoader_NCCH::ReadProgramId(u64& out_program_id) {
- if (!file.IsOpen())
- return ResultStatus::Error;
-
- ResultStatus result = LoadExeFS();
+ ResultStatus result = base_ncch.ReadProgramId(out_program_id);
if (result != ResultStatus::Success)
return result;
- out_program_id = ncch_header.program_id;
return ResultStatus::Success;
}
ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
u64& size) {
- if (!file.IsOpen())
- return ResultStatus::Error;
+ return base_ncch.ReadRomFS(romfs_file, offset, size);
+}
- // Check if the NCCH has a RomFS...
- if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0) {
- u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000;
- u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000;
+ResultStatus AppLoader_NCCH::ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file,
+ u64& offset, u64& size) {
+ ResultStatus result = update_ncch.ReadRomFS(romfs_file, offset, size);
- LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset);
- LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size);
+ if (result != ResultStatus::Success)
+ return base_ncch.ReadRomFS(romfs_file, offset, size);
+}
- if (file.GetSize() < romfs_offset + romfs_size)
- return ResultStatus::Error;
+ResultStatus AppLoader_NCCH::ReadTitle(std::string& title) {
+ std::vector<u8> data;
+ Loader::SMDH smdh;
+ ReadIcon(data);
- // We reopen the file, to allow its position to be independent from file's
- romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb");
- if (!romfs_file->IsOpen())
- return ResultStatus::Error;
+ if (!Loader::IsValidSMDH(data)) {
+ return ResultStatus::ErrorInvalidFormat;
+ }
- offset = romfs_offset;
- size = romfs_size;
+ memcpy(&smdh, data.data(), sizeof(Loader::SMDH));
- return ResultStatus::Success;
- }
- LOG_DEBUG(Loader, "NCCH has no RomFS");
- return ResultStatus::ErrorNotUsed;
+ const auto& short_title = smdh.GetShortTitle(SMDH::TitleLanguage::English);
+ auto title_end = std::find(short_title.begin(), short_title.end(), u'\0');
+ title = Common::UTF16ToUTF8(std::u16string{short_title.begin(), title_end});
+
+ return ResultStatus::Success;
}
} // namespace Loader
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index 0ebd47fd5..09230ae33 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -5,155 +5,12 @@
#pragma once
#include <memory>
-#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/swap.h"
+#include "core/file_sys/ncch_container.h"
#include "core/loader/loader.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
-/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym)
-
-struct NCCH_Header {
- u8 signature[0x100];
- u32_le magic;
- u32_le content_size;
- u8 partition_id[8];
- u16_le maker_code;
- u16_le version;
- u8 reserved_0[4];
- u64_le program_id;
- u8 reserved_1[0x10];
- u8 logo_region_hash[0x20];
- u8 product_code[0x10];
- u8 extended_header_hash[0x20];
- u32_le extended_header_size;
- u8 reserved_2[4];
- u8 flags[8];
- u32_le plain_region_offset;
- u32_le plain_region_size;
- u32_le logo_region_offset;
- u32_le logo_region_size;
- u32_le exefs_offset;
- u32_le exefs_size;
- u32_le exefs_hash_region_size;
- u8 reserved_3[4];
- u32_le romfs_offset;
- u32_le romfs_size;
- u32_le romfs_hash_region_size;
- u8 reserved_4[4];
- u8 exefs_super_block_hash[0x20];
- u8 romfs_super_block_hash[0x20];
-};
-
-static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong");
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ExeFS (executable file system) headers
-
-struct ExeFs_SectionHeader {
- char name[8];
- u32 offset;
- u32 size;
-};
-
-struct ExeFs_Header {
- ExeFs_SectionHeader section[8];
- u8 reserved[0x80];
- u8 hashes[8][0x20];
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// ExHeader (executable file system header) headers
-
-struct ExHeader_SystemInfoFlags {
- u8 reserved[5];
- u8 flag;
- u8 remaster_version[2];
-};
-
-struct ExHeader_CodeSegmentInfo {
- u32 address;
- u32 num_max_pages;
- u32 code_size;
-};
-
-struct ExHeader_CodeSetInfo {
- u8 name[8];
- ExHeader_SystemInfoFlags flags;
- ExHeader_CodeSegmentInfo text;
- u32 stack_size;
- ExHeader_CodeSegmentInfo ro;
- u8 reserved[4];
- ExHeader_CodeSegmentInfo data;
- u32 bss_size;
-};
-
-struct ExHeader_DependencyList {
- u8 program_id[0x30][8];
-};
-
-struct ExHeader_SystemInfo {
- u64 save_data_size;
- u8 jump_id[8];
- u8 reserved_2[0x30];
-};
-
-struct ExHeader_StorageInfo {
- u8 ext_save_data_id[8];
- u8 system_save_data_id[8];
- u8 reserved[8];
- u8 access_info[7];
- u8 other_attributes;
-};
-
-struct ExHeader_ARM11_SystemLocalCaps {
- u64_le program_id;
- u32_le core_version;
- u8 reserved_flags[2];
- union {
- u8 flags0;
- BitField<0, 2, u8> ideal_processor;
- BitField<2, 2, u8> affinity_mask;
- BitField<4, 4, u8> system_mode;
- };
- u8 priority;
- u8 resource_limit_descriptor[0x10][2];
- ExHeader_StorageInfo storage_info;
- u8 service_access_control[0x20][8];
- u8 ex_service_access_control[0x2][8];
- u8 reserved[0xf];
- u8 resource_limit_category;
-};
-
-struct ExHeader_ARM11_KernelCaps {
- u32_le descriptors[28];
- u8 reserved[0x10];
-};
-
-struct ExHeader_ARM9_AccessControl {
- u8 descriptors[15];
- u8 descversion;
-};
-
-struct ExHeader_Header {
- ExHeader_CodeSetInfo codeset_info;
- ExHeader_DependencyList dependency_list;
- ExHeader_SystemInfo system_info;
- ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
- ExHeader_ARM11_KernelCaps arm11_kernel_caps;
- ExHeader_ARM9_AccessControl arm9_access_control;
- struct {
- u8 signature[0x100];
- u8 ncch_public_key_modulus[0x100];
- ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps;
- ExHeader_ARM11_KernelCaps arm11_kernel_caps;
- ExHeader_ARM9_AccessControl arm9_access_control;
- } access_desc;
-};
-
-static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong");
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
// Loader namespace
namespace Loader {
@@ -162,7 +19,8 @@ namespace Loader {
class AppLoader_NCCH final : public AppLoader {
public:
AppLoader_NCCH(FileUtil::IOFile&& file, const std::string& filepath)
- : AppLoader(std::move(file)), filepath(filepath) {}
+ : AppLoader(std::move(file)), filepath(filepath), base_ncch(filepath),
+ overlay_ncch(&base_ncch) {}
/**
* Returns the type of the file
@@ -175,7 +33,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
/**
* Loads the Exheader and returns the system mode for this application.
@@ -191,63 +49,30 @@ public:
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
- /**
- * Get the program id of the application
- * @param out_program_id Reference to store program id into
- * @return ResultStatus result of function
- */
ResultStatus ReadProgramId(u64& out_program_id) override;
- /**
- * Get the RomFS of the application
- * @param romfs_file Reference to buffer to store data
- * @param offset Offset in the file to the RomFS
- * @param size Size of the RomFS in bytes
- * @return ResultStatus result of function
- */
ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
u64& size) override;
-private:
- /**
- * Reads an application ExeFS section of an NCCH file into AppLoader (e.g. .code, .logo, etc.)
- * @param name Name of section to read out of NCCH file
- * @param buffer Vector to read data into
- * @return ResultStatus result of function
- */
- ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer);
+ ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset,
+ u64& size) override;
- /**
- * Loads .code section into memory for booting
- * @return ResultStatus result of function
- */
- ResultStatus LoadExec();
+ ResultStatus ReadTitle(std::string& title) override;
+private:
/**
- * Ensure ExeFS is loaded and ready for reading sections
+ * Loads .code section into memory for booting
+ * @param process The newly created process
* @return ResultStatus result of function
*/
- ResultStatus LoadExeFS();
+ ResultStatus LoadExec(Kernel::SharedPtr<Kernel::Process>& process);
/// Reads the region lockout info in the SMDH and send it to CFG service
void ParseRegionLockoutInfo();
- bool is_exefs_loaded = false;
- bool is_compressed = false;
-
- u32 entry_point = 0;
- u32 code_size = 0;
- u32 stack_size = 0;
- u32 bss_size = 0;
- u32 core_version = 0;
- u8 priority = 0;
- u8 resource_limit_category = 0;
- u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header
- u32 exefs_offset = 0;
-
- NCCH_Header ncch_header;
- ExeFs_Header exefs_header;
- ExHeader_Header exheader_header;
+ FileSys::NCCHContainer base_ncch;
+ FileSys::NCCHContainer update_ncch;
+ FileSys::NCCHContainer* overlay_ncch;
std::string filepath;
};
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 753e7e08b..24c2c55a9 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -132,7 +132,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) {
return true;
}
-ResultStatus AppLoader_NRO::Load() {
+ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded) {
return ResultStatus::ErrorAlreadyLoaded;
}
@@ -142,16 +142,16 @@ ResultStatus AppLoader_NRO::Load() {
// Load and relocate "main" and "sdk" NSO
static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
- Kernel::g_current_process = Kernel::Process::Create("main");
+ process = Kernel::Process::Create("main");
if (!LoadNro(filepath, base_addr)) {
return ResultStatus::ErrorInvalidFormat;
}
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
- Kernel::g_current_process->resource_limit =
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
ResolveImports();
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h
index c3c7622fd..c85768c5b 100644
--- a/src/core/loader/nro.h
+++ b/src/core/loader/nro.h
@@ -31,7 +31,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
bool LoadNro(const std::string& path, VAddr load_base);
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index ac8d12ecc..b1b57d0c0 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo
return load_base + image_size;
}
-ResultStatus AppLoader_NSO::Load() {
+ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
if (is_loaded) {
return ResultStatus::ErrorAlreadyLoaded;
}
@@ -154,7 +154,7 @@ ResultStatus AppLoader_NSO::Load() {
// Load and relocate "rtld" NSO
static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR};
- Kernel::g_current_process = Kernel::Process::Create("main");
+ process = Kernel::Process::Create("main");
VAddr next_base_addr{LoadNso(filepath, base_addr)};
if (!next_base_addr) {
return ResultStatus::ErrorInvalidFormat;
@@ -170,11 +170,11 @@ ResultStatus AppLoader_NSO::Load() {
}
}
- Kernel::g_current_process->svc_access_mask.set();
- Kernel::g_current_process->address_mappings = default_address_mappings;
- Kernel::g_current_process->resource_limit =
+ process->svc_access_mask.set();
+ process->address_mappings = default_address_mappings;
+ process->resource_limit =
Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
- Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
+ process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE);
ResolveImports();
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index c29803d81..b6b86c209 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -32,7 +32,7 @@ public:
return IdentifyType(file);
}
- ResultStatus Load() override;
+ ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override;
private:
VAddr LoadNso(const std::string& path, VAddr load_base, bool relocate = false);
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index ebe16b030..462d68386 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -4,95 +4,53 @@
#include <array>
#include <cstring>
+#include "audio_core/audio_core.h"
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/swap.h"
+#include "core/arm/arm_interface.h"
+#include "core/core.h"
+#include "core/hle/kernel/memory.h"
#include "core/hle/kernel/process.h"
+#include "core/hle/lock.h"
#include "core/memory.h"
#include "core/memory_setup.h"
-#include "core/mmio.h"
#include "video_core/renderer_base.h"
#include "video_core/video_core.h"
namespace Memory {
-enum class PageType {
- /// Page is unmapped and should cause an access error.
- Unmapped,
- /// Page is mapped to regular memory. This is the only type you can get pointers to.
- Memory,
- /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
- /// invalidation
- RasterizerCachedMemory,
- /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
- Special,
- /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
- /// invalidation
- RasterizerCachedSpecial,
-};
-
-struct SpecialRegion {
- VAddr base;
- u64 size;
- MMIORegionPointer handler;
-};
+static std::array<u8, Memory::VRAM_SIZE> vram;
+static std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram;
-/**
- * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely
- * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and
- * fetching requirements when accessing. In the usual case of an access to regular memory, it only
- * requires an indexed fetch and a check for NULL.
- */
-struct PageTable {
- /**
- * Array of memory pointers backing each page. An entry can only be non-null if the
- * corresponding entry in the `attributes` array is of type `Memory`.
- */
- std::map<u64, u8*> pointers;
-
- /**
- * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
- * type `Special`.
- */
- std::vector<SpecialRegion> special_regions;
-
- /**
- * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
- * the corresponding entry in `pointers` MUST be set to null.
- */
- std::map<u64, PageType> attributes;
-
- /**
- * Indicates the number of externally cached resources touching a page that should be
- * flushed before the memory is accessed
- */
- std::map<u64, u8> cached_res_count;
-};
-
-/// Singular page table used for the singleton process
-static PageTable main_page_table;
-/// Currently active page table
-static PageTable* current_page_table = &main_page_table;
-
-//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers() {
-// return &current_page_table->pointers;
-//}
-
-static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
+static PageTable* current_page_table = nullptr;
+
+void SetCurrentPageTable(PageTable* page_table) {
+ current_page_table = page_table;
+ if (Core::System::GetInstance().IsPoweredOn()) {
+ Core::CPU().PageTableChanged();
+ }
+}
+
+PageTable* GetCurrentPageTable() {
+ return current_page_table;
+}
+
+static void MapPages(PageTable& page_table, VAddr base, u32 size, u8* memory, PageType type) {
LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE,
(base + size) * PAGE_SIZE);
RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE,
FlushMode::FlushAndInvalidate);
- u64 end = base + size;
+ VAddr end = base + size;
while (base != end) {
ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %08X", base);
- current_page_table->attributes[base] = type;
- current_page_table->pointers[base] = memory;
- current_page_table->cached_res_count[base] = 0;
+ page_table.attributes[base] = type;
+ page_table.pointers[base] = memory;
+ page_table.cached_res_count[base] = 0;
base += 1;
if (memory != nullptr)
@@ -100,40 +58,34 @@ static void MapPages(u64 base, u64 size, u8* memory, PageType type) {
}
}
-void InitMemoryMap() {
- //main_page_table.pointers.fill(nullptr);
- //main_page_table.attributes.fill(PageType::Unmapped);
- //main_page_table.cached_res_count.fill(0);
-}
-
-void MapMemoryRegion(VAddr base, u64 size, u8* target) {
+void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory);
}
-void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler) {
+void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special);
- current_page_table->special_regions.emplace_back(SpecialRegion{base, size, mmio_handler});
+ page_table.special_regions.emplace_back(SpecialRegion{base, size, mmio_handler});
}
-void UnmapRegion(VAddr base, u64 size) {
+void UnmapRegion(PageTable& page_table, VAddr base, u32 size) {
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size);
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base);
- MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped);
+ MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped);
}
/**
* Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
* using a VMA from the current process
*/
-static u8* GetPointerFromVMA(VAddr vaddr) {
+static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) {
u8* direct_pointer = nullptr;
- auto& vm_manager = Kernel::g_current_process->vm_manager;
+ auto& vm_manager = process.vm_manager;
auto it = vm_manager.FindVMA(vaddr);
ASSERT(it != vm_manager.vma_map.end());
@@ -156,10 +108,18 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
}
/**
+ * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
+ * using a VMA from the current process.
+ */
+static u8* GetPointerFromVMA(VAddr vaddr) {
+ return GetPointerFromVMA(*Kernel::g_current_process, vaddr);
+}
+
+/**
* This function should only be called for virtual addreses with attribute `PageType::Special`.
*/
-static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
- for (const auto& region : current_page_table->special_regions) {
+static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) {
+ for (const auto& region : page_table.special_regions) {
if (vaddr >= region.base && vaddr < (region.base + region.size)) {
return region.handler;
}
@@ -168,6 +128,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
return nullptr; // Should never happen
}
+static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
+ const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table;
+ return GetMMIOHandler(page_table, vaddr);
+}
+
template <typename T>
T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr);
@@ -181,10 +146,13 @@ T Read(const VAddr vaddr) {
return value;
}
+ // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+
PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (type) {
case PageType::Unmapped:
- LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%llx", sizeof(T) * 8, vaddr);
+ LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%08X", sizeof(T) * 8, vaddr);
return 0;
case PageType::Memory:
ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr);
@@ -219,10 +187,13 @@ void Write(const VAddr vaddr, const T data) {
return;
}
+ // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state
+ std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+
PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (type) {
case PageType::Unmapped:
- LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%llx @ 0x%llx", sizeof(data) * 8, (u64)data,
+ LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data,
vaddr);
return;
case PageType::Memory:
@@ -246,18 +217,20 @@ void Write(const VAddr vaddr, const T data) {
}
}
-bool IsValidVirtualAddress(const VAddr vaddr) {
- const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS];
+bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) {
+ auto& page_table = process.vm_manager.page_table;
+
+ const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS];
if (page_pointer)
return true;
- if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
+ if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
return true;
- if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special)
+ if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special)
return false;
- MMIORegionPointer mmio_region = GetMMIOHandler(vaddr);
+ MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr);
if (mmio_region) {
return mmio_region->IsValidAddress(vaddr);
}
@@ -265,9 +238,12 @@ bool IsValidVirtualAddress(const VAddr vaddr) {
return false;
}
+bool IsValidVirtualAddress(const VAddr vaddr) {
+ return IsValidVirtualAddress(*Kernel::g_current_process, vaddr);
+}
+
bool IsValidPhysicalAddress(const PAddr paddr) {
- boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(paddr);
- return vaddr && IsValidVirtualAddress(*vaddr);
+ return GetPhysicalPointer(paddr) != nullptr;
}
u8* GetPointer(const VAddr vaddr) {
@@ -280,7 +256,7 @@ u8* GetPointer(const VAddr vaddr) {
return GetPointerFromVMA(vaddr);
}
- LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%llx", vaddr);
+ LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%08x", vaddr);
return nullptr;
}
@@ -299,12 +275,66 @@ std::string ReadCString(VAddr vaddr, std::size_t max_length) {
}
u8* GetPhysicalPointer(PAddr address) {
- // TODO(Subv): This call should not go through the application's memory mapping.
- boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(address);
- return vaddr ? GetPointer(*vaddr) : nullptr;
+ struct MemoryArea {
+ PAddr paddr_base;
+ u32 size;
+ };
+
+ static constexpr MemoryArea memory_areas[] = {
+ {VRAM_PADDR, VRAM_SIZE},
+ {IO_AREA_PADDR, IO_AREA_SIZE},
+ {DSP_RAM_PADDR, DSP_RAM_SIZE},
+ {FCRAM_PADDR, FCRAM_N3DS_SIZE},
+ {N3DS_EXTRA_RAM_PADDR, N3DS_EXTRA_RAM_SIZE},
+ };
+
+ const auto area =
+ std::find_if(std::begin(memory_areas), std::end(memory_areas), [&](const auto& area) {
+ return address >= area.paddr_base && address < area.paddr_base + area.size;
+ });
+
+ if (area == std::end(memory_areas)) {
+ LOG_ERROR(HW_Memory, "unknown GetPhysicalPointer @ 0x%08X", address);
+ return nullptr;
+ }
+
+ if (area->paddr_base == IO_AREA_PADDR) {
+ LOG_ERROR(HW_Memory, "MMIO mappings are not supported yet. phys_addr=0x%08X", address);
+ return nullptr;
+ }
+
+ u64 offset_into_region = address - area->paddr_base;
+
+ u8* target_pointer = nullptr;
+ switch (area->paddr_base) {
+ case VRAM_PADDR:
+ target_pointer = vram.data() + offset_into_region;
+ break;
+ case DSP_RAM_PADDR:
+ target_pointer = AudioCore::GetDspMemory().data() + offset_into_region;
+ break;
+ case FCRAM_PADDR:
+ for (const auto& region : Kernel::memory_regions) {
+ if (offset_into_region >= region.base &&
+ offset_into_region < region.base + region.size) {
+ target_pointer =
+ region.linear_heap_memory->data() + offset_into_region - region.base;
+ break;
+ }
+ }
+ ASSERT_MSG(target_pointer != nullptr, "Invalid FCRAM address");
+ break;
+ case N3DS_EXTRA_RAM_PADDR:
+ target_pointer = n3ds_extra_ram.data() + offset_into_region;
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ return target_pointer;
}
-void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
+void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
if (start == 0) {
return;
}
@@ -314,8 +344,15 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) {
boost::optional<VAddr> maybe_vaddr = PhysicalToVirtualAddress(paddr);
- if (!maybe_vaddr)
+ // While the physical <-> virtual mapping is 1:1 for the regions supported by the cache,
+ // some games (like Pokemon Super Mystery Dungeon) will try to use textures that go beyond
+ // the end address of VRAM, causing the Virtual->Physical translation to fail when flushing
+ // parts of the texture.
+ if (!maybe_vaddr) {
+ LOG_ERROR(HW_Memory,
+ "Trying to flush a cached region to an invalid physical address %08X", paddr);
continue;
+ }
VAddr vaddr = *maybe_vaddr;
u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS];
@@ -327,6 +364,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
if (res_count == 0) {
PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (page_type) {
+ case PageType::Unmapped:
+ // It is not necessary for a process to have this region mapped into its address
+ // space, for example, a system module need not have a VRAM mapping.
+ break;
case PageType::Memory:
page_type = PageType::RasterizerCachedMemory;
current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr;
@@ -345,6 +386,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
if (res_count == 0) {
PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS];
switch (page_type) {
+ case PageType::Unmapped:
+ // It is not necessary for a process to have this region mapped into its address
+ // space, for example, a system module need not have a VRAM mapping.
+ break;
case PageType::RasterizerCachedMemory: {
u8* pointer = GetPointerFromVMA(vaddr & ~PAGE_MASK);
if (pointer == nullptr) {
@@ -368,13 +413,13 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) {
}
}
-void RasterizerFlushRegion(PAddr start, u64 size) {
+void RasterizerFlushRegion(PAddr start, u32 size) {
if (VideoCore::g_renderer != nullptr) {
VideoCore::g_renderer->Rasterizer()->FlushRegion(start, size);
}
}
-void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) {
+void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size) {
// Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
// null here
if (VideoCore::g_renderer != nullptr) {
@@ -382,7 +427,7 @@ void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) {
}
}
-void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
+void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) {
// Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
// null here
if (VideoCore::g_renderer != nullptr) {
@@ -398,7 +443,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
VAddr overlap_end = std::min(end, region_end);
PAddr physical_start = TryVirtualToPhysicalAddress(overlap_start).value();
- u64 overlap_size = overlap_end - overlap_start;
+ u32 overlap_size = static_cast<u32>(overlap_end - overlap_start);
auto* rasterizer = VideoCore::g_renderer->Rasterizer();
switch (mode) {
@@ -433,44 +478,50 @@ u64 Read64(const VAddr addr) {
return Read<u64_le>(addr);
}
-void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
+void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
+ const size_t size) {
+ auto& page_table = process.vm_manager.page_table;
+
size_t remaining_size = size;
size_t page_index = src_addr >> PAGE_BITS;
size_t page_offset = src_addr & PAGE_MASK;
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
- switch (current_page_table->attributes[page_index]) {
+ switch (page_table.attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, src_addr, size);
std::memset(dest_buffer, 0, copy_amount);
break;
}
case PageType::Memory: {
- DEBUG_ASSERT(current_page_table->pointers[page_index]);
+ DEBUG_ASSERT(page_table.pointers[page_index]);
- const u8* src_ptr = current_page_table->pointers[page_index] + page_offset;
+ const u8* src_ptr = page_table.pointers[page_index] + page_offset;
std::memcpy(dest_buffer, src_ptr, copy_amount);
break;
}
case PageType::Special: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
-
- GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
- std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
+ std::memcpy(dest_buffer, GetPointerFromVMA(process, current_vaddr), copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
- GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
+ handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
break;
}
default:
@@ -484,6 +535,10 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
}
}
+void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
+ ReadBlock(*Kernel::g_current_process, src_addr, dest_buffer, size);
+}
+
void Write8(const VAddr addr, const u8 data) {
Write<u8>(addr, data);
}
@@ -500,44 +555,49 @@ void Write64(const VAddr addr, const u64 data) {
Write<u64_le>(addr, data);
}
-void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) {
+void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
+ const size_t size) {
+ auto& page_table = process.vm_manager.page_table;
size_t remaining_size = size;
size_t page_index = dest_addr >> PAGE_BITS;
size_t page_offset = dest_addr & PAGE_MASK;
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
- switch (current_page_table->attributes[page_index]) {
+ switch (page_table.attributes[page_index]) {
case PageType::Unmapped: {
LOG_ERROR(HW_Memory,
- "unmapped WriteBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, dest_addr, size);
break;
}
case PageType::Memory: {
- DEBUG_ASSERT(current_page_table->pointers[page_index]);
+ DEBUG_ASSERT(page_table.pointers[page_index]);
- u8* dest_ptr = current_page_table->pointers[page_index] + page_offset;
+ u8* dest_ptr = page_table.pointers[page_index] + page_offset;
std::memcpy(dest_ptr, src_buffer, copy_amount);
break;
}
case PageType::Special: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
-
- GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
- std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
+ std::memcpy(GetPointerFromVMA(process, current_vaddr), src_buffer, copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
- DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
- GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
+ MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
+ DEBUG_ASSERT(handler);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
+ handler->WriteBlock(current_vaddr, src_buffer, copy_amount);
break;
}
default:
@@ -551,6 +611,10 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
}
}
+void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) {
+ WriteBlock(*Kernel::g_current_process, dest_addr, src_buffer, size);
+}
+
void ZeroBlock(const VAddr dest_addr, const size_t size) {
size_t remaining_size = size;
size_t page_index = dest_addr >> PAGE_BITS;
@@ -560,11 +624,11 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
switch (current_page_table->attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, dest_addr, size);
break;
}
@@ -582,13 +646,15 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::FlushAndInvalidate);
GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
break;
}
@@ -609,11 +675,11 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
while (remaining_size > 0) {
const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
- const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset;
+ const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
switch (current_page_table->attributes[page_index]) {
case PageType::Unmapped: {
- LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%llx (start address = 0x%llx, size = %zu)",
+ LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
current_vaddr, src_addr, size);
ZeroBlock(dest_addr, copy_amount);
break;
@@ -633,13 +699,15 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
break;
}
case PageType::RasterizerCachedMemory: {
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount);
break;
}
case PageType::RasterizerCachedSpecial: {
DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
- RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush);
+ RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
+ FlushMode::Flush);
std::vector<u8> buffer(copy_amount);
GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size());
@@ -652,8 +720,8 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
page_index++;
page_offset = 0;
- dest_addr += copy_amount;
- src_addr += copy_amount;
+ dest_addr += static_cast<VAddr>(copy_amount);
+ src_addr += static_cast<VAddr>(copy_amount);
remaining_size -= copy_amount;
}
}
@@ -721,7 +789,7 @@ boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) {
PAddr VirtualToPhysicalAddress(const VAddr addr) {
auto paddr = TryVirtualToPhysicalAddress(addr);
if (!paddr) {
- LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%llx", addr);
+ LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr);
// To help with debugging, set bit on address so that it's obviously invalid.
return addr | 0x80000000;
}
@@ -746,4 +814,4 @@ boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) {
return boost::none;
}
-} // namespace
+} // namespace Memory
diff --git a/src/core/memory.h b/src/core/memory.h
index e14d68654..9a04b9a16 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -6,9 +6,16 @@
#include <array>
#include <cstddef>
+#include <map>
#include <string>
+#include <vector>
#include <boost/optional.hpp>
#include "common/common_types.h"
+#include "core/mmio.h"
+
+namespace Kernel {
+class Process;
+}
namespace Memory {
@@ -19,7 +26,60 @@ namespace Memory {
const int PAGE_BITS = 12;
const u64 PAGE_SIZE = 1 << PAGE_BITS;
const u64 PAGE_MASK = PAGE_SIZE - 1;
-const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (64 - PAGE_BITS);
+const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (32 - PAGE_BITS);
+
+enum class PageType {
+ /// Page is unmapped and should cause an access error.
+ Unmapped,
+ /// Page is mapped to regular memory. This is the only type you can get pointers to.
+ Memory,
+ /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
+ /// invalidation
+ RasterizerCachedMemory,
+ /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
+ Special,
+ /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
+ /// invalidation
+ RasterizerCachedSpecial,
+};
+
+struct SpecialRegion {
+ VAddr base;
+ u32 size;
+ MMIORegionPointer handler;
+};
+
+/**
+ * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely
+ * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and
+ * fetching requirements when accessing. In the usual case of an access to regular memory, it only
+ * requires an indexed fetch and a check for NULL.
+ */
+struct PageTable {
+ /**
+ * Array of memory pointers backing each page. An entry can only be non-null if the
+ * corresponding entry in the `attributes` array is of type `Memory`.
+ */
+ std::array<u8*, PAGE_TABLE_NUM_ENTRIES> pointers;
+
+ /**
+ * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
+ * type `Special`.
+ */
+ std::vector<SpecialRegion> special_regions;
+
+ /**
+ * Array of fine grained page attributes. If it is set to any value other than `Memory`, then
+ * the corresponding entry in `pointers` MUST be set to null.
+ */
+ std::array<PageType, PAGE_TABLE_NUM_ENTRIES> attributes;
+
+ /**
+ * Indicates the number of externally cached resources touching a page that should be
+ * flushed before the memory is accessed
+ */
+ std::array<u8, PAGE_TABLE_NUM_ENTRIES> cached_res_count;
+};
/// Physical memory regions as seen from the ARM11
enum : PAddr {
@@ -126,7 +186,14 @@ enum : VAddr {
NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE,
};
+/// Currently active page table
+void SetCurrentPageTable(PageTable* page_table);
+PageTable* GetCurrentPageTable();
+
+/// Determines if the given VAddr is valid for the specified process.
+bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr);
bool IsValidVirtualAddress(const VAddr addr);
+
bool IsValidPhysicalAddress(const PAddr addr);
u8 Read8(VAddr addr);
@@ -139,7 +206,11 @@ void Write16(VAddr addr, u16 data);
void Write32(VAddr addr, u32 data);
void Write64(VAddr addr, u64 data);
+void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
+ size_t size);
void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size);
+void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer,
+ size_t size);
void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size);
void ZeroBlock(const VAddr dest_addr, const size_t size);
void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size);
@@ -169,8 +240,6 @@ boost::optional<VAddr> PhysicalToVirtualAddress(PAddr addr);
/**
* Gets a pointer to the memory region beginning at the specified physical address.
- *
- * @note This is currently implemented using PhysicalToVirtualAddress().
*/
u8* GetPhysicalPointer(PAddr address);
@@ -178,17 +247,17 @@ u8* GetPhysicalPointer(PAddr address);
* Adds the supplied value to the rasterizer resource cache counter of each
* page touching the region.
*/
-void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta);
+void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta);
/**
* Flushes any externally cached rasterizer resources touching the given region.
*/
-void RasterizerFlushRegion(PAddr start, u64 size);
+void RasterizerFlushRegion(PAddr start, u32 size);
/**
* Flushes and invalidates any externally cached rasterizer resources touching the given region.
*/
-void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size);
+void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size);
enum class FlushMode {
/// Write back modified surfaces to RAM
@@ -201,12 +270,6 @@ enum class FlushMode {
* Flushes and invalidates any externally cached rasterizer resources touching the given virtual
* address region.
*/
-void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode);
+void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);
-/**
- * Dynarmic has an optimization to memory accesses when the pointer to the page exists that
- * can be used by setting up the current page table as a callback. This function is used to
- * retrieve the current page table for that purpose.
- */
-//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers();
-}
+} // namespace Memory
diff --git a/src/core/memory_setup.h b/src/core/memory_setup.h
index fc3fda466..c58baa50b 100644
--- a/src/core/memory_setup.h
+++ b/src/core/memory_setup.h
@@ -9,24 +9,24 @@
namespace Memory {
-void InitMemoryMap();
-
/**
* Maps an allocated buffer onto a region of the emulated process address space.
*
+ * @param page_table The page table of the emulated process.
* @param base The address to start mapping at. Must be page-aligned.
* @param size The amount of bytes to map. Must be page-aligned.
* @param target Buffer with the memory backing the mapping. Must be of length at least `size`.
*/
-void MapMemoryRegion(VAddr base, u64 size, u8* target);
+void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target);
/**
* Maps a region of the emulated process address space as a IO region.
+ * @param page_table The page table of the emulated process.
* @param base The address to start mapping at. Must be page-aligned.
* @param size The amount of bytes to map. Must be page-aligned.
* @param mmio_handler The handler that backs the mapping.
*/
-void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler);
+void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler);
-void UnmapRegion(VAddr base, u64 size);
+void UnmapRegion(PageTable& page_table, VAddr base, u32 size);
}
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index d4f0429d1..efcf1267d 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -36,4 +36,4 @@ void Apply() {
Service::IR::ReloadInputDevices();
}
-} // namespace
+} // namespace Settings
diff --git a/src/core/settings.h b/src/core/settings.h
index ee16bb90a..8d78cb424 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -15,6 +15,7 @@ enum class LayoutOption {
Default,
SingleScreen,
LargeScreen,
+ SideScreen,
};
namespace NativeButton {
@@ -70,7 +71,7 @@ enum Values {
static const std::array<const char*, NumAnalogs> mapping = {{
"circle_pad", "c_stick",
}};
-} // namespace NumAnalog
+} // namespace NativeAnalog
struct Values {
// CheckNew3DS
@@ -79,6 +80,8 @@ struct Values {
// Controls
std::array<std::string, NativeButton::NumButtons> buttons;
std::array<std::string, NativeAnalog::NumAnalogs> analogs;
+ std::string motion_device;
+ std::string touch_device;
// Core
bool use_cpu_jit;
@@ -128,7 +131,11 @@ struct Values {
u16 gdbstub_port;
// WebService
+ bool enable_telemetry;
std::string telemetry_endpoint_url;
+ std::string verify_endpoint_url;
+ std::string citra_username;
+ std::string citra_token;
} extern values;
// a special value for Values::region_value indicating that citra will automatically select a region
@@ -136,4 +143,4 @@ struct Values {
static constexpr int REGION_VALUE_AUTO_SELECT = -1;
void Apply();
-}
+} // namespace Settings
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 841d6cfa1..ca517ff44 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -3,15 +3,19 @@
// Refer to the license.txt file included.
#include <cstring>
+#include <cryptopp/osrng.h>
#include "common/assert.h"
+#include "common/file_util.h"
#include "common/scm_rev.h"
#include "common/x64/cpu_detect.h"
+#include "core/core.h"
#include "core/settings.h"
#include "core/telemetry_session.h"
#ifdef ENABLE_WEB_SERVICE
#include "web_service/telemetry_json.h"
+#include "web_service/verify_login.h"
#endif
namespace Core {
@@ -28,23 +32,94 @@ static const char* CpuVendorToStr(Common::CPUVendor vendor) {
UNREACHABLE();
}
+static u64 GenerateTelemetryId() {
+ u64 telemetry_id{};
+ CryptoPP::AutoSeededRandomPool rng;
+ rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&telemetry_id), sizeof(u64));
+ return telemetry_id;
+}
+
+u64 GetTelemetryId() {
+ u64 telemetry_id{};
+ static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
+
+ if (FileUtil::Exists(filename)) {
+ FileUtil::IOFile file(filename, "rb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ file.ReadBytes(&telemetry_id, sizeof(u64));
+ } else {
+ FileUtil::IOFile file(filename, "wb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ telemetry_id = GenerateTelemetryId();
+ file.WriteBytes(&telemetry_id, sizeof(u64));
+ }
+
+ return telemetry_id;
+}
+
+u64 RegenerateTelemetryId() {
+ const u64 new_telemetry_id{GenerateTelemetryId()};
+ static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
+
+ FileUtil::IOFile file(filename, "wb");
+ if (!file.IsOpen()) {
+ LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
+ return {};
+ }
+ file.WriteBytes(&new_telemetry_id, sizeof(u64));
+ return new_telemetry_id;
+}
+
+std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func) {
+#ifdef ENABLE_WEB_SERVICE
+ return WebService::VerifyLogin(username, token, Settings::values.verify_endpoint_url, func);
+#else
+ return std::async(std::launch::async, [func{std::move(func)}]() {
+ func();
+ return false;
+ });
+#endif
+}
+
TelemetrySession::TelemetrySession() {
#ifdef ENABLE_WEB_SERVICE
- backend = std::make_unique<WebService::TelemetryJson>();
+ if (Settings::values.enable_telemetry) {
+ backend = std::make_unique<WebService::TelemetryJson>(
+ Settings::values.telemetry_endpoint_url, Settings::values.citra_username,
+ Settings::values.citra_token);
+ } else {
+ backend = std::make_unique<Telemetry::NullVisitor>();
+ }
#else
backend = std::make_unique<Telemetry::NullVisitor>();
#endif
+ // Log one-time top-level information
+ AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
+
// Log one-time session start information
const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch())
.count()};
AddField(Telemetry::FieldType::Session, "Init_Time", init_time);
+ std::string program_name;
+ const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadTitle(program_name)};
+ if (res == Loader::ResultStatus::Success) {
+ AddField(Telemetry::FieldType::Session, "ProgramName", program_name);
+ }
// Log application information
const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr};
AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty);
AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch);
AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev);
+ AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date);
+ AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name);
// Log user system information
AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string);
@@ -68,6 +143,15 @@ TelemetrySession::TelemetrySession() {
Common::GetCPUCaps().sse4_1);
AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42",
Common::GetCPUCaps().sse4_2);
+#ifdef __APPLE__
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple");
+#elif defined(_WIN32)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows");
+#elif defined(__linux__) || defined(linux) || defined(__linux)
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux");
+#else
+ AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown");
+#endif
// Log user configuration information
AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h
index cf53835c3..550c6ea2d 100644
--- a/src/core/telemetry_session.h
+++ b/src/core/telemetry_session.h
@@ -4,6 +4,7 @@
#pragma once
+#include <future>
#include <memory>
#include "common/telemetry.h"
@@ -35,4 +36,25 @@ private:
std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
};
+/**
+ * Gets TelemetryId, a unique identifier used for the user's telemetry sessions.
+ * @returns The current TelemetryId for the session.
+ */
+u64 GetTelemetryId();
+
+/**
+ * Regenerates TelemetryId, a unique identifier used for the user's telemetry sessions.
+ * @returns The new TelemetryId that was generated.
+ */
+u64 RegenerateTelemetryId();
+
+/**
+ * Verifies the username and token.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @param func A function that gets exectued when the verification is finished
+ * @returns Future with bool indicating whether the verification succeeded
+ */
+std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func);
+
} // namespace Core
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index e3e36ada7..92792a702 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -2,12 +2,14 @@ set(SRCS
analog_from_button.cpp
keyboard.cpp
main.cpp
+ motion_emu.cpp
)
set(HEADERS
analog_from_button.h
keyboard.h
main.h
+ motion_emu.h
)
if(SDL2_FOUND)
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index 699f41e6b..557353740 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -7,6 +7,7 @@
#include "input_common/analog_from_button.h"
#include "input_common/keyboard.h"
#include "input_common/main.h"
+#include "input_common/motion_emu.h"
#ifdef HAVE_SDL2
#include "input_common/sdl/sdl.h"
#endif
@@ -14,12 +15,16 @@
namespace InputCommon {
static std::shared_ptr<Keyboard> keyboard;
+static std::shared_ptr<MotionEmu> motion_emu;
void Init() {
- keyboard = std::make_shared<InputCommon::Keyboard>();
+ keyboard = std::make_shared<Keyboard>();
Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
- std::make_shared<InputCommon::AnalogFromButton>());
+ std::make_shared<AnalogFromButton>());
+ motion_emu = std::make_shared<MotionEmu>();
+ Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu);
+
#ifdef HAVE_SDL2
SDL::Init();
#endif
@@ -29,6 +34,8 @@ void Shutdown() {
Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
keyboard.reset();
Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
+ Input::UnregisterFactory<Input::MotionDevice>("motion_emu");
+ motion_emu.reset();
#ifdef HAVE_SDL2
SDL::Shutdown();
@@ -39,6 +46,10 @@ Keyboard* GetKeyboard() {
return keyboard.get();
}
+MotionEmu* GetMotionEmu() {
+ return motion_emu.get();
+}
+
std::string GenerateKeyboardParam(int key_code) {
Common::ParamPackage param{
{"engine", "keyboard"}, {"code", std::to_string(key_code)},
diff --git a/src/input_common/main.h b/src/input_common/main.h
index 140bbd014..5604f0fa8 100644
--- a/src/input_common/main.h
+++ b/src/input_common/main.h
@@ -11,7 +11,7 @@ namespace InputCommon {
/// Initializes and registers all built-in input device factories.
void Init();
-/// Unresisters all build-in input device factories and shut them down.
+/// Deregisters all built-in input device factories and shuts them down.
void Shutdown();
class Keyboard;
@@ -19,6 +19,11 @@ class Keyboard;
/// Gets the keyboard button device factory.
Keyboard* GetKeyboard();
+class MotionEmu;
+
+/// Gets the motion emulation factory.
+MotionEmu* GetMotionEmu();
+
/// Generates a serialized param package for creating a keyboard button device
std::string GenerateKeyboardParam(int key_code);
diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp
new file mode 100644
index 000000000..59a035e70
--- /dev/null
+++ b/src/input_common/motion_emu.cpp
@@ -0,0 +1,168 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <chrono>
+#include <mutex>
+#include <thread>
+#include <tuple>
+#include "common/math_util.h"
+#include "common/quaternion.h"
+#include "common/thread.h"
+#include "common/vector_math.h"
+#include "input_common/motion_emu.h"
+
+namespace InputCommon {
+
+// Implementation class of the motion emulation device
+class MotionEmuDevice {
+public:
+ MotionEmuDevice(int update_millisecond, float sensitivity)
+ : update_millisecond(update_millisecond),
+ update_duration(std::chrono::duration_cast<std::chrono::steady_clock::duration>(
+ std::chrono::milliseconds(update_millisecond))),
+ sensitivity(sensitivity), motion_emu_thread(&MotionEmuDevice::MotionEmuThread, this) {}
+
+ ~MotionEmuDevice() {
+ if (motion_emu_thread.joinable()) {
+ shutdown_event.Set();
+ motion_emu_thread.join();
+ }
+ }
+
+ void BeginTilt(int x, int y) {
+ mouse_origin = Math::MakeVec(x, y);
+ is_tilting = true;
+ }
+
+ void Tilt(int x, int y) {
+ auto mouse_move = Math::MakeVec(x, y) - mouse_origin;
+ if (is_tilting) {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+ if (mouse_move.x == 0 && mouse_move.y == 0) {
+ tilt_angle = 0;
+ } else {
+ tilt_direction = mouse_move.Cast<float>();
+ tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * sensitivity, 0.0f,
+ MathUtil::PI * 0.5f);
+ }
+ }
+ }
+
+ void EndTilt() {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+ tilt_angle = 0;
+ is_tilting = false;
+ }
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() {
+ std::lock_guard<std::mutex> guard(status_mutex);
+ return status;
+ }
+
+private:
+ const int update_millisecond;
+ const std::chrono::steady_clock::duration update_duration;
+ const float sensitivity;
+
+ Math::Vec2<int> mouse_origin;
+
+ std::mutex tilt_mutex;
+ Math::Vec2<float> tilt_direction;
+ float tilt_angle = 0;
+
+ bool is_tilting = false;
+
+ Common::Event shutdown_event;
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> status;
+ std::mutex status_mutex;
+
+ // Note: always keep the thread declaration at the end so that other objects are initialized
+ // before this!
+ std::thread motion_emu_thread;
+
+ void MotionEmuThread() {
+ auto update_time = std::chrono::steady_clock::now();
+ Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0);
+ Math::Quaternion<float> old_q;
+
+ while (!shutdown_event.WaitUntil(update_time)) {
+ update_time += update_duration;
+ old_q = q;
+
+ {
+ std::lock_guard<std::mutex> guard(tilt_mutex);
+
+ // Find the quaternion describing current 3DS tilting
+ q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x),
+ tilt_angle);
+ }
+
+ auto inv_q = q.Inverse();
+
+ // Set the gravity vector in world space
+ auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f);
+
+ // Find the angular rate vector in world space
+ auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
+ angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
+
+ // Transform the two vectors from world space to 3DS space
+ gravity = QuaternionRotate(inv_q, gravity);
+ angular_rate = QuaternionRotate(inv_q, angular_rate);
+
+ // Update the sensor state
+ {
+ std::lock_guard<std::mutex> guard(status_mutex);
+ status = std::make_tuple(gravity, angular_rate);
+ }
+ }
+ }
+};
+
+// Interface wrapper held by input receiver as a unique_ptr. It holds the implementation class as
+// a shared_ptr, which is also observed by the factory class as a weak_ptr. In this way the factory
+// can forward all the inputs to the implementation only when it is valid.
+class MotionEmuDeviceWrapper : public Input::MotionDevice {
+public:
+ MotionEmuDeviceWrapper(int update_millisecond, float sensitivity) {
+ device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity);
+ }
+
+ std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() const {
+ return device->GetStatus();
+ }
+
+ std::shared_ptr<MotionEmuDevice> device;
+};
+
+std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackage& params) {
+ int update_period = params.Get("update_period", 100);
+ float sensitivity = params.Get("sensitivity", 0.01f);
+ auto device_wrapper = std::make_unique<MotionEmuDeviceWrapper>(update_period, sensitivity);
+ // Previously created device is disconnected here. Having two motion devices for 3DS is not
+ // expected.
+ current_device = device_wrapper->device;
+ return std::move(device_wrapper);
+}
+
+void MotionEmu::BeginTilt(int x, int y) {
+ if (auto ptr = current_device.lock()) {
+ ptr->BeginTilt(x, y);
+ }
+}
+
+void MotionEmu::Tilt(int x, int y) {
+ if (auto ptr = current_device.lock()) {
+ ptr->Tilt(x, y);
+ }
+}
+
+void MotionEmu::EndTilt() {
+ if (auto ptr = current_device.lock()) {
+ ptr->EndTilt();
+ }
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/motion_emu.h b/src/input_common/motion_emu.h
new file mode 100644
index 000000000..7a7e22467
--- /dev/null
+++ b/src/input_common/motion_emu.h
@@ -0,0 +1,46 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/frontend/input.h"
+
+namespace InputCommon {
+
+class MotionEmuDevice;
+
+class MotionEmu : public Input::Factory<Input::MotionDevice> {
+public:
+ /**
+ * Creates a motion device emulated from mouse input
+ * @param params contains parameters for creating the device:
+ * - "update_period": update period in milliseconds
+ * - "sensitivity": the coefficient converting mouse movement to tilting angle
+ */
+ std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
+
+ /**
+ * Signals that a motion sensor tilt has begun.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ */
+ void BeginTilt(int x, int y);
+
+ /**
+ * Signals that a motion sensor tilt is occurring.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ */
+ void Tilt(int x, int y);
+
+ /**
+ * Signals that a motion sensor tilt has ended.
+ */
+ void EndTilt();
+
+private:
+ std::weak_ptr<MotionEmuDevice> current_device;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/sdl/sdl.cpp b/src/input_common/sdl/sdl.cpp
index 756ee58b7..d404afa89 100644
--- a/src/input_common/sdl/sdl.cpp
+++ b/src/input_common/sdl/sdl.cpp
@@ -159,7 +159,7 @@ public:
* - "axis"(optional): the index of the axis to bind
* - "direction"(only used for hat): the direction name of the hat to bind. Can be "up",
* "down", "left" or "right"
- * - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is
+ * - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
* triggered if the axis value crosses
* - "direction"(only used for axis): "+" means the button is triggered when the axis value
* is greater than the threshold; "-" means the button is triggered when the axis value
diff --git a/src/network/packet.cpp b/src/network/packet.cpp
index 660e92c0d..7e1a812f3 100644
--- a/src/network/packet.cpp
+++ b/src/network/packet.cpp
@@ -13,6 +13,18 @@
namespace Network {
+#ifndef htonll
+u64 htonll(u64 x) {
+ return ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x)&0xFFFFFFFF) << 32) | htonl((x) >> 32));
+}
+#endif
+
+#ifndef ntohll
+u64 ntohll(u64 x) {
+ return ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x)&0xFFFFFFFF) << 32) | ntohl((x) >> 32));
+}
+#endif
+
void Packet::Append(const void* in_data, std::size_t size_in_bytes) {
if (in_data && (size_in_bytes > 0)) {
std::size_t start = data.size();
@@ -100,6 +112,20 @@ Packet& Packet::operator>>(u32& out_data) {
return *this;
}
+Packet& Packet::operator>>(s64& out_data) {
+ s64 value;
+ Read(&value, sizeof(value));
+ out_data = ntohll(value);
+ return *this;
+}
+
+Packet& Packet::operator>>(u64& out_data) {
+ u64 value;
+ Read(&value, sizeof(value));
+ out_data = ntohll(value);
+ return *this;
+}
+
Packet& Packet::operator>>(float& out_data) {
Read(&out_data, sizeof(out_data));
return *this;
@@ -183,6 +209,18 @@ Packet& Packet::operator<<(u32 in_data) {
return *this;
}
+Packet& Packet::operator<<(s64 in_data) {
+ s64 toWrite = htonll(in_data);
+ Append(&toWrite, sizeof(toWrite));
+ return *this;
+}
+
+Packet& Packet::operator<<(u64 in_data) {
+ u64 toWrite = htonll(in_data);
+ Append(&toWrite, sizeof(toWrite));
+ return *this;
+}
+
Packet& Packet::operator<<(float in_data) {
Append(&in_data, sizeof(in_data));
return *this;
@@ -195,7 +233,7 @@ Packet& Packet::operator<<(double in_data) {
Packet& Packet::operator<<(const char* in_data) {
// First insert string length
- u32 length = std::strlen(in_data);
+ u32 length = static_cast<u32>(std::strlen(in_data));
*this << length;
// Then insert characters
diff --git a/src/network/packet.h b/src/network/packet.h
index 94b351ab1..5a2e58dc2 100644
--- a/src/network/packet.h
+++ b/src/network/packet.h
@@ -72,6 +72,8 @@ public:
Packet& operator>>(u16& out_data);
Packet& operator>>(s32& out_data);
Packet& operator>>(u32& out_data);
+ Packet& operator>>(s64& out_data);
+ Packet& operator>>(u64& out_data);
Packet& operator>>(float& out_data);
Packet& operator>>(double& out_data);
Packet& operator>>(char* out_data);
@@ -89,6 +91,8 @@ public:
Packet& operator<<(u16 in_data);
Packet& operator<<(s32 in_data);
Packet& operator<<(u32 in_data);
+ Packet& operator<<(s64 in_data);
+ Packet& operator<<(u64 in_data);
Packet& operator<<(float in_data);
Packet& operator<<(double in_data);
Packet& operator<<(const char* in_data);
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 8b7915bb7..261049ab0 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -4,9 +4,9 @@
#include <algorithm>
#include <atomic>
+#include <mutex>
#include <random>
#include <thread>
-#include <vector>
#include "enet/enet.h"
#include "network/packet.h"
#include "network/room.h"
@@ -19,7 +19,7 @@ static constexpr u32 MaxConcurrentConnections = 10;
class Room::RoomImpl {
public:
// This MAC address is used to generate a 'Nintendo' like Mac address.
- const MacAddress NintendoOUI = {0x00, 0x1F, 0x32, 0x00, 0x00, 0x00};
+ const MacAddress NintendoOUI;
std::mt19937 random_gen; ///< Random number generator. Used for GenerateMacAddress
ENetHost* server = nullptr; ///< Network interface.
@@ -29,14 +29,17 @@ public:
struct Member {
std::string nickname; ///< The nickname of the member.
- std::string game_name; ///< The current game of the member
+ GameInfo game_info; ///< The current game of the member
MacAddress mac_address; ///< The assigned mac address of the member.
ENetPeer* peer; ///< The remote peer.
};
using MemberList = std::vector<Member>;
- MemberList members; ///< Information about the members of this room.
+ MemberList members; ///< Information about the members of this room
+ mutable std::mutex member_mutex; ///< Mutex for locking the members list
+ /// This should be a std::shared_mutex as soon as C++17 is supported
- RoomImpl() : random_gen(std::random_device()()) {}
+ RoomImpl()
+ : random_gen(std::random_device()()), NintendoOUI{0x00, 0x1F, 0x32, 0x00, 0x00, 0x00} {}
/// Thread that receives and dispatches network packets
std::unique_ptr<std::thread> room_thread;
@@ -146,7 +149,7 @@ void Room::RoomImpl::ServerLoop() {
case IdJoinRequest:
HandleJoinRequest(&event);
break;
- case IdSetGameName:
+ case IdSetGameInfo:
HandleGameNamePacket(&event);
break;
case IdWifiPacket:
@@ -212,7 +215,10 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
member.nickname = nickname;
member.peer = event->peer;
- members.push_back(std::move(member));
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ members.push_back(std::move(member));
+ }
// Notify everyone that the room information has changed.
BroadcastRoomInformation();
@@ -222,12 +228,14 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) {
bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const {
// A nickname is valid if it is not already taken by anybody else in the room.
// TODO(B3N30): Check for empty names, spaces, etc.
+ std::lock_guard<std::mutex> lock(member_mutex);
return std::all_of(members.begin(), members.end(),
[&nickname](const auto& member) { return member.nickname != nickname; });
}
bool Room::RoomImpl::IsValidMacAddress(const MacAddress& address) const {
// A MAC address is valid if it is not already taken by anybody else in the room.
+ std::lock_guard<std::mutex> lock(member_mutex);
return std::all_of(members.begin(), members.end(),
[&address](const auto& member) { return member.mac_address != address; });
}
@@ -278,6 +286,7 @@ void Room::RoomImpl::SendCloseMessage() {
packet << static_cast<u8>(IdCloseRoom);
ENetPacket* enet_packet =
enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE);
+ std::lock_guard<std::mutex> lock(member_mutex);
for (auto& member : members) {
enet_peer_send(member.peer, 0, enet_packet);
}
@@ -294,10 +303,14 @@ void Room::RoomImpl::BroadcastRoomInformation() {
packet << room_information.member_slots;
packet << static_cast<u32>(members.size());
- for (const auto& member : members) {
- packet << member.nickname;
- packet << member.mac_address;
- packet << member.game_name;
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ for (const auto& member : members) {
+ packet << member.nickname;
+ packet << member.mac_address;
+ packet << member.game_info.name;
+ packet << member.game_info.id;
+ }
}
ENetPacket* enet_packet =
@@ -334,11 +347,13 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
ENET_PACKET_FLAG_RELIABLE);
if (destination_address == BroadcastMac) { // Send the data to everyone except the sender
+ std::lock_guard<std::mutex> lock(member_mutex);
for (const auto& member : members) {
if (member.peer != event->peer)
enet_peer_send(member.peer, 0, enet_packet);
}
} else { // Send the data only to the destination client
+ std::lock_guard<std::mutex> lock(member_mutex);
auto member = std::find_if(members.begin(), members.end(),
[destination_address](const Member& member) -> bool {
return member.mac_address == destination_address;
@@ -360,6 +375,8 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) {
auto CompareNetworkAddress = [event](const Member member) -> bool {
return member.peer == event->peer;
};
+
+ std::lock_guard<std::mutex> lock(member_mutex);
const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress);
if (sending_member == members.end()) {
return; // Received a chat message from a unknown sender
@@ -384,22 +401,32 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) {
in_packet.Append(event->packet->data, event->packet->dataLength);
in_packet.IgnoreBytes(sizeof(u8)); // Igonore the message type
- std::string game_name;
- in_packet >> game_name;
- auto member =
- std::find_if(members.begin(), members.end(),
- [event](const Member& member) -> bool { return member.peer == event->peer; });
- if (member != members.end()) {
- member->game_name = game_name;
- BroadcastRoomInformation();
+ GameInfo game_info;
+ in_packet >> game_info.name;
+ in_packet >> game_info.id;
+
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ auto member =
+ std::find_if(members.begin(), members.end(), [event](const Member& member) -> bool {
+ return member.peer == event->peer;
+ });
+ if (member != members.end()) {
+ member->game_info = game_info;
+ }
}
+ BroadcastRoomInformation();
}
void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
// Remove the client from the members list.
- members.erase(std::remove_if(members.begin(), members.end(),
- [client](const Member& member) { return member.peer == client; }),
- members.end());
+ {
+ std::lock_guard<std::mutex> lock(member_mutex);
+ members.erase(
+ std::remove_if(members.begin(), members.end(),
+ [client](const Member& member) { return member.peer == client; }),
+ members.end());
+ }
// Announce the change to all clients.
enet_peer_disconnect(client, 0);
@@ -436,6 +463,19 @@ const RoomInformation& Room::GetRoomInformation() const {
return room_impl->room_information;
}
+std::vector<Room::Member> Room::GetRoomMemberList() const {
+ std::vector<Room::Member> member_list;
+ std::lock_guard<std::mutex> lock(room_impl->member_mutex);
+ for (const auto& member_impl : room_impl->members) {
+ Member member;
+ member.nickname = member_impl.nickname;
+ member.mac_address = member_impl.mac_address;
+ member.game_info = member_impl.game_info;
+ member_list.push_back(member);
+ }
+ return member_list;
+};
+
void Room::Destroy() {
room_impl->state = State::Closed;
room_impl->room_thread->join();
@@ -446,7 +486,10 @@ void Room::Destroy() {
}
room_impl->room_information = {};
room_impl->server = nullptr;
- room_impl->members.clear();
+ {
+ std::lock_guard<std::mutex> lock(room_impl->member_mutex);
+ room_impl->members.clear();
+ }
room_impl->room_information.member_slots = 0;
room_impl->room_information.name.clear();
}
diff --git a/src/network/room.h b/src/network/room.h
index 54cccf0ae..8285a4d0c 100644
--- a/src/network/room.h
+++ b/src/network/room.h
@@ -7,6 +7,7 @@
#include <array>
#include <memory>
#include <string>
+#include <vector>
#include "common/common_types.h"
namespace Network {
@@ -21,10 +22,15 @@ struct RoomInformation {
u32 member_slots; ///< Maximum number of members in this room
};
+struct GameInfo {
+ std::string name{""};
+ u64 id{0};
+};
+
using MacAddress = std::array<u8, 6>;
/// A special MAC address that tells the room we're joining to assign us a MAC address
/// automatically.
-const MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+constexpr MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
// 802.11 broadcast MAC address
constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
@@ -34,7 +40,7 @@ enum RoomMessageTypes : u8 {
IdJoinRequest = 1,
IdJoinSuccess,
IdRoomInformation,
- IdSetGameName,
+ IdSetGameInfo,
IdWifiPacket,
IdChatMessage,
IdNameCollision,
@@ -51,6 +57,12 @@ public:
Closed, ///< The room is not opened and can not accept connections.
};
+ struct Member {
+ std::string nickname; ///< The nickname of the member.
+ GameInfo game_info; ///< The current game of the member
+ MacAddress mac_address; ///< The assigned mac address of the member.
+ };
+
Room();
~Room();
@@ -65,6 +77,11 @@ public:
const RoomInformation& GetRoomInformation() const;
/**
+ * Gets a list of the mbmers connected to the room.
+ */
+ std::vector<Member> GetRoomMemberList() const;
+
+ /**
* Creates the socket for this room. Will bind to default address if
* server is empty string.
*/
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp
index dac9bacae..f229ec6fd 100644
--- a/src/network/room_member.cpp
+++ b/src/network/room_member.cpp
@@ -5,6 +5,7 @@
#include <atomic>
#include <list>
#include <mutex>
+#include <set>
#include <thread>
#include "common/assert.h"
#include "enet/enet.h"
@@ -25,6 +26,9 @@ public:
/// Information about the room we're connected to.
RoomInformation room_information;
+ /// The current game name, id and version
+ GameInfo current_game_info;
+
std::atomic<State> state{State::Idle}; ///< Current state of the RoomMember.
void SetState(const State new_state);
bool IsConnected() const;
@@ -37,6 +41,24 @@ public:
std::unique_ptr<std::thread> loop_thread;
std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable.
std::list<Packet> send_list; ///< A list that stores all packets to send the async
+
+ template <typename T>
+ using CallbackSet = std::set<CallbackHandle<T>>;
+ std::mutex callback_mutex; ///< The mutex used for handling callbacks
+
+ class Callbacks {
+ public:
+ template <typename T>
+ CallbackSet<T>& Get();
+
+ private:
+ CallbackSet<WifiPacket> callback_set_wifi_packet;
+ CallbackSet<ChatEntry> callback_set_chat_messages;
+ CallbackSet<RoomInformation> callback_set_room_information;
+ CallbackSet<State> callback_set_state;
+ };
+ Callbacks callbacks; ///< All CallbackSets to all events
+
void MemberLoop();
void StartLoop();
@@ -84,12 +106,20 @@ public:
* Disconnects the RoomMember from the Room
*/
void Disconnect();
+
+ template <typename T>
+ void Invoke(const T& data);
+
+ template <typename T>
+ CallbackHandle<T> Bind(std::function<void(const T&)> callback);
};
// RoomMemberImpl
void RoomMember::RoomMemberImpl::SetState(const State new_state) {
- state = new_state;
- // TODO(B3N30): Invoke the callback functions
+ if (state != new_state) {
+ state = new_state;
+ Invoke<State>(state);
+ }
}
bool RoomMember::RoomMemberImpl::IsConnected() const {
@@ -195,9 +225,10 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev
for (auto& member : member_information) {
packet >> member.nickname;
packet >> member.mac_address;
- packet >> member.game_name;
+ packet >> member.game_info.name;
+ packet >> member.game_info.id;
}
- // TODO(B3N30): Invoke callbacks
+ Invoke(room_information);
}
void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
@@ -209,7 +240,7 @@ void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) {
// Parse the MAC Address from the packet
packet >> mac_address;
- // TODO(B3N30): Invoke callbacks
+ SetState(State::Joined);
}
void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
@@ -235,7 +266,7 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
packet >> wifi_packet.data;
- // TODO(B3N30): Invoke callbacks
+ Invoke<WifiPacket>(wifi_packet);
}
void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
@@ -248,7 +279,7 @@ void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
ChatEntry chat_entry{};
packet >> chat_entry.nickname;
packet >> chat_entry.message;
- // TODO(B3N30): Invoke callbacks
+ Invoke<ChatEntry>(chat_entry);
}
void RoomMember::RoomMemberImpl::Disconnect() {
@@ -276,6 +307,46 @@ void RoomMember::RoomMemberImpl::Disconnect() {
server = nullptr;
}
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<WifiPacket>& RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_wifi_packet;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<RoomMember::State>&
+RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_state;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<RoomInformation>&
+RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_room_information;
+}
+
+template <>
+RoomMember::RoomMemberImpl::CallbackSet<ChatEntry>& RoomMember::RoomMemberImpl::Callbacks::Get() {
+ return callback_set_chat_messages;
+}
+
+template <typename T>
+void RoomMember::RoomMemberImpl::Invoke(const T& data) {
+ std::lock_guard<std::mutex> lock(callback_mutex);
+ CallbackSet<T> callback_set = callbacks.Get<T>();
+ for (auto const& callback : callback_set)
+ (*callback)(data);
+}
+
+template <typename T>
+RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind(
+ std::function<void(const T&)> callback) {
+ std::lock_guard<std::mutex> lock(callback_mutex);
+ CallbackHandle<T> handle;
+ handle = std::make_shared<std::function<void(const T&)>>(callback);
+ callbacks.Get<T>().insert(handle);
+ return handle;
+}
+
// RoomMember
RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
@@ -339,6 +410,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
room_member_impl->SetState(State::Joining);
room_member_impl->StartLoop();
room_member_impl->SendJoinRequest(nick, preferred_mac);
+ SendGameInfo(room_member_impl->current_game_info);
} else {
room_member_impl->SetState(State::CouldNotConnect);
}
@@ -366,17 +438,53 @@ void RoomMember::SendChatMessage(const std::string& message) {
room_member_impl->Send(std::move(packet));
}
-void RoomMember::SendGameName(const std::string& game_name) {
+void RoomMember::SendGameInfo(const GameInfo& game_info) {
+ room_member_impl->current_game_info = game_info;
+ if (!IsConnected())
+ return;
+
Packet packet;
- packet << static_cast<u8>(IdSetGameName);
- packet << game_name;
+ packet << static_cast<u8>(IdSetGameInfo);
+ packet << game_info.name;
+ packet << game_info.id;
room_member_impl->Send(std::move(packet));
}
+RoomMember::CallbackHandle<RoomMember::State> RoomMember::BindOnStateChanged(
+ std::function<void(const RoomMember::State&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<WifiPacket> RoomMember::BindOnWifiPacketReceived(
+ std::function<void(const WifiPacket&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<RoomInformation> RoomMember::BindOnRoomInformationChanged(
+ std::function<void(const RoomInformation&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+RoomMember::CallbackHandle<ChatEntry> RoomMember::BindOnChatMessageRecieved(
+ std::function<void(const ChatEntry&)> callback) {
+ return room_member_impl->Bind(callback);
+}
+
+template <typename T>
+void RoomMember::Unbind(CallbackHandle<T> handle) {
+ std::lock_guard<std::mutex> lock(room_member_impl->callback_mutex);
+ room_member_impl->callbacks.Get<T>().erase(handle);
+}
+
void RoomMember::Leave() {
room_member_impl->SetState(State::Idle);
room_member_impl->loop_thread->join();
room_member_impl->loop_thread.reset();
}
+template void RoomMember::Unbind(CallbackHandle<WifiPacket>);
+template void RoomMember::Unbind(CallbackHandle<RoomMember::State>);
+template void RoomMember::Unbind(CallbackHandle<RoomInformation>);
+template void RoomMember::Unbind(CallbackHandle<ChatEntry>);
+
} // namespace Network
diff --git a/src/network/room_member.h b/src/network/room_member.h
index bc1af3a7e..98770a234 100644
--- a/src/network/room_member.h
+++ b/src/network/room_member.h
@@ -4,6 +4,7 @@
#pragma once
+#include <functional>
#include <memory>
#include <string>
#include <vector>
@@ -53,12 +54,23 @@ public:
struct MemberInformation {
std::string nickname; ///< Nickname of the member.
- std::string game_name; ///< Name of the game they're currently playing, or empty if they're
+ GameInfo game_info; ///< Name of the game they're currently playing, or empty if they're
/// not playing anything.
MacAddress mac_address; ///< MAC address associated with this member.
};
using MemberList = std::vector<MemberInformation>;
+ // The handle for the callback functions
+ template <typename T>
+ using CallbackHandle = std::shared_ptr<std::function<void(const T&)>>;
+
+ /**
+ * Unbinds a callback function from the events.
+ * @param handle The connection handle to disconnect
+ */
+ template <typename T>
+ void Unbind(CallbackHandle<T> handle);
+
RoomMember();
~RoomMember();
@@ -113,10 +125,49 @@ public:
void SendChatMessage(const std::string& message);
/**
- * Sends the current game name to the room.
- * @param game_name The game name.
+ * Sends the current game info to the room.
+ * @param game_info The game information.
+ */
+ void SendGameInfo(const GameInfo& game_info);
+
+ /**
+ * Binds a function to an event that will be triggered every time the State of the member
+ * changed. The function wil be called every time the event is triggered. The callback function
+ * must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<State> BindOnStateChanged(std::function<void(const State&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time a WifiPacket is received.
+ * The function wil be called everytime the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<WifiPacket> BindOnWifiPacketReceived(
+ std::function<void(const WifiPacket&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time the RoomInformation changes.
+ * The function wil be called every time the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
+ */
+ CallbackHandle<RoomInformation> BindOnRoomInformationChanged(
+ std::function<void(const RoomInformation&)> callback);
+
+ /**
+ * Binds a function to an event that will be triggered every time a ChatMessage is received.
+ * The function wil be called every time the event is triggered.
+ * The callback function must not bind or unbind a function. Doing so will cause a deadlock
+ * @param callback The function to call
+ * @return A handle used for removing the function from the registered list
*/
- void SendGameName(const std::string& game_name);
+ CallbackHandle<ChatEntry> BindOnChatMessageRecieved(
+ std::function<void(const ChatEntry&)> callback);
/**
* Leaves the current room.
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index a14df325a..1aac0daa2 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -1,12 +1,16 @@
set(SRCS
common/param_package.cpp
+ core/arm/arm_test_common.cpp
+ core/arm/dyncom/arm_dyncom_vfp_tests.cpp
core/file_sys/path_parser.cpp
core/hle/kernel/hle_ipc.cpp
+ core/memory/memory.cpp
glad.cpp
tests.cpp
)
set(HEADERS
+ core/arm/arm_test_common.h
)
create_directory_groups(${SRCS} ${HEADERS})
diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp
new file mode 100644
index 000000000..2339bdfb8
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.cpp
@@ -0,0 +1,137 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/core.h"
+#include "core/hle/kernel/process.h"
+#include "core/memory.h"
+#include "core/memory_setup.h"
+#include "tests/core/arm/arm_test_common.h"
+
+namespace ArmTests {
+
+static Memory::PageTable* page_table = nullptr;
+
+TestEnvironment::TestEnvironment(bool mutable_memory_)
+ : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) {
+
+ Kernel::g_current_process = Kernel::Process::Create("");
+ page_table = &Kernel::g_current_process->vm_manager.page_table;
+
+ page_table->pointers.fill(nullptr);
+ page_table->attributes.fill(Memory::PageType::Unmapped);
+ page_table->cached_res_count.fill(0);
+
+ Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory);
+ Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory);
+
+ Memory::SetCurrentPageTable(page_table);
+}
+
+TestEnvironment::~TestEnvironment() {
+ Memory::UnmapRegion(*page_table, 0x80000000, 0x80000000);
+ Memory::UnmapRegion(*page_table, 0x00000000, 0x80000000);
+}
+
+void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) {
+ SetMemory32(vaddr + 0, static_cast<u32>(value));
+ SetMemory32(vaddr + 4, static_cast<u32>(value >> 32));
+}
+
+void TestEnvironment::SetMemory32(VAddr vaddr, u32 value) {
+ SetMemory16(vaddr + 0, static_cast<u16>(value));
+ SetMemory16(vaddr + 2, static_cast<u16>(value >> 16));
+}
+
+void TestEnvironment::SetMemory16(VAddr vaddr, u16 value) {
+ SetMemory8(vaddr + 0, static_cast<u8>(value));
+ SetMemory8(vaddr + 1, static_cast<u8>(value >> 8));
+}
+
+void TestEnvironment::SetMemory8(VAddr vaddr, u8 value) {
+ test_memory->data[vaddr] = value;
+}
+
+std::vector<WriteRecord> TestEnvironment::GetWriteRecords() const {
+ return write_records;
+}
+
+void TestEnvironment::ClearWriteRecords() {
+ write_records.clear();
+}
+
+TestEnvironment::TestMemory::~TestMemory() {}
+
+bool TestEnvironment::TestMemory::IsValidAddress(VAddr addr) {
+ return true;
+}
+
+u8 TestEnvironment::TestMemory::Read8(VAddr addr) {
+ auto iter = data.find(addr);
+ if (iter == data.end()) {
+ return addr; // Some arbitrary data
+ }
+ return iter->second;
+}
+
+u16 TestEnvironment::TestMemory::Read16(VAddr addr) {
+ return Read8(addr) | static_cast<u16>(Read8(addr + 1)) << 8;
+}
+
+u32 TestEnvironment::TestMemory::Read32(VAddr addr) {
+ return Read16(addr) | static_cast<u32>(Read16(addr + 2)) << 16;
+}
+
+u64 TestEnvironment::TestMemory::Read64(VAddr addr) {
+ return Read32(addr) | static_cast<u64>(Read32(addr + 4)) << 32;
+}
+
+bool TestEnvironment::TestMemory::ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) {
+ VAddr addr = src_addr;
+ u8* data = static_cast<u8*>(dest_buffer);
+
+ for (size_t i = 0; i < size; i++, addr++, data++) {
+ *data = Read8(addr);
+ }
+
+ return true;
+}
+
+void TestEnvironment::TestMemory::Write8(VAddr addr, u8 data) {
+ env->write_records.emplace_back(8, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory8(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write16(VAddr addr, u16 data) {
+ env->write_records.emplace_back(16, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory16(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write32(VAddr addr, u32 data) {
+ env->write_records.emplace_back(32, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory32(addr, data);
+}
+
+void TestEnvironment::TestMemory::Write64(VAddr addr, u64 data) {
+ env->write_records.emplace_back(64, addr, data);
+ if (env->mutable_memory)
+ env->SetMemory64(addr, data);
+}
+
+bool TestEnvironment::TestMemory::WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) {
+ VAddr addr = dest_addr;
+ const u8* data = static_cast<const u8*>(src_buffer);
+
+ for (size_t i = 0; i < size; i++, addr++, data++) {
+ env->write_records.emplace_back(8, addr, *data);
+ if (env->mutable_memory)
+ env->SetMemory8(addr, *data);
+ }
+
+ return true;
+}
+
+} // namespace ArmTests
diff --git a/src/tests/core/arm/arm_test_common.h b/src/tests/core/arm/arm_test_common.h
new file mode 100644
index 000000000..592c28594
--- /dev/null
+++ b/src/tests/core/arm/arm_test_common.h
@@ -0,0 +1,84 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include "common/common_types.h"
+#include "core/mmio.h"
+
+namespace ArmTests {
+
+struct WriteRecord {
+ WriteRecord(size_t size, VAddr addr, u64 data) : size(size), addr(addr), data(data) {}
+ size_t size;
+ VAddr addr;
+ u64 data;
+ bool operator==(const WriteRecord& o) const {
+ return std::tie(size, addr, data) == std::tie(o.size, o.addr, o.data);
+ }
+};
+
+class TestEnvironment final {
+public:
+ /*
+ * Inititalise test environment
+ * @param mutable_memory If false, writes to memory can never be read back.
+ * (Memory is immutable.)
+ */
+ explicit TestEnvironment(bool mutable_memory = false);
+
+ /// Shutdown test environment
+ ~TestEnvironment();
+
+ /// Sets value at memory location vaddr.
+ void SetMemory8(VAddr vaddr, u8 value);
+ void SetMemory16(VAddr vaddr, u16 value);
+ void SetMemory32(VAddr vaddr, u32 value);
+ void SetMemory64(VAddr vaddr, u64 value);
+
+ /**
+ * Whenever Memory::Write{8,16,32,64} is called within the test environment,
+ * a new write-record is made.
+ * @returns A vector of write records made since they were last cleared.
+ */
+ std::vector<WriteRecord> GetWriteRecords() const;
+
+ /// Empties the internal write-record store.
+ void ClearWriteRecords();
+
+private:
+ friend struct TestMemory;
+ struct TestMemory final : Memory::MMIORegion {
+ explicit TestMemory(TestEnvironment* env_) : env(env_) {}
+ TestEnvironment* env;
+
+ ~TestMemory() override;
+
+ bool IsValidAddress(VAddr addr) override;
+
+ u8 Read8(VAddr addr) override;
+ u16 Read16(VAddr addr) override;
+ u32 Read32(VAddr addr) override;
+ u64 Read64(VAddr addr) override;
+
+ bool ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) override;
+
+ void Write8(VAddr addr, u8 data) override;
+ void Write16(VAddr addr, u16 data) override;
+ void Write32(VAddr addr, u32 data) override;
+ void Write64(VAddr addr, u64 data) override;
+
+ bool WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) override;
+
+ std::unordered_map<VAddr, u8> data;
+ };
+
+ bool mutable_memory;
+ std::shared_ptr<TestMemory> test_memory;
+ std::vector<WriteRecord> write_records;
+};
+
+} // namespace ArmTests
diff --git a/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
new file mode 100644
index 000000000..83719a58e
--- /dev/null
+++ b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp
@@ -0,0 +1,50 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <catch.hpp>
+
+#include "core/arm/dyncom/arm_dyncom.h"
+#include "core/core_timing.h"
+#include "tests/core/arm/arm_test_common.h"
+
+namespace ArmTests {
+
+struct VfpTestCase {
+ u32 initial_fpscr;
+ u32 a;
+ u32 b;
+ u32 result;
+ u32 final_fpscr;
+};
+
+TEST_CASE("ARM_DynCom (vfp): vadd", "[arm_dyncom]") {
+ TestEnvironment test_env(false);
+ test_env.SetMemory32(0, 0xEE321A03); // vadd.f32 s2, s4, s6
+ test_env.SetMemory32(4, 0xEAFFFFFE); // b +#0
+
+ ARM_DynCom dyncom(USER32MODE);
+
+ std::vector<VfpTestCase> test_cases{{
+#include "vfp_vadd_f32.inc"
+ }};
+
+ for (const auto& test_case : test_cases) {
+ dyncom.SetPC(0);
+ dyncom.SetVFPSystemReg(VFP_FPSCR, test_case.initial_fpscr);
+ dyncom.SetVFPReg(4, test_case.a);
+ dyncom.SetVFPReg(6, test_case.b);
+ dyncom.ExecuteInstructions(1);
+ if (dyncom.GetVFPReg(2) != test_case.result ||
+ dyncom.GetVFPSystemReg(VFP_FPSCR) != test_case.final_fpscr) {
+ printf("f: %x\n", test_case.initial_fpscr);
+ printf("a: %x\n", test_case.a);
+ printf("b: %x\n", test_case.b);
+ printf("c: %x (%x)\n", dyncom.GetVFPReg(2), test_case.result);
+ printf("f: %x (%x)\n", dyncom.GetVFPSystemReg(VFP_FPSCR), test_case.final_fpscr);
+ FAIL();
+ }
+ }
+}
+
+} // namespace ArmTests \ No newline at end of file
diff --git a/src/tests/core/arm/dyncom/vfp_vadd_f32.inc b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
new file mode 100644
index 000000000..d0032c2e6
--- /dev/null
+++ b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc
@@ -0,0 +1,13456 @@
+{0x3c00000, 0x0, 0x0, 0x0, 0x3c00000},
+{0x3c00000, 0x0, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x800000, 0x800000, 0x3c00000},
+{0x3c00000, 0x0, 0x800002, 0x800002, 0x3c00000},
+{0x3c00000, 0x0, 0x1398437, 0x1398437, 0x3c00000},
+{0x3c00000, 0x0, 0xba98d27, 0xba98d27, 0x3c00000},
+{0x3c00000, 0x0, 0xba98d7a, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0x0, 0x751f853a, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x80000000, 0x0, 0x3c00000},
+{0x3c00000, 0x0, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x0, 0x80800000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x0, 0x80800002, 0x80800002, 0x3c00000},
+{0x3c00000, 0x0, 0x81398437, 0x81398437, 0x3c00000},
+{0x3c00000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x0, 0xf51f853a, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0x0, 0xff7fffff, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0x0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x0, 0xe73a5134, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x0, 0x9503366, 0x9503366, 0x3c00000},
+{0x3c00000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0x0, 0x966320b, 0x966320b, 0x3c00000},
+{0x3c00000, 0x0, 0xb26bddee, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0x0, 0x317285d3, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x1, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x1, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x1, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x1, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x1, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x1, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x1, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x1, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x1, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x1, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x1, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x1, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x1, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x1, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x1, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x1, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x1, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x1, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x1, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x1, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x76, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x76, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x76, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x76, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x76, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x76, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x76, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x76, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x76, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x76, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x76, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x76, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x76, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x76, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x76, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x76, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x76, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x76, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x76, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x76, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x76, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x2b94, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x2b94, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x2b94, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x2b94, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x2b94, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x2b94, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x636d24, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x636d24, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x636d24, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x636d24, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x636d24, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x636d24, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x800000, 0x0, 0x800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x1, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x76, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x2b94, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x636d24, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x7fffff, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x800000, 0x1000000, 0x3c00000},
+{0x3c00000, 0x800000, 0x800002, 0x1000001, 0x3c00000},
+{0x3c00000, 0x800000, 0x1398437, 0x1798437, 0x3c00000},
+{0x3c00000, 0x800000, 0xba98d27, 0xba98d29, 0x3c00000},
+{0x3c00000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3c00000},
+{0x3c00000, 0x800000, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x80000000, 0x800000, 0x3c00000},
+{0x3c00000, 0x800000, 0x80000001, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80000076, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80002b94, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80636d24, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x807fffff, 0x800000, 0x3c00080},
+{0x3c00000, 0x800000, 0x80800000, 0x0, 0x3c00000},
+{0x3c00000, 0x800000, 0x80800002, 0x0, 0x3c00008},
+{0x3c00000, 0x800000, 0x81398437, 0x80f3086e, 0x3c00000},
+{0x3c00000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3c00000},
+{0x3c00000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3c00000},
+{0x3c00000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x800000, 0x9503366, 0x95033a6, 0x3c00000},
+{0x3c00000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x800000, 0x966320b, 0x966324b, 0x3c00000},
+{0x3c00000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x800000, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x800002, 0x0, 0x800002, 0x3c00000},
+{0x3c00000, 0x800002, 0x1, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x76, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x2b94, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x636d24, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x7fffff, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x800000, 0x1000001, 0x3c00000},
+{0x3c00000, 0x800002, 0x800002, 0x1000002, 0x3c00000},
+{0x3c00000, 0x800002, 0x1398437, 0x1798438, 0x3c00000},
+{0x3c00000, 0x800002, 0xba98d27, 0xba98d29, 0x3c00010},
+{0x3c00000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3c00010},
+{0x3c00000, 0x800002, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x800002, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x80000000, 0x800002, 0x3c00000},
+{0x3c00000, 0x800002, 0x80000001, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80000076, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80002b94, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80636d24, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x807fffff, 0x800002, 0x3c00080},
+{0x3c00000, 0x800002, 0x80800000, 0x0, 0x3c00008},
+{0x3c00000, 0x800002, 0x80800002, 0x0, 0x3c00000},
+{0x3c00000, 0x800002, 0x81398437, 0x80f3086c, 0x3c00000},
+{0x3c00000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3c00010},
+{0x3c00000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3c00010},
+{0x3c00000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x800002, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x800002, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x800002, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x800002, 0x9503366, 0x95033a6, 0x3c00010},
+{0x3c00000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x800002, 0x966320b, 0x966324b, 0x3c00010},
+{0x3c00000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x800002, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x0, 0x1398437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x1, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x76, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x2b94, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x636d24, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x7fffff, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x800000, 0x1798437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x800002, 0x1798438, 0x3c00000},
+{0x3c00000, 0x1398437, 0x1398437, 0x1b98437, 0x3c00000},
+{0x3c00000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3c00010},
+{0x3c00000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3c00010},
+{0x3c00000, 0x1398437, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80000000, 0x1398437, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80000001, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80000076, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80002b94, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80636d24, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x807fffff, 0x1398437, 0x3c00080},
+{0x3c00000, 0x1398437, 0x80800000, 0xf3086e, 0x3c00000},
+{0x3c00000, 0x1398437, 0x80800002, 0xf3086c, 0x3c00000},
+{0x3c00000, 0x1398437, 0x81398437, 0x0, 0x3c00000},
+{0x3c00000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3c00010},
+{0x3c00000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3c00010},
+{0x3c00000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x1398437, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x9503366, 0x950341f, 0x3c00010},
+{0x3c00000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x1398437, 0x966320b, 0x96632c4, 0x3c00010},
+{0x3c00000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x1398437, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x0, 0xba98d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x1, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x76, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x2b94, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x636d24, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x800000, 0xba98d29, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x800002, 0xba98d29, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80000000, 0xba98d27, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80000001, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80000076, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3c00080},
+{0x3c00000, 0xba98d27, 0x80800000, 0xba98d25, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x80800002, 0xba98d24, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x81398437, 0xba98d21, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x8ba98d27, 0x0, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x0, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x1, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x76, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x0, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x1, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x76, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x2b94, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x636d24, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x800000, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x800002, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x1398437, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x80000000, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x80000001, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80000076, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x751f853a, 0x80800000, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x80800002, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x81398437, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xf51f853a, 0x0, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x9503366, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x966320b, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7f800000, 0x0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x1, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x76, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x2b94, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x636d24, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x800002, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x1398437, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80000000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80000001, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80000076, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x7f800000, 0x80800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x80800002, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x81398437, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x9503366, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x966320b, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7f800001, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x0, 0x0, 0x3c00000},
+{0x3c00000, 0x80000000, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x800000, 0x800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x800002, 0x800002, 0x3c00000},
+{0x3c00000, 0x80000000, 0x1398437, 0x1398437, 0x3c00000},
+{0x3c00000, 0x80000000, 0xba98d27, 0xba98d27, 0x3c00000},
+{0x3c00000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3c00000},
+{0x3c00000, 0x80000000, 0x751f853a, 0x751f853a, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80000000, 0x80000000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000000, 0x80800000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x80800002, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80000000, 0x81398437, 0x81398437, 0x3c00000},
+{0x3c00000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x80000000, 0x9503366, 0x9503366, 0x3c00000},
+{0x3c00000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0x80000000, 0x966320b, 0x966320b, 0x3c00000},
+{0x3c00000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0x80000000, 0x317285d3, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x80000001, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80000001, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80000001, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80000001, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80000001, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80000001, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80000001, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80000001, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80000076, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80000076, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80000076, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80000076, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80000076, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80000076, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x0, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x1, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x76, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x2b94, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x800000, 0x800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x800002, 0x800002, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x1398437, 0x1398437, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000000, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000001, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80000076, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80002b94, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80636d24, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x807fffff, 0x0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80800000, 0x80800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x80800002, 0x80800002, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x81398437, 0x81398437, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff800000, 0xff800000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x9503366, 0x9503366, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x966320b, 0x966320b, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x80800000, 0x0, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x1, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x76, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x2b94, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x636d24, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x7fffff, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x800000, 0x0, 0x3c00000},
+{0x3c00000, 0x80800000, 0x800002, 0x0, 0x3c00008},
+{0x3c00000, 0x80800000, 0x1398437, 0xf3086e, 0x3c00000},
+{0x3c00000, 0x80800000, 0xba98d27, 0xba98d25, 0x3c00000},
+{0x3c00000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3c00000},
+{0x3c00000, 0x80800000, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80000000, 0x80800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80000001, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80000076, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80002b94, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80636d24, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x807fffff, 0x80800000, 0x3c00080},
+{0x3c00000, 0x80800000, 0x80800000, 0x81000000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x80800002, 0x81000001, 0x3c00000},
+{0x3c00000, 0x80800000, 0x81398437, 0x81798437, 0x3c00000},
+{0x3c00000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3c00000},
+{0x3c00000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3c00000},
+{0x3c00000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x80800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x80800000, 0x9503366, 0x9503326, 0x3c00000},
+{0x3c00000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x80800000, 0x966320b, 0x96631cb, 0x3c00000},
+{0x3c00000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x80800000, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x0, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x1, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x76, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x2b94, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x636d24, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x7fffff, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x800000, 0x0, 0x3c00008},
+{0x3c00000, 0x80800002, 0x800002, 0x0, 0x3c00000},
+{0x3c00000, 0x80800002, 0x1398437, 0xf3086c, 0x3c00000},
+{0x3c00000, 0x80800002, 0xba98d27, 0xba98d24, 0x3c00010},
+{0x3c00000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3c00010},
+{0x3c00000, 0x80800002, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80000000, 0x80800002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80000001, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80000076, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80002b94, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80636d24, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x807fffff, 0x80800002, 0x3c00080},
+{0x3c00000, 0x80800002, 0x80800000, 0x81000001, 0x3c00000},
+{0x3c00000, 0x80800002, 0x80800002, 0x81000002, 0x3c00000},
+{0x3c00000, 0x80800002, 0x81398437, 0x81798438, 0x3c00000},
+{0x3c00000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3c00010},
+{0x3c00000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3c00010},
+{0x3c00000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x80800002, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x9503366, 0x9503325, 0x3c00010},
+{0x3c00000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x80800002, 0x966320b, 0x96631ca, 0x3c00010},
+{0x3c00000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x80800002, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x0, 0x81398437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x1, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x76, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x2b94, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x636d24, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x7fffff, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x800000, 0x80f3086e, 0x3c00000},
+{0x3c00000, 0x81398437, 0x800002, 0x80f3086c, 0x3c00000},
+{0x3c00000, 0x81398437, 0x1398437, 0x0, 0x3c00000},
+{0x3c00000, 0x81398437, 0xba98d27, 0xba98d21, 0x3c00010},
+{0x3c00000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3c00010},
+{0x3c00000, 0x81398437, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80000000, 0x81398437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80000001, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80000076, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80002b94, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80636d24, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x807fffff, 0x81398437, 0x3c00080},
+{0x3c00000, 0x81398437, 0x80800000, 0x81798437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x80800002, 0x81798438, 0x3c00000},
+{0x3c00000, 0x81398437, 0x81398437, 0x81b98437, 0x3c00000},
+{0x3c00000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3c00010},
+{0x3c00000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3c00010},
+{0x3c00000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x81398437, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x9503366, 0x95032ac, 0x3c00010},
+{0x3c00000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x81398437, 0x966320b, 0x9663151, 0x3c00010},
+{0x3c00000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x81398437, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xba98d27, 0x0, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3c00080},
+{0x3c00000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3c00080},
+{0x3c00000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x0, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x1, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x76, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x751f853a, 0x0, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3c00080},
+{0x3c00000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xf51f853a, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3c00080},
+{0x3c00000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x0, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x1, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x76, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3c00080},
+{0x3c00000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3c00014},
+{0x3c00000, 0xff7fffff, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3c00010},
+{0x3c00000, 0xff800000, 0x0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x1, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x76, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x2b94, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x636d24, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x7fffff, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x800002, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x1398437, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xba98d27, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xba98d7a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x751f853a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80000000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80000001, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80000076, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80002b94, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80636d24, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x807fffff, 0xff800000, 0x3c00080},
+{0x3c00000, 0xff800000, 0x80800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x80800002, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x81398437, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xf51f853a, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff7fffff, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xe73a5134, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x9503366, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x966320b, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xb26bddee, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x317285d3, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3c00000},
+{0x3c00000, 0xff800001, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff800001, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x1, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x76, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3c00081},
+{0x3c00000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x1, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x76, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3c00080},
+{0x3c00000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3c00080},
+{0x3c00000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3c00000},
+{0x3c00000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3c00010},
+{0x3c00000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x0, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x1, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x76, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3c00080},
+{0x3c00000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3c00000},
+{0x3c00000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3c00080},
+{0x3c00000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3c00000},
+{0x3c00000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3c00080},
+{0x3c00000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3c00000},
+{0x3c00000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x0, 0x9503366, 0x3c00000},
+{0x3c00000, 0x9503366, 0x1, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x76, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x2b94, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x636d24, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x7fffff, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x800000, 0x95033a6, 0x3c00000},
+{0x3c00000, 0x9503366, 0x800002, 0x95033a6, 0x3c00010},
+{0x3c00000, 0x9503366, 0x1398437, 0x950341f, 0x3c00010},
+{0x3c00000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3c00010},
+{0x3c00000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3c00010},
+{0x3c00000, 0x9503366, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80000000, 0x9503366, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80000001, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80000076, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80002b94, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80636d24, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x807fffff, 0x9503366, 0x3c00080},
+{0x3c00000, 0x9503366, 0x80800000, 0x9503326, 0x3c00000},
+{0x3c00000, 0x9503366, 0x80800002, 0x9503325, 0x3c00010},
+{0x3c00000, 0x9503366, 0x81398437, 0x95032ac, 0x3c00010},
+{0x3c00000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3c00010},
+{0x3c00000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3c00010},
+{0x3c00000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x9503366, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x9503366, 0x9d03366, 0x3c00000},
+{0x3c00000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x9503366, 0x966320b, 0x9db32b8, 0x3c00010},
+{0x3c00000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x9503366, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3c00080},
+{0x3c00000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3c00000},
+{0x3c00000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3c00080},
+{0x3c00000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3c00000},
+{0x3c00000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3c00080},
+{0x3c00000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3c00000},
+{0x3c00000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3c00080},
+{0x3c00000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3c00000},
+{0x3c00000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x966320b, 0x0, 0x966320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x1, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x76, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x2b94, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x636d24, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x7fffff, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x800000, 0x966324b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x800002, 0x966324b, 0x3c00010},
+{0x3c00000, 0x966320b, 0x1398437, 0x96632c4, 0x3c00010},
+{0x3c00000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3c00010},
+{0x3c00000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3c00010},
+{0x3c00000, 0x966320b, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80000000, 0x966320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80000001, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80000076, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80002b94, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80636d24, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x807fffff, 0x966320b, 0x3c00080},
+{0x3c00000, 0x966320b, 0x80800000, 0x96631cb, 0x3c00000},
+{0x3c00000, 0x966320b, 0x80800002, 0x96631ca, 0x3c00010},
+{0x3c00000, 0x966320b, 0x81398437, 0x9663151, 0x3c00010},
+{0x3c00000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3c00010},
+{0x3c00000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3c00010},
+{0x3c00000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x966320b, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x966320b, 0x9503366, 0x9db32b8, 0x3c00010},
+{0x3c00000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010},
+{0x3c00000, 0x966320b, 0x966320b, 0x9e6320b, 0x3c00000},
+{0x3c00000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0x966320b, 0x317285d3, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x0, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x1, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x76, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3c00080},
+{0x3c00000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3c00000},
+{0x3c00000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3c00080},
+{0x3c00000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3c00000},
+{0x3c00000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x0, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x1, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x76, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x2b94, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x636d24, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x800000, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x800002, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x1398437, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x80000000, 0x317285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x80000001, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80000076, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3c00080},
+{0x3c00000, 0x317285d3, 0x80800000, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x80800002, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x81398437, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x9503366, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x966320b, 0x317285d3, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3c00010},
+{0x3c00000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3c00000},
+{0x3c00000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3c00080},
+{0x3c00000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3c00000},
+{0x3c00000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3c00080},
+{0x3c00000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3c00010},
+{0x3c00000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3c00000},
+{0x3c00000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3c00014},
+{0x3c00000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3c00080},
+{0x3c00000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3c00001},
+{0x3c00000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3c00000},
+{0x3c00000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3c00010},
+{0x3c00000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3c00000},
+{0x3800000, 0x0, 0x0, 0x0, 0x3800000},
+{0x3800000, 0x0, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x800000, 0x800000, 0x3800000},
+{0x3800000, 0x0, 0x800002, 0x800002, 0x3800000},
+{0x3800000, 0x0, 0x1398437, 0x1398437, 0x3800000},
+{0x3800000, 0x0, 0xba98d27, 0xba98d27, 0x3800000},
+{0x3800000, 0x0, 0xba98d7a, 0xba98d7a, 0x3800000},
+{0x3800000, 0x0, 0x751f853a, 0x751f853a, 0x3800000},
+{0x3800000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x80000000, 0x80000000, 0x3800000},
+{0x3800000, 0x0, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x0, 0x80800000, 0x80800000, 0x3800000},
+{0x3800000, 0x0, 0x80800002, 0x80800002, 0x3800000},
+{0x3800000, 0x0, 0x81398437, 0x81398437, 0x3800000},
+{0x3800000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x0, 0xf51f853a, 0xf51f853a, 0x3800000},
+{0x3800000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0x0, 0xff7fffff, 0xff7fffff, 0x3800000},
+{0x3800000, 0x0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x0, 0xe73a5134, 0xe73a5134, 0x3800000},
+{0x3800000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x0, 0x9503366, 0x9503366, 0x3800000},
+{0x3800000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0x0, 0x966320b, 0x966320b, 0x3800000},
+{0x3800000, 0x0, 0xb26bddee, 0xb26bddee, 0x3800000},
+{0x3800000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0x0, 0x317285d3, 0x317285d3, 0x3800000},
+{0x3800000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x1, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x1, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x1, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x1, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x1, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x1, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x1, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x1, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x1, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x1, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x1, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x1, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x1, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x1, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x1, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x1, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x1, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x1, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x1, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x1, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x1, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x1, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x76, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x76, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x76, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x76, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x76, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x76, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x76, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x76, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x76, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x76, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x76, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x76, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x76, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x76, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x76, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x76, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x76, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x76, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x76, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x76, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x76, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x76, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x2b94, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x2b94, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x2b94, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x2b94, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x2b94, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x2b94, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x2b94, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x2b94, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x2b94, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x2b94, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x2b94, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x2b94, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x2b94, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x2b94, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x2b94, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x636d24, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x636d24, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x636d24, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x636d24, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x636d24, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x636d24, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x636d24, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x636d24, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x636d24, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x636d24, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x636d24, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x636d24, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x636d24, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x636d24, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x636d24, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7fffff, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x7fffff, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x7fffff, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x7fffff, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x7fffff, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x7fffff, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x7fffff, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x7fffff, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x800000, 0x0, 0x800000, 0x3800000},
+{0x3800000, 0x800000, 0x1, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x76, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x2b94, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x636d24, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x7fffff, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x800000, 0x1000000, 0x3800000},
+{0x3800000, 0x800000, 0x800002, 0x1000001, 0x3800000},
+{0x3800000, 0x800000, 0x1398437, 0x1798437, 0x3800000},
+{0x3800000, 0x800000, 0xba98d27, 0xba98d29, 0x3800000},
+{0x3800000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3800000},
+{0x3800000, 0x800000, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x80000000, 0x800000, 0x3800000},
+{0x3800000, 0x800000, 0x80000001, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80000076, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80002b94, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80636d24, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x807fffff, 0x800000, 0x3800080},
+{0x3800000, 0x800000, 0x80800000, 0x80000000, 0x3800000},
+{0x3800000, 0x800000, 0x80800002, 0x0, 0x3800008},
+{0x3800000, 0x800000, 0x81398437, 0x80f3086e, 0x3800000},
+{0x3800000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3800000},
+{0x3800000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3800000},
+{0x3800000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x800000, 0x9503366, 0x95033a6, 0x3800000},
+{0x3800000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x800000, 0x966320b, 0x966324b, 0x3800000},
+{0x3800000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x800000, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x800002, 0x0, 0x800002, 0x3800000},
+{0x3800000, 0x800002, 0x1, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x76, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x2b94, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x636d24, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x7fffff, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x800000, 0x1000001, 0x3800000},
+{0x3800000, 0x800002, 0x800002, 0x1000002, 0x3800000},
+{0x3800000, 0x800002, 0x1398437, 0x1798438, 0x3800000},
+{0x3800000, 0x800002, 0xba98d27, 0xba98d29, 0x3800010},
+{0x3800000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3800010},
+{0x3800000, 0x800002, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x800002, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x800002, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x80000000, 0x800002, 0x3800000},
+{0x3800000, 0x800002, 0x80000001, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80000076, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80002b94, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80636d24, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x807fffff, 0x800002, 0x3800080},
+{0x3800000, 0x800002, 0x80800000, 0x0, 0x3800008},
+{0x3800000, 0x800002, 0x80800002, 0x80000000, 0x3800000},
+{0x3800000, 0x800002, 0x81398437, 0x80f3086c, 0x3800000},
+{0x3800000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3800010},
+{0x3800000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3800010},
+{0x3800000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x800002, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x800002, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x800002, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x800002, 0x9503366, 0x95033a6, 0x3800010},
+{0x3800000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x800002, 0x966320b, 0x966324b, 0x3800010},
+{0x3800000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x800002, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x1398437, 0x0, 0x1398437, 0x3800000},
+{0x3800000, 0x1398437, 0x1, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x76, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x2b94, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x636d24, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x7fffff, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x800000, 0x1798437, 0x3800000},
+{0x3800000, 0x1398437, 0x800002, 0x1798438, 0x3800000},
+{0x3800000, 0x1398437, 0x1398437, 0x1b98437, 0x3800000},
+{0x3800000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3800010},
+{0x3800000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3800010},
+{0x3800000, 0x1398437, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x1398437, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x80000000, 0x1398437, 0x3800000},
+{0x3800000, 0x1398437, 0x80000001, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80000076, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80002b94, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80636d24, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x807fffff, 0x1398437, 0x3800080},
+{0x3800000, 0x1398437, 0x80800000, 0xf3086e, 0x3800000},
+{0x3800000, 0x1398437, 0x80800002, 0xf3086c, 0x3800000},
+{0x3800000, 0x1398437, 0x81398437, 0x80000000, 0x3800000},
+{0x3800000, 0x1398437, 0x8ba98d27, 0x8ba98d22, 0x3800010},
+{0x3800000, 0x1398437, 0x8ba98d7a, 0x8ba98d75, 0x3800010},
+{0x3800000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x1398437, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x1398437, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x1398437, 0x9503366, 0x950341f, 0x3800010},
+{0x3800000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x1398437, 0x966320b, 0x96632c4, 0x3800010},
+{0x3800000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x1398437, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xba98d27, 0x0, 0xba98d27, 0x3800000},
+{0x3800000, 0xba98d27, 0x1, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x76, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x2b94, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x636d24, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x800000, 0xba98d29, 0x3800000},
+{0x3800000, 0xba98d27, 0x800002, 0xba98d29, 0x3800010},
+{0x3800000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3800010},
+{0x3800000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3800000},
+{0x3800000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3800010},
+{0x3800000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x80000000, 0xba98d27, 0x3800000},
+{0x3800000, 0xba98d27, 0x80000001, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80000076, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3800080},
+{0x3800000, 0xba98d27, 0x80800000, 0xba98d25, 0x3800000},
+{0x3800000, 0xba98d27, 0x80800002, 0xba98d24, 0x3800010},
+{0x3800000, 0xba98d27, 0x81398437, 0xba98d21, 0x3800010},
+{0x3800000, 0xba98d27, 0x8ba98d27, 0x80000000, 0x3800000},
+{0x3800000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3800000},
+{0x3800000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0xba98d27, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3800010},
+{0x3800000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3800010},
+{0x3800000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x0, 0xba98d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x1, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x76, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3800000},
+{0x3800000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3800010},
+{0x3800000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3800010},
+{0x3800000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3800080},
+{0x3800000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3800000},
+{0x3800000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3800010},
+{0x3800000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3800010},
+{0x3800000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x8ba98d7a, 0x80000000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0xba98d7a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3800010},
+{0x3800000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3800010},
+{0x3800000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x751f853a, 0x0, 0x751f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x1, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x76, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x2b94, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x636d24, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x800000, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x800002, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x1398437, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3800010},
+{0x3800000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x80000000, 0x751f853a, 0x3800000},
+{0x3800000, 0x751f853a, 0x80000001, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80000076, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3800080},
+{0x3800000, 0x751f853a, 0x80800000, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x80800002, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x81398437, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xf51f853a, 0x80000000, 0x3800000},
+{0x3800000, 0x751f853a, 0xff7ffff0, 0xff7fffe7, 0x3800010},
+{0x3800000, 0x751f853a, 0xff7fffff, 0xff7ffff6, 0x3800010},
+{0x3800000, 0x751f853a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3800010},
+{0x3800000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x9503366, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3800010},
+{0x3800000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x966320b, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3800010},
+{0x3800000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3800010},
+{0x3800000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xff7ffff0, 0x80000000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff7fffff, 0x80000000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7f800000, 0x0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x1, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x76, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x2b94, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x636d24, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x800002, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x1398437, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80000000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80000001, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80000076, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3800080},
+{0x3800000, 0x7f800000, 0x80800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x80800002, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x81398437, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x9503366, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x966320b, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3800000},
+{0x3800000, 0x7f800001, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x0, 0x80000000, 0x3800000},
+{0x3800000, 0x80000000, 0x1, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x76, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x2b94, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x636d24, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x7fffff, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x800000, 0x800000, 0x3800000},
+{0x3800000, 0x80000000, 0x800002, 0x800002, 0x3800000},
+{0x3800000, 0x80000000, 0x1398437, 0x1398437, 0x3800000},
+{0x3800000, 0x80000000, 0xba98d27, 0xba98d27, 0x3800000},
+{0x3800000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3800000},
+{0x3800000, 0x80000000, 0x751f853a, 0x751f853a, 0x3800000},
+{0x3800000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3800000},
+{0x3800000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3800000},
+{0x3800000, 0x80000000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x80000000, 0x80000000, 0x3800000},
+{0x3800000, 0x80000000, 0x80000001, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80000076, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80002b94, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80636d24, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x807fffff, 0x80000000, 0x3800080},
+{0x3800000, 0x80000000, 0x80800000, 0x80800000, 0x3800000},
+{0x3800000, 0x80000000, 0x80800002, 0x80800002, 0x3800000},
+{0x3800000, 0x80000000, 0x81398437, 0x81398437, 0x3800000},
+{0x3800000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3800000},
+{0x3800000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3800000},
+{0x3800000, 0x80000000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80000000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3800000},
+{0x3800000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x80000000, 0x9503366, 0x9503366, 0x3800000},
+{0x3800000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0x80000000, 0x966320b, 0x966320b, 0x3800000},
+{0x3800000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3800000},
+{0x3800000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0x80000000, 0x317285d3, 0x317285d3, 0x3800000},
+{0x3800000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x80000001, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80000001, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80000001, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80000001, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80000001, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80000001, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80000001, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000001, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80000001, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80000001, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80000001, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80000001, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80000001, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80000001, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80000001, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80000076, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80000076, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80000076, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80000076, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80000076, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80000076, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80000076, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80000076, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80000076, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80000076, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80000076, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80000076, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80000076, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80000076, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80000076, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80002b94, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80002b94, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80002b94, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80002b94, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80002b94, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80002b94, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80002b94, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80002b94, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80636d24, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x80636d24, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x80636d24, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x80636d24, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x80636d24, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x80636d24, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x80636d24, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x80636d24, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x807fffff, 0x0, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x1, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x76, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x2b94, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x636d24, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fffff, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x800000, 0x800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x800002, 0x800002, 0x3800080},
+{0x3800000, 0x807fffff, 0x1398437, 0x1398437, 0x3800080},
+{0x3800000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3800080},
+{0x3800000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3800080},
+{0x3800000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000000, 0x80000000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000001, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80000076, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80002b94, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80636d24, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x807fffff, 0x0, 0x3800080},
+{0x3800000, 0x807fffff, 0x80800000, 0x80800000, 0x3800080},
+{0x3800000, 0x807fffff, 0x80800002, 0x80800002, 0x3800080},
+{0x3800000, 0x807fffff, 0x81398437, 0x81398437, 0x3800080},
+{0x3800000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3800080},
+{0x3800000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080},
+{0x3800000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0x807fffff, 0xff800000, 0xff800000, 0x3800080},
+{0x3800000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3800080},
+{0x3800000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x807fffff, 0x9503366, 0x9503366, 0x3800080},
+{0x3800000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0x807fffff, 0x966320b, 0x966320b, 0x3800080},
+{0x3800000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3800080},
+{0x3800000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3800080},
+{0x3800000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x80800000, 0x0, 0x80800000, 0x3800000},
+{0x3800000, 0x80800000, 0x1, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x76, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x2b94, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x636d24, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x7fffff, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x800000, 0x80000000, 0x3800000},
+{0x3800000, 0x80800000, 0x800002, 0x0, 0x3800008},
+{0x3800000, 0x80800000, 0x1398437, 0xf3086e, 0x3800000},
+{0x3800000, 0x80800000, 0xba98d27, 0xba98d25, 0x3800000},
+{0x3800000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3800000},
+{0x3800000, 0x80800000, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x80800000, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x80000000, 0x80800000, 0x3800000},
+{0x3800000, 0x80800000, 0x80000001, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80000076, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80002b94, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80636d24, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x807fffff, 0x80800000, 0x3800080},
+{0x3800000, 0x80800000, 0x80800000, 0x81000000, 0x3800000},
+{0x3800000, 0x80800000, 0x80800002, 0x81000001, 0x3800000},
+{0x3800000, 0x80800000, 0x81398437, 0x81798437, 0x3800000},
+{0x3800000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3800000},
+{0x3800000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3800000},
+{0x3800000, 0x80800000, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x80800000, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x80800000, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x80800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x80800000, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x80800000, 0x9503366, 0x9503326, 0x3800000},
+{0x3800000, 0x80800000, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x80800000, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x80800000, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x80800000, 0x966320b, 0x96631cb, 0x3800000},
+{0x3800000, 0x80800000, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x80800000, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x80800002, 0x0, 0x80800002, 0x3800000},
+{0x3800000, 0x80800002, 0x1, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x76, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x2b94, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x636d24, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x7fffff, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x800000, 0x0, 0x3800008},
+{0x3800000, 0x80800002, 0x800002, 0x80000000, 0x3800000},
+{0x3800000, 0x80800002, 0x1398437, 0xf3086c, 0x3800000},
+{0x3800000, 0x80800002, 0xba98d27, 0xba98d24, 0x3800010},
+{0x3800000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3800010},
+{0x3800000, 0x80800002, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x80800002, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x80000000, 0x80800002, 0x3800000},
+{0x3800000, 0x80800002, 0x80000001, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80000076, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80002b94, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80636d24, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x807fffff, 0x80800002, 0x3800080},
+{0x3800000, 0x80800002, 0x80800000, 0x81000001, 0x3800000},
+{0x3800000, 0x80800002, 0x80800002, 0x81000002, 0x3800000},
+{0x3800000, 0x80800002, 0x81398437, 0x81798438, 0x3800000},
+{0x3800000, 0x80800002, 0x8ba98d27, 0x8ba98d2a, 0x3800010},
+{0x3800000, 0x80800002, 0x8ba98d7a, 0x8ba98d7d, 0x3800010},
+{0x3800000, 0x80800002, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x80800002, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x80800002, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x80800002, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x80800002, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x80800002, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x80800002, 0x9503366, 0x9503325, 0x3800010},
+{0x3800000, 0x80800002, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x80800002, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x80800002, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x80800002, 0x966320b, 0x96631ca, 0x3800010},
+{0x3800000, 0x80800002, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x80800002, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x81398437, 0x0, 0x81398437, 0x3800000},
+{0x3800000, 0x81398437, 0x1, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x76, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x2b94, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x636d24, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x7fffff, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x800000, 0x80f3086e, 0x3800000},
+{0x3800000, 0x81398437, 0x800002, 0x80f3086c, 0x3800000},
+{0x3800000, 0x81398437, 0x1398437, 0x80000000, 0x3800000},
+{0x3800000, 0x81398437, 0xba98d27, 0xba98d21, 0x3800010},
+{0x3800000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3800010},
+{0x3800000, 0x81398437, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x81398437, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x80000000, 0x81398437, 0x3800000},
+{0x3800000, 0x81398437, 0x80000001, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80000076, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80002b94, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80636d24, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x807fffff, 0x81398437, 0x3800080},
+{0x3800000, 0x81398437, 0x80800000, 0x81798437, 0x3800000},
+{0x3800000, 0x81398437, 0x80800002, 0x81798438, 0x3800000},
+{0x3800000, 0x81398437, 0x81398437, 0x81b98437, 0x3800000},
+{0x3800000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3800010},
+{0x3800000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3800010},
+{0x3800000, 0x81398437, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x81398437, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x81398437, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x81398437, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x81398437, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x81398437, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x81398437, 0x9503366, 0x95032ac, 0x3800010},
+{0x3800000, 0x81398437, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x81398437, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x81398437, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x81398437, 0x966320b, 0x9663151, 0x3800010},
+{0x3800000, 0x81398437, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x81398437, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x1398437, 0x8ba98d22, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xba98d27, 0x80000000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3800080},
+{0x3800000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x80800002, 0x8ba98d2a, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d51, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x1398437, 0x8ba98d75, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xba98d7a, 0x80000000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3800080},
+{0x3800000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x80800002, 0x8ba98d7d, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d51, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xb26bddee, 0xb26bddef, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x0, 0xf51f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0x1, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x76, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x751f853a, 0x80000000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3800080},
+{0x3800000, 0xf51f853a, 0x80800000, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x80800002, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x81398437, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x8ba98d27, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x8ba98d7a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3800000},
+{0x3800000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3800010},
+{0x3800000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xf51f853a, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xe73a5134, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3800010},
+{0x3800000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xbf5a97c9, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xe6ff1a14, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3800010},
+{0x3800000, 0xf51f853a, 0xaab4d7d8, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0xb26bddee, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853b, 0x3800010},
+{0x3800000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3800010},
+{0x3800000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x751f853a, 0xff7fffe7, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7f7ffff0, 0x80000000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3800080},
+{0x3800000, 0xff7ffff0, 0x80800000, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x80800002, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x81398437, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3800014},
+{0x3800000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xe73a5134, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7c994e9e, 0xff7b357c, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xb26bddee, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3800010},
+{0x3800000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1c, 0x3800010},
+{0x3800000, 0xff7fffff, 0x0, 0xff7fffff, 0x3800000},
+{0x3800000, 0xff7fffff, 0x1, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x76, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x751f853a, 0xff7ffff6, 0x3800010},
+{0x3800000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f7fffff, 0x80000000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3800000},
+{0x3800000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3800080},
+{0x3800000, 0xff7fffff, 0x80800000, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x80800002, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x81398437, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x8ba98d27, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x8ba98d7a, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xe73a5134, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x7c994e9e, 0xff7b358b, 0x3800010},
+{0x3800000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xbf5a97c9, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xe6ff1a14, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3800010},
+{0x3800000, 0xff7fffff, 0xaab4d7d8, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0xb26bddee, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0xb5c8e5d3, 0xff800000, 0x3800014},
+{0x3800000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3800010},
+{0x3800000, 0xff7fffff, 0x7b906a6c, 0xff7edf2b, 0x3800010},
+{0x3800000, 0xff800000, 0x0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x1, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x76, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x2b94, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x636d24, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x7fffff, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x800002, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x1398437, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xba98d27, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xba98d7a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x751f853a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x80000000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x80000001, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80000076, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80002b94, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80636d24, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x807fffff, 0xff800000, 0x3800080},
+{0x3800000, 0xff800000, 0x80800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x80800002, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x81398437, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xf51f853a, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff7fffff, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xe73a5134, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x9503366, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x966320b, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xb26bddee, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x317285d3, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3800000},
+{0x3800000, 0xff800001, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff800001, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x1, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x76, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3800081},
+{0x3800000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x1, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x76, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3800080},
+{0x3800000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000},
+{0x3800000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3800080},
+{0x3800000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3800000},
+{0x3800000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3800010},
+{0x3800000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xe73a5134, 0x0, 0xe73a5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x1, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x76, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3800080},
+{0x3800000, 0xe73a5134, 0x80800000, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x80800002, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x81398437, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x8ba98d27, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x8ba98d7a, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xe73a5134, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xe73a5134, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xe73a5134, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3800000},
+{0x3800000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xe73a5134, 0x6164bd6c, 0xe73a42e9, 0x3800010},
+{0x3800000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xbf5a97c9, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3800000},
+{0x3800000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xe73a5134, 0xaab4d7d8, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0xb26bddee, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5135, 0x3800010},
+{0x3800000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3800010},
+{0x3800000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3800080},
+{0x3800000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff7ffff0, 0xff7b357c, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff7fffff, 0xff7b358b, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3800000},
+{0x3800000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3800080},
+{0x3800000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xe73a5134, 0xe73a42e9, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3800000},
+{0x3800000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7d, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x9503366, 0x0, 0x9503366, 0x3800000},
+{0x3800000, 0x9503366, 0x1, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x76, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x2b94, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x636d24, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x7fffff, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x800000, 0x95033a6, 0x3800000},
+{0x3800000, 0x9503366, 0x800002, 0x95033a6, 0x3800010},
+{0x3800000, 0x9503366, 0x1398437, 0x950341f, 0x3800010},
+{0x3800000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3800010},
+{0x3800000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3800010},
+{0x3800000, 0x9503366, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x9503366, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x80000000, 0x9503366, 0x3800000},
+{0x3800000, 0x9503366, 0x80000001, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80000076, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80002b94, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80636d24, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x807fffff, 0x9503366, 0x3800080},
+{0x3800000, 0x9503366, 0x80800000, 0x9503326, 0x3800000},
+{0x3800000, 0x9503366, 0x80800002, 0x9503325, 0x3800010},
+{0x3800000, 0x9503366, 0x81398437, 0x95032ac, 0x3800010},
+{0x3800000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3800010},
+{0x3800000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3800010},
+{0x3800000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x9503366, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x9503366, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x9503366, 0x9503366, 0x9d03366, 0x3800000},
+{0x3800000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x9503366, 0x966320b, 0x9db32b8, 0x3800010},
+{0x3800000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x9503366, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3800080},
+{0x3800000, 0xbf5a97c9, 0x80800000, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x80800002, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x81398437, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3800000},
+{0x3800000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e3, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ac, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3800080},
+{0x3800000, 0xe6ff1a14, 0x80800000, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x80800002, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x81398437, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7d, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3800000},
+{0x3800000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3800080},
+{0x3800000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3800000},
+{0x3800000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3800080},
+{0x3800000, 0xaab4d7d8, 0x80800000, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x80800002, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x81398437, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d9, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3800000},
+{0x3800000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x966320b, 0x0, 0x966320b, 0x3800000},
+{0x3800000, 0x966320b, 0x1, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x76, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x2b94, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x636d24, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x7fffff, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x800000, 0x966324b, 0x3800000},
+{0x3800000, 0x966320b, 0x800002, 0x966324b, 0x3800010},
+{0x3800000, 0x966320b, 0x1398437, 0x96632c4, 0x3800010},
+{0x3800000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3800010},
+{0x3800000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3800010},
+{0x3800000, 0x966320b, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x966320b, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x80000000, 0x966320b, 0x3800000},
+{0x3800000, 0x966320b, 0x80000001, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80000076, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80002b94, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80636d24, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x807fffff, 0x966320b, 0x3800080},
+{0x3800000, 0x966320b, 0x80800000, 0x96631cb, 0x3800000},
+{0x3800000, 0x966320b, 0x80800002, 0x96631ca, 0x3800010},
+{0x3800000, 0x966320b, 0x81398437, 0x9663151, 0x3800010},
+{0x3800000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3800010},
+{0x3800000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3800010},
+{0x3800000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x966320b, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x966320b, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x966320b, 0x9503366, 0x9db32b8, 0x3800010},
+{0x3800000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3800010},
+{0x3800000, 0x966320b, 0x966320b, 0x9e6320b, 0x3800000},
+{0x3800000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3800010},
+{0x3800000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0x966320b, 0x317285d3, 0x317285d3, 0x3800010},
+{0x3800000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0xb26bddee, 0x0, 0xb26bddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0x1, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x76, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3800080},
+{0x3800000, 0xb26bddee, 0x80800000, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x80800002, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x81398437, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x8ba98d27, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0x8ba98d7a, 0xb26bddef, 0x3800010},
+{0x3800000, 0xb26bddee, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xb26bddee, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xb26bddee, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xb26bddee, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xb26bddee, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97ca, 0x3800010},
+{0x3800000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3800010},
+{0x3800000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3800010},
+{0x3800000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3800000},
+{0x3800000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3800010},
+{0x3800000, 0xb26bddee, 0x317285d3, 0xb22f3c7a, 0x3800010},
+{0x3800000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3800010},
+{0x3800000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3800080},
+{0x3800000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d4, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff1, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xff7fffff, 0xff800000, 0x3800014},
+{0x3800000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5135, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a15, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3800000},
+{0x3800000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c91, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x317285d3, 0x0, 0x317285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x1, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x76, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x2b94, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x636d24, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x800000, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x800002, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x1398437, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x80000000, 0x317285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x80000001, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80000076, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3800080},
+{0x3800000, 0x317285d3, 0x80800000, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x80800002, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x81398437, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3800010},
+{0x3800000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x317285d3, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x317285d3, 0x9503366, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3800010},
+{0x3800000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3800010},
+{0x3800000, 0x317285d3, 0x966320b, 0x317285d3, 0x3800010},
+{0x3800000, 0x317285d3, 0xb26bddee, 0xb22f3c7a, 0x3800010},
+{0x3800000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c91, 0x3800010},
+{0x3800000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3800000},
+{0x3800000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3800010},
+{0x3800000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3800080},
+{0x3800000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ac, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3800010},
+{0x3800000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3800000},
+{0x3800000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3800080},
+{0x3800000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3800010},
+{0x3800000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3800000},
+{0x3800000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3800014},
+{0x3800000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3800080},
+{0x3800000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff7fffff, 0xff7edf2b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3800001},
+{0x3800000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3800000},
+{0x3800000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3800010},
+{0x3800000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3800000},
+{0x3400000, 0x0, 0x0, 0x0, 0x3400000},
+{0x3400000, 0x0, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x800000, 0x800000, 0x3400000},
+{0x3400000, 0x0, 0x800002, 0x800002, 0x3400000},
+{0x3400000, 0x0, 0x1398437, 0x1398437, 0x3400000},
+{0x3400000, 0x0, 0xba98d27, 0xba98d27, 0x3400000},
+{0x3400000, 0x0, 0xba98d7a, 0xba98d7a, 0x3400000},
+{0x3400000, 0x0, 0x751f853a, 0x751f853a, 0x3400000},
+{0x3400000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x80000000, 0x0, 0x3400000},
+{0x3400000, 0x0, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x0, 0x80800000, 0x80800000, 0x3400000},
+{0x3400000, 0x0, 0x80800002, 0x80800002, 0x3400000},
+{0x3400000, 0x0, 0x81398437, 0x81398437, 0x3400000},
+{0x3400000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x0, 0xf51f853a, 0xf51f853a, 0x3400000},
+{0x3400000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0x0, 0xff7fffff, 0xff7fffff, 0x3400000},
+{0x3400000, 0x0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x0, 0xe73a5134, 0xe73a5134, 0x3400000},
+{0x3400000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x0, 0x9503366, 0x9503366, 0x3400000},
+{0x3400000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0x0, 0x966320b, 0x966320b, 0x3400000},
+{0x3400000, 0x0, 0xb26bddee, 0xb26bddee, 0x3400000},
+{0x3400000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0x0, 0x317285d3, 0x317285d3, 0x3400000},
+{0x3400000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x1, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x1, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x1, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x1, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x1, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x1, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x1, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x1, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x1, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x1, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x1, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x1, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x1, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x1, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x1, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x1, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x1, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x1, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x1, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x1, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x1, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x76, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x76, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x76, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x76, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x76, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x76, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x76, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x76, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x76, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x76, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x76, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x76, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x76, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x76, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x76, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x76, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x76, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x76, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x76, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x76, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x76, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x2b94, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x2b94, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x2b94, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x2b94, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x2b94, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x2b94, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x2b94, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x2b94, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x2b94, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x2b94, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x2b94, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x2b94, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x2b94, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x2b94, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x636d24, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x636d24, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x636d24, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x636d24, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x636d24, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x636d24, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x636d24, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x636d24, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x636d24, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x636d24, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x636d24, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x636d24, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x636d24, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x636d24, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7fffff, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x7fffff, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x7fffff, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x7fffff, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x7fffff, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x7fffff, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x7fffff, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x7fffff, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x800000, 0x0, 0x800000, 0x3400000},
+{0x3400000, 0x800000, 0x1, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x76, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x2b94, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x636d24, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x7fffff, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x800000, 0x1000000, 0x3400000},
+{0x3400000, 0x800000, 0x800002, 0x1000001, 0x3400000},
+{0x3400000, 0x800000, 0x1398437, 0x1798437, 0x3400000},
+{0x3400000, 0x800000, 0xba98d27, 0xba98d29, 0x3400000},
+{0x3400000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3400000},
+{0x3400000, 0x800000, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x800000, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x800000, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x80000000, 0x800000, 0x3400000},
+{0x3400000, 0x800000, 0x80000001, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80000076, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80002b94, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80636d24, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x807fffff, 0x800000, 0x3400080},
+{0x3400000, 0x800000, 0x80800000, 0x0, 0x3400000},
+{0x3400000, 0x800000, 0x80800002, 0x0, 0x3400008},
+{0x3400000, 0x800000, 0x81398437, 0x80f3086e, 0x3400000},
+{0x3400000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3400000},
+{0x3400000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3400000},
+{0x3400000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800000, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x800000, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x800000, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x800000, 0x9503366, 0x95033a6, 0x3400000},
+{0x3400000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x800000, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x800000, 0x966320b, 0x966324b, 0x3400000},
+{0x3400000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x800000, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x800000, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x800000, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x800000, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x800002, 0x0, 0x800002, 0x3400000},
+{0x3400000, 0x800002, 0x1, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x76, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x2b94, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x636d24, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x7fffff, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x800000, 0x1000001, 0x3400000},
+{0x3400000, 0x800002, 0x800002, 0x1000002, 0x3400000},
+{0x3400000, 0x800002, 0x1398437, 0x1798438, 0x3400000},
+{0x3400000, 0x800002, 0xba98d27, 0xba98d2a, 0x3400010},
+{0x3400000, 0x800002, 0xba98d7a, 0xba98d7d, 0x3400010},
+{0x3400000, 0x800002, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x800002, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x800002, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x800002, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x800002, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x80000000, 0x800002, 0x3400000},
+{0x3400000, 0x800002, 0x80000001, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80000076, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80002b94, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80636d24, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x807fffff, 0x800002, 0x3400080},
+{0x3400000, 0x800002, 0x80800000, 0x0, 0x3400008},
+{0x3400000, 0x800002, 0x80800002, 0x0, 0x3400000},
+{0x3400000, 0x800002, 0x81398437, 0x80f3086c, 0x3400000},
+{0x3400000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3400010},
+{0x3400000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3400010},
+{0x3400000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x800002, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x800002, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x800002, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x800002, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x800002, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x800002, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x800002, 0x9503366, 0x95033a7, 0x3400010},
+{0x3400000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x800002, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x800002, 0x966320b, 0x966324c, 0x3400010},
+{0x3400000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x800002, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x800002, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x800002, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x800002, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x1398437, 0x0, 0x1398437, 0x3400000},
+{0x3400000, 0x1398437, 0x1, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x76, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x2b94, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x636d24, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x7fffff, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x800000, 0x1798437, 0x3400000},
+{0x3400000, 0x1398437, 0x800002, 0x1798438, 0x3400000},
+{0x3400000, 0x1398437, 0x1398437, 0x1b98437, 0x3400000},
+{0x3400000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3400010},
+{0x3400000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3400010},
+{0x3400000, 0x1398437, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x1398437, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x1398437, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x1398437, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x80000000, 0x1398437, 0x3400000},
+{0x3400000, 0x1398437, 0x80000001, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80000076, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80002b94, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80636d24, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x807fffff, 0x1398437, 0x3400080},
+{0x3400000, 0x1398437, 0x80800000, 0xf3086e, 0x3400000},
+{0x3400000, 0x1398437, 0x80800002, 0xf3086c, 0x3400000},
+{0x3400000, 0x1398437, 0x81398437, 0x0, 0x3400000},
+{0x3400000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3400010},
+{0x3400000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3400010},
+{0x3400000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x1398437, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x1398437, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x1398437, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x1398437, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x1398437, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x1398437, 0x9503366, 0x9503420, 0x3400010},
+{0x3400000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x1398437, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x1398437, 0x966320b, 0x96632c5, 0x3400010},
+{0x3400000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x1398437, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x1398437, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x1398437, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x1398437, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xba98d27, 0x0, 0xba98d27, 0x3400000},
+{0x3400000, 0xba98d27, 0x1, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x76, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x2b94, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x636d24, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x800000, 0xba98d29, 0x3400000},
+{0x3400000, 0xba98d27, 0x800002, 0xba98d2a, 0x3400010},
+{0x3400000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3400010},
+{0x3400000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3400000},
+{0x3400000, 0xba98d27, 0xba98d7a, 0xc298d51, 0x3400010},
+{0x3400000, 0xba98d27, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0xba98d27, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x80000000, 0xba98d27, 0x3400000},
+{0x3400000, 0xba98d27, 0x80000001, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80000076, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3400080},
+{0x3400000, 0xba98d27, 0x80800000, 0xba98d25, 0x3400000},
+{0x3400000, 0xba98d27, 0x80800002, 0xba98d25, 0x3400010},
+{0x3400000, 0xba98d27, 0x81398437, 0xba98d22, 0x3400010},
+{0x3400000, 0xba98d27, 0x8ba98d27, 0x0, 0x3400000},
+{0x3400000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3400000},
+{0x3400000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xba98d27, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d27, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0xba98d27, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0xba98d27, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0xba98d27, 0x9503366, 0xbb00ec3, 0x3400010},
+{0x3400000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xba98d27, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xba98d27, 0x966320b, 0xbb0beb8, 0x3400010},
+{0x3400000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xba98d27, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0xba98d27, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0xba98d27, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x0, 0xba98d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x1, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x76, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3400000},
+{0x3400000, 0xba98d7a, 0x800002, 0xba98d7d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3400010},
+{0x3400000, 0xba98d7a, 0xba98d27, 0xc298d51, 0x3400010},
+{0x3400000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3400080},
+{0x3400000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3400000},
+{0x3400000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3400010},
+{0x3400000, 0xba98d7a, 0x81398437, 0xba98d75, 0x3400010},
+{0x3400000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3400000},
+{0x3400000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xba98d7a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xba98d7a, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0xba98d7a, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x9503366, 0xbb00f16, 0x3400010},
+{0x3400000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xba98d7a, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xba98d7a, 0x966320b, 0xbb0bf0b, 0x3400010},
+{0x3400000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xba98d7a, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0xba98d7a, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0xba98d7a, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x751f853a, 0x0, 0x751f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x1, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x76, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x2b94, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x636d24, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x800000, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x800002, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x1398437, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xba98d27, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xba98d7a, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3400010},
+{0x3400000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x80000000, 0x751f853a, 0x3400000},
+{0x3400000, 0x751f853a, 0x80000001, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80000076, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3400080},
+{0x3400000, 0x751f853a, 0x80800000, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x80800002, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x81398437, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xf51f853a, 0x0, 0x3400000},
+{0x3400000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3400010},
+{0x3400000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3400010},
+{0x3400000, 0x751f853a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x751f853a, 0x4f3495cb, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x7c994e9e, 0x7c994fde, 0x3400010},
+{0x3400000, 0x751f853a, 0x6164bd6c, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x9503366, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3400010},
+{0x3400000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x966320b, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3400010},
+{0x3400000, 0x751f853a, 0x317285d3, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x3c9623b1, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x51fd2c7c, 0x751f853b, 0x3400010},
+{0x3400000, 0x751f853a, 0x7b906a6c, 0x7b906f69, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x800000, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x800002, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x1398437, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe7, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x9503366, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x966320b, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x800000, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x800002, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x1398437, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xba98d27, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xba98d7a, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff6, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f7fffff, 0x4f3495cb, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x6164bd6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x9503366, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x966320b, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x7f7fffff, 0x317285d3, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x3c9623b1, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x51fd2c7c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3400014},
+{0x3400000, 0x7f800000, 0x0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x1, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x76, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x2b94, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x636d24, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x800002, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x1398437, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80000000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80000001, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80000076, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3400080},
+{0x3400000, 0x7f800000, 0x80800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x80800002, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x81398437, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x9503366, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x966320b, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3400000},
+{0x3400000, 0x7f800001, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x0, 0x0, 0x3400000},
+{0x3400000, 0x80000000, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x800000, 0x800000, 0x3400000},
+{0x3400000, 0x80000000, 0x800002, 0x800002, 0x3400000},
+{0x3400000, 0x80000000, 0x1398437, 0x1398437, 0x3400000},
+{0x3400000, 0x80000000, 0xba98d27, 0xba98d27, 0x3400000},
+{0x3400000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3400000},
+{0x3400000, 0x80000000, 0x751f853a, 0x751f853a, 0x3400000},
+{0x3400000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3400000},
+{0x3400000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3400000},
+{0x3400000, 0x80000000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x80000000, 0x80000000, 0x3400000},
+{0x3400000, 0x80000000, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000000, 0x80800000, 0x80800000, 0x3400000},
+{0x3400000, 0x80000000, 0x80800002, 0x80800002, 0x3400000},
+{0x3400000, 0x80000000, 0x81398437, 0x81398437, 0x3400000},
+{0x3400000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3400000},
+{0x3400000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3400000},
+{0x3400000, 0x80000000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80000000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3400000},
+{0x3400000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x80000000, 0x9503366, 0x9503366, 0x3400000},
+{0x3400000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0x80000000, 0x966320b, 0x966320b, 0x3400000},
+{0x3400000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3400000},
+{0x3400000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0x80000000, 0x317285d3, 0x317285d3, 0x3400000},
+{0x3400000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x80000001, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80000001, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80000001, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80000001, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80000001, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80000001, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000001, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80000001, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80000001, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80000001, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80000001, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80000001, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80000001, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80000001, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80000076, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80000076, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80000076, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80000076, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80000076, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80000076, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80000076, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80000076, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80000076, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80000076, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80000076, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80000076, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80000076, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80000076, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80002b94, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80002b94, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80002b94, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80002b94, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80002b94, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80002b94, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80002b94, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80002b94, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80636d24, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x80636d24, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x80636d24, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x80636d24, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x80636d24, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x80636d24, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x80636d24, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x80636d24, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x807fffff, 0x0, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x1, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x76, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x2b94, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x636d24, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fffff, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x800000, 0x800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x800002, 0x800002, 0x3400080},
+{0x3400000, 0x807fffff, 0x1398437, 0x1398437, 0x3400080},
+{0x3400000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3400080},
+{0x3400000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3400080},
+{0x3400000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000000, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000001, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80000076, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80002b94, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80636d24, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x807fffff, 0x0, 0x3400080},
+{0x3400000, 0x807fffff, 0x80800000, 0x80800000, 0x3400080},
+{0x3400000, 0x807fffff, 0x80800002, 0x80800002, 0x3400080},
+{0x3400000, 0x807fffff, 0x81398437, 0x81398437, 0x3400080},
+{0x3400000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3400080},
+{0x3400000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080},
+{0x3400000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0x807fffff, 0xff800000, 0xff800000, 0x3400080},
+{0x3400000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3400080},
+{0x3400000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x807fffff, 0x9503366, 0x9503366, 0x3400080},
+{0x3400000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0x807fffff, 0x966320b, 0x966320b, 0x3400080},
+{0x3400000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3400080},
+{0x3400000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3400080},
+{0x3400000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x80800000, 0x0, 0x80800000, 0x3400000},
+{0x3400000, 0x80800000, 0x1, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x76, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x2b94, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x636d24, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x7fffff, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x800000, 0x0, 0x3400000},
+{0x3400000, 0x80800000, 0x800002, 0x0, 0x3400008},
+{0x3400000, 0x80800000, 0x1398437, 0xf3086e, 0x3400000},
+{0x3400000, 0x80800000, 0xba98d27, 0xba98d25, 0x3400000},
+{0x3400000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3400000},
+{0x3400000, 0x80800000, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x80800000, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x80000000, 0x80800000, 0x3400000},
+{0x3400000, 0x80800000, 0x80000001, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80000076, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80002b94, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80636d24, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x807fffff, 0x80800000, 0x3400080},
+{0x3400000, 0x80800000, 0x80800000, 0x81000000, 0x3400000},
+{0x3400000, 0x80800000, 0x80800002, 0x81000001, 0x3400000},
+{0x3400000, 0x80800000, 0x81398437, 0x81798437, 0x3400000},
+{0x3400000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3400000},
+{0x3400000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3400000},
+{0x3400000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x80800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x80800000, 0x9503366, 0x9503326, 0x3400000},
+{0x3400000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x80800000, 0x966320b, 0x96631cb, 0x3400000},
+{0x3400000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x80800000, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x80800002, 0x0, 0x80800002, 0x3400000},
+{0x3400000, 0x80800002, 0x1, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x76, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x2b94, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x636d24, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x7fffff, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x800000, 0x0, 0x3400008},
+{0x3400000, 0x80800002, 0x800002, 0x0, 0x3400000},
+{0x3400000, 0x80800002, 0x1398437, 0xf3086c, 0x3400000},
+{0x3400000, 0x80800002, 0xba98d27, 0xba98d25, 0x3400010},
+{0x3400000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3400010},
+{0x3400000, 0x80800002, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x80800002, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x80000000, 0x80800002, 0x3400000},
+{0x3400000, 0x80800002, 0x80000001, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80000076, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80002b94, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80636d24, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x807fffff, 0x80800002, 0x3400080},
+{0x3400000, 0x80800002, 0x80800000, 0x81000001, 0x3400000},
+{0x3400000, 0x80800002, 0x80800002, 0x81000002, 0x3400000},
+{0x3400000, 0x80800002, 0x81398437, 0x81798438, 0x3400000},
+{0x3400000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3400010},
+{0x3400000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3400010},
+{0x3400000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x80800002, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x80800002, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x80800002, 0x9503366, 0x9503326, 0x3400010},
+{0x3400000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x80800002, 0x966320b, 0x96631cb, 0x3400010},
+{0x3400000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x80800002, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x81398437, 0x0, 0x81398437, 0x3400000},
+{0x3400000, 0x81398437, 0x1, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x76, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x2b94, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x636d24, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x7fffff, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x800000, 0x80f3086e, 0x3400000},
+{0x3400000, 0x81398437, 0x800002, 0x80f3086c, 0x3400000},
+{0x3400000, 0x81398437, 0x1398437, 0x0, 0x3400000},
+{0x3400000, 0x81398437, 0xba98d27, 0xba98d22, 0x3400010},
+{0x3400000, 0x81398437, 0xba98d7a, 0xba98d75, 0x3400010},
+{0x3400000, 0x81398437, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x81398437, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x80000000, 0x81398437, 0x3400000},
+{0x3400000, 0x81398437, 0x80000001, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80000076, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80002b94, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80636d24, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x807fffff, 0x81398437, 0x3400080},
+{0x3400000, 0x81398437, 0x80800000, 0x81798437, 0x3400000},
+{0x3400000, 0x81398437, 0x80800002, 0x81798438, 0x3400000},
+{0x3400000, 0x81398437, 0x81398437, 0x81b98437, 0x3400000},
+{0x3400000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3400010},
+{0x3400000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3400010},
+{0x3400000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x81398437, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x81398437, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x81398437, 0x9503366, 0x95032ad, 0x3400010},
+{0x3400000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x81398437, 0x966320b, 0x9663152, 0x3400010},
+{0x3400000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x81398437, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xba98d27, 0x0, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3400080},
+{0x3400000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3400080},
+{0x3400000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xf51f853a, 0x0, 0xf51f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0x1, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x76, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x751f853a, 0x0, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe7, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff6, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3400080},
+{0x3400000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3400000},
+{0x3400000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3400010},
+{0x3400000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xf51f853a, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3400010},
+{0x3400000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x77f31e2f, 0x77ee2206, 0x3400010},
+{0x3400000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3400010},
+{0x3400000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3400010},
+{0x3400000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3400080},
+{0x3400000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3400010},
+{0x3400000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3400010},
+{0x3400000, 0xff7fffff, 0x0, 0xff7fffff, 0x3400000},
+{0x3400000, 0xff7fffff, 0x1, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x76, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3400000},
+{0x3400000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3400080},
+{0x3400000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3400014},
+{0x3400000, 0xff7fffff, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3400010},
+{0x3400000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3400010},
+{0x3400000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3400010},
+{0x3400000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3400010},
+{0x3400000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3400010},
+{0x3400000, 0xff800000, 0x0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x1, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x76, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x2b94, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x636d24, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x7fffff, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x800002, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x1398437, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xba98d27, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xba98d7a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x751f853a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x80000000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x80000001, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80000076, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80002b94, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80636d24, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x807fffff, 0xff800000, 0x3400080},
+{0x3400000, 0xff800000, 0x80800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x80800002, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x81398437, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xf51f853a, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff7fffff, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xe73a5134, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x9503366, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x966320b, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xb26bddee, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x317285d3, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3400000},
+{0x3400000, 0xff800001, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff800001, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x1, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x76, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3400081},
+{0x3400000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x1, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x76, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3400080},
+{0x3400000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000},
+{0x3400000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x800000, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x800002, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x1398437, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xba98d27, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xba98d7a, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3400080},
+{0x3400000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3400000},
+{0x3400000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x9503366, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x966320b, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x317285d3, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x51fd2c7c, 0x52016896, 0x3400010},
+{0x3400000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xe73a5134, 0x0, 0xe73a5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x1, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x76, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3400080},
+{0x3400000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xe73a5134, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3400000},
+{0x3400000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3400010},
+{0x3400000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3400000},
+{0x3400000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3400010},
+{0x3400000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3400010},
+{0x3400000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x800000, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x800002, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x1398437, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xba98d27, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xba98d7a, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x751f853a, 0x7c994fde, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3400080},
+{0x3400000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3400000},
+{0x3400000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x9503366, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x966320b, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x317285d3, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x800000, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x800002, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x1398437, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xba98d27, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xba98d7a, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3400080},
+{0x3400000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3400000},
+{0x3400000, 0x6164bd6c, 0x9503366, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x966320b, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x317285d3, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x9503366, 0x0, 0x9503366, 0x3400000},
+{0x3400000, 0x9503366, 0x1, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x76, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x2b94, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x636d24, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x7fffff, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x800000, 0x95033a6, 0x3400000},
+{0x3400000, 0x9503366, 0x800002, 0x95033a7, 0x3400010},
+{0x3400000, 0x9503366, 0x1398437, 0x9503420, 0x3400010},
+{0x3400000, 0x9503366, 0xba98d27, 0xbb00ec3, 0x3400010},
+{0x3400000, 0x9503366, 0xba98d7a, 0xbb00f16, 0x3400010},
+{0x3400000, 0x9503366, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x9503366, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x9503366, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x9503366, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x80000000, 0x9503366, 0x3400000},
+{0x3400000, 0x9503366, 0x80000001, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80000076, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80002b94, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80636d24, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x807fffff, 0x9503366, 0x3400080},
+{0x3400000, 0x9503366, 0x80800000, 0x9503326, 0x3400000},
+{0x3400000, 0x9503366, 0x80800002, 0x9503326, 0x3400010},
+{0x3400000, 0x9503366, 0x81398437, 0x95032ad, 0x3400010},
+{0x3400000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3400010},
+{0x3400000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3400010},
+{0x3400000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x9503366, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x9503366, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x9503366, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x9503366, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x9503366, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x9503366, 0x9503366, 0x9d03366, 0x3400000},
+{0x3400000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x9503366, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x9503366, 0x966320b, 0x9db32b9, 0x3400010},
+{0x3400000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x9503366, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x9503366, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x9503366, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x9503366, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3400080},
+{0x3400000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3400000},
+{0x3400000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3400080},
+{0x3400000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3400000},
+{0x3400000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x800000, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x800002, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x1398437, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xba98d27, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xba98d7a, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3400080},
+{0x3400000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xf51f853a, 0x77ee2206, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x77f31e2f, 0x4f3495cb, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x6164bd6c, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x9503366, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3400000},
+{0x3400000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x966320b, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x317285d3, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x3c9623b1, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e30, 0x3400010},
+{0x3400000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8b, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3400080},
+{0x3400000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3400000},
+{0x3400000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x317285d3, 0x3172802d, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x966320b, 0x0, 0x966320b, 0x3400000},
+{0x3400000, 0x966320b, 0x1, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x76, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x2b94, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x636d24, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x7fffff, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x800000, 0x966324b, 0x3400000},
+{0x3400000, 0x966320b, 0x800002, 0x966324c, 0x3400010},
+{0x3400000, 0x966320b, 0x1398437, 0x96632c5, 0x3400010},
+{0x3400000, 0x966320b, 0xba98d27, 0xbb0beb8, 0x3400010},
+{0x3400000, 0x966320b, 0xba98d7a, 0xbb0bf0b, 0x3400010},
+{0x3400000, 0x966320b, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x966320b, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x966320b, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x966320b, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x80000000, 0x966320b, 0x3400000},
+{0x3400000, 0x966320b, 0x80000001, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80000076, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80002b94, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80636d24, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x807fffff, 0x966320b, 0x3400080},
+{0x3400000, 0x966320b, 0x80800000, 0x96631cb, 0x3400000},
+{0x3400000, 0x966320b, 0x80800002, 0x96631cb, 0x3400010},
+{0x3400000, 0x966320b, 0x81398437, 0x9663152, 0x3400010},
+{0x3400000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3400010},
+{0x3400000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3400010},
+{0x3400000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x966320b, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x966320b, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x966320b, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x966320b, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x966320b, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x966320b, 0x9503366, 0x9db32b9, 0x3400010},
+{0x3400000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x966320b, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3400010},
+{0x3400000, 0x966320b, 0x966320b, 0x9e6320b, 0x3400000},
+{0x3400000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3400010},
+{0x3400000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0x966320b, 0x317285d3, 0x317285d4, 0x3400010},
+{0x3400000, 0x966320b, 0x3c9623b1, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x966320b, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x966320b, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0xb26bddee, 0x0, 0xb26bddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0x1, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x76, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3400080},
+{0x3400000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3400010},
+{0x3400000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xb26bddee, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3400010},
+{0x3400000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3400010},
+{0x3400000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3400010},
+{0x3400000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3400000},
+{0x3400000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3400010},
+{0x3400000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3400010},
+{0x3400000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3400010},
+{0x3400000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3400080},
+{0x3400000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3400000},
+{0x3400000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208e, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x317285d3, 0x0, 0x317285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x1, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x76, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x2b94, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x636d24, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x800000, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x800002, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x1398437, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xba98d27, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xba98d7a, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x317285d3, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x80000000, 0x317285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x80000001, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80000076, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3400080},
+{0x3400000, 0x317285d3, 0x80800000, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x80800002, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x81398437, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3400010},
+{0x3400000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x317285d3, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x317285d3, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x317285d3, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x317285d3, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x317285d3, 0x9503366, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3400010},
+{0x3400000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x317285d3, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x317285d3, 0xaab4d7d8, 0x3172802d, 0x3400010},
+{0x3400000, 0x317285d3, 0x966320b, 0x317285d4, 0x3400010},
+{0x3400000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3400010},
+{0x3400000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3400010},
+{0x3400000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3400000},
+{0x3400000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3400010},
+{0x3400000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x317285d3, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x800000, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x800002, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x1398437, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xba98d27, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xba98d7a, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3400080},
+{0x3400000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cc, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x9503366, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x966320b, 0x3c9623b2, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3400010},
+{0x3400000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208e, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3400000},
+{0x3400000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x800000, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x800002, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x1398437, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x751f853a, 0x751f853b, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3400080},
+{0x3400000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x4f3495cb, 0x52016896, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9f, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x9503366, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e30, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x966320b, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7d, 0x3400010},
+{0x3400000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3400000},
+{0x3400000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x800000, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x800002, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x1398437, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xba98d27, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xba98d7a, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x751f853a, 0x7b906f69, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3400014},
+{0x3400000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3400014},
+{0x3400000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3400080},
+{0x3400000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3400001},
+{0x3400000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3400000},
+{0x3400000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x9503366, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8b, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x966320b, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x317285d3, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6d, 0x3400010},
+{0x3400000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3400000},
+{0x3000000, 0x0, 0x0, 0x0, 0x3000000},
+{0x3000000, 0x0, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x800000, 0x800000, 0x3000000},
+{0x3000000, 0x0, 0x800002, 0x800002, 0x3000000},
+{0x3000000, 0x0, 0x1398437, 0x1398437, 0x3000000},
+{0x3000000, 0x0, 0xba98d27, 0xba98d27, 0x3000000},
+{0x3000000, 0x0, 0xba98d7a, 0xba98d7a, 0x3000000},
+{0x3000000, 0x0, 0x751f853a, 0x751f853a, 0x3000000},
+{0x3000000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x80000000, 0x0, 0x3000000},
+{0x3000000, 0x0, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x0, 0x80800000, 0x80800000, 0x3000000},
+{0x3000000, 0x0, 0x80800002, 0x80800002, 0x3000000},
+{0x3000000, 0x0, 0x81398437, 0x81398437, 0x3000000},
+{0x3000000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x0, 0xf51f853a, 0xf51f853a, 0x3000000},
+{0x3000000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0x0, 0xff7fffff, 0xff7fffff, 0x3000000},
+{0x3000000, 0x0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x0, 0xe73a5134, 0xe73a5134, 0x3000000},
+{0x3000000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x0, 0x9503366, 0x9503366, 0x3000000},
+{0x3000000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0x0, 0x966320b, 0x966320b, 0x3000000},
+{0x3000000, 0x0, 0xb26bddee, 0xb26bddee, 0x3000000},
+{0x3000000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0x0, 0x317285d3, 0x317285d3, 0x3000000},
+{0x3000000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x1, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x1, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x1, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x1, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x1, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x1, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x1, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x1, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x1, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x1, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x1, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x1, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x1, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x1, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x1, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x1, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x1, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x1, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x1, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x1, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x1, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x76, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x76, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x76, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x76, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x76, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x76, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x76, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x76, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x76, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x76, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x76, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x76, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x76, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x76, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x76, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x76, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x76, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x76, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x76, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x76, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x76, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x2b94, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x2b94, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x2b94, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x2b94, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x2b94, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x2b94, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x2b94, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x2b94, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x2b94, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x2b94, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x2b94, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x2b94, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x2b94, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x2b94, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x636d24, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x636d24, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x636d24, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x636d24, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x636d24, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x636d24, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x636d24, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x636d24, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x636d24, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x636d24, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x636d24, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x636d24, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x636d24, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x636d24, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7fffff, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x7fffff, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x7fffff, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x7fffff, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x7fffff, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x7fffff, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x7fffff, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x7fffff, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x800000, 0x0, 0x800000, 0x3000000},
+{0x3000000, 0x800000, 0x1, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x76, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x2b94, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x636d24, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x7fffff, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x800000, 0x1000000, 0x3000000},
+{0x3000000, 0x800000, 0x800002, 0x1000001, 0x3000000},
+{0x3000000, 0x800000, 0x1398437, 0x1798437, 0x3000000},
+{0x3000000, 0x800000, 0xba98d27, 0xba98d29, 0x3000000},
+{0x3000000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3000000},
+{0x3000000, 0x800000, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x80000000, 0x800000, 0x3000000},
+{0x3000000, 0x800000, 0x80000001, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80000076, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80002b94, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80636d24, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x807fffff, 0x800000, 0x3000080},
+{0x3000000, 0x800000, 0x80800000, 0x0, 0x3000000},
+{0x3000000, 0x800000, 0x80800002, 0x0, 0x3000008},
+{0x3000000, 0x800000, 0x81398437, 0x80f3086e, 0x3000000},
+{0x3000000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3000000},
+{0x3000000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3000000},
+{0x3000000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x800000, 0x9503366, 0x95033a6, 0x3000000},
+{0x3000000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x800000, 0x966320b, 0x966324b, 0x3000000},
+{0x3000000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x800000, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x800002, 0x0, 0x800002, 0x3000000},
+{0x3000000, 0x800002, 0x1, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x76, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x2b94, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x636d24, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x7fffff, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x800000, 0x1000001, 0x3000000},
+{0x3000000, 0x800002, 0x800002, 0x1000002, 0x3000000},
+{0x3000000, 0x800002, 0x1398437, 0x1798438, 0x3000000},
+{0x3000000, 0x800002, 0xba98d27, 0xba98d29, 0x3000010},
+{0x3000000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3000010},
+{0x3000000, 0x800002, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x800002, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x800002, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x80000000, 0x800002, 0x3000000},
+{0x3000000, 0x800002, 0x80000001, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80000076, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80002b94, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80636d24, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x807fffff, 0x800002, 0x3000080},
+{0x3000000, 0x800002, 0x80800000, 0x0, 0x3000008},
+{0x3000000, 0x800002, 0x80800002, 0x0, 0x3000000},
+{0x3000000, 0x800002, 0x81398437, 0x80f3086c, 0x3000000},
+{0x3000000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3000010},
+{0x3000000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3000010},
+{0x3000000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x800002, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x800002, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x800002, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x800002, 0x9503366, 0x95033a6, 0x3000010},
+{0x3000000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x800002, 0x966320b, 0x966324b, 0x3000010},
+{0x3000000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x800002, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x1398437, 0x0, 0x1398437, 0x3000000},
+{0x3000000, 0x1398437, 0x1, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x76, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x2b94, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x636d24, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x7fffff, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x800000, 0x1798437, 0x3000000},
+{0x3000000, 0x1398437, 0x800002, 0x1798438, 0x3000000},
+{0x3000000, 0x1398437, 0x1398437, 0x1b98437, 0x3000000},
+{0x3000000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3000010},
+{0x3000000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3000010},
+{0x3000000, 0x1398437, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x1398437, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x80000000, 0x1398437, 0x3000000},
+{0x3000000, 0x1398437, 0x80000001, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80000076, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80002b94, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80636d24, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x807fffff, 0x1398437, 0x3000080},
+{0x3000000, 0x1398437, 0x80800000, 0xf3086e, 0x3000000},
+{0x3000000, 0x1398437, 0x80800002, 0xf3086c, 0x3000000},
+{0x3000000, 0x1398437, 0x81398437, 0x0, 0x3000000},
+{0x3000000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3000010},
+{0x3000000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3000010},
+{0x3000000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x1398437, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x1398437, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x1398437, 0x9503366, 0x9503420, 0x3000010},
+{0x3000000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x1398437, 0x966320b, 0x96632c5, 0x3000010},
+{0x3000000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x1398437, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xba98d27, 0x0, 0xba98d27, 0x3000000},
+{0x3000000, 0xba98d27, 0x1, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x76, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x2b94, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x636d24, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x800000, 0xba98d29, 0x3000000},
+{0x3000000, 0xba98d27, 0x800002, 0xba98d29, 0x3000010},
+{0x3000000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3000010},
+{0x3000000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3000000},
+{0x3000000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3000010},
+{0x3000000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x80000000, 0xba98d27, 0x3000000},
+{0x3000000, 0xba98d27, 0x80000001, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80000076, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3000080},
+{0x3000000, 0xba98d27, 0x80800000, 0xba98d25, 0x3000000},
+{0x3000000, 0xba98d27, 0x80800002, 0xba98d25, 0x3000010},
+{0x3000000, 0xba98d27, 0x81398437, 0xba98d21, 0x3000010},
+{0x3000000, 0xba98d27, 0x8ba98d27, 0x0, 0x3000000},
+{0x3000000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3000000},
+{0x3000000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xba98d27, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3000010},
+{0x3000000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3000010},
+{0x3000000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x0, 0xba98d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x1, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x76, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3000000},
+{0x3000000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3000010},
+{0x3000000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3000010},
+{0x3000000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3000080},
+{0x3000000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3000000},
+{0x3000000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3000010},
+{0x3000000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3000010},
+{0x3000000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3000000},
+{0x3000000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xba98d7a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3000010},
+{0x3000000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3000010},
+{0x3000000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x751f853a, 0x0, 0x751f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x1, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x76, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x2b94, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x636d24, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x800000, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x800002, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x1398437, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3000010},
+{0x3000000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x80000000, 0x751f853a, 0x3000000},
+{0x3000000, 0x751f853a, 0x80000001, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80000076, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3000080},
+{0x3000000, 0x751f853a, 0x80800000, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x80800002, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x81398437, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xf51f853a, 0x0, 0x3000000},
+{0x3000000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3000010},
+{0x3000000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3000010},
+{0x3000000, 0x751f853a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3000010},
+{0x3000000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x9503366, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3000010},
+{0x3000000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x966320b, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3000010},
+{0x3000000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3000014},
+{0x3000000, 0x7f800000, 0x0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x1, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x76, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x2b94, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x636d24, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x800002, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x1398437, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80000000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80000001, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80000076, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3000080},
+{0x3000000, 0x7f800000, 0x80800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x80800002, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x81398437, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x9503366, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x966320b, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3000000},
+{0x3000000, 0x7f800001, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x0, 0x0, 0x3000000},
+{0x3000000, 0x80000000, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x800000, 0x800000, 0x3000000},
+{0x3000000, 0x80000000, 0x800002, 0x800002, 0x3000000},
+{0x3000000, 0x80000000, 0x1398437, 0x1398437, 0x3000000},
+{0x3000000, 0x80000000, 0xba98d27, 0xba98d27, 0x3000000},
+{0x3000000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3000000},
+{0x3000000, 0x80000000, 0x751f853a, 0x751f853a, 0x3000000},
+{0x3000000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3000000},
+{0x3000000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3000000},
+{0x3000000, 0x80000000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x80000000, 0x80000000, 0x3000000},
+{0x3000000, 0x80000000, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000000, 0x80800000, 0x80800000, 0x3000000},
+{0x3000000, 0x80000000, 0x80800002, 0x80800002, 0x3000000},
+{0x3000000, 0x80000000, 0x81398437, 0x81398437, 0x3000000},
+{0x3000000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3000000},
+{0x3000000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3000000},
+{0x3000000, 0x80000000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80000000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3000000},
+{0x3000000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x80000000, 0x9503366, 0x9503366, 0x3000000},
+{0x3000000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0x80000000, 0x966320b, 0x966320b, 0x3000000},
+{0x3000000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3000000},
+{0x3000000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0x80000000, 0x317285d3, 0x317285d3, 0x3000000},
+{0x3000000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x80000001, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80000001, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80000001, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80000001, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80000001, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80000001, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000001, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80000001, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80000001, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80000001, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80000001, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80000001, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80000001, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80000001, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80000076, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80000076, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80000076, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80000076, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80000076, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80000076, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80000076, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80000076, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80000076, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80000076, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80000076, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80000076, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80000076, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80000076, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80002b94, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80002b94, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80002b94, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80002b94, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80002b94, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80002b94, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80002b94, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80002b94, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80636d24, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x80636d24, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x80636d24, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x80636d24, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x80636d24, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x80636d24, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x80636d24, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x80636d24, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x807fffff, 0x0, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x1, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x76, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x2b94, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x636d24, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fffff, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x800000, 0x800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x800002, 0x800002, 0x3000080},
+{0x3000000, 0x807fffff, 0x1398437, 0x1398437, 0x3000080},
+{0x3000000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3000080},
+{0x3000000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3000080},
+{0x3000000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000000, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000001, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80000076, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80002b94, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80636d24, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x807fffff, 0x0, 0x3000080},
+{0x3000000, 0x807fffff, 0x80800000, 0x80800000, 0x3000080},
+{0x3000000, 0x807fffff, 0x80800002, 0x80800002, 0x3000080},
+{0x3000000, 0x807fffff, 0x81398437, 0x81398437, 0x3000080},
+{0x3000000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3000080},
+{0x3000000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080},
+{0x3000000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0x807fffff, 0xff800000, 0xff800000, 0x3000080},
+{0x3000000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3000080},
+{0x3000000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x807fffff, 0x9503366, 0x9503366, 0x3000080},
+{0x3000000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0x807fffff, 0x966320b, 0x966320b, 0x3000080},
+{0x3000000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3000080},
+{0x3000000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3000080},
+{0x3000000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x80800000, 0x0, 0x80800000, 0x3000000},
+{0x3000000, 0x80800000, 0x1, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x76, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x2b94, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x636d24, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x7fffff, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x800000, 0x0, 0x3000000},
+{0x3000000, 0x80800000, 0x800002, 0x0, 0x3000008},
+{0x3000000, 0x80800000, 0x1398437, 0xf3086e, 0x3000000},
+{0x3000000, 0x80800000, 0xba98d27, 0xba98d25, 0x3000000},
+{0x3000000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3000000},
+{0x3000000, 0x80800000, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x80800000, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x80000000, 0x80800000, 0x3000000},
+{0x3000000, 0x80800000, 0x80000001, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80000076, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80002b94, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80636d24, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x807fffff, 0x80800000, 0x3000080},
+{0x3000000, 0x80800000, 0x80800000, 0x81000000, 0x3000000},
+{0x3000000, 0x80800000, 0x80800002, 0x81000001, 0x3000000},
+{0x3000000, 0x80800000, 0x81398437, 0x81798437, 0x3000000},
+{0x3000000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3000000},
+{0x3000000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3000000},
+{0x3000000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x80800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x80800000, 0x9503366, 0x9503326, 0x3000000},
+{0x3000000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x80800000, 0x966320b, 0x96631cb, 0x3000000},
+{0x3000000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x80800000, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x80800002, 0x0, 0x80800002, 0x3000000},
+{0x3000000, 0x80800002, 0x1, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x76, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x2b94, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x636d24, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x7fffff, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x800000, 0x0, 0x3000008},
+{0x3000000, 0x80800002, 0x800002, 0x0, 0x3000000},
+{0x3000000, 0x80800002, 0x1398437, 0xf3086c, 0x3000000},
+{0x3000000, 0x80800002, 0xba98d27, 0xba98d25, 0x3000010},
+{0x3000000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3000010},
+{0x3000000, 0x80800002, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x80800002, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x80000000, 0x80800002, 0x3000000},
+{0x3000000, 0x80800002, 0x80000001, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80000076, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80002b94, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80636d24, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x807fffff, 0x80800002, 0x3000080},
+{0x3000000, 0x80800002, 0x80800000, 0x81000001, 0x3000000},
+{0x3000000, 0x80800002, 0x80800002, 0x81000002, 0x3000000},
+{0x3000000, 0x80800002, 0x81398437, 0x81798438, 0x3000000},
+{0x3000000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3000010},
+{0x3000000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3000010},
+{0x3000000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x80800002, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x80800002, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x80800002, 0x9503366, 0x9503326, 0x3000010},
+{0x3000000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x80800002, 0x966320b, 0x96631cb, 0x3000010},
+{0x3000000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x80800002, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x81398437, 0x0, 0x81398437, 0x3000000},
+{0x3000000, 0x81398437, 0x1, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x76, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x2b94, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x636d24, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x7fffff, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x800000, 0x80f3086e, 0x3000000},
+{0x3000000, 0x81398437, 0x800002, 0x80f3086c, 0x3000000},
+{0x3000000, 0x81398437, 0x1398437, 0x0, 0x3000000},
+{0x3000000, 0x81398437, 0xba98d27, 0xba98d21, 0x3000010},
+{0x3000000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3000010},
+{0x3000000, 0x81398437, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x81398437, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x80000000, 0x81398437, 0x3000000},
+{0x3000000, 0x81398437, 0x80000001, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80000076, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80002b94, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80636d24, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x807fffff, 0x81398437, 0x3000080},
+{0x3000000, 0x81398437, 0x80800000, 0x81798437, 0x3000000},
+{0x3000000, 0x81398437, 0x80800002, 0x81798438, 0x3000000},
+{0x3000000, 0x81398437, 0x81398437, 0x81b98437, 0x3000000},
+{0x3000000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3000010},
+{0x3000000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3000010},
+{0x3000000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x81398437, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x81398437, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x81398437, 0x9503366, 0x95032ac, 0x3000010},
+{0x3000000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x81398437, 0x966320b, 0x9663151, 0x3000010},
+{0x3000000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x81398437, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xba98d27, 0x0, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3000080},
+{0x3000000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3000080},
+{0x3000000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xf51f853a, 0x0, 0xf51f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0x1, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x76, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x751f853a, 0x0, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3000080},
+{0x3000000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3000000},
+{0x3000000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3000010},
+{0x3000000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xf51f853a, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3000010},
+{0x3000000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3000010},
+{0x3000000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3000010},
+{0x3000000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3000080},
+{0x3000000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3000014},
+{0x3000000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3000010},
+{0x3000000, 0xff7fffff, 0x0, 0xff7fffff, 0x3000000},
+{0x3000000, 0xff7fffff, 0x1, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x76, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3000000},
+{0x3000000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3000080},
+{0x3000000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3000014},
+{0x3000000, 0xff7fffff, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3000010},
+{0x3000000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3000010},
+{0x3000000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3000010},
+{0x3000000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3000010},
+{0x3000000, 0xff800000, 0x0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x1, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x76, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x2b94, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x636d24, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x7fffff, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x800002, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x1398437, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xba98d27, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xba98d7a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x751f853a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x80000000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x80000001, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80000076, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80002b94, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80636d24, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x807fffff, 0xff800000, 0x3000080},
+{0x3000000, 0xff800000, 0x80800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x80800002, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x81398437, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xf51f853a, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff7fffff, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xe73a5134, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x9503366, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x966320b, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xb26bddee, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x317285d3, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3000000},
+{0x3000000, 0xff800001, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff800001, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x1, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x76, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3000081},
+{0x3000000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x1, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x76, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3000080},
+{0x3000000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000},
+{0x3000000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3000080},
+{0x3000000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3000000},
+{0x3000000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3000010},
+{0x3000000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xe73a5134, 0x0, 0xe73a5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x1, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x76, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3000080},
+{0x3000000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xe73a5134, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3000000},
+{0x3000000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3000010},
+{0x3000000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3000000},
+{0x3000000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3000010},
+{0x3000000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3000080},
+{0x3000000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3000000},
+{0x3000000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3000080},
+{0x3000000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3000000},
+{0x3000000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x9503366, 0x0, 0x9503366, 0x3000000},
+{0x3000000, 0x9503366, 0x1, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x76, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x2b94, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x636d24, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x7fffff, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x800000, 0x95033a6, 0x3000000},
+{0x3000000, 0x9503366, 0x800002, 0x95033a6, 0x3000010},
+{0x3000000, 0x9503366, 0x1398437, 0x9503420, 0x3000010},
+{0x3000000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3000010},
+{0x3000000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3000010},
+{0x3000000, 0x9503366, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x9503366, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x80000000, 0x9503366, 0x3000000},
+{0x3000000, 0x9503366, 0x80000001, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80000076, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80002b94, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80636d24, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x807fffff, 0x9503366, 0x3000080},
+{0x3000000, 0x9503366, 0x80800000, 0x9503326, 0x3000000},
+{0x3000000, 0x9503366, 0x80800002, 0x9503326, 0x3000010},
+{0x3000000, 0x9503366, 0x81398437, 0x95032ac, 0x3000010},
+{0x3000000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3000010},
+{0x3000000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3000010},
+{0x3000000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x9503366, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x9503366, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x9503366, 0x9503366, 0x9d03366, 0x3000000},
+{0x3000000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x9503366, 0x966320b, 0x9db32b8, 0x3000010},
+{0x3000000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x9503366, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3000080},
+{0x3000000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3000000},
+{0x3000000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3000080},
+{0x3000000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3000000},
+{0x3000000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3000080},
+{0x3000000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3000000},
+{0x3000000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3000080},
+{0x3000000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3000000},
+{0x3000000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x966320b, 0x0, 0x966320b, 0x3000000},
+{0x3000000, 0x966320b, 0x1, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x76, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x2b94, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x636d24, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x7fffff, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x800000, 0x966324b, 0x3000000},
+{0x3000000, 0x966320b, 0x800002, 0x966324b, 0x3000010},
+{0x3000000, 0x966320b, 0x1398437, 0x96632c5, 0x3000010},
+{0x3000000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3000010},
+{0x3000000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3000010},
+{0x3000000, 0x966320b, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x966320b, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x80000000, 0x966320b, 0x3000000},
+{0x3000000, 0x966320b, 0x80000001, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80000076, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80002b94, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80636d24, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x807fffff, 0x966320b, 0x3000080},
+{0x3000000, 0x966320b, 0x80800000, 0x96631cb, 0x3000000},
+{0x3000000, 0x966320b, 0x80800002, 0x96631cb, 0x3000010},
+{0x3000000, 0x966320b, 0x81398437, 0x9663151, 0x3000010},
+{0x3000000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3000010},
+{0x3000000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3000010},
+{0x3000000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x966320b, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x966320b, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x966320b, 0x9503366, 0x9db32b8, 0x3000010},
+{0x3000000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3000010},
+{0x3000000, 0x966320b, 0x966320b, 0x9e6320b, 0x3000000},
+{0x3000000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3000010},
+{0x3000000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0x966320b, 0x317285d3, 0x317285d3, 0x3000010},
+{0x3000000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x0, 0xb26bddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0x1, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x76, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3000080},
+{0x3000000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xb26bddee, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3000010},
+{0x3000000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3000010},
+{0x3000000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3000000},
+{0x3000000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3000010},
+{0x3000000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3000010},
+{0x3000000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3000010},
+{0x3000000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3000080},
+{0x3000000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3000000},
+{0x3000000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x317285d3, 0x0, 0x317285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x1, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x76, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x2b94, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x636d24, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x800000, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x800002, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x1398437, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x80000000, 0x317285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x80000001, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80000076, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3000080},
+{0x3000000, 0x317285d3, 0x80800000, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x80800002, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x81398437, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x317285d3, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x317285d3, 0x9503366, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3000010},
+{0x3000000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3000010},
+{0x3000000, 0x317285d3, 0x966320b, 0x317285d3, 0x3000010},
+{0x3000000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3000010},
+{0x3000000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3000010},
+{0x3000000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3000000},
+{0x3000000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3000010},
+{0x3000000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3000080},
+{0x3000000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3000010},
+{0x3000000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3000000},
+{0x3000000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3000080},
+{0x3000000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3000010},
+{0x3000000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3000000},
+{0x3000000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3000014},
+{0x3000000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3000014},
+{0x3000000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3000080},
+{0x3000000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3000001},
+{0x3000000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3000000},
+{0x3000000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3000010},
+{0x3000000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3000000},
diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp
new file mode 100644
index 000000000..671afb702
--- /dev/null
+++ b/src/tests/core/memory/memory.cpp
@@ -0,0 +1,56 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <catch.hpp>
+#include "core/hle/kernel/memory.h"
+#include "core/hle/kernel/process.h"
+#include "core/memory.h"
+
+TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") {
+ SECTION("these regions should not be mapped on an empty process") {
+ auto process = Kernel::Process::Create("");
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::HEAP_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::LINEAR_HEAP_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == false);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::TLS_AREA_VADDR) == false);
+ }
+
+ SECTION("CONFIG_MEMORY_VADDR and SHARED_PAGE_VADDR should be valid after mapping them") {
+ auto process = Kernel::Process::Create("");
+ Kernel::MapSharedPages(process->vm_manager);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == true);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == true);
+ }
+
+ SECTION("special regions should be valid after mapping them") {
+ auto process = Kernel::Process::Create("");
+ SECTION("VRAM") {
+ Kernel::HandleSpecialMapping(process->vm_manager,
+ {Memory::VRAM_VADDR, Memory::VRAM_SIZE, false, false});
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == true);
+ }
+
+ SECTION("IO (Not yet implemented)") {
+ Kernel::HandleSpecialMapping(
+ process->vm_manager, {Memory::IO_AREA_VADDR, Memory::IO_AREA_SIZE, false, false});
+ CHECK_FALSE(Memory::IsValidVirtualAddress(*process, Memory::IO_AREA_VADDR) == true);
+ }
+
+ SECTION("DSP") {
+ Kernel::HandleSpecialMapping(
+ process->vm_manager, {Memory::DSP_RAM_VADDR, Memory::DSP_RAM_SIZE, false, false});
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::DSP_RAM_VADDR) == true);
+ }
+ }
+
+ SECTION("Unmapping a VAddr should make it invalid") {
+ auto process = Kernel::Process::Create("");
+ Kernel::MapSharedPages(process->vm_manager);
+ process->vm_manager.UnmapRange(Memory::CONFIG_MEMORY_VADDR, Memory::CONFIG_MEMORY_SIZE);
+ CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);
+ }
+}
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 0961a3251..82f47d8a9 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -1,6 +1,7 @@
set(SRCS
command_processor.cpp
debug_utils/debug_utils.cpp
+ geometry_pipeline.cpp
pica.cpp
primitive_assembly.cpp
regs.cpp
@@ -15,6 +16,7 @@ set(SRCS
shader/shader_interpreter.cpp
swrasterizer/clipper.cpp
swrasterizer/framebuffer.cpp
+ swrasterizer/lighting.cpp
swrasterizer/proctex.cpp
swrasterizer/rasterizer.cpp
swrasterizer/swrasterizer.cpp
@@ -28,6 +30,7 @@ set(SRCS
set(HEADERS
command_processor.h
debug_utils/debug_utils.h
+ geometry_pipeline.h
gpu_debugger.h
pica.h
pica_state.h
@@ -55,6 +58,7 @@ set(HEADERS
shader/shader_interpreter.h
swrasterizer/clipper.h
swrasterizer/framebuffer.h
+ swrasterizer/lighting.h
swrasterizer/proctex.h
swrasterizer/rasterizer.h
swrasterizer/swrasterizer.h
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 4633a1df1..caf9f7a06 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -119,24 +119,221 @@ static void WriteUniformFloatReg(ShaderRegs& config, Shader::ShaderSetup& setup,
}
}
-static void WriteProgramCode(ShaderRegs& config, Shader::ShaderSetup& setup,
- unsigned max_program_code_length, u32 value) {
- if (config.program.offset >= max_program_code_length) {
- LOG_ERROR(HW_GPU, "Invalid %s program offset %d", GetShaderSetupTypeName(setup),
- (int)config.program.offset);
- } else {
- setup.program_code[config.program.offset] = value;
- config.program.offset++;
+static void LoadDefaultVertexAttributes(u32 register_value) {
+ auto& regs = g_state.regs;
+
+ // TODO: Does actual hardware indeed keep an intermediate buffer or does
+ // it directly write the values?
+ default_attr_write_buffer[default_attr_counter++] = register_value;
+
+ // Default attributes are written in a packed format such that four float24 values are encoded
+ // in three 32-bit numbers.
+ // We write to internal memory once a full such vector is written.
+ if (default_attr_counter >= 3) {
+ default_attr_counter = 0;
+
+ auto& setup = regs.pipeline.vs_default_attributes_setup;
+
+ if (setup.index >= 16) {
+ LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
+ return;
+ }
+
+ Math::Vec4<float24> attribute;
+
+ // NOTE: The destination component order indeed is "backwards"
+ attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
+ attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
+ ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
+ attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
+ ((default_attr_write_buffer[2] >> 24) & 0xFF));
+ attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
+
+ LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
+ attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
+ attribute.w.ToFloat32());
+
+ // TODO: Verify that this actually modifies the register!
+ if (setup.index < 15) {
+ g_state.input_default_attributes.attr[setup.index] = attribute;
+ setup.index++;
+ } else {
+ // Put each attribute into an immediate input buffer. When all specified immediate
+ // attributes are present, the Vertex Shader is invoked and everything is sent to
+ // the primitive assembler.
+
+ auto& immediate_input = g_state.immediate.input_vertex;
+ auto& immediate_attribute_id = g_state.immediate.current_attribute;
+
+ immediate_input.attr[immediate_attribute_id] = attribute;
+
+ if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
+ immediate_attribute_id += 1;
+ } else {
+ MICROPROFILE_SCOPE(GPU_Drawing);
+ immediate_attribute_id = 0;
+
+ auto* shader_engine = Shader::GetEngine();
+ shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
+
+ // Send to vertex shader
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
+ static_cast<void*>(&immediate_input));
+ Shader::UnitState shader_unit;
+ Shader::AttributeBuffer output{};
+
+ shader_unit.LoadInput(regs.vs, immediate_input);
+ shader_engine->Run(g_state.vs, shader_unit);
+ shader_unit.WriteOutput(regs.vs, output);
+
+ // Send to geometry pipeline
+ if (g_state.immediate.reset_geometry_pipeline) {
+ g_state.geometry_pipeline.Reconfigure();
+ g_state.immediate.reset_geometry_pipeline = false;
+ }
+ ASSERT(!g_state.geometry_pipeline.NeedIndexInput());
+ g_state.geometry_pipeline.Setup(shader_engine);
+ g_state.geometry_pipeline.SubmitVertex(output);
+
+ // TODO: If drawing after every immediate mode triangle kills performance,
+ // change it to flush triangles whenever a drawing config register changes
+ // See: https://github.com/citra-emu/citra/pull/2866#issuecomment-327011550
+ VideoCore::g_renderer->Rasterizer()->DrawTriangles();
+ if (g_debug_context) {
+ g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
+ }
+ }
+ }
}
}
-static void WriteSwizzlePatterns(ShaderRegs& config, Shader::ShaderSetup& setup, u32 value) {
- if (config.swizzle_patterns.offset >= setup.swizzle_data.size()) {
- LOG_ERROR(HW_GPU, "Invalid %s swizzle pattern offset %d", GetShaderSetupTypeName(setup),
- (int)config.swizzle_patterns.offset);
- } else {
- setup.swizzle_data[config.swizzle_patterns.offset] = value;
- config.swizzle_patterns.offset++;
+static void Draw(u32 command_id) {
+ MICROPROFILE_SCOPE(GPU_Drawing);
+ auto& regs = g_state.regs;
+
+#if PICA_LOG_TEV
+ DebugUtils::DumpTevStageConfig(regs.GetTevStages());
+#endif
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
+
+ // Processes information about internal vertex attributes to figure out how a vertex is
+ // loaded.
+ // Later, these can be compiled and cached.
+ const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
+ VertexLoader loader(regs.pipeline);
+
+ // Load vertices
+ bool is_indexed = (command_id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
+
+ const auto& index_info = regs.pipeline.index_array;
+ const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
+ const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
+ bool index_u16 = index_info.format != 0;
+
+ PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
+
+ if (g_debug_context && g_debug_context->recorder) {
+ for (int i = 0; i < 3; ++i) {
+ const auto texture = regs.texturing.GetTextures()[i];
+ if (!texture.enabled)
+ continue;
+
+ u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
+ g_debug_context->recorder->MemoryAccessed(
+ texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
+ texture.config.width / 2 * texture.config.height,
+ texture.config.GetPhysicalAddress());
+ }
+ }
+
+ DebugUtils::MemoryAccessTracker memory_accesses;
+
+ // Simple circular-replacement vertex cache
+ // The size has been tuned for optimal balance between hit-rate and the cost of lookup
+ const size_t VERTEX_CACHE_SIZE = 32;
+ std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
+ std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache;
+ Shader::AttributeBuffer vs_output;
+
+ unsigned int vertex_cache_pos = 0;
+ vertex_cache_ids.fill(-1);
+
+ auto* shader_engine = Shader::GetEngine();
+ Shader::UnitState shader_unit;
+
+ shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
+
+ g_state.geometry_pipeline.Reconfigure();
+ g_state.geometry_pipeline.Setup(shader_engine);
+ if (g_state.geometry_pipeline.NeedIndexInput())
+ ASSERT(is_indexed);
+
+ for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
+ // Indexed rendering doesn't use the start offset
+ unsigned int vertex = is_indexed
+ ? (index_u16 ? index_address_16[index] : index_address_8[index])
+ : (index + regs.pipeline.vertex_offset);
+
+ // -1 is a common special value used for primitive restart. Since it's unknown if
+ // the PICA supports it, and it would mess up the caching, guard against it here.
+ ASSERT(vertex != -1);
+
+ bool vertex_cache_hit = false;
+
+ if (is_indexed) {
+ if (g_state.geometry_pipeline.NeedIndexInput()) {
+ g_state.geometry_pipeline.SubmitIndex(vertex);
+ continue;
+ }
+
+ if (g_debug_context && Pica::g_debug_context->recorder) {
+ int size = index_u16 ? 2 : 1;
+ memory_accesses.AddAccess(base_address + index_info.offset + size * index, size);
+ }
+
+ for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
+ if (vertex == vertex_cache_ids[i]) {
+ vs_output = vertex_cache[i];
+ vertex_cache_hit = true;
+ break;
+ }
+ }
+ }
+
+ if (!vertex_cache_hit) {
+ // Initialize data for the current vertex
+ Shader::AttributeBuffer input;
+ loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
+
+ // Send to vertex shader
+ if (g_debug_context)
+ g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
+ (void*)&input);
+ shader_unit.LoadInput(regs.vs, input);
+ shader_engine->Run(g_state.vs, shader_unit);
+ shader_unit.WriteOutput(regs.vs, vs_output);
+
+ if (is_indexed) {
+ vertex_cache[vertex_cache_pos] = vs_output;
+ vertex_cache_ids[vertex_cache_pos] = vertex;
+ vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
+ }
+ }
+
+ // Send to geometry pipeline
+ g_state.geometry_pipeline.SubmitVertex(vs_output);
+ }
+
+ for (auto& range : memory_accesses.ranges) {
+ g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
+ range.second, range.first);
+ }
+
+ VideoCore::g_renderer->Rasterizer()->DrawTriangles();
+ if (g_debug_context) {
+ g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
}
}
@@ -182,106 +379,19 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX(pipeline.vs_default_attributes_setup.index):
g_state.immediate.current_attribute = 0;
+ g_state.immediate.reset_geometry_pipeline = true;
default_attr_counter = 0;
break;
// Load default vertex input attributes
case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[0], 0x233):
case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[1], 0x234):
- case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235): {
- // TODO: Does actual hardware indeed keep an intermediate buffer or does
- // it directly write the values?
- default_attr_write_buffer[default_attr_counter++] = value;
-
- // Default attributes are written in a packed format such that four float24 values are
- // encoded in
- // three 32-bit numbers. We write to internal memory once a full such vector is
- // written.
- if (default_attr_counter >= 3) {
- default_attr_counter = 0;
-
- auto& setup = regs.pipeline.vs_default_attributes_setup;
-
- if (setup.index >= 16) {
- LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index);
- break;
- }
-
- Math::Vec4<float24> attribute;
-
- // NOTE: The destination component order indeed is "backwards"
- attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8);
- attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) |
- ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
- attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) |
- ((default_attr_write_buffer[2] >> 24) & 0xFF));
- attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF);
-
- LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index,
- attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(),
- attribute.w.ToFloat32());
-
- // TODO: Verify that this actually modifies the register!
- if (setup.index < 15) {
- g_state.input_default_attributes.attr[setup.index] = attribute;
- setup.index++;
- } else {
- // Put each attribute into an immediate input buffer. When all specified immediate
- // attributes are present, the Vertex Shader is invoked and everything is sent to
- // the primitive assembler.
-
- auto& immediate_input = g_state.immediate.input_vertex;
- auto& immediate_attribute_id = g_state.immediate.current_attribute;
-
- immediate_input.attr[immediate_attribute_id] = attribute;
-
- if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) {
- immediate_attribute_id += 1;
- } else {
- MICROPROFILE_SCOPE(GPU_Drawing);
- immediate_attribute_id = 0;
-
- auto* shader_engine = Shader::GetEngine();
- shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
-
- // Send to vertex shader
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
- static_cast<void*>(&immediate_input));
- Shader::UnitState shader_unit;
- Shader::AttributeBuffer output{};
-
- shader_unit.LoadInput(regs.vs, immediate_input);
- shader_engine->Run(g_state.vs, shader_unit);
- shader_unit.WriteOutput(regs.vs, output);
-
- // Send to renderer
- using Pica::Shader::OutputVertex;
- auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
- const OutputVertex& v2) {
- VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
- };
-
- g_state.primitive_assembler.SubmitVertex(
- Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output),
- AddTriangle);
- }
- }
- }
+ case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235):
+ LoadDefaultVertexAttributes(value);
break;
- }
case PICA_REG_INDEX(pipeline.gpu_mode):
- if (regs.pipeline.gpu_mode == PipelineRegs::GPUMode::Configuring) {
- MICROPROFILE_SCOPE(GPU_Drawing);
-
- // Draw immediate mode triangles when GPU Mode is set to GPUMode::Configuring
- VideoCore::g_renderer->Rasterizer()->DrawTriangles();
-
- if (g_debug_context) {
- g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr);
- }
- }
+ // This register likely just enables vertex processing and doesn't need any special handling
break;
case PICA_REG_INDEX_WORKAROUND(pipeline.command_buffer.trigger[0], 0x23c):
@@ -297,130 +407,9 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
// It seems like these trigger vertex rendering
case PICA_REG_INDEX(pipeline.trigger_draw):
- case PICA_REG_INDEX(pipeline.trigger_draw_indexed): {
- MICROPROFILE_SCOPE(GPU_Drawing);
-
-#if PICA_LOG_TEV
- DebugUtils::DumpTevStageConfig(regs.GetTevStages());
-#endif
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr);
-
- // Processes information about internal vertex attributes to figure out how a vertex is
- // loaded.
- // Later, these can be compiled and cached.
- const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress();
- VertexLoader loader(regs.pipeline);
-
- // Load vertices
- bool is_indexed = (id == PICA_REG_INDEX(pipeline.trigger_draw_indexed));
-
- const auto& index_info = regs.pipeline.index_array;
- const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset);
- const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8);
- bool index_u16 = index_info.format != 0;
-
- PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler;
-
- if (g_debug_context && g_debug_context->recorder) {
- for (int i = 0; i < 3; ++i) {
- const auto texture = regs.texturing.GetTextures()[i];
- if (!texture.enabled)
- continue;
-
- u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
- g_debug_context->recorder->MemoryAccessed(
- texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) *
- texture.config.width / 2 * texture.config.height,
- texture.config.GetPhysicalAddress());
- }
- }
-
- DebugUtils::MemoryAccessTracker memory_accesses;
-
- // Simple circular-replacement vertex cache
- // The size has been tuned for optimal balance between hit-rate and the cost of lookup
- const size_t VERTEX_CACHE_SIZE = 32;
- std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
- std::array<Shader::OutputVertex, VERTEX_CACHE_SIZE> vertex_cache;
- Shader::OutputVertex output_vertex;
-
- unsigned int vertex_cache_pos = 0;
- vertex_cache_ids.fill(-1);
-
- auto* shader_engine = Shader::GetEngine();
- Shader::UnitState shader_unit;
-
- shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
-
- for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) {
- // Indexed rendering doesn't use the start offset
- unsigned int vertex =
- is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index])
- : (index + regs.pipeline.vertex_offset);
-
- // -1 is a common special value used for primitive restart. Since it's unknown if
- // the PICA supports it, and it would mess up the caching, guard against it here.
- ASSERT(vertex != -1);
-
- bool vertex_cache_hit = false;
-
- if (is_indexed) {
- if (g_debug_context && Pica::g_debug_context->recorder) {
- int size = index_u16 ? 2 : 1;
- memory_accesses.AddAccess(base_address + index_info.offset + size * index,
- size);
- }
-
- for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
- if (vertex == vertex_cache_ids[i]) {
- output_vertex = vertex_cache[i];
- vertex_cache_hit = true;
- break;
- }
- }
- }
-
- if (!vertex_cache_hit) {
- // Initialize data for the current vertex
- Shader::AttributeBuffer input, output{};
- loader.LoadVertex(base_address, index, vertex, input, memory_accesses);
-
- // Send to vertex shader
- if (g_debug_context)
- g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
- (void*)&input);
- shader_unit.LoadInput(regs.vs, input);
- shader_engine->Run(g_state.vs, shader_unit);
- shader_unit.WriteOutput(regs.vs, output);
-
- // Retrieve vertex from register data
- output_vertex = Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output);
-
- if (is_indexed) {
- vertex_cache[vertex_cache_pos] = output_vertex;
- vertex_cache_ids[vertex_cache_pos] = vertex;
- vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
- }
- }
-
- // Send to renderer
- using Pica::Shader::OutputVertex;
- auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1,
- const OutputVertex& v2) {
- VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
- };
-
- primitive_assembler.SubmitVertex(output_vertex, AddTriangle);
- }
-
- for (auto& range : memory_accesses.ranges) {
- g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first),
- range.second, range.first);
- }
-
+ case PICA_REG_INDEX(pipeline.trigger_draw_indexed):
+ Draw(id);
break;
- }
case PICA_REG_INDEX(gs.bool_uniforms):
WriteUniformBoolReg(g_state.gs, g_state.regs.gs.bool_uniforms.Value());
@@ -458,7 +447,13 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[5], 0x2a1):
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[6], 0x2a2):
case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[7], 0x2a3): {
- WriteProgramCode(g_state.regs.gs, g_state.gs, 4096, value);
+ u32& offset = g_state.regs.gs.program.offset;
+ if (offset >= 4096) {
+ LOG_ERROR(HW_GPU, "Invalid GS program offset %u", offset);
+ } else {
+ g_state.gs.program_code[offset] = value;
+ offset++;
+ }
break;
}
@@ -470,11 +465,18 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[5], 0x2ab):
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[6], 0x2ac):
case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[7], 0x2ad): {
- WriteSwizzlePatterns(g_state.regs.gs, g_state.gs, value);
+ u32& offset = g_state.regs.gs.swizzle_patterns.offset;
+ if (offset >= g_state.gs.swizzle_data.size()) {
+ LOG_ERROR(HW_GPU, "Invalid GS swizzle pattern offset %u", offset);
+ } else {
+ g_state.gs.swizzle_data[offset] = value;
+ offset++;
+ }
break;
}
case PICA_REG_INDEX(vs.bool_uniforms):
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
WriteUniformBoolReg(g_state.vs, g_state.regs.vs.bool_uniforms.Value());
break;
@@ -482,6 +484,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[1], 0x2b2):
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[2], 0x2b3):
case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[3], 0x2b4): {
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
unsigned index = (id - PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[0], 0x2b1));
auto values = regs.vs.int_uniforms[index];
WriteUniformIntReg(g_state.vs, index,
@@ -497,6 +500,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[5], 0x2c6):
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[6], 0x2c7):
case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[7], 0x2c8): {
+ // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this?
WriteUniformFloatReg(g_state.regs.vs, g_state.vs, vs_float_regs_counter,
vs_uniform_write_buffer, value);
break;
@@ -510,7 +514,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[5], 0x2d1):
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[6], 0x2d2):
case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[7], 0x2d3): {
- WriteProgramCode(g_state.regs.vs, g_state.vs, 512, value);
+ u32& offset = g_state.regs.vs.program.offset;
+ if (offset >= 512) {
+ LOG_ERROR(HW_GPU, "Invalid VS program offset %u", offset);
+ } else {
+ g_state.vs.program_code[offset] = value;
+ if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
+ g_state.gs.program_code[offset] = value;
+ }
+ offset++;
+ }
break;
}
@@ -522,7 +535,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[5], 0x2db):
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[6], 0x2dc):
case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[7], 0x2dd): {
- WriteSwizzlePatterns(g_state.regs.vs, g_state.vs, value);
+ u32& offset = g_state.regs.vs.swizzle_patterns.offset;
+ if (offset >= g_state.vs.swizzle_data.size()) {
+ LOG_ERROR(HW_GPU, "Invalid VS swizzle pattern offset %u", offset);
+ } else {
+ g_state.vs.swizzle_data[offset] = value;
+ if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) {
+ g_state.gs.swizzle_data[offset] = value;
+ }
+ offset++;
+ }
break;
}
@@ -620,6 +642,6 @@ void ProcessCommandList(const u32* list, u32 size) {
}
}
-} // namespace
+} // namespace CommandProcessor
-} // namespace
+} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.cpp b/src/video_core/geometry_pipeline.cpp
new file mode 100644
index 000000000..98ff2ccd3
--- /dev/null
+++ b/src/video_core/geometry_pipeline.cpp
@@ -0,0 +1,274 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "video_core/geometry_pipeline.h"
+#include "video_core/pica_state.h"
+#include "video_core/regs.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
+
+namespace Pica {
+
+/// An attribute buffering interface for different pipeline modes
+class GeometryPipelineBackend {
+public:
+ virtual ~GeometryPipelineBackend() = default;
+
+ /// Checks if there is no incomplete data transfer
+ virtual bool IsEmpty() const = 0;
+
+ /// Checks if the pipeline needs a direct input from index buffer
+ virtual bool NeedIndexInput() const = 0;
+
+ /// Submits an index from index buffer
+ virtual void SubmitIndex(unsigned int val) = 0;
+
+ /**
+ * Submits vertex attributes
+ * @param input attributes of a vertex output from vertex shader
+ * @return if the buffer is full and the geometry shader should be invoked
+ */
+ virtual bool SubmitVertex(const Shader::AttributeBuffer& input) = 0;
+};
+
+// In the Point mode, vertex attributes are sent to the input registers in the geometry shader unit.
+// The size of vertex shader outputs and geometry shader inputs are constants. Geometry shader is
+// invoked upon inputs buffer filled up by vertex shader outputs. For example, if we have a geometry
+// shader that takes 6 inputs, and the vertex shader outputs 2 attributes, it would take 3 vertices
+// for one geometry shader invocation.
+// TODO: what happens when the input size is not divisible by the output size?
+class GeometryPipeline_Point : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_Point(const Regs& regs, Shader::GSUnitState& unit) : regs(regs), unit(unit) {
+ ASSERT(regs.pipeline.variable_primitive == 0);
+ ASSERT(regs.gs.input_to_uniform == 0);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ size_t gs_input_num = regs.gs.max_input_attribute_index + 1;
+ ASSERT(gs_input_num % vs_output_num == 0);
+ buffer_cur = attribute_buffer.attr;
+ buffer_end = attribute_buffer.attr + gs_input_num;
+ }
+
+ bool IsEmpty() const override {
+ return buffer_cur == attribute_buffer.attr;
+ }
+
+ bool NeedIndexInput() const override {
+ return false;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ UNREACHABLE();
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ if (buffer_cur == buffer_end) {
+ buffer_cur = attribute_buffer.attr;
+ unit.LoadInput(regs.gs, attribute_buffer);
+ return true;
+ }
+ return false;
+ }
+
+private:
+ const Regs& regs;
+ Shader::GSUnitState& unit;
+ Shader::AttributeBuffer attribute_buffer;
+ Math::Vec4<float24>* buffer_cur;
+ Math::Vec4<float24>* buffer_end;
+ unsigned int vs_output_num;
+};
+
+// In VariablePrimitive mode, vertex attributes are buffered into the uniform registers in the
+// geometry shader unit. The number of vertex is variable, which is specified by the first index
+// value in the batch. This mode is usually used for subdivision.
+class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_VariablePrimitive(const Regs& regs, Shader::ShaderSetup& setup)
+ : regs(regs), setup(setup) {
+ ASSERT(regs.pipeline.variable_primitive == 1);
+ ASSERT(regs.gs.input_to_uniform == 1);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ }
+
+ bool IsEmpty() const override {
+ return need_index;
+ }
+
+ bool NeedIndexInput() const override {
+ return need_index;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ DEBUG_ASSERT(need_index);
+
+ // The number of vertex input is put to the uniform register
+ float24 vertex_num = float24::FromFloat32(static_cast<float>(val));
+ setup.uniforms.f[0] = Math::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num);
+
+ // The second uniform register and so on are used for receiving input vertices
+ buffer_cur = setup.uniforms.f + 1;
+
+ main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1;
+ total_vertex_num = val;
+ need_index = false;
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ DEBUG_ASSERT(!need_index);
+ if (main_vertex_num != 0) {
+ // For main vertices, receive all attributes
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ --main_vertex_num;
+ } else {
+ // For other vertices, only receive the first attribute (usually the position)
+ *(buffer_cur++) = input.attr[0];
+ }
+ --total_vertex_num;
+
+ if (total_vertex_num == 0) {
+ need_index = true;
+ return true;
+ }
+
+ return false;
+ }
+
+private:
+ bool need_index = true;
+ const Regs& regs;
+ Shader::ShaderSetup& setup;
+ unsigned int main_vertex_num;
+ unsigned int total_vertex_num;
+ Math::Vec4<float24>* buffer_cur;
+ unsigned int vs_output_num;
+};
+
+// In FixedPrimitive mode, vertex attributes are buffered into the uniform registers in the geometry
+// shader unit. The number of vertex per shader invocation is constant. This is usually used for
+// particle system.
+class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend {
+public:
+ GeometryPipeline_FixedPrimitive(const Regs& regs, Shader::ShaderSetup& setup)
+ : regs(regs), setup(setup) {
+ ASSERT(regs.pipeline.variable_primitive == 0);
+ ASSERT(regs.gs.input_to_uniform == 1);
+ vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1;
+ ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1);
+ size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1;
+ buffer_cur = buffer_begin = setup.uniforms.f + regs.pipeline.gs_config.start_index;
+ buffer_end = buffer_begin + vs_output_num * vertex_num;
+ }
+
+ bool IsEmpty() const override {
+ return buffer_cur == buffer_begin;
+ }
+
+ bool NeedIndexInput() const override {
+ return false;
+ }
+
+ void SubmitIndex(unsigned int val) override {
+ UNREACHABLE();
+ }
+
+ bool SubmitVertex(const Shader::AttributeBuffer& input) override {
+ buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur);
+ if (buffer_cur == buffer_end) {
+ buffer_cur = buffer_begin;
+ return true;
+ }
+ return false;
+ }
+
+private:
+ const Regs& regs;
+ Shader::ShaderSetup& setup;
+ Math::Vec4<float24>* buffer_begin;
+ Math::Vec4<float24>* buffer_cur;
+ Math::Vec4<float24>* buffer_end;
+ unsigned int vs_output_num;
+};
+
+GeometryPipeline::GeometryPipeline(State& state) : state(state) {}
+
+GeometryPipeline::~GeometryPipeline() = default;
+
+void GeometryPipeline::SetVertexHandler(Shader::VertexHandler vertex_handler) {
+ this->vertex_handler = vertex_handler;
+}
+
+void GeometryPipeline::Setup(Shader::ShaderEngine* shader_engine) {
+ if (!backend)
+ return;
+
+ this->shader_engine = shader_engine;
+ shader_engine->SetupBatch(state.gs, state.regs.gs.main_offset);
+}
+
+void GeometryPipeline::Reconfigure() {
+ ASSERT(!backend || backend->IsEmpty());
+
+ if (state.regs.pipeline.use_gs == PipelineRegs::UseGS::No) {
+ backend = nullptr;
+ return;
+ }
+
+ ASSERT(state.regs.pipeline.use_gs == PipelineRegs::UseGS::Yes);
+
+ // The following assumes that when geometry shader is in use, the shader unit 3 is configured as
+ // a geometry shader unit.
+ // TODO: what happens if this is not true?
+ ASSERT(state.regs.pipeline.gs_unit_exclusive_configuration == 1);
+ ASSERT(state.regs.gs.shader_mode == ShaderRegs::ShaderMode::GS);
+
+ state.gs_unit.ConfigOutput(state.regs.gs);
+
+ ASSERT(state.regs.pipeline.vs_outmap_total_minus_1_a ==
+ state.regs.pipeline.vs_outmap_total_minus_1_b);
+
+ switch (state.regs.pipeline.gs_config.mode) {
+ case PipelineRegs::GSMode::Point:
+ backend = std::make_unique<GeometryPipeline_Point>(state.regs, state.gs_unit);
+ break;
+ case PipelineRegs::GSMode::VariablePrimitive:
+ backend = std::make_unique<GeometryPipeline_VariablePrimitive>(state.regs, state.gs);
+ break;
+ case PipelineRegs::GSMode::FixedPrimitive:
+ backend = std::make_unique<GeometryPipeline_FixedPrimitive>(state.regs, state.gs);
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+bool GeometryPipeline::NeedIndexInput() const {
+ if (!backend)
+ return false;
+ return backend->NeedIndexInput();
+}
+
+void GeometryPipeline::SubmitIndex(unsigned int val) {
+ backend->SubmitIndex(val);
+}
+
+void GeometryPipeline::SubmitVertex(const Shader::AttributeBuffer& input) {
+ if (!backend) {
+ // No backend means the geometry shader is disabled, so we send the vertex shader output
+ // directly to the primitive assembler.
+ vertex_handler(input);
+ } else {
+ if (backend->SubmitVertex(input)) {
+ shader_engine->Run(state.gs, state.gs_unit);
+
+ // The uniform b15 is set to true after every geometry shader invocation. This is useful
+ // for the shader to know if this is the first invocation in a batch, if the program set
+ // b15 to false first.
+ state.gs.uniforms.b[15] = true;
+ }
+ }
+}
+
+} // namespace Pica
diff --git a/src/video_core/geometry_pipeline.h b/src/video_core/geometry_pipeline.h
new file mode 100644
index 000000000..91fdd3192
--- /dev/null
+++ b/src/video_core/geometry_pipeline.h
@@ -0,0 +1,49 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include "video_core/shader/shader.h"
+
+namespace Pica {
+
+struct State;
+
+class GeometryPipelineBackend;
+
+/// A pipeline receiving from vertex shader and sending to geometry shader and primitive assembler
+class GeometryPipeline {
+public:
+ explicit GeometryPipeline(State& state);
+ ~GeometryPipeline();
+
+ /// Sets the handler for receiving vertex outputs from vertex shader
+ void SetVertexHandler(Shader::VertexHandler vertex_handler);
+
+ /**
+ * Setup the geometry shader unit if it is in use
+ * @param shader_engine the shader engine for the geometry shader to run
+ */
+ void Setup(Shader::ShaderEngine* shader_engine);
+
+ /// Reconfigures the pipeline according to current register settings
+ void Reconfigure();
+
+ /// Checks if the pipeline needs a direct input from index buffer
+ bool NeedIndexInput() const;
+
+ /// Submits an index from index buffer. Call this only when NeedIndexInput returns true
+ void SubmitIndex(unsigned int val);
+
+ /// Submits vertex attributes output from vertex shader
+ void SubmitVertex(const Shader::AttributeBuffer& input);
+
+private:
+ Shader::VertexHandler vertex_handler;
+ Shader::ShaderEngine* shader_engine;
+ std::unique_ptr<GeometryPipelineBackend> backend;
+ State& state;
+};
+} // namespace Pica
diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp
index b95148a6a..218e06883 100644
--- a/src/video_core/pica.cpp
+++ b/src/video_core/pica.cpp
@@ -3,9 +3,11 @@
// Refer to the license.txt file included.
#include <cstring>
+#include "video_core/geometry_pipeline.h"
#include "video_core/pica.h"
#include "video_core/pica_state.h"
-#include "video_core/regs_pipeline.h"
+#include "video_core/renderer_base.h"
+#include "video_core/video_core.h"
namespace Pica {
@@ -24,6 +26,23 @@ void Zero(T& o) {
memset(&o, 0, sizeof(o));
}
+State::State() : geometry_pipeline(*this) {
+ auto SubmitVertex = [this](const Shader::AttributeBuffer& vertex) {
+ using Pica::Shader::OutputVertex;
+ auto AddTriangle = [this](const OutputVertex& v0, const OutputVertex& v1,
+ const OutputVertex& v2) {
+ VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
+ };
+ primitive_assembler.SubmitVertex(
+ Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, vertex), AddTriangle);
+ };
+
+ auto SetWinding = [this]() { primitive_assembler.SetWinding(); };
+
+ g_state.gs_unit.SetVertexHandler(SubmitVertex, SetWinding);
+ g_state.geometry_pipeline.SetVertexHandler(SubmitVertex);
+}
+
void State::Reset() {
Zero(regs);
Zero(vs);
diff --git a/src/video_core/pica_state.h b/src/video_core/pica_state.h
index 2d23d34e6..c6634a0bc 100644
--- a/src/video_core/pica_state.h
+++ b/src/video_core/pica_state.h
@@ -8,6 +8,7 @@
#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/vector_math.h"
+#include "video_core/geometry_pipeline.h"
#include "video_core/primitive_assembly.h"
#include "video_core/regs.h"
#include "video_core/shader/shader.h"
@@ -16,6 +17,7 @@ namespace Pica {
/// Struct used to describe current Pica state
struct State {
+ State();
void Reset();
/// Pica registers
@@ -79,7 +81,7 @@ struct State {
std::array<ColorDifferenceEntry, 256> color_diff_table;
} proctex;
- struct {
+ struct Lighting {
union LutEntry {
// Used for raw access
u32 raw;
@@ -137,8 +139,17 @@ struct State {
Shader::AttributeBuffer input_vertex;
// Index of the next attribute to be loaded into `input_vertex`.
u32 current_attribute = 0;
+ // Indicates the immediate mode just started and the geometry pipeline needs to reconfigure
+ bool reset_geometry_pipeline = true;
} immediate;
+ // the geometry shader needs to be kept in the global state because some shaders relie on
+ // preserved register value across shader invocation.
+ // TODO: also bring the three vertex shader units here and implement the shader scheduler.
+ Shader::GSUnitState gs_unit;
+
+ GeometryPipeline geometry_pipeline;
+
// This is constructed with a dummy triangle topology
PrimitiveAssembler<Shader::OutputVertex> primitive_assembler;
};
diff --git a/src/video_core/pica_types.h b/src/video_core/pica_types.h
index 5d7e10066..2eafa7e9e 100644
--- a/src/video_core/pica_types.h
+++ b/src/video_core/pica_types.h
@@ -58,11 +58,12 @@ public:
}
Float<M, E> operator*(const Float<M, E>& flt) const {
- if ((this->value == 0.f && !std::isnan(flt.value)) ||
- (flt.value == 0.f && !std::isnan(this->value)))
- // PICA gives 0 instead of NaN when multiplying by inf
- return Zero();
- return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32());
+ float result = value * flt.ToFloat32();
+ // PICA gives 0 instead of NaN when multiplying by inf
+ if (!std::isnan(value) && !std::isnan(flt.ToFloat32()))
+ if (std::isnan(result))
+ result = 0.f;
+ return Float<M, E>::FromFloat32(result);
}
Float<M, E> operator/(const Float<M, E>& flt) const {
@@ -78,12 +79,7 @@ public:
}
Float<M, E>& operator*=(const Float<M, E>& flt) {
- if ((this->value == 0.f && !std::isnan(flt.value)) ||
- (flt.value == 0.f && !std::isnan(this->value)))
- // PICA gives 0 instead of NaN when multiplying by inf
- *this = Zero();
- else
- value *= flt.ToFloat32();
+ value = operator*(flt).value;
return *this;
}
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
index acd2ac5e2..9c3dd4cab 100644
--- a/src/video_core/primitive_assembly.cpp
+++ b/src/video_core/primitive_assembly.cpp
@@ -17,15 +17,18 @@ template <typename VertexType>
void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
TriangleHandler triangle_handler) {
switch (topology) {
- // TODO: Figure out what's different with TriangleTopology::Shader.
case PipelineRegs::TriangleTopology::List:
case PipelineRegs::TriangleTopology::Shader:
if (buffer_index < 2) {
buffer[buffer_index++] = vtx;
} else {
buffer_index = 0;
-
- triangle_handler(buffer[0], buffer[1], vtx);
+ if (topology == PipelineRegs::TriangleTopology::Shader && winding) {
+ triangle_handler(buffer[1], buffer[0], vtx);
+ winding = false;
+ } else {
+ triangle_handler(buffer[0], buffer[1], vtx);
+ }
}
break;
@@ -51,9 +54,15 @@ void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
}
template <typename VertexType>
+void PrimitiveAssembler<VertexType>::SetWinding() {
+ winding = true;
+}
+
+template <typename VertexType>
void PrimitiveAssembler<VertexType>::Reset() {
buffer_index = 0;
strip_ready = false;
+ winding = false;
}
template <typename VertexType>
diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h
index e8eccdf27..12de8e3b9 100644
--- a/src/video_core/primitive_assembly.h
+++ b/src/video_core/primitive_assembly.h
@@ -30,6 +30,12 @@ struct PrimitiveAssembler {
void SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler);
/**
+ * Invert the vertex order of the next triangle. Called by geometry shader emitter.
+ * This only takes effect for TriangleTopology::Shader.
+ */
+ void SetWinding();
+
+ /**
* Resets the internal state of the PrimitiveAssembler.
*/
void Reset();
@@ -45,6 +51,7 @@ private:
int buffer_index;
VertexType buffer[2];
bool strip_ready = false;
+ bool winding = false;
};
} // namespace
diff --git a/src/video_core/regs_framebuffer.h b/src/video_core/regs_framebuffer.h
index a50bd4111..7b565f911 100644
--- a/src/video_core/regs_framebuffer.h
+++ b/src/video_core/regs_framebuffer.h
@@ -256,10 +256,9 @@ struct FramebufferRegs {
return 3;
case DepthFormat::D24S8:
return 4;
- default:
- LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
- UNIMPLEMENTED();
}
+
+ ASSERT_MSG(false, "Unknown depth format %u", format);
}
// Returns the number of bits per depth component of the specified depth format
@@ -270,10 +269,9 @@ struct FramebufferRegs {
case DepthFormat::D24:
case DepthFormat::D24S8:
return 24;
- default:
- LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format);
- UNIMPLEMENTED();
}
+
+ ASSERT_MSG(false, "Unknown depth format %u", format);
}
INSERT_PADDING_WORDS(0x20);
diff --git a/src/video_core/regs_pipeline.h b/src/video_core/regs_pipeline.h
index 31c747d77..e78c3e331 100644
--- a/src/video_core/regs_pipeline.h
+++ b/src/video_core/regs_pipeline.h
@@ -147,7 +147,15 @@ struct PipelineRegs {
// Number of vertices to render
u32 num_vertices;
- INSERT_PADDING_WORDS(0x1);
+ enum class UseGS : u32 {
+ No = 0,
+ Yes = 2,
+ };
+
+ union {
+ BitField<0, 2, UseGS> use_gs;
+ BitField<31, 1, u32> variable_primitive;
+ };
// The index of the first vertex to render
u32 vertex_offset;
@@ -202,7 +210,14 @@ struct PipelineRegs {
/// Number of input attributes to the vertex shader minus 1
BitField<0, 4, u32> max_input_attrib_index;
- INSERT_PADDING_WORDS(2);
+ INSERT_PADDING_WORDS(1);
+
+ // The shader unit 3, which can be used for both vertex and geometry shader, gets its
+ // configuration depending on this register. If this is not set, unit 3 will share some
+ // configuration with other units. It is known that program code and swizzle pattern uploaded
+ // via regs.vs will be also uploaded to unit 3 if this is not set. Although very likely, it is
+ // still unclear whether uniforms and other configuration can be also shared.
+ BitField<0, 1, u32> gs_unit_exclusive_configuration;
enum class GPUMode : u32 {
Drawing = 0,
@@ -211,7 +226,29 @@ struct PipelineRegs {
GPUMode gpu_mode;
- INSERT_PADDING_WORDS(0x18);
+ INSERT_PADDING_WORDS(0x4);
+ BitField<0, 4, u32> vs_outmap_total_minus_1_a;
+ INSERT_PADDING_WORDS(0x6);
+ BitField<0, 4, u32> vs_outmap_total_minus_1_b;
+
+ enum class GSMode : u32 {
+ Point = 0,
+ VariablePrimitive = 1,
+ FixedPrimitive = 2,
+ };
+
+ union {
+ BitField<0, 8, GSMode> mode;
+ BitField<8, 4, u32> fixed_vertex_num_minus_1;
+ BitField<12, 4, u32> stride_minus_1;
+ BitField<16, 4, u32> start_index;
+ } gs_config;
+
+ INSERT_PADDING_WORDS(0x1);
+
+ u32 variable_vertex_main_num_minus_1;
+
+ INSERT_PADDING_WORDS(0x9);
enum class TriangleTopology : u32 {
List = 0,
diff --git a/src/video_core/regs_rasterizer.h b/src/video_core/regs_rasterizer.h
index 2874fd127..4fef00d76 100644
--- a/src/video_core/regs_rasterizer.h
+++ b/src/video_core/regs_rasterizer.h
@@ -5,10 +5,10 @@
#pragma once
#include <array>
-
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
+#include "video_core/pica_types.h"
namespace Pica {
@@ -31,7 +31,17 @@ struct RasterizerRegs {
BitField<0, 24, u32> viewport_size_y;
- INSERT_PADDING_WORDS(0x9);
+ INSERT_PADDING_WORDS(0x3);
+
+ BitField<0, 1, u32> clip_enable;
+ BitField<0, 24, u32> clip_coef[4]; // float24
+
+ Math::Vec4<float24> GetClipCoef() const {
+ return {float24::FromRaw(clip_coef[0]), float24::FromRaw(clip_coef[1]),
+ float24::FromRaw(clip_coef[2]), float24::FromRaw(clip_coef[3])};
+ }
+
+ INSERT_PADDING_WORDS(0x1);
BitField<0, 24, u32> viewport_depth_range; // float24
BitField<0, 24, u32> viewport_depth_near_plane; // float24
diff --git a/src/video_core/regs_shader.h b/src/video_core/regs_shader.h
index ddb1ee451..c15d4d162 100644
--- a/src/video_core/regs_shader.h
+++ b/src/video_core/regs_shader.h
@@ -24,9 +24,16 @@ struct ShaderRegs {
INSERT_PADDING_WORDS(0x4);
+ enum ShaderMode {
+ GS = 0x08,
+ VS = 0xA0,
+ };
+
union {
// Number of input attributes to shader unit - 1
BitField<0, 4, u32> max_input_attribute_index;
+ BitField<8, 8, u32> input_to_uniform;
+ BitField<24, 8, ShaderMode> shader_mode;
};
// Offset to shader program entry point (in words)
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 1c6c15a58..7e09e4712 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -28,6 +28,9 @@ MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255));
MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100));
RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
+ // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0
+ state.clip_distance[0] = true;
+
// Create sampler objects
for (size_t i = 0; i < texture_samplers.size(); ++i) {
texture_samplers[i].Create();
@@ -166,6 +169,8 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) {
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, proctex_diff_lut_buffer.handle);
// Sync fixed function OpenGL state
+ SyncClipEnabled();
+ SyncClipCoef();
SyncCullMode();
SyncBlendEnabled();
SyncBlendFuncs();
@@ -232,13 +237,24 @@ void RasterizerOpenGL::DrawTriangles() {
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
color_surface != nullptr ? color_surface->texture.handle : 0, 0);
- glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
- depth_surface != nullptr ? depth_surface->texture.handle : 0, 0);
- bool has_stencil =
- regs.framebuffer.framebuffer.depth_format == Pica::FramebufferRegs::DepthFormat::D24S8;
- glFramebufferTexture2D(
- GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
- (has_stencil && depth_surface != nullptr) ? depth_surface->texture.handle : 0, 0);
+ if (depth_surface != nullptr) {
+ if (regs.framebuffer.framebuffer.depth_format ==
+ Pica::FramebufferRegs::DepthFormat::D24S8) {
+ // attach both depth and stencil
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
+ depth_surface->texture.handle, 0);
+ } else {
+ // attach depth
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
+ depth_surface->texture.handle, 0);
+ // clear stencil attachment
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ }
+ } else {
+ // clear both depth and stencil attachment
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0,
+ 0);
+ }
// Sync the viewport
// These registers hold half-width and half-height, so must be multiplied by 2
@@ -398,6 +414,18 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
SyncCullMode();
break;
+ // Clipping plane
+ case PICA_REG_INDEX(rasterizer.clip_enable):
+ SyncClipEnabled();
+ break;
+
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[0], 0x48):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[1], 0x49):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[2], 0x4a):
+ case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[3], 0x4b):
+ SyncClipCoef();
+ break;
+
// Depth modifiers
case PICA_REG_INDEX(rasterizer.viewport_depth_range):
SyncDepthScale();
@@ -1277,6 +1305,20 @@ void RasterizerOpenGL::SetShader() {
}
}
+void RasterizerOpenGL::SyncClipEnabled() {
+ state.clip_distance[1] = Pica::g_state.regs.rasterizer.clip_enable != 0;
+}
+
+void RasterizerOpenGL::SyncClipCoef() {
+ const auto raw_clip_coef = Pica::g_state.regs.rasterizer.GetClipCoef();
+ const GLvec4 new_clip_coef = {raw_clip_coef.x.ToFloat32(), raw_clip_coef.y.ToFloat32(),
+ raw_clip_coef.z.ToFloat32(), raw_clip_coef.w.ToFloat32()};
+ if (new_clip_coef != uniform_block_data.data.clip_coef) {
+ uniform_block_data.data.clip_coef = new_clip_coef;
+ uniform_block_data.dirty = true;
+ }
+}
+
void RasterizerOpenGL::SyncCullMode() {
const auto& regs = Pica::g_state.regs;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 78e218efe..46c62961c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -151,14 +151,21 @@ private:
LightSrc light_src[8];
alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages
alignas(16) GLvec4 tev_combiner_buffer_color;
+ alignas(16) GLvec4 clip_coef;
};
static_assert(
- sizeof(UniformData) == 0x460,
+ sizeof(UniformData) == 0x470,
"The size of the UniformData structure has changed, update the structure in the shader");
static_assert(sizeof(UniformData) < 16384,
"UniformData structure must be less than 16kb as per the OpenGL spec");
+ /// Syncs the clip enabled status to match the PICA register
+ void SyncClipEnabled();
+
+ /// Syncs the clip coefficients to match the PICA register
+ void SyncClipCoef();
+
/// Sets the OpenGL shader in accordance with the current PICA register state
void SetShader();
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index bb192affd..9fe183944 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -8,6 +8,7 @@
#include "common/assert.h"
#include "common/bit_field.h"
#include "common/logging/log.h"
+#include "core/core.h"
#include "video_core/regs_framebuffer.h"
#include "video_core/regs_lighting.h"
#include "video_core/regs_rasterizer.h"
@@ -24,6 +25,42 @@ using TevStageConfig = TexturingRegs::TevStageConfig;
namespace GLShader {
+static const std::string UniformBlockDef = R"(
+#define NUM_TEV_STAGES 6
+#define NUM_LIGHTS 8
+
+struct LightSrc {
+ vec3 specular_0;
+ vec3 specular_1;
+ vec3 diffuse;
+ vec3 ambient;
+ vec3 position;
+ vec3 spot_direction;
+ float dist_atten_bias;
+ float dist_atten_scale;
+};
+
+layout (std140) uniform shader_data {
+ vec2 framebuffer_scale;
+ int alphatest_ref;
+ float depth_scale;
+ float depth_offset;
+ int scissor_x1;
+ int scissor_y1;
+ int scissor_x2;
+ int scissor_y2;
+ vec3 fog_color;
+ vec2 proctex_noise_f;
+ vec2 proctex_noise_a;
+ vec2 proctex_noise_p;
+ vec3 lighting_global_ambient;
+ LightSrc light_src[NUM_LIGHTS];
+ vec4 const_color[NUM_TEV_STAGES];
+ vec4 tev_combiner_buffer_color;
+ vec4 clip_coef;
+};
+)";
+
PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
PicaShaderConfig res;
@@ -525,11 +562,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
"float geo_factor = 1.0;\n";
// Compute fragment normals and tangents
- const std::string pertubation =
- "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0";
+ auto Perturbation = [&]() {
+ return "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0";
+ };
if (lighting.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
// Bump mapping is enabled using a normal map
- out += "vec3 surface_normal = " + pertubation + ";\n";
+ out += "vec3 surface_normal = " + Perturbation() + ";\n";
// Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher
// precision result
@@ -543,7 +581,7 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
out += "vec3 surface_tangent = vec3(1.0, 0.0, 0.0);\n";
} else if (lighting.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
// Bump mapping is enabled using a tangent map
- out += "vec3 surface_tangent = " + pertubation + ";\n";
+ out += "vec3 surface_tangent = " + Perturbation() + ";\n";
// Mathematically, recomputing Z-component of the tangent vector won't affect the relevant
// computation below, which is also confirmed on 3DS. So we don't bother recomputing here
// even if 'renorm' is enabled.
@@ -593,8 +631,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
// Note: even if the normal vector is modified by normal map, which is not the
// normal of the tangent plane anymore, the half angle vector is still projected
// using the modified normal vector.
- std::string half_angle_proj = "normalize(half_vector) - normal / dot(normal, "
- "normal) * dot(normal, normalize(half_vector))";
+ std::string half_angle_proj =
+ "normalize(half_vector) - normal * dot(normal, normalize(half_vector))";
// Note: the half angle vector projection is confirmed not normalized before the dot
// product. The result is in fact not cos(phi) as the name suggested.
index = "dot(" + half_angle_proj + ", tangent)";
@@ -749,7 +787,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
}
// Fresnel
- if (lighting.lut_fr.enable &&
+ // Note: only the last entry in the light slots applies the Fresnel factor
+ if (light_index == lighting.src_num - 1 && lighting.lut_fr.enable &&
LightingRegs::IsLightingSamplerSupported(lighting.config,
LightingRegs::LightingSampler::Fresnel)) {
// Lookup fresnel LUT value
@@ -758,17 +797,17 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
lighting.lut_fr.type, lighting.lut_fr.abs_input);
value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")";
- // Enabled for difffuse lighting alpha component
+ // Enabled for diffuse lighting alpha component
if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
- out += "diffuse_sum.a *= " + value + ";\n";
+ out += "diffuse_sum.a = " + value + ";\n";
}
// Enabled for the specular lighting alpha component
if (lighting.fresnel_selector ==
LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
- out += "specular_sum.a *= " + value + ";\n";
+ out += "specular_sum.a = " + value + ";\n";
}
}
@@ -1007,8 +1046,6 @@ std::string GenerateFragmentShader(const PicaShaderConfig& config) {
std::string out = R"(
#version 330 core
-#define NUM_TEV_STAGES 6
-#define NUM_LIGHTS 8
in vec4 primary_color;
in vec2 texcoord[3];
@@ -1020,36 +1057,6 @@ in vec4 gl_FragCoord;
out vec4 color;
-struct LightSrc {
- vec3 specular_0;
- vec3 specular_1;
- vec3 diffuse;
- vec3 ambient;
- vec3 position;
- vec3 spot_direction;
- float dist_atten_bias;
- float dist_atten_scale;
-};
-
-layout (std140) uniform shader_data {
- vec2 framebuffer_scale;
- int alphatest_ref;
- float depth_scale;
- float depth_offset;
- int scissor_x1;
- int scissor_y1;
- int scissor_x2;
- int scissor_y2;
- vec3 fog_color;
- vec2 proctex_noise_f;
- vec2 proctex_noise_a;
- vec2 proctex_noise_p;
- vec3 lighting_global_ambient;
- LightSrc light_src[NUM_LIGHTS];
- vec4 const_color[NUM_TEV_STAGES];
- vec4 tev_combiner_buffer_color;
-};
-
uniform sampler2D tex[3];
uniform samplerBuffer lighting_lut;
uniform samplerBuffer fog_lut;
@@ -1058,7 +1065,11 @@ uniform samplerBuffer proctex_color_map;
uniform samplerBuffer proctex_alpha_map;
uniform samplerBuffer proctex_lut;
uniform samplerBuffer proctex_diff_lut;
+)";
+
+ out += UniformBlockDef;
+ out += R"(
// Rotate the vector v by the quaternion q
vec3 quaternion_rotate(vec4 q, vec3 v) {
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
@@ -1111,7 +1122,10 @@ vec4 secondary_fragment_color = vec4(0.0);
"gl_FragCoord.y < scissor_y2)) discard;\n";
}
- out += "float z_over_w = 1.0 - gl_FragCoord.z * 2.0;\n";
+ // After perspective divide, OpenGL transform z_over_w from [-1, 1] to [near, far]. Here we use
+ // default near = 0 and far = 1, and undo the transformation to get the original z_over_w, then
+ // do our own transformation according to PICA specification.
+ out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n";
out += "float depth = z_over_w * depth_scale + depth_offset;\n";
if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) {
out += "depth /= gl_FragCoord.w;\n";
@@ -1151,6 +1165,11 @@ vec4 secondary_fragment_color = vec4(0.0);
// Blend the fog
out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n";
+ } else if (state.fog_mode == TexturingRegs::FogMode::Gas) {
+ Core::Telemetry().AddField(Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode",
+ true);
+ LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode");
+ UNIMPLEMENTED();
}
out += "gl_FragDepth = depth;\n";
@@ -1186,6 +1205,12 @@ out float texcoord0_w;
out vec4 normquat;
out vec3 view;
+)";
+
+ out += UniformBlockDef;
+
+ out += R"(
+
void main() {
primary_color = vert_color;
texcoord[0] = vert_texcoord0;
@@ -1194,7 +1219,9 @@ void main() {
texcoord0_w = vert_texcoord0_w;
normquat = vert_normquat;
view = vert_view;
- gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w);
+ gl_Position = vert_position;
+ gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
+ gl_ClipDistance[1] = dot(clip_coef, vert_position);
}
)";
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp
index bc9d34b84..5770ae08f 100644
--- a/src/video_core/renderer_opengl/gl_state.cpp
+++ b/src/video_core/renderer_opengl/gl_state.cpp
@@ -68,6 +68,8 @@ OpenGLState::OpenGLState() {
draw.vertex_buffer = 0;
draw.uniform_buffer = 0;
draw.shader_program = 0;
+
+ clip_distance = {};
}
void OpenGLState::Apply() const {
@@ -261,6 +263,17 @@ void OpenGLState::Apply() const {
glUseProgram(draw.shader_program);
}
+ // Clip distance
+ for (size_t i = 0; i < clip_distance.size(); ++i) {
+ if (clip_distance[i] != cur_state.clip_distance[i]) {
+ if (clip_distance[i]) {
+ glEnable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
+ } else {
+ glDisable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i));
+ }
+ }
+ }
+
cur_state = *this;
}
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index 745a74479..437fe34c4 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -4,6 +4,7 @@
#pragma once
+#include <array>
#include <glad/glad.h>
namespace TextureUnits {
@@ -123,6 +124,8 @@ public:
GLuint shader_program; // GL_CURRENT_PROGRAM
} draw;
+ std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
+
OpenGLState();
/// Get the currently active OpenGL state
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index 67ed19ba8..2857d2829 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -21,7 +21,8 @@ namespace Pica {
namespace Shader {
-OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& input) {
+OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs,
+ const AttributeBuffer& input) {
// Setup output data
union {
OutputVertex ret{};
@@ -51,7 +52,8 @@ OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, Attri
// The hardware takes the absolute and saturates vertex colors like this, *before* doing
// interpolation
for (unsigned i = 0; i < 4; ++i) {
- ret.color[i] = float24::FromFloat32(std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f));
+ float c = std::fabs(ret.color[i].ToFloat32());
+ ret.color[i] = float24::FromFloat32(c < 1.0f ? c : 1.0f);
}
LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), "
@@ -82,6 +84,44 @@ void UnitState::WriteOutput(const ShaderRegs& config, AttributeBuffer& output) {
}
}
+UnitState::UnitState(GSEmitter* emitter) : emitter_ptr(emitter) {}
+
+GSEmitter::GSEmitter() {
+ handlers = new Handlers;
+}
+
+GSEmitter::~GSEmitter() {
+ delete handlers;
+}
+
+void GSEmitter::Emit(Math::Vec4<float24> (&vertex)[16]) {
+ ASSERT(vertex_id < 3);
+ std::copy(std::begin(vertex), std::end(vertex), buffer[vertex_id].begin());
+ if (prim_emit) {
+ if (winding)
+ handlers->winding_setter();
+ for (size_t i = 0; i < buffer.size(); ++i) {
+ AttributeBuffer output;
+ unsigned int output_i = 0;
+ for (unsigned int reg : Common::BitSet<u32>(output_mask)) {
+ output.attr[output_i++] = buffer[i][reg];
+ }
+ handlers->vertex_handler(output);
+ }
+ }
+}
+
+GSUnitState::GSUnitState() : UnitState(&emitter) {}
+
+void GSUnitState::SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter) {
+ emitter.handlers->vertex_handler = std::move(vertex_handler);
+ emitter.handlers->winding_setter = std::move(winding_setter);
+}
+
+void GSUnitState::ConfigOutput(const ShaderRegs& config) {
+ emitter.output_mask = config.output_mask;
+}
+
MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240));
#ifdef ARCHITECTURE_x86_64
diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h
index e156f6aef..a3789da01 100644
--- a/src/video_core/shader/shader.h
+++ b/src/video_core/shader/shader.h
@@ -6,6 +6,7 @@
#include <array>
#include <cstddef>
+#include <functional>
#include <type_traits>
#include <nihstro/shader_bytecode.h>
#include "common/assert.h"
@@ -31,6 +32,12 @@ struct AttributeBuffer {
alignas(16) Math::Vec4<float24> attr[16];
};
+/// Handler type for receiving vertex outputs from vertex shader or geometry shader
+using VertexHandler = std::function<void(const AttributeBuffer&)>;
+
+/// Handler type for signaling to invert the vertex order of the next triangle
+using WindingSetter = std::function<void()>;
+
struct OutputVertex {
Math::Vec4<float24> pos;
Math::Vec4<float24> quat;
@@ -43,7 +50,8 @@ struct OutputVertex {
INSERT_PADDING_WORDS(1);
Math::Vec2<float24> tc2;
- static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& output);
+ static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs,
+ const AttributeBuffer& output);
};
#define ASSERT_POS(var, pos) \
static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong " \
@@ -61,12 +69,36 @@ static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD");
static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size");
/**
+ * This structure contains state information for primitive emitting in geometry shader.
+ */
+struct GSEmitter {
+ std::array<std::array<Math::Vec4<float24>, 16>, 3> buffer;
+ u8 vertex_id;
+ bool prim_emit;
+ bool winding;
+ u32 output_mask;
+
+ // Function objects are hidden behind a raw pointer to make the structure standard layout type,
+ // for JIT to use offsetof to access other members.
+ struct Handlers {
+ VertexHandler vertex_handler;
+ WindingSetter winding_setter;
+ } * handlers;
+
+ GSEmitter();
+ ~GSEmitter();
+ void Emit(Math::Vec4<float24> (&vertex)[16]);
+};
+static_assert(std::is_standard_layout<GSEmitter>::value, "GSEmitter is not standard layout type");
+
+/**
* This structure contains the state information that needs to be unique for a shader unit. The 3DS
* has four shader units that process shaders in parallel. At the present, Citra only implements a
* single shader unit that processes all shaders serially. Putting the state information in a struct
* here will make it easier for us to parallelize the shader processing later.
*/
struct UnitState {
+ explicit UnitState(GSEmitter* emitter = nullptr);
struct Registers {
// The registers are accessed by the shader JIT using SSE instructions, and are therefore
// required to be 16-byte aligned.
@@ -82,6 +114,8 @@ struct UnitState {
// TODO: How many bits do these actually have?
s32 address_registers[3];
+ GSEmitter* emitter_ptr;
+
static size_t InputOffset(const SourceRegister& reg) {
switch (reg.GetRegisterType()) {
case RegisterType::Input:
@@ -125,6 +159,19 @@ struct UnitState {
void WriteOutput(const ShaderRegs& config, AttributeBuffer& output);
};
+/**
+ * This is an extended shader unit state that represents the special unit that can run both vertex
+ * shader and geometry shader. It contains an additional primitive emitter and utilities for
+ * geometry shader.
+ */
+struct GSUnitState : public UnitState {
+ GSUnitState();
+ void SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter);
+ void ConfigOutput(const ShaderRegs& config);
+
+ GSEmitter emitter;
+};
+
struct ShaderSetup {
struct {
// The float uniforms are accessed by the shader JIT using SSE instructions, and are
diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp
index aa1cec81f..9d4da4904 100644
--- a/src/video_core/shader/shader_interpreter.cpp
+++ b/src/video_core/shader/shader_interpreter.cpp
@@ -631,11 +631,27 @@ static void RunInterpreter(const ShaderSetup& setup, UnitState& state, DebugData
state.address_registers[2] = loop_param.y;
Record<DebugDataRecord::LOOP_INT_IN>(debug_data, iteration, loop_param);
- call(program_counter + 1, instr.flow_control.dest_offset - program_counter + 1,
+ call(program_counter + 1, instr.flow_control.dest_offset - program_counter,
instr.flow_control.dest_offset + 1, loop_param.x, loop_param.z);
break;
}
+ case OpCode::Id::EMIT: {
+ GSEmitter* emitter = state.emitter_ptr;
+ ASSERT_MSG(emitter, "Execute EMIT on VS");
+ emitter->Emit(state.registers.output);
+ break;
+ }
+
+ case OpCode::Id::SETEMIT: {
+ GSEmitter* emitter = state.emitter_ptr;
+ ASSERT_MSG(emitter, "Execute SETEMIT on VS");
+ emitter->vertex_id = instr.setemit.vertex_id;
+ emitter->prim_emit = instr.setemit.prim_emit != 0;
+ emitter->winding = instr.setemit.winding != 0;
+ break;
+ }
+
default:
LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
(int)instr.opcode.Value().EffectiveOpCode(),
diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp
index 42a57aab1..1b31623bd 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.cpp
+++ b/src/video_core/shader/shader_jit_x64_compiler.cpp
@@ -75,8 +75,8 @@ const JitFunction instr_table[64] = {
&JitShader::Compile_IF, // ifu
&JitShader::Compile_IF, // ifc
&JitShader::Compile_LOOP, // loop
- nullptr, // emit
- nullptr, // sete
+ &JitShader::Compile_EMIT, // emit
+ &JitShader::Compile_SETE, // sete
&JitShader::Compile_JMP, // jmpc
&JitShader::Compile_JMP, // jmpu
&JitShader::Compile_CMP, // cmp
@@ -772,6 +772,51 @@ void JitShader::Compile_JMP(Instruction instr) {
}
}
+static void Emit(GSEmitter* emitter, Math::Vec4<float24> (*output)[16]) {
+ emitter->Emit(*output);
+}
+
+void JitShader::Compile_EMIT(Instruction instr) {
+ Label have_emitter, end;
+ mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
+ test(rax, rax);
+ jnz(have_emitter);
+
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute EMIT on VS"));
+ CallFarFunction(*this, LogCritical);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ jmp(end);
+
+ L(have_emitter);
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, rax);
+ mov(ABI_PARAM2, STATE);
+ add(ABI_PARAM2, static_cast<Xbyak::uint32>(offsetof(UnitState, registers.output)));
+ CallFarFunction(*this, Emit);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ L(end);
+}
+
+void JitShader::Compile_SETE(Instruction instr) {
+ Label have_emitter, end;
+ mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]);
+ test(rax, rax);
+ jnz(have_emitter);
+
+ ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute SETEMIT on VS"));
+ CallFarFunction(*this, LogCritical);
+ ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);
+ jmp(end);
+
+ L(have_emitter);
+ mov(byte[rax + offsetof(GSEmitter, vertex_id)], instr.setemit.vertex_id);
+ mov(byte[rax + offsetof(GSEmitter, prim_emit)], instr.setemit.prim_emit);
+ mov(byte[rax + offsetof(GSEmitter, winding)], instr.setemit.winding);
+ L(end);
+}
+
void JitShader::Compile_Block(unsigned end) {
while (program_counter < end) {
Compile_NextInstr();
diff --git a/src/video_core/shader/shader_jit_x64_compiler.h b/src/video_core/shader/shader_jit_x64_compiler.h
index 31af0ca48..4aee56b1d 100644
--- a/src/video_core/shader/shader_jit_x64_compiler.h
+++ b/src/video_core/shader/shader_jit_x64_compiler.h
@@ -66,6 +66,8 @@ public:
void Compile_JMP(Instruction instr);
void Compile_CMP(Instruction instr);
void Compile_MAD(Instruction instr);
+ void Compile_EMIT(Instruction instr);
+ void Compile_SETE(Instruction instr);
private:
void Compile_Block(unsigned end);
diff --git a/src/video_core/swrasterizer/clipper.cpp b/src/video_core/swrasterizer/clipper.cpp
index 6fb923756..c1ed48398 100644
--- a/src/video_core/swrasterizer/clipper.cpp
+++ b/src/video_core/swrasterizer/clipper.cpp
@@ -31,7 +31,7 @@ public:
: coeffs(coeffs), bias(bias) {}
bool IsInside(const Vertex& vertex) const {
- return Math::Dot(vertex.pos + bias, coeffs) <= float24::FromFloat32(0);
+ return Math::Dot(vertex.pos + bias, coeffs) >= float24::FromFloat32(0);
}
bool IsOutSide(const Vertex& vertex) const {
@@ -95,6 +95,17 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
static const size_t MAX_VERTICES = 9;
static_vector<Vertex, MAX_VERTICES> buffer_a = {v0, v1, v2};
static_vector<Vertex, MAX_VERTICES> buffer_b;
+
+ auto FlipQuaternionIfOpposite = [](auto& a, const auto& b) {
+ if (Math::Dot(a, b) < float24::Zero())
+ a = a * float24::FromFloat32(-1.0f);
+ };
+
+ // Flip the quaternions if they are opposite to prevent interpolating them over the wrong
+ // direction.
+ FlipQuaternionIfOpposite(buffer_a[1].quat, buffer_a[0].quat);
+ FlipQuaternionIfOpposite(buffer_a[2].quat, buffer_a[0].quat);
+
auto* output_list = &buffer_a;
auto* input_list = &buffer_b;
@@ -105,23 +116,18 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
static const float24 f0 = float24::FromFloat32(0.0);
static const float24 f1 = float24::FromFloat32(1.0);
static const std::array<ClippingEdge, 7> clipping_edges = {{
- {Math::MakeVec(f1, f0, f0, -f1)}, // x = +w
- {Math::MakeVec(-f1, f0, f0, -f1)}, // x = -w
- {Math::MakeVec(f0, f1, f0, -f1)}, // y = +w
- {Math::MakeVec(f0, -f1, f0, -f1)}, // y = -w
- {Math::MakeVec(f0, f0, f1, f0)}, // z = 0
- {Math::MakeVec(f0, f0, -f1, -f1)}, // z = -w
- {Math::MakeVec(f0, f0, f0, -f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON
+ {Math::MakeVec(-f1, f0, f0, f1)}, // x = +w
+ {Math::MakeVec(f1, f0, f0, f1)}, // x = -w
+ {Math::MakeVec(f0, -f1, f0, f1)}, // y = +w
+ {Math::MakeVec(f0, f1, f0, f1)}, // y = -w
+ {Math::MakeVec(f0, f0, -f1, f0)}, // z = 0
+ {Math::MakeVec(f0, f0, f1, f1)}, // z = -w
+ {Math::MakeVec(f0, f0, f0, f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON
}};
- // TODO: If one vertex lies outside one of the depth clipping planes, some platforms (e.g. Wii)
- // drop the whole primitive instead of clipping the primitive properly. We should test if
- // this happens on the 3DS, too.
-
// Simple implementation of the Sutherland-Hodgman clipping algorithm.
// TODO: Make this less inefficient (currently lots of useless buffering overhead happens here)
- for (auto edge : clipping_edges) {
-
+ auto Clip = [&](const ClippingEdge& edge) {
std::swap(input_list, output_list);
output_list->clear();
@@ -140,12 +146,24 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu
}
reference_vertex = &vertex;
}
+ };
+
+ for (auto edge : clipping_edges) {
+ Clip(edge);
// Need to have at least a full triangle to continue...
if (output_list->size() < 3)
return;
}
+ if (g_state.regs.rasterizer.clip_enable) {
+ ClippingEdge custom_edge{g_state.regs.rasterizer.GetClipCoef()};
+ Clip(custom_edge);
+
+ if (output_list->size() < 3)
+ return;
+ }
+
InitScreenCoordinates((*output_list)[0]);
InitScreenCoordinates((*output_list)[1]);
diff --git a/src/video_core/swrasterizer/framebuffer.cpp b/src/video_core/swrasterizer/framebuffer.cpp
index 7de3aac75..f34eab6cf 100644
--- a/src/video_core/swrasterizer/framebuffer.cpp
+++ b/src/video_core/swrasterizer/framebuffer.cpp
@@ -352,6 +352,8 @@ u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) {
case FramebufferRegs::LogicOp::OrInverted:
return ~src | dest;
}
+
+ UNREACHABLE();
};
} // namespace Rasterizer
diff --git a/src/video_core/swrasterizer/lighting.cpp b/src/video_core/swrasterizer/lighting.cpp
new file mode 100644
index 000000000..5fa748611
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.cpp
@@ -0,0 +1,308 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/math_util.h"
+#include "video_core/swrasterizer/lighting.h"
+
+namespace Pica {
+
+static float LookupLightingLut(const Pica::State::Lighting& lighting, size_t lut_index, u8 index,
+ float delta) {
+ ASSERT_MSG(lut_index < lighting.luts.size(), "Out of range lut");
+ ASSERT_MSG(index < lighting.luts[lut_index].size(), "Out of range index");
+
+ const auto& lut = lighting.luts[lut_index][index];
+
+ float lut_value = lut.ToFloat();
+ float lut_diff = lut.DiffToFloat();
+
+ return lut_value + lut_diff * delta;
+}
+
+std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
+ const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
+ const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
+ const Math::Vec4<u8> (&texture_color)[4]) {
+
+ Math::Vec3<float> surface_normal;
+ Math::Vec3<float> surface_tangent;
+
+ if (lighting.config0.bump_mode != LightingRegs::LightingBumpMode::None) {
+ Math::Vec3<float> perturbation =
+ texture_color[lighting.config0.bump_selector].xyz().Cast<float>() / 127.5f -
+ Math::MakeVec(1.0f, 1.0f, 1.0f);
+ if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::NormalMap) {
+ if (!lighting.config0.disable_bump_renorm) {
+ const float z_square = 1 - perturbation.xy().Length2();
+ perturbation.z = std::sqrt(std::max(z_square, 0.0f));
+ }
+ surface_normal = perturbation;
+ surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
+ } else if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::TangentMap) {
+ surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
+ surface_tangent = perturbation;
+ } else {
+ LOG_ERROR(HW_GPU, "Unknown bump mode %u", lighting.config0.bump_mode.Value());
+ }
+ } else {
+ surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f);
+ surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f);
+ }
+
+ // Use the normalized the quaternion when performing the rotation
+ auto normal = Math::QuaternionRotate(normquat, surface_normal);
+ auto tangent = Math::QuaternionRotate(normquat, surface_tangent);
+
+ Math::Vec4<float> diffuse_sum = {0.0f, 0.0f, 0.0f, 1.0f};
+ Math::Vec4<float> specular_sum = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ for (unsigned light_index = 0; light_index <= lighting.max_light_index; ++light_index) {
+ unsigned num = lighting.light_enable.GetNum(light_index);
+ const auto& light_config = lighting.light[num];
+
+ Math::Vec3<float> refl_value = {};
+ Math::Vec3<float> position = {float16::FromRaw(light_config.x).ToFloat32(),
+ float16::FromRaw(light_config.y).ToFloat32(),
+ float16::FromRaw(light_config.z).ToFloat32()};
+ Math::Vec3<float> light_vector;
+
+ if (light_config.config.directional)
+ light_vector = position;
+ else
+ light_vector = position + view;
+
+ light_vector.Normalize();
+
+ Math::Vec3<float> norm_view = view.Normalized();
+ Math::Vec3<float> half_vector = norm_view + light_vector;
+
+ float dist_atten = 1.0f;
+ if (!lighting.IsDistAttenDisabled(num)) {
+ auto distance = (-view - position).Length();
+ float scale = Pica::float20::FromRaw(light_config.dist_atten_scale).ToFloat32();
+ float bias = Pica::float20::FromRaw(light_config.dist_atten_bias).ToFloat32();
+ size_t lut =
+ static_cast<size_t>(LightingRegs::LightingSampler::DistanceAttenuation) + num;
+
+ float sample_loc = MathUtil::Clamp(scale * distance + bias, 0.0f, 1.0f);
+
+ u8 lutindex =
+ static_cast<u8>(MathUtil::Clamp(std::floor(sample_loc * 256.0f), 0.0f, 255.0f));
+ float delta = sample_loc * 256 - lutindex;
+ dist_atten = LookupLightingLut(lighting_state, lut, lutindex, delta);
+ }
+
+ auto GetLutValue = [&](LightingRegs::LightingLutInput input, bool abs,
+ LightingRegs::LightingScale scale_enum,
+ LightingRegs::LightingSampler sampler) {
+ float result = 0.0f;
+
+ switch (input) {
+ case LightingRegs::LightingLutInput::NH:
+ result = Math::Dot(normal, half_vector.Normalized());
+ break;
+
+ case LightingRegs::LightingLutInput::VH:
+ result = Math::Dot(norm_view, half_vector.Normalized());
+ break;
+
+ case LightingRegs::LightingLutInput::NV:
+ result = Math::Dot(normal, norm_view);
+ break;
+
+ case LightingRegs::LightingLutInput::LN:
+ result = Math::Dot(light_vector, normal);
+ break;
+
+ case LightingRegs::LightingLutInput::SP: {
+ Math::Vec3<s32> spot_dir{light_config.spot_x.Value(), light_config.spot_y.Value(),
+ light_config.spot_z.Value()};
+ result = Math::Dot(light_vector, spot_dir.Cast<float>() / 2047.0f);
+ break;
+ }
+ case LightingRegs::LightingLutInput::CP:
+ if (lighting.config0.config == LightingRegs::LightingConfig::Config7) {
+ const Math::Vec3<float> norm_half_vector = half_vector.Normalized();
+ const Math::Vec3<float> half_vector_proj =
+ norm_half_vector - normal * Math::Dot(normal, norm_half_vector);
+ result = Math::Dot(half_vector_proj, tangent);
+ } else {
+ result = 0.0f;
+ }
+ break;
+ default:
+ LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input));
+ UNIMPLEMENTED();
+ result = 0.0f;
+ }
+
+ u8 index;
+ float delta;
+
+ if (abs) {
+ if (light_config.config.two_sided_diffuse)
+ result = std::abs(result);
+ else
+ result = std::max(result, 0.0f);
+
+ float flr = std::floor(result * 256.0f);
+ index = static_cast<u8>(MathUtil::Clamp(flr, 0.0f, 255.0f));
+ delta = result * 256 - index;
+ } else {
+ float flr = std::floor(result * 128.0f);
+ s8 signed_index = static_cast<s8>(MathUtil::Clamp(flr, -128.0f, 127.0f));
+ delta = result * 128.0f - signed_index;
+ index = static_cast<u8>(signed_index);
+ }
+
+ float scale = lighting.lut_scale.GetScale(scale_enum);
+ return scale *
+ LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta);
+ };
+
+ // If enabled, compute spot light attenuation value
+ float spot_atten = 1.0f;
+ if (!lighting.IsSpotAttenDisabled(num) &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::SpotlightAttenuation)) {
+ auto lut = LightingRegs::SpotlightAttenuationSampler(num);
+ spot_atten = GetLutValue(lighting.lut_input.sp, lighting.abs_lut_input.disable_sp == 0,
+ lighting.lut_scale.sp, lut);
+ }
+
+ // Specular 0 component
+ float d0_lut_value = 1.0f;
+ if (lighting.config1.disable_lut_d0 == 0 &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::Distribution0)) {
+ d0_lut_value =
+ GetLutValue(lighting.lut_input.d0, lighting.abs_lut_input.disable_d0 == 0,
+ lighting.lut_scale.d0, LightingRegs::LightingSampler::Distribution0);
+ }
+
+ Math::Vec3<float> specular_0 = d0_lut_value * light_config.specular_0.ToVec3f();
+
+ // If enabled, lookup ReflectRed value, otherwise, 1.0 is used
+ if (lighting.config1.disable_lut_rr == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectRed)) {
+ refl_value.x =
+ GetLutValue(lighting.lut_input.rr, lighting.abs_lut_input.disable_rr == 0,
+ lighting.lut_scale.rr, LightingRegs::LightingSampler::ReflectRed);
+ } else {
+ refl_value.x = 1.0f;
+ }
+
+ // If enabled, lookup ReflectGreen value, otherwise, ReflectRed value is used
+ if (lighting.config1.disable_lut_rg == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectGreen)) {
+ refl_value.y =
+ GetLutValue(lighting.lut_input.rg, lighting.abs_lut_input.disable_rg == 0,
+ lighting.lut_scale.rg, LightingRegs::LightingSampler::ReflectGreen);
+ } else {
+ refl_value.y = refl_value.x;
+ }
+
+ // If enabled, lookup ReflectBlue value, otherwise, ReflectRed value is used
+ if (lighting.config1.disable_lut_rb == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::ReflectBlue)) {
+ refl_value.z =
+ GetLutValue(lighting.lut_input.rb, lighting.abs_lut_input.disable_rb == 0,
+ lighting.lut_scale.rb, LightingRegs::LightingSampler::ReflectBlue);
+ } else {
+ refl_value.z = refl_value.x;
+ }
+
+ // Specular 1 component
+ float d1_lut_value = 1.0f;
+ if (lighting.config1.disable_lut_d1 == 0 &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::Distribution1)) {
+ d1_lut_value =
+ GetLutValue(lighting.lut_input.d1, lighting.abs_lut_input.disable_d1 == 0,
+ lighting.lut_scale.d1, LightingRegs::LightingSampler::Distribution1);
+ }
+
+ Math::Vec3<float> specular_1 =
+ d1_lut_value * refl_value * light_config.specular_1.ToVec3f();
+
+ // Fresnel
+ // Note: only the last entry in the light slots applies the Fresnel factor
+ if (light_index == lighting.max_light_index && lighting.config1.disable_lut_fr == 0 &&
+ LightingRegs::IsLightingSamplerSupported(lighting.config0.config,
+ LightingRegs::LightingSampler::Fresnel)) {
+
+ float lut_value =
+ GetLutValue(lighting.lut_input.fr, lighting.abs_lut_input.disable_fr == 0,
+ lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel);
+
+ // Enabled for diffuse lighting alpha component
+ if (lighting.config0.fresnel_selector ==
+ LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ diffuse_sum.a() = lut_value;
+ }
+
+ // Enabled for the specular lighting alpha component
+ if (lighting.config0.fresnel_selector ==
+ LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ specular_sum.a() = lut_value;
+ }
+ }
+
+ auto dot_product = Math::Dot(light_vector, normal);
+
+ // Calculate clamp highlights before applying the two-sided diffuse configuration to the dot
+ // product.
+ float clamp_highlights = 1.0f;
+ if (lighting.config0.clamp_highlights) {
+ if (dot_product <= 0.0f)
+ clamp_highlights = 0.0f;
+ else
+ clamp_highlights = 1.0f;
+ }
+
+ if (light_config.config.two_sided_diffuse)
+ dot_product = std::abs(dot_product);
+ else
+ dot_product = std::max(dot_product, 0.0f);
+
+ if (light_config.config.geometric_factor_0 || light_config.config.geometric_factor_1) {
+ float geo_factor = half_vector.Length2();
+ geo_factor = geo_factor == 0.0f ? 0.0f : std::min(dot_product / geo_factor, 1.0f);
+ if (light_config.config.geometric_factor_0) {
+ specular_0 *= geo_factor;
+ }
+ if (light_config.config.geometric_factor_1) {
+ specular_1 *= geo_factor;
+ }
+ }
+
+ auto diffuse =
+ light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
+ diffuse_sum += Math::MakeVec(diffuse * dist_atten * spot_atten, 0.0f);
+
+ specular_sum += Math::MakeVec(
+ (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f);
+ }
+
+ diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f);
+
+ auto diffuse = Math::MakeVec<float>(MathUtil::Clamp(diffuse_sum.x, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.y, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.z, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(diffuse_sum.w, 0.0f, 1.0f) * 255)
+ .Cast<u8>();
+ auto specular = Math::MakeVec<float>(MathUtil::Clamp(specular_sum.x, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.y, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.z, 0.0f, 1.0f) * 255,
+ MathUtil::Clamp(specular_sum.w, 0.0f, 1.0f) * 255)
+ .Cast<u8>();
+ return std::make_tuple(diffuse, specular);
+}
+
+} // namespace Pica
diff --git a/src/video_core/swrasterizer/lighting.h b/src/video_core/swrasterizer/lighting.h
new file mode 100644
index 000000000..d807a3d94
--- /dev/null
+++ b/src/video_core/swrasterizer/lighting.h
@@ -0,0 +1,19 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <tuple>
+#include "common/quaternion.h"
+#include "common/vector_math.h"
+#include "video_core/pica_state.h"
+
+namespace Pica {
+
+std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
+ const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state,
+ const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view,
+ const Math::Vec4<u8> (&texture_color)[4]);
+
+} // namespace Pica
diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp
index 512e81c08..862135614 100644
--- a/src/video_core/swrasterizer/rasterizer.cpp
+++ b/src/video_core/swrasterizer/rasterizer.cpp
@@ -13,6 +13,7 @@
#include "common/logging/log.h"
#include "common/math_util.h"
#include "common/microprofile.h"
+#include "common/quaternion.h"
#include "common/vector_math.h"
#include "core/hw/gpu.h"
#include "core/memory.h"
@@ -24,6 +25,7 @@
#include "video_core/regs_texturing.h"
#include "video_core/shader/shader.h"
#include "video_core/swrasterizer/framebuffer.h"
+#include "video_core/swrasterizer/lighting.h"
#include "video_core/swrasterizer/proctex.h"
#include "video_core/swrasterizer/rasterizer.h"
#include "video_core/swrasterizer/texturing.h"
@@ -419,6 +421,26 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
regs.texturing.tev_combiner_buffer_color.a,
};
+ Math::Vec4<u8> primary_fragment_color = {0, 0, 0, 0};
+ Math::Vec4<u8> secondary_fragment_color = {0, 0, 0, 0};
+
+ if (!g_state.regs.lighting.disable) {
+ Math::Quaternion<float> normquat = Math::Quaternion<float>{
+ {GetInterpolatedAttribute(v0.quat.x, v1.quat.x, v2.quat.x).ToFloat32(),
+ GetInterpolatedAttribute(v0.quat.y, v1.quat.y, v2.quat.y).ToFloat32(),
+ GetInterpolatedAttribute(v0.quat.z, v1.quat.z, v2.quat.z).ToFloat32()},
+ GetInterpolatedAttribute(v0.quat.w, v1.quat.w, v2.quat.w).ToFloat32(),
+ }.Normalized();
+
+ Math::Vec3<float> view{
+ GetInterpolatedAttribute(v0.view.x, v1.view.x, v2.view.x).ToFloat32(),
+ GetInterpolatedAttribute(v0.view.y, v1.view.y, v2.view.y).ToFloat32(),
+ GetInterpolatedAttribute(v0.view.z, v1.view.z, v2.view.z).ToFloat32(),
+ };
+ std::tie(primary_fragment_color, secondary_fragment_color) = ComputeFragmentsColors(
+ g_state.regs.lighting, g_state.lighting, normquat, view, texture_color);
+ }
+
for (unsigned tev_stage_index = 0; tev_stage_index < tev_stages.size();
++tev_stage_index) {
const auto& tev_stage = tev_stages[tev_stage_index];
@@ -427,14 +449,13 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve
auto GetSource = [&](Source source) -> Math::Vec4<u8> {
switch (source) {
case Source::PrimaryColor:
+ return primary_color;
- // HACK: Until we implement fragment lighting, use primary_color
case Source::PrimaryFragmentColor:
- return primary_color;
+ return primary_fragment_color;
- // HACK: Until we implement fragment lighting, use zero
case Source::SecondaryFragmentColor:
- return {0, 0, 0, 0};
+ return secondary_fragment_color;
case Source::Texture0:
return texture_color[0];
diff --git a/src/video_core/swrasterizer/rasterizer.h b/src/video_core/swrasterizer/rasterizer.h
index 2f0877581..66cd6cfd4 100644
--- a/src/video_core/swrasterizer/rasterizer.h
+++ b/src/video_core/swrasterizer/rasterizer.h
@@ -19,10 +19,9 @@ struct Vertex : Shader::OutputVertex {
// Linear interpolation
// factor: 0=this, 1=vtx
+ // Note: This function cannot be called after perspective divide
void Lerp(float24 factor, const Vertex& vtx) {
pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor);
-
- // TODO: Should perform perspective correct interpolation here...
quat = quat * factor + vtx.quat * (float24::FromFloat32(1) - factor);
color = color * factor + vtx.color * (float24::FromFloat32(1) - factor);
tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor);
@@ -30,12 +29,11 @@ struct Vertex : Shader::OutputVertex {
tc0_w = tc0_w * factor + vtx.tc0_w * (float24::FromFloat32(1) - factor);
view = view * factor + vtx.view * (float24::FromFloat32(1) - factor);
tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor);
-
- screenpos = screenpos * factor + vtx.screenpos * (float24::FromFloat32(1) - factor);
}
// Linear interpolation
// factor: 0=v0, 1=v1
+ // Note: This function cannot be called after perspective divide
static Vertex Lerp(float24 factor, const Vertex& v0, const Vertex& v1) {
Vertex ret = v0;
ret.Lerp(factor, v1);
diff --git a/src/video_core/swrasterizer/texturing.cpp b/src/video_core/swrasterizer/texturing.cpp
index 4f02b93f2..79b1ce841 100644
--- a/src/video_core/swrasterizer/texturing.cpp
+++ b/src/video_core/swrasterizer/texturing.cpp
@@ -89,6 +89,8 @@ Math::Vec3<u8> GetColorModifier(TevStageConfig::ColorModifier factor,
case ColorModifier::OneMinusSourceBlue:
return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>();
}
+
+ UNREACHABLE();
};
u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& values) {
@@ -119,6 +121,8 @@ u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>&
case AlphaModifier::OneMinusSourceBlue:
return 255 - values.b();
}
+
+ UNREACHABLE();
};
Math::Vec3<u8> ColorCombine(TevStageConfig::Operation op, const Math::Vec3<u8> input[3]) {
diff --git a/src/video_core/utils.h b/src/video_core/utils.h
index 7ce83a055..d8567f314 100644
--- a/src/video_core/utils.h
+++ b/src/video_core/utils.h
@@ -8,17 +8,11 @@
namespace VideoCore {
-/**
- * Interleave the lower 3 bits of each coordinate to get the intra-block offsets, which are
- * arranged in a Z-order curve. More details on the bit manipulation at:
- * https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/
- */
+// 8x8 Z-Order coordinate from 2D coordinates
static inline u32 MortonInterleave(u32 x, u32 y) {
- u32 i = (x & 7) | ((y & 7) << 8); // ---- -210
- i = (i ^ (i << 2)) & 0x1313; // ---2 --10
- i = (i ^ (i << 1)) & 0x1515; // ---2 -1-0
- i = (i | (i >> 7)) & 0x3F;
- return i;
+ static const u32 xlut[] = {0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15};
+ static const u32 ylut[] = {0x00, 0x02, 0x08, 0x0a, 0x20, 0x22, 0x28, 0x2a};
+ return xlut[x % 8] + ylut[y % 8];
}
/**
diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt
index 334d82a8a..c93811892 100644
--- a/src/web_service/CMakeLists.txt
+++ b/src/web_service/CMakeLists.txt
@@ -1,10 +1,12 @@
set(SRCS
telemetry_json.cpp
+ verify_login.cpp
web_backend.cpp
)
set(HEADERS
telemetry_json.h
+ verify_login.h
web_backend.h
)
diff --git a/src/web_service/telemetry_json.cpp b/src/web_service/telemetry_json.cpp
index a2d007e77..6ad2ffcd4 100644
--- a/src/web_service/telemetry_json.cpp
+++ b/src/web_service/telemetry_json.cpp
@@ -3,7 +3,6 @@
// Refer to the license.txt file included.
#include "common/assert.h"
-#include "core/settings.h"
#include "web_service/telemetry_json.h"
#include "web_service/web_backend.h"
@@ -81,7 +80,7 @@ void TelemetryJson::Complete() {
SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig");
SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
- PostJson(Settings::values.telemetry_endpoint_url, TopSection().dump());
+ PostJson(endpoint_url, TopSection().dump(), true, username, token);
}
} // namespace WebService
diff --git a/src/web_service/telemetry_json.h b/src/web_service/telemetry_json.h
index 39038b4f9..9e78c6803 100644
--- a/src/web_service/telemetry_json.h
+++ b/src/web_service/telemetry_json.h
@@ -17,7 +17,9 @@ namespace WebService {
*/
class TelemetryJson : public Telemetry::VisitorInterface {
public:
- TelemetryJson() = default;
+ TelemetryJson(const std::string& endpoint_url, const std::string& username,
+ const std::string& token)
+ : endpoint_url(endpoint_url), username(username), token(token) {}
~TelemetryJson() = default;
void Visit(const Telemetry::Field<bool>& field) override;
@@ -49,6 +51,9 @@ private:
nlohmann::json output;
std::array<nlohmann::json, 7> sections;
+ std::string endpoint_url;
+ std::string username;
+ std::string token;
};
} // namespace WebService
diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp
new file mode 100644
index 000000000..1bc3b5afe
--- /dev/null
+++ b/src/web_service/verify_login.cpp
@@ -0,0 +1,28 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <json.hpp>
+#include "web_service/verify_login.h"
+#include "web_service/web_backend.h"
+
+namespace WebService {
+
+std::future<bool> VerifyLogin(std::string& username, std::string& token,
+ const std::string& endpoint_url, std::function<void()> func) {
+ auto get_func = [func, username](const std::string& reply) -> bool {
+ func();
+ if (reply.empty())
+ return false;
+ nlohmann::json json = nlohmann::json::parse(reply);
+ std::string result;
+ try {
+ result = json["username"];
+ } catch (const nlohmann::detail::out_of_range&) {
+ }
+ return result == username;
+ };
+ return GetJson<bool>(get_func, endpoint_url, false, username, token);
+}
+
+} // namespace WebService
diff --git a/src/web_service/verify_login.h b/src/web_service/verify_login.h
new file mode 100644
index 000000000..303f5dbbc
--- /dev/null
+++ b/src/web_service/verify_login.h
@@ -0,0 +1,24 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <functional>
+#include <future>
+#include <string>
+
+namespace WebService {
+
+/**
+ * Checks if username and token is valid
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @param endpoint_url URL of the services.citra-emu.org endpoint.
+ * @param func A function that gets exectued when the verification is finished
+ * @returns Future with bool indicating whether the verification succeeded
+ */
+std::future<bool> VerifyLogin(std::string& username, std::string& token,
+ const std::string& endpoint_url, std::function<void()> func);
+
+} // namespace WebService
diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp
index 13e4555ac..b17d82f9c 100644
--- a/src/web_service/web_backend.cpp
+++ b/src/web_service/web_backend.cpp
@@ -2,51 +2,139 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#ifdef _WIN32
+#include <winsock.h>
+#endif
+
+#include <cstdlib>
+#include <thread>
#include <cpr/cpr.h>
-#include <stdlib.h>
#include "common/logging/log.h"
#include "web_service/web_backend.h"
namespace WebService {
static constexpr char API_VERSION[]{"1"};
-static constexpr char ENV_VAR_USERNAME[]{"CITRA_WEB_SERVICES_USERNAME"};
-static constexpr char ENV_VAR_TOKEN[]{"CITRA_WEB_SERVICES_TOKEN"};
-static std::string GetEnvironmentVariable(const char* name) {
- const char* value{getenv(name)};
- if (value) {
- return value;
+static std::unique_ptr<cpr::Session> g_session;
+
+void Win32WSAStartup() {
+#ifdef _WIN32
+ // On Windows, CPR/libcurl does not properly initialize Winsock. The below code is used to
+ // initialize Winsock globally, which fixes this problem. Without this, only the first CPR
+ // session will properly be created, and subsequent ones will fail.
+ WSADATA wsa_data;
+ const int wsa_result{WSAStartup(MAKEWORD(2, 2), &wsa_data)};
+ if (wsa_result) {
+ LOG_CRITICAL(WebService, "WSAStartup failed: %d", wsa_result);
}
- return {};
+#endif
}
-const std::string& GetUsername() {
- static const std::string username{GetEnvironmentVariable(ENV_VAR_USERNAME)};
- return username;
-}
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+ const std::string& username, const std::string& token) {
+ if (url.empty()) {
+ LOG_ERROR(WebService, "URL is invalid");
+ return;
+ }
+
+ const bool are_credentials_provided{!token.empty() && !username.empty()};
+ if (!allow_anonymous && !are_credentials_provided) {
+ LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
+ return;
+ }
-const std::string& GetToken() {
- static const std::string token{GetEnvironmentVariable(ENV_VAR_TOKEN)};
- return token;
+ Win32WSAStartup();
+
+ // Built request header
+ cpr::Header header;
+ if (are_credentials_provided) {
+ // Authenticated request if credentials are provided
+ header = {{"Content-Type", "application/json"},
+ {"x-username", username.c_str()},
+ {"x-token", token.c_str()},
+ {"api-version", API_VERSION}};
+ } else {
+ // Otherwise, anonymous request
+ header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
+ }
+
+ // Post JSON asynchronously
+ static std::future<void> future;
+ future = cpr::PostCallback(
+ [](cpr::Response r) {
+ if (r.error) {
+ LOG_ERROR(WebService, "POST returned cpr error: %u:%s",
+ static_cast<u32>(r.error.code), r.error.message.c_str());
+ return;
+ }
+ if (r.status_code >= 400) {
+ LOG_ERROR(WebService, "POST returned error status code: %u", r.status_code);
+ return;
+ }
+ if (r.header["content-type"].find("application/json") == std::string::npos) {
+ LOG_ERROR(WebService, "POST returned wrong content: %s",
+ r.header["content-type"].c_str());
+ return;
+ }
+ },
+ cpr::Url{url}, cpr::Body{data}, header);
}
-void PostJson(const std::string& url, const std::string& data) {
+template <typename T>
+std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
+ bool allow_anonymous, const std::string& username,
+ const std::string& token) {
if (url.empty()) {
LOG_ERROR(WebService, "URL is invalid");
- return;
+ return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
}
- if (GetUsername().empty() || GetToken().empty()) {
- LOG_ERROR(WebService, "Environment variables %s and %s must be set to POST JSON",
- ENV_VAR_USERNAME, ENV_VAR_TOKEN);
- return;
+ const bool are_credentials_provided{!token.empty() && !username.empty()};
+ if (!allow_anonymous && !are_credentials_provided) {
+ LOG_ERROR(WebService, "Credentials must be provided for authenticated requests");
+ return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); });
}
- cpr::PostAsync(cpr::Url{url}, cpr::Body{data}, cpr::Header{{"Content-Type", "application/json"},
- {"x-username", GetUsername()},
- {"x-token", GetToken()},
- {"api-version", API_VERSION}});
+ Win32WSAStartup();
+
+ // Built request header
+ cpr::Header header;
+ if (are_credentials_provided) {
+ // Authenticated request if credentials are provided
+ header = {{"Content-Type", "application/json"},
+ {"x-username", username.c_str()},
+ {"x-token", token.c_str()},
+ {"api-version", API_VERSION}};
+ } else {
+ // Otherwise, anonymous request
+ header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}};
+ }
+
+ // Get JSON asynchronously
+ return cpr::GetCallback(
+ [func{std::move(func)}](cpr::Response r) {
+ if (r.error) {
+ LOG_ERROR(WebService, "GET returned cpr error: %u:%s",
+ static_cast<u32>(r.error.code), r.error.message.c_str());
+ return func("");
+ }
+ if (r.status_code >= 400) {
+ LOG_ERROR(WebService, "GET returned error code: %u", r.status_code);
+ return func("");
+ }
+ if (r.header["content-type"].find("application/json") == std::string::npos) {
+ LOG_ERROR(WebService, "GET returned wrong content: %s",
+ r.header["content-type"].c_str());
+ return func("");
+ }
+ return func(r.text);
+ },
+ cpr::Url{url}, header);
}
+template std::future<bool> GetJson(std::function<bool(const std::string&)> func,
+ const std::string& url, bool allow_anonymous,
+ const std::string& username, const std::string& token);
+
} // namespace WebService
diff --git a/src/web_service/web_backend.h b/src/web_service/web_backend.h
index 2753d3b68..a63c75d13 100644
--- a/src/web_service/web_backend.h
+++ b/src/web_service/web_backend.h
@@ -4,28 +4,36 @@
#pragma once
+#include <functional>
+#include <future>
#include <string>
#include "common/common_types.h"
namespace WebService {
/**
- * Gets the current username for accessing services.citra-emu.org.
- * @returns Username as a string, empty if not set.
- */
-const std::string& GetUsername();
-
-/**
- * Gets the current token for accessing services.citra-emu.org.
- * @returns Token as a string, empty if not set.
+ * Posts JSON to services.citra-emu.org.
+ * @param url URL of the services.citra-emu.org endpoint to post data to.
+ * @param data String of JSON data to use for the body of the POST request.
+ * @param allow_anonymous If true, allow anonymous unauthenticated requests.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
*/
-const std::string& GetToken();
+void PostJson(const std::string& url, const std::string& data, bool allow_anonymous,
+ const std::string& username = {}, const std::string& token = {});
/**
- * Posts JSON to services.citra-emu.org.
+ * Gets JSON from services.citra-emu.org.
+ * @param func A function that gets exectued when the json as a string is received
* @param url URL of the services.citra-emu.org endpoint to post data to.
- * @param data String of JSON data to use for the body of the POST request.
+ * @param allow_anonymous If true, allow anonymous unauthenticated requests.
+ * @param username Citra username to use for authentication.
+ * @param token Citra token to use for authentication.
+ * @return future that holds the return value T of the func
*/
-void PostJson(const std::string& url, const std::string& data);
+template <typename T>
+std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url,
+ bool allow_anonymous, const std::string& username = {},
+ const std::string& token = {});
} // namespace WebService