diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..71b521207d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: devmiyax +liberapay: devmiyax diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..b44c9eb1d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +yabause/src/android/res/values/security.xml +/.gradle/ +/local.properties +.DS_Store +*.iml +build/ +/*build/ +**/*build/* +*.a +*.so +*.swp +yabause/*build*/* +yabause/ax86_64/* +yabause/src/qt/firebase_cpp_sdk/* +yabause/src/android/.settings/* +yabause/src/android/app/.settings/* +build*/ +yabause/src/ios/uoyabause/secrets.plist +**/Pods/* + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..fd223b55d2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "ext/eigen"] + path = yabause/src/retro_arena/nanogui-sdl/ext/eigen + url = https://github.com/libigl/eigen.git +[submodule "yabause/src/android/oboe"] + path = yabause/src/android/oboe + url = https://github.com/google/oboe diff --git a/.travis.yml b/.travis.yml index c15f2bc3d1..53641fb2e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,122 +1,138 @@ +language: cpp +dist: bionic +#sudo: false +#cache: +# apt: true +env: + global: + - GLOBAL=1 + matrix: include: - - # linux gcc - - compiler: gcc - env: testenv="linux gcc" - - # linux clang - - compiler: clang - env: testenv="linux clang" - - # os x cocoa port - - language: objective-c - env: testenv="os x cocoa port" - os: osx - compiler: clang - before_script: - - cd ../src - - # enable cmake to find x11 and xrandr - - echo 'INCLUDE_DIRECTORIES("/opt/X11/include")' > temp.txt - - echo 'LINK_DIRECTORIES("/opt/X11/lib")' >> temp.txt - - cat temp.txt CMakeLists.txt > temp2.txt - - rm CMakeLists.txt - - mv temp2.txt CMakeLists.txt - - cd ../build - script: - - cmake -DCMAKE_BUILD_TYPE=Release .. - - make - after_success: - - cpack -G ZIP -D CPACK_PACKAGE_FILE_NAME=yabause-${GIT_HASH}-mac - #- curl --ftp-create-dirs -T yabause-${GIT_HASH}-mac.zip -u $YABUSR:$YABPAS ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/yabause-${GIT_HASH}-mac.zip - - curl --ftp-create-dirs -T yabause-${GIT_HASH}-mac.zip -u $YABUSR:$YABPAS ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/yabause-latest-mac.zip - - # mingw-w64 windows cross compile, libyabause only - # needs qt and other deps built - - compiler: gcc - env: testenv="mingw-w64 windows cross compile, libyabause only" + - os: linux addons: apt: + sources: + - ubuntu-toolchain-r-test packages: - - gcc-mingw-w64-x86-64 - - g++-mingw-w64-x86-64 - - binutils-mingw-w64-x86-64 - - mingw-w64-dev - script: - # create toolchain file so we can cross compile - - echo 'SET(CMAKE_SYSTEM_NAME Windows)' > toolchain.cmake - - echo 'SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)' >> toolchain.cmake - - echo 'SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)' >> toolchain.cmake - - echo 'SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)' >> toolchain.cmake - - cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake -DYAB_PORTS= .. - - make - after_success: - #- cpack -G ZIP -D CPACK_PACKAGE_FILE_NAME=yabause-${GIT_HASH}-win64 - #- curl --ftp-create-dirs -T yabause-${GIT_HASH}-win64.zip -u $YABUSR:$YABPAS ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/yabause-${GIT_HASH}-win64.zip - - # android port - - compiler: gcc - env: testenv="android port" - language: android - android: - components: + - gcc-5 + - g++-5 + - libegl1-mesa-dev + - libgles2-mesa-dev + - libsdl2-dev + - libcurl4-openssl-dev + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - libegl1-mesa-dev + - libgles2-mesa-dev + - libsdl2-dev + - libcurl4-openssl-dev + - libboost-dev + - libboost-system-dev + - libboost-filesystem-dev + - libboost-date-time-dev + - libboost-locale-dev - platform-tools - - tools - script: - - wget http://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip - - unzip -q android-ndk-r11c-linux-x86_64.zip - - - export PATH=${PATH}:$(pwd)/android-ndk-r11c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/ - - export NDK=$(pwd)/android-ndk-r11c/ - - export SYSROOT=$NDK/platforms/android-24/arch-arm - - - echo 'SET(CMAKE_SYSTEM_NAME Linux)' > toolchain.cmake - - echo 'SET(CMAKE_SYSTEM_VERSION 1)' >> toolchain.cmake - - echo 'SET(CMAKE_C_COMPILER arm-linux-androideabi-gcc)' >> toolchain.cmake - - echo 'SET(CMAKE_CXX_COMPILER arm-linux-androideabi-g++)' >> toolchain.cmake - - echo 'SET(CMAKE_ASM-ATT_COMPILER arm-linux-androideabi-as)' >> toolchain.cmake - - echo 'set(CMAKE_C_FLAGS "--sysroot=$ENV{SYSROOT}/usr/" CACHE STRING "GCC flags" FORCE)' >> toolchain.cmake - - echo 'set(CMAKE_CXX_FLAGS "--sysroot=$ENV{SYSROOT}/usr/" CACHE STRING "G++ flags" FORCE)' >> toolchain.cmake - - echo 'SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)' >> toolchain.cmake - - echo 'SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)' >> toolchain.cmake - - echo 'SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)' >> toolchain.cmake - - echo 'SET(ANDROID ON)' >> toolchain.cmake - - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_FIND_ROOT_PATH=$SYSROOT/usr/ -DNDK_BUILD=$NDK/build/ndk-build -DSDK_ANDROID=$ANDROID_HOME/tools/android -DSH2_DYNAREC=OFF -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake -DYAB_PORTS=android .. - - make - - after_success: - #- curl --ftp-create-dirs -T ./src/android/bin/Yabause-debug.apk -u $YABUSR:$YABPAS ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/yabause-${GIT_HASH}-android.apk - - curl --ftp-create-dirs -T ./src/android/bin/Yabause-debug.apk -u $YABUSR:$YABPAS ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/yabause-latest-android.apk - -addons: - coverity_scan: - project: - name: "Yabause/yabause" - description: "Build submitted via Travis CI" - notification_email: guillaume.duhamel@gmail.com - build_command_prepend: "cmake ..;" - build_command: "make" - branch_pattern: coverity_scan - -env: - global: - # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created - # via the "travis encrypt" command using the project repo's public key - - secure: "sopS90ts/MzipWazyLIeLtDkSWZyV9HeMfR8mIglxWuo76T/mOCT0m4fFPRQeJ1OHO3hWMbpYzKt357B/gwcpbq1/MTm6l+mhkxTKGBmrLpT9bz3GfQcQG3UgtOBp5bgUFc0xB2geN5BYrNCiKExmuMqTFByMKvIjiRWzwiCJflc74iNHTzS4j3y/wfRypnhJ8HIyU9YSwB43QzvtvmwgHRNcQ8Z7Hsto4qs4anEM4fnKWD5yyD+sFFnZIaCtDLXcKAi8HY0ILf2jxO5SLxzv0R9tyBkbXLaaSVfHWR3NOFMJtT4vq1v+XzcD2p1c9PxsxmIsOK2TLpYEx7sCmddO5zSs884turwu1ZDT/1pUQODSaxVpCRlE+NVDoUl6tqa3DGW1rIxzp/NjRzo4WEP2+fAvPVQSKG8l7GuHhgY1m8D0lHesaNXFr6D6hiKDEmMc1/nVKW8ohMPQxC1/g7tfM61zCkDcwc5CEtB6lNxEr3Db1M1u7X0pOCbPTgt0mNJcpGlNNDRnjh4gb+gXmFMAsJKTSy4/i4ExhMvTQqUp9LA7Bu0SdCT74rH5wS2oPw65aiijFDdaItk1ZapASphwzVV4IoKMQ7/6ZWEHccLZQ63a4hSSFD0upn5qcAhGlZwdUc4wYRFayUo5pzxYbui9Zlv/XxYEC5K8vI4EunmcBw=" - -language: cpp + - build-tools-26.0.1 + - android-26 + - extra-google-m2repository + - extra-android-m2repository + before_install: + - cd $HOME + - rm -fr $HOME/android-ndk-r16b + - curl -L http://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip -O + - unzip -oq android-ndk-r13b-linux-x86_64.zip + - rm android-ndk-r13b-linux-x86_64.zip + + env: + - MATRIX_EVAL="CC=gcc && CXX=g++" + - chmod 755 ./gradlew + - ./gradlew assembleDebug + +# - language: android +# env: +# - ANDROID_NDK=$HOME/android-ndk-r13b +# android: +# components: +# - tools +# - platform-tools +# - build-tools-26.0.2 +# - android-26 +# - extra-google-m2repository +# - extra-android-m2repository +# before_install: +# - cd $HOME +# - rm -fr $HOME/android-ndk-r16b +# - curl -L http://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip -O +# - unzip -oq android-ndk-r13b-linux-x86_64.zip +# - rm android-ndk-r13b-linux-x86_64.zip +# script: +# - cd ${TRAVIS_BUILD_DIR}/yabause +# - mkdir build +# - cd build +# - cmake ../ -DCMAKE_TOOLCHAIN_FILE=../src/android/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a with NEON" -DANDROID_NATIVE_API_LEVEL=19 -DYAB_PORTS=android -DYAB_WANT_ARM7=TRUE -DYAB_WANT_C68K=FALSE -DYAB_WANT_DYNAREC_DEVMIYAX=TRUE +# - make VERBOSE=1 +# - cd ../src/android +# - chmod 755 ./gradlew +# - ./gradlew assembleDebug + +before_install: + - eval "${MATRIX_EVAL}" + - sudo apt-get update -y + - sudo apt install -y libegl1-mesa-dev + - sudo apt install -y libgles2-mesa-dev + - sudo apt install -y libsdl2-dev + - sudo apt install -y libcurl4-openssl-dev + - sudo apt install -y libboost-dev + - sudo apt install -y libboost-system-dev + - sudo apt install -y libboost-filesystem-dev + - sudo apt install -y libboost-date-time-dev + - sudo apt install -y libboost-locale-dev + +install: + # Set the ${CXX} variable properly + #- export CXX=${COMPILER} + # - ${CXX} --version -sudo: false + # Dependencies required by the CI are installed in ${TRAVIS_BUILD_DIR}/deps/ + - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps" + - mkdir -p "${DEPS_DIR}" + - cd "${DEPS_DIR}" -before_install: - # only build the first port if running a coverity scan. otherwise coverity will attempt to analyze all the builds - - if ([[ "${TRAVIS_JOB_NUMBER##*.}" != "1" ]] && [[ "${TRAVIS_BRANCH}" == "coverity_scan" ]]); then false ; fi - - cd yabause + # Travis machines have 2 cores + - JOBS=2 + + ############################################################################ + # Install a recent CMake (unless already installed on OS X) + ############################################################################ + #- CMAKE_VERSION=3.9.6 + #- | + # if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then + # CMAKE_URL="https://cmake.org/files/v${CMAKE_VERSION%.[0-9]}/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" + # mkdir cmake && travis_retry wget --no-check-certificate -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake + # export PATH=${DEPS_DIR}/cmake/bin:${PATH} + # else + # brew install cmake || brew upgrade cmake + # fi + #- cmake --version + +script: + - cd ${TRAVIS_BUILD_DIR}/yabause - mkdir build - cd build - export GIT_HASH=$(git rev-parse --short HEAD) + - cmake .. -DYAB_PORTS=retro_arena -DYAB_WANT_C68K=FALSE -DSH2_DYNAREC=FALSE -DYAB_WANT_DYNAREC_DEVMIYAX=OFF -DCMAKE_TOOLCHAIN_FILE=../src/retro_arena/pc.cmake + - make VERBOSE=1 -script: - - cmake -DYAB_WERROR=ON -DYAB_FORCE_SECURE_STRINGS=ON .. - - make +notifications: + email: false + + - cpack + +notifications: + email: false + + diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000..e0898c6dfa --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,10 @@ +pipeline { + agent any + stages { + stage('build') { + steps { + echo 'Hello' + } + } + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..cd07829192 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index 1ab28cf500..06be6f4e3d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -[![Travis CI Build Status](https://travis-ci.org/Yabause/yabause.svg?branch=master)](https://travis-ci.org/Yabause/yabause) -[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/n35d1obw5deo1dsl/branch/master?svg=true)](https://ci.appveyor.com/project/Guillaumito/yabause) -[![CircleCI Build Status](https://circleci.com/gh/Yabause/yabause/tree/master.svg?style=shield&circle-token=c3153fb8a4e9d5a8801604ce5cac566c5ea16774)](https://circleci.com/gh/Yabause/yabause) -[![Coverity Scan Status](https://scan.coverity.com/projects/6271/badge.svg)](https://scan.coverity.com/projects/6271) +[![Travis CI Build Status](https://travis-ci.org/devmiyax/yabause.svg?branch=master)](https://travis-ci.org/devmiyax/yabause) +[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/27foxtv7thxgvu5k/branch/master?svg=true)](https://ci.appveyor.com/project/devmiyax/yabause) +[![Discord](https://img.shields.io/discord/559158456515559424.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/aRJhTBH) +[![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/~32349/donate) + +[![Snap Status](https://build.snapcraft.io/badge/devmiyax/yabause.svg)](https://build.snapcraft.io/user/devmiyax/yabause) + diff --git a/appveyor.yml b/appveyor.yml index be926b1a04..4439a79031 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,92 +1,80 @@ environment: - MINGW: C:\Qt\Tools\mingw492_32 CMAKE_BUILD_TYPE: Release + keypass: + secure: ZLcvhuGQOxB1TWnSlnuRYg== + key: + secure: rpf8ZWv8gy7sh52aKtrvdZHUW9QT82gSn0xaWQMlzvLl4BlYcpLf6sla4mDfq5QdrPepAmQ623yLzKpDyuavKztODbhoFumhbSuFgqgNiEWY+LWRoa0X7XLOIxg2pSo64xOaQ8NEG9yRCiLq4bOY4QSWHst5KTjC3Wb4wtjUujjwMqkHufNxk7YzNvVnIvKEYUQLswAIBVtCD8qCSipYk37N6fUkWx4eAIRjU94md7BcEv1Z7XHQnvHYyDeov2TJneeGo/pHkUJh8Khe40dffOnSlYw4vAeP/x7ltlbgUxvAw7JamQaZyKmeK1G1onfeUaZoisjBKYOA/5LLUhALXBar8Mp+yyknaCtwjNxeaK3yoO9TG1gB8MdzetNX3oSVxiuuTj+oeRQbDBd9+UQelCh3c6LAgPspcNyBcf+XqlSC1chqz6kkZJxH/iq9jEbIKROYZpokmovqIJOrPUM91JiUROTFlmOO4eYJtJiSBWcwbfS25XfLjsoqctHoXpGHE5zU/O+9PLJtCucjxjTBwX7juL9rdW1yudIboNKqbxgPxt+u+EFeAeU0AMkfp1kWqdMi7Db+/yaAh+aGiCCUXTkAAXSlbMD9dZiJUpFeA3waT0hyFvITCqpPwT7zCj5K9oGKIIglRwFznpI4Rl0wyKLPhTrgF4vEJrOTHKWYBkfb+t5TWqjp2+tubhB7VFPaqLWwuSa9DkzeXZYcPr2O2ZJcxlzCTGk1jjNUlP43iSv+RndbAncq7CCyx7JfTSgPEhMCjKJb+XYgEMbiYzMX8deeDNVwtSgQWbcKJKUyCWDHuOSayHclP1lAyt7dHkextPiRUU3SL2ru0oPaJtw8MtaPhD14cS6gow/H7ZQfXLAXkYE+lCj+zwHVZkoYou8QHUqrVkzOJQU18kQkc5otqCFYyDRf0dp64+pDHa5vQiEVUXpAIjWZwOTfqIi7r73+aAUpZjABbKb62kx/0kYc/xlICkIjJqI+eqwLK8LCqHdEEtdE+3n3OiYTsRjchnadH2yN8l335FksEn/ziBbBTbG0WvM90jlpYcMOH/muGk3w3c960w9j507qNDoGdKG5ylLkiiW0RJbo7u1nyvgh75GphY2tGLL8Mq62yKxw3KuzjJRkoJrAFp565ADRvozZl4QHhM3pKVGyMkx/mXmbbvcvDoVko9MBVVHRGyfTfcOm8OD1miYxqpRHIY77umaYAPK9RbFF/3c7ppq38Mk77ofzu7HwozkxhfInqVSxunyATzs6TXc7AftoVPrQ15VF61OnpTBlkTFUtdsl8A7oBFjRhFN6xGrYOPG2jJK1WTNhvAuilEkWm5bm4gd9hbErsEiE5DEsx0AZyWzMoF6cAYfDbx3lTPF53sO4uwRvomadMiCRhgw/mJqOqz71gkXKgbdhRZZ58Kw050ltpkE+spSFP1ghCmhj6V40cvJkmGWCchQ6kPakwzIA7bwvnZFIIB8QRfpuYI8UaeJ14Ipm8ZVzhNkJ5jSIUG5V04FIc5rwsRniaMGpSSNLSyHqMfPcXVh809nOnfQvoNnxChiE7KOO0Km3hpcH8SHvmHSTwSq0oE3quTIMrYjRME3Zn58M/Iuv9utQU2MKZNVWZ4rO82je0HUDV1LdML1+3+MuIFNu+Klcu7OEHwce1gLm6Qgz0h1Zehz7ExMTYbutrR0feS8EhEZPskbKfQH4c/VItL28t0DmFTx5oq5yV5M9v4LyouqEbpMkoPzZZBVuhyAY35b+cROiW2wL4E9bqpiJjUJw3fjhhnTbDa/bp8gjATDlGH/zvYtczytPJ5rryFSeabKUiDQp4CIJDcpm9zmg2Re/Byc7sPwlyhOrqPXgPvzVaVwMSLdzYuICY2KuAT+ysiIi0DnMU5/J0tEsYP4P/nzyhQmALPZrGp3PInrAZZ0+9M73n3FoviYsU706Js7VOotsmR03tAJXa9rjb7KOajOJMfb6OqiTwuMlpewtYWPuN3WYNUQOO5e6L42GJdeDrEDaWCHMQ+15EqBsWnagzxsH577J92wyj/4FIdBA9N1OJFUCl9GzAseNL5bcgbZaKM1pxsxRTcLzmtSvfjPmzGVneXySGobSt0bzzk3OqXifipCgndvcrLHU9QRANjCg7PwWqiLhZG7nXyFuEuMkcmNcC3GpzdTgRv0AmzW3jUxl1e3BRnTkTk/NsC8loUeIzpzJMjS4zia5FFV3ynx+ZRq06C2SAw0oVuBsD7BpldHy7KBi+noy13fvDxBu287bYvKcZvLtL0mk9GyITM5NRAQVYfiGymRfSU5QlPdMgSjYqNQepUPInqqR+enF/ntTDjGG4iCQMVNQuyr6SCDwBotWpU1us1xYiQTaub3FfQIp1Xaof4OUJCSRcPkE5hq/zXgZ8oYq4HqsHs8GjM+opzWKK8ZWp+ZqJUJCJqBHEnrQvAwx2Wmzvv9NtlxXG7oer8Nu0MV13HaDl1TN5Pg55gI4b8PX3OVzqTUjA4h8e7sq44wPdTqMlmxS9en1ZqeJi9WKCD8tawpPTMihu1oLA3AMEiKeNCMD11aVDVJHIVjUpn+KRcsomInsUmQLjLYbIXK1H4pnDrPaLyl3Wvzg0rRu6J/+aOnsVdpvgllwrnRBMqhUQSd5dCvma9KfZj8MS4+nCJSNe7S0rcMstwOZdGyYsTi2b2KNPqWWdkR221Ut6iFWqRGT509sG1qeq9JEZ1sRPBsyhIUDZut/cyNcxz5gGWBAGyfwPqUOWjPBkqV5e17kCsuNRmYu/qN/QUjOAoDbSnQXm6HIeKUpCH5UU2ykYxexNrS1BvuA6VTm4FOoU2iQ9UdqQgd3U/0reqawRolWoTbcdy96SCrWxXY6Jotko8wOxzygWKZsMhaCvMuPDgkyUAzBDor8ZGjc93CcC2Xh34wzFlDUML4/+PX1PZzyqE5Oy1iL7ZixE9O8XztkV96XhsJ+Ijs+GIcXo9gT6+8G/X1UbPeWiYbyOZKIIL8FvS1RhqgKbc6szHT73VCoEQYwRvttwlCKcc8UWV1Rm6HfZSuiF5vu7nFWCClfIPLiS+9wncr6ImJ01OdT7O6MUdx7oJVp45chqnmTcgMB/gWdXfMaB7LeX+Rz0ssJ+Vf1jx2BgHHVjA/BSo9FynNLuKP/F26D4T6rYgkdMsAzftMGH0HLuvHpjcmCXpm5ec5FhjCKrO4FKHEty3Pz1HI7GZm6xOBEiounRZBFjkIsHVAka14NAZFoCzH0kCokHi2pXKiRr7W1zzDcW6TJQJOKVT23tkxWDLqATTKVwJlXXklbWnMxYMP4dhhf2aPYUXUSnGBzMH6q9GYtiyLZNpmsiS2t7KioWxtdG/320n4J5HJmrfSTYJGBRz6Oks5Lb9JXa0UIHtIWoNlLqPmImKE/bU/zg1MDCv6W5SWCfX/WCMIs8M5LhKZhZpDQXYW72w65qO1QcPCyJmq03AcrNCIlBqCtpc4RZpg8DQbQihw8N+WeA8znJ9oX/FgudA9RwKy5nOCD8Vrp7Gab1DjQuT+LWVSxsuIceEbRwn09H4XM7PdwbAAhFkyfcj4DCt+x9T6eYZ/cmquEAviJ+6v0fTA63o7dXYrAboBdFJ6F8XTUyfGsK0t8nOaCp+pb3xqMojm3/4dxgu5nNn/GKuIyQPG6s0WZ5EwnpGV5hOOZRgK7ckmfg7dSiY6gaB1WCaeHaLkcPia7J3BrYNpGXhl7I8Sv3NM4gKSoTd0wFFeEV4NVmgvTkEJy6TLU3uAMH1rmWhMc+h+G9rZ58vr++PYXb2TGLzOOTyYFvptUipYOH60YtypcWgMM4zHfoQUMgMHfsivoaiMVL+UY95JCsybllcRJF4S8TAUbl/dzPQL1UgbtlOXXUoP2sn1DnnlAmwhhWYt6n4nps42IWGrLUdKduSkRR3w5+TvE1/LQ6Zgm488UQu/+DKql129j0DiMO0zcBa4EvK7zO2dpx9n+QmM4TKGj7/bhmjzsW6P8+MoudFdlidwPsomVRzGv03dVTZTvFy2rdzgLG05kbbL41LCAjLk17VUstE1WV68Fud8tU1hdlNbujYk9kqm4VV6q317Z/qLIVjmjBi24AISEs1i0Yvqu4NhCJ1TEo4tQzA2uL+4PlnI3VHHbsuNik8FR+XnDOlDyLpr4UGrmcxDQGaKbaaUOb3/wI17KoBlHaPmvZYGS8hegDnIlAhfxmSULw9StvLywJVgiayAS/6XzPyKrP6LKaTZecdAMUcSoI/lmH7ZEEePua0pBacHg4J+qyyVb3noPK9hpbvACFHYCSnhaH5Tcd7wpvgPTrQWoDILGnyO7Muz9WLFSAuvdMGWi3+/XlrMFhViJ7cUsLuLkZeE6muXF/yG3C5znBCzqXfuyNd1VtIuO57i4aGPUA7qQf6c256M5aA5Dku8XQWO6suovgidRfziYB8ntOsoB1jafYY9fSWLW6j/uxSqQw8B+FLDU0R06fsgzeUyYlelozqhF2STjPjtof24xvInXUbqDk6QpLeW8Fu03ZgKw2/rN15wEoWwWWw0+4D+X9Slcegag3t4k7DPJlErZkuiZ2ZyftyVuZTyaWnKl+J5d5vMAAtRt+cbVmj4nLeZjQ1YV/VtdtG76aZxvDGyBGC3cZGRNkaNokCHObAvkB9jso4NxxIe2Fx4= # set to d if debug build qt_dll_suffix: "" matrix: # Visual Studio build - - generator: "Visual Studio 12 Win64" - CMAKE_PREFIX_PATH: C:\Qt\5.4\msvc2013_64_opengl - compiler_type: "vs12-x64" + - generator: "Visual Studio 14 2015" + CMAKE_PREFIX_PATH: C:\Qt\5.9.9\msvc2015 sdl_filename: SDL2-devel-2.0.3-VC.zip - sdl_arch: x64 - cmake_args: "-DYAB_WANT_DIRECTSOUND=ON -DYAB_WANT_DIRECTINPUT=ON -DYAB_NETWORK=ON -DYAB_WANT_GDBSTUB=ON" - - # MingGW x86 build - - generator: "MinGW Makefiles" - CMAKE_PREFIX_PATH: C:\Qt\5.5\mingw492_32 - CMAKE_C_COMPILER: gcc - CMAKE_CXX_COMPILER: g++ - CMAKE_MAKE_PROGRAM: mingw32-make.exe - compiler_type: "mingw32" - - # filename on the sdl website - sdl_filename: SDL2-devel-2.0.3-mingw.tar.gz sdl_arch: x86 - - # included directx headers incompatible with mingw - cmake_args: "-DYAB_NETWORK=ON -DYAB_WANT_GDBSTUB=ON" - - # MSYS2 x86_64 build - - compiler_type: "msys2-mingw-w64-x86_64" + cmake_args: "-DCMAKE_BUILD_TYPE=Release -DYAB_PORTS=qt -DYAB_WANT_VULKAN=ON -DYAB_WANT_DIRECTSOUND=ON -DYAB_WANT_DYNAREC_DEVMIYAX=TRUE -DYAB_WANT_DIRECTINPUT=ON -DSH2_DYNAREC=FALSE" shallow_clone: true init: # cmake errors if sh on the path # - rm "C:\Program Files (x86)\Git\bin\sh.exe" - - rm "C:\Program Files\Git\usr\bin\sh.exe" + #- rm "C:\Program Files\Git\usr\bin\sh.exe" # cpack won't work because of chocolatey sharing the same name - rm "C:\ProgramData\chocolatey\bin\cpack.exe" - - set Path=%MINGW%\bin;%Path% + #- set Path=%MINGW%\bin;%Path% before_build: # fetch appropriate sdl lib for visual studio or mingw - cd c:\ - - if NOT ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] appveyor DownloadFile https://www.libsdl.org/release/%sdl_filename% + - appveyor DownloadFile https://www.libsdl.org/release/%sdl_filename% # decompress it, shorten 7z output with FIND - - if NOT ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] 7z x %sdl_filename% | FIND /V "ing " + - 7z x %sdl_filename% | FIND /V "ing " - # mingw version is a tar.gz, decompress again - - if [%sdl_filename%]==[SDL2-devel-2.0.3-mingw.tar.gz] 7z x SDL2-devel-2.0.3-mingw.tar | FIND /V "ing " + - appveyor DownloadFile https://dl.google.com/firebase/sdk/cpp/firebase_cpp_sdk_6.11.0.zip + - tar -v -xf firebase_cpp_sdk_6.11.0.zip -C %APPVEYOR_BUILD_FOLDER%\yabause\src\qt\ + - ps: $cmake_args_dx += '-DDirectX_ERR_LIBRARY="C:\Program Files (x86)\Microsoft DirectX SDK\Lib\x86\DxErr.lib" ' + - ps: $cmake_args_dx += '-DDirectX_GUID_LIBRARY="C:\Program Files (x86)\Microsoft DirectX SDK\Lib\x86\dxguid.lib" ' + - ps: $cmake_args_dx += '-DDirectX_INPUT8_LIBRARY="C:\Program Files (x86)\Microsoft DirectX SDK\Lib\x86\dinput8.lib" ' + - ps: $cmake_args_dx += '-DDirectX_SOUND_LIBRARY="C:\Program Files (x86)\Microsoft DirectX SDK\Lib\x86\dsound.lib" ' + - ps: $cmake_args_dx += '-DDirectX_XINPUT_LIBRARY="C:\Program Files (x86)\Microsoft DirectX SDK\Lib\x86\XInput.lib" ' + - ps: ${env:cmake_args} = "${env:cmake_args} ${cmake_args_dx} -DMINI18N_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\mini18n\src -DMINI18N_LIBRARY=%APPVEYOR_BUILD_FOLDER%\mini18n\build\src\Release\mini18n-static.lib" + - ps: ${env:PATH} += ';"C:/Program Files (x86)/Windows Kits/10/bin/10.0.18362.0/x64/"' + +build_script: # generate project files or makefiles - - cd C:\projects\yabause\yabause + - cd %APPVEYOR_BUILD_FOLDER%\mini18n - mkdir build - cd build - - if NOT ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] cmake -G "%generator%" %cmake_args% -DSDL2MAIN_LIBRARY=C:/SDL2-2.0.3/lib/%sdl_arch%/SDL2main.lib -DSDL2_INCLUDE_DIR=C:/SDL2-2.0.3/include/ -DSDL2_LIBRARY=C:/SDL2-2.0.3/lib/%sdl_arch%/SDL2.lib .. - - #MSYS2 - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] set MSYSTEM=MINGW64 - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] set PATH=C:\msys64\mingw64\bin;C:\msys64\usr\bin;C:\msys64;%PATH% - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Sy" - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw64/mingw-w64-x86_64-SDL2 mingw-w64-x86_64-binutils mingw64/mingw-w64-x86_64-qt5 mingw-w64-x86_64-crt-git mingw-w64-x86_64-headers-git mingw64/mingw-w64-x86_64-libwebp" - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] C:\msys64\usr\bin\bash -lc "cd C:/projects/yabause/yabause/build ; cmake -G\"MSYS Makefiles\" -DCMAKE_BUILD_TYPE=Release -DDirectX_INCLUDE_DIR=C:/msys64/mingw64/x86_64-w64-mingw32/include -DYAB_WANT_DIRECTSOUND=ON -DYAB_WANT_DIRECTINPUT=ON -DYAB_NETWORK=ON -DYAB_WANT_GDBSTUB=ON -DMSYS2_BUILD=ON -DCMAKE_PREFIX_PATH=\"C:/msys64/mingw64/bin;C:/msys64/mingw64/include;C:/msys64/mingw64/lib;C:/msys64/mingw64/x86_64-w64-mingw32/include;C:/msys64/mingw64/x86_64-w64-mingw32/lib\" -DSDL2_LIBRARY=C:/msys64/mingw64/lib/libSDL2.dll.a .." - -build_script: - - if ["%compiler_type%"]==["mingw32"] cmake --build . - - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] C:\msys64\usr\bin\bash -lc "cd C:/projects/yabause/yabause/build ; make " - - # force a release build and only show errors to shorten output - - if ["%compiler_type%"]==["vs12-x64"] msbuild yabause.sln /p:configuration=Release /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - echo %cmake_args% + - cmake -G "%generator%" %cmake_args% .. + - msbuild mini18n.sln /p:configuration=Release /m /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - cd %APPVEYOR_BUILD_FOLDER%\yabause + - mkdir build + - cd build + - echo %cmake_args% + - cmake -G "%generator%" %cmake_args% -DSDL2MAIN_LIBRARY=C:/SDL2-2.0.3/lib/%sdl_arch%/SDL2main.lib -DSDL2_INCLUDE_DIR=C:/SDL2-2.0.3/include/ -DSDL2_LIBRARY=C:/SDL2-2.0.3/lib/%sdl_arch%/SDL2.lib .. + - msbuild YabaSanshiro.sln /p:configuration=Release /m /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" # make a distributable package of the build output after_build: - - cd C:\projects\yabause\yabause\build + - cd %APPVEYOR_BUILD_FOLDER%\yabause\build + - echo %key% | base64.exe -di > key.pfx + - signtool.exe sign /tr http://timestamp.digicert.com /f key.pfx /p %keypass% ".\src\qt\Release\yabasanshiro.exe" # zip all output files and push the artifact, name it with the commit, date and compiler type - - ps: $git_hash_date = ${env:APPVEYOR_REPO_COMMIT}.substring(0, 7) - - ps: $git_hash_date += "-" - - ps: $git_hash_date += ${env:APPVEYOR_REPO_COMMIT_TIMESTAMP}.substring(0,10) - - ps: ${env:yab_name} = "yabause-${git_hash_date}-${env:compiler_type}" - - cmd: cpack -G ZIP -D CPACK_PACKAGE_FILE_NAME=%yab_name% - - appveyor PushArtifact %yab_name%.zip + - cmd: cpack -G ZIP + - cmd: cpack -G WIX -C Release +artifacts: + - path: yabause\build\*.zip + - path: yabause\build\*.msi + # Upload build to yabause.org - - ps: ${env:yab_name_alt} = "yabause-latest-win64" + #- ps: ${env:yab_name_alt} = "yabause-latest-win64" #- ps: ${env:yab_name_alt2} = "yabause-${git_hash_date}-win64" - - if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] if not defined APPVEYOR_PULL_REQUEST_NUMBER curl --ftp-create-dirs -T %yab_name%.zip -u %YABUSR%:%YABPAS% ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/%yab_name_alt%.zip + #- if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] if not defined APPVEYOR_PULL_REQUEST_NUMBER curl --ftp-create-dirs -T %yab_name%.zip -u %YABUSR%:%YABPAS% ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/%yab_name_alt%.zip #- if ["%compiler_type%"]==["msys2-mingw-w64-x86_64"] curl --ftp-create-dirs -T %yab_name%.zip -u %YABUSR%:%YABPAS% ftp://ftp.tuxfamily.org/yabause/yabause-repository/releases/travis-ci/%yab_name_alt2%.zip diff --git a/circle.yml b/circle.yml deleted file mode 100644 index f8d7a145ff..0000000000 --- a/circle.yml +++ /dev/null @@ -1,11 +0,0 @@ -machine: - services: - - docker - -checkout: - post: - - cd .. && git clone https://github.com/d356/yabauseut-docker.git - -test: - override: - - cd .. && cp -r yabause yabauseut-docker && cd yabauseut-docker && docker build . \ No newline at end of file diff --git a/snap/local/yabasanshiro.png b/snap/local/yabasanshiro.png new file mode 100644 index 0000000000..c659843002 Binary files /dev/null and b/snap/local/yabasanshiro.png differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000000..d129925e3c --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,115 @@ +name: yabasanshiro +base: core18 # the base snap is the execution environment for this snap +version: '3.0.0' +summary: SEGA Saturn emulator +description: | + SEGA Saturn emulator + +license: GPL-2.0 +title: Yaba Sanshiro +icon: snap/local/yabasanshiro.png + +grade: stable # must be 'stable' to release into candidate/stable channels +confinement: strict # use 'strict' once you have the right plugs and slots + +apps: + yabasanshiro: + command: desktop-launch ${SNAP}/usr/bin/yabasanshiro + desktop: usr/share/applications/yabasanshiro.desktop + plugs: + - home + - network + - x11 + - wayland + - opengl + - pulseaudio + - alsa + - desktop + - desktop-legacy + - unity7 + - dvb + - audio-playback + - audio-record + - removable-media + - screen-inhibit-control + bash: + command: bash + +parts: + yabasanshiro: + source: "https://github.com/devmiyax/yabause.git" + source-branch: master + source-depth: 1 + source-type: git + plugin: cmake + after: [qt5] + configflags: + - ${SNAPCRAFT_PART_SRC}/yabause + build-environment: + - PYTHONPATH: "/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:$PYTHONPATH" + override-pull: | + snapcraftctl pull + sed -i 's|^Icon=.*|Icon=usr/share/pixmaps/yabasanshiro.png|' ./yabause/src/qt/yabause.desktop.in + git clone https://github.com/firebase/firebase-cpp-sdk.git -b v6.11.0 yabause/src/qt/firebase-cpp-sdk + export PYTHONPATH="/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:$PYTHONPATH" + pip install wheel + pip install absl-py + pip install protobuf + build-packages: + - git + - python-pip + - python-setuptools + - python-wheel + - python-protobuf + - cmake + - build-essential + - protobuf-compiler + - libprotobuf-dev + - libsecret-1-dev + - libssl-dev + - zlib1g-dev + - libsdl2-dev + - libboost-all-dev + - qttools5-dev-tools + - libqt5svg5-dev + - qtmultimedia5-dev + - libqt5opengl5-dev + - resolvconf + stage-packages: + - libsdl2-2.0-0 + - libboost-all-dev + - librdmacm-dev + - libpulse0 + - qtmultimedia5-dev + - qtwebengine5-dev + - libxcb-xinerama0 + + + qt5: + source: https://github.com/ubuntu/snapcraft-desktop-helpers.git + source-subdir: qt + plugin: make + make-parameters: ["FLAVOR=qt5"] + build-packages: + - qtbase5-dev + - qt5-default + - dpkg-dev + stage-packages: + - libxkbcommon0 + - ttf-ubuntu-font-family + - dmz-cursor-theme + - light-themes + - adwaita-icon-theme + - gnome-themes-standard + - shared-mime-info + - libqt5gui5 + - libgdk-pixbuf2.0-0 + - libqt5svg5 # for loading icon themes which are svg + - libqt5opengl5 + - try: [appmenu-qt5] # not available on core18 + - locales-all + + gnu-bash: + source: http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz + plugin: autotools + configflags: ["--infodir=/var/bash/info"] diff --git a/win_template/Qt5Core.dll b/win_template/Qt5Core.dll new file mode 100644 index 0000000000..f1e8622b00 Binary files /dev/null and b/win_template/Qt5Core.dll differ diff --git a/win_template/Qt5Cored.dll b/win_template/Qt5Cored.dll new file mode 100644 index 0000000000..434c0fc6cd Binary files /dev/null and b/win_template/Qt5Cored.dll differ diff --git a/win_template/Qt5Gui.dll b/win_template/Qt5Gui.dll new file mode 100644 index 0000000000..59ce4c0798 Binary files /dev/null and b/win_template/Qt5Gui.dll differ diff --git a/win_template/Qt5Guid.dll b/win_template/Qt5Guid.dll new file mode 100644 index 0000000000..354482b7a3 Binary files /dev/null and b/win_template/Qt5Guid.dll differ diff --git a/win_template/Qt5Multimedia.dll b/win_template/Qt5Multimedia.dll new file mode 100644 index 0000000000..b81f6029e9 Binary files /dev/null and b/win_template/Qt5Multimedia.dll differ diff --git a/win_template/Qt5Multimediad.dll b/win_template/Qt5Multimediad.dll new file mode 100644 index 0000000000..27d8cb857a Binary files /dev/null and b/win_template/Qt5Multimediad.dll differ diff --git a/win_template/Qt5Network.dll b/win_template/Qt5Network.dll new file mode 100644 index 0000000000..2c1dd8493c Binary files /dev/null and b/win_template/Qt5Network.dll differ diff --git a/win_template/Qt5Networkd.dll b/win_template/Qt5Networkd.dll new file mode 100644 index 0000000000..c20a193c6d Binary files /dev/null and b/win_template/Qt5Networkd.dll differ diff --git a/win_template/Qt5OpenGL.dll b/win_template/Qt5OpenGL.dll new file mode 100644 index 0000000000..c70ba92a8c Binary files /dev/null and b/win_template/Qt5OpenGL.dll differ diff --git a/win_template/Qt5OpenGLd.dll b/win_template/Qt5OpenGLd.dll new file mode 100644 index 0000000000..6d1a351cfd Binary files /dev/null and b/win_template/Qt5OpenGLd.dll differ diff --git a/win_template/Qt5Widgets.dll b/win_template/Qt5Widgets.dll new file mode 100644 index 0000000000..6d1ed14f3b Binary files /dev/null and b/win_template/Qt5Widgets.dll differ diff --git a/win_template/Qt5Widgetsd.dll b/win_template/Qt5Widgetsd.dll new file mode 100644 index 0000000000..fc43ade098 Binary files /dev/null and b/win_template/Qt5Widgetsd.dll differ diff --git a/win_template/SDL2.dll b/win_template/SDL2.dll new file mode 100644 index 0000000000..15ad52e16e Binary files /dev/null and b/win_template/SDL2.dll differ diff --git a/win_template/autotest.py b/win_template/autotest.py new file mode 100644 index 0000000000..ddee376673 --- /dev/null +++ b/win_template/autotest.py @@ -0,0 +1,184 @@ +#------------------------------------------------------------------------------ +# Automated Test framework for Yaba Sanshrio. +# デグレチェックの自動化 +# devMiyax +# +# How to use +# 1) テストケースと正解データの準備 +# * YabaSansiroの実行 +# * Menuの"Emulation"->"Record"を選択して記録開始 +# * 正解画像を取りたいところでCtrl+Pを押す +# * Menuの"Emulation"->"Record"を選択して記録終了 +# 2) テストケースの記述 +# * autotest.pyのある場所にtestcase.jsonファイルを作成する +# * 以下の内容のjsonデータを記述する +# { +# "exename":<テストしたい実行ファイルのパス>, +# "testcase":[ +# { "iso":<テストしたいゲームのISOイメージのパス>, +# "id":<レコードデータのあるパス> } +# ] +# } +# 3) テスト実行 +# * autotest.pyを実行する +# * 一通りテストが終わると結果が表示される +# * 画像が比較され同一の場合のスコアは1.00となる +#------------------------------------------------------------------------------ + +import subprocess +from subprocess import PIPE +import cv2 +import numpy as np +import os +from yattag import Doc +import webbrowser +from datetime import datetime +import json +import time + +class TestCase: + def __init__(self, iso, id): + self.iso = iso + self.id = id + self.result = [] + self.score=0.0 + self.time=0.0 + + def exec(self): + + idpath = testpath + "/" + self.id + + if(os.path.exists(self.iso) != True): + print( self.iso + " does not exist!") + return -1 + + if(os.path.exists(idpath) != True): + print( idpath + " does not exist!") + return -1 + + command = exename + " -i " + "\"" + self.iso + "\"" + " -a -p " + idpath + print(command) + start = time.time() + proc = subprocess.run(command, shell=True, stdout=PIPE, stderr=PIPE, text=True) + self.time = time.time() - start + print(proc.stdout) + for file in sorted(os.listdir(idpath)): + if file.endswith(".png"): + comp = 0.0 + im = cv2.imread( idpath + "/" + file ) + if im is None: + print( self.id + "/" + file + " does not exist!") + return -1 + im = cv2.resize(im, IMG_SIZE) + target_hist = cv2.calcHist([im], [0], None, [256], [0, 256]) + if(os.path.exists( idpath + "out/" + file)): + im_after = cv2.imread( idpath + "out/" + file ) + if not im_after is None: + im_after = cv2.resize(im_after, IMG_SIZE) + comparing_hist = cv2.calcHist([im_after], [0], None, [256], [0, 256]) + comp = cv2.compareHist(target_hist, comparing_hist, 0) + self.score += comp + row = [ self.id + "/" + file, self.id + "out/" + file, comp ] + self.result.append(row) + print(comp) + return 0 + +def ydump_table(headings, rows, **kwargs): + doc, tag, text, line = Doc().ttl() + with tag('table', klass="table table-bordered", **kwargs): + with tag('tr'): + for x in headings: + line('th', str(x)) + for row in rows: + k = "" + if row[2] < 0.5: + k = "danger" + with tag('tr', klass=k): + with tag('td'): + doc.stag('img', src=row[0], klass="photo", width="320") + with tag('td'): + doc.stag('img', src=row[1], klass="photo",width="320") + line('td', "{:.2f}".format(row[2])) + #//for x in row: + # line('td', str(x)) + return doc.getvalue() + + +def main(): + global exename + current_hash = subprocess.getoutput("git rev-parse HEAD") + now = datetime.now() + dt_string = now.strftime("%d/%m/%Y %H:%M:%S") + print("Test is starting for " + current_hash.split()[0] + " at " + dt_string) + + if(os.path.exists('yabtest/testcase.json') != True): + print( "testcase.json does not exist!") + exit(-1) + + tests = [] + with open('yabtest/testcase.json') as json_file: + data = json.load(json_file) + exename = data['exename'] + for p in data['testcase']: + tests.append(TestCase( p['iso'],p['id'])) + + # Check Before test + if(os.path.exists(exename) != True): + print( exename + " does not exist!") + exit(-1) + + totalscore = 0.0 + totaltime = 0.0 + for test in tests: + test.exec() + totalscore += test.score + totaltime += test.time + + + doc, tag, text, line = Doc().ttl() + doc.asis('') + with tag('html'): + with tag('head'): + doc.asis('') + doc.asis('') + #doc.asis('') + doc.asis('') + with tag('script', src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"): + pass + with tag('script', src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"): + pass + with tag('body'): + with tag('div', klass='container'): + with tag('H1'): + text("Test Total Score:","{:.2f}".format(totalscore)) + doc.stag('br') + text("Test Total Time:","{:.2f}".format(totaltime) + "[sec]") + + with tag('p'): + text(str(current_hash.split()[0])) + doc.stag('br') + text(dt_string) + for test in tests: + with tag('div', klass='title'): + text("ID:",test.id) + doc.stag('br') + text("Duration:{:.2f}".format(test.time) + "[sec]" ) + doc.asis(ydump_table( headings, test.result )) + + + result = doc.getvalue() + + with open( testpath + "/result.html", "w") as file: + file.write(result) + + url = "file://" + os.getcwd() + "/"+testpath+"/result.html" + webbrowser.open(url,new=2) + + +IMG_SIZE = (320, 240) +testpath = "yabtest" +exename = "" +headings = ["GT","Result","score"] + +if __name__ == "__main__": + main() diff --git a/win_template/icudt53.dll b/win_template/icudt53.dll new file mode 100644 index 0000000000..4a56c52a35 Binary files /dev/null and b/win_template/icudt53.dll differ diff --git a/win_template/icuin53.dll b/win_template/icuin53.dll new file mode 100644 index 0000000000..0abd58383b Binary files /dev/null and b/win_template/icuin53.dll differ diff --git a/win_template/icuuc53.dll b/win_template/icuuc53.dll new file mode 100644 index 0000000000..65f63c3e73 Binary files /dev/null and b/win_template/icuuc53.dll differ diff --git a/win_template/libeay32.dll b/win_template/libeay32.dll new file mode 100644 index 0000000000..2c68d0d629 Binary files /dev/null and b/win_template/libeay32.dll differ diff --git a/win_template/mini18n.dll b/win_template/mini18n.dll new file mode 100644 index 0000000000..4975680643 Binary files /dev/null and b/win_template/mini18n.dll differ diff --git a/win_template/platforms/qminimal.dll b/win_template/platforms/qminimal.dll new file mode 100644 index 0000000000..8aa5ef7dde Binary files /dev/null and b/win_template/platforms/qminimal.dll differ diff --git a/win_template/platforms/qminimald.dll b/win_template/platforms/qminimald.dll new file mode 100644 index 0000000000..d7cb563067 Binary files /dev/null and b/win_template/platforms/qminimald.dll differ diff --git a/win_template/platforms/qoffscreen.dll b/win_template/platforms/qoffscreen.dll new file mode 100644 index 0000000000..4c39d2700f Binary files /dev/null and b/win_template/platforms/qoffscreen.dll differ diff --git a/win_template/platforms/qoffscreend.dll b/win_template/platforms/qoffscreend.dll new file mode 100644 index 0000000000..44b0f23672 Binary files /dev/null and b/win_template/platforms/qoffscreend.dll differ diff --git a/win_template/platforms/qwindows.dll b/win_template/platforms/qwindows.dll new file mode 100644 index 0000000000..06c7cbb85e Binary files /dev/null and b/win_template/platforms/qwindows.dll differ diff --git a/win_template/platforms/qwindowsd.dll b/win_template/platforms/qwindowsd.dll new file mode 100644 index 0000000000..1ff726b973 Binary files /dev/null and b/win_template/platforms/qwindowsd.dll differ diff --git a/win_template/readme.txt b/win_template/readme.txt new file mode 100644 index 0000000000..a029d48f56 --- /dev/null +++ b/win_template/readme.txt @@ -0,0 +1,10 @@ +Yaba Sanshiro windows version + +Web site + http://www.uoyabause.org/ + +Source + https://github.com/devmiyax/yabause + +Support + https://discordapp.com/invite/aRJhTBH \ No newline at end of file diff --git a/win_template/ssleay32.dll b/win_template/ssleay32.dll new file mode 100644 index 0000000000..8619307ab6 Binary files /dev/null and b/win_template/ssleay32.dll differ diff --git a/win_template/trans/yabause_ar.yts b/win_template/trans/yabause_ar.yts new file mode 100644 index 0000000000..a1eda0f053 --- /dev/null +++ b/win_template/trans/yabause_ar.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Images (*.%2) +%1/%2 blocks free|%1/%2 blocks free +&About...|حول +&Action Replay|&Action Replay +&Backup Manager...|&Backup Manager... +&Browse|إستعراض +&Cancel|إلغاء +&Capture Screen|أخذ لقطة للشاشة +&Cheat List|&Cheat List +&Cheats|&Cheats +&Cheats List...|&Cheats List... +&Clear|&Clear +&Close|&Close +&Debug|&Debug +&Delete|&Delete +&Emulation|&Emulation +&File|&File +&Frame Skip/Limiter|&Frame Skip/Limiter +&Fullscreen|&Fullscreen +&Help|&Help +&Layer|&Layer +&Load From File|&Load From File +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Memory Transfer +&OK|&OK +&Pause|&Pause +&Quit|&Quit +&Raw Memory Address|&Raw Memory Address +&Reset|&Reset +&Save To File|&Save To File +&Settings...|&Settings... +&Slave SH2|&Slave SH2 +&Tools|&Tools +&Transfer|&Transfer +&View|&View +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 blocks free +510/512 blocks free|510/512 blocks free +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|WARNING: Master Codes are NOT supported. +About...|About... +Action Replay Code :|Action Replay Code : +Add|Add +Add Action Replay Code|Add Action Replay Code +Add Cheat|Add Cheat +Add Codes...|Add Codes... +Add Raw Memory Code|Add Raw Memory Code +Address|Address +Address :|Address : +Advanced|Advanced +Always|Always +Are you sure you want to delete '%1' ?|Are you sure you want to delete '%1' ? +Are you sure you want to format '%1' ?|Are you sure you want to format '%1' ? +Asia (NTSC)|Asia (NTSC) +Asia (PAL)|Asia (PAL) +Auto-detect|Auto-detect +Autostart|Autostart +Awaiting input for|Awaiting input for +Axis|Axis +Backtrace|Backtrace +Backup Ram Manager|Backup Ram Manager +Binary Files (*.bin)|Binary Files (*.bin) +Bios|Bios +Block Size :|Block Size : +Browse|Browse +Byte|Byte +Byte Write|Byte Write +CD Images (*.iso *.cue *.bin)|CD Images (*.iso *.cue *.bin) +Cancel|Cancel +Cannot initialize|Cannot initialize +Cannot initialize Windows SPTI Driver|Cannot initialize Windows SPTI Driver +Cart/Memory|Cart/Memory +Cartridge|Cartridge +Cd-Rom|Cd-Rom +Central/South America (NTSC)|Central/South America (NTSC) +Central/South America (PAL)|Central/South America (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|Cheat Search +Cheat Type|Cheat Type +Cheats|Cheats +Cheats File|Cheats File +Choose a binary file|Choose a binary file +Choose a cartridge file|Choose a cartridge file +Choose a cdrom drive/mount point|Choose a cdrom drive/mount point +Choose a cheat file to open|Choose a cheat file to open +Choose a cheat file to save to|Choose a cheat file to save to +Choose a file to save your state|إختر ملف لحفظ التخزين +Choose a location for binary file|إختر موقع لملف ثنائى (binary file) +Choose a location for your screenshot|Choose a location for your screenshot +Choose a memory file|Choose a memory file +Choose a mpeg rom|Choose a mpeg rom +Clear configuration|Clear configuration +Close|Close +Code|Code +Code Breakpoints|Code Breakpoints +Comment :|Comment : +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Data Size +Data Size :|Data Size : +Data Type|Data Type +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Delete +Description|Description +Description :|Description : +Device List|قائمة الأجهزة +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|Disabled +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Down +Download|Download +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|ضبط الإعدادات +Emu-Compatibility|Emu-Compatibility +Emulation|Emulation +Enable|Enable +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Enabled +End Address:|End Address: +English|English +Enter New Value|أدخل قيمة جديدة +Europe + others (PAL)|Europe + others (PAL) +Exact|Exact +FPS|FPS +File|ملف +File Name :|إسم الملف +File transfer|نقل الملف +File:|ملف +Format|الصيغية +Frame Skip/Limiter|Frame Skip/Limiter +French|French +From|From +From File|From File +From File...|From File... +Fullscreen|Fullscreen +Fullscreen Resolution|Fullscreen Resolution +General|General +General Info|General Info +German|German +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|Hard Reset +Height|Height +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Input +Invalid Address|Invalid Address +Invalid Value|Invalid Value +Italian|Italian +Japan (NTSC)|Japan (NTSC) +Japanese|Japanese +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&oad State +Language :|Language : +Layer|Layer +Left|Left +Left trigger|Left trigger +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Load +Load State|Load State +Load State As|Load State As +Load as executable|Load as executable +Local Coordinates|Local Coordinates +Log|Log +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Memory +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Memory Dump +Memory Editor|Memory Editor +Memory Search|Memory Search +Memory Transfer|Memory Transfer +Memory dump|Memory dump +Middle|Middle +Mouse|Mouse +Mouse Configuration|Mouse Configuration +Mpeg ROM|Mpeg ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|None +Normal Sprite|Normal Sprite +North America (NTSC)|North America (NTSC) +OSD Core|OSD Core +Ok|Ok +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|Open CD Rom +OpenGL Video Interface|OpenGL Video Interface +Options|Options +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Configuration +Pause|Pause +Press Esc key to cancel|Press Esc key to cancel +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Keyboard Input Interface +Quit|Quit +R&un|R&un +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|Reset +Resolution|Resolution +Right|Right +Right trigger|Right trigger +Run|Run +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Interface +SDL Sound Interface|SDL Sound Interface +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamic Recompiler +SH2 Interpreter|SH2 Interpreter +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Save +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Save Information +Save List|Save List +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Save State +Save State As|Save State As +Save States|Save States +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|Screenshot +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Select a file to load your state +Select your iso/cue/bin file|Select your iso/cue/bin file +Set PC to Start Address|Set PC to Start Address +Settings|Settings +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|Sound +Sound Core|Sound Core +Spanish|Spanish +Start|Start +Start Address:|Start Address: +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Store +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|To File... +Tools|Tools +Track Inf Loop Results|Track Inf Loop Results +Transfer|Transfer +Translation|Translation +Type:|Type: +Unable to add code|Unable to add code +Unable to change description|Unable to change description +Unable to open file for loading|Unable to open file for loading +Unable to open file for saving|Unable to open file for saving +Unable to remove code|Unable to remove code +Unknow (%1)|Unknow (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Up +Upload|Upload +Use System Locale|Use System Locale +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Value +Value :|Value : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Core +Video Driver|Video Driver +Video Format|Video Format +View|View +Viewer|Viewer +Waiting Input...|Waiting Input... +Width|Width +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTI Driver +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Files (*.yct);;All Files (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Save State (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|toolBar diff --git a/win_template/trans/yabause_de.yts b/win_template/trans/yabause_de.yts new file mode 100644 index 0000000000..2c369ee039 --- /dev/null +++ b/win_template/trans/yabause_de.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Bilder (*.%2) +%1/%2 blocks free|%1/%2 Blöcke frei +&About...|&Über... +&Action Replay|&Action Replay +&Backup Manager...|&Speichermanager... +&Browse|&Suchen +&Cancel|&Abbrechen +&Capture Screen|&Bildschirm fotografieren +&Cheat List|&Cheatliste +&Cheats|&Cheats +&Cheats List...|&Cheatliste... +&Clear|&Löschen +&Close|&Schliessen +&Debug|&Debug +&Delete|&Löschen +&Emulation|&Emulation +&File|&Datei +&Frame Skip/Limiter|&Frames Überspringen/Limitieren +&Fullscreen|&Vollbild +&Help|&Hilfe +&Layer|&Schicht +&Load From File|&Von Datei laden +&Log|&Protokoll +&Master SH2|&Master SH2 +&Memory Transfer|&Speichertransfer +&OK|&OK +&Pause|&Pause +&Quit|&Schliessen +&Raw Memory Address|&Raw Speicheradresse +&Reset|&Zurücksetzen +&Save To File|&In Datei speichern +&Settings...|Einstellungen... +&Slave SH2|&Slave SH2 +&Tools|&Werkzeuge +&Transfer|&Transferieren +&View|&Ansicht +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 Blöcke frei +510/512 blocks free|510/512 Blöcke frei +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|WARNUNG:Mastercodes werden NICHT unterstützt. +About...|Über... +Action Replay Code :|Action Replay Code : +Add|Hinzufügen +Add Action Replay Code|Action Replay Code hinzufügen +Add Cheat|Cheat hinzufügen +Add Codes...|Codes hinzufügen... +Add Raw Memory Code|Raw Speicher Code hinzufügen +Address|Adresse +Address :|Adresse : +Advanced|Erweitert +Always|Immer +Are you sure you want to delete '%1' ?|Sind Sie sicher, dass Sie '%1' löschen möchten? +Are you sure you want to format '%1' ?|Sind Sie sicher, dass Sie '%1' formatieren möchten? +Asia (NTSC)|Asien (NTSC) +Asia (PAL)|Asien (PAL) +Auto-detect|Automatische Erkennung +Autostart|Autostart +Awaiting input for|Erwarte Eingabe für +Axis|Axis +Backtrace|Backtrace +Backup Ram Manager|Backup Ram Manager +Binary Files (*.bin)|Binary Files (*.bin) +Bios|Bios +Block Size :|Blockgröße : +Browse|Suchen +Byte|Byte +Byte Write|Byte schreiben +CD Images (*.iso *.cue *.bin)|CD Image (*.iso *.cue *.bin) +Cancel|Abbrechen +Cannot initialize|Initialisierung fehlgeschlagen +Cannot initialize Windows SPTI Driver|Windows SPTI Treiber kann nicht initialisiert werden +Cart/Memory|Cartridge/Speicher +Cartridge|Cartridge +Cd-Rom|CD-Rom +Central/South America (NTSC)|Zentral/Südamerika (NTSC) +Central/South America (PAL)|Zentral/Südamerika (PAL) +Cheat &Search...|Cheat &Suche +Cheat Search|Cheat Suche +Cheat Type|Cheattyp +Cheats|Cheats +Cheats File|Cheatdatei +Choose a binary file|Wähle eine Binärdatei +Choose a cartridge file|Choose a cartridge file +Choose a cdrom drive/mount point|CD-Rom Laufwerk/Mount-Punkt auswählen +Choose a cheat file to open|Cheatdatei zum Öffnen auswählen +Choose a cheat file to save to|Cheatdatei zum Speichern auswählen +Choose a file to save your state|Datei zum Speichern des Spielstandes auswählen +Choose a location for binary file|Wähle eine Position für die Binärdatei +Choose a location for your screenshot|Speicherort für das Bildschirmfoto auswählen +Choose a memory file|Wähle eine Speicherdatei +Choose a mpeg rom|Choose a mpeg rom +Clear configuration|Konfiguration löschen +Close|Schliessen +Code|Code +Code Breakpoints|Code Breakpoints +Comment :|Kommentar : +Common Control Registers|Common Control Registers +Compare Type|Vergleiche Typen +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Datengrösse +Data Size :|Datengrösse : +Data Type|Dateityp +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Löschen +Description|Beschreibung +Description :|Beschreibung : +Device List|Geräteliste +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|Deaktiviert +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Runter +Download|Herunterladen +Draw End|Draw End +Dummy CD Drive|Dummy CD-Rom Laufwerk +Dummy Input Interface|Dummy Eingabe Oberfläche +Dummy OSD Interface|Dummy OSD Oberfläche +Dummy Sound Interface|Dummy Audio Oberfläche +Dummy Video Interface|Dummy Video Oberfläche +Edit configuration|Einstellungen bearbeiten +Emu-Compatibility|Emu-Kompatibilität +Emulation|Emulation +Enable|Aktivieren +Enable Frame Skip/Limiter|Aktiviere Frame Überspringer/Limitierer +Enabled|Aktiviert +End Address:|Adressende: +English|Englisch +Enter New Value|Neuen Wert eingeben +Europe + others (PAL)|Europe + andere (PAL) +Exact|Entpacken +FPS|BPS +File|Datei +File Name :|Dateiname : +File transfer|Dateiübertragung +File:|Datei: +Format|Formatieren +Frame Skip/Limiter|Frames Überspringen/Limitieren +French|Französisch +From|Von +From File|Von Datei +From File...|Von Datei... +Fullscreen|Vollbild +Fullscreen Resolution|Vollbildauflösung +General|Allgemein +General Info|General Info +German|Deutsch +Glut OSD Interface|Glut OSD Oberfläche +Goto Address|Goto Address +Greater then|Größer als +Hard Reset|Harter Neustart +Height|Höhe +Hex value(s)|Hex value(s) +Hide Menubar|Verstecke Menüleiste +Hide Toolbar|Verstecke Werkzeugleiste +ISO-File Virtual Drive|ISO-Datei Virtuelles Laufwerk +Information...|Informationen... +Input|Eingabe +Invalid Address|Ungültige Adresse +Invalid Value|Ungültiger Wert +Italian|Italienisch +Japan (NTSC)|Japan (NTSC) +Japanese|Japanisch +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&ade Spielstand +Language :|Sprache : +Layer|Schicht +Left|Links +Left trigger|Linke Schultertaste +Less than|Weniger als +Linux CD Drive|Linux CD Laufwerk +Load|Laden +Load State|Spielstand laden +Load State As|Spielstand laden als +Load as executable|Als ausführbar laden +Local Coordinates|Local Coordinates +Log|Protokoll +Long|Long +Long Write|Langes Schreiben +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Speicher +Memory &Editor|Speicher&editierer +Memory Breakpoints|Memory Breakpoints +Memory Dump|Speicherabzug +Memory Editor|Speichereditierer +Memory Search|Memory Search +Memory Transfer|Speichertransfer +Memory dump|Speicherabzug +Middle|Middle +Mouse|Maus +Mouse Configuration|Mouse Configuration +Mpeg ROM|Mpeg ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Niemals +None|Keine +Normal Sprite|Normal Sprite +North America (NTSC)|Nordamerika (NTSC) +OSD Core|OSD Kern +Ok|OK +On fullscreen|Auf Vollbild +On message|Auf Nachricht +Open &CD Rom...|&CD-Rom öffnen... +Open &ISO...|&ISO öffnen +Open CD Rom|CD-Rom öffnen +OpenGL Video Interface|OpenGL Video Oberfläche +Options|Options +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Konfiguration +Pause|Pause +Press Esc key to cancel|Klicke ESC um abzubrechen +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Tastatureingabenoberfäche +Quit|Schliessen +R&un|S&tarten +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|Zurücksetzen +Resolution|Auflösung +Right|Rechts +Right trigger|Rechte Schultertaste +Run|Starten +S&ave State|Spielstand s&peichern +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Oberfläche +SDL Sound Interface|SDL Geräusch Oberfläche +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamischer Rekompilierer +SH2 Interpreter|SH2 Interpreter +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Speichern +Save As WAV|Als WAV speichern +Save Bitmap|Als Bitmap speichern +Save Information|Informationen speichern +Save List|Liste speichern +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Spielstand speichern +Save State As|Spielstand speichern als +Save States|Spielstände +Sc&reenshot|Bi&ldschirmfoto +Screen Enabled|Bildschirm eingeschaltet +Screenshot|Bildschirmfoto +Search|Suche +Search Criteria|Suchkriterien +Search Memory|Speichersuche +Search Value:|Suchwert: +Search/Add Cheats|Suche/Cheats hinzufügen +Select a file to load your state|Wählen Sie eine Datei zum Laden des Spielstandes aus +Select your iso/cue/bin file|Wählen Sie Ihre iso/cue/bin Datei +Set PC to Start Address|PC zur Startadresse setzen +Settings|Einstellungen +Shortcuts|Shortcuts +Show FPS|FPS anzeigen +Show Log Window|Show Log Window +Signed|Signiert +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Oberfläche +Software Video Interface|Software Video Oberfläche +Sound|Sound +Sound Core|Sound Kern +Spanish|Spanisch +Start|Start +Start Address:|Adressenanfang: +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Sichern +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|Zu +To File...|Zur Datei... +Tools|Werkzeuge +Track Inf Loop Results|Track Inf Loop Results +Transfer|Übertragen +Translation|Übersetzung +Type:|Type: +Unable to add code|Code konnte nicht hinzugefügt werden +Unable to change description|Beschreibung konnte nicht geändert werden +Unable to open file for loading|Datei konnte nicht zum Laden geöffnet werden +Unable to open file for saving|Datei konnte nicht zum Speichern geöffnet werden +Unable to remove code|Code konnte nicht entfernt werden +Unknow (%1)|Unbekannt (%1) +Unsigned|Unsigniert +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Hoch +Upload|Hochladen +Use System Locale|Use System Locale +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Wert +Value :|Wert : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Kern +Video Driver|Video Treiber +Video Format|Videoformat +View|Ansicht +Viewer|Viewer +Waiting Input...|Warte auf Eingabe... +Width|Breite +Window Resolution|Bildschirmauflösung +Windows SPTI Driver|Windows SPTI Treiber +Word|Word +Word Write|Word Schreiben +Write|Schreiben +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Dateien (*ycf);;Alle Dateien (*) +Yabause Qt GUI|Yabause Qt Grafikoberfäche +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Grafikoberfäche
Basierend auf Yabause %1
http://yabause.org
Das Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Speicherstände (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause ist nicht initialisiert, Backup Ram kann nicht verwaltet werden. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=de +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Werkzeugleiste diff --git a/win_template/trans/yabause_es.yts b/win_template/trans/yabause_es.yts new file mode 100644 index 0000000000..7386d2199a --- /dev/null +++ b/win_template/trans/yabause_es.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Imágenes (*.%2) +%1/%2 blocks free|%1/%2 bloques libres +&About...|&Acerca de... +&Action Replay|&Action Replay +&Backup Manager...|Gestor de memoria de &backup... +&Browse|&Examinar +&Cancel|&Cancelar +&Capture Screen|&Capturar pantalla +&Cheat List|Listado de &Trucos +&Cheats|&Trucos +&Cheats List...|Lista de tru&cos... +&Clear|&Limpiar +&Close|&Cerrar +&Debug|&Depurar +&Delete|&Borrar +&Emulation|&Emulación +&File|&Archivo +&Frame Skip/Limiter|&Limitador/esquivador de cuadros +&Fullscreen|&Pantalla completa +&Help|&Ayuda +&Layer|&Capa +&Load From File|&Cargar desde archivo +&Log|&Registro +&Master SH2|SH2 &Maestro +&Memory Transfer|Transferir &memoria +&OK|&Aceptar +&Pause|&Pausar +&Quit|&Salir +&Raw Memory Address|&Dirección de memoria Raw +&Reset|&Resetear +&Save To File|&Guardar a archivo +&Settings...|&Configuración... +&Slave SH2|SH2 E&sclavo +&Tools|Herramien&tas +&Transfer|&Transferir +&View|&Ver +16 Mbit Backup Ram|RAM de respaldo de 16 Mbit +16 Mbit ROM|ROM de 16 Mbit +16-bit|16-bit +16-bit Relative value(s)|Valor(es) relativo(s) a 16-bit +32 Mbit Backup Ram|RAM de respaldo de 32 Mbit +32 Mbit Dram|Dram de 32 Mbit +32-bit|32-bit +3D Control Pad|Controlador Analógico 3D +4 Mbit Backup Ram|RAM de respaldo de 4 Mbit +503/512 blocks free|503/512 bloques libres +510/512 blocks free|510/512 bloques libres +8 Mbit Backup Ram|RAM de respaldo de 8 Mbit +8 Mbit Dram|Dram de 8 Mbit +8-bit|8-bit +8-bit Relative value(s)|Valor(es) relativo(s) a 8-bit +WARNING: Master Codes are NOT supported.|AVISO: Códigos Maestros NO soportados. +About...|Acerca de... +Action Replay Code :|Código de Action Replay +Add|Añadir +Add Action Replay Code|Añadir Código de Action Replay +Add Cheat|Añadir Truco +Add Codes...|Añadir Códigos... +Add Raw Memory Code|Añadir código dirección de memoria +Address|Dirección +Address :|Dirección : +Advanced|Avanzado +Always|Siempre +Are you sure you want to delete '%1' ?|¿Estás seguro de borrar '%1' ? +Are you sure you want to format '%1' ?|¿Estás seguro de formatear '%1' ? +Asia (NTSC)|Asia (NTSC) +Asia (PAL)|Asia (PAL) +Auto-detect|Auto-detectar +Autostart|Iniciar automáticamente +Awaiting input for|Esperando entrada para +Axis|Eje +Backtrace|Registro de funciones llamadas +Backup Ram Manager|Gestor de RAM de backup +Binary Files (*.bin)|Archivos binarios (*.bin) +Bios|Bios +Block Size :|Tamaño de bloque: +Browse|Examinar +Byte|Byte +Byte Write|Escritura de byte +CD Images (*.iso *.cue *.bin)|Imágenes de CD (*.iso *.cue *.bin) +Cancel|Cancelar +Cannot initialize|Imposible iniciar +Cannot initialize Windows SPTI Driver|No se pudo inicializar el Driver SPTI de Windows +Cart/Memory|Cartucho/Memoria +Cartridge|Cartucho +Cd-Rom|Unidad de CD-Rom +Central/South America (NTSC)|América Central y Sudamérica (NTSC) +Central/South America (PAL)|América Central y Sudamérica (PAL) +Cheat &Search...|Bú&squeda de trucos... +Cheat Search|Búsqueda de trucos... +Cheat Type|Tipo de truco +Cheats|Trucos +Cheats File|Archivo de trucos +Choose a binary file|Seleccione un archivo binario +Choose a cartridge file|Seleccione un archivo de cartucho +Choose a cdrom drive/mount point|Seleccione una unidad de cdrom/punto de montaje +Choose a cheat file to open|Seleccione un archivo de trucos para abrir +Choose a cheat file to save to|Seleccione el archivo de trucos para guardar +Choose a file to save your state|Seleccione un archivo para guardar tu estado +Choose a location for binary file|Seleccione ubicación para el archivo binario +Choose a location for your screenshot|Seleccione ubicación para tu captura +Choose a memory file|Seleccione un archivo de memoria +Choose a mpeg rom|Seleccione un rom mpeg +Clear configuration|Limpiar configuración +Close|Cerrar +Code|Código +Code Breakpoints|Puntos de detención de código +Comment :|Comentario : +Common Control Registers|Registros comúnes de control +Compare Type|Tipo de comparación +DSP Control Registers|Registros de control del DSP +DSP Registers|Registros del DSP +Data Size|Tamaño del dato +Data Size :|Tamaño de datos : +Data Type|Tipo de Dato +Debug CPU|Depurar CPU +Debug M68K|Depurar M68K +Debug Master SH2|Depurar SH2 Maestro +Debug SCU DSP|Depurar SCU DSP +Debug Slave SH2|Depurar SH2 Esclavo +Debug VDP1|Depurar VDP1 +Debug VDP2Viewer|Depurar Visualizador VDP2 +Del|Eliminar +Delete|Eliminar +Description|Descripción +Description :|Descripción : +Device List|Lista de Dispositivos +DirectX Input Interface|Interfaz de entrada de DirectX +DirectX Sound Interface|Interfaz de Sonido de DirectX +Disabled|Desactivado +Disassembled Code|Código desensamblado +Display Enabled|Video habilitado +Display on Hover|Habilitar video al pasar por encima +Down|Abajo +Download|Descargar +Draw End|Fin del dibujado +Dummy CD Drive|Unidad de CD falsa +Dummy Input Interface|Interfaz de entrada falsa +Dummy OSD Interface|Interfaz OSD falsa +Dummy Sound Interface|Interfaz de sonido falsa +Dummy Video Interface|Interfaz de video falsa +Edit configuration|Editar configuración +Emu-Compatibility|Compatibilidad del emulador +Emulation|Emulación +Enable|Activar +Enable Frame Skip/Limiter|Habilitar limitación/esquivado de cuadros +Enabled|Activado +End Address:|Dirección final: +English|Inglés +Enter New Value|Ingrese el nuevo valor +Europe + others (PAL)|Europa + otros (PAL) +Exact|Exacto +FPS|Cuadros por Segundo +File|Archivo +File Name :|Nombre de archivo : +File transfer|Transferencia de archivo +File:|Archivo: +Format|Formato +Frame Skip/Limiter|Limitador/esquivador de cuadros +French|Francés +From|De +From File|De archivo +From File...|De archivo... +Fullscreen|Pantalla completa +Fullscreen Resolution|Resolución de pantalla completa +General|General +General Info|Información general +German|Alemán +Glut OSD Interface|Interface OSD Glut +Goto Address|Ir a dirección +Greater then|Mayor a +Hard Reset|Reiniciar en frío +Height|Altura +Hex value(s)|Valor(es) Hexadecimal(es) +Hide Menubar|Esconder barra de menú +Hide Toolbar|Esconder barra de herramientas +ISO-File Virtual Drive|Archivo ISO de Unidad Virtual +Information...|Información... +Input|Entrada +Invalid Address|Dirección inválida +Invalid Value|Valor inválido +Italian|Italiano +Japan (NTSC)|Japón (NTSC) +Japanese|Japonés +Japanese Modem|Modem japonés +Korea (NTSC)|Korea (NTSC) +L&oad State|Cargar Estad&o +Language :|Idioma : +Layer|Capa +Left|Izquierda +Left trigger|Gatillo izquierdo +Less than|Menor a +Linux CD Drive|Unidad Linux de CD +Load|Cargar +Load State|Cargar estado +Load State As|Cargar estado como +Load as executable|Cargar como ejecutable +Local Coordinates|Coordenadas locales +Log|Registro +Long|Long +Long Write|Escribir LONG +Loop Track Clear|Limpiar repetición de pista +Loop Track Start|Comenzar repetición de pista +M68K|M68K +M68K Registers|Registros del M68K +MSH2|MSH2 +Master SH2|SH2 Maestro +Memory|Memoria +Memory &Editor|&Editor de memoria +Memory Breakpoints|Puntos de detención de memoria +Memory Dump|Volcado de memoria +Memory Editor|Editor de memoria +Memory Search|Búsqueda en memoria +Memory Transfer|Transferir memoria +Memory dump|Volcado de memoria +Middle|Medio +Mouse|Ratón +Mouse Configuration|Configuración del Ratón +Mpeg ROM|ROM Mpeg +NBG0|NBG0 +NBG0/RBG1 Info|Información de NBG0/RBG1 +NBG1|NBG1 +NBG1 Info|Información de NBG1 +NBG2|NBG2 +NBG2 Info|Información de NBG2 +NBG3|NBG3 +NBG3 Info|Información de NBG3 +Netlink|Netlink +Never|Nunca +None|Ninguno +Normal Sprite|Sprite normal +North America (NTSC)|América del Norte (NTSC) +OSD Core|OSD básico +Ok|Aceptar +On fullscreen|En pantalla completa +On message|En mensaje +Open &CD Rom...|Abrir unidad de &CD Rom +Open &ISO...|Abrir &ISO... +Open CD Rom|Abrir CD Rom +OpenGL Video Interface|Interfaz de video OpenGL +Options|Opciones +Other Debug|Otra depuración +Pad|Mando +Pad Configuration|Configuración del mando +Pause|Pausar +Press Esc key to cancel|Presione la tecla ESC para cancelar +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Interfaz de entrada de teclado Qt +Quit|Salir +R&un|E&jecutar +RBG0|RBG0 +RBG0 Info|Información de RBG0 +Read|Leer +Region|Región +Registers|Registros +Reset|Resetear +Resolution|Resolución +Right|Derecha +Right trigger|Gatillo derecho +Run|Ejecutar +S&ave State|Gu&ardar estado +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|Interfaz de Joystick SDL +SDL Sound Interface|Interfaz de sonido SDL +SH2 Debugger Interpreter|Intérprete Debugger SH2 +SH2 Dynamic Recompiler|Recompilador dinámico SH2 +SH2 Interpreter|Intérprete SH2 +SH2 Registers|Registros del SH2 +SSH2|SSH2 +Save|Guardar +Save As WAV|Guardar como WAV +Save Bitmap|Guardar mapa de bits +Save Information|Guardar información +Save List|Lista de salvaguardados +Save MD0|Guardar MD0 +Save MD1|Guardar MD1 +Save MD2|Guardar MD2 +Save MD3|Guardar MD3 +Save Program|Guardar programa +Save Selected|Guardar seleccionado +Save Slot Registers|Guardar Registros de ranuras +Save State|Guardar Estado +Save State As|Guardar estado como +Save States|Guardar estados +Sc&reenshot|Captu&rar pantalla +Screen Enabled|Pantalla habilitada +Screenshot|Captura de pantalla +Search|Buscar +Search Criteria|Criterio de búsqueda +Search Memory|Buscar en memoria +Search Value:|Valor a buscar: +Search/Add Cheats|Buscar/Agregar trucos +Select a file to load your state|Selecciona el archivo para cargar tu estado +Select your iso/cue/bin file|Selecciona tu archivo iso/cue/bin +Set PC to Start Address|Establecer PC a posición de inicio +Settings|Configuración +Shortcuts|Atajos +Show FPS|Mostrar cuadros por segundo +Show Log Window|Mostrar ventana de registro +Signed|Con signo +Signed 16-bit value|Valor de 16-bit con signo +Signed 32-bit value|Valor de 32-bit con signo +Signed 8-bit value|Valor de 8-bit con signo +Slave SH2|SH2 Esclavo +Slot Info|Información de ranura +Slot Number:|Número de ranura: +Software OSD Interface|Interface OSD software +Software Video Interface|Interface de video software +Sound|Sonido +Sound Core|Núcleo de sonido +Spanish|Español +Start|Iniciar +Start Address:|Dirección inicial: +Start in Fullscreen|Comenzar a pantalla completa +Status|Estado +Step Into|Paso dentro +Step Out|Paso sobre +Step Over|Paso fuera +Store|Almacenar +Synchronize Saturn internal clock with set time|Sincronizar reloj interno de la Saturn con hora local +System Clipping Coordinates|Coordenadas de recorte del sistema +Text|Texto +Texture|Textura +To|Para +To File...|A archivo... +Tools|Herramientas +Track Inf Loop Results|Resultado del Seguimiento de Bucles Infinitos +Transfer|Transferencia +Translation|Traducción +Type:|Tipo: +Unable to add code|Imposible añadir código +Unable to change description|Imposible cambiar descripción +Unable to open file for loading|Imposible abrir archivo para cargar +Unable to open file for saving|Imposible abrir archivo para guardar +Unable to remove code|Imposible eliminar código +Unknow (%1)|Desconocido (%1) +Unsigned|Sin signo +Unsigned 16-bit value|Valor de 16-bit sin signo +Unsigned 32-bit value|Valor de 32-bit sin signo +Unsigned 8-bit value|Valor de 8-bit sin signo +Up|Arriba +Upload|Subir +Use System Locale|Usar Configuración Regional del Sistema +VDP1|Vdp1 +VDP1 Command Info|Información de comandos del VDP1 +VDP1 Command List|Listado de comandos del VDP1 +VDP2|Vdp2 +Value|Valor +Value :|Valor : +Value:|Valor: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Vídeo +Video Core|Núcleo de Vídeo +Video Driver|Driver de Vídeo +Video Format|Formato de Vídeo +View|Ver +Viewer|Visor +Waiting Input...|Esperando Entrada de Datos... +Width|Ancho +Window Resolution|Resolución de ventana +Windows SPTI Driver|Driver SPTI para Windows +Word|Palabra(word) +Word Write|Escribir WORD +Write|Escribir +Yabause Cheat Files (*.yct);;All Files (*)|Archivos de trucos para Yabause (*.yct);;Todos los archivos (*) +Yabause Qt GUI|Interfaz gráfica Qt +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Basada en Yabause %1
http://yabause.org
El Equipo Yabause
Filipe AZEVEDO +Yabause Save State (*.yss)|Salvaguardados de Yabause (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause no está inicializado. No se puede gestionar el editor de la memoria de backup. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Barra de herramientas diff --git a/win_template/trans/yabause_fr.yts b/win_template/trans/yabause_fr.yts new file mode 100644 index 0000000000..ac2f9906a6 --- /dev/null +++ b/win_template/trans/yabause_fr.yts @@ -0,0 +1,384 @@ +%1 Images (*.%2)|Images %1 (*.%2) +%1/%2 blocks free|%1/%2 blocs libres +&About...|&A Propos De... +&Action Replay|&Action Replay +&Backup Manager...|&Gestion des Sauvegardes... +&Browse|&Parcourir +&Cancel|&Annuler +&Capture Screen|&Capture d'Ecran +&Cheat List|Liste de &Cheats +&Cheats|&Cheats +&Cheats List...|Liste de &Cheats... +&Clear|&Effacer +&Close|&Fermer +&Debug|&Débug +&Delete|&Effacer +&Emulation|&Emulation +&File|&Fichier +&Frame Skip/Limiter|&Saut d'Image/Limitateur +&Fullscreen|&Plein Ecran +&Help|&Aide +&Layer|&Couche +&Load From File|&Charger à Partir d'un Fichier +&Log|&Journal +&Master SH2|SH2 &Maître +&Memory Transfer|&Transfert de Mémoire +&OK|&OK +&Pause|&Pause +&Quit|&Quitter +&Raw Memory Address|Adresse Mémoire &Brut +&Reset|&Redémarrer +&Save To File|&Sauvegarder Vers le Fichier +&Settings...|&Paramètres... +&Slave SH2|SH2 E&sclave +&Tools|Ou&tils +&Transfer|&Transfert +&View|&Visualiser +16 Mbit Backup Ram|Sauvegarde RAM 16 Mbit +16 Mbit ROM|ROM 16 Mbit +16-bit|16-bit +16-bit Relative value(s)|Valeur(s) Relatives 16-bit +32 Mbit Backup Ram|Sauvegarde RAM 32 Mbit +32 Mbit Dram|Dram 32 Mbit +32-bit|32-bit +3D Control Pad|Manette 3D +4 Mbit Backup Ram|Sauvegarde RAM 4 Mbit +503/512 blocks free|503/512 blocs libres +510/512 blocks free|510/512 blocs libres +8 Mbit Backup Ram|Sauvegarde RAM 8 Mbit +8 Mbit Dram|Dram 8 Mbit +8-bit|8-bit +8-bit Relative value(s)|Valeurs Relatives 8-bit +WARNING: Master Codes are NOT supported.|Attention : Les Codes Maîtres NE SONT PAS supportés. +About...|À Propos De... +Action Replay Code :|Code Action Replay : +Add|Ajouter +Add Action Replay Code|Ajouter un Code Action Replay +Add Cheat|Ajouter un Cheat +Add Codes...|Ajouter des Codes... +Add Raw Memory Code|Ajouter un Code Mémoire Brut +Address|Adresse +Address :|Adresse : +Advanced|Avancé +Always|Toujours +Are you sure you want to delete '%1' ?|Etes vous sûr de vouloir supprimer '%1' ? +Are you sure you want to format '%1' ?|Etes vous sûr de vouloir formater '%1' ? +Asia (NTSC)|Asie (NTSC) +Asia (PAL)|Asie (PAL) +Auto-detect|Détection Auto +Autostart|Démarrage Automatique +Awaiting input for|Attente de l'entrée pour +Axis|Axes +Backtrace|Traceur +Backup Ram Manager|Gestion des Sauvegardes +Binary Files (*.bin)|Fichiers Binaires (*.bin) +Bios|Bios : +Block Size :|Taille du Bloc : +Browse|Parcourir +Byte|Byte +Byte Write|Ecrire un Byte +CD Images (*.iso *.cue *.bin)|Images CD (*.iso *.cue *.bin) +Cancel|Annuler +Cannot initialize|Ne peut pas Initialiser +Cannot initialize Windows SPTI Driver|Ne peut pas initialiser le pilote SPTI +Cart/Memory|Cartouche/Mémoire +Cartridge|Cartouche : +Cd-Rom|CD-Rom : +Central/South America (NTSC)|Amérique du Sud/Centrale (NTSC) +Central/South America (PAL)|Amérique du Sud/Centrale (PAL) +Cheat &Search...|&Rechercher un Cheat... +Cheat Search|Rechercher un Cheat +Cheat Type|Type de Cheat +Cheats|Cheats +Cheats File|Fichier Cheat +Choose a binary file|Choisir un Fichier Binaire +Choose a cartridge file|Choisir un Fichier Cartouche +Choose a cdrom drive/mount point|Choisir un lecteur CD ou un point de montage +Choose a cheat file to open|Choisir un fichier de Cheat à ouvrir +Choose a cheat file to save to|Choisir un fichier de Cheat à enregistrer +Choose a file to save your state|Choisir un fichier où enregistrer l'état +Choose a location for binary file|Choisir le Chemin du Fichier Binaire +Choose a location for your screenshot|Choisir un nom de fichier pour votre capture d'écran +Choose a memory file|Choisir un Fichier Mémoire +Choose a mpeg rom|Choisir une Rom MPEG +Clear configuration|Vider la Configuration +Close|Fermer +Code|Code +Code Breakpoints|Interruptions du Code +Comment :|Commentaire : +Common Control Registers|Registres de Contrôle Commun +Compare Type|Type de Comparaison +CPU Tesseration|Tesselation CPU +GPU Tesseration|Tesselation GPU +DSP Control Registers|Registres de Contrôle DSP +DSP Registers|Registres DSP +Data Size|Taille Donnée +Data Size :|Taille des Données : +Data Type|Type Donnée +Debug CPU|Débug CPU +Debug M68K|Débug M68K +Debug Master SH2|Débug Master SH2 +Debug SCU DSP|Débug SCU DSP +Debug Slave SH2|Débug SH2 Esclave +Debug VDP1|Débug VDP1 +Debug VDP2Viewer|Débug VDP2Viewer +Del|Effacer +Delete|Effacer +Description|Description +Description :|Description : +Device List|Liste des Périphériques +DirectX Input Interface|Interface DirectX Input +DirectX Sound Interface|Interface DirectX Sound +Disabled|Désactivé +Disassembled Code|Code Désassemblé +Display Enabled|Affichage Activé +Display on Hover|Afficher en Passant le Curseur +Down|Bas +Download|Télécharger +Draw End|Fin Dessin +Dummy CD Drive|Lecteur de CD Factice +Dummy Input Interface|Interface Contrôleur Factice +Dummy OSD Interface|Interface OSD Factice +Dummy Sound Interface|Interface Son Factice +Dummy Video Interface|Interface Vidéo Factice +Edit configuration|Editer la Configuration +Emu-Compatibility|Emu-Compatibilité +Emulation|Emulation +Enable|Activer +Enable Frame Skip/Limiter|Active le Saut d'Image/Limitateur +Enabled|Activé +End Address:|Adresse de Fin : +English|Anglais +Enter New Value|Entrer une Nouvelle Valeur +Europe + others (PAL)|Europe + Autres (PAL) +Exact|Identique +FPS|FPS +File|Fichier +File Name :|Nom du Fichier : +File transfer|Transfert de Fichier +File:|Fichier : +Filter mode|Mode Filtre +Fit to window|Correspond à la Fenêtre +Fixed aspect ratio: 4:3|Correction des Propotions : 4:3 +Fixed aspect ratio: 16:9|Correction des Propotions : 16:9 +Format|Formater +Frame Skip/Limiter|Saut d'Image/Limitateur +French|Français +From|A Partir De +From File|A Partir d'un Fichier +From File...|A Partir d'un Fichier... +Fullscreen|Plein Ecran +Fullscreen Resolution|Résolution en Plein Ecran +General|Général +General Info|Info Général +German|Allemand +Glut OSD Interface|Interface OSD GLut +Goto Address|Va sur l'Adresse +Greater then|Plus grand que +Gun/Mouse Sensitivity|Sensibilité de la Souris/Pistolet +Hard Reset|Redémarrage Matériel +Height|Hauteur : +Hex value(s)|Valeur(s) Héx +Hide Menubar|Cacher la Barre de Menu +Hide Toolbar|Cacher la Barre d'Outil +ISO-File Virtual Drive|Lecteur de Fichier ISO Virtuel +Information...|Information... +Input|Contrôleur +Invalid Address|Adresse Invalide +Invalid Value|Valeur Invalide +Italian|Italien +Japan (NTSC)|Japon (NTSC) +Japanese|Japonais +Japanese Modem|Modem Japonais +Korea (NTSC)|Corée (NTSC) +L&oad State|&Charger un Etat +Language :|Langage : +Layer|Couche +Left|Gauche +Left trigger|Gâchette Gauche +Less than|Moins que +Linux CD Drive|Lecteur CD Linux +Load|Charger +Load State|Charger l'Etat +Load State As|Charger l'Etat sous +Load as executable|Charger en tant qu'Executable +Local Coordinates|Coordonnées Locals +Log|Journal +Long|Long +Long Write|Ecrire un Long +Loop Track Clear|Vider Piste en Boucle +Loop Track Start|Démarrer Piste en Boucle +M68K|M68K +M68K Registers|Registres M68K +MSH2|MSH2 +Master SH2|SH2 Maître +Memory|Mémoire : +Memory &Editor|&Editeur de Mémoire +Memory Breakpoints|Interruptions Mémoire +Memory Dump|Copier la Mémoire +Memory Editor|Editeur de Mémoire +Memory Search|Rechercher dans la Mémoire +Memory Transfer|Transfert de Mémoire +Memory dump|Copier la Mémoire +Middle|Moyen +Mouse|Souris +Mouse Configuration|Configuration de la Souris +Mpeg ROM|ROM MPEG : +NBG0|NBG0 +NBG0/RBG1 Info|Info NBG0/RBG1 +NBG1|NBG1 +NBG1 Info|Info NBG1 +NBG2|NBG2 +NBG2 Info|Info NBG2 +NBG3|NBG3 +NBG3 Info|Info NBG3 +Netlink|Réseau +Never|Jamais +None|Aucun +None|Aucun +Normal Sprite|Sprite Normal +North America (NTSC)|Amérique du Nord (NTSC) +OSD Core|Noyau OSD +Ok|Ok +On fullscreen|Plein Ecran +On message|Sur le Message +Open &CD Rom...|Ouvrir un &CD Rom... +Open &ISO...|Ouvrir un &ISO... +Open CD Rom|Ouvrir un CD ROM +OpenGL Video Interface|Interface Vidéo OpenGL +Options|Options +Other Debug|Autre Débug +Pad|Manette +Pad Configuration|Configuration de la Manette +Pause|Pause +Polygon Generation|Génération des Polygones +Press Esc key to cancel|Pressez Echap pour Annuler +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Interface Qt du Clavier +Quit|Quitter +R&un|L&ancer +RBG0|RGB0 +RBG0 Info|Info RBG0 +Read|Ecrire +Region|Région : +Registers|Registres +Reset|Redémarrer +Resolution|Résolution : +Right|Droite +Right trigger|Gâchette Droite +Run|Lancer +S&ave State|S&auvegarder un Etat +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|Interface SDL du Joystick +SDL Sound Interface|Interface SDL du Son +SH2 Debugger Interpreter|Interpréteur de Débugeur SH2 +SH2 Dynamic Recompiler|Recompileur Dynamique SH2 +SH2 Interpreter|Interpréteur SH2 : +SH2 Registers|Registres SH2 +SSH2|SSH2 +Save|Sauvegarder +Save As WAV|Sauvegarder en WAV +Save Bitmap|Sauvegarder en Bitmap +Save Information|Informations sur la Sauvegarde +Save List|Liste des Sauvegardes +Save MD0|Sauvegarde MD0 +Save MD1|Sauvegarde MD1 +Save MD2|Sauvegarde MD2 +Save MD3|Sauvegarde MD3 +Save Program|Sauvegarde Programme +Save Selected|Sauvegarde Sélectionné +Save Slot Registers|Sauvegarder Emplacement Registres +Save State|Sauvegarder l'Etat +Save State As|Sauvegarder l'Etat sous +Save States|Sauvegarde d'Etat : +Sc&reenshot|Copie d'Ec&ran +Screen Enabled|Ecran Activé +Screenshot|Capture d'Ecran +Search|Rechercher +Search Criteria|Critère de Recherche +Search Memory|Rechercher dans la Mémoire +Search Value:|Rechercher une Valeur : +Search/Add Cheats|Rechercher/Ajouter un Cheat +Select a file to load your state|Choisissez un fichier pour charger l'état +Select your iso/cue/bin file|Choisissez votre fichier iso/cue/bin +Set PC to Start Address|Sélection PC vers l'Adresse de Démarrage +Settings|Paramètres +Shortcuts|Raccourcis +Show FPS|Afficher les FPS +Show Log Window|Afficher la Fenêtre Journal +Signed|Signé +Signed 16-bit value|Valeur Signé 16-bit +Signed 32-bit value|Valeur Signé 32-bit +Signed 8-bit value|Valeur Signé 8-bit +Slave SH2|SH2 Esclave +Slot Info|Info Emplacement +Slot Number:|Numéro d'Emplacement : +Software OSD Interface|Interface OSD Logiciel +Software Video Interface|Interface Vidéo Logiciel +Sound|Son +Sound Core|Noyau Son : +Spanish|Espagnol +Start|Démarrer +Start Address:|Adresse de Début : +Start in Fullscreen|Lancer en Plein Ecran +Status|Statut +Step Into|Entrer Dans +Step Out|Sortir +Step Over|Sauter +Store|Stocker +Synchronize Saturn internal clock with set time|Synchroniser l'Horloge Interne de la Saturn avec l'Heure +System Clipping Coordinates|Coordonnées Clippind Système +Text|Texte +Texture|Texture +To|Vers +To File...|Vers un Fichier... +Tools|Outils +Track Inf Loop Results|Résultats In Piste en Boucle +Transfer|Transfert +Translation|Traduction : +Triangles usin perspectiove correction|Triangles utilisant la correction de perspective +Type:|Type : +Unable to add code|Ne peut pas ajouter de Code +Unable to change description|Ne peut pas changer la Description +Unable to open file for loading|Ne peut pas ouvrir le fichier à Charger +Unable to open file for saving|Ne peut pas ouvrir le fichier à Sauvegarder +Unable to remove code|Ne peut pas enlever le Code +Unknow (%1)|Inconnu (%1) +Unsigned|Non Signé +Unsigned 16-bit value|Valeur Non Signé 16-bit +Unsigned 32-bit value|Valeur Non Signé 32-bit +Unsigned 8-bit value|Valeur Non Signé 8-bit +Up|Haut +Upload|Upload +Use System Locale|Utiliser les paramètres régionaux +VDP1|VDP1 +VDP1 Command Info|Info Commande VDP1 +VDP1 Command List|Liste Commande VDP1 +VDP2|VDP2 +Value|Valeur +Value :|Valeur : +Value:|Valeur : +Vdp1|VDP1 +Vdp2|VDP2 +Video|Vidéo +Video Core|Noyau Vidéo : +Video Driver|Pilote Vidéo : +Video Format|Format Vidéo : +View|Visualiser +Viewer|Visualiseur +Waiting Input...|En Attente du Contrôleur +Width|Largeur : +Window Resolution|Résolution Fenêtrée +Windows SPTI Driver|Pilote Windows SPTI +Word|Word +Word Write|Ecrire un Word +Write|Ecrire +Yabause Cheat Files (*.yct);;All Files (*)|Fichiers de Cheat Yabause (*ycf);;Tous les Fichiers (*) +Yabause Qt GUI|Interface Graphique Qt pour Yabause +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Basé sur Yabause %1 :
http://yabause.org
L'équipe de Yabause :
Filipe AZEVEDO +Yabause Save State (*.yss)|Sauvegarde d'État Yabause (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause n'est pas initialisé. Ne peut pas gérer la sauvegarde. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=fr +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Barre d'Outils diff --git a/win_template/trans/yabause_it.yts b/win_template/trans/yabause_it.yts new file mode 100644 index 0000000000..5c7b9a745f --- /dev/null +++ b/win_template/trans/yabause_it.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Immagini (*.%2) +%1/%2 blocks free|%1/%2 blocchi liberi +&About...|&Informazioni... +&Action Replay|&Action Replay +&Backup Manager...|&Backup Manager... +&Browse|&Sfoglia +&Cancel|&Annulla +&Capture Screen|&Cattura Schermata +&Cheat List|&Lista Trucchi +&Cheats|&Trucchi +&Cheats List...|&Lista Trucchi... +&Clear|&Svuota +&Close|&Chiudi +&Debug|&Debug +&Delete|&Elimina +&Emulation|&Emulazione +&File|&File +&Frame Skip/Limiter|&Limita/Salta Frame +&Fullscreen|&Schermo Intero +&Help|&Aiuto +&Layer|&Layer +&Load From File|&Carica da File +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Trasferimento Memoria +&OK|&OK +&Pause|&Pausa +&Quit|&Esci +&Raw Memory Address|&Raw Memory Address +&Reset|&Resetta +&Save To File|&Salva su File +&Settings...|&Impostazioni... +&Slave SH2|&Slave SH2 +&Tools|&Strumenti +&Transfer|&Transfer +&View|&Visualizza +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 blocchi liberi +510/512 blocks free|510/512 blocchi liberi +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|ATTENZIONE: I Codici Master NON sono supportati. +About...|Informazioni... +Action Replay Code :|Codice Action Replay +Add|Aggiungi +Add Action Replay Code|Aggiungi codice Action Replay +Add Cheat|Aggiungi Trucco +Add Codes...|Aggiungi Codici.... +Add Raw Memory Code|Aggiungi Raw Memory Code +Address|Indirizzo +Address :|Indirizzo: +Advanced|Avanzate +Always|Always +Are you sure you want to delete '%1' ?|Sicuro di voler cancellare '%1'? +Are you sure you want to format '%1' ?|Sicuro di voler formattare '%1'? +Asia (NTSC)|Asia (NTSC) +Asia (PAL)|Asia (PAL) +Auto-detect|Auto-detect +Autostart|Autostart +Awaiting input for|Awaiting input for +Axis|Axis +Backtrace|Backtrace +Backup Ram Manager|Gestione Backup RAM +Binary Files (*.bin)|Binary Files (*.bin) +Bios|BIOS +Block Size :|Dimensioni Blocco: +Browse|Sfoglia +Byte|Byte +Byte Write|Scrivi Byte +CD Images (*.iso *.cue *.bin)|Immagine CD (*.iso *.cue *.bin) +Cancel|Annulla +Cannot initialize|Impossibile Inizializzare +Cannot initialize Windows SPTI Driver|Impossibile inizializzare il Driver Windows SPTI +Cart/Memory|Cart/Memoria +Cartridge|Cartuccia +Cd-Rom|Cd-Rom +Central/South America (NTSC)|Central/South America (NTSC) +Central/South America (PAL)|Central/South America (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|Cheat Search +Cheat Type|Tipo di Trucco +Cheats|Trucchi +Cheats File|File Cheats +Choose a binary file|Choose a binary file +Choose a cartridge file|Choose a cartridge file +Choose a cdrom drive/mount point|Choose a cdrom drive/mount point +Choose a cheat file to open|Selezionare un file cheat da aprire +Choose a cheat file to save to|Selezionare un file cheat per salvare +Choose a file to save your state|Selezionare un file per salvare lo stato +Choose a location for binary file|Choose a location for binary file +Choose a location for your screenshot|Selezionare una directory per gli screenshoot +Choose a memory file|Choose a memory file +Choose a mpeg rom|Choose a mpeg rom +Clear configuration|Clear configuration +Close|Chiudi +Code|Codice +Code Breakpoints|Code Breakpoints +Comment :|Commento: +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Data Size +Data Size :|Dimensioni Dati: +Data Type|Data Type +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Elimina +Description|Descrizione +Description :|Descrizione: +Device List|Lista periferiche +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|Disattivo +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Giù +Download|Download +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Edit configuration +Emu-Compatibility|Compatibilità Emulatore +Emulation|Emulazione +Enable|Abilita +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Abilitato +End Address:|Indirizzo Finale: +English|Inglese +Enter New Value|Enter New Value +Europe + others (PAL)|Europe + others (PAL) +Exact|Exact +FPS|FPS +File|File +File Name :|Nome file: +File transfer|Trasferimento file +File:|File: +Format|Formato +Frame Skip/Limiter|Limitatore frame +French|Francese +From|Da +From File|Dal file +From File...|Dal file... +Fullscreen|Schermo Intero +Fullscreen Resolution|Fullscreen Resolution +General|Generale +General Info|General Info +German|Tedesco +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|Hard Reset +Height|Altezza +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Input +Invalid Address|Indirizzo non valido +Invalid Value|Valore non valido +Italian|Italiano +Japan (NTSC)|Japan (NTSC) +Japanese|Giapponese +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&oad State +Language :|Lingua: +Layer|Layer +Left|Sinistra +Left trigger|Left trigger +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Carica +Load State|Carica stato +Load State As|Carica stato come +Load as executable|Carica come eseguibile +Local Coordinates|Local Coordinates +Log|Log +Long|Long +Long Write|Scrivi Log +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Memoria +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Dump Memoria +Memory Editor|Editor Memoria +Memory Search|Memory Search +Memory Transfer|Trasferimento Memoria +Memory dump|Dump Memoria +Middle|Middle +Mouse|Mouse +Mouse Configuration|Mouse Configuration +Mpeg ROM|Mpeg ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|Nessuno +Normal Sprite|Normal Sprite +North America (NTSC)|North America (NTSC) +OSD Core|OSD Core +Ok|Ok +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|Apri CD Rom +OpenGL Video Interface|OpenGL Video Interface +Options|Options +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Configuration +Pause|Pausa +Press Esc key to cancel|Press Esc key to cancel +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Keyboard Input Interface +Quit|Esci +R&un|Eseg&ui +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Regione +Registers|Registers +Reset|Reset +Resolution|Risoluzione +Right|Destra +Right trigger|Right trigger +Run|Esegui +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Interface +SDL Sound Interface|SDL Sound Interface +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamic Recompiler +SH2 Interpreter|Interprete SH2 +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Salva +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Salva Informazioni +Save List|Salva lista +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Salva stato +Save State As|Salva stato come +Save States|Salva stati +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|Screenshot +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Selezionare un file per caricare il tuo stato +Select your iso/cue/bin file|Selezionare un file iso/cue/bin +Set PC to Start Address|Set PC to Start Address +Settings|Impostazioni +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|Suono +Sound Core|Sistema Audio +Spanish|Spagnolo +Start|Inizia +Start Address:|Indirizzo Iniziale: +Start in Fullscreen|Start in Fullscreen +Status|Stato +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Store +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|Nel file... +Tools|Strumenti +Track Inf Loop Results|Track Inf Loop Results +Transfer|Trasferimento +Translation|Traduzione +Type:|Type: +Unable to add code|Impossibile aggiungere il codice +Unable to change description|Impossibile cambiare la descrizione +Unable to open file for loading|Impossibile aprire il file per il caricamento +Unable to open file for saving|Impossibile aprire il file per il salvataggio +Unable to remove code|Impossibile rimuovere il codice +Unknow (%1)|Sconosciuto (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Su +Upload|Upload +Use System Locale|Use System Locale +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Value +Value :|Valore: +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Sistema Video +Video Driver|Driver Video +Video Format|Formato Video +View|View +Viewer|Viewer +Waiting Input...|In attesa di input... +Width|Larghezza +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTI Driver +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause File Cheat (*.yct);;Tutti i file (*) +Yabause Qt GUI|Interfaccia Qt Yabause +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Salvataggio Stato (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=it +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Barra degli Strumenti diff --git a/win_template/trans/yabause_ja.yts b/win_template/trans/yabause_ja.yts new file mode 100644 index 0000000000..cfd2f0da74 --- /dev/null +++ b/win_template/trans/yabause_ja.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Images (*.%2) +%1/%2 blocks free|%1/%2 blocks free +&About...|Yabauseについて...(&A) +&Action Replay|リプレイ(&A) +&Backup Manager...|バックアップマネージャ(&B) +&Browse|ブラウズ(&B) +&Cancel|キャンセル(&C) +&Capture Screen|スクリーンキャプチャ(&C) +&Cheat List|チートリスト(&C) +&Cheats|チート(&C) +&Cheats List...|チートリスト(&C) +&Clear|消去(&C) +&Close|閉じる(&C) +&Debug|デバッグ(&D) +&Delete|削除(&D) +&Emulation|エミュレーション(&E) +&File|ファイル(&F) +&Frame Skip/Limiter|フレームスキップ/制限(&F) +&Fullscreen|フルスクリーン(&F) +&Help|ヘルプ(&F) +&Layer|レイヤー(&L) +&Load From File|ファイルをロード(&L) +&Log|ログ(&L) +&Master SH2|マスターSH2(&M) +&Memory Transfer|メモリ転送(&M) +&OK|&OK +&Pause|一時停止(&P) +&Quit|終了(&Q) +&Raw Memory Address|&Raw Memory Address +&Reset|リセット(&R) +&Save To File|ファイルに保存(&S) +&Settings...|設定(&S) +&Slave SH2|スレーブSH2(&S) +&Tools|ツール(&T) +&Transfer|転送(&T) +&View|表示(&V) +16 Mbit Backup Ram|16Mbバックアップラム +16 Mbit ROM|16Mb ROM +16-bit|16ビット +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32MbバックアップRAM +32 Mbit Dram|32Mb DRAM +32-bit|32ビット +3D Control Pad|3Dコントロールパッド +4 Mbit Backup Ram|4MbバックアップRAM +503/512 blocks free|503/512ブロック空き +510/512 blocks free|510/512ブロック空き +8 Mbit Backup Ram|8MbバックアップRAM +8 Mbit Dram|8Mb DRAM +8-bit|8ビット +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|警告: マスタコードはサポート されません +About...|Yabauseについて... +Action Replay Code :|Action Replay Code : +Add|追加 +Add Action Replay Code|Add Action Replay Code +Add Cheat|チート追加 +Add Codes...|Add Codes... +Add Raw Memory Code|Add Raw Memory Code +Address|アドレス +Address :|Address : +Advanced|Advanced +Always|常時 +Are you sure you want to delete '%1' ?|'%1'を本当に削除してよいですか? +Are you sure you want to format '%1' ?|'%1'を本当にフォーマットしてよいですか? +Asia (NTSC)|アジア(NTSC) +Asia (PAL)|アジア(PAL) +Auto-detect|自動検出 +Autostart|Autostart +Awaiting input for|Awaiting input for +Axis|軸 +Backtrace|バックトレース +Backup Ram Manager|バックアップRAMマネージャ +Binary Files (*.bin)|バイナリファイル (*.bin) +Bios|BIOS +Block Size :|Block Size : +Browse|ブラウズ +Byte|バイト +Byte Write|Byte Write +CD Images (*.iso *.cue *.bin)|CDイメージ (*.iso *.cue *.bin) +Cancel|キャンセル +Cannot initialize|初期化不可 +Cannot initialize Windows SPTI Driver|Windows SPTIドライバの初期化不可 +Cart/Memory|カートリッジ/メモリ +Cartridge|カートリッジ +Cd-Rom|CD-ROM +Central/South America (NTSC)|中南米 (NTSC) +Central/South America (PAL)|中南米 (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|チート検索 +Cheat Type|チートタイプ +Cheats|チート +Cheats File|チートファイル +Choose a binary file|バイナリファイルを選んでください +Choose a cartridge file|カートリッジファイルを選んでください +Choose a cdrom drive/mount point|Choose a cdrom drive/mount point +Choose a cheat file to open|開くファイルを選んでください +Choose a cheat file to save to|Choose a cheat file to save to +Choose a file to save your state|状態を保存するファイルを選んでください +Choose a location for binary file|バイナリファイルの場所を選んでください +Choose a location for your screenshot|スクリーンショットの場所を選んでください +Choose a memory file|メモリファイルを選んでください +Choose a mpeg rom|Mpeg ROMを選んでください +Clear configuration|Clear configuration +Close|閉じる +Code|コード +Code Breakpoints|Code Breakpoints +Comment :|コメント +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|データサイズ +Data Size :|データサイズ: +Data Type|データタイプ +Debug CPU|CPUをデバッグする +Debug M68K|M68Kをデバッグする +Debug Master SH2|マスターSH2をデバッグする +Debug SCU DSP|SCU DSPをデバッグする +Debug Slave SH2|スレーブSH2をデバッグする +Debug VDP1|VDP1をデバッグする +Debug VDP2Viewer|VDP2ビューアをデバッグする +Del|Del +Delete|消去 +Description|Description +Description :|Description : +Device List|デバイスリスト +DirectX Input Interface|DirectX入力インタフェース +DirectX Sound Interface|DirectXサウンドインタフェース +Disabled|Disabled +Disassembled Code|逆アセンブルコード +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Down +Download|ダウンロード +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Edit configuration +Emu-Compatibility|Emu-Compatibility +Emulation|エミュレーション +Enable|Enable +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Enabled +End Address:|End Address: +English|英語 +Enter New Value|Enter New Value +Europe + others (PAL)|欧州他 (PAL) +Exact|Exact +FPS|FPS +File|ファイル +File Name :|File Name : +File transfer|File transfer +File:|File: +Format|Format +Frame Skip/Limiter|Frame Skip/Limiter +French|French +From|From +From File|From File +From File...|From File... +Fullscreen|Fullscreen +Fullscreen Resolution|Fullscreen Resolution +General|General +General Info|General Info +German|ドイツ語 +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|Hard Reset +Height|Height +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Input +Invalid Address|無効なアドレス +Invalid Value|無効な値 +Italian|イタリア語 +Japan (NTSC)|日本 (NTSC) +Japanese|日本語 +Japanese Modem|Japanese Modem +Korea (NTSC)|韓国 (NTSC) +L&oad State|L&oad State +Language :|Language : +Layer|Layer +Left|Left +Left trigger|Left trigger +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Load +Load State|Load State +Load State As|Load State As +Load as executable|Load as executable +Local Coordinates|Local Coordinates +Log|ログ +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68Kレジスタ +MSH2|MSH2 +Master SH2|マスターSH2 +Memory|メモリ +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Memory Dump +Memory Editor|Memory Editor +Memory Search|Memory Search +Memory Transfer|Memory Transfer +Memory dump|Memory dump +Middle|Middle +Mouse|Mouse +Mouse Configuration|Mouse Configuration +Mpeg ROM|MPEG ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|None +Normal Sprite|Normal Sprite +North America (NTSC)|北米 (NTSC) +OSD Core|OSD Core +Ok|Ok +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|CD-ROMを開く +OpenGL Video Interface|OpenGLビデオインタフェース +Options|オプション +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Configuration +Pause|一時停止 +Press Esc key to cancel|Press Esc key to cancel +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qtキーボード入力インタフェース +Quit|終了 +R&un|R&un +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|Reset +Resolution|Resolution +Right|Right +Right trigger|Right trigger +Run|Run +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDLジョイスティックインタフェース +SDL Sound Interface|SDLサウンドインタフェース +SH2 Debugger Interpreter|SH2デバッガインタプリタ +SH2 Dynamic Recompiler|SH2ダイナミックリコンバイラ +SH2 Interpreter|SH2インタプリタ +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Save +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Save Information +Save List|Save List +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Save State +Save State As|Save State As +Save States|Save States +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|スクリーンショット +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Select a file to load your state +Select your iso/cue/bin file|Select your iso/cue/bin file +Set PC to Start Address|Set PC to Start Address +Settings|Settings +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|スレーブSH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|サウンド +Sound Core|サウンドコア +Spanish|スペイン語 +Start|Start +Start Address:|Start Address: +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Store +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|To File... +Tools|Tools +Track Inf Loop Results|Track Inf Loop Results +Transfer|Transfer +Translation|Translation +Type:|Type: +Unable to add code|Unable to add code +Unable to change description|Unable to change description +Unable to open file for loading|Unable to open file for loading +Unable to open file for saving|Unable to open file for saving +Unable to remove code|Unable to remove code +Unknow (%1)|Unknow (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Up +Upload|Upload +Use System Locale|Use System Locale +VDP1|Vdp1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|Vdp2 +Value|Value +Value :|Value : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Core +Video Driver|ビデオドライバ +Video Format|ビデオフォーマット +View|View +Viewer|Viewer +Waiting Input...|Waiting Input... +Width|Width +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTIドライバ +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Files (*.yct);;All Files (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Save State (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|toolBar diff --git a/win_template/trans/yabause_lt.yts b/win_template/trans/yabause_lt.yts new file mode 100644 index 0000000000..7cc3a07dd6 --- /dev/null +++ b/win_template/trans/yabause_lt.yts @@ -0,0 +1,365 @@ +%1 Images (*.%2)|%1 Images (*.%2) +%1/%2 blocks free|%1/%2 blokų laisvų +&About...|&Apie... +&Action Replay|&Veiksmo pakartojimas +&Backup Manager...|&Backup Manager... +&Browse|&Naršyti +&Cancel|&Cancel +&Capture Screen|&Nufotografuoti ekraną +&Cheat List|&Kodų sąrašas +&Cheats|&Kodai +&Cheats List...|&Cheats List... +&Clear|&Išvalyti +&Close|&Close +&Debug|&Klaidų taisymas +&Delete|&Trinti +&Emulation|&Emulation +&File|&Failas +&Frame Skip/Limiter|&Frame Skip/Limiter +&Fullscreen|&Pilnas ekranas +&Help|&Pagalba +&Layer|&Sluoksniai +&Load From File|&Įkelti iš failo +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Atminties pervedimas +&OK|&Gerai +&Pause|&Pauzė +&Quit|&Išeiti +&Raw Memory Address|&Priėjimas prie Raw atminties +&Reset|&Perkrauti +&Save To File|&Išsaugoti į failą +&Settings...|&Nuostatos +&Slave SH2|&Slave SH2 +&Tools|&Tools +&Transfer|&Transfer +&View|&Žiūrėti +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 blokų laisvų +510/512 blocks free|510/512 blokų laisvų +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|WARNING: Master Codes are NOT supported. +About...|Apie... +Action Replay Code :|Veiksmo pakartojimo kodas: +Add|Add +Add Action Replay Code|Pridėti veiksmo pakartojimo kodą: +Add Cheat|Add Cheat +Add Codes...|Pridėti kodų... +Add Raw Memory Code|Pridėti "Raw" atminties kodą +Address|Address +Address :|Adresas : +Advanced|Papildoma +Always|Always +Are you sure you want to delete '%1' ?|Ar tu įsitikinęs,kad nori ištrinti '%1' ? +Are you sure you want to format '%1' ?|Ar tu įsitikinęs,kad nori suformatuoti '%1' ? +Asia (NTSC)|Asia (NTSC) +Asia (PAL)|Asia (PAL) +Auto-detect|Auto-detect +Autostart|Autostart +Backtrace|Backtrace +Backup Ram Manager|Atsarginės darbinės atminties tvarkyklė +Binary Files (*.bin)|Binary Files (*.bin) +Bios|Bios'as +Block Size :|Bloko dydis: +Browse|Browse +Byte|Byte +Byte Write|Byte Write +CD Images (*.iso *.cue *.bin)|CD atvaizdai (*.iso *.cue *.bin) +Cancel|Atšaukti +Cannot initialize|Negalima pradėti +Cannot initialize Windows SPTI Driver|Cannot initialize Windows SPTI Driver +Cart/Memory|Darbinė atmintis +Cartridge|Disketė +Cd-Rom|CD-ROM +Central/South America (NTSC)|Central/South America (NTSC) +Central/South America (PAL)|Central/South America (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|Cheat Search +Cheat Type|Kodų tipas +Cheats|Kodai +Cheats File|Kodų failas +Choose a binary file|Choose a binary file +Choose a cdrom drive/mount point|Pasirink CD-ROM prijungimo tašką +Choose a cheat file to open|Pasirink kodų failą +Choose a cheat file to save to|Pasirink kodų failą išsaugojimui į +Choose a file to save your state|Pasirink failą išsaugoti žaidimui +Choose a location for binary file|Choose a location for binary file +Choose a location for your screenshot|Pasirink vietą žaidimo ekranvaizdžiui +Clear configuration|Clear configuration +Close|Uždaryti +Code|Kodas +Code Breakpoints|Code Breakpoints +Comment :|Komentaras: +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Data Size +Data Size :|Duomenų dydis: +Data Type|Data Type +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Trinti +Description|Aprašymas +Description :|Aprašymas : +Device List|Įrenginių sąrašas +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|Neįgalinta +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Žemyn +Download|Atsisiųsti +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Edit configuration +Emu-Compatibility|Emuliatoriaus suderinamumas +Emulation|Emuliacija +Enable|Įgalinti +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Įgalinta +End Address:|End Adress: +English|Anglų +Enter New Value|Enter New Value +Europe + others (PAL)|Europe + others (PAL) +Exact|Exact +FPS|KPS +File|Failas +File Name :|Failo pavadinimas: +File transfer|Failo perkėlimas +File:|File: +Format|Formatuoti +Frame Skip/Limiter|Kadrų praleidimas +French|Prancūzų +From|Iš +From File|Iš failo +From File...|Iš failo... +Fullscreen|Pilnas ekranas +Fullscreen Resolution|Fullscreen Resolution +General|Pagrindiniai +General Info|General Info +German|Vokiečių +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|"Gilus" perkrovimas +Height|Aukštis +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Įvedimas +Invalid Address|Neteisingas adresas +Invalid Value|Neteisinga vertė +Italian|Italų +Japan (NTSC)|Japan (NTSC) +Japanese|Japonų +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&oad State +Language :|Kalba : +Layer|Sluoksniai +Left|Kairė +Left trigger|Kairysis mygtukas +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Įkrauti +Load State|Įkelti išsaugotą žaidimą +Load State As|Išsaugoti žaidimą kaip +Load as executable|Įkrauti kaip paleidžiamąjį failą +Local Coordinates|Local Coordinates +Log|Log'as +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Atmintis +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Atminties "išmetimas" +Memory Editor|Atminties tvarkymas +Memory Search|Memory Search +Memory Transfer|Atminties pervedimas +Memory dump|Atminties "išmetimas" +Mouse|Mouse +Mpeg ROM|Mpeg ROM'as +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|None +Normal Sprite|Normal Sprite +North America (NTSC)|North America (NTSC) +OSD Core|OSD Core +Ok|Gerai +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|Atverti CD-ROM'ą +OpenGL Video Interface|OpenGL Video Interface +Options|Options +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Configuration +Pause|Pauzė +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Keyboard Input Interface +Quit|Išeiti +R&un|&Leisti +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Regionas +Registers|Registers +Reset|Perkrauti +Resolution|Raiška +Right|Dešinė +Right trigger|Dešinysis mygtukas +Run|Leisti +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Interface +SDL Sound Interface|SDL Sound Interface +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamic Recompiler +SH2 Interpreter|SH2 Interpretatorius +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Išsaugoti +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Išsaugoti informaciją +Save List|Išsaugojimų sąrašas +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Išsaugoti žaidimą +Save State As|Išsaugoti žaidimą kaip +Save States|Žaidimų išsaugojimo failai +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|Ekrano nuotrauka +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Pasirink žaidimo išsaugojimo failą įkėlimui +Select your iso/cue/bin file|Pasirink iso/cue/bin failą +Set PC to Start Address|Set PC to Start Address +Settings|Nuostatos +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|Garsas +Sound Core|Garso įranga +Spanish|Ispanų +Start|Pradėti +Start Address:|Pradžios adresas: +Start in Fullscreen|Start in Fullscreen +Status|Statusas +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Saugoti +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|Į failą... +Tools|Įrankiai +Track Inf Loop Results|Track Inf Loop Results +Transfer|Pervedimas +Translation|Vertimas +Type:|Type: +Unable to add code|Neįmanoma pridėti kodo +Unable to change description|Neįmanoma keisti aprašymo +Unable to open file for loading|Neįmanoma atverti failo įkrovimui +Unable to open file for saving|Neįmanoma atverti failo saugojimui +Unable to remove code|Neįmanoma pašalinti kodo +Unknow (%1)|Nežinoma (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Aukštyn +Upload|Įkrauti +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Value +Value :|Vertė: +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video įranga +Video Driver|Video tvarkyklė +Video Format|Video formatas +View|View +Viewer|Viewer +Waiting Input...|Laukiama įvedimo +Width|Plotis +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTI Driver +Word|Word +Word Write|Žodžių rašymas +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause kodų failai (*.yct);;Visi failai (*) +Yabause Qt GUI|Yabause Qt grafinė sąsaja +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause žaidimo išsaugojimo failas (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Įrankų juosta diff --git a/win_template/trans/yabause_nl.yts b/win_template/trans/yabause_nl.yts new file mode 100644 index 0000000000..c45649a0d0 --- /dev/null +++ b/win_template/trans/yabause_nl.yts @@ -0,0 +1,365 @@ +%1 Images (*.%2)|%1 Afbeeldingen (*.%2) +%1/%2 blocks free|%1/%2 Vrije Blokken +&About...|&Over... +&Action Replay|&Action Replay +&Backup Manager...|&Backup Beheer... +&Browse|&Bladeren +&Cancel|&Annuleer +&Capture Screen|&Neem Schermafbeelding +&Cheat List|&Cheat Lijst +&Cheats|&Cheats +&Cheats List...|&Cheats Lijst... +&Clear|&Herstel +&Close|&Sluiten +&Debug|&Debug +&Delete|&Verwijder +&Emulation|&Emulatie +&File|&Bestand +&Frame Skip/Limiter|&Frame Skip/Limitatie +&Fullscreen|&Volledig Scherm +&Help|&Help +&Layer|&Laag +&Load From File|&Bestand Laden +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Geheugen Verplaatsen +&OK|&OK +&Pause|&Pauzeer +&Quit|&Stoppen +&Raw Memory Address|&Raw Geheugen Adres +&Reset|&Reset +&Save To File|&Bewaar Naar Bestand +&Settings...|&Instellingen... +&Slave SH2|&Slave SH2 +&Tools|&Hulpmiddelen +&Transfer|&Verplaats +&View|&View +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relatieve waarde(n) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 vrije blokken +510/512 blocks free|510/512 vrije blokken +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relatieve waarden +WARNING: Master Codes are NOT supported.|WARNING: Master Codes worden NIET ondersteund. +About...|Over... +Action Replay Code :|Action Replay Code : +Add|Voeg Toe +Add Action Replay Code|Voeg Action Replay Code toe +Add Cheat|Cheat Toevoegen +Add Codes...|Codes Toevoegen... +Add Raw Memory Code|Toevoegen Add Raw Geheugen Code +Address|Adres +Address :|Adres : +Advanced|Geavanceerd +Always|Altijd +Are you sure you want to delete '%1' ?|Bent u zeker dat u '%1' wil verwijderen? +Are you sure you want to format '%1' ?|Bent u zeker dat u '%1' wil formatteren? +Asia (NTSC)|Azië (NTSC) +Asia (PAL)|Azië (PAL) +Auto-detect|Automatisch Herkennen +Autostart|Automatisch Starten +Backtrace|Backtrace +Backup Ram Manager|Backup RAM Beheer +Binary Files (*.bin)|Binaire Bestanden (*.bin) +Bios|Bios +Block Size :|Blok grootte : +Browse|Bladeren +Byte|Byte +Byte Write|Byte Schrijven +CD Images (*.iso *.cue *.bin)|CD bestanden (*.iso *.cue *.bin) +Cancel|Annuleer +Cannot initialize|Initialiseren mislukt +Cannot initialize Windows SPTI Driver|Initialiseren Windows SPTI Driver mislukt +Cart/Memory|Kaart/Geheugen +Cartridge|Cartridge +Cd-Rom|Cd-Rom +Central/South America (NTSC)|Centraal/Zuid-Amerika (NTSC) +Central/South America (PAL)|Centraal/Zuid-Amerika (PAL) +Cheat &Search...|Cheat &Zoeken... +Cheat Search|Cheat Zoeken +Cheat Type|Cheat Type +Cheats|Cheats +Cheats File|Cheats Bestand +Choose a binary file|Kies een binair bestand +Choose a cdrom drive/mount point|Kies een cdrom drive/mount point +Choose a cheat file to open|Kies een cheat bestand om te openen +Choose a cheat file to save to|Kies een cheat bestand om naar te bewaren +Choose a file to save your state|Kies een bestand om uw save status te bewaren +Choose a location for binary file|Kies een locatie voor het binair bestand +Choose a location for your screenshot|Kies een locatie voor uw schermafbeelding +Clear configuration|Herstel configuratie +Close|Sluiten +Code|Code +Code Breakpoints|Code Breekpunten +Comment :|Commentaar : +Common Control Registers|Common Control Registers +Compare Type|Vergelijk type +DSP Control Registers|DSP Controle Registers +DSP Registers|DSP Registers +Data Size|Data Grootte +Data Size :|Data Grootte : +Data Type|Data Type +Debug CPU|Debug CPU +Debug M68K|Debug M86K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Verwijder +Description|Beschrijving +Description :|Beschrijving : +Device List|Apparaat Lijst +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Geluid Interface +Disabled|Uitgeschakeld +Disassembled Code|Gedeassembleerde Code +Display Enabled|Scherm Actief +Display on Hover|Scherm op Hover +Down|Beneden +Download|Downloaden +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Geluid Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Editeer configuratie +Emu-Compatibility|Emu-Compatibiliteit +Emulation|Emulatie +Enable|Activeer +Enable Frame Skip/Limiter|Activeer Frame Skip/Limitatie +Enabled|Geactiveerd +End Address:|Eind adres: +English|Engels +Enter New Value|Geef Nieuwe Waarde in +Europe + others (PAL)|Europa + andere (PAL) +Exact|Exact +FPS|FPS +File|Bestand +File Name :|Bestand Naam : +File transfer|Bestand overzetten +File:|Bestand: +Format|Formatteer +Frame Skip/Limiter|Frame Skip/Limitatie +French|Frans +From|Van +From File|Van Bestand +From File...|Van Bestand... +Fullscreen|Volledig Scherm +Fullscreen Resolution|Volledig Scherm Resolutie +General|Algemeen +General Info|Algemene info +German|Duits +Glut OSD Interface|Glut OSD Interface +Goto Address|Ga Naar Adres +Greater then|Groter dan +Hard Reset|Koude Reset +Height|Hoogte +Hex value(s)|Hex waarde(n) +Hide Menubar|Verberg Menubalk +Hide Toolbar|Verberg Hulpmiddelbalk +ISO-File Virtual Drive|ISO-Bestand Virtuele Drive +Information...|Informatie... +Input|Input +Invalid Address|Ongeldig Adres +Invalid Value|Ongeldige Waarde +Italian|Italiaans +Japan (NTSC)|Japan (NTSC) +Japanese|Japans +Japanese Modem|Japans (Modern) +Korea (NTSC)|Korea (NTSC) +L&oad State|L&aad Status +Language :|Taal : +Layer|Laag +Left|Links +Left trigger|Linkse trigger +Less than|Minder dan +Linux CD Drive|Linux CD Drive +Load|Laden +Load State|Status Laden +Load State As|Status Laden Als +Load as executable|Executable Laden +Local Coordinates|Lokale Coördinaten +Log|Log +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Herstel +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Geheugen +Memory &Editor|Geheugen &Editor +Memory Breakpoints|Geheugen Breekpunten +Memory Dump|Geheugen dump +Memory Editor|Geheugen Editor +Memory Search|Geheugen Zoeken +Memory Transfer|Geheugen Overzetten +Memory dump|Geheugen dump +Mouse|Muis +Mpeg ROM|Mpeg ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Nooit +None|Geen +Normal Sprite|Normale Sprite +North America (NTSC)|Noord-Amerika (NTSC) +OSD Core|OSD Kern +Ok|Ok +On fullscreen|Op volledig scherm +On message|Op boodschap +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|Open CD Rom +OpenGL Video Interface|OpenGL Video Interface +Options|Opties +Other Debug|Andere Debug +Pad|Pad +Pad Configuration|Pad Configuratie +Pause|Pauze +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Toetsenbord Input Interface +Quit|Stoppen +R&un|S&tarten +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Lezen +Region|Regio +Registers|Registers +Reset|Reset +Resolution|Resolutie +Right|Rechts +Right trigger|Rechtse trigger +Run|Start +S&ave State|B&ewaar Status +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Interface +SDL Sound Interface|SDL Geluid Interface +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamic Recompiler +SH2 Interpreter|SH2 Interpreter +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Bewaar +Save As WAV|Bewaar als WAV +Save Bitmap|Bewaar Bitmap +Save Information|Bewaar Informatie +Save List|Bewaar Lijst +Save MD0|Bewaar MD0 +Save MD1|Bewaar MD1 +Save MD2|Bewaar MD2 +Save MD3|Bewaar MD3 +Save Program|Bewaar Programma +Save Selected|Bewaar Geselecteerd +Save Slot Registers|Bewaar Slot Registers +Save State|Bewaar Status +Save State As|Bewaar Status Als +Save States|Bewaar Statussen +Sc&reenshot|Sc&hermafbeelding +Screen Enabled|Scherm Geactiveerd +Screenshot|Schermafbeelding +Search|Zoeken +Search Criteria|Zoek Criteria +Search Memory|Zoek Geheugen +Search Value:|Zoek Waarde: +Search/Add Cheats|Zoek/Voeg Cheats Toe +Select a file to load your state|Selecteer een bestand om uw status te laden +Select your iso/cue/bin file|Selecteer uw ISO/CUE/BIN file +Set PC to Start Address|Zet PC op Start Adres +Settings|Instellingen +Shortcuts|Shortcuts +Show FPS|Toon FPS +Show Log Window|Toon Log Venster +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Nummer: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|Geluid +Sound Core|Geluid Kern +Spanish|Spaans +Start|Start +Start Address:|Start Adres: +Start in Fullscreen|Start in Volledig Scherm +Status|Status +Step Into|Stap In +Step Out|Stap Uit +Step Over|Stap Over +Store|Bewaar +Synchronize Saturn internal clock with set time|Synchroniseer Saturn interne klok met set stijd +System Clipping Coordinates|Systeem Clipping Coördinaten +Text|Tekst +Texture|Textuur +To|Naar +To File...|Naar Bestand... +Tools|Hulpmiddelen +Track Inf Loop Results|Traceer Inf Loop Results +Transfer|Overzetten +Translation|Vertaling +Type:|Type: +Unable to add code|Kan geen code toevoegen +Unable to change description|Omschrijving aanpassen mislukt +Unable to open file for loading|Bestand openen voor laden mislukt +Unable to open file for saving|Bestand openen voor bewaren mislukt +Unable to remove code|Code verwijderen mislukt +Unknow (%1)|Onbekend (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Omhoog +Upload|Uploaden +VDP1|Vdp1 +VDP1 Command Info|VDP1 Commando Info +VDP1 Command List|VDP1 Commando List +VDP2|Vdp2 +Value|Waarde +Value :|Waarde : +Value:|Waarde : +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Kern +Video Driver|Video Driver +Video Format|Video Formaat +View|View +Viewer|Viewer +Waiting Input...|Wachten op input... +Width|Breedte +Window Resolution|Scherm Resolutie +Windows SPTI Driver|Windows SPTI Driver +Word|Woord +Word Write|Woord Schrijven +Write|Schrijven +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Files (*.yct);;Alle Bestanden (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Gebaseerd op Yabause %1
http://yabause.org
Het Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Save Status (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is niet geïnitialiseerd, kan backup ram niet beheren. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Hulpmiddelbalk diff --git a/win_template/trans/yabause_pt.yts b/win_template/trans/yabause_pt.yts new file mode 100644 index 0000000000..d163fb57e6 --- /dev/null +++ b/win_template/trans/yabause_pt.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Imagens (*.%2) +%1/%2 blocks free|%1/%2 Blocos Livres +&About...|&Sobre... +&Action Replay|&Action Replay +&Backup Manager...|&Gestor de Memória... +&Browse|&Procurar +&Cancel|&Cancelar +&Capture Screen|&Capturar Ecrã +&Cheat List|&Lista de Códigos +&Cheats|&Códigos +&Cheats List...|&Lista de Códigos... +&Clear|&Limpar +&Close|&Fechar +&Debug|&Depurar +&Delete|&Apagar +&Emulation|&Emulação +&File|&Ficheiro +&Frame Skip/Limiter|&Frame Skip/Limiter +&Fullscreen|&Ecrã Completo +&Help|&Ajuda +&Layer|&Camada +&Load From File|&Carregar do Ficheiro +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Transferência de Memória +&OK|&OK +&Pause|&Pausar +&Quit|&Sair +&Raw Memory Address|&Endereço da Memória Original +&Reset|&Reiniciar +&Save To File|&Guardar em Ficheiro +&Settings...|&Configurações... +&Slave SH2|&Slave SH2 +&Tools|&Ferramentas +&Transfer|&Transferir +&View|&Ver +16 Mbit Backup Ram|Backup RAM de 16 Mbits +16 Mbit ROM|ROM de 16 Mbits +16-bit|16-bit +16-bit Relative value(s)|Valor(es) Relativo(s) de 16-bits +32 Mbit Backup Ram|Backup RAM de 32 Mbits +32 Mbit Dram|DRAM de 32 Mbits +32-bit|32-bit +3D Control Pad|Comando 3D +4 Mbit Backup Ram|Backup RAM de 4 Mbits +503/512 blocks free|503/512 Blocos Livres +510/512 blocks free|510/512 Blocos Livres +8 Mbit Backup Ram|Backup RAM de 8 Mbits +8 Mbit Dram|DRAM de 8 Mbits +8-bit|8-bit +8-bit Relative value(s)|Valor(es) Relativo(s) de 8-bits +WARNING: Master Codes are NOT supported.|AVISO: Códigos Mestre NÃO são suportados. +About...|Sobre... +Action Replay Code :|Código Action Replay : +Add|Adicionar +Add Action Replay Code|Adicionar Código Action Replay +Add Cheat|Adicionar Código +Add Codes...|Adicionar Códigos... +Add Raw Memory Code|Adicionar Código de Memória RAW +Address|Endereço +Address :|Endereço : +Advanced|Avançado +Always|Sempre +Are you sure you want to delete '%1' ?|Tem a certeza de que deseja excluir '%1' ? +Are you sure you want to format '%1' ?|Tem a certeza de que deseja formatar '%1' ? +Asia (NTSC)|Ásia (NTSC) +Asia (PAL)|Ásia (PAL) +Auto-detect|Auto-detectar +Autostart|Autostart +Awaiting input for|Awaiting input for +Axis|Eixo +Backtrace|Backtrace +Backup Ram Manager|Gestor da Backup RAM +Binary Files (*.bin)|Ficheiros Binários (*.bin) +Bios|BIOS +Block Size :|Tamanho dos Blocos : +Browse|Procurar +Byte|Byte +Byte Write|Gravar Byte +CD Images (*.iso *.cue *.bin)|Imagens de CD (*.iso *.cue *.bin) +Cancel|Cancelar +Cannot initialize|Impossível Inicializar +Cannot initialize Windows SPTI Driver|Impossível Inicializar Driver Windows SPTI +Cart/Memory|Cartucho/Memória +Cartridge|Cartucho +Cd-Rom|CD-ROM +Central/South America (NTSC)|América Central/do Sul (NTSC) +Central/South America (PAL)|América Central/do Sul (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|Procura de Códigos +Cheat Type|Tipo de Código +Cheats|Códigos +Cheats File|Ficheiro de Códigos +Choose a binary file|Seleccione um Ficheiro Binário +Choose a cartridge file|Seleccione um Ficheiro de Cartucho +Choose a cdrom drive/mount point|Seleccione um Leitor de CD-ROM/Ponto de Montagem +Choose a cheat file to open|Seleccione um ficheiro de códigos para abrir +Choose a cheat file to save to|Seleccione um ficheiro de códigos para salvar +Choose a file to save your state|Seleccione um ficheiro para salvar seu estado +Choose a location for binary file|Seleccione um local para o ficheiro binário +Choose a location for your screenshot|Seleccione um local para sua captura de ecrã +Choose a memory file|Seleccione um Ficheiro de Memória +Choose a mpeg rom|Seleccione uma MPEG ROM +Clear configuration|Limpar Configuração +Close|Fechar +Code|Código +Code Breakpoints|Pontos de Ruptura do Código +Comment :|Comentário : +Common Control Registers|Registadores de Controlo Comum +Compare Type|Comparar Tipo +DSP Control Registers|DSP Control Registers +DSP Registers|Registadores DSP +Data Size|Tamanho dos Dados +Data Size :|Tamanho dos Dados : +Data Type|Tipo de Dados +Debug CPU|Depurar CPU +Debug M68K|Depurar M68K +Debug Master SH2|Depurar Master SH2 +Debug SCU DSP|Depurar SCU DSP +Debug Slave SH2|Depurar Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Apagar +Description|Descrição +Description :|Descrição : +Device List|Lista de Dispositivos +DirectX Input Interface|Interface de Entrada DirectX +DirectX Sound Interface|Interface de Som DirectX +Disabled|Desactivado +Disassembled Code|Código Desmontado +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Down +Download|Descarregar +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Alterar Configuração +Emu-Compatibility|Emu-Compatibility +Emulation|Emulação +Enable|Activar +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Activado +End Address:|Endereço Final: +English|Inglês +Enter New Value|Insira Novo Valor +Europe + others (PAL)|Europa + Outros (PAL) +Exact|Exacto +FPS|FPS +File|Ficheiro +File Name :|Nome do Ficheiro : +File transfer|Transferência de Ficheiro +File:|Ficheiro +Format|Formato +Frame Skip/Limiter|Frame Skip/Limiter +French|Francês +From|De +From File|Do Ficheiro +From File...|Do Ficheiro... +Fullscreen|Ecrã Completo +Fullscreen Resolution|Resolução do Ecrã Completo +General|Geral +General Info|Informação Geral +German|Alemão +Glut OSD Interface|Glut OSD Interface +Goto Address|Ir para Endereço +Greater then|Maior que +Hard Reset|Reiniciar Hardware +Height|Altura +Hex value(s)|Valor(es) Hex +Hide Menubar|Hide Menubar +Hide Toolbar|Ocultar Barra de Ferramentas +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Informação... +Input|Comandos +Invalid Address|Endereço Inválido +Invalid Value|Valor Inválido +Italian|Italiano +Japan (NTSC)|Japão (NTSC) +Japanese|Japonês +Japanese Modem|Modem Japonês +Korea (NTSC)|Coreia (NTSC) +L&oad State|Carregar Estado +Language :|Idioma : +Layer|Camada +Left|Esquerda +Left trigger|Gatilho Esquerdo +Less than|Menos que +Linux CD Drive|Linux CD Drive +Load|Carregar +Load State|Carregar Estado +Load State As|Carregar Estado como +Load as executable|Carregar como Executável +Local Coordinates|Coordenadas Locais +Log|Log +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|Registadores M68K +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Memória +Memory &Editor|Memória & Editor +Memory Breakpoints|Pontos de Ruptura da Memória +Memory Dump|Despejo de memória +Memory Editor|Editor de Memória +Memory Search|Memory Search +Memory Transfer|Transferência de Memória +Memory dump|Despejo de memória +Middle|Meio +Mouse|Rato +Mouse Configuration|Configuração do Rato +Mpeg ROM|ROM Mpeg +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Nunca +None|Nenhum +Normal Sprite|Normal Sprite +North America (NTSC)|América do Norte (NTSC) +OSD Core|Núcleo OSD +Ok|OK +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Abrir &CD-ROM... +Open &ISO...|Abrir &ISO +Open CD Rom|Abrir CD-ROM +OpenGL Video Interface|Interface de Video OpenGL +Options|Opções +Other Debug|Other Debug +Pad|Comando +Pad Configuration|Configuração do Comando +Pause|Pausar +Press Esc key to cancel|Pressione a Tecla "Esc" para Cancelar +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Keyboard Input Interface +Quit|Sair +R&un|Exec&utar +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Ler +Region|Região +Registers|Registadores +Reset|Reiniciar +Resolution|Resolução +Right|Direita +Right trigger|Gatilho Direito +Run|Executar +S&ave State|S&alvar Estado +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|Interface SDL de Joystick +SDL Sound Interface|Interface SDL de Som +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|Recompilador Dinâmico SH2 +SH2 Interpreter|Interpretador SH2 +SH2 Registers|Registadores SH2 +SSH2|SSH2 +Save|Salvar +Save As WAV|Salvar como WAV +Save Bitmap|Salvar Bitmap +Save Information|Informações sobre as Saves +Save List|Lista de Saves +Save MD0|Salvar MD0 +Save MD1|Salvar MD1 +Save MD2|Salvar MD2 +Save MD3|Salvar MD3 +Save Program|Salvar Programa +Save Selected|Save Seleccionada +Save Slot Registers|Save Slot Registers +Save State|Salvar Estado +Save State As|Salvar Estado como +Save States|Estados Salvos +Sc&reenshot|Ca&ptura de Ecrã +Screen Enabled|Ecrã Activado +Screenshot|Captura de Ecrã +Search|Procurar +Search Criteria|Search Criteria +Search Memory|Procurar Memória +Search Value:|Procurar Valor +Search/Add Cheats|Procurar/Adicionar Códigos +Select a file to load your state|Seleccione um arquivo para carregar o seu estado +Select your iso/cue/bin file|Seleccione o seu ficheiro ISO/CUE/BIN +Set PC to Start Address|Set PC to Start Address +Settings|Configurações +Shortcuts|Atalhos +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|Som +Sound Core|Núcleo de Som +Spanish|Espanhol +Start|Iniciar +Start Address:|Endereço Inicial: +Start in Fullscreen|Iniciar em Ecrã Completo +Status|Estado +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Armazenar +Synchronize Saturn internal clock with set time|Sincronizar o Relógio Interno da Saturn com a Hora/Data Actual +System Clipping Coordinates|System Clipping Coordinates +Text|Texto +Texture|Textura +To|Para +To File...|Para o Ficheiro... +Tools|Ferramentas +Track Inf Loop Results|Track Inf Loop Results +Transfer|Transferir +Translation|Tradução +Type:|Tipo: +Unable to add code|Não foi possível adicionar código +Unable to change description|Não foi possível modificar a descrição +Unable to open file for loading|Não foi possível abrir o ficheiro +Unable to open file for saving|Não foi possível salvar o ficheiro +Unable to remove code|Não foi possível remover o código +Unknow (%1)|Desconh (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Para cima +Upload|Carregar +Use System Locale|Use System Locale +VDP1|VDP1 +VDP1 Command Info|Informação de Comandos VDP1 +VDP1 Command List|Lista de Comandos VDP1 +VDP2|VDP2 +Value|Valor +Value :|Valor : +Value:|Valor: +Vdp1|VDP1 +Vdp2|VDP2 +Video|Vídeo +Video Core|Núcleo de Vídeo +Video Driver|Driver de Vídeo +Video Format|Formato do Vídeo +View|Ver +Viewer|Visualizador +Waiting Input...|Aguardando Entrada de Dados... +Width|Largura +Window Resolution|Resolução da Janela +Windows SPTI Driver|Windows SPTI Driver +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Ficheiros de Códigos Yabause (*.yct);;Todos os Ficheiros (*) +Yabause Qt GUI|Interface Gráfica do Usuário em Qt do Yabause +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Estado Salvo do Yabause (*.yss) +Yabause is not initialized, can't manage backup ram.|O Yabause não se encontra inicializado, impossível gerir a Backup RAM. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Barra de Ferramentas diff --git a/win_template/trans/yabause_pt_BR.yts b/win_template/trans/yabause_pt_BR.yts new file mode 100644 index 0000000000..a36421716b --- /dev/null +++ b/win_template/trans/yabause_pt_BR.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Imagens (*.%2) +%1/%2 blocks free|%1/%2 blocos livres +&About...|&Sobre... +&Action Replay|&Action Replay +&Backup Manager...|&Gerenciador de Backups... +&Browse|&Explorar +&Cancel|&Cancelar +&Capture Screen|&Capturar Tela +&Cheat List|Lista de &Trapaças +&Cheats|&Trapaças +&Cheats List...|&Lista de Trapaças... +&Clear|&Limpar +&Close|&Fechar +&Debug|&Debug +&Delete|&Apagar +&Emulation|&Emulação +&File|&Arquivo +&Frame Skip/Limiter|&Frame Skip/Limitador +&Fullscreen|&Tela cheia +&Help|&Ajuda +&Layer|&Camada +&Load From File|&Carregar Do Arquivo +&Log|&Log +&Master SH2|&SH2 Mestre +&Memory Transfer|&Transferência de Memória +&OK|&OK +&Pause|&Pausar +&Quit|&Sair +&Raw Memory Address|&Endereço da Memória Original +&Reset|&Resetar +&Save To File|&Salvar como Arquivo +&Settings...|&Configurações... +&Slave SH2|&SH2 Escravo +&Tools|&Ferramentas +&Transfer|&Transferência +&View|&Visualizar +16 Mbit Backup Ram|Ram de Backup de 16 Mbits +16 Mbit ROM|ROM de 16 Mbits +16-bit|16 bits +16-bit Relative value(s)|Valor(es) de 16 bits relativo(s) +32 Mbit Backup Ram|Ram de Backup de 32 Mbits +32 Mbit Dram|Dram de 32 Mbits +32-bit|32 bits +3D Control Pad|Pad do Controle 3D +4 Mbit Backup Ram|Ram de Backup de 4 Mbits +503/512 blocks free|503/512 blocos livres +510/512 blocks free|510/512 blocos livres +8 Mbit Backup Ram|Ram de Backup de 8 Mbits +8 Mbit Dram|Dram de 8 Mbits +8-bit|8 bits +8-bit Relative value(s)|Valor(es) de 8 bits relativo(s) +WARNING: Master Codes are NOT supported.|AVISO: Os Códigos Mestres NÃO são suportados. +About...|Sobre... +Action Replay Code :|Código do Action Replay +Add|Adicionar +Add Action Replay Code|Adicionar Código do Action Replay +Add Cheat|Adicionar Trapaça +Add Codes...|Adicionar Códigos... +Add Raw Memory Code|Adicionar o Código da Memória Original +Address|Endereço +Address :|Endereço : +Advanced|Avançado +Always|Sempre +Are you sure you want to delete '%1' ?|Você tem certeza que você quer apagar '%1' ? +Are you sure you want to format '%1' ?|Você tem certeza que você quer formatar '%1' ? +Asia (NTSC)|Ásia (NTSC) +Asia (PAL)|Ásia (PAL) +Auto-detect|Auto-detectar +Autostart|Auto-iniciar +Awaiting input for|Esperando a entrada de dados para +Axis|Axis +Backtrace|Backtrace +Backup Ram Manager|Gerenciador da Ram de Backup +Binary Files (*.bin)|Arquivos Binários (*.bin) +Bios|Bios +Block Size :|Tamanho dos Blocos : +Browse|Explorar +Byte|Byte +Byte Write|Gravação do Byte +CD Images (*.iso *.cue *.bin)|Imagens de CD (*.iso *.cue *.bin) +Cancel|Cancelar +Cannot initialize|Não consegue inicializar +Cannot initialize Windows SPTI Driver|Não consegue inicializar o Driver SPTI do Windows +Cart/Memory|Cartucho/Memória +Cartridge|Cartucho +Cd-Rom|Cd-Rom +Central/South America (NTSC)|América Central/do Sul (NTSC) +Central/South America (PAL)|América Central/do Sul (PAL) +Cheat &Search...|Busca de &Trapaças... +Cheat Search|Busca de Trapaças +Cheat Type|Tipo de Trapaça +Cheats|Trapaças +Cheats File|Arquivo das Trapaças +Choose a binary file|Escolha um arquivo binário +Choose a cartridge file|Escolha um arquivo de cartucho +Choose a cdrom drive/mount point|Escolha um drive de cdrom/ponto de montagem +Choose a cheat file to open|Escolha um arquivo de trapaça pra abrir +Choose a cheat file to save to|Escolha um arquivo de trapaça pra salvar +Choose a file to save your state|Escolha um arquivo para salvar seu state +Choose a location for binary file|Escolha um local pro arquivo binário +Choose a location for your screenshot|Escolha um local pra seu screenshot +Choose a memory file|Escolha um arquivo de memória +Choose a mpeg rom|Escolha uma rom mpeg +Clear configuration|Limpar configuração +Close|Fechar +Code|Código +Code Breakpoints|Pontos de Interrupção do Código +Comment :|Comentário : +Common Control Registers|Registros de Controle Comum +Compare Type|Tipo de Comparação +DSP Control Registers|Registros do Controle do DSP +DSP Registers|Registros do DSP +Data Size|Tamanho dos Dados +Data Size :|Tamanho dos Dados : +Data Type|Tipo de Dados +Debug CPU|Fazer Debug da CPU +Debug M68K|Fazer Debug do M68K +Debug Master SH2|Fazer Debug do SH2 Mestre +Debug SCU DSP|Fazer Debug do SCU DSP +Debug Slave SH2|Fazer Debug do SH2 Escravo +Debug VDP1|Fazer Debug do VDP1 +Debug VDP2Viewer|Fazer Debug do VDP2Viewer +Del|Apagar +Delete|Apagar +Description|Descrição +Description :|Descrição : +Device List|Lista de Dispositivos +DirectX Input Interface|Interface dos Controles do DirectX +DirectX Sound Interface|Interface de Som do DirectX +Disabled|Desativado +Disassembled Code|Código Convertido pra Assembler +Display Enabled|Exibidor Ativado +Display on Hover|Exibir ao Pairar Sobre +Down|Pra baixo +Download|Baixar +Draw End|Fim do Desenho +Dummy CD Drive|Imitação do Drive de CD +Dummy Input Interface|Imitação da Interface de Entrada de Dados +Dummy OSD Interface|Imitação da Interface OSD +Dummy Sound Interface|Imitação da Interface de Som +Dummy Video Interface|Imitação da Interface de Vídeo +Edit configuration|Editar configuração +Emu-Compatibility|Compatibilidade com o Emu +Emulation|Emulação +Enable|Ativar +Enable Frame Skip/Limiter|Ativar o Frame Skip/Limitador +Enabled|Ativado +End Address:|Endereço Final: +English|Inglês +Enter New Value|Inserir Novo Valor +Europe + others (PAL)|Europa + outros (PAL) +Exact|Exato +FPS|FPS +File|Arquivo +File Name :|Nome do Arquivo : +File transfer|Transferência de arquivo +File:|Arquivo: +Format|Formato +Frame Skip/Limiter|Frame Skip/Limitador +French|Francês +From|De +From File|Do Arquivo +From File...|Do Arquivo... +Fullscreen|Tela Cheia +Fullscreen Resolution|Resolução da Tela Cheia +General|Geral +General Info|Informação Geral +German|Alemão +Glut OSD Interface|Interface OSD do Glut +Goto Address|Endereço Goto +Greater then|Maior do que +Hard Reset|Reset Rígido +Height|Altura +Hex value(s)|Valor(es) hex +Hide Menubar|Esconder a Barra do Menu +Hide Toolbar|Esconder a Barra de Ferramentas +ISO-File Virtual Drive|Drive Virtual do Arquivo ISO +Information...|Informação... +Input|Controles +Invalid Address|Endereço Inválido +Invalid Value|Valor Inválido +Italian|Italiano +Japan (NTSC)|Japão (NTSC) +Japanese|Japonês +Japanese Modem|Modem Japonês +Korea (NTSC)|Coréia (NTSC) +L&oad State|C&arregar o State +Language :|Idioma : +Layer|Camada +Left|Esquerda +Left trigger|Gatilho esquerdo +Less than|Menor do que +Linux CD Drive|Drive de CD do Linux +Load|Carregar +Load State|Carregar State +Load State As|Carregar State Como +Load as executable|Carregar como executável +Local Coordinates|Coordenadas Locais +Log|Log +Long|Comprimento +Long Write|Gravação Longa +Loop Track Clear|Limpar o Rastreamento do Loop +Loop Track Start|Iniciar o Rastreamento do Loop +M68K|M68K +M68K Registers|Registros do M68K +MSH2|MSH2 +Master SH2|SH2 Mestre +Memory|Memória +Memory &Editor|Editor de &Memória +Memory Breakpoints|Pontos de Interrupção da Memória +Memory Dump|Dump da Memória +Memory Editor|Editor de Memória +Memory Search|Busca pela Memória +Memory Transfer|Transferência de Memória +Memory dump|Dump da Memória +Middle|No meio +Mouse|Mouse +Mouse Configuration|Configuração do Mouse +Mpeg ROM|ROM Mpeg +NBG0|NBG0 +NBG0/RBG1 Info|Informação do NBG0/RBG1 +NBG1|NBG1 +NBG1 Info|Informação do NBG1 +NBG2|NBG2 +NBG2 Info|Informação do NBG2 +NBG3|NBG3 +NBG3 Info|Informação do NBG3 +Netlink|Netlink +Never|Nunca +None|Nenhum +Normal Sprite|Sprite Normal +North America (NTSC)|América do Norte (NTSC) +OSD Core|Núcleo do OSD +Ok|Ok +On fullscreen|Na tela cheia +On message|Na mensagem +Open &CD Rom...|Abrir &CD Rom... +Open &ISO...|Abrir &ISO... +Open CD Rom|Abrir o CD Rom +OpenGL Video Interface|Interface de Vídeo do OpenGL +Options|Opções +Other Debug|Outro Debug +Pad|Pad +Pad Configuration|Configuração do Pad +Pause|Pausar +Press Esc key to cancel|Pressione a tecla Esc pra cancelar +Pro Action Replay|Action Replay Pro +Qt Keyboard Input Interface|Interface da Entrada de Dados do Teclado do Qt +Quit|Sair +R&un|E&xecutar +RBG0|RBG0 +RBG0 Info|Informação do RBG0 +Read|Ler +Region|Região +Registers|Registros +Reset|Resetar +Resolution|Resolução +Right|Direita +Right trigger|Gatilho direito +Run|Executar +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|Interface SDL do Joystick +SDL Sound Interface|Interface de Som SDL +SH2 Debugger Interpreter|Interpretador do Debugger SH2 +SH2 Dynamic Recompiler|Recompilador Dinâmico do SH2 +SH2 Interpreter|Interpretador SH2 +SH2 Registers|Registros do SH2 +SSH2|SSH2 +Save|Salvar +Save As WAV|Salvar Como WAV +Save Bitmap|Salvar Bitmap +Save Information|Informação dos Saves +Save List|Lista dos Saves +Save MD0|Salvar MD0 +Save MD1|Salvar MD1 +Save MD2|Salvar MD2 +Save MD3|Salvar MD3 +Save Program|Salvar Programa +Save Selected|Salvar os Selecionados +Save Slot Registers|Registros do Slot do Save +Save State|Salvar o State +Save State As|Salvar o State Como +Save States|Salvar os States +Sc&reenshot|Sc&reenshot +Screen Enabled|Tela Ativada +Screenshot|Screenshot +Search|Busca +Search Criteria|Critério da Busca +Search Memory|Procurar na Memória +Search Value:|Procurar Valor: +Search/Add Cheats|Procurar/Adicionar Trapaças +Select a file to load your state|Selecione um arquivo para carregar seu state +Select your iso/cue/bin file|Selecione seu arquivo iso/cue/bin +Set PC to Start Address|Configurar o PC pra Iniciar no Endereço +Settings|Configurações +Shortcuts|Atalhos +Show FPS|Mostrar FPS +Show Log Window|Mostrar a Janela do Log +Signed|Assinado +Signed 16-bit value|Valor de 16 bits assinado +Signed 32-bit value|Valor de 32 bits assinado +Signed 8-bit value|Valor de 8 bits assinado +Slave SH2|SH2 Escravo +Slot Info|Informação do Slot +Slot Number:|Número do Slot: +Software OSD Interface|Interface OSD do Software +Software Video Interface|Interface de Vídeo do Software +Sound|Som +Sound Core|Núcleo do Som +Spanish|Espanhol +Start|Iniciar +Start Address:|Endereço Inicial: +Start in Fullscreen|Iniciar em Tela Cheia +Status|Status +Step Into|Entrar +Step Out|Sair +Step Over|Atravessar +Store|Armazenar +Synchronize Saturn internal clock with set time|Sincronizar o relógio interno do Saturno com o tempo definido +System Clipping Coordinates|Coordenadas do Corte do Sistema +Text|Texto +Texture|Textura +To|Para +To File...|Do Arquivo... +Tools|Ferramentas +Track Inf Loop Results|Rastrear Resultados do Loop do Inf +Transfer|Transferência +Translation|Tradução +Type:|Tipo: +Unable to add code|Incapaz de adicionar o código +Unable to change description|Incapaz de mudar a descrição +Unable to open file for loading|Incapaz de abrir o arquivo pra carregar +Unable to open file for saving|Incapaz de abrir o arquivo pra salvar +Unable to remove code|Incapaz de remover o código +Unknow (%1)|(%1) Desconhecido +Unsigned|Não Assinado +Unsigned 16-bit value|Valor de 16 bits não assinado +Unsigned 32-bit value|Valor de 32 bits não assinado +Unsigned 8-bit value|Valor de 8 bits não assinado +Up|Pra cima +Upload|Upload +Use System Locale|Usar o Idioma do Sistema +VDP1|VDP1 +VDP1 Command Info|Informação do Comando do VDP1 +VDP1 Command List|Lista de Comandos do VDP1 +VDP2|VDP2 +Value|Valor +Value :|Valor : +Value:|Valor: +Vdp1|VDP1 +Vdp2|VDP2 +Video|Vídeo +Video Core|Núcleo do Vídeo +Video Driver|Driver do Vídeo +Video Format|Formato do Vídeo +View|Visualizar +Viewer|Visualizador +Waiting Input...|Esperando a Entrada dos Dados... +Width|Largura +Window Resolution|Resolução da Janela +Windows SPTI Driver|Driver SPTI do Windows +Word|Palavra +Word Write|Gravação das Palavras +Write|Gravar +Yabause Cheat Files (*.yct);;All Files (*)|Arquivos das Trapaças do Yabause (*.yct);;Todos os Arquivos (*) +Yabause Qt GUI|GUI Qt do Yabause +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Gui Qt do Yabause
Baseada no Yabause %1
http://yabause.org
O Time do Yabause
Filipe AZEVEDO +Yabause Save State (*.yss)|Save State do Yabause (*.yss) +Yabause is not initialized, can't manage backup ram.|O Yabause não está inicializado, não pode gerenciar a ram do backup. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Barra de Ferramentas diff --git a/win_template/trans/yabause_ru.yts b/win_template/trans/yabause_ru.yts new file mode 100644 index 0000000000..a3f022eda8 --- /dev/null +++ b/win_template/trans/yabause_ru.yts @@ -0,0 +1,373 @@ +%1 Images (*.%2)|%1 Образы (*.%2) +%1/%2 blocks free|%1/%2 свободных блоков +&About...|&Об эмуляторе... +&Action Replay|&Взломщик кодов +&Backup Manager...|Управление &резервными копиями... +&Browse|&Открыть +&Cancel|&Отмена +&Capture Screen|&Сделать снимок экрана +&Cheat List|Список &читов +&Cheats|&Читы +&Cheats List...|Список чи&тов... +&Clear|&Очистить +&Close|&Закрыть +&Debug|&Отладка +&Delete|&Удалить +&Emulation|&Эмуляция +&File|&Файл +&Frame Skip/Limiter|&Пропуск/ограничитель кадров +&Fullscreen|&На весь экран +&Help|&Помощь +&Layer|&Слой +&Load From File|&Загрузить из файла +&Log|&Журнал +&Master SH2|&Master SH2 +&Memory Transfer|Перенести &память +&OK|&ОК +&Pause|&Остановить +&Quit|&Выход +&Raw Memory Address|&Прямой адрес памяти +&Reset|&Сброс +&Save To File|&Сохранить в файл +&Settings...|&Настройка... +&Slave SH2|&Slave SH2 +&Tools|&Инструменты +&Transfer|&Перенести +&View|&Вид +16 Mbit Backup Ram|16 Мбит резервная RAM +16 Mbit ROM|16 Мбит ROM +16-bit|16-бит +16-bit Relative value(s)|16-битные относительные значения +32 Mbit Backup Ram|32 Мбит резервная RAM +32 Mbit Dram|32 Мбит DRAM +32-bit|32-бит +3D Control Pad|3D Контроллер +4 Mbit Backup Ram|4 Мбит резервная RAM +503/512 blocks free|503/512 свободных блоков +510/512 blocks free|510/512 свободных блоков +8 Mbit Backup Ram|8 Мбит резервная RAM +8 Mbit Dram|8 Мбит DRAM +8-bit|8-бит +8-bit Relative value(s)|8-битные относительные значения +WARNING: Master Codes are NOT supported.|ВНИМАНИЕ: Мастер кодов НЕ поддерживается. +About...|Об эмуляторе... +Action Replay Code :|Код взломщика кодов +Add|Добавить +Add Action Replay Code|Добавить код во взломщик кодов +Add Cheat|Добавить чит +Add Codes...|Добавить коды... +Add Raw Memory Code|Добавить код в память +Address|Адрес +Address :|Адрес : +Advanced|Дополнительно +Always|Всегда +Are you sure you want to delete '%1' ?|Вы уверены, что хотите удалить '%1' ? +Are you sure you want to format '%1' ?|Вы уверены, что хотите форматировать '%1' ? +Asia (NTSC)|Азия (NTSC) +Asia (PAL)|Азия (PAL) +Auto-detect|Автоопределение +Autostart|Автозапуск +Awaiting input for|Ожидание ввода для +Axis|Оси +Backtrace|Отслеживание +Backup Ram Manager|Управление резервной памятью +Binary Files (*.bin)|Двочиные файлы (*.bin) +Bios|Биос +Block Size :|Размер блока: +Browse|Открыть +Byte|Байт +Byte Write|Запись байт +CD Images (*.iso *.cue *.bin)|Образы CD (*.iso *.cue *.bin) +Cancel|Отмена +Cannot initialize|Невозможно запустить +Cannot initialize Windows SPTI Driver|Невозможно запустить драйвер Windows SPTI +Cart/Memory|Картридж/Память +Cartridge|Картридж +Cd-Rom|CD-ROM +Central/South America (NTSC)|Центальная/Южная Америка (NTSC) +Central/South America (PAL)|Центальная/Южная Америка (PAL) +Cheat &Search...|&Поиск читов... +Cheat Search|Поиск читов... +Cheat Type|Тип чита +Cheats|Читы +Cheats File|Файл читов +Choose a binary file|Выбрать двоичный файл +Choose a cartridge file|Выбрать файл картриджа +Choose a cdrom drive/mount point|Выбрать точку монтирования/CD-ROM +Choose a cheat file to open|Выбрать файл чита для открытия +Choose a cheat file to save to|Выбрать файл чита для сохранения в +Choose a file to save your state|Выбрать файл для загрузки состояния +Choose a location for binary file|Выбрать папку для двоичного файла +Choose a location for your screenshot|Выбрать папку для скриншота +Choose a memory file|Выбрать файл памяти +Choose a mpeg rom|Выбрать MPEG ROM +Clear configuration|Очистить конфигурацию +Close|Закрыть +Code|Код +Code Breakpoints|Точки останова кода +Comment :|Комментарий : +Common Control Registers|Регистры общего управления +Compare Type|Сравнить тип +DSP Control Registers|DSP регистры управления +DSP Registers|DSP регистры +Data Size|Размер данных +Data Size :|Размер данных : +Data Type|Тип данных +Debug CPU|Отладка ЦПУ +Debug M68K|Отладка M68K +Debug Master SH2|Отладка Master SH2 +Debug SCU DSP|Отладка SCU DSP +Debug Slave SH2|Отладка Slave SH2 +Debug VDP1|Отладка VDP1 +Debug VDP2Viewer|Отладка просмотрщика VDP2 +Del|Удалить +Delete|Удалить +Description|Описание +Description :|Описание : +Device List|Список устройств +DirectX Input Interface|Интерфейс ввода DirectX +DirectX Sound Interface|Интерфейс звука DirectX +Disabled|Отключено +Disassembled Code|Дизассемблированный код +Display Enabled|Дисплей включен +Display on Hover|Показывать при наведении +Down|Вниз +Download|Скачать +Draw End|Конец отрисовки +Dummy CD Drive|Фиктивный привод CD +Dummy Input Interface|Фиктивный интерфейс ввода +Dummy OSD Interface|Фиктивный OSD интерфейс +Dummy Sound Interface|Фиктивный аудиоинтерфейс +Dummy Video Interface|Фиктивный видеоинтерфейс +Edit configuration|Изменить конфигурацию +Emu-Compatibility|Совместимость эмулятора +Emulation|Эмуляция +Enable|Включить +Enable Frame Skip/Limiter|Включить пропуск/ограничитель кадров +Enabled|Включено +End Address:|Конечный адрес: +English|Английский +Enter New Value|Ввод нового значения +Europe + others (PAL)|Европа + другие (PAL) +Exact|Ровно +FPS|Кадров в секунду +File|Файл +File Name :|Имя файла : +File transfer|Перенос файла +File:|Файл: +Format|Формат +Frame Skip/Limiter|Пропуск/ограничитель кадров +French|Французский +From|Из +From File|Из файла +From File...|Из файла... +Fullscreen|На весь экран +Fullscreen Resolution|Разрешение полного экрана +General|Общее +General Info|Общая информация +German|Немецкий +Glut OSD Interface|Glut ODS интерфейс +Goto Address|Перейти по адресу +Greater then|Больше, чем +Hard Reset|Перезапуск +Height|Высота +Hex value(s)|Шестнадцатиричное значение +Hide Menubar|Спрятать панель меню +Hide Toolbar|Спрятать панель инструментов +ISO-File Virtual Drive|Виртуальный привод ISO файлов +Information...|Информация... +Input|Ввод +Invalid Address|Неправильный адрес +Invalid Value|Неправильное значение +Italian|Итальянский +Japan (NTSC)|Япония (NTSC) +Japanese|Японский +Japanese Modem|Модем Япония +Korea (NTSC)|Корея (NTSC) +L&oad State|Загрузить &состояние +Language :|Язык : +Layer|Слой +Left|Налево +Left trigger|Левый триггер +Less than|Меньше, чем +Linux CD Drive|Привод CD Linux +Load|Загрузить +Load State|Загрузить состояние +Load State As|Загрузить состояние как +Load as executable|Загрузить на выполнение +Local Coordinates|Местные координаты +Log|Журнал +Long|Длинный +Long Write|Длинное слово +Loop Track Clear|Очистить отслеживание циклов +Loop Track Start|Начать отслеживание циклов +M68K|M68K +M68K Registers|Регистры M68K +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Память +Memory &Editor|&Редактор памяти +Memory Breakpoints|Точки останова памяти +Memory Dump|Образ памяти +Memory Editor|Редактор памяти +Memory Search|Поиск памяти +Memory Transfer|Перенос памяти +Memory dump|Образ памяти +Middle|Средний +Mouse|Мышь +Mouse Configuration|Конфигурация мыши +Mpeg ROM|MPEG ROM +NBG0|NBG0 +NBG0/RBG1 Info|Информация о NBG0/RBG1 +NBG1|NBG1 +NBG1 Info|Информация о NBG1 +NBG2|NBG2 +NBG2 Info|Информация о NBG2 +NBG3|NBG3 +NBG3 Info|Информация о NBG3 +Netlink|Netlink +Never|Никогда +None|Нет +Normal Sprite|Обычные спрайты +North America (NTSC)|Северная Америка (NTSC) +OSD Core|Движок OSD +Ok|ОК +On fullscreen|При полном экране +On message|При сообщении +Open &CD Rom...|Открыть &CD ROM +Open &ISO...|Открыть &ISO... +Open CD Rom|Открыть CD ROM +OpenGL Video Interface|Видеоинтерфейс OpenGL +Options|Опции +Other Debug|Другая отладка +Pad|Джойстик +Pad Configuration|Конфигурация джойстика +Pause|Остановить +Press Esc key to cancel|Нажмите клавишу Esc для отмены +Pro Action Replay|Взломщик кодов Pro +Qt Keyboard Input Interface|Интерфейс клавиатуры ввода Qt +Quit|Выход +R&un|З&апуск +RBG0|RBG0 +RBG0 Info|Информация о RBG0 +Read|Прочесть +Region|Регион +Registers|Регистры +Reset|Сбросить +Resolution|Разрешение +Right|Направо +Right trigger|Правый триггер +Run|Выполнить +S&ave State|&Сохранить состояние +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL интерфейс джойстика +SDL Sound Interface|SDL интерфейс звука +SH2 Debugger Interpreter|Интерпретатор отладки SH2 +SH2 Dynamic Recompiler|Динамический рекомпилятор SH2 +SH2 Interpreter|Интерпретатор SH2 +SH2 Registers|Регистры SH2 +SSH2|SSH2 +Save|Сохранить +Save As WAV|Сохранить как WAV +Save Bitmap|Сохранить карту битов +Save Information|Сохранить информацию +Save List|Сохранить список +Save MD0|Сохранить MD0 +Save MD1|Сохранить MD1 +Save MD2|Сохранить MD2 +Save MD3|Сохранить MD3 +Save Program|Сохранить программу +Save Selected|Сохранить выбранное +Save Slot Registers|Сохранить регистры слота +Save State|Сохранить состояние +Save State As|Сохранить состояние как +Save States|Сохранить состояния +Sc&reenshot|&Скриншот +Screen Enabled|Экран включен +Screenshot|Скриншот +Search|Поиск +Search Criteria|Критерий поиска +Search Memory|Поиск в памяти +Search Value:|Значение поиска: +Search/Add Cheats|Искать/добавить читы +Select a file to load your state|Выбрать файл для загрузки состояния +Select your iso/cue/bin file|Выбрать ваш файл iso/cue/bin +Set PC to Start Address|Настроить ПК на старт адреса +Settings|Конфигурация +Shortcuts|Горячие клавиши +Show FPS|Показывать кадры в секунду +Show Log Window|Показывать окно журнала +Signed|Назначено +Signed 16-bit value|16-бит назначенное значение +Signed 32-bit value|32бит назначенное значение +Signed 8-bit value|8-бит назначенное значение +Slave SH2|Slave SH2 +Slot Info|Информация слота +Slot Number:|Номер слота: +Software OSD Interface|Программный интерфейс OSD +Software Video Interface|Программный интерфейс видео +Sound|Звук +Sound Core|Движок звука +Spanish|Испанский +Start|Запустить +Start Address:|Начальный адрес: +Start in Fullscreen|Запустить на весь экран +Status|Статус +Step Into|Шаг в +Step Out|Шаг из +Step Over|Шаг через +Store|Запомнить +Synchronize Saturn internal clock with set time|Синхронизировать внутреннее время Saturn с системным временем +System Clipping Coordinates|Координаты системного отсечения +Text|Текст +Texture|Текстура +To|В +To File...|В файл... +Tools|Инструменты +Track Inf Loop Results|Результаты отслеживания бесконечных циклов +Transfer|Перенос +Translation|Перевод +Type:|Тип: +Unable to add code|Нет возможности добавить код +Unable to change description|Нет возможности изменить описание +Unable to open file for loading|Нет возможности открыть файл для загрузки +Unable to open file for saving|Нет возможности открыть файл для сохранения +Unable to remove code|Нет возможности удалить код +Unknow (%1)|Неизвестно (%1) +Unsigned|Неназначено +Unsigned 16-bit value|16-бит неназначенное значение +Unsigned 32-bit value|32-бит неназначенное значение +Unsigned 8-bit value|8-бит неназначенное значение +Up|Вверх +Upload|Загрузить +Use System Locale|Использовать язык системы +VDP1|VDP1 +VDP1 Command Info|VDP1 данные команд +VDP1 Command List|VDP1 список команд +VDP2|Vdp2 +Value|Значение +Value :|Значение : +Value:|Значение: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Видео +Video Core|Движок видео +Video Driver|Драйвер видео +Video Format|Формат видео +View|Вид +Viewer|Просмотрщик +Waiting Input...|Ожидание ввода... +Width|Ширина +Window Resolution|Разрешение окна +Windows SPTI Driver|Драйвер Windows SPTI +Word Write|Записать слово +Write|Записать +Yabause Cheat Files (*.yct);;All Files (*)|Файлы читов Yabause (*.yct);;Все файлы (*) +Yabause Qt GUI|Yabause Qt интерфейс +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt интерфейс
Основан на Yabause %1
http://yabause.org
Команда Yabause
Filipe AZEVEDO +Yabause Save State (*.yss)|Сохранение состояния Yabause (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause не запущен, резерная RAM не работает. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Панель инструментов diff --git a/win_template/trans/yabause_sv.yts b/win_template/trans/yabause_sv.yts new file mode 100644 index 0000000000..7185327120 --- /dev/null +++ b/win_template/trans/yabause_sv.yts @@ -0,0 +1,365 @@ +%1 Images (*.%2)|%1 Avbilder (*.%2) +%1/%2 blocks free|%1/%2 block fria +&About...|&Om... +&Action Replay|&Action Replay +&Backup Manager...|&Backup-hantering... +&Browse|&Bläddra +&Cancel|&Avbryt +&Capture Screen|&Skärmdump +&Cheat List|&Lista över fusk +&Cheats|&Fusk +&Cheats List...|&Fusklista... +&Clear|&Rensa +&Close|St&äng +&Debug|%Felsök +&Delete|Ta bo&rt +&Emulation|&Emulering +&File|&Fil +&Frame Skip/Limiter|&Frameskip/-begränsning +&Fullscreen|&Helskärm +&Help|&Hjälp +&Layer|&Lager +&Load From File|Ladda från fil +&Log|&Logg +&Master SH2|&Master SH2 +&Memory Transfer|&Minnesöverföring +&OK|&OK +&Pause|&Paus +&Quit|&Avsluta +&Raw Memory Address|&Rå minnesadress +&Reset|&Reset +&Save To File|&Spara till fil +&Settings...|&Inställningar... +&Slave SH2|&Slav SH2 +&Tools|Verk&tyg +&Transfer|Ö&verföring +&View|&Visa +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16-bit +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32-bit +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 block fria +510/512 blocks free|510/512 block fria +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8-bit +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|VARNING: Master Codes stöds INTE +About...|Om... +Action Replay Code :|Action Replay-kod +Add|Add +Add Action Replay Code|Lägg till en Action Replay-kod +Add Cheat|Lägg till fusk +Add Codes...|Lägg till kod... +Add Raw Memory Code|Lägg till råminneskod +Address|Adress +Address :|Adress : +Advanced|Avancerat +Always|Alltid +Are you sure you want to delete '%1' ?|Är du säker på att du vill ta bort '%1' ? +Are you sure you want to format '%1' ?|Är du säker på att du vill formatera '%1' ? +Asia (NTSC)|Asien (NTSC) +Asia (PAL)|Asien (PAL) +Auto-detect|Auto-detect +Autostart|Autostart +Backtrace|Backtrace +Backup Ram Manager|Backup Ram Manager +Binary Files (*.bin)|Binary Files (*.bin) +Bios|Bios +Block Size :|Blockstorlek +Browse|Bläddra +Byte|Byte +Byte Write|Byteskrivning +CD Images (*.iso *.cue *.bin)|CD-avbild (*.iso *.cue *.bin) +Cancel|Avbryt +Cannot initialize|Kan inte initiera +Cannot initialize Windows SPTI Driver|Kan inte initiera Windows SPTI-drivrutin +Cart/Memory|Kassett/Minne +Cartridge|Kassett +Cd-Rom|CD-ROM +Central/South America (NTSC)|Central-/Sydamerika (NTSC) +Central/South America (PAL)|Central-/Sydamerika (PAL) +Cheat &Search...|&Sök fusk... +Cheat Search|Sök efter fusk +Cheat Type|Typ av fusk +Cheats|Fusk +Cheats File|Fuskfil +Choose a binary file|Choose a binary file +Choose a cdrom drive/mount point|Välj en CD-läsare eller en monteringspunkt +Choose a cheat file to open|Välj fuskfil att öppna +Choose a cheat file to save to|Välj fuskfil att spara till +Choose a file to save your state|Välj en fil att spara ditt läge till +Choose a location for binary file|Choose a location for binary file +Choose a location for your screenshot|Välj plats att spara skärmdump till +Clear configuration|Rensa inställningar +Close|Stäng +Code|Kod +Code Breakpoints|Code Breakpoints +Comment :|Kommentar : +Common Control Registers|Common Control Registers +Compare Type|Jämför typ +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Datastorlek +Data Size :|Datastorlek : +Data Type|Datatyp +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|Del +Delete|Ta bort +Description|Beskrivning +Description :|Beskrivning : +Device List|Lista över enheter +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|Avaktiverad +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Ner +Download|Nedladdning +Draw End|Draw End +Dummy CD Drive|Provisorisk CD-enhet +Dummy Input Interface|Provisoriskt indatagränssnitt +Dummy OSD Interface|Provisoriskt OSD-gränssnitt +Dummy Sound Interface|Provisoriskt ljudgränssnitt +Dummy Video Interface|Provisoriskt videogränssnitt +Edit configuration|Ändra inställningar +Emu-Compatibility|Emu-kompatibilitet +Emulation|Emulering +Enable|Aktivera +Enable Frame Skip/Limiter|Aktivera frameskip/-begränsning +Enabled|Aktiverad +End Address:|Slutadress +English|Engelska +Enter New Value|Enter New Value +Europe + others (PAL)|Europa + övriga (PAL) +Exact|Exakt +FPS|FPS +File|Fil +File Name :|Filnamn : +File transfer|Filöverföring +File:|Fil: +Format|Formatera +Frame Skip/Limiter|Frame Skip/Limiter +French|Franska +From|Från +From File|Från fil +From File...|Från fil... +Fullscreen|Helskärm +Fullscreen Resolution|Fullscreen Resolution +General|Allmänt +General Info|General Info +German|Tyska +Glut OSD Interface|Glut OSD-gränssnitt +Goto Address|Goto Address +Greater then|Större än +Hard Reset|Hård omstart +Height|Höjd +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-fil virtuell enhet +Information...|Information... +Input|Kontroller +Invalid Address|Ogiltig adress +Invalid Value|Ogiltigt värde +Italian|Italienska +Japan (NTSC)|Japan (NTSC) +Japanese|Japanska +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&adda tillstånd +Language :|Språk : +Layer|Lager +Left|Vänster +Left trigger|Vänster avtryckare +Less than|Mindre än +Linux CD Drive|Linux CD-enhet +Load|Ladda +Load State|Ladda läge +Load State As|Ladda läge som +Load as executable|Ladda som exekverbar +Local Coordinates|Local Coordinates +Log|Logg +Long|Long +Long Write|Lång skrivning +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Minne +Memory &Editor|Minnes&editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Minnesdump +Memory Editor|Minnesredigerare +Memory Search|Memory Search +Memory Transfer|Minnesöverföring +Memory dump|Minnesdump +Mouse|Mus +Mpeg ROM|MPEG ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Aldrig +None|Ingen +Normal Sprite|Normal Sprite +North America (NTSC)|Nordamerika (NTSC) +OSD Core|OSD-kärna +Ok|OK +On fullscreen|Helskärm +On message|On message +Open &CD Rom...|Öppna &CD-ROM... +Open &ISO...|Öppna &ISO... +Open CD Rom|Öppna CD-ROM +OpenGL Video Interface|OpenGL-videogränssnitt +Options|Options +Other Debug|Other Debug +Pad|Kontroll +Pad Configuration|Kontrollinställningar +Pause|Paus +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt tangentbordsindatagränssnitt +Quit|Avsluta +R&un|&Kör +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|Reset +Resolution|Upplösning +Right|Höger +Right trigger|Höger avtryckare +Run|Kör +S&ave State|Sp&ara tillstånd +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL joystick-gränssnitt +SDL Sound Interface|SDL ljudgränssnitt +SH2 Debugger Interpreter|SH2 felsökningstolk +SH2 Dynamic Recompiler|SH2 dynamisk omkompilering +SH2 Interpreter|SH2-tolkare +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Spara +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Spara information +Save List|Spara lista +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Spara läge +Save State As|Spara läge som +Save States|Spara lägen +Sc&reenshot|Skä&rmbild +Screen Enabled|Screen Enabled +Screenshot|Skärmdump +Search|Sök +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Sök värde: +Search/Add Cheats|Sök/Lägg till fusk +Select a file to load your state|Välj fil för att ladda ditt läge +Select your iso/cue/bin file|Välj din iso/cue/bin-fil +Set PC to Start Address|Sätt PC till startadress +Settings|Inställningar +Shortcuts|Shortcuts +Show FPS|Visa FPS +Show Log Window|Show Log Window +Signed|Signerad +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|Slav SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Mjukvaru OSD-gränssnitt +Software Video Interface|Mjukvaruvideogränssnitt +Sound|Ljud +Sound Core|Ljudgränssnitt +Spanish|Spanska +Start|Start +Start Address:|Startadress +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Lagra +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|Till +To File...|Till fil... +Tools|Verktyg +Track Inf Loop Results|Track Inf Loop Results +Transfer|Överföring +Translation|Översättning +Type:|Type: +Unable to add code|Kan inte lägga till kod +Unable to change description|Kan inte ändra beskrivning +Unable to open file for loading|Kan inte öppna fil för att ladda +Unable to open file for saving|Kan inte öppna fil för att spara +Unable to remove code|Kan inte ta bort kod +Unknow (%1)|Okänt (%1) +Unsigned|Osignerad +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Upp +Upload|Uppladdning +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Värde +Value :|Värde : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Videogränssnitt +Video Driver|Videodrivrutin +Video Format|Videoformat +View|Visa +Viewer|Viewer +Waiting Input...|Väntar på input... +Width|Bredd +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTI-drivrutin +Word|Word +Word Write|Ordskrivning +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause fuskfil (*.yct);;Alla filer (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt-gränssnitt
Baserat op Yabause %1
http://yabause.org
Yabause-gruppen
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Sparat Läge (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause är inte initierat, kan inte hantera backup-RAM. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|Verktygsfält diff --git a/win_template/trans/yabause_zh_CN.yts b/win_template/trans/yabause_zh_CN.yts new file mode 100644 index 0000000000..482a6b5d1c --- /dev/null +++ b/win_template/trans/yabause_zh_CN.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 镜像 (*.%2) +%1/%2 blocks free|%1/%2 空闲区块 +&About...|关于(&A)... +&Action Replay|金手指(&A) +&Backup Manager...|备份管理器(&B)... +&Browse|浏览(&B) +&Cancel|取消(&C) +&Capture Screen|屏幕捕获(&C) +&Cheat List|作弊列表(&C) +&Cheats|作弊码(&C) +&Cheats List...|作弊列表(&C)... +&Clear|清理(&C) +&Close|关闭(&C) +&Debug|调试(&C) +&Delete|删除(&D) +&Emulation|模拟(&E) +&File|文件(&F) +&Frame Skip/Limiter|跳帧/限帧(&F) +&Fullscreen|全屏(&F) +&Help|帮助(&H) +&Layer|图层(&L) +&Load From File|从文件读取(&L) +&Log|日志(&L) +&Master SH2|主SH2(&M) +&Memory Transfer|内存传输(&M) +&OK|确定(&O) +&Pause|暂停(&P) +&Quit|退出(&Q) +&Raw Memory Address|原始内存地址(&R) +&Reset|重启(&R) +&Save To File|保存到文件(&S) +&Settings...|设置(&S)... +&Slave SH2|次SH2(&S) +&Tools|工具(&T) +&Transfer|传输(&T) +&View|查看(&V) +16 Mbit Backup Ram|16 Mbit备份记忆卡 +16 Mbit ROM|16 Mbit专用游戏卡 +16-bit|16位 +16-bit Relative value(s)|16位相对值 +32 Mbit Backup Ram|32 Mbit备份记忆卡 +32 Mbit Dram|32 Mbit扩张加速卡 +32-bit|32位 +3D Control Pad|3D手柄控制器 +4 Mbit Backup Ram|4 Mbit备份记忆卡 +503/512 blocks free|503/512 空闲区块 +510/512 blocks free|510/512 空闲区块 +8 Mbit Backup Ram|8 Mbit备份记忆卡 +8 Mbit Dram|8 Mbit扩张加速卡 +8-bit|8位 +8-bit Relative value(s)|8位相对值 +WARNING: Master Codes are NOT supported.|警告:主代码支持. +About...|关于... +Action Replay Code :|金手指代码 : +Add|添加 +Add Action Replay Code|添加金手指代码 +Add Cheat|添加作弊码 +Add Codes...|添加代码... +Add Raw Memory Code|添加原始内存代码 +Address|地址 +Address :|地址 : +Advanced|高级 +Always|总是 +Are you sure you want to delete '%1' ?|是否确定删除 '%1' ? +Are you sure you want to format '%1' ?|是否确定格式化 '%1' ? +Asia (NTSC)|亚洲 (NTSC) +Asia (PAL)|亚洲 (PAL) +Auto-detect|自动检测 +Autostart|自动开始 +Awaiting input for|正在等待输入 +Axis|轴 +Backtrace|回溯 +Backup Ram Manager|备份内存管理 +Binary Files (*.bin)|二进制文件 (*.bin) +Bios|BIOS +Block Size :|区块大小 : +Browse|浏览 +Byte|1字节 +Byte Write|1字节写入 +CD Images (*.iso *.cue *.bin)|光盘镜像 (*.iso *.cue *.bin) +Cancel|取消 +Cannot initialize|无法初始化 +Cannot initialize Windows SPTI Driver|无法初始化Windows SPTI驱动器 +Cart/Memory|卡带/内置记忆 +Cartridge|卡带 +Cd-Rom|CD-ROM +Central/South America (NTSC)|中/南美 (NTSC) +Central/South America (PAL)|中/南美 (PAL) +Cheat &Search...|作弊码搜索(&S)... +Cheat Search|作弊码搜索 +Cheat Type|作弊码类型 +Cheats|作弊码 +Cheats File|作弊码文件 +Choose a binary file|选择二进制文件 +Choose a cartridge file|选择卡带文件 +Choose a cdrom drive/mount point|选择光驱/挂载点 +Choose a cheat file to open|选择打开作弊码文件 +Choose a cheat file to save to|选择保存作弊码文件 +Choose a file to save your state|选择保存即时文件 +Choose a location for binary file|选择二进制文件位置 +Choose a location for your screenshot|选择截图位置 +Choose a memory file|选择内置记忆文件 +Choose a mpeg rom|选择MPEG卡内核文件 +Clear configuration|清除配置 +Close|关闭 +Code|代码 +Code Breakpoints|代码断点 +Comment :|注释 : +Common Control Registers|共用控制寄存器 +Compare Type|比较类型 +DSP Control Registers|DSP控制寄存器 +DSP Registers|DSP寄存器 +Data Size|数据大小 +Data Size :|数据大小 : +Data Type|数据类型 +Debug CPU|调试CPU +Debug M68K|调试M68K +Debug Master SH2|调试主SH2 +Debug SCU DSP|调试SCU DSP +Debug Slave SH2|调试次SH2 +Debug VDP1|调试VDP1 +Debug VDP2Viewer|调试VDP2查看器 +Del|删除 +Delete|删除 +Description|描述 +Description :|描述 : +Device List|设备列表 +DirectX Input Interface|DirectX输入接口 +DirectX Sound Interface|DirectX音频接口 +Disabled|已禁用 +Disassembled Code|反汇编代码 +Display Enabled|显示已启用 +Display on Hover|悬浮显示 +Down|下 +Download|下载 +Draw End|绘制结束 +Dummy CD Drive|空光盘驱动器 +Dummy Input Interface|空输入接口 +Dummy OSD Interface|空屏显接口 +Dummy Sound Interface|空音频接口 +Dummy Video Interface|空视频接口 +Edit configuration|编辑配置 +Emu-Compatibility|模拟兼容性 +Emulation|模拟 +Enable|启用 +Enable Frame Skip/Limiter|启用跳帧/限帧 +Enabled|已启用 +End Address:|结束地址: +English|英语 +Enter New Value|输入新值 +Europe + others (PAL)|欧洲 + 其他 (PAL) +Exact|等于 +FPS|帧数 +File|文件 +File Name :|文件名称 : +File transfer|文件传输 +File:|文件: +Format|格式化 +Frame Skip/Limiter|跳帧/限帧 +French|法语 +From|来自 +From File|来自文件 +From File...|来自文件... +Fullscreen|全屏 +Fullscreen Resolution|全屏分辨率 +General|常规 +General Info|常规信息 +German|德语 +Glut OSD Interface|GLUT屏显接口 +Goto Address|跳转地址 +Greater then|大于 +Hard Reset|硬件重启 +Height|高度 +Hex value(s)|十六进制值 +Hide Menubar|隐藏菜单栏 +Hide Toolbar|隐藏工具栏 +ISO-File Virtual Drive|镜像文件虚拟驱动器 +Information...|信息... +Input|输入 +Invalid Address|无效地址 +Invalid Value|无效值 +Italian|意大利语 +Japan (NTSC)|日本 (NTSC) +Japanese|日语 +Japanese Modem|日本调制解调器 +Korea (NTSC)|韩国 (NTSC) +L&oad State|即时读取(&O) +Language :|语言 : +Layer|图层 +Left|左 +Left trigger|左扳机 +Less than|小于 +Linux CD Drive|Linux光盘驱动器 +Load|读取 +Load State|即时读取 +Load State As|即时读取 +Load as executable|可执行文件读取 +Local Coordinates|本地坐标 +Log|日志 +Long|4字节 +Long Write|4字节写入 +Loop Track Clear|清除循环跟踪 +Loop Track Start|开始循环跟踪 +M68K|M68K +M68K Registers|M68K寄存器 +MSH2|MSH2 +Master SH2|主SH2 +Memory|内置记忆 +Memory &Editor|内存编辑(&E) +Memory Breakpoints|内存断点 +Memory Dump|内存转储 +Memory Editor|内存编辑 +Memory Search|内存搜索 +Memory Transfer|内存传输 +Memory dump|内存转储 +Middle|中 +Mouse|鼠标 +Mouse Configuration|鼠标配置 +Mpeg ROM|MPEG电影卡 +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1信息 +NBG1|NBG1 +NBG1 Info|NBG1信息 +NBG2|NBG2 +NBG2 Info|NBG2信息 +NBG3|NBG3 +NBG3 Info|NBG3信息 +Netlink|Netlink网卡 +Never|从不 +None|无 +Normal Sprite|普通活动块 +North America (NTSC)|北美 (NTSC) +OSD Core|屏显核心 +Ok|确定 +On fullscreen|全屏中 +On message|信息中 +Open &CD Rom...|打开光驱(&C)... +Open &ISO...|打开镜像(&I)... +Open CD Rom|打开光驱 +OpenGL Video Interface|OpenGL视频接口 +Options|选项 +Other Debug|其他调试 +Pad|手柄 +Pad Configuration|手柄配置 +Pause|暂停 +Press Esc key to cancel|按Esc键取消 +Pro Action Replay|专用金手指卡 +Qt Keyboard Input Interface|Qt键盘输入接口 +Quit|退出 +R&un|运行(&U) +RBG0|RBG0 +RBG0 Info|RBG0信息 +Read|读取 +Region|区域 +Registers|寄存器 +Reset|重启 +Resolution|分辨率 +Right|右 +Right trigger|右扳机 +Run|运行 +S&ave State|即时保存(&A) +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL摇杆接口 +SDL Sound Interface|SDL音频接口 +SH2 Debugger Interpreter|SH2调试用解释器 +SH2 Dynamic Recompiler|SH2动态重编译器 +SH2 Interpreter|SH2解释器 +SH2 Registers|SH2寄存器 +SSH2|SSH2 +Save|保存 +Save As WAV|保存为WAV +Save Bitmap|保存位图 +Save Information|存档信息 +Save List|存档列表 +Save MD0|保存MD0 +Save MD1|保存MD1 +Save MD2|保存MD2 +Save MD3|保存MD3 +Save Program|保存程序 +Save Selected|保存选定 +Save Slot Registers|保存指令槽寄存器 +Save State|即时保存 +Save State As|即时保存 +Save States|即时保存 +Sc&reenshot|截图(&R) +Screen Enabled|屏幕已启用 +Screenshot|截图 +Search|搜索 +Search Criteria|搜索条件 +Search Memory|搜索内存 +Search Value:|搜索数值: +Search/Add Cheats|搜索/添加作弊码 +Select a file to load your state|选择读取即时文件 +Select your iso/cue/bin file|选择iso/cue/bin文件 +Set PC to Start Address|设置电脑起始地址 +Settings|设置 +Shortcuts|快捷键 +Show FPS|显示帧数 +Show Log Window|显示日志窗口 +Signed|有符号 +Signed 16-bit value|有符号16位数值 +Signed 32-bit value|有符号32位数值 +Signed 8-bit value|有符号8位数值 +Slave SH2|次SH2 +Slot Info|指令槽信息 +Slot Number:|指令槽编号: +Software OSD Interface|软件屏显接口 +Software Video Interface|软件视频接口 +Sound|音频 +Sound Core|音频核心 +Spanish|西班牙语 +Start|开始 +Start Address:|起始地址: +Start in Fullscreen|全屏开始 +Status|状态 +Step Into|步进 +Step Out|步出 +Step Over|步越 +Store|储存 +Synchronize Saturn internal clock with set time|使用设置时间同步土星内部时钟 +System Clipping Coordinates|系统裁剪坐标 +Text|文本 +Texture|纹理 +To|到 +To File...|存到文件... +Tools|工具 +Track Inf Loop Results|跟踪无限循环结果 +Transfer|传输 +Translation|翻译 +Type:|类型: +Unable to add code|无法添加代码 +Unable to change description|无法更改描述 +Unable to open file for loading|无法打开正在读取的文件 +Unable to open file for saving|无法打开正在保存的文件 +Unable to remove code|无法删除代码 +Unknow (%1)|未知 (%1) +Unsigned|无符号 +Unsigned 16-bit value|无符号16位数值 +Unsigned 32-bit value|无符号32位数值 +Unsigned 8-bit value|无符号8位数值 +Up|上 +Upload|上传 +Use System Locale|使用系统语言环境 +VDP1|VDP1 +VDP1 Command Info|VDP1命令信息 +VDP1 Command List|VDP1命令列表 +VDP2|VDP2 +Value|数值 +Value :|数值 : +Value:|数值: +Vdp1|VDP1 +Vdp2|VDP2 +Video|视频 +Video Core|视频核心 +Video Driver|视频驱动程序 +Video Format|视频格式 +View|查看 +Viewer|查看器 +Waiting Input...|正在等待输入... +Width|宽度 +Window Resolution|窗口分辨率 +Windows SPTI Driver|Windows SPTI驱动程序 +Word|2字节 +Word Write|2字节写入 +Write|写入 +Yabause Cheat Files (*.yct);;All Files (*)|Yabause作弊码文件 (*.yct);;所有文件 (*) +Yabause Qt GUI|Yabause Qt界面 +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt界面
基于Yabause %1
http://yabause.org
Yabause团队
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause即时存档 (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause未初始化, 无法管理备份内存. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|工具栏 diff --git a/win_template/trans/yabause_zh_TW.yts b/win_template/trans/yabause_zh_TW.yts new file mode 100644 index 0000000000..d92c13c8ef --- /dev/null +++ b/win_template/trans/yabause_zh_TW.yts @@ -0,0 +1,374 @@ +%1 Images (*.%2)|%1 Images (*.%2) +%1/%2 blocks free|%1/%2 blocks free +&About...|關於(&A)… +&Action Replay|&Action Replay +&Backup Manager...|&Backup Manager... +&Browse|&Browse +&Cancel|取消(&C) +&Capture Screen|補捉畫面(&C) +&Cheat List|&Cheat List +&Cheats|&Cheats +&Cheats List...|&Cheats List... +&Clear|清除(&C) +&Close|關閉(&C) +&Debug|&Debug +&Delete|刪除(&D) +&Emulation|摸擬(&E) +&File|檔案(&F) +&Frame Skip/Limiter|&Frame Skip/Limiter +&Fullscreen|全螢幕(&F) +&Help|幫助(&H) +&Layer|&Layer +&Load From File|&Load From File +&Log|&Log +&Master SH2|&Master SH2 +&Memory Transfer|&Memory Transfer +&OK|確定(&O) +&Pause|暫停(&P) +&Quit|離開(&Q) +&Raw Memory Address|&Raw Memory Address +&Reset|重置(&R) +&Save To File|保存至檔案(&S) +&Settings...|設定…(&S) +&Slave SH2|&Slave SH2 +&Tools|工具(&T) +&Transfer|&Transfer +&View|&View +16 Mbit Backup Ram|16 Mbit Backup Ram +16 Mbit ROM|16 Mbit ROM +16-bit|16位元 +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32 Mbit Backup Ram +32 Mbit Dram|32 Mbit Dram +32-bit|32位元 +3D Control Pad|3D Control Pad +4 Mbit Backup Ram|4 Mbit Backup Ram +503/512 blocks free|503/512 blocks free +510/512 blocks free|510/512 blocks free +8 Mbit Backup Ram|8 Mbit Backup Ram +8 Mbit Dram|8 Mbit Dram +8-bit|8位元 +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|WARNING: Master Codes are NOT supported. +About...|關於… +Action Replay Code :|Action Replay Code : +Add|新增 +Add Action Replay Code|Add Action Replay Code +Add Cheat|Add Cheat +Add Codes...|Add Codes... +Add Raw Memory Code|Add Raw Memory Code +Address|Address +Address :|Address : +Advanced|進階 +Always|Always +Are you sure you want to delete '%1' ?|Are you sure you want to delete '%1' ? +Are you sure you want to format '%1' ?|Are you sure you want to format '%1' ? +Asia (NTSC)|Asia (NTSC) +Asia (PAL)|Asia (PAL) +Auto-detect|自動偵測 +Autostart|自動開始 +Awaiting input for|Awaiting input for +Axis|Axis +Backtrace|Backtrace +Backup Ram Manager|Backup Ram Manager +Binary Files (*.bin)|Binary Files (*.bin) +Bios|Bios +Block Size :|區塊大小: +Browse|Browse +Byte|Byte +Byte Write|Byte Write +CD Images (*.iso *.cue *.bin)|CD Images (*.iso *.cue *.bin) +Cancel|取消 +Cannot initialize|Cannot initialize +Cannot initialize Windows SPTI Driver|Cannot initialize Windows SPTI Driver +Cart/Memory|卡匣/記憶體 +Cartridge|卡匣 +Cd-Rom|Cd-Rom +Central/South America (NTSC)|Central/South America (NTSC) +Central/South America (PAL)|Central/South America (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|Cheat Search +Cheat Type|Cheat Type +Cheats|Cheats +Cheats File|Cheats File +Choose a binary file|Choose a binary file +Choose a cartridge file|Choose a cartridge file +Choose a cdrom drive/mount point|Choose a cdrom drive/mount point +Choose a cheat file to open|Choose a cheat file to open +Choose a cheat file to save to|Choose a cheat file to save to +Choose a file to save your state|Choose a file to save your state +Choose a location for binary file|Choose a location for binary file +Choose a location for your screenshot|Choose a location for your screenshot +Choose a memory file|Choose a memory file +Choose a mpeg rom|Choose a mpeg rom +Clear configuration|Clear configuration +Close|關閉 +Code|Code +Code Breakpoints|Code Breakpoints +Comment :|Comment : +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|Data Size +Data Size :|Data Size : +Data Type|Data Type +Debug CPU|Debug CPU +Debug M68K|Debug M68K +Debug Master SH2|Debug Master SH2 +Debug SCU DSP|Debug SCU DSP +Debug Slave SH2|Debug Slave SH2 +Debug VDP1|Debug VDP1 +Debug VDP2Viewer|Debug VDP2Viewer +Del|刪除 +Delete|刪除 +Description|描述 +Description :|描述: +Device List|裝置列表 +DirectX Input Interface|DirectX Input Interface +DirectX Sound Interface|DirectX Sound Interface +Disabled|禁用 +Disassembled Code|Disassembled Code +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Down +Download|Download +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|編輯配置 +Emu-Compatibility|模擬相容性 +Emulation|模擬 +Enable|啟動 +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|啟用 +End Address:|終止位址: +English|英語 +Enter New Value|Enter New Value +Europe + others (PAL)|Europe + others (PAL) +Exact|Exact +FPS|FPS +File|檔案 +File Name :|檔案名稱: +File transfer|File transfer +File:|檔案: +Format|格式 +Frame Skip/Limiter|Frame Skip/Limiter +French|法語 +From|From +From File|From File +From File...|From File... +Fullscreen|Fullscreen +Fullscreen Resolution|Fullscreen Resolution +General|General +General Info|一般資訊 +German|German +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|Hard Reset +Height|Height +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Input +Invalid Address|Invalid Address +Invalid Value|Invalid Value +Italian|Italian +Japan (NTSC)|Japan (NTSC) +Japanese|Japanese +Japanese Modem|Japanese Modem +Korea (NTSC)|Korea (NTSC) +L&oad State|L&oad State +Language :|語言: +Layer|Layer +Left|Left +Left trigger|Left trigger +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Load +Load State|Load State +Load State As|Load State As +Load as executable|Load as executable +Local Coordinates|Local Coordinates +Log|Log +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68K Registers +MSH2|MSH2 +Master SH2|Master SH2 +Memory|Memory +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Memory Dump +Memory Editor|Memory Editor +Memory Search|Memory Search +Memory Transfer|Memory Transfer +Memory dump|Memory dump +Middle|Middle +Mouse|滑鼠 +Mouse Configuration|滑鼠配置 +Mpeg ROM|Mpeg ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|None +Normal Sprite|Normal Sprite +North America (NTSC)|North America (NTSC) +OSD Core|OSD Core +Ok|確定 +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|開起光碟(&C) +Open &ISO...|開起映像檔(&I) +Open CD Rom|開起光碟 +OpenGL Video Interface|OpenGL視訊界面 +Options|Options +Other Debug|Other Debug +Pad|搖桿 +Pad Configuration|搖桿配置 +Pause|暫停 +Press Esc key to cancel|Press Esc key to cancel +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qt Keyboard Input Interface +Quit|離開 +R&un|執行(&R) +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|重置 +Resolution|解析度 +Right|Right +Right trigger|Right trigger +Run|執行 +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDL Joystick Interface +SDL Sound Interface|SDL Sound Interface +SH2 Debugger Interpreter|SH2 Debugger Interpreter +SH2 Dynamic Recompiler|SH2 Dynamic Recompiler +SH2 Interpreter|SH2 Interpreter +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|保存 +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Save Information +Save List|Save List +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Save State +Save State As|Save State As +Save States|Save States +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|畫面快照 +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Select a file to load your state +Select your iso/cue/bin file|Select your iso/cue/bin file +Set PC to Start Address|Set PC to Start Address +Settings|Settings +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|有號16位元值 +Signed 32-bit value|有號32位元值 +Signed 8-bit value|有號8位元值 +Slave SH2|Slave SH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|音效 +Sound Core|音效核心 +Spanish|西語 +Start|開始 +Start Address:|起始位址: +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Store +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|To File... +Tools|Tools +Track Inf Loop Results|Track Inf Loop Results +Transfer|Transfer +Translation|翻譯版 +Type:|Type: +Unable to add code|Unable to add code +Unable to change description|Unable to change description +Unable to open file for loading|Unable to open file for loading +Unable to open file for saving|Unable to open file for saving +Unable to remove code|Unable to remove code +Unknow (%1)|Unknow (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Up +Upload|Upload +Use System Locale|Use System Locale +VDP1|VDP1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|VDP2 +Value|Value +Value :|Value : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Core +Video Driver|Video Driver +Video Format|Video Format +View|View +Viewer|Viewer +Waiting Input...|Waiting Input... +Width|Width +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTI Driver +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Files (*.yct);;All Files (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Save State (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|toolBar diff --git a/yabause/CMake/Packages/FindEGL.cmake b/yabause/CMake/Packages/FindEGL.cmake new file mode 100644 index 0000000000..62feee8ed1 --- /dev/null +++ b/yabause/CMake/Packages/FindEGL.cmake @@ -0,0 +1,29 @@ +FIND_PATH(EGL_INCLUDE_DIR EGL/egl.h + /usr/openwin/share/include + /opt/graphics/OpenGL/include /usr/X11R6/include + /usr/include + /opt/vc/include + ) + +FIND_LIBRARY(EGL_gl_LIBRARY + NAMES EGL + PATHS /opt/graphics/OpenGL/lib + /usr/openwin/lib + /usr/shlib /usr/X11R6/lib + /usr/lib + /opt/vc/lib + ) + +SET( EGL_FOUND "NO" ) +IF(EGL_gl_LIBRARY) + + SET( EGL_LIBRARIES ${EGL_gl_LIBRARY} ${EGL_LIBRARIES}) + + SET( EGL_FOUND "YES" ) + +ENDIF(EGL_gl_LIBRARY) + +MARK_AS_ADVANCED( + EGL_INCLUDE_DIR + EGL_gl_LIBRARY +) diff --git a/yabause/CMake/Packages/FindOpenGLES.cmake b/yabause/CMake/Packages/FindOpenGLES.cmake new file mode 100644 index 0000000000..ab53d74dc9 --- /dev/null +++ b/yabause/CMake/Packages/FindOpenGLES.cmake @@ -0,0 +1,117 @@ +#snapped from: https://bitbucket.org/sinbad/ogre/src/0bba4f7cdb95/CMake/Packages/FindOpenGLES.cmake?at=default +#------------------------------------------------------------------- +# This file is part of the CMake build system for OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http://www.ogre3d.org/ +# +# The contents of this file are placed in the public domain. Feel +# free to make use of it in any way you like. +#------------------------------------------------------------------- + +# - Try to find OpenGLES +# Once done this will define +# +# OPENGLES_FOUND - system has OpenGLES +# OPENGLES_INCLUDE_DIR - the GL include directory +# OPENGLES_LIBRARIES - Link these to use OpenGLES + +IF (WIN32) + IF (CYGWIN) + + FIND_PATH(OPENGLES_INCLUDE_DIR GLES/gl.h ) + + FIND_LIBRARY(OPENGLES_gl_LIBRARY libgles_cm ) + + ELSE (CYGWIN) + + IF(MSVC) + #The user hast to provide this atm. GLES can be emulated via Desktop OpenGL + #using the ANGLE project found at: http://code.google.com/p/angleproject/ + SET (OPENGLES_gl_LIBRARY import32 CACHE STRING "OpenGL ES 1.x library for win32") + ENDIF(MSVC) + + ENDIF (CYGWIN) + +ELSE (WIN32) + + IF (APPLE) + + create_search_paths(/Developer/Platforms) + findpkg_framework(OpenGLES) + set(OPENGLES_gl_LIBRARY "-framework OpenGLES") + + ELSE(APPLE) + + FIND_PATH(OPENGLES_INCLUDE_DIR GLES/gl.h + /usr/openwin/share/include + /opt/graphics/OpenGL/include /usr/X11R6/include + /usr/include + /opt/vc/include + ) + + FIND_PATH(OPENGLES2_INCLUDE_DIR GLES2/gl2.h + /usr/openwin/share/include + /opt/graphics/OpenGL/include /usr/X11R6/include + /usr/include + /opt/vc/include + ) + + FIND_LIBRARY(OPENGLES_gl_LIBRARY + NAMES GLES_CM GLESv1_CM + PATHS /opt/graphics/OpenGL/lib + /usr/openwin/lib + /usr/shlib /usr/X11R6/lib + /usr/lib + /opt/vc/lib + ) + + FIND_LIBRARY(OPENGLES_gl2_LIBRARY + NAMES GLESv2 + PATHS /opt/graphics/OpenGL/lib + /usr/openwin/lib + /usr/shlib /usr/X11R6/lib + /usr/lib + /opt/vc/lib + ) + + + # On Unix OpenGL most certainly always requires X11. + # Feel free to tighten up these conditions if you don't + # think this is always true. + + IF (OPENGLES_gl_LIBRARY) + IF(NOT X11_FOUND) + INCLUDE(FindX11) + ENDIF(NOT X11_FOUND) + IF (X11_FOUND) + SET (OPENGLES_LIBRARIES ${X11_LIBRARIES}) + ENDIF (X11_FOUND) + ENDIF (OPENGLES_gl_LIBRARY) + + ENDIF(APPLE) +ENDIF (WIN32) + +SET( OPENGLES_FOUND "NO" ) +IF(OPENGLES_gl_LIBRARY) + + SET( OPENGLES_LIBRARIES ${OPENGLES_gl_LIBRARY} ${OPENGLES_LIBRARIES}) + + SET( OPENGLES_FOUND "YES" ) + +ENDIF(OPENGLES_gl_LIBRARY) + +SET( OPENGLES2_FOUND "NO" ) +IF(OPENGLES_gl2_LIBRARY) +SET( OPENGLES2_LIBRARIES ${OPENGLES_gl2_LIBRARY} ${OPENGLES2_LIBRARIES}) + + SET( OPENGLES2_FOUND "YES" ) + +ENDIF(OPENGLES_gl2_LIBRARY) + + +MARK_AS_ADVANCED( + OPENGLES_INCLUDE_DIR + OPENGLES2_INCLUDE_DIR + OPENGLES_gl_LIBRARY + OPENGLES_gl2_LIBRARY +) diff --git a/yabause/CMake/Packages/external_curl.cmake b/yabause/CMake/Packages/external_curl.cmake new file mode 100644 index 0000000000..e8fe132f66 --- /dev/null +++ b/yabause/CMake/Packages/external_curl.cmake @@ -0,0 +1,26 @@ +find_package(CURL) + +if(CURL_FOUND) + message(STATUS "Found CURL") +else() + set(CURL_FLAGS -DBUILD_CURL_EXE=OFF -DBUILD_CURL_TESTS=OFF -DCURL_STATICLIB=ON -DCMAKE_USE_OPENSSL=OFF -DCURL_ZLIB=OFF -DHTTP_ONLY=ON) + include(ExternalProject) + message(STATUS "Could not find libcURL. This dependency will be downloaded.") + ExternalProject_Add( + curl + GIT_REPOSITORY "git://github.com/bagder/curl.git" + GIT_TAG "1b6bc02fb926403f04061721f9159e9887202a96" + PREFIX curl + PATCH_COMMAND ${CURL_PATCH_COMMAND} + CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/curl ${CURL_FLAGS} + ) + + ExternalProject_Get_Property(curl INSTALL_DIR) + set(CURL_INCLUDE_DIR ${INSTALL_DIR}/include) + set(CURL_LIBRARIES + ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}libcurl${CMAKE_STATIC_LIBRARY_SUFFIX}) + message(STATUS "GLFW_LIBRARIES is " ${CURL_LIBRARIES} ) + + include_directories( ${CURL_INCLUDE_DIR} ) + +endif() diff --git a/yabause/CMake/Packages/external_libchdr.cmake b/yabause/CMake/Packages/external_libchdr.cmake new file mode 100644 index 0000000000..ee8255674c --- /dev/null +++ b/yabause/CMake/Packages/external_libchdr.cmake @@ -0,0 +1,77 @@ +include(ExternalProject) +message(STATUS "Could not find libchdr. This dependency will be downloaded.") + +#find_package(Git) +#message("Git found: ${GIT_EXECUTABLE}") + +if(ANDROID) +get_filename_component(TOOL_CHAIN_ABSOLUTE_PATH "${CMAKE_TOOLCHAIN_FILE}" + REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + +set( ADDITIONAL_CMAKE_ARGS + -DANDROID_ABI=${ANDROID_ABI} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} + -DCMAKE_TOOLCHAIN_FILE=${TOOL_CHAIN_ABSOLUTE_PATH} +) + +elseif(IOS) + + get_filename_component(TOOL_CHAIN_ABSOLUTE_PATH "${CMAKE_TOOLCHAIN_FILE}" + REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + set( ADDITIONAL_CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${TOOL_CHAIN_ABSOLUTE_PATH} + -DPLATFORM=${PLATFORM} + ) + +else() + set(ADDITIONAL_CMAKE_ARGS "") +endif() + +ExternalProject_Add( + libchdr + GIT_REPOSITORY "https://github.com/devmiyax/libchdr.git" + GIT_TAG "5a642352731a5abb1322bf0749b0e1822ebb393a" + #PATCH_COMMAND git apply "${CMAKE_SOURCE_DIR}/CMake/Packages/libchdr.patch" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/libchdr + -DCMAKE_BUILD_TYPE:STRING=Release + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + ${ADDITIONAL_CMAKE_ARGS} +) + +ExternalProject_Get_Property(libchdr SOURCE_DIR) +ExternalProject_Get_Property(libchdr BINARY_DIR) +set(LIBCHDR_INCLUDE_DIR ${SOURCE_DIR}/include/libchdr ${SOURCE_DIR}/include ) + +if(WIN32) +set(LIBCHDR_LIBRARIES + ${BINARY_DIR}/$/${CMAKE_STATIC_LIBRARY_PREFIX}chdr-static${CMAKE_STATIC_LIBRARY_SUFFIX} + #${BINARY_DIR}/$/${CMAKE_STATIC_LIBRARY_PREFIX}flac-static${CMAKE_STATIC_LIBRARY_SUFFIX} + #${BINARY_DIR}/$/${CMAKE_STATIC_LIBRARY_PREFIX}crypto-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/deps/lzma-24.05/$/${CMAKE_STATIC_LIBRARY_PREFIX}lzma${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/deps/zstd-1.5.6/build/cmake/lib/$/${CMAKE_STATIC_LIBRARY_PREFIX}zstd_static${CMAKE_STATIC_LIBRARY_SUFFIX} +) +set( LIBCHDR_LIB_DIR ${BINARY_DIR} ) +elseif(ANDROID) +set(LIBCHDR_LIBRARIES + ${CMAKE_STATIC_LIBRARY_PREFIX}chdr-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${CMAKE_STATIC_LIBRARY_PREFIX}lzma${CMAKE_STATIC_LIBRARY_SUFFIX} + ${CMAKE_STATIC_LIBRARY_PREFIX}zstd${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + set( LIBCHDR_LIB_DIR ${BINARY_DIR} ${BINARY_DIR}/deps/zstd-1.5.6/build/cmake/lib/ ${BINARY_DIR}/deps/lzma-24.05/ ) +else() +set(LIBCHDR_LIBRARIES + ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}chdr-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}flac-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}crypto-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}lzma-static${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/deps/zstd-1.5.6/build/cmake/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zstd${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + set( LIBCHDR_LIB_DIR ${BINARY_DIR} ) +endif() + +message(STATUS "LIBCHDR_LIBRARIES is " ${LIBCHDR_LIBRARIES} ) +message(STATUS "LIBCHDR_INCLUDE_DIR is " ${LIBCHDR_INCLUDE_DIR} ) + +include_directories( ${LIBCHDR_INCLUDE_DIR} ) diff --git a/yabause/CMake/Packages/external_libpng.cmake b/yabause/CMake/Packages/external_libpng.cmake new file mode 100644 index 0000000000..eb73090ab3 --- /dev/null +++ b/yabause/CMake/Packages/external_libpng.cmake @@ -0,0 +1,75 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +include (ExternalProject) + +message(STATUS "libpng not found - will build from source") + +set(png_URL https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz) +set(png_HASH SHA256=daeb2620d829575513e35fecc83f0d3791a620b9b93d800b763542ece9390fb4) +set(png_BUILD ${CMAKE_CURRENT_BINARY_DIR}/png/src/png) +set(png_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/png/install) +set(png_INCLUDE_DIR ${png_INSTALL}/include) + +if(WIN32) + set(png_STATIC_LIBRARIES + debug ${CMAKE_CURRENT_BINARY_DIR}/png/install/lib/libpng16_staticd.lib + optimized ${CMAKE_CURRENT_BINARY_DIR}/png/install/lib/libpng16_static.lib) +else() + set(png_STATIC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/png/install/lib/libpng16.a) +endif() + +set(png_HEADERS + "${png_INSTALL}/include/libpng16/png.h" + "${png_INSTALL}/include/libpng16/pngconf.h" +) + +if(ANDROID) +get_filename_component(TOOL_CHAIN_ABSOLUTE_PATH "${CMAKE_TOOLCHAIN_FILE}" + REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + +set( ADDITIONAL_CMAKE_ARGS + -DANDROID_ABI=${ANDROID_ABI} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} + -DCMAKE_TOOLCHAIN_FILE=${TOOL_CHAIN_ABSOLUTE_PATH} +) + +else() + set(ADDITIONAL_CMAKE_ARGS "") +endif() + + +ExternalProject_Add( + png + PREFIX png + DEPENDS zlib + URL ${png_URL} + URL_HASH ${png_HASH} + INSTALL_DIR ${png_INSTALL} + DOWNLOAD_DIR "${DOWNLOAD_LOCATION}" + CMAKE_ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + -DCMAKE_BUILD_TYPE:STRING=Release + -DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF + -DCMAKE_INSTALL_PREFIX:STRING=${png_INSTALL} + -DZLIB_ROOT:STRING=${ZLIB_INSTALL} + -DPNG_NO_STDIO:BOOL=OFF + -DPNG_SHARED:BOOL=OFF + #-DCMAKE_C_FLAGS=-DPNG_SETJMP_SUPPORTED + ${ADDITIONAL_CMAKE_ARGS} +) +set( LIBPNG_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/png/install/lib/ ) + + diff --git a/yabause/CMake/Packages/external_zlib.cmake b/yabause/CMake/Packages/external_zlib.cmake new file mode 100644 index 0000000000..7f14ad7a62 --- /dev/null +++ b/yabause/CMake/Packages/external_zlib.cmake @@ -0,0 +1,90 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +include (ExternalProject) + +set(zlib_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/include) +set(ZLIB_URL https://github.com/madler/zlib) +set(ZLIB_BUILD ${CMAKE_CURRENT_BINARY_DIR}/zlib/src/zlib) +set(ZLIB_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/zlib/install) +set(ZLIB_TAG 9f0f2d4f9f1f28be7e16d8bf3b4e9d4ada70aa9f) + +if(WIN32) + set(zlib_STATIC_LIBRARIES + debug ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/zlibstaticd.lib + optimized ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/zlibstatic.lib) +else() + set(zlib_STATIC_LIBRARIES + ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/libz.a) +endif() + +if(ANDROID) +get_filename_component(TOOL_CHAIN_ABSOLUTE_PATH "${CMAKE_TOOLCHAIN_FILE}" + REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + +set( ADDITIONAL_CMAKE_ARGS + -DANDROID_ABI=${ANDROID_ABI} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} + -DCMAKE_TOOLCHAIN_FILE=${TOOL_CHAIN_ABSOLUTE_PATH} +) + +elseif(IOS) + + get_filename_component(TOOL_CHAIN_ABSOLUTE_PATH "${CMAKE_TOOLCHAIN_FILE}" + REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + set( ADDITIONAL_CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${TOOL_CHAIN_ABSOLUTE_PATH} + -DPLATFORM=${PLATFORM} + ) + +else() + set(ADDITIONAL_CMAKE_ARGS "") +endif() + +set(ZLIB_HEADERS + "${ZLIB_INSTALL}/include/zconf.h" + "${ZLIB_INSTALL}/include/zlib.h" +) + +ExternalProject_Add( + zlib + PREFIX zlib + GIT_REPOSITORY ${ZLIB_URL} + GIT_TAG ${ZLIB_TAG} + INSTALL_DIR ${ZLIB_INSTALL} + BUILD_IN_SOURCE 1 + DOWNLOAD_DIR "${DOWNLOAD_LOCATION}" + CMAKE_ARGS + -DZLIB_BUILD_EXAMPLES=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + -DCMAKE_BUILD_TYPE:STRING=Release + -DCMAKE_INSTALL_PREFIX:STRING=${ZLIB_INSTALL} + ${ADDITIONAL_CMAKE_ARGS} +) + +set( LIBZ_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/ ) + +# put zlib includes in the directory where they are expected +add_custom_target(zlib_create_destination_dir + COMMAND ${CMAKE_COMMAND} -E make_directory ${zlib_INCLUDE_DIR} + DEPENDS zlib) + +add_custom_target(zlib_copy_headers_to_destination + DEPENDS zlib_create_destination_dir) + +foreach(header_file ${ZLIB_HEADERS}) + add_custom_command(TARGET zlib_copy_headers_to_destination PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${header_file} ${zlib_INCLUDE_DIR}) +endforeach() \ No newline at end of file diff --git a/yabause/CMake/Packages/libchdr.patch b/yabause/CMake/Packages/libchdr.patch new file mode 100644 index 0000000000..5ff2095aef --- /dev/null +++ b/yabause/CMake/Packages/libchdr.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 34df19c..b9de994 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -116,7 +116,7 @@ list(APPEND CHDR_LIBS lzma-static) + # zlib + add_subdirectory(deps/zlib-1.2.11 EXCLUDE_FROM_ALL) + list(APPEND CHDR_INCLUDES deps/zlib-1.2.11 ${CMAKE_CURRENT_BINARY_DIR}/deps/zlib-1.2.11) +-list(APPEND CHDR_LIBS zlibstatic) ++#list(APPEND CHDR_LIBS zlibstatic) + + #-------------------------------------------------- + # chdr diff --git a/yabause/CMake/Utils/FindPkgMacros.cmake b/yabause/CMake/Utils/FindPkgMacros.cmake new file mode 100644 index 0000000000..a6f0aaae57 --- /dev/null +++ b/yabause/CMake/Utils/FindPkgMacros.cmake @@ -0,0 +1,164 @@ +#snapped from: https://bitbucket.org/sinbad/ogre/src/0bba4f7cdb95/CMake/Utils/FindPkgMacros.cmake?at=default +#------------------------------------------------------------------- +# This file is part of the CMake build system for OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http://www.ogre3d.org/ +# +# The contents of this file are placed in the public domain. Feel +# free to make use of it in any way you like. +#------------------------------------------------------------------- + +################################################################## +# Provides some common functionality for the FindPackage modules +################################################################## + +# Begin processing of package +macro(findpkg_begin PREFIX) + if (NOT ${PREFIX}_FIND_QUIETLY) + message(STATUS "Looking for ${PREFIX}...") + endif () +endmacro(findpkg_begin) + +# Display a status message unless FIND_QUIETLY is set +macro(pkg_message PREFIX) + if (NOT ${PREFIX}_FIND_QUIETLY) + message(STATUS ${ARGN}) + endif () +endmacro(pkg_message) + +# Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes +macro(getenv_path VAR) + set(ENV_${VAR} $ENV{${VAR}}) + # replace won't work if var is blank + if (ENV_${VAR}) + string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) + endif () +endmacro(getenv_path) + +# Construct search paths for includes and libraries from a PREFIX_PATH +macro(create_search_paths PREFIX) + foreach(dir ${${PREFIX}_PREFIX_PATH}) + set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} + ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers) + set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} + ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs) + set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH} + ${dir}/bin) + endforeach(dir) + if(ANDROID) + set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${OGRE_DEPENDENCIES_DIR}/lib/${ANDROID_ABI}) + endif() + set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) +endmacro(create_search_paths) + +# clear cache variables if a certain variable changed +macro(clear_if_changed TESTVAR) + # test against internal check variable + # HACK: Apparently, adding a variable to the cache cleans up the list + # a bit. We need to also remove any empty strings from the list, but + # at the same time ensure that we are actually dealing with a list. + list(APPEND ${TESTVAR} "") + list(REMOVE_ITEM ${TESTVAR} "") + if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") + message(STATUS "${TESTVAR} changed.") + foreach(var ${ARGN}) + set(${var} "NOTFOUND" CACHE STRING "x" FORCE) + endforeach(var) + endif () + set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE) +endmacro(clear_if_changed) + +# Try to get some hints from pkg-config, if available +macro(use_pkgconfig PREFIX PKGNAME) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${PREFIX} ${PKGNAME}) + endif () +endmacro (use_pkgconfig) + +# Couple a set of release AND debug libraries (or frameworks) +macro(make_library_set PREFIX) + if (${PREFIX}_FWK) + set(${PREFIX} ${${PREFIX}_FWK}) + elseif (${PREFIX}_REL AND ${PREFIX}_DBG) + set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG}) + elseif (${PREFIX}_REL) + set(${PREFIX} ${${PREFIX}_REL}) + elseif (${PREFIX}_DBG) + set(${PREFIX} ${${PREFIX}_DBG}) + endif () +endmacro(make_library_set) + +# Generate debug names from given release names +macro(get_debug_names PREFIX) + foreach(i ${${PREFIX}}) + set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i}) + endforeach(i) +endmacro(get_debug_names) + +# Add the parent dir from DIR to VAR +macro(add_parent_dir VAR DIR) + get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE) + set(${VAR} ${${VAR}} ${${DIR}_TEMP}) +endmacro(add_parent_dir) + +# Do the final processing for the package find. +macro(findpkg_finish PREFIX) + # skip if already processed during this run + if (NOT ${PREFIX}_FOUND) + if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) + set(${PREFIX}_FOUND TRUE) + set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) + set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) + if (NOT ${PREFIX}_FIND_QUIETLY) + message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}") + endif () + else () + if (NOT ${PREFIX}_FIND_QUIETLY) + message(STATUS "Could not locate ${PREFIX}") + endif () + if (${PREFIX}_FIND_REQUIRED) + message(FATAL_ERROR "Required library ${PREFIX} not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.") + endif () + endif () + + mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK) + endif () +endmacro(findpkg_finish) + + +# Slightly customised framework finder +macro(findpkg_framework fwk) + if(APPLE) + set(${fwk}_FRAMEWORK_PATH + ${${fwk}_FRAMEWORK_SEARCH_PATH} + ${CMAKE_FRAMEWORK_PATH} + ~/Library/Frameworks + /Library/Frameworks + /System/Library/Frameworks + /Network/Library/Frameworks + ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Release + ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Debug + ) + # These could be arrays of paths, add each individually to the search paths + foreach(i ${OGRE_PREFIX_PATH}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) + endforeach(i) + + foreach(i ${OGRE_PREFIX_BUILD}) + set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) + endforeach(i) + + foreach(dir ${${fwk}_FRAMEWORK_PATH}) + set(fwkpath ${dir}/${fwk}.framework) + if(EXISTS ${fwkpath}) + set(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES} + ${fwkpath}/Headers ${fwkpath}/PrivateHeaders) + set(${fwk}_FRAMEWORK_PATH ${dir}) + if (NOT ${fwk}_LIBRARY_FWK) + set(${fwk}_LIBRARY_FWK "-framework ${fwk}") + endif () + endif(EXISTS ${fwkpath}) + endforeach(dir) + endif(APPLE) +endmacro(findpkg_framework) \ No newline at end of file diff --git a/yabause/CMake/Utils/GetGitRevisionDescription.cmake b/yabause/CMake/Utils/GetGitRevisionDescription.cmake new file mode 100644 index 0000000000..8ab03bc5f0 --- /dev/null +++ b/yabause/CMake/Utils/GetGitRevisionDescription.cmake @@ -0,0 +1,168 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# git_local_changes() +# +# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. +# Uses the return code of "git diff-index --quiet HEAD --". +# Does not regard untracked files. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_local_changes _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + diff-index --quiet HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(res EQUAL 0) + set(${_var} "CLEAN" PARENT_SCOPE) + else() + set(${_var} "DIRTY" PARENT_SCOPE) + endif() +endfunction() diff --git a/yabause/CMake/Utils/GetGitRevisionDescription.cmake.in b/yabause/CMake/Utils/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000000..6d8b708efe --- /dev/null +++ b/yabause/CMake/Utils/GetGitRevisionDescription.cmake.in @@ -0,0 +1,41 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/yabause/CMakeLists.txt b/yabause/CMakeLists.txt index 65f2379a6f..bbdaec2cfd 100644 --- a/yabause/CMakeLists.txt +++ b/yabause/CMakeLists.txt @@ -1,20 +1,32 @@ -project(yabause) +project(YabaSanshiro) cmake_minimum_required(VERSION 2.8) +#------------------------------------------------------------------------------- +#add local find scripts to CMAKE path +LIST(APPEND CMAKE_MODULE_PATH + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/Utils + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/Packages +) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + set(YAB_PACKAGE yabause) -set(YAB_VERSION_MAJOR 0) -set(YAB_VERSION_MINOR 9) -set(YAB_VERSION_PATCH 14) +set(YAB_VERSION_MAJOR 1) +set(YAB_VERSION_MINOR 16) +set(YAB_VERSION_PATCH 3) set(YAB_VERSION "${YAB_VERSION_MAJOR}.${YAB_VERSION_MINOR}.${YAB_VERSION_PATCH}") +include(GetGitRevisionDescription) +get_git_head_revision(GIT_REFSPEC GIT_SHA1) +string(SUBSTRING ${GIT_SHA1} 0 6 GIT_SHA1_MINI ) + set(CPACK_SOURCE_GENERATOR TGZ) -set(CPACK_PACKAGE_VERSION_MAJOR ${YAB_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${YAB_VERSION_MINOR}) -set(CPACK_PACKAGE_VERSION_PATCH ${YAB_VERSION_PATCH}) -set(CPACK_PACKAGE_VENDOR "Yabause team") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") -set(CPACK_SOURCE_PACKAGE_FILE_NAME "yabause-${YAB_VERSION}") +set(CPACK_PACKAGE_VENDOR "devMiyax") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.txt") +set(CPACK_PACKAGE_FILE_NAME "yabasanshiro${YAB_TARGET}-${YAB_VERSION}-${GIT_SHA1_MINI}") +set(CPACK_PACKAGE_CONTACT "smiyaxdev@gmail.com" ) +set(CPACK_PACKAGE_INSTALL_DIRECTORY "YabaSanshiro") if (APPLE) set(CPACK_GENERATOR DragNDrop) @@ -22,19 +34,48 @@ if (APPLE) endif () if (WIN32) - SET(CPACK_NSIS_INSTALLED_ICON_NAME yabause.exe) - set(CPACK_NSIS_MENU_LINKS yabause.exe;Yabause) - set(CPACK_NSIS_URL_INFO_ABOUT "http://yabause.org") + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + SET(CPACK_NSIS_INSTALLED_ICON_NAME yabasanshiro.exe) + set(CPACK_NSIS_MENU_LINKS yabasanshiro.exe;"Yaba Sanshiro") + set(CPACK_NSIS_URL_INFO_ABOUT "http://www.uoyabause.org") set(CPACK_NSIS_COMPRESSOR "/SOLID lzma") if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) set(CPACK_SYSTEM_NAME "win64") set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}${CPACK_PACKAGE_VERSION} (Win64)") + set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}") + else() + set(CPACK_WIX_ARCHITECTURE "x86") endif () + set(CPACK_WIX_VERSION 3) + set(CPACK_WIX_ARCHITECTURE x64) + set(CPACK_WIX_UPGRADE_GUID "c0a71dab-2333-406c-9815-634e13221c46" ) + set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png" ) + set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/res/banner.png") + set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/res/dialog.png") + set(CPACK_WIX_CULTURES en-US ja-jp pt-BR fr-FR) + set(CPACK_WIX_PROPERTY_ARPHELPLINK "http://www.uoyabause.org/") +else() + set(CPACK_PACKAGE_VERSION_MAJOR 2-${YAB_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${YAB_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${YAB_VERSION_PATCH}) endif () include(CPack) +function(assign_source_group) + foreach(_source IN ITEMS ${ARGN}) + if (IS_ABSOLUTE "${_source}") + file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}") + else() + set(_source_rel "${_source}") + endif() + get_filename_component(_source_path "${_source_rel}" PATH) + string(REPLACE "/" "\\" _source_path_msvc "${_source_path}") + source_group("${_source_path_msvc}" FILES "${_source}") + endforeach() +endfunction(assign_source_group) + add_subdirectory(doc) add_subdirectory(l10n) add_subdirectory(src) diff --git a/yabause/COPYING b/yabause/COPYING.txt similarity index 100% rename from yabause/COPYING rename to yabause/COPYING.txt diff --git a/yabause/EULA.txt b/yabause/EULA.txt new file mode 100644 index 0000000000..544b882a1d --- /dev/null +++ b/yabause/EULA.txt @@ -0,0 +1,46 @@ +## End-User License Agreement (EULA) of Yaba Sanshiro + + +This End-User License Agreement ("EULA") is a legal agreement between you and devMiyax + +This EULA agreement governs your acquisition and use of our Yaba Sanshiro software ("Software") directly from devMiyax or indirectly through a devMiyax authorized reseller or distributor (a "Reseller"). + +Please read this EULA agreement carefully before completing the installation process and using the Yaba Sanshiro software. It provides a license to use the Yaba Sanshiro software and contains warranty information and liability disclaimers. + +If you register for a free trial of the Yaba Sanshiro software, this EULA agreement will also govern that trial. By clicking "accept" or installing and/or using the Yaba Sanshiro software, you are confirming your acceptance of the Software and agreeing to become bound by the terms of this EULA agreement. + +If you are entering into this EULA agreement on behalf of a company or other legal entity, you represent that you have the authority to bind such entity and its affiliates to these terms and conditions. If you do not have such authority or if you do not agree with the terms and conditions of this EULA agreement, do not install or use the Software, and you must not accept this EULA agreement. + +This EULA agreement shall apply only to the Software supplied by devMiyax herewith regardless of whether other software is referred to or described herein. The terms also apply to any devMiyax updates, supplements, Internet-based services, and support services for the Software, unless other terms accompany those items on delivery. If so, those terms apply. + +### License Grant + +devMiyax hereby grants you a personal, non-transferable, non-exclusive licence to use the Yaba Sanshiro software on your devices in accordance with the terms of this EULA agreement. + +You are permitted to load the Yaba Sanshiro software (for example a PC, laptop, mobile or tablet) under your control. You are responsible for ensuring your device meets the minimum requirements of the Yaba Sanshiro software. + +You are not permitted to: + + + * Edit, alter, modify, adapt, translate or otherwise change the whole or any part of the Software nor permit the whole or any part of the Software to be combined with or become incorporated in any other software, nor decompile, disassemble or reverse engineer the Software or attempt to do any such things + * Reproduce, copy, distribute, resell or otherwise use the Software for any commercial purpose + * Allow any third party to use the Software on behalf of or for the benefit of any third party + * Use the Software in any way which breaches any applicable local, national or international law + * use the Software for any purpose that devMiyax considers is a breach of this EULA agreement + + +### Intellectual Property and Ownership + +devMiyax shall at all times retain ownership of the Software as originally downloaded by you and all subsequent downloads of the Software by you. The Software (and the copyright, and other intellectual property rights of whatever nature in the Software, including any modifications made thereto) are and shall remain the property of devMiyax. + +devMiyax reserves the right to grant licences to use the Software to third parties. + +### Termination + +This EULA agreement is effective from the date you first use the Software and shall continue until terminated. You may terminate it at any time upon written notice to devMiyax. + +It will also terminate immediately if you fail to comply with any term of this EULA agreement. Upon such termination, the licenses granted by this EULA agreement will immediately terminate and you agree to stop all access and use of the Software. The provisions that by their nature continue and survive will survive any termination of this EULA agreement. + +### Governing Law + +This EULA agreement, and any dispute arising out of or in connection with this EULA agreement, shall be governed by and construed in accordance with the laws of jp. \ No newline at end of file diff --git a/yabause/l10n/CMakeLists.txt b/yabause/l10n/CMakeLists.txt index 00b412a924..94fff253c3 100644 --- a/yabause/l10n/CMakeLists.txt +++ b/yabause/l10n/CMakeLists.txt @@ -1,11 +1,11 @@ project(yabause-l10n) -set(LANGS ar de es fr it lt nl pt pt_BR ru sv zh_CN zh_TW) +set(LANGS ja ar de es fr it lt nl pt pt_BR ru sv zh_CN zh_TW) if (UNIX AND NOT APPLE) - foreach(LANG ${LANGS}) - install(FILES "yabause_${LANG}.yts" DESTINATION "share/yabause/yts" RENAME "${LANG}.yts") - endforeach() + #foreach(LANG ${LANGS}) + # install(FILES "yabause_${LANG}.yts" DESTINATION "share/yabause/yts" RENAME "${LANG}.yts") + #endforeach() elseif (WIN32) foreach(LANG ${LANGS}) install(FILES "yabause_${LANG}.yts" DESTINATION "trans" RENAME "${LANG}.yts") diff --git a/yabause/l10n/yabause_fr.yts b/yabause/l10n/yabause_fr.yts index 8ff702a7f0..f1cf56ab4b 100644 --- a/yabause/l10n/yabause_fr.yts +++ b/yabause/l10n/yabause_fr.yts @@ -1,5 +1,6 @@ %1 Images (*.%2)|Images %1 (*.%2) %1/%2 blocks free|%1/%2 blocs libres +3D Control Pad Configuration|Configuration de la Manette 3D Control &About...|&A Propos De... &Action Replay|&Action Replay &Backup Manager...|&Gestion des Sauvegardes... @@ -9,9 +10,9 @@ &Cheat List|Liste de &Cheats &Cheats|&Cheats &Cheats List...|Liste de &Cheats... -&Clear|&Effacer +&Clear|&Vider &Close|&Fermer -&Debug|&Debug +&Debug|&Débug &Delete|&Effacer &Emulation|&Emulation &File|&Fichier @@ -45,6 +46,7 @@ 4 Mbit Backup Ram|Sauvegarde RAM 4 Mbit 503/512 blocks free|503/512 blocs libres 510/512 blocks free|510/512 blocs libres +68000 Core|Noyau du 68000 : 8 Mbit Backup Ram|Sauvegarde RAM 8 Mbit 8 Mbit Dram|Dram 8 Mbit 8-bit|8-bit @@ -58,8 +60,11 @@ Add Cheat|Ajouter un Cheat Add Codes...|Ajouter des Codes... Add Raw Memory Code|Ajouter un Code Mémoire Brut Address|Adresse +Address|Adresse Address :|Adresse : Advanced|Avancé +All Files (*)|Tous les Fichiers (*) +All Files|Tous les Fichiers Always|Toujours Are you sure you want to delete '%1' ?|Etes vous sûr de vouloir supprimer '%1' ? Are you sure you want to format '%1' ?|Etes vous sûr de vouloir formater '%1' ? @@ -71,19 +76,25 @@ Awaiting input for|Attente de l'entrée pour Axis|Axes Backtrace|Traceur Backup Ram Manager|Gestion des Sauvegardes +Bilinear|Bilinèaire +Bilinear Filtering (Restart required)|Filtrage Bilinéaire (Redémarrage nécessaire) Binary Files (*.bin)|Fichiers Binaires (*.bin) Bios|Bios : Block Size :|Taille du Bloc : Browse|Parcourir +Bug report|Rapport de Bug Byte|Byte Byte Write|Ecrire un Byte +C68k Interface|Interface C68k CD Images (*.iso *.cue *.bin)|Images CD (*.iso *.cue *.bin) Cancel|Annuler Cannot initialize|Ne peut pas Initialiser Cannot initialize Windows SPTI Driver|Ne peut pas initialiser le pilote SPTI +Can't plug in the new controller, cancelling.|Ne peut pas brancher dans le nouveau contrôleur, annuler. Cart/Memory|Cartouche/Mémoire Cartridge|Cartouche : Cd-Rom|CD-Rom : +CD Images (*.iso *.cue *.bin *.mds *.ccd)|Images CD (*.iso *.cue *.bin *.mds *.ccd) Central/South America (NTSC)|Amérique du Sud/Centrale (NTSC) Central/South America (PAL)|Amérique du Sud/Centrale (PAL) Cheat &Search...|&Rechercher un Cheat... @@ -92,22 +103,33 @@ Cheat Type|Type de Cheat Cheats|Cheats Cheats File|Fichier Cheat Choose a binary file|Choisir un Fichier Binaire +Choose a binary or program file|Choisir un fichier binaire ou un programme +Choose a bios file|Choisir un Fichier Bios Choose a cartridge file|Choisir un Fichier Cartouche Choose a cdrom drive/mount point|Choisir un lecteur CD ou un point de montage Choose a cheat file to open|Choisir un fichier de Cheat à ouvrir Choose a cheat file to save to|Choisir un fichier de Cheat à enregistrer Choose a file to save your state|Choisir un fichier où enregistrer l'état +Choose a folder to store save states|Choisir un Dossier pour les Sauvegardes d'Etats Choose a location for binary file|Choisir le Chemin du Fichier Binaire +Choose a location for your binary file|Choisir le Chemin pour votre Fichier Binaire +Choose a location for your bitmap|Choisir le Chemin pour le Fichier Bitmap Choose a location for your screenshot|Choisir un nom de fichier pour votre capture d'écran +Choose a location for your wav file|Choisir le Chemin pour votre Fichier WAV Choose a memory file|Choisir un Fichier Mémoire Choose a mpeg rom|Choisir une Rom MPEG +Choose a sh1 rom|Choisir une ROM SH1 Clear configuration|Vider la Configuration Close|Fermer Code|Code Code Breakpoints|Interruptions du Code +COFF Program Files (*.cof *.coff)|Fichiers Programme COFF (*.cof *.coff) Comment :|Commentaire : Common Control Registers|Registres de Contrôle Commun Compare Type|Type de Comparaison +Compatibility List|Liste de Compatibilité +CPU Tesselation|Tesselation CPU +GPU Tesselation|Tesselation GPU DSP Control Registers|Registres de Contrôle DSP DSP Registers|Registres DSP Data Size|Taille Donnée @@ -117,6 +139,7 @@ Debug CPU|Débug CPU Debug M68K|Débug M68K Debug Master SH2|Débug Master SH2 Debug SCU DSP|Débug SCU DSP +Debug SCSP|Débug SCSP Debug Slave SH2|Débug SH2 Esclave Debug VDP1|Débug VDP1 Debug VDP2Viewer|Débug VDP2Viewer @@ -125,40 +148,58 @@ Delete|Effacer Description|Description Description :|Description : Device List|Liste des Périphériques -DirectX Input Interface|Interface DirectX Input -DirectX Sound Interface|Interface DirectX Sound +DirectX Input Interface|Interface Contrôleur DirectX +DirectX Sound Interface|Interface Son DirectX Disabled|Désactivé Disassembled Code|Code Désassemblé Display Enabled|Affichage Activé Display on Hover|Afficher en Passant le Curseur +donate|Faire un Don Down|Bas Download|Télécharger Draw End|Fin Dessin +Dummy 68k Interface|Interface 68k Factice Dummy CD Drive|Lecteur de CD Factice Dummy Input Interface|Interface Contrôleur Factice Dummy OSD Interface|Interface OSD Factice Dummy Sound Interface|Interface Son Factice Dummy Video Interface|Interface Vidéo Factice Edit configuration|Editer la Configuration +ELF Program Files (*elf)|Fichiers Programme ELF (*.elf) Emu-Compatibility|Emu-Compatibilité Emulation|Emulation Enable|Activer +Enable Bios Emulation|Activer l'Emulation du Bios +Enable CD Block Low-level Emulation|Activer l'Emulation du Bloc CD Bas Niveau (LLE) Enable Frame Skip/Limiter|Active le Saut d'Image/Limitateur +Enable Multithreading|Activer les Processus Multiples +Enable Sh2 Dma Timing|Activer le Timing DMA du SH2 +Enable Scu Dma Timing|Activer le Timing DMA du SCU +Enable Sh2 Cache|Activer le Cache SH2 Enabled|Activé End Address:|Adresse de Fin : +Enter new assembly code: |Entrer un Nouveau Code Assembleur : English|Anglais Enter New Value|Entrer une Nouvelle Valeur Europe + others (PAL)|Europe + Autres (PAL) Exact|Identique +Extend Internal backup memory to 8MB|Etendre la Mémoire de Sauvegarde Interne à 8MB FPS|FPS File|Fichier File Name :|Nom du Fichier : File transfer|Transfert de Fichier File:|Fichier : +Filter|Filtre +Filter mode|Mode Filtre +Fit to Emulation Resolution|Correspondre à la Résolution de l'Emulation +Fit to window|Correspond à la Fenêtre +Fixed aspect ratio: 4:3|Correction des Propotions : 4:3 +Fixed aspect ratio: 16:9|Correction des Propotions : 16:9 Format|Formater Frame Skip/Limiter|Saut d'Image/Limitateur French|Français From|A Partir De +From Cloud|Depuis le Cloud From File|A Partir d'un Fichier From File...|A Partir d'un Fichier... Fullscreen|Plein Ecran @@ -169,6 +210,9 @@ German|Allemand Glut OSD Interface|Interface OSD GLut Goto Address|Va sur l'Adresse Greater then|Plus grand que +Gun|Pistolet +Gun Configuration|Configuration du Pistolet +Gun/Mouse Sensitivity|Sensibilité de la Souris/Pistolet Hard Reset|Redémarrage Matériel Height|Hauteur : Hex value(s)|Valeur(s) Héx @@ -176,7 +220,9 @@ Hide Menubar|Cacher la Barre de Menu Hide Toolbar|Cacher la Barre d'Outil ISO-File Virtual Drive|Lecteur de Fichier ISO Virtuel Information...|Information... +Inline Assembly|Assembleur En Ligne Input|Contrôleur +Internal Resolution|Résolution Interne Invalid Address|Adresse Invalide Invalid Value|Valeur Invalide Italian|Italien @@ -188,10 +234,21 @@ L&oad State|&Charger un Etat Language :|Langage : Layer|Couche Left|Gauche +Left stick:\nTrigger: X\nLeft button: Y\nRight button: Z|Stick Gauche :\nGâchette: X\nBouton Gauche : Y\nBouton Droit : Z Left trigger|Gâchette Gauche Less than|Moins que Linux CD Drive|Lecteur CD Linux Load|Charger +Load0|Chargement0 +Load1|Chargement1 +Load2|Chargement2 +Load3|Chargement3 +Load4|Chargement4 +Load5|Chargement5 +Load6|Chargement6 +Load7|Chargement7 +Load8|Chargement8 +Load9|Chargement9 Load State|Charger l'Etat Load State As|Charger l'Etat sous Load as executable|Charger en tant qu'Executable @@ -217,6 +274,7 @@ Middle|Moyen Mouse|Souris Mouse Configuration|Configuration de la Souris Mpeg ROM|ROM MPEG : +Musashi Interface|Interface Musashi NBG0|NBG0 NBG0/RBG1 Info|Info NBG0/RBG1 NBG1|NBG1 @@ -225,50 +283,82 @@ NBG2|NBG2 NBG2 Info|Info NBG2 NBG3|NBG3 NBG3 Info|Info NBG3 +nanovg OSD Interface|Interface Nanovg OSD +Native (native resolution of Window)|Natif (résolution native de la fenêtre) Netlink|Réseau Never|Jamais None|Aucun +None|Aucun Normal Sprite|Sprite Normal North America (NTSC)|Amérique du Nord (NTSC) +Number of Threads|Nombre de Processus OSD Core|Noyau OSD Ok|Ok On fullscreen|Plein Ecran On message|Sur le Message +Only available with new scsp code(USE_NEW_SCSP=1)|Uniquement disponible avec le nouveau code SCSP (UTILISER_NOUVEAU_SCSP=1) Open &CD Rom...|Ouvrir un &CD Rom... Open &ISO...|Ouvrir un &ISO... Open CD Rom|Ouvrir un CD ROM +Open SSF|Ouvrir lecteur SSF +Open&Tray|Ouvrir le Plateau +OpenTray|Ouvrir le Plateau OpenGL Video Interface|Interface Vidéo OpenGL +Original aspect ratio|Proportions d'Origine Options|Options Other Debug|Autre Débug Pad|Manette Pad Configuration|Configuration de la Manette Pause|Pause +Play Slot|Lancer +Polygon Generation|Génération des Polygones Press Esc key to cancel|Pressez Echap pour Annuler Pro Action Replay|Pro Action Replay Qt Keyboard Input Interface|Interface Qt du Clavier Quit|Quitter R&un|L&ancer -RBG0|RGB0 +RBG0|RBG0 RBG0 Info|Info RBG0 -Read|Ecrire +RBG Resolution|Résolution RBG +Read|Lecture +Record|Enregistrer Region|Région : Registers|Registres +Remove Peripheral|Supprime le Périphérique Reset|Redémarrer Resolution|Résolution : Right|Droite +Right Stick:\nTrigger: A\nLeft button: B\nRight button: C|Stick Droit :\nGâchette : A\nBouton Gauche : B\nBouton Droite : C Right trigger|Gâchette Droite +Rotate 90 degree|Rotation à 90° Run|Lancer S&ave State|S&auvegarder un Etat SCSP|SCSP +SCSP Channels|Canaux SCSP +SCSP Sync count per a frame ( 1 - 255 )|Compteur de synchro SCSP par image (1-255). SCU-DSP|SCU-DSP SDL Joystick Interface|Interface SDL du Joystick SDL Sound Interface|Interface SDL du Son +SH1 Registers|Registres SH1 +SH1 Interpreter|Interpréteur SH1 SH2 Debugger Interpreter|Interpréteur de Débugeur SH2 SH2 Dynamic Recompiler|Recompileur Dynamique SH2 -SH2 Interpreter|Interpréteur SH2 : +SH2 Dynamic Recompiler Debug|Recompileur Dynamique Débug SH2 +SH2 Interpreter|Interpréteur SH2 SH2 Registers|Registres SH2 SSH2|SSH2 Save|Sauvegarder +Save0|Sauvegarde0 +Save1|Sauvegarde1 +Save2|Sauvegarde2 +Save3|Sauvegarde3 +Save4|Sauvegarde4 +Save5|Sauvegarde5 +Save6|Sauvegarde6 +Save7|Sauvegarde7 +Save8|Sauvegarde8 +Save9|Sauvegarde9 +Save As Bitmap|Sauvegarder en Bitmap Save As WAV|Sauvegarder en WAV Save Bitmap|Sauvegarder en Bitmap Save Information|Informations sur la Sauvegarde @@ -283,21 +373,26 @@ Save Slot Registers|Sauvegarder Emplacement Registres Save State|Sauvegarder l'Etat Save State As|Sauvegarder l'Etat sous Save States|Sauvegarde d'Etat : +Save Tab|Sauv. Onglet +Scanline filter|Filtre Scanline Sc&reenshot|Copie d'Ec&ran Screen Enabled|Ecran Activé +Screen Select:|Choix del'Ecran : Screenshot|Capture d'Ecran Search|Rechercher Search Criteria|Critère de Recherche Search Memory|Rechercher dans la Mémoire Search Value:|Rechercher une Valeur : Search/Add Cheats|Rechercher/Ajouter un Cheat -Select a file to load your state|Choisissez un fichier pour charger l'état -Select your iso/cue/bin file|Choisissez votre fichier iso/cue/bin +Select a file to load your state|Choisir un fichier pour Charger l'Etat +Select your iso/cue/bin file|Choisir un Fichier ISO/CUE/BIN Set PC to Start Address|Sélection PC vers l'Adresse de Démarrage Settings|Paramètres +Shortcut|Raccourcis Shortcuts|Raccourcis Show FPS|Afficher les FPS Show Log Window|Afficher la Fenêtre Journal +Sign In/Out|Connecter/Déconnecter Signed|Signé Signed 16-bit value|Valeur Signé 16-bit Signed 32-bit value|Valeur Signé 32-bit @@ -307,6 +402,7 @@ Slot Info|Info Emplacement Slot Number:|Numéro d'Emplacement : Software OSD Interface|Interface OSD Logiciel Software Video Interface|Interface Vidéo Logiciel +Sound...|Son... Sound|Son Sound Core|Noyau Son : Spanish|Espagnol @@ -317,17 +413,25 @@ Status|Statut Step Into|Entrer Dans Step Out|Sortir Step Over|Sauter +Stick left button: same as A \nStick right button: same as B \nStick trigger: same as C|Bouton Gauche Stick : pareil que A \nBouton Droite Stick : pareil que B \nGâchette : pareil que C +Stop|Arrêter Store|Stocker Synchronize Saturn internal clock with set time|Synchroniser l'Horloge Interne de la Saturn avec l'Heure +Synchronize to CPU|Synchroniser avec le CPU +Synchronize to the real time|Synchroniser en Temps Réel System Clipping Coordinates|Coordonnées Clippind Système Text|Texte Texture|Texture +Time Synchronization Mode|Mode de Synchronisation du Temps To|Vers +To Cloud|Vers le Cloud To File...|Vers un Fichier... Tools|Outils Track Inf Loop Results|Résultats In Piste en Boucle +Trace Logging|Enregistreur de Trace Transfer|Transfert Translation|Traduction : +Triangles using perspective correction|Triangles utilisant la correction de perspective Type:|Type : Unable to add code|Ne peut pas ajouter de Code Unable to change description|Ne peut pas changer la Description @@ -341,11 +445,15 @@ Unsigned 32-bit value|Valeur Non Signé 32-bit Unsigned 8-bit value|Valeur Non Signé 8-bit Up|Haut Upload|Upload +Use compute shader for RBG generation|Utiliser le shader de calcul pour la génération RBG +Use integer pixel scaling|Utiliser l'échelle des pixels entier +Use new scsp|Utiliser le nouveau SCSP Use System Locale|Utiliser les paramètres régionaux VDP1|VDP1 VDP1 Command Info|Info Commande VDP1 VDP1 Command List|Liste Commande VDP1 VDP2|VDP2 +VDP2Viewer Viewer|Visualiseur VDP2Viewer Value|Valeur Value :|Valeur : Value:|Valeur : @@ -353,17 +461,23 @@ Vdp1|VDP1 Vdp2|VDP2 Video|Vidéo Video Core|Noyau Vidéo : -Video Driver|Pilote Vidéo : -Video Format|Format Vidéo : +Video Driver|Pilote Vidéo +Video Format|Format Vidéo View|Visualiser Viewer|Visualiseur Waiting Input...|En Attente du Contrôleur +Warning...|Avertissement... +Wheel|Volant +Wheel Configuration|Configutation du Volant Width|Largeur : Window Resolution|Résolution Fenêtrée Windows SPTI Driver|Pilote Windows SPTI Word|Word Word Write|Ecrire un Word Write|Ecrire +Yaba Sanshiro ver.%1|Yaba Sanshiro ver.%1 +is developed by devMiyax|est développé par devMiyax +Based on Yabause|est basé sur Yabause Yabause Cheat Files (*.yct);;All Files (*)|Fichiers de Cheat Yabause (*ycf);;Tous les Fichiers (*) Yabause Qt GUI|Interface Graphique Qt pour Yabause Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Basé sur Yabause %1 :
http://yabause.org
L'équipe de Yabause :
Filipe AZEVEDO @@ -372,3 +486,10 @@ Yabause is not initialized, can't manage backup ram.|Yabause n'est pas initialis http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=fr http://www.monkeystudio.org|http://www.monkeystudio.org toolBar|Barre d'Outils +Emulation Speed|Vitesse d'émulation +Sh2 Cahce|Activer le cache Sh2 +Aspect Ratio|Format d'image +Rendering Option|Options de rendu +Render Quality|Qualité de rendu +Low|Faible qualité +High|Haute qualité diff --git a/yabause/l10n/yabause_ja.yts b/yabause/l10n/yabause_ja.yts index cfd2f0da74..b8eec4da2a 100644 --- a/yabause/l10n/yabause_ja.yts +++ b/yabause/l10n/yabause_ja.yts @@ -372,3 +372,410 @@ Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk http://www.monkeystudio.org|http://www.monkeystudio.org toolBar|toolBar +Enable Bios Emulation|BIOSのエミュレーションを有効にする +%1 Images (*.%2)|%1 Images (*.%2) +%1/%2 blocks free|%1/%2 blocks free +&About...|YabaSanshiroについて...(&A) +&Action Replay|リプレイ(&A) +&Backup Manager...|バックアップマネージャ(&B) +&Browse|ブラウズ(&B) +&Cancel|キャンセル(&C) +&Capture Screen|スクリーンキャプチャ(&C) +&Cheat List|チートリスト(&C) +&Cheats|チート(&C) +&Cheats List...|チートリスト(&C) +&Clear|消去(&C) +&Close|閉じる(&C) +&Debug|デバッグ(&D) +&Delete|削除(&D) +&Emulation|エミュレーション(&E) +&File|ファイル(&F) +&Frame Skip/Limiter|フレームスキップ/制限(&F) +&Fullscreen|フルスクリーン(&F) +&Help|ヘルプ(&F) +&Layer|レイヤー(&L) +&Load From File|ファイルをロード(&L) +&Log|ログ(&L) +&Master SH2|マスターSH2(&M) +&Memory Transfer|メモリ転送(&M) +&OK|&OK +&Pause|一時停止(&P) +&Quit|終了(&Q) +&Raw Memory Address|&Raw Memory Address +&Reset|リセット(&R) +&Save To File|ファイルに保存(&S) +&Settings...|設定(&S) +&Slave SH2|スレーブSH2(&S) +&Tools|ツール(&T) +&Transfer|転送(&T) +&View|表示(&V) +16 Mbit Backup Ram|16Mbバックアップラム +16 Mbit ROM|16Mb ROM +16-bit|16ビット +16-bit Relative value(s)|16-bit Relative value(s) +32 Mbit Backup Ram|32MbバックアップRAM +32 Mbit Dram|32Mb DRAM +32-bit|32ビット +3D Control Pad|3Dコントロールパッド +4 Mbit Backup Ram|4MbバックアップRAM +503/512 blocks free|503/512ブロック空き +510/512 blocks free|510/512ブロック空き +8 Mbit Backup Ram|8MbバックアップRAM +8 Mbit Dram|8Mb DRAM +8-bit|8ビット +8-bit Relative value(s)|8-bit Relative value(s) +WARNING: Master Codes are NOT supported.|警告: マスタコードはサポート されません +About...|Yabasanshiroについて... +Action Replay Code :|Action Replay Code : +Add|追加 +Add Action Replay Code|Add Action Replay Code +Add Cheat|チート追加 +Add Codes...|Add Codes... +Add Raw Memory Code|Add Raw Memory Code +Address|アドレス +Address :|Address : +Advanced|Advanced +Always|常時 +Are you sure you want to delete '%1' ?|'%1'を本当に削除してよいですか? +Are you sure you want to format '%1' ?|'%1'を本当にフォーマットしてよいですか? +Asia (NTSC)|アジア(NTSC) +Asia (PAL)|アジア(PAL) +Auto-detect|自動検出 +Autostart|Autostart +Awaiting input for|Awaiting input for +Axis|軸 +Backtrace|バックトレース +Backup Ram Manager|バックアップRAMマネージャ +Binary Files (*.bin)|バイナリファイル (*.bin) +Bios|BIOS +Block Size :|Block Size : +Browse|ブラウズ +Byte|バイト +Byte Write|Byte Write +CD Images (*.iso *.cue *.bin)|CDイメージ (*.iso *.cue *.bin) +Cancel|キャンセル +Cannot initialize|初期化不可 +Cannot initialize Windows SPTI Driver|Windows SPTIドライバの初期化不可 +Cart/Memory|カートリッジ/メモリ +Cartridge|カートリッジ +Cd-Rom|CD-ROM +Central/South America (NTSC)|中南米 (NTSC) +Central/South America (PAL)|中南米 (PAL) +Cheat &Search...|Cheat &Search... +Cheat Search|チート検索 +Cheat Type|チートタイプ +Cheats|チート +Cheats File|チートファイル +Choose a binary file|バイナリファイルを選んでください +Choose a cartridge file|カートリッジファイルを選んでください +Choose a cdrom drive/mount point|Choose a cdrom drive/mount point +Choose a cheat file to open|開くファイルを選んでください +Choose a cheat file to save to|Choose a cheat file to save to +Choose a file to save your state|状態を保存するファイルを選んでください +Choose a location for binary file|バイナリファイルの場所を選んでください +Choose a location for your screenshot|スクリーンショットの場所を選んでください +Choose a memory file|メモリファイルを選んでください +Choose a mpeg rom|Mpeg ROMを選んでください +Clear configuration|Clear configuration +Close|閉じる +Code|コード +Code Breakpoints|Code Breakpoints +Comment :|コメント +Common Control Registers|Common Control Registers +Compare Type|Compare Type +DSP Control Registers|DSP Control Registers +DSP Registers|DSP Registers +Data Size|データサイズ +Data Size :|データサイズ: +Data Type|データタイプ +Debug CPU|CPUをデバッグする +Debug M68K|M68Kをデバッグする +Debug Master SH2|マスターSH2をデバッグする +Debug SCU DSP|SCU DSPをデバッグする +Debug Slave SH2|スレーブSH2をデバッグする +Debug VDP1|VDP1をデバッグする +Debug VDP2Viewer|VDP2ビューアをデバッグする +Del|Del +Delete|消去 +Description|Description +Description :|Description : +Device List|デバイスリスト +DirectX Input Interface|DirectX入力インタフェース +DirectX Sound Interface|DirectXサウンドインタフェース +Disabled|Disabled +Disassembled Code|逆アセンブルコード +Display Enabled|Display Enabled +Display on Hover|Display on Hover +Down|Down +Download|ダウンロード +Draw End|Draw End +Dummy CD Drive|Dummy CD Drive +Dummy Input Interface|Dummy Input Interface +Dummy OSD Interface|Dummy OSD Interface +Dummy Sound Interface|Dummy Sound Interface +Dummy Video Interface|Dummy Video Interface +Edit configuration|Edit configuration +Emu-Compatibility|Emu-Compatibility +Emulation|エミュレーション +Enable|Enable +Enable Frame Skip/Limiter|Enable Frame Skip/Limiter +Enabled|Enabled +End Address:|End Address: +English|英語 +Enter New Value|Enter New Value +Europe + others (PAL)|欧州他 (PAL) +Exact|Exact +FPS|FPS +File|ファイル +File Name :|File Name : +File transfer|File transfer +File:|File: +Format|Format +Frame Skip/Limiter|Frame Skip/Limiter +French|French +From|From +From File|From File +From File...|From File... +Fullscreen|Fullscreen +Fullscreen Resolution|Fullscreen Resolution +General|General +General Info|General Info +German|ドイツ語 +Glut OSD Interface|Glut OSD Interface +Goto Address|Goto Address +Greater then|Greater then +Hard Reset|Hard Reset +Height|Height +Hex value(s)|Hex value(s) +Hide Menubar|Hide Menubar +Hide Toolbar|Hide Toolbar +ISO-File Virtual Drive|ISO-File Virtual Drive +Information...|Information... +Input|Input +Invalid Address|無効なアドレス +Invalid Value|無効な値 +Italian|イタリア語 +Japan (NTSC)|日本 (NTSC) +Japanese|日本語 +Japanese Modem|Japanese Modem +Korea (NTSC)|韓国 (NTSC) +L&oad State|L&oad State +Language :|Language : +Layer|Layer +Left|Left +Left trigger|Left trigger +Less than|Less than +Linux CD Drive|Linux CD Drive +Load|Load +Load State|Load State +Load State As|Load State As +Load as executable|Load as executable +Local Coordinates|Local Coordinates +Log|ログ +Long|Long +Long Write|Long Write +Loop Track Clear|Loop Track Clear +Loop Track Start|Loop Track Start +M68K|M68K +M68K Registers|M68Kレジスタ +MSH2|MSH2 +Master SH2|マスターSH2 +Memory|メモリ +Memory &Editor|Memory &Editor +Memory Breakpoints|Memory Breakpoints +Memory Dump|Memory Dump +Memory Editor|Memory Editor +Memory Search|Memory Search +Memory Transfer|Memory Transfer +Memory dump|Memory dump +Middle|Middle +Mouse|Mouse +Mouse Configuration|Mouse Configuration +Mpeg ROM|MPEG ROM +NBG0|NBG0 +NBG0/RBG1 Info|NBG0/RBG1 Info +NBG1|NBG1 +NBG1 Info|NBG1 Info +NBG2|NBG2 +NBG2 Info|NBG2 Info +NBG3|NBG3 +NBG3 Info|NBG3 Info +Netlink|Netlink +Never|Never +None|None +Normal Sprite|Normal Sprite +North America (NTSC)|北米 (NTSC) +OSD Core|OSD Core +Ok|Ok +On fullscreen|On fullscreen +On message|On message +Open &CD Rom...|Open &CD Rom... +Open &ISO...|Open &ISO... +Open CD Rom|CD-ROMを開く +OpenGL Video Interface|OpenGLビデオインタフェース +Options|オプション +Other Debug|Other Debug +Pad|Pad +Pad Configuration|Pad Configuration +Pause|一時停止 +Press Esc key to cancel|Press Esc key to cancel +Pro Action Replay|Pro Action Replay +Qt Keyboard Input Interface|Qtキーボード入力インタフェース +Quit|終了 +R&un|R&un +RBG0|RBG0 +RBG0 Info|RBG0 Info +Read|Read +Region|Region +Registers|Registers +Reset|Reset +Resolution|Resolution +Right|Right +Right trigger|Right trigger +Run|Run +S&ave State|S&ave State +SCSP|SCSP +SCU-DSP|SCU-DSP +SDL Joystick Interface|SDLジョイスティックインタフェース +SDL Sound Interface|SDLサウンドインタフェース +SH2 Debugger Interpreter|SH2デバッガインタプリタ +SH2 Dynamic Recompiler|SH2ダイナミックリコンバイラ +SH2 Interpreter|SH2インタプリタ +SH2 Registers|SH2 Registers +SSH2|SSH2 +Save|Save +Save As WAV|Save As WAV +Save Bitmap|Save Bitmap +Save Information|Save Information +Save List|Save List +Save MD0|Save MD0 +Save MD1|Save MD1 +Save MD2|Save MD2 +Save MD3|Save MD3 +Save Program|Save Program +Save Selected|Save Selected +Save Slot Registers|Save Slot Registers +Save State|Save State +Save State As|Save State As +Save States|Save States +Sc&reenshot|Sc&reenshot +Screen Enabled|Screen Enabled +Screenshot|スクリーンショット +Search|Search +Search Criteria|Search Criteria +Search Memory|Search Memory +Search Value:|Search Value: +Search/Add Cheats|Search/Add Cheats +Select a file to load your state|Select a file to load your state +Select your iso/cue/bin file|Select your iso/cue/bin file +Set PC to Start Address|Set PC to Start Address +Settings|Settings +Shortcuts|Shortcuts +Show FPS|Show FPS +Show Log Window|Show Log Window +Signed|Signed +Signed 16-bit value|Signed 16-bit value +Signed 32-bit value|Signed 32-bit value +Signed 8-bit value|Signed 8-bit value +Slave SH2|スレーブSH2 +Slot Info|Slot Info +Slot Number:|Slot Number: +Software OSD Interface|Software OSD Interface +Software Video Interface|Software Video Interface +Sound|サウンド +Sound Core|サウンドコア +Spanish|スペイン語 +Start|Start +Start Address:|Start Address: +Start in Fullscreen|Start in Fullscreen +Status|Status +Step Into|Step Into +Step Out|Step Out +Step Over|Step Over +Store|Store +Synchronize Saturn internal clock with set time|Synchronize Saturn internal clock with set time +System Clipping Coordinates|System Clipping Coordinates +Text|Text +Texture|Texture +To|To +To File...|To File... +Tools|Tools +Track Inf Loop Results|Track Inf Loop Results +Transfer|Transfer +Translation|Translation +Type:|Type: +Unable to add code|Unable to add code +Unable to change description|Unable to change description +Unable to open file for loading|Unable to open file for loading +Unable to open file for saving|Unable to open file for saving +Unable to remove code|Unable to remove code +Unknow (%1)|Unknow (%1) +Unsigned|Unsigned +Unsigned 16-bit value|Unsigned 16-bit value +Unsigned 32-bit value|Unsigned 32-bit value +Unsigned 8-bit value|Unsigned 8-bit value +Up|Up +Upload|Upload +Use System Locale|Use System Locale +VDP1|Vdp1 +VDP1 Command Info|VDP1 Command Info +VDP1 Command List|VDP1 Command List +VDP2|Vdp2 +Value|Value +Value :|Value : +Value:|Value: +Vdp1|Vdp1 +Vdp2|Vdp2 +Video|Video +Video Core|Video Core +Video Driver|ビデオドライバ +Video Format|ビデオフォーマット +View|View +Viewer|Viewer +Waiting Input...|Waiting Input... +Width|Width +Window Resolution|Window Resolution +Windows SPTI Driver|Windows SPTIドライバ +Word|Word +Word Write|Word Write +Write|Write +Yabause Cheat Files (*.yct);;All Files (*)|Yabause Cheat Files (*.yct);;All Files (*) +Yabause Qt GUI|Yabause Qt GUI +Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO|Yabause Qt Gui
Based on Yabause %1
http://yabause.org
The Yabause Team
Filipe AZEVEDO +Yabause Save State (*.yss)|Yabause Save State (*.yss) +Yabause is not initialized, can't manage backup ram.|Yabause is not initialized, can't manage backup ram. +http://www.emu-compatibility.com/yabause/index.php?lang=uk|http://www.emu-compatibility.com/yabause/index.php?lang=uk +http://www.monkeystudio.org|http://www.monkeystudio.org +toolBar|toolBar +Enable Bios Emulation|BIOSのエミュレーションを有効にする +Save States|状態保存ディレクトリ +Emulation Speed|エミュレーション速度 +Enable Frame Skip|フレームスキップを有効にする +Show FPS|FPSを表示する +Autostart|前のゲームを起動する +Sh2 Cahce|Sh2キャッシュを有効にする +Synchronize Saturn internal clock with set time|サターンの内部時間を設定する +Video|描画 +Video Core|描画コア選択 +Aspect Ratio|縦横比 +Original aspect ratio|オリジナル縦横比 +Fixed aspect ratio: 4:3|4:3固定 +Fixed aspect ratio: 16:9|16:9固定 +Fit to window|画面に合わせる +Fullscreen Resolution|フルスクリーン時の解像度 +Rendering Option|描画設定 +Rotate 90 degree|90度回転 +Start in Fullscreen|開始時にフルスクリーンモードにする +Render Quality|描画品質 +Low|低品質 +High|高品質 +Filter|フィルタ +Polygon Generation|ポリゴン生成方法 +Internal resolution|内部解像度 +RBG Resolution|回転スクロール面の解像度 +Use compute shader for RBG generation|回転スクロール面の生成にコンピュートシェーダーを使う +Window Resolution| +General|一般 +Input|入力 +Advanced|詳細 +Shortcuts|ショートカット \ No newline at end of file diff --git a/yabause/res/banner.png b/yabause/res/banner.png new file mode 100644 index 0000000000..a4c7075bb6 Binary files /dev/null and b/yabause/res/banner.png differ diff --git a/yabause/res/dialog.png b/yabause/res/dialog.png new file mode 100644 index 0000000000..eb4a3a2d4a Binary files /dev/null and b/yabause/res/dialog.png differ diff --git a/yabause/src/BackupManager.cpp b/yabause/src/BackupManager.cpp new file mode 100644 index 0000000000..c3914adc18 --- /dev/null +++ b/yabause/src/BackupManager.cpp @@ -0,0 +1,301 @@ +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "BackupManager.h" + +#include "yabause.h" +#include "bios.h" + +#include "json/json.h" +#include +#include +#include +#include "base64.h" + +#define LOGTAG "BackupManager" +using namespace Json; +using std::unique_ptr; +using std::ostringstream; + + +//BackupManager::instance_ = NULL; +BackupManager * BackupManager::instance_ = NULL; + +BackupManager::BackupManager() { + devices_ = BupGetDeviceList(&numbupdevices_); +} + +BackupManager::~BackupManager() { + if(saves_!=NULL){ + free(saves_); + } +} + +int convJsontoString( const Json::Value in, string & out ){ + + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer(builder.newStreamWriter()); + + ostringstream stream; + writer->write(in,&stream); + out = stream.str(); + + return 0; +} + +int BackupManager::getDevicelist( string & jsonstr ) { + + Json::Value root; + Json::Value item; + + root["devices"] = Json::Value(Json::arrayValue); + for ( int i = 0; i < numbupdevices_ ; i++ ){ + item["name"] = string(devices_[i].name); + item["id"] = devices_[i].id; + root["devices"].append(item); + } + + convJsontoString(root,jsonstr); + //__android_log_print(ANDROID_LOG_INFO,LOGTAG,jsonstr.c_str()); + + return 0; +} + +int BackupManager::getFilelist( int deviceid, string & jsonstr ) { + + Json::Value root; + Json::Value item; + Json::Value status; + devicestatus_struct devstatus; + + //__android_log_print(ANDROID_LOG_INFO,LOGTAG,"getFilelist deviceid = %d",deviceid ); + + if(saves_!=NULL){ + free(saves_); + } + + if( BiosBUPStatusMem(deviceid,&devstatus) != 0 ){ + return -1; + } + status["totalsize"] = devstatus.totalsize; + status["freesize"] = devstatus.freesize; + root["status"] = status; + + saves_ = BupGetSaveList( deviceid, &numsaves_); +// __android_log_print(ANDROID_LOG_INFO,LOGTAG,"BupGetSaveList numsaves_ = %d",numsaves_ ); + root["saves"] = Json::Value(Json::arrayValue); + for ( int i = 0; i < numsaves_ ; i++ ){ + item["index"] = i; + + string base64str; + base64str = base64_encode((const unsigned char*)saves_[i].filename,12); + item["filename"] = base64str; + base64str = base64_encode((const unsigned char*)saves_[i].comment,11); + item["comment"] = base64str; + + item["language"] = saves_[i].language; + item["year"] = saves_[i].year; + item["month"] = saves_[i].month; + item["day"] = saves_[i].day; + item["hour"] = saves_[i].hour; + item["minute"] = saves_[i].minute; + item["week"] = saves_[i].week; + item["date"] = saves_[i].date; + item["datasize"] = saves_[i].datasize; + item["blocksize"] = saves_[i].blocksize; + root["saves"].append(item); + } + + current_device_ = deviceid; + convJsontoString(root,jsonstr); +// __android_log_print(ANDROID_LOG_INFO,LOGTAG,jsonstr.c_str()); + + return 0; +} + +int BackupManager::deletefile( int index ) { + + return BupDeleteSave( current_device_, saves_[index].filename ); + +} + +int toBase64( const char * buf, string & out ){ + + return 0; +} + +int Base64toBin( const string & base64, char ** out ){ + + return 0; +} + + +int BackupManager::getFile( int index, string & jsonstr ) { + + Json::Value root; + Json::Value header; + Json::Value data; + + string base64str; + base64str = base64_encode((const unsigned char*)saves_[index].filename,12); + header["filename"] = base64str; + base64str = base64_encode((const unsigned char*)saves_[index].comment,11); + header["comment"] = base64str; + header["language"] = saves_[index].language; + header["date"] = saves_[index].date; + header["year"] = saves_[index].year; + header["month"] = saves_[index].month; + header["day"] = saves_[index].day; + header["hour"] = saves_[index].hour; + header["minute"] = saves_[index].minute; + header["week"] = saves_[index].week; + header["datasize"] = saves_[index].datasize; + header["blocksize"] = saves_[index].blocksize; + root["header"] = header; + + char * buf; + int bufsize; + int rtn = BiosBUPExport(current_device_, saves_[index].filename, &buf, &bufsize ); + if( rtn != 0 ){ + return rtn; + } + data["size"] = bufsize; + base64str = base64_encode((const unsigned char*)buf,bufsize); + data["content"] = base64str; + free(buf); + root["data"] = data; + + convJsontoString(root,jsonstr); +// __android_log_print(ANDROID_LOG_INFO,LOGTAG,jsonstr.c_str()); + + return 0; +} + + +int BackupManager::putFile( const string & rootstr ) { + + Json::Value root; + Json::Value header; + Json::Value data; + saveinfo_struct save; + char * buf; + int size; + + Json::Reader reader; + bool parsingSuccessful = reader.parse( rootstr.c_str(), root ); //parse process + if ( !parsingSuccessful ){ + return -1; + } + + string base64; + string bin; + + try { + header = root["header"]; + if (header.isNull()) { + return -1; + } + + if (!header["filename"].isString()) return -1; + base64 = header["filename"].asString(); + bin = base64_decode(base64); + strncpy(save.filename, bin.c_str(), 12); + + if (!header["comment"].isString()) return -1; + base64 = header["comment"].asString(); + bin = base64_decode(base64); + strncpy(save.comment, bin.c_str(), 11); + + if (!header["language"].isInt()) return -1; + save.language = header["language"].asInt(); + + if (!header["date"].isInt()) return -1; + save.date = header["date"].asInt(); + + if (!header["year"].isInt()) return -1; + save.year = header["year"].asInt(); + + if (!header["month"].isInt()) return -1; + save.month = header["month"].asInt(); + + if (!header["day"].isInt()) return -1; + save.day = header["day"].asInt(); + + if (!header["hour"].isInt()) return -1; + save.hour = header["hour"].asInt(); + + if (!header["minute"].isInt()) return -1; + save.minute = header["minute"].asInt(); + + if (!header["week"].isInt()) return -1; + save.week = header["week"].asInt(); + + if (!header["datasize"].isInt()) return -1; + save.datasize = header["datasize"].asInt(); + + if (!header["blocksize"].isInt()) return -1; + save.blocksize = header["blocksize"].asInt(); + + data = root["data"]; + if (data.isNull()) { + return -1; + } + + if (!data["size"].isInt()) return -1; + size = data["size"].asInt(); + + if (!data["content"].isString()) return -1; + base64 = data["content"].asString(); + bin = base64_decode(base64); + + } + catch (Exception e) { + return -1; + } + + int rtn = BiosBUPImport( current_device_, &save, bin.c_str(), bin.size() ); + if( rtn != 0 ) { + return rtn; + } + + YabFlushBackups(); + return 0; +} + + +int BackupManager::copy( int target_device, int file_index ) { + + if( current_device_ == target_device ) return -1; + + string tmpjson; + getFile( file_index, tmpjson ); + + int current_device_back = current_device_; + current_device_ = target_device; + + int rtn = putFile(tmpjson); + YabFlushBackups(); + + current_device_ = current_device_back; + + return rtn; +} diff --git a/yabause/src/BackupManager.h b/yabause/src/BackupManager.h new file mode 100644 index 0000000000..1b6b4389c3 --- /dev/null +++ b/yabause/src/BackupManager.h @@ -0,0 +1,57 @@ + +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include "bios.h" + +using std::string; + + +class BackupManager { + +protected: + BackupManager(); +public: + static BackupManager * instance_; + static BackupManager * getInstance(){ + if( instance_==NULL ) instance_ = new BackupManager(); + return instance_; + } + + virtual ~BackupManager(); + int getDevicelist( string & jsonstr ); + int getFilelist( int deviceid, string & jsonstr ); + int deletefile( int index ); + int getFile( int index, string & jsonstr ); + int putFile( const string & jsonstr ); + int copy( int target_device, int file_index ); + +protected: + uint32_t currentbupdevice_ = 0; + deviceinfo_struct* devices_ = NULL; + int32_t numbupdevices_ = 0; + int32_t current_device_ = -1; + saveinfo_struct* saves_ = NULL; + int32_t numsaves_ = 0; + +}; + diff --git a/yabause/src/CMakeLists.txt b/yabause/src/CMakeLists.txt old mode 100755 new mode 100644 index 5c959e5238..6553d4b393 --- a/yabause/src/CMakeLists.txt +++ b/yabause/src/CMakeLists.txt @@ -1,5 +1,7 @@ project(yabause) +#to compile sdl port, use "cmake -DYAB_PORTS=sdl -DYAB_ASYNC_RENDERING ../yabause" + include (CheckCSourceCompiles) include(CheckFunctionExists) include(CheckIncludeFile) @@ -8,13 +10,14 @@ cmake_minimum_required(VERSION 2.8) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeTests) + set(yabause_HEADERS bios.h cdbase.h cheat.h coffelf.h core.h cs0.h cs1.h cs2.h debug.h error.h gameinfo.h - japmodem.h + japmodem.h m68kcore.h m68kd.h memory.h movie.h netlink.h osdcore.h @@ -22,8 +25,20 @@ set(yabause_HEADERS scsp.h scspdsp.h scu.h sh2core.h sh2d.h sh2iasm.h sh2idle.h sh2int.h sh2trace.h smpc.h sock.h threads.h titan/titan.h vdp1.h vdp2.h vdp2debug.h vidogl.h vidshared.h vidsoft.h - yabause.h ygl.h yui.h sh2cache.h) + yabause.h ygl.h yui.h + shaders/FXAA_DefaultES.h + frameprofile.h + sh2cache.h + BackupManager.h + base64.h + json/json.h ) + +option(YAB_MULTIBUILD "Choose wether to build all ports or only a single one") +set(YAB_PORT_BUILT FALSE) +set(YAB_PORTS "qt" CACHE STRING "List of ports to build") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fomit-frame-pointer -DJSONCPP_NO_LOCALE_SUPPORT") + set(yabause_SOURCES bios.c cdbase.c cheat.c coffelf.c cs0.c cs1.c cs2.c @@ -32,27 +47,159 @@ set(yabause_SOURCES gameinfo.c japmodem.c m68kcore.c m68kd.c memory.c movie.c + state_save.cpp netlink.c osdcore.c peripheral.c profile.c + frameprofile.cpp scspdsp.c scu.c sh2core.c sh2d.c sh2iasm.c sh2idle.c sh2int.c sh2trace.c smpc.c snddummy.c titan/titan.c - vdp1.c vdp2.c vdp2debug.c vidogl.c vidshared.c vidsoft.c - yabause.c ygles.c yglshaderes.c sh2cache.c) + vdp1.cpp vdp2.cpp vdp2debug.c vidogl.c vidshared.c vidsoft.c + yabause.c + Counter.cpp + #ygl_texture.cpp + BackupManager.cpp + jsoncpp.cpp + cd-web.cpp + PlayRecorder.cpp + sh2cache.c ) + add_definitions(-DIMPROVED_SAVESTATES) + +if (ANDROID) + add_definitions(-D__ANDROID__) + add_definitions(-DANDROID=1) + add_definitions(-DYAB_PORT_OSD) + add_definitions(-D_OGLES3_) + add_definitions(-DYAB_ASYNC_RENDERING) + add_definitions(-DYAB_PORT_OSD) + include_directories( ./ ./nanovg ) + include_directories( ./vulkan/include ) + #include_directories( ${ANDROID_NDK}/sources/third_party/vulkan/src/include) + set(yabause_SOURCES + ${yabause_SOURCES} + yglcache.c + ygles.c + yglshaderes.c + nanovg/nanovg.c + nanovg/nanovg_osdcore.h + nanovg/nanovg_osdcore.c + ) +endif() -option(YAB_USE_CXX "Allow C++ in the emulation core.") -if (YAB_USE_CXX) - set(yabause_SOURCES ${yabause_SOURCES} yglcache.cpp) -else() - set(yabause_SOURCES ${yabause_SOURCES} yglcache.c) +string(COMPARE EQUAL ${YAB_PORTS} "retro_arena" retro_arena) +if( retro_arena ) + add_definitions(-D__RETORO_ARENA__) + add_definitions(-DYAB_ASYNC_RENDERING) +endif() + +if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Switch") +add_definitions(-DYAB_PORT_OSD) +add_definitions(-D_OGLES3_) +#add_definitions(-DYAB_ASYNC_RENDERING) +add_definitions(-DYAB_PORT_OSD) +include_directories(./ ./nanovg) +set(yabause_SOURCES + ${yabause_SOURCES} + yglcache.c + ygles.c + yglshaderes.c + nanovg/nanovg.c + nanovg/nanovg_osdcore.h + nanovg/nanovg_osdcore.c + ) +endif () + +if (IOS) +add_definitions(-DIOS=1) +add_definitions(-DHAVE_LIBGL) +add_definitions(-DYAB_PORT_OSD) +add_definitions(-D_OGLES3_) +add_definitions(-DYAB_ASYNC_RENDERING) +include_directories( ./ ) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g -fobjc-abi-version=2 -fobjc-arc -std=gnu++11 -stdlib=libc++ -fno-aligned-allocation -isysroot ${CMAKE_OSX_SYSROOT}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -g -fobjc-abi-version=2 -fobjc-arc -fno-aligned-allocation -isysroot ${CMAKE_OSX_SYSROOT}") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fobjc-abi-version=2 -fobjc-arc -std=gnu++11 -stdlib=libc++ -isysroot ${CMAKE_OSX_SYSROOT}") +#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fobjc-abi-version=2 -fobjc-arc -isysroot ${CMAKE_OSX_SYSROOT}") +IF (${SIMULATOR}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mios-simulator-version-min=11.0") +ENDIF() +set(yabause_SOURCES +${yabause_SOURCES} +yglcache.c +ygles.c +yglshaderes.c ) + +set(yabause_SOURCES ${yabause_SOURCES} sndCoreAudio.c) +set(yabause_HEADERS ${yabause_HEADERS} sndCoreAudio.h) + +endif (IOS) + +include_directories(nanovg) +set(yabause_SOURCES ${yabause_SOURCES} nanovg/nanovg.c) + +option(WEB_INTERFACE "Access with http" OFF) +if (WEB_INTERFACE) + add_definitions(-DWEBINTERFACE) + include_directories( webinterface/include ) + add_subdirectory(webinterface) endif() +if (IOS) + # iOS can't use compute shader +else () + set(yabause_SOURCES ${yabause_SOURCES} ygl_texture.cpp) +endif () + option(YAB_WANT_SH2_CACHE "Enable Sh2 cache emulation" OFF) if (YAB_WANT_SH2_CACHE) add_definitions(-DCACHE_ENABLE=1) add_definitions(-DEXEC_FROM_CACHE=1) endif() +#------------------------------------------------------- + +option(YAB_WANT_DYNAREC_DEVMIYAX "Enable Sh2 denyarec by devMiyax" OFF) +if (YAB_WANT_DYNAREC_DEVMIYAX) + add_definitions(-DDYNAREC_DEVMIYAX=1) + + + set(yabause_SOURCES + ${yabause_SOURCES} + sh2_dynarec_devmiyax/DynarecSh2CInterface.cpp + sh2_dynarec_devmiyax/DynarecSh2.cpp) + + set(yabause_HEADERS + ${yabause_HEADERS} + sh2_dynarec_devmiyax/DynarecSh2.h + sh2_dynarec_devmiyax/opcodes.h) + + if (MSVC) # NASM + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${CMAKE_CURRENT_SOURCE_DIR}/sh2_dynarec_devmiyax/dynalib_x86_64 ) + else() + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${CMAKE_CURRENT_SOURCE_DIR}/sh2_dynarec_devmiyax/dynalib ) + endif() + + else() # UNIX(GAS) + if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm") + enable_language(ASM-ATT) + set(yabause_SOURCES + ${yabause_SOURCES} + sh2_dynarec_devmiyax/dynalib_arm.s) + elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64") + enable_language(ASM-ATT) + add_definitions(-DAARCH64) + if (IOS) + set(yabause_SOURCES ${yabause_SOURCES} sh2_dynarec_devmiyax/dynalib_arm64_mach.s) + else () + set(yabause_SOURCES ${yabause_SOURCES} sh2_dynarec_devmiyax/dynalib_arm64.s) + endif () + endif () + endif () + +endif() + option(YAB_USE_SSF "Include SSF player." ON) if (YAB_USE_SSF) find_package(ZLIB) @@ -81,7 +228,7 @@ if (YAB_USE_SCSP2) set(yabause_SOURCES ${yabause_SOURCES} scsp2.c) set(yabause_HEADERS ${yabause_HEADERS} scsp2.h) else() - set(yabause_SOURCES ${yabause_SOURCES} scsp.c) + set(yabause_SOURCES ${yabause_SOURCES} scsp.cpp) endif() # Enable SCSP MIDI hooks in sound interface @@ -101,11 +248,11 @@ if (UNIX) endif() # Bigendian -include(TestBigEndian) -test_big_endian(WORDS_BIGENDIAN) -if (WORDS_BIGENDIAN) - add_definitions(-DWORDS_BIGENDIAN=1) -endif (WORDS_BIGENDIAN) +#include(TestBigEndian) +#test_big_endian(WORDS_BIGENDIAN) +#if (WORDS_BIGENDIAN) +# add_definitions(-DWORDS_BIGENDIAN=1) +#endif (WORDS_BIGENDIAN) include(CheckCSourceCompiles) @@ -182,6 +329,9 @@ if (STDINT_H_FOUND) add_definitions(-DHAVE_STDINT_H=1) endif() +find_package(Threads) +set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + # 16BPP set(YAB_RGB "" CACHE STRING "Bit configuration of pixels in the display buffer.") if (YAB_RGB STREQUAL "555") @@ -194,10 +344,24 @@ endif () option(YAB_WANT_OPENGL "use OpenGL for video output (most ports require it)" ON) if (YAB_WANT_OPENGL AND (YAB_RGB STREQUAL "")) include(FindOpenGL) - if (OPENGL_FOUND) + if (OPENGL_FOUND ) add_definitions(-DHAVE_LIBGL=1) - set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${OPENGL_LIBRARIES}) - + if( USE_EGL ) + add_definitions(-D_OGLES3_) + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} EGL GLESv2) + add_definitions(-DYAB_ASYNC_RENDERING) + else() + add_definitions(-D_OGL3_) + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${OPENGL_LIBRARIES}) + endif() + include_directories(./ ./nanovg) + set(yabause_SOURCES ${yabause_SOURCES} + nanovg/nanovg.c + nanovg/nanovg_osdcore.h + nanovg/nanovg_osdcore.c + ) + add_definitions(-DYAB_PORT_OSD) + include(FindGLUT) if (GLUT_FOUND) message (WARNING "Deprecated Glut found. Support will be removed in the future. ") @@ -207,23 +371,46 @@ if (YAB_WANT_OPENGL AND (YAB_RGB STREQUAL "")) endif() # glXGetProcAddress - set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${OPENGL_LIBRARIES}) - check_function_exists(glXGetProcAddress GLXGETPROCADDRESS_OK) - if (GLXGETPROCADDRESS_OK) - add_definitions(-DHAVE_GLXGETPROCADDRESS=1) + #set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${OPENGL_LIBRARIES}) + #check_function_exists(glXGetProcAddress GLXGETPROCADDRESS_OK) + #if (GLXGETPROCADDRESS_OK) + # add_definitions(-DHAVE_GLXGETPROCADDRESS=1) + #endif() + string(COMPARE EQUAL ${YAB_PORTS} "glfw" glfw) + if( glfw ) + #include( ../CMake/Packages/external_curl.cmake ) + #set(yabause_SOURCES ${yabause_SOURCES} + # test_framework.cpp + # test_framework.h + #) + add_definitions(-DYAB_ASYNC_RENDERING) + endif() + #if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + # add_definitions(-D_OGLES3_) + set(yabause_SOURCES ${yabause_SOURCES} + yglcache.c + ygles.c + yglshaderes.c + ) + #endif() + + if( USE_EGL ) + else() + include(FindGLEW) + add_definitions(-D_USEGLEW_) + if (GLEW_FOUND) + include_directories( ${GLEW_INCLUDE_DIRS}) + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${GLEW_LIBRARIES}) + else() + add_definitions(-DGLEW_STATIC) + include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/gllibs/include/ ) + set(yabause_SOURCES + ${yabause_SOURCES} + gllibs/glew/glew.c) + endif() endif() - add_definitions(-D_OGL3_) - - include(FindGLEW) - add_definitions(-D_USEGLEW_) - if (GLEW_FOUND) - include_directories( ${GLEW_INCLUDE_DIRS}) - set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${GLEW_LIBRARIES}) - else() - add_definitions(-DGLEW_STATIC) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/gllibs/include/ ) - set(yabause_SOURCES ${yabause_SOURCES} gllibs/glew/glew.c) - endif() + + set(yabause_SOURCES ${yabause_SOURCES} yglcache.c ygles.c yglshaderes.c ) endif(OPENGL_FOUND) endif () @@ -251,6 +438,7 @@ if (YAB_WANT_SDL) set(yabause_SOURCES ${yabause_SOURCES} persdljoy.c sndsdl.c) set(yabause_HEADERS ${yabause_HEADERS} persdljoy.h sndsdl.h) endif() + endif() # OpenAL @@ -258,12 +446,11 @@ option(YAB_WANT_OPENAL "use OpenAL sound core if available" ON) if (YAB_WANT_OPENAL) include(FindOpenAL) if (OPENAL_FOUND) - find_package(Threads) add_definitions(-DHAVE_LIBAL=1) include_directories(${OPENAL_INCLUDE_DIR}) set(yabause_SOURCES ${yabause_SOURCES} sndal.c) set(yabause_HEADERS ${yabause_HEADERS} sndal.h) - set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${OPENAL_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} ${OPENAL_LIBRARY}) endif (OPENAL_FOUND) endif (YAB_WANT_OPENAL) @@ -300,7 +487,7 @@ if (MINI18N_FOUND) endif() # APPLE // not necessary mac os x, but i don't care ;) -if (APPLE) +if (APPLE AND NOT IOS) FIND_LIBRARY(COREFOUNDATION_LIBRARY NAMES CoreFoundation ) FIND_LIBRARY(IOKIT_LIBRARY NAMES IOKit ) set(yabause_SOURCES ${yabause_SOURCES} macjoy.c permacjoy.c cd-macosx.c sndmac.c) @@ -311,7 +498,8 @@ if (APPLE) if (HAVE_FBO) add_definitions(-DHAVE_FBO=1) endif() -endif (APPLE) +endif (APPLE AND NOT IOS) + # Visual Studio if (MSVC) @@ -324,11 +512,16 @@ if (MSVC) set(DDK_DIR "$ENV{SYSTEMDRIVE}/WINDDK/7600.16385.0/") endif (EXISTS "$ENV{SYSTEMDRIVE}/WINDDK/3790.1830/") - add_definitions(-DHAVE_C99_VARIADIC_MACROS -D_CRT_SECURE_NO_WARNINGS -DC68K_NO_JUMP_TABLE - -D_UNICODE -DUNICODE) + add_definitions(/MP -DHAVE_C99_VARIADIC_MACROS -D_CRT_SECURE_NO_WARNINGS -DC68K_NO_JUMP_TABLE + -D_UNICODE -DUNICODE -D_NO_DEBUG_HEAP=1) endif (MSVC) +if ( ANDROID_NDK_HOST_SYSTEM_NAME2 MATCHES "windows" ) + add_definitions(-DC68K_NO_JUMP_TABLE) +endif ( ) + if (WIN32) + # Windows ddk option(YAB_WANT_DDK "Use the real DDK instead of the built-in one") if(YAB_WANT_DDK) @@ -352,6 +545,8 @@ if (WIN32) option(YAB_WANT_DIRECTSOUND "use DirectX sound core if available") option(YAB_WANT_DIRECTINPUT "use DirectX input core if available") + set(DXERRH_IS_BROKEN 1 CACHE INTERNAL "dxerr is broken") + # Direct X if (YAB_WANT_DIRECTSOUND OR YAB_WANT_DIRECTINPUT) find_path(DirectX_INCLUDE_DIR dxerr9.h "$ENV{DXSDK_DIR}/Include") @@ -417,7 +612,7 @@ if (WIN32) if (YAB_NETWORK OR YAB_WANT_GDBSTUB) # Add Winsock if necessary set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} "wsock32") - set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} "ws2_32") + set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} "ws2_32") endif() if (YAB_USE_SCSPMIDI) set(YABAUSE_LIBRARIES ${YABAUSE_LIBRARIES} winmm) @@ -430,9 +625,14 @@ option(YAB_WANT_ARM7 "Build a binary with arm7 support") # SH2 dynamic recompiler message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") message(STATUS "CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}") -option(SH2_DYNAREC "SH2 dynamic recompiler" ON) +if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) + option(SH2_DYNAREC "SH2 dynamic recompiler" OFF) +else () + option(SH2_DYNAREC "SH2 dynamic recompiler" ON) +endif() + if (SH2_DYNAREC) - if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + if( ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") ) if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") enable_language(ASM-ATT) set(yabause_SOURCES ${yabause_SOURCES} @@ -469,7 +669,7 @@ if (SH2_DYNAREC) set_source_files_properties(sh2_dynarec/sh2_dynarec.c PROPERTIES COMPILE_FLAGS "-Wno-pointer-to-int-cast -Wno-int-to-pointer-cast") add_definitions(-DSH2_DYNAREC=1 -DHAVE_ARMv6=1 -DHAVE_ARMv7=1) endif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") - if (ANDROID) + if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a") enable_language(ASM-ATT) set(yabause_SOURCES ${yabause_SOURCES} sh2_dynarec/sh2_dynarec.c sh2_dynarec/linkage_arm.s) @@ -477,22 +677,32 @@ if (SH2_DYNAREC) sh2_dynarec/sh2_dynarec.h) set_source_files_properties(sh2_dynarec/sh2_dynarec.c PROPERTIES COMPILE_FLAGS "-Wno-pointer-to-int-cast -Wno-int-to-pointer-cast") add_definitions(-DSH2_DYNAREC=1) - add_definitions(-DANDROID=1) if (YAB_WANT_ARM7) add_definitions(-DHAVE_ARMv6=1 -DHAVE_ARMv7=1) endif() endif () - endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") + add_definitions(-DSH2_DYNAREC=0) + #enable_language(ASM-ATT) + #set(yabause_SOURCES ${yabause_SOURCES} + # sh2_dynarec/sh2_dynarec.c sh2_dynarec/linkage_arm64.s) + # set(yabause_HEADERS ${yabause_HEADERS} + # sh2_dynarec/sh2_dynarec.h) + # set_source_files_properties(sh2_dynarec/sh2_dynarec.c PROPERTIES COMPILE_FLAGS "-Wno-pointer-to-int-cast -Wno-int-to-pointer-cast") + # add_definitions(-DSH2_DYNAREC=1) + endif() + endif( ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") ) endif (SH2_DYNAREC) # c68k -option(YAB_WANT_C68K "enable c68k compilation" ON) +option(YAB_WANT_C68K "enable c68k compilation" OFF) if (YAB_WANT_C68K) include(ExternalProject) ExternalProject_Add(c68kinc DOWNLOAD_COMMAND "" SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/c68k CMAKE_GENERATOR "${CMAKE_GENERATOR}" + #CMAKE_GENERATOR "Visual Studio 12 2013" INSTALL_COMMAND "" BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/c68k ) @@ -504,7 +714,8 @@ if (YAB_WANT_C68K) if (MSVC) set_source_files_properties(c68k/c68kexec.c PROPERTIES COMPILE_FLAGS "/Od /wd4146") else() - set_source_files_properties(c68k/c68kexec.c PROPERTIES COMPILE_FLAGS "-O0") + #set_source_files_properties(c68k/c68kexec.c PROPERTIES COMPILE_FLAGS "-O0") + set_source_files_properties(c68k/c68kexec.c PROPERTIES COMPILE_FLAGS "-O3") endif() endif(YAB_WANT_C68K) @@ -555,6 +766,88 @@ if (YAB_WANT_MUSASHI) set_property(SOURCE ${MUSASHI_GENERATED_SOURCES} ${MUSASHI_GENERATED_HEADERS} PROPERTY GENERATED ON) endif(YAB_WANT_MUSASHI) + +#---------------------------------------------------------------------------- +# Vulkan plugin +#---------------------------------------------------------------------------- + +option(YAB_WANT_VULKAN "Vulkan Graphics Core" OFF) +if (YAB_WANT_VULKAN) + +add_definitions(-DHAVE_VULKAN=1) + +include(vulkan/external_glm.cmake) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") + include(vulkan/external_shaderc.cmake) + include(vulkan/external_glfw.cmake) + set(LIBVULKAN_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/vulkan/include) + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(LIBVULKAN ${CMAKE_CURRENT_SOURCE_DIR}/vulkan/lib/x86_64/vulkan-1.lib ) + else() + set(LIBVULKAN ${CMAKE_CURRENT_SOURCE_DIR}/vulkan/lib/x86/vulkan-1.lib ) + endif() + +else() + set( SHADERC_INCLUDE_DIR ${ANDROID_NDK}/sources/third_party/shaderc/include ) + set( SHADERC_LIBRARY_DIR ${ANDROID_NDK}/sources/third_party/shaderc/libs/c++_shared/${ANDROID_ABI} ) + set( SHADERC_LIBRARIES ${ANDROID_NDK}/sources/third_party/shaderc/libs/c++_shared/${ANDROID_ABI}/libshaderc.a ) + set( LIBVULKAN vulkan ) +endif() + +#${ANDROID_NDK}/sources/third_party/shaderc/libshaderc/include + +set(VULKAN_INCLUDE_DIRS ${GLM_INCLUDE_DIRS} ${GLFW_INCLUDE_DIR} ${SHADERC_INCLUDE_DIR} ${LIBVULKAN_INCLUDE} ) +set(VULKAN_LIBRARIES ${GLFW_LIBRARIES} ${SHADERC_LIBRARIES} ${LIBVULKAN} ) + +set( VULKAN_SOURCES + vulkan/FramebufferRenderer.cpp + vulkan/FramebufferRenderer.h + vulkan/TextureManager.cpp + vulkan/TextureManager.h + vulkan/VertexManager.cpp + vulkan/VulkanTools.cpp + vulkan/VertexManager.h + vulkan/Vdp1Renderer.h + vulkan/Vdp1Renderer.cpp + vulkan/WindowRenderer.h + vulkan/WindowRenderer.cpp + vulkan/VdpPipeline.h + vulkan/VdpPipeline.cpp + vulkan/VdpPipelineFactory.h + vulkan/VdpPipelineFactory.cpp + vulkan/RBGGeneratorVulkan.h + vulkan/VulkanScene.cpp + vulkan/VulkanScene.h + vulkan/VIDVulkan.cpp + vulkan/VIDVulkan.h + vulkan/VIDVulkanCInterface.h + vulkan/Platform.cpp + vulkan/Platform.h + vulkan/Renderer.cpp + vulkan/Renderer.h + vulkan/Shared.cpp + vulkan/Shared.h + vulkan/Window.cpp + vulkan/Window.h + nanovg/nanovg_vulkan_osdcore.cpp +) + +include_directories( ${VULKAN_INCLUDE_DIRS} ) + +set(yabause_SOURCES + ${yabause_SOURCES} + ${VULKAN_SOURCES} +) + +#set(YABAUSE_LIBRARIES +# ${YABAUSE_LIBRARIES} +# ${VULKAN_LIBRARIES} +#) + +endif(YAB_WANT_VULKAN) + # q68 option(YAB_WANT_Q68 "enable q68 compilation" OFF) if (YAB_WANT_Q68) @@ -574,7 +867,7 @@ if (YAB_WANT_GDBSTUB) endif() # *DEBUG -set(YAB_DEBUG "" CACHE STRING "List of enabled debug information") +set(YAB_DEBUG "" CACHE STRING "List of enabled debug information") foreach(DEBUG IN LISTS YAB_DEBUG) if (${DEBUG} STREQUAL "main") add_definitions(-DDEBUG=1) @@ -626,27 +919,35 @@ endif() # Yabause Arch if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") add_definitions(-DARCH_IS_MACOSX=1) - set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-dummy.c) + set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-linux.cpp /*thr-dummy.c*/ ) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") + add_definitions(-DARCH_IS_MACOSX=1) + set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-linux.cpp /*thr-dummy.c*/ ) elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") add_definitions(-DARCH_IS_FREEBSD=1) set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-dummy.c cd-freebsd.c) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Switch") +# add_definitions(-DARCH_IS_FREEBSD=1) + set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-nx.c ) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Android" ) add_definitions(-DARCH_IS_LINUX=1) - set(yabause_SOURCES ${yabause_SOURCES} sock-linux.c thr-linux.c cd-linux.c) - - check_include_file("linux/joystick.h" LINUX_HAS_JOYSTICK) - if (LINUX_HAS_JOYSTICK) - set(yabause_SOURCES ${yabause_SOURCES} perlinuxjoy.c) - set(yabause_HEADERS ${yabause_HEADERS} perlinuxjoy.h) + set(yabause_SOURCES ${yabause_SOURCES} sock-linux.c thr-linux.cpp cd-linux.c) + + if (!ANDROID) + check_include_file("linux/joystick.h" LINUX_HAS_JOYSTICK) + if (LINUX_HAS_JOYSTICK) + set(yabause_SOURCES ${yabause_SOURCES} perlinuxjoy.c) + set(yabause_HEADERS ${yabause_HEADERS} perlinuxjoy.h) + endif() + + check_c_source_compiles(" + #include + int main(int argc, char ** argv) { int i = CDSL_CURRENT; } + " LINUX_CDROM_H_OK) + if (NOT LINUX_CDROM_H_OK) + add_definitions(-DLINUX_CDROM_H_IS_BROKEN) + endif (NOT LINUX_CDROM_H_OK) endif() - - check_c_source_compiles(" - #include - int main(int argc, char ** argv) { int i = CDSL_CURRENT; } - " LINUX_CDROM_H_OK) - if (NOT LINUX_CDROM_H_OK) - add_definitions(-DLINUX_CDROM_H_IS_BROKEN) - endif (NOT LINUX_CDROM_H_OK) elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") add_definitions(-DARCH_IS_NETBSD=1) set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-dummy.c cd-netbsd.c) @@ -661,22 +962,45 @@ else () set(yabause_SOURCES ${yabause_SOURCES} sock-dummy.c thr-dummy.c) endif () -set(YAB_OPTIMIZATION "-O3" CACHE STRING "Override optimization level") +set(ENABLE_SANITIZER OFF CACHE BOOL "Enable/Disable Sanitizer" ) +if(ENABLE_SANITIZER) +set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=leak -fsanitize-recover=address" ) +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=leak -fsanitize-recover=address" ) +endif() + +if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) + set(CMAKE_TOOLCHAIN_PREFIX "llvm-") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -stdlib=libc++") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++") +endif() if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION} -march=i686 -msse") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION} -std=gnu99 -march=i686 -msse") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fPIC -std=gnu99 ${YAB_OPTIMIZATION}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fPIC -std=c++17 ${YAB_OPTIMIZATION}") endif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv5tel") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION}") endif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv5tel") if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION}") + #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -mcpu=cortex-a8 -mfpu=vfp -mfloat-abi=hard") + #set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -O3 -mcpu=cortex-a8 -mfpu=vfp -mfloat-abi=hard") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -g -fomit-frame-pointer -mcpu=cortex-a15.cortex-a7 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4") + set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -O3 -g -fomit-frame-pointer -mcpu=cortex-a15.cortex-a7 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4") + endif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") -if(ANDROID) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${YAB_OPTIMIZATION}") +if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -march=armv7ve -mcpu=cortex-a15 -mfpu=neon -fno-math-errno -ffast-math") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7ve -std=c++17 -mcpu=cortex-a15 -mfpu=neon -ffast-math -fno-math-errno -fno-rtti") +endif() +if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") + add_definitions(-DAARCH64) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=c99 -march=armv8-a") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -march=armv8-a -std=c++17 ") endif() # Warnings defined to know when we're breaking compilation with MSVC @@ -707,7 +1031,36 @@ endif() add_definitions(-DPACKAGE=\"${YAB_PACKAGE}\") add_definitions(-DVERSION=\"${YAB_VERSION}\") -add_library(yabause ${yabause_SOURCES} ${yabause_HEADERS}) +if( IOS ) + add_library(yabause OBJECT ${yabause_SOURCES} ${yabause_HEADERS}) +else() + add_library(yabause ${yabause_SOURCES} ${yabause_HEADERS}) +endif() + +assign_source_group(${yabause_SOURCES}) + +#---------------------------------------------------------------------- +# Library for vulkan plugin +if(YAB_WANT_VULKAN) + if(WIN32) + add_dependencies(yabause shaderc) + endif() +add_dependencies(yabause glm) +endif(YAB_WANT_VULKAN) + +#----------------------------------------------------------------------- +# libCHD +include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libchdr.cmake ) +include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_zlib.cmake ) +#include_directories(${zlib_INCLUDE_DIR}) +add_dependencies(yabause libchdr) +#add_dependencies(yabause zlib) + +if(WIN32) + # Windows need to build zlib + add_dependencies(yabause zlib) + include_directories(${zlib_INCLUDE_DIR}) +endif() if (YAB_WANT_C68K) add_dependencies(yabause c68kinc) @@ -729,8 +1082,8 @@ endmacro(yab_port_stop) macro(yab_port_success YAB_TARGET) if (NOT YAB_MULTIBUILD) - set_target_properties(${YAB_TARGET} PROPERTIES OUTPUT_NAME yabause) - set(YAB_PORT_NAME "yabause") + set_target_properties(${YAB_TARGET} PROPERTIES OUTPUT_NAME yabasanshiro) + set(YAB_PORT_NAME "yabasanshiro") else () set(YAB_PORT_NAME ${YAB_TARGET}) endif () @@ -742,9 +1095,6 @@ if (NOT $ENV{PKGMANDIR} STREQUAL "") set(YAB_MAN_DIR $ENV{PKGMANDIR}) endif () -option(YAB_MULTIBUILD "Choose wether to build all ports or only a single one") -set(YAB_PORT_BUILT FALSE) -set(YAB_PORTS "gtk;qt;dreamcast;cocoa;runner" CACHE STRING "List of ports to build") foreach(PORT IN LISTS YAB_PORTS) add_subdirectory(${PORT}) endforeach(PORT) @@ -773,3 +1123,6 @@ option(YAB_TESTS "Build test programs for cores" OFF) if (YAB_TESTS) add_subdirectory("tools") endif() + + + diff --git a/yabause/src/Counter.cpp b/yabause/src/Counter.cpp new file mode 100755 index 0000000000..1cf7dd8227 --- /dev/null +++ b/yabause/src/Counter.cpp @@ -0,0 +1,79 @@ +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#if defined(IOS) +#include +#else +#include +#endif +#include +#include "core.h" +#include "sh2core.h" +#include "debug.h" +#include "yabause.h" +#include +#include +#include + +using std::atomic; + +atomic m68k_counter(0); +atomic m68k_counter_done(0); + +std::mutex m68k_mtx_; +std::condition_variable m68k_cond_; + +const u64 MAX_SCSP_COUNTER = (u64)(44100 * 256 / 60) << SCSP_FRACTIONAL_BITS; + +extern "C" { + void SyncCPUtoSCSP(); + extern u64 g_m68K_dec_cycle; + + void setM68kCounter(u64 counter) { + m68k_counter = counter; + } + + void setM68kDoneCounter(u64 counter) { + m68k_counter_done = counter; + } + + u64 getM68KCounter() { + return m68k_counter; + } + + void syncM68K() { + int timeout = 0; +/* + m68k_counter += (2 << SCSP_FRACTIONAL_BITS); + g_m68K_dec_cycle += (2 << SCSP_FRACTIONAL_BITS); + if (m68k_counter >= MAX_SCSP_COUNTER) { + SyncCPUtoSCSP(); + } +*/ + u64 a = (m68k_counter >> SCSP_FRACTIONAL_BITS); + u64 b = m68k_counter_done; + //LOG("[CPU] INC m68k_counter %lld/%lld", a, b); + while ( (m68k_counter >> SCSP_FRACTIONAL_BITS) > m68k_counter_done) { timeout++; }; + } + +} + diff --git a/yabause/src/PlayRecorder.cpp b/yabause/src/PlayRecorder.cpp new file mode 100644 index 0000000000..0227c9d5b6 --- /dev/null +++ b/yabause/src/PlayRecorder.cpp @@ -0,0 +1,604 @@ +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + + ## File structure + + - [Gamcode]_[YYYY_MM_DD_HH_MM_SS] + - record.json + - [framenumber].png + - backup.bin + + + ## Scheme of record.json + + - records + - frame + - port1 + - port2 + - screenshots + - frame + - setting + - isUseBios + +*/ + +#include +#include +#include +#include +#include +#include +#include + + +#include "bios.h" +#include "json/json.h" +#include "yabause.h" +#include "smpc.h" +#include "cs2.h" +#include "threads.h" +#include "debug.h" + +#include "PlayRecorder.h" + + +#define LOGTAG "PlayRecorder" +using namespace std; +using namespace Json; +using std::unique_ptr; +using std::ostringstream; + +extern "C" { + extern PortData_struct PORTDATA1; + extern PortData_struct PORTDATA2; + void YabauseReset(void); +} + +#include + +#define CHUNK_SIZE 16384 + +int compress_file(const char* input_path, const char* output_path) { + FILE* input_file = fopen_utf8(input_path, "rb"); + if (!input_file) { + perror("Failed to open input file"); + return -1; + } + + FILE* output_file = fopen_utf8(output_path, "wb"); + if (!output_file) { + perror("Failed to open output file"); + fclose(input_file); + return -1; + } + + z_stream strm; + memset(&strm, 0, sizeof(z_stream)); + + if (deflateInit(&strm, Z_BEST_COMPRESSION) != Z_OK) { + perror("Failed to initialize zlib"); + fclose(input_file); + fclose(output_file); + return -1; + } + + unsigned char in_buffer[CHUNK_SIZE]; + unsigned char out_buffer[CHUNK_SIZE]; + + strm.next_out = out_buffer; + strm.avail_out = CHUNK_SIZE; + + int ret; + + do { + strm.next_in = in_buffer; + strm.avail_in = fread(in_buffer, 1, CHUNK_SIZE, input_file); + + if (ferror(input_file)) { + perror("Failed to read input file"); + ret = -1; + break; + } + + ret = deflate(&strm, feof(input_file) ? Z_FINISH : Z_NO_FLUSH); + + if (ret == Z_STREAM_ERROR) { + perror("Failed to compress data"); + break; + } + + size_t have = CHUNK_SIZE - strm.avail_out; + if (fwrite(out_buffer, 1, have, output_file) != have || ferror(output_file)) { + perror("Failed to write compressed data"); + ret = -1; + break; + } + + strm.next_out = out_buffer; + strm.avail_out = CHUNK_SIZE; + } while (ret != Z_STREAM_END); + + deflateEnd(&strm); + + fclose(input_file); + fclose(output_file); + + return ret == Z_STREAM_END ? 0 : -1; +} + +int decompress_file(const char* input_path, const char* output_path) { + FILE* input_file = fopen_utf8(input_path, "rb"); + if (!input_file) { + perror("Failed to open input file"); + return -1; + } + + FILE* output_file = fopen_utf8(output_path, "wb"); + if (!output_file) { + perror("Failed to open output file"); + fclose(input_file); + return -1; + } + + z_stream strm; + memset(&strm, 0, sizeof(z_stream)); + + if (inflateInit(&strm) != Z_OK) { + perror("Failed to initialize zlib"); + fclose(input_file); + fclose(output_file); + return -1; + } + + unsigned char in_buffer[CHUNK_SIZE]; + unsigned char out_buffer[CHUNK_SIZE]; + + strm.next_out = out_buffer; + strm.avail_out = CHUNK_SIZE; + + int ret; + + do { + strm.next_in = in_buffer; + strm.avail_in = fread(in_buffer, 1, CHUNK_SIZE, input_file); + + if (ferror(input_file)) { + perror("Failed to read input file"); + ret = -1; + break; + } + + if (strm.avail_in == 0) + break; + + ret = inflate(&strm, Z_NO_FLUSH); + + if (ret == Z_STREAM_ERROR) { + perror("Failed to decompress data"); + break; + } + + size_t have = CHUNK_SIZE - strm.avail_out; + if (fwrite(out_buffer, 1, have, output_file) != have || ferror(output_file)) { + perror("Failed to write decompressed data"); + ret = -1; + break; + } + + strm.next_out = out_buffer; + strm.avail_out = CHUNK_SIZE; + } while (ret != Z_STREAM_END); + + inflateEnd(&strm); + + fclose(input_file); + fclose(output_file); + + return ret == Z_STREAM_END ? 0 : -1; +} + +#if defined(IOS) || defined(WIN32) +#include +namespace fs = std::filesystem; +#else +#include +namespace fs = std::experimental::filesystem; +#endif + + + +std::pair getParentAndLeaf(const std::string& path) { + fs::path fsPath(path); + std::string parentPath = fsPath.parent_path().string(); + std::string leaf = fsPath.filename().string(); + return std::make_pair(parentPath, leaf); +} + + + +PlayRecorder::PlayRecorder() { + mode_ = IDLE; + scindex_ = 0; + index_ = 0; + take_screenshot = false; + basedir = "./"; + f_takeScreenshot = nullptr; +} + +PlayRecorder * PlayRecorder::instance = NULL; + + void PlayRecorder::PerKeyRecordInit() { + for (int i = 0; i < PORTDATA1.size; i++) { + PORTDATA1Pre.data[i] = PORTDATA1.data[i]; + } + for (int i = 0; i < PORTDATA2.size; i++) { + PORTDATA2Pre.data[i] = PORTDATA2.data[i]; + } + } + +#ifdef _WINDOWS +#include +namespace fs = std::filesystem; +extern "C" int YabMakeCleanDir(const char * dirname) { + fs::remove_all(dirname); + if (fs::create_directories(dirname) == false) { + printf("Fail to create %s\n", dirname); + return -1; + } + return 0; +} +#elif IOS +#include +namespace fs = filesystem; +#else +#include +namespace fs = experimental::filesystem; +#endif + + + int PlayRecorder::startRocord() { + + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + std::time_t t_c = std::chrono::system_clock::to_time_t(now); + std::ostringstream ss; + ss << Cs2GetCurrentGmaecode(); + + if ( ss.str() == "" || ss.str().empty() ) { + ss << Cs2GetCurrentGameName(); + if (ss.str() == "" || ss.str().empty() ) { + ss << std::put_time(std::localtime(&t_c), "_%Y_%m_%d_%H_%M_%S"); + } + } + + std::string dirname = basedir + ss.str(); + + try { + YabMakeCleanDir(dirname.c_str()); + const char * backup = YabauseThread_getBackupPath(); + std::string dst_path = dirname + "/backup.bin.gz"; + compress_file(backup, dst_path.c_str()); + } + catch (std::exception e) { + return -1; + } + + record_.clear(); + if (YabauseThread_IsUseBios() == 0) { + record_["setting"]["isUseBios"] = true; + } + else { + record_["setting"]["isUseBios"] = false; + } + + std::ostringstream ssdate; + ssdate << std::put_time(std::localtime(&t_c), "_%Y_%m_%d_%H_%M_%S"); + string date = ssdate.str(); + record_["setting"]["date"] = date; + + mode_ = RECORDING; + dirname_ = dirname; + PerKeyRecordInit(); + YabauseReset(); + take_screenshot = false; + return 0; + } + +int PlayRecorder::stopRocord() { + if (mode_ != RECORDING) return -1; + + Json::Value item; + + // Terminator + item["port1"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA1.size; i++) { + item["port1"].append(PORTDATA1.data[i]); + } + + item["port2"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA2.size; i++) { + item["port2"].append(PORTDATA2.data[i]); + } + item["frame"] = current_frame; + record_["records"].append(item); + + ofstream record_file; + string fname = dirname_ + "/record.json"; + record_file.open(fname); + using namespace Json; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer(builder.newStreamWriter()); + writer->write(record_, &record_file); + record_file << std::endl; // add lf and flush + record_file.close(); + mode_ = IDLE; + return 0; +} + +int PlayRecorder::startPlay( const char * recorddir, bool clodboot, yabauseinit_struct *init ) { + + YabauseThread_resetPlaymode(); + + ifstream record_file; + string fname = string(recorddir) + "/record.json"; + try { + record_.clear(); + record_file.open(fname); + Json::CharReaderBuilder rbuilder; + rbuilder["collectComments"] = false; + std::string errs; + bool ok = Json::parseFromStream(rbuilder, record_file, &record_, &errs); + record_file.close(); + if (!ok) { + printf("Fail to read %s\n", fname.c_str()); + return -1; + } + }catch( exception e) + { + LOG(e.what()); + return -1; + } + index_ = 0; + scindex_ = 0; + + if (record_["setting"]["isUseBios"].asBool() == false) { + YabauseThread_setUseBios(0); + } + else { + YabauseThread_setUseBios(-1); + } + + string date = record_["setting"]["date"].asString(); + int y, m, d, h, M, s; + tm ymd; + sscanf(date.c_str(), "_%d_%d_%d_%d_%d_%d", &y,&m,&d,&h,&M,&s); + ymd.tm_year = y - 1900; + ymd.tm_mon = m - 1; + ymd.tm_mday = d; + ymd.tm_hour = h; + ymd.tm_min = M; + ymd.tm_sec = s; + this->start_time = mktime(&ymd); + + string fnameback = string(recorddir) + "/backup.bin.gz"; + dirname_ = recorddir; + std::pair dp = getParentAndLeaf(dirname_); + dirname_ = dp.first + "/out/" + dp.second; + printf("Dir is %s\n", dirname_.c_str()); + YabMakeCleanDir(dirname_.c_str()); + fnameback_test = dirname_ + "/backup.bin.new"; + //YabCopyFile(fnameback.c_str(), fnameback_test.c_str()); + decompress_file(fnameback.c_str(), fnameback_test.c_str()); + YabauseThread_setBackupPath(fnameback_test.c_str()); + mode_ = PLAYING; + if (clodboot) { + YabauseThread_coldBoot(); + } + if( init ){ + init->buppath = fnameback_test.c_str(); + } + return 0; +} + +#include "osdcore.h" + +int PlayRecorder::proc(u32 framecount) { + + current_frame = framecount; + + if (mode_ == RECORDING) { + framecount += 2; + OSDPushMessage(OSDMSG_RECORD, 1, "%d: %08X", framecount, (PORTDATA1.data[0] << 24) | (PORTDATA1.data[1] << 16) | (PORTDATA1.data[2] << 8) | PORTDATA1.data[3]); + PerKeyRecord(framecount, record_); + + if( framecount % screenshot_per_frame == 0 ) { + take_screenshot = true; + } + + if (take_screenshot) { + take_screenshot = false; + std::string fname; + ostringstream ss; + ss << dirname_ << "/" << framecount << ".png"; + fname = ss.str(); + f_takeScreenshot(fname.c_str()); + record_["screenshots"].append(framecount); + } + + return 0; + } + + if (mode_ == PLAYING) { + if (framecount == 1) { + SmpcSetClockSync(1, (u32)this->start_time); + } + + if (index_ >= record_["records"].size()) { + mode_ = IDLE; + + Json::Value item; + +#if RECORD_CHECK + item["port1"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA1.size; i++) { + item["port1"].append(PORTDATA1.data[i]); + } + + item["port2"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA2.size; i++) { + item["port2"].append(PORTDATA2.data[i]); + } + item["frame"] = current_frame; + record_check["records"].append(item); + + ofstream record_file; + string fname = dirname_ + "/record_check.json"; + record_file.open(fname); + using namespace Json; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer(builder.newStreamWriter()); + writer->write(record_, &record_file); + record_file << std::endl; // add lf and flush + record_file.close(); +#endif + + printf("Test is finished\n"); + exit(0); + return -1; // Finish + } + + if ( (framecount) == record_["records"][index_]["frame"].asUInt()) { + PerKeyPlay(record_["records"][index_]); +#if RECORD_CHECK + PerKeyRecord(framecount, record_check); +#endif + index_++; + } + + OSDPushMessage(OSDMSG_RECORD, 1, "%d: %08X", framecount, (PORTDATA1.data[0] << 24) | (PORTDATA1.data[1] << 16) | (PORTDATA1.data[2] << 8) | PORTDATA1.data[3]); + + if ( (framecount) == record_["screenshots"][scindex_].asUInt()) { + if( f_takeScreenshot ){ + std::string fname; + ostringstream ss; + ss << dirname_ << "/" << current_frame << ".png"; + fname = ss.str(); + printf("Take screen shot for %s\n", fname.c_str()); + f_takeScreenshot(fname.c_str()); + } + scindex_++; + } + + + } + return 0; +} + + +void PlayRecorder::PerKeyRecord(u32 frame, Json::Value & recordArray) { + Json::Value item; + int change = 0; + + for (int i = 0; i < PORTDATA1.size; i++) { + if (PORTDATA1.data[i] != PORTDATA1Pre.data[i]) { + change += 1; + } + PORTDATA1Pre.data[i] = PORTDATA1.data[i]; + } + + for (int i = 0; i < PORTDATA2.size; i++) { + if (PORTDATA2.data[i] != PORTDATA2Pre.data[i]) { + change += 1; + } + PORTDATA2Pre.data[i] = PORTDATA2.data[i]; + } + + if (change == 0) { + return; + } + + item["port1"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA1.size; i++) { + item["port1"].append(PORTDATA1.data[i]); + } + + item["port2"] = Json::Value(Json::arrayValue); + for (int i = 0; i < PORTDATA2.size; i++) { + item["port2"].append(PORTDATA2.data[i]); + } + item["frame"] = frame; + recordArray["records"].append(item); +} + +void PlayRecorder::PerKeyPlay(Json::Value & item) { + + for (int i = 0; i < 8; i++) { + PORTDATA1.data[i] = 0; + } + + for (int i = 0; i < item["port1"].size(); i++) { + PORTDATA1.data[i] = (u8)item["port1"][i].asUInt(); + } + PORTDATA1.size = item["port1"].size(); + + for (int i = 0; i < item["port2"].size(); i++) { + PORTDATA2.data[i] = (u8)item["port2"][i].asUInt(); + } + PORTDATA2.size = item["port2"].size(); +} + +void PlayRecorder::takeShot() { + take_screenshot = true; // take screen shot on nextframe +} + +void PlayRecorder::getVirtualTime(time_t * t) { + u64 ctime = this->start_time + ((u64)this->current_frame * 1001 / 60000); + *t = ctime; +} + +extern "C" { + void PlayRecorder_proc( u32 framecount ) { + PlayRecorder * p = PlayRecorder::getInstance(); + p->proc(framecount); + } + + int PlayRecorder_getStatus() { + PlayRecorder * p = PlayRecorder::getInstance(); + return p->getStatus(); + } + + int PlayRecorder_getVirtualTime(time_t * t ) { + PlayRecorder * p = PlayRecorder::getInstance(); + p->getVirtualTime(t); + return 0; + } + + + void PlayRecorder_setPlayMode( const char * dir, yabauseinit_struct *init ) { + PlayRecorder * p = PlayRecorder::getInstance(); + p->startPlay(dir,false, init); + } + +} \ No newline at end of file diff --git a/yabause/src/PlayRecorder.h b/yabause/src/PlayRecorder.h new file mode 100644 index 0000000000..71a9ca6988 --- /dev/null +++ b/yabause/src/PlayRecorder.h @@ -0,0 +1,98 @@ +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "BackupManager.h" +#include "bios.h" + + +#include "json/json.h" +#include +#include +#include +#include +#include +#include "smpc.h" +#include + +using namespace std; +using namespace Json; +using std::unique_ptr; +using std::ostringstream; + +#define RECORD_CHECK 0 + +class PlayRecorder { +private: + PlayRecorder(); + static PlayRecorder * instance; + + PortData_struct PORTDATA1Pre; + PortData_struct PORTDATA2Pre; + u32 index_; + u32 scindex_; + Json::Value record_; +#if RECORD_CHECK + Json::Value record_check; +#endif + u32 current_frame; + std::string dirname_; + bool take_screenshot; + u64 start_time; + string fnameback_test; + + string basedir; + + int screenshot_per_frame = 60*10; + +public: + enum eStatus { + IDLE = -1, + RECORDING = 0, + PLAYING = 1 + }; + static PlayRecorder * getInstance() { + if (PlayRecorder::instance == NULL) { + PlayRecorder::instance = new PlayRecorder(); + } + return PlayRecorder::instance; + } + void PerKeyRecordInit(); + eStatus getStatus() { + return mode_; + } + int startRocord(); + int stopRocord(); + int startPlay( const char * record_dir, bool clodboot, yabauseinit_struct *init); + int proc(u32 framecount); + void PerKeyRecord(u32 frame, Json::Value & recordArray); + void PerKeyPlay(Json::Value & item); + void getVirtualTime(time_t * t); + + std::function f_takeScreenshot; + + void takeShot(); + + void setBaseDir( const char * dir){ basedir = dir; } + +private: + eStatus mode_; + +}; + diff --git a/yabause/src/about.c b/yabause/src/about.c new file mode 100644 index 0000000000..a47830de8a --- /dev/null +++ b/yabause/src/about.c @@ -0,0 +1,6846 @@ +/* Autogenerated by bin2c */ + +#include + +uint8_t about_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0xd0, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xcf, 0x7d, 0xdd, 0x56, 0x00, 0x00, 0x01, + 0x84, 0x69, 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x28, 0x91, 0x7d, 0x91, 0x3d, 0x48, + 0xc3, 0x40, 0x1c, 0xc5, 0x5f, 0x53, 0xa5, 0x22, 0x15, 0x07, 0xab, 0x48, + 0x71, 0xc8, 0x50, 0x9d, 0x2c, 0x88, 0x8a, 0x3a, 0x6a, 0x15, 0x8a, 0x50, + 0xa1, 0xd4, 0x0a, 0xad, 0x3a, 0x98, 0x5c, 0xfa, 0x05, 0x4d, 0x1a, 0x92, + 0x14, 0x17, 0x47, 0xc1, 0xb5, 0xe0, 0xe0, 0xc7, 0x62, 0xd5, 0xc1, 0xc5, + 0x59, 0x57, 0x07, 0x57, 0x41, 0x10, 0xfc, 0x00, 0x71, 0x74, 0x72, 0x52, + 0x74, 0x91, 0x12, 0xff, 0x97, 0x14, 0x5a, 0xc4, 0x78, 0x70, 0xdc, 0x8f, + 0x77, 0xf7, 0x1e, 0x77, 0xef, 0x00, 0xa1, 0x5e, 0x66, 0xaa, 0xd9, 0x31, + 0x06, 0xa8, 0x9a, 0x65, 0xa4, 0xe2, 0x31, 0x31, 0x93, 0x5d, 0x15, 0x03, + 0xaf, 0x08, 0x60, 0x00, 0xfd, 0x08, 0x63, 0x5a, 0x62, 0xa6, 0x3e, 0x97, + 0x4c, 0x26, 0xe0, 0x39, 0xbe, 0xee, 0xe1, 0xe3, 0xeb, 0x5d, 0x94, 0x67, + 0x79, 0x9f, 0xfb, 0x73, 0xf4, 0x28, 0x39, 0x93, 0x01, 0x3e, 0x91, 0x78, + 0x96, 0xe9, 0x86, 0x45, 0xbc, 0x41, 0x3c, 0xb5, 0x69, 0xe9, 0x9c, 0xf7, + 0x89, 0x43, 0xac, 0x28, 0x29, 0xc4, 0xe7, 0xc4, 0xa3, 0x06, 0x5d, 0x90, + 0xf8, 0x91, 0xeb, 0xb2, 0xcb, 0x6f, 0x9c, 0x0b, 0x0e, 0x0b, 0x3c, 0x33, + 0x64, 0xa4, 0x53, 0xf3, 0xc4, 0x21, 0x62, 0xb1, 0xd0, 0xc6, 0x72, 0x1b, + 0xb3, 0xa2, 0xa1, 0x12, 0x4f, 0x12, 0x47, 0x14, 0x55, 0xa3, 0x7c, 0x21, + 0xe3, 0xb2, 0xc2, 0x79, 0x8b, 0xb3, 0x5a, 0xae, 0xb2, 0xe6, 0x3d, 0xf9, + 0x0b, 0x83, 0x39, 0x6d, 0x65, 0x99, 0xeb, 0x34, 0x87, 0x10, 0xc7, 0x22, + 0x96, 0x90, 0x84, 0x08, 0x19, 0x55, 0x94, 0x50, 0x86, 0x85, 0x28, 0xad, + 0x1a, 0x29, 0x26, 0x52, 0xb4, 0x1f, 0xf3, 0xf0, 0x87, 0x1d, 0x7f, 0x92, + 0x5c, 0x32, 0xb9, 0x4a, 0x60, 0xe4, 0x58, 0x40, 0x05, 0x2a, 0x24, 0xc7, + 0x0f, 0xfe, 0x07, 0xbf, 0xbb, 0x35, 0xf3, 0x13, 0xe3, 0x6e, 0x52, 0x30, + 0x06, 0x74, 0xbe, 0xd8, 0xf6, 0xc7, 0x30, 0x10, 0xd8, 0x05, 0x1a, 0x35, + 0xdb, 0xfe, 0x3e, 0xb6, 0xed, 0xc6, 0x09, 0xe0, 0x7f, 0x06, 0xae, 0xb4, + 0x96, 0xbf, 0x52, 0x07, 0x66, 0x3e, 0x49, 0xaf, 0xb5, 0xb4, 0xc8, 0x11, + 0xd0, 0xbb, 0x0d, 0x5c, 0x5c, 0xb7, 0x34, 0x79, 0x0f, 0xb8, 0xdc, 0x01, + 0x06, 0x9f, 0x74, 0xc9, 0x90, 0x1c, 0xc9, 0x4f, 0x53, 0xc8, 0xe7, 0x81, + 0xf7, 0x33, 0xfa, 0xa6, 0x2c, 0xd0, 0x77, 0x0b, 0x74, 0xaf, 0xb9, 0xbd, + 0x35, 0xf7, 0x71, 0xfa, 0x00, 0xa4, 0xa9, 0xab, 0xc4, 0x0d, 0x70, 0x70, + 0x08, 0x8c, 0x14, 0x28, 0x7b, 0xdd, 0xe3, 0xdd, 0x5d, 0xed, 0xbd, 0xfd, + 0x7b, 0xa6, 0xd9, 0xdf, 0x0f, 0xb6, 0x68, 0x72, 0xc2, 0x51, 0xde, 0x7f, + 0xa3, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, + 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, + 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, + 0x07, 0xe6, 0x07, 0x16, 0x16, 0x22, 0x19, 0x10, 0xe9, 0xb7, 0x4e, 0x00, + 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0x0e, 0x17, + 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0xdd, + 0x57, 0x77, 0x5c, 0x57, 0x9a, 0xe6, 0xf9, 0x67, 0x9f, 0x13, 0x3e, 0x02, + 0x01, 0xef, 0xe8, 0x40, 0x2b, 0x51, 0x12, 0x65, 0xb2, 0xa4, 0xac, 0xcc, + 0xca, 0xc9, 0xaa, 0xec, 0x9e, 0xee, 0x99, 0xcf, 0x30, 0x37, 0xf3, 0x09, + 0xe7, 0x66, 0x66, 0xf5, 0x55, 0xcd, 0x74, 0x57, 0x55, 0x57, 0x66, 0x56, + 0x2a, 0x95, 0xb2, 0xf4, 0x24, 0x40, 0x10, 0xde, 0x03, 0x81, 0xf0, 0x11, + 0xc7, 0xec, 0x3d, 0x17, 0x01, 0x42, 0x94, 0x28, 0x89, 0x0e, 0x11, 0x30, + 0xf1, 0xff, 0xad, 0x05, 0x25, 0xc9, 0x04, 0xc2, 0x6c, 0xec, 0x73, 0x70, + 0xce, 0x83, 0x77, 0xef, 0xd7, 0x3c, 0x9e, 0x5f, 0x72, 0x02, 0x80, 0x3e, + 0xe4, 0x1c, 0xa7, 0x3f, 0x00, 0x00, 0x80, 0xb3, 0xce, 0x18, 0x23, 0x63, + 0x0c, 0xd7, 0x7e, 0x00, 0xfa, 0x5a, 0x82, 0x21, 0x00, 0xd0, 0x8f, 0x9c, + 0x73, 0x32, 0xc6, 0x30, 0x10, 0x00, 0x00, 0x00, 0x67, 0xfd, 0xba, 0x4f, + 0x4e, 0xc6, 0x71, 0xdd, 0x07, 0xa0, 0xbf, 0x79, 0x0c, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x76, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, + 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, + 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x86, 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, + 0x11, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x18, 0x01, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x25, 0x18, 0x02, + 0x00, 0x00, 0xd0, 0x2b, 0xc6, 0x48, 0xc6, 0x18, 0x99, 0x83, 0xbf, 0x38, + 0xe7, 0x64, 0xed, 0x8b, 0x9f, 0xe3, 0x79, 0xe6, 0xb9, 0x7f, 0x71, 0xcf, + 0xfe, 0x1f, 0x39, 0xe7, 0x5e, 0x78, 0xcc, 0xce, 0x3f, 0xb9, 0xe7, 0xfe, + 0x0c, 0xbc, 0xc9, 0xdc, 0x34, 0x3f, 0x98, 0x83, 0xcf, 0xcf, 0xb9, 0xce, + 0x87, 0xe4, 0xe4, 0xa4, 0x83, 0x3f, 0x5b, 0x6b, 0x0f, 0xe6, 0xaf, 0x93, + 0x75, 0x4e, 0x92, 0x3b, 0xfc, 0xfb, 0x8f, 0x1f, 0xd7, 0xf3, 0x3c, 0xf9, + 0xbe, 0xa7, 0x54, 0x32, 0x21, 0xdf, 0xf7, 0x3a, 0x8f, 0xc5, 0x64, 0x05, + 0x00, 0x00, 0x3d, 0x44, 0x00, 0x08, 0x00, 0x00, 0xba, 0xce, 0x18, 0x23, + 0xdf, 0x37, 0x0a, 0x43, 0xab, 0xcd, 0xad, 0x9a, 0x56, 0xd6, 0xca, 0xaa, + 0x56, 0x5b, 0x8a, 0x22, 0x2b, 0x6b, 0xad, 0xf4, 0x5c, 0xde, 0xe7, 0x79, + 0x9d, 0xc0, 0x44, 0x92, 0x3c, 0x23, 0xf9, 0x09, 0x5f, 0x09, 0xdf, 0x53, + 0x2a, 0x95, 0x50, 0x3a, 0xe5, 0x2b, 0x93, 0x49, 0x2a, 0x9d, 0x4a, 0x28, + 0x99, 0xf4, 0x95, 0x48, 0x78, 0x4a, 0xa7, 0x7c, 0xa5, 0xd3, 0xbe, 0x52, + 0x29, 0xbf, 0xf3, 0xb5, 0xc6, 0xe8, 0xe0, 0xcb, 0x65, 0x0f, 0x82, 0x96, + 0x67, 0x01, 0x0e, 0x70, 0x18, 0x42, 0x1b, 0x73, 0x18, 0x1e, 0x47, 0x71, + 0xac, 0xb0, 0x1d, 0x29, 0x0c, 0x63, 0xb5, 0x83, 0x40, 0xad, 0x76, 0xa0, + 0x66, 0x2b, 0x50, 0x3b, 0x08, 0x15, 0x04, 0xa1, 0xa2, 0x28, 0x52, 0x10, + 0x46, 0x8a, 0xa2, 0x58, 0x51, 0x14, 0x2b, 0xb6, 0x56, 0x51, 0x1c, 0xcb, + 0xc6, 0x4e, 0x71, 0x1c, 0x2b, 0x76, 0x9d, 0x14, 0xdb, 0xc6, 0x07, 0xf3, + 0xf9, 0x80, 0x93, 0xe4, 0x19, 0x4f, 0x89, 0x84, 0xa7, 0x64, 0x32, 0xa1, + 0xe1, 0xc1, 0x01, 0x9d, 0x9f, 0x1a, 0xd3, 0xd4, 0xe4, 0xa8, 0x72, 0xd9, + 0x34, 0x41, 0x20, 0x00, 0x00, 0xe8, 0xdd, 0x35, 0xd0, 0xe3, 0xf9, 0x25, + 0xae, 0x3a, 0x00, 0xf4, 0x1d, 0xe7, 0xdc, 0x0f, 0xaa, 0x3d, 0x00, 0x74, + 0x8f, 0xef, 0x1b, 0x55, 0x6b, 0xa1, 0xee, 0xdf, 0xdf, 0xd2, 0xbd, 0x47, + 0xab, 0xda, 0xde, 0xdd, 0x95, 0xf1, 0x02, 0x25, 0x92, 0xf6, 0x30, 0x8c, + 0xf9, 0xf1, 0xf1, 0xf9, 0xfd, 0x5f, 0x24, 0x6b, 0x25, 0x27, 0x23, 0xe7, + 0x0e, 0x3e, 0xcf, 0x75, 0x2a, 0xa8, 0xac, 0xf3, 0xe4, 0x19, 0xa3, 0x44, + 0x22, 0xa9, 0xa4, 0x97, 0x54, 0x22, 0x99, 0x54, 0x2a, 0x99, 0xd0, 0x40, + 0x21, 0xab, 0xe2, 0x40, 0x4e, 0x03, 0x03, 0x69, 0x8d, 0x0c, 0xe7, 0x34, + 0x3a, 0x9c, 0x55, 0x3e, 0x9f, 0x52, 0x36, 0xeb, 0x1f, 0x84, 0x3e, 0x84, + 0x81, 0x7d, 0x79, 0xd1, 0x2b, 0x49, 0xc6, 0x28, 0x08, 0x42, 0xd5, 0x6a, + 0x0d, 0xed, 0xee, 0x57, 0x54, 0xda, 0xaf, 0xa9, 0x5c, 0xad, 0xab, 0x56, + 0x6f, 0xaa, 0xd5, 0x6e, 0xab, 0xdd, 0xee, 0x84, 0x7d, 0xd6, 0x76, 0x2a, + 0xf9, 0x9c, 0xdc, 0x61, 0x48, 0x78, 0x38, 0x67, 0x9c, 0xd3, 0x9b, 0x4e, + 0x1f, 0x63, 0x8c, 0x12, 0xbe, 0xa7, 0xa1, 0xa1, 0x01, 0x5d, 0x9b, 0x39, + 0xa7, 0xeb, 0x57, 0x2e, 0x68, 0xb0, 0x98, 0x97, 0x31, 0x54, 0xaf, 0x02, + 0x5d, 0xbd, 0xee, 0x93, 0x93, 0x27, 0x4f, 0x6f, 0x7e, 0xf4, 0x02, 0xc0, + 0x19, 0xb8, 0x16, 0x22, 0x00, 0x04, 0xd0, 0x97, 0x17, 0x82, 0x04, 0x80, + 0x40, 0xd7, 0xc5, 0xb1, 0x53, 0xa5, 0xda, 0xd2, 0xed, 0xbb, 0xeb, 0xba, + 0x73, 0x7f, 0x59, 0xa5, 0xea, 0xae, 0x06, 0x0a, 0x4e, 0xa9, 0x94, 0x51, + 0x67, 0x69, 0xe5, 0x1b, 0x5e, 0xbc, 0x3c, 0xcb, 0x01, 0x5f, 0x58, 0xfa, + 0xeb, 0x14, 0x5b, 0x29, 0x8e, 0xa5, 0x38, 0x92, 0xa2, 0x48, 0x72, 0xce, + 0x97, 0x5c, 0x42, 0xb9, 0x6c, 0x4e, 0x23, 0xc3, 0x03, 0x3a, 0x37, 0x39, + 0xa4, 0xcb, 0x33, 0xa3, 0x3a, 0x37, 0x35, 0xa0, 0x5c, 0x2e, 0xc9, 0x37, + 0xa9, 0x8f, 0xec, 0x95, 0x2a, 0x7a, 0x30, 0xbb, 0xa8, 0x95, 0xf5, 0x1d, + 0x95, 0xcb, 0x35, 0x05, 0x61, 0xd8, 0x09, 0x9b, 0x9f, 0x2d, 0x49, 0x97, + 0x51, 0xaf, 0x7e, 0x2c, 0xb8, 0x83, 0x10, 0xb1, 0x58, 0xc8, 0xeb, 0x9d, + 0xab, 0xe7, 0xf5, 0xee, 0xf5, 0x4b, 0x1a, 0x2c, 0x16, 0xe4, 0xfb, 0x6c, + 0xcf, 0x0d, 0x74, 0xe5, 0x98, 0x23, 0x00, 0x04, 0x00, 0x02, 0x40, 0x00, + 0x7d, 0x7a, 0x21, 0x48, 0x00, 0x08, 0x74, 0x85, 0xe7, 0x19, 0x05, 0xa1, + 0xd5, 0xc6, 0x66, 0x55, 0x77, 0xee, 0xaf, 0x69, 0x6e, 0x7e, 0x4d, 0xb5, + 0x7a, 0x49, 0xb9, 0xbc, 0x94, 0x4c, 0x7a, 0x3d, 0xab, 0x72, 0x7a, 0xfe, + 0xf0, 0x7e, 0xb6, 0x2f, 0x5b, 0x18, 0x39, 0x05, 0x81, 0x91, 0xb3, 0x09, + 0x8d, 0x14, 0x27, 0xf4, 0x7f, 0xfe, 0x1f, 0x9f, 0xa9, 0x50, 0x48, 0xfd, + 0xe8, 0x35, 0x51, 0x1d, 0x78, 0x56, 0x7d, 0x77, 0x6f, 0x4e, 0x7f, 0xfc, + 0xfc, 0xb6, 0xac, 0x75, 0xf2, 0x3c, 0x73, 0x22, 0x7e, 0x06, 0x74, 0xe6, + 0xa6, 0xd5, 0x60, 0xb1, 0xa0, 0x2b, 0x97, 0xa6, 0xf5, 0xce, 0xb5, 0x0b, + 0x1a, 0x1f, 0x1d, 0x52, 0x32, 0x91, 0x38, 0xd8, 0x57, 0x10, 0xc0, 0x91, + 0x1c, 0x6b, 0x04, 0x80, 0x00, 0xc0, 0x1e, 0x80, 0x00, 0x00, 0xe0, 0xed, + 0x75, 0xf6, 0xed, 0x33, 0x5a, 0x58, 0x2c, 0xeb, 0xeb, 0xdb, 0xcb, 0x7a, + 0xba, 0xb8, 0xaa, 0x30, 0xae, 0x29, 0x99, 0x74, 0x1a, 0x1c, 0x7a, 0xd6, + 0xf4, 0xa0, 0x87, 0x37, 0x7b, 0x3f, 0x78, 0xae, 0xce, 0x6b, 0x4b, 0xa7, + 0xa4, 0x74, 0x4a, 0x6a, 0x36, 0x63, 0xa5, 0x52, 0xbe, 0xa2, 0x38, 0x52, + 0xab, 0xfd, 0xfd, 0xe7, 0x1a, 0x63, 0xe4, 0x7b, 0x9e, 0x7c, 0xcf, 0xc8, + 0x78, 0xde, 0xc1, 0x92, 0xd1, 0x83, 0x25, 0xca, 0x4e, 0x9d, 0x40, 0xc6, + 0x71, 0xfb, 0x78, 0x92, 0x3d, 0x0b, 0xf5, 0x9e, 0x2d, 0xf7, 0x35, 0x87, + 0x7f, 0x91, 0x6e, 0xde, 0x98, 0x51, 0x18, 0x46, 0xba, 0x7d, 0x7f, 0x5e, + 0xcd, 0x56, 0xfb, 0xc4, 0xbc, 0x5e, 0xdf, 0xf7, 0x55, 0xad, 0x35, 0x74, + 0xfb, 0xc1, 0xbc, 0x9e, 0x2e, 0xad, 0xeb, 0xca, 0xa5, 0x69, 0xbd, 0x7b, + 0xed, 0xa2, 0xa6, 0x27, 0x47, 0xe5, 0xc4, 0x1e, 0x81, 0x00, 0x00, 0xe0, + 0x88, 0xae, 0x3b, 0xa8, 0x00, 0x04, 0xd0, 0x8f, 0xa8, 0x00, 0x04, 0x8e, + 0x8e, 0xef, 0x1b, 0x95, 0x4a, 0x6d, 0xfd, 0xf9, 0xaf, 0x0b, 0xba, 0xf7, + 0xf0, 0xa9, 0xbc, 0x44, 0x43, 0xa9, 0x94, 0x74, 0x12, 0x0f, 0x31, 0xe7, + 0xa4, 0x30, 0x94, 0xc6, 0xc7, 0x8a, 0x4a, 0x25, 0xbd, 0x1f, 0x84, 0x2b, + 0x9e, 0x67, 0x94, 0x48, 0x24, 0xe4, 0x79, 0x9d, 0x6e, 0xad, 0xd9, 0x4c, + 0x4a, 0xb9, 0x6c, 0x5a, 0xf9, 0x7c, 0x56, 0xc5, 0x42, 0x5e, 0xc5, 0x81, + 0x9c, 0x0a, 0xf9, 0xac, 0x12, 0x09, 0x5f, 0x3f, 0xd7, 0x91, 0x18, 0x3d, + 0xbe, 0x90, 0x7d, 0x2e, 0xf0, 0xb3, 0xd6, 0x2a, 0x8c, 0x63, 0x45, 0x07, + 0x8d, 0x3c, 0xda, 0x41, 0xa4, 0xf0, 0xa0, 0x71, 0xc7, 0xb3, 0xef, 0x94, + 0xb5, 0x56, 0x0b, 0x4b, 0xeb, 0x7a, 0xb2, 0xb0, 0xaa, 0x30, 0x8a, 0x4f, + 0xec, 0x7b, 0xca, 0x66, 0x52, 0xfa, 0xe0, 0xdd, 0x2b, 0xfa, 0xe0, 0xe6, + 0x15, 0x15, 0xf2, 0x59, 0xe6, 0x1a, 0xf0, 0xb6, 0xe7, 0x7e, 0x2a, 0x00, + 0x01, 0x80, 0x00, 0x10, 0x40, 0x9f, 0x5e, 0x08, 0x12, 0x00, 0x02, 0x47, + 0xa2, 0xdd, 0x8e, 0xf4, 0x68, 0x76, 0x57, 0x7f, 0xfa, 0xfc, 0x91, 0x4a, + 0x95, 0x6d, 0x0d, 0x0f, 0x3f, 0xd7, 0xac, 0xe3, 0x84, 0x9f, 0x03, 0x0e, + 0x2e, 0x85, 0x7e, 0x70, 0x8b, 0xf8, 0xc3, 0xcf, 0xf9, 0xfe, 0xdf, 0x3c, + 0xdf, 0x53, 0x3a, 0x99, 0xd4, 0x60, 0x31, 0xaf, 0xe9, 0x89, 0x11, 0x4d, + 0x4f, 0x8d, 0x6b, 0x72, 0x6c, 0x48, 0xd9, 0x6c, 0x5a, 0x9e, 0xe7, 0x8b, + 0xd3, 0x49, 0xef, 0x58, 0xeb, 0x14, 0x45, 0xb1, 0xc2, 0x30, 0x54, 0xb9, + 0x56, 0xd7, 0xfe, 0x7e, 0x55, 0x7b, 0xa5, 0xaa, 0xca, 0xd5, 0xba, 0x2a, + 0xb5, 0x86, 0x9a, 0xad, 0xb6, 0xe2, 0x28, 0x56, 0x1c, 0x5b, 0xd9, 0x83, + 0x0e, 0xd0, 0xcf, 0x7f, 0x6f, 0x8d, 0xf1, 0x4e, 0x45, 0xa0, 0xe6, 0x9c, + 0xd3, 0xd4, 0xc4, 0xa8, 0x3e, 0xfb, 0xe4, 0x1d, 0x5d, 0x38, 0x37, 0xa1, + 0x84, 0xef, 0xf3, 0xcd, 0x07, 0xde, 0xf4, 0x78, 0x22, 0x00, 0x04, 0x00, + 0x02, 0x40, 0x00, 0x7d, 0x7a, 0x21, 0x48, 0x00, 0x08, 0xbc, 0xf9, 0xc5, + 0x83, 0x91, 0x9c, 0x33, 0x5a, 0xdf, 0xa8, 0xe8, 0x4f, 0x9f, 0x3f, 0xd1, + 0xd3, 0xa5, 0x15, 0x25, 0x53, 0x2d, 0xa5, 0xd3, 0xfe, 0x99, 0xde, 0x3f, + 0xcf, 0x1d, 0x84, 0x49, 0xce, 0x39, 0xf9, 0xbe, 0xaf, 0xa1, 0xc1, 0x82, + 0xa6, 0x26, 0x46, 0x75, 0x61, 0x7a, 0x4c, 0x13, 0xe3, 0xc3, 0x2a, 0x16, + 0x72, 0x4a, 0x26, 0x13, 0x07, 0xcb, 0x9d, 0xb9, 0xbc, 0x7a, 0xab, 0x39, + 0x76, 0x30, 0xd1, 0x8c, 0xa4, 0x38, 0xb6, 0x6a, 0x05, 0x81, 0xaa, 0xb5, + 0xa6, 0xca, 0x95, 0x9a, 0xf6, 0x4a, 0x15, 0xed, 0x96, 0xca, 0x2a, 0xed, + 0x57, 0x55, 0xab, 0xb7, 0x14, 0x84, 0xa1, 0xac, 0xed, 0x9c, 0xd3, 0x3b, + 0x1f, 0xcf, 0xe6, 0xe9, 0xe9, 0x3f, 0xc7, 0xc7, 0xb1, 0x55, 0x2e, 0x9b, + 0xd6, 0x8d, 0xab, 0x17, 0xf4, 0xc9, 0xad, 0x1b, 0x1a, 0x2c, 0xe6, 0x99, + 0x1c, 0xc0, 0x9b, 0x9c, 0xbf, 0x09, 0x00, 0x01, 0x80, 0x00, 0x10, 0x40, + 0x9f, 0x5e, 0x08, 0x12, 0x00, 0x02, 0x6f, 0x76, 0xe1, 0x60, 0xa4, 0x20, + 0xb0, 0xfa, 0xf6, 0xf6, 0x9a, 0xfe, 0xfc, 0xc5, 0x43, 0xc5, 0xae, 0xa2, + 0x74, 0x4a, 0x32, 0x5e, 0xff, 0x1d, 0x4f, 0x9d, 0x30, 0x50, 0x4a, 0xa5, + 0x12, 0x2a, 0x16, 0x72, 0x9a, 0x1c, 0x1f, 0xd1, 0xcc, 0xc5, 0x49, 0x4d, + 0x4f, 0x8e, 0xaa, 0x90, 0xcf, 0x4a, 0x32, 0xb2, 0xd6, 0x32, 0x69, 0x5e, + 0x79, 0x6e, 0x1d, 0x04, 0x78, 0x72, 0x0a, 0xa2, 0x58, 0xfb, 0xe5, 0x9a, + 0x76, 0x76, 0xf7, 0xb5, 0xb5, 0x5d, 0xd2, 0xee, 0x7e, 0x45, 0x95, 0x6a, + 0xa7, 0xba, 0x2f, 0x0c, 0xa3, 0xe7, 0xce, 0xe1, 0xe6, 0xcc, 0x57, 0x5f, + 0x3e, 0x7b, 0xaf, 0x53, 0x13, 0x23, 0xfa, 0xec, 0x93, 0x77, 0x35, 0x73, + 0x61, 0x8a, 0xc9, 0x02, 0xbc, 0xee, 0x71, 0x44, 0x00, 0x08, 0x00, 0x04, + 0x80, 0x00, 0xfa, 0xf4, 0x42, 0x90, 0x00, 0x10, 0x78, 0x23, 0x61, 0x68, + 0xf5, 0xff, 0xfe, 0xcb, 0xac, 0x1e, 0xcc, 0xce, 0x2a, 0x95, 0x0e, 0xe4, + 0xfb, 0x1c, 0x47, 0x87, 0x17, 0x55, 0xc6, 0xc8, 0xf7, 0x3d, 0x0d, 0x15, + 0x0b, 0xba, 0x78, 0x7e, 0x52, 0x57, 0x67, 0xa6, 0x35, 0x31, 0x3a, 0x24, + 0x3f, 0xe1, 0x8b, 0xee, 0xc2, 0x3f, 0x33, 0x66, 0xcf, 0xfd, 0xa7, 0xd5, + 0x0a, 0xb4, 0xb3, 0x57, 0xd6, 0xea, 0xfa, 0x96, 0xd6, 0x37, 0xf7, 0xb4, + 0xbb, 0x5f, 0x51, 0x18, 0x44, 0x8a, 0xad, 0xa5, 0xa2, 0xf2, 0xc0, 0x40, + 0x3e, 0xa7, 0xdf, 0x7e, 0xf6, 0xbe, 0xde, 0xbd, 0x7e, 0x89, 0x31, 0x01, + 0x5e, 0xe7, 0xba, 0x8f, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0xf4, 0xe9, + 0x85, 0x20, 0x01, 0x20, 0xf0, 0x7a, 0x17, 0x0c, 0x46, 0x0a, 0x23, 0xab, + 0xff, 0xfb, 0xbf, 0xdd, 0xd7, 0xdc, 0xe2, 0xac, 0x0a, 0x03, 0x4e, 0x46, + 0x1c, 0x43, 0x3f, 0x7d, 0x7e, 0x91, 0x9c, 0xb3, 0x4a, 0x25, 0x93, 0x9a, + 0x9a, 0x18, 0xd6, 0xc5, 0x0b, 0x93, 0x3a, 0x37, 0x39, 0xa6, 0xa1, 0xc1, + 0x82, 0x92, 0x09, 0xbf, 0xef, 0xf7, 0x0c, 0x7c, 0x36, 0x3e, 0x61, 0x14, + 0xab, 0xd1, 0x6c, 0x6b, 0x7b, 0xa7, 0xa4, 0xb5, 0x8d, 0x1d, 0xad, 0x6d, + 0xee, 0xaa, 0x5c, 0xa9, 0x29, 0x8a, 0xe2, 0xc3, 0x6a, 0x40, 0xfc, 0x90, + 0xb5, 0x4e, 0x03, 0x85, 0x8c, 0x7e, 0xff, 0x9b, 0x8f, 0x75, 0xe3, 0xca, + 0x79, 0xa2, 0x0c, 0xe0, 0x55, 0xcf, 0x3b, 0x04, 0x80, 0x00, 0x40, 0x00, + 0x08, 0xa0, 0x5f, 0x6f, 0x40, 0x09, 0x00, 0x81, 0x57, 0xbe, 0x58, 0x30, + 0x52, 0x10, 0x5a, 0xfd, 0xf3, 0x7f, 0x7f, 0xa4, 0x3b, 0x0f, 0x1f, 0xa9, + 0x58, 0xb4, 0x12, 0xe1, 0xdf, 0x2b, 0x9c, 0x67, 0x24, 0xeb, 0xac, 0xe4, + 0xa4, 0x4c, 0x26, 0xa5, 0x91, 0xe1, 0xa2, 0x26, 0x46, 0x87, 0x34, 0x39, + 0x3e, 0xac, 0x91, 0xe1, 0xa2, 0x06, 0x0a, 0x39, 0xa5, 0x53, 0x49, 0xf9, + 0xbe, 0x77, 0xe6, 0xf6, 0x0d, 0x34, 0x07, 0x55, 0x7d, 0x9d, 0xfd, 0x22, + 0xa5, 0x38, 0x8e, 0xd5, 0x6e, 0x87, 0xaa, 0xd5, 0x9b, 0xda, 0x2f, 0x57, + 0xb5, 0xb3, 0x57, 0xd6, 0xf6, 0x5e, 0x59, 0xbb, 0xa5, 0x8a, 0xea, 0xf5, + 0xa6, 0x62, 0x6b, 0xe5, 0x19, 0x4f, 0x9e, 0xc7, 0xbc, 0x7a, 0x19, 0x6b, + 0xad, 0x86, 0x06, 0x0b, 0xfa, 0x4f, 0xbf, 0xfb, 0x95, 0x2e, 0x5e, 0x98, + 0x10, 0x79, 0x06, 0xf0, 0x0a, 0xe7, 0x63, 0x02, 0x40, 0x00, 0x50, 0x82, + 0x21, 0x00, 0x00, 0x00, 0xbf, 0x24, 0x8e, 0xa5, 0xcf, 0xbf, 0x58, 0xd2, + 0x83, 0xd9, 0x39, 0x0d, 0x0c, 0x10, 0xfe, 0xbd, 0x2a, 0x63, 0x24, 0xdf, + 0x78, 0x92, 0xa4, 0x20, 0x08, 0xb5, 0xbe, 0xb1, 0xab, 0x8d, 0xcd, 0x5d, + 0x25, 0x13, 0x09, 0x65, 0xb3, 0x69, 0x0d, 0x15, 0x0b, 0x1a, 0x1b, 0x29, + 0x6a, 0x72, 0x62, 0x54, 0x63, 0xa3, 0x83, 0x2a, 0x16, 0x72, 0x4a, 0x24, + 0xfc, 0xc3, 0x30, 0xf0, 0x34, 0x05, 0x82, 0xcf, 0x37, 0xe0, 0x70, 0x4e, + 0x0a, 0xc3, 0x50, 0xf5, 0x46, 0xab, 0xd3, 0xb4, 0xe3, 0x59, 0x97, 0xde, + 0x4a, 0xed, 0xb0, 0x4b, 0xef, 0xf3, 0xfb, 0xf8, 0x19, 0x63, 0xe8, 0x70, + 0xfb, 0x1a, 0x3c, 0xcf, 0x53, 0xb9, 0x52, 0xd7, 0x5f, 0xbf, 0xbe, 0xaf, + 0x42, 0x21, 0xab, 0x91, 0xa1, 0x01, 0x96, 0x97, 0x03, 0x00, 0x80, 0x97, + 0x5f, 0xaf, 0x51, 0x01, 0x08, 0xa0, 0x1f, 0x51, 0x01, 0x08, 0xbc, 0xba, + 0xb9, 0xf9, 0x5d, 0xfd, 0xb7, 0x7f, 0xfe, 0x52, 0xc9, 0x54, 0x43, 0x1c, + 0x36, 0x47, 0x7c, 0x21, 0x76, 0xb0, 0x6f, 0x60, 0x26, 0x9d, 0xd2, 0xf8, + 0xe8, 0x90, 0xa6, 0x26, 0x46, 0x34, 0x3d, 0x35, 0xaa, 0x91, 0xa1, 0xa2, + 0x32, 0xe9, 0xa4, 0x9e, 0x85, 0xad, 0x27, 0x2d, 0x0c, 0x34, 0x07, 0x49, + 0x9f, 0xf1, 0x8c, 0xe2, 0xd8, 0xaa, 0xdd, 0x0e, 0x54, 0xae, 0x36, 0xb4, + 0xbb, 0x57, 0xd6, 0xf6, 0xde, 0xbe, 0xf6, 0x4a, 0x9d, 0xa6, 0x1d, 0xed, + 0x20, 0x54, 0x1c, 0xdb, 0x53, 0x17, 0x68, 0x9e, 0x16, 0xef, 0x5e, 0xbb, + 0xa8, 0x7f, 0xfa, 0xdd, 0xc7, 0x4a, 0x25, 0x93, 0x0c, 0x06, 0xf0, 0x4b, + 0xd7, 0x7d, 0x54, 0x00, 0x02, 0x00, 0x15, 0x80, 0x00, 0x00, 0xe0, 0xe7, + 0xed, 0x97, 0x5b, 0xfa, 0xff, 0xfe, 0xf5, 0xbe, 0x9c, 0x6a, 0x32, 0x07, + 0xd5, 0x6c, 0x38, 0xc2, 0x9b, 0x52, 0xe7, 0x14, 0x45, 0xb1, 0x6a, 0x51, + 0x53, 0xd5, 0x5a, 0x43, 0x4f, 0x16, 0xd6, 0x94, 0x4c, 0xf8, 0x2a, 0x16, + 0xf3, 0x9a, 0x1c, 0x1f, 0xd6, 0xf4, 0xc4, 0xa8, 0x46, 0x47, 0x06, 0x55, + 0x2c, 0x64, 0x95, 0x4c, 0x26, 0x3a, 0xfb, 0x07, 0x7a, 0xbd, 0xdd, 0x7d, + 0xf1, 0xf9, 0x8a, 0xc4, 0x28, 0x8e, 0x15, 0x86, 0xa1, 0x6a, 0xf5, 0x83, + 0xea, 0xbe, 0x52, 0x45, 0x3b, 0x7b, 0x65, 0xed, 0x97, 0x6b, 0xaa, 0x37, + 0x5a, 0x0a, 0xa3, 0x58, 0x52, 0xa7, 0xfa, 0x91, 0x5f, 0xb2, 0x74, 0xdf, + 0xdc, 0xd3, 0x55, 0x4d, 0x4e, 0x0c, 0xeb, 0xd6, 0xcd, 0xab, 0x8c, 0x37, + 0x00, 0x00, 0xf8, 0x45, 0x04, 0x80, 0x00, 0x00, 0xe0, 0x05, 0xc6, 0x48, + 0x51, 0xe4, 0xf4, 0x6f, 0x7f, 0x9c, 0x53, 0xad, 0xb1, 0xad, 0x5c, 0x9e, + 0xf0, 0xaf, 0xfb, 0x63, 0xde, 0x59, 0x42, 0x1b, 0x5b, 0xab, 0xdd, 0xbd, + 0x8a, 0x76, 0x76, 0xf7, 0x75, 0xff, 0xf1, 0x82, 0xd2, 0xa9, 0x94, 0x8a, + 0x85, 0x9c, 0x86, 0x87, 0x8a, 0x1a, 0x1e, 0x2a, 0x68, 0xb0, 0x98, 0x57, + 0x21, 0x9f, 0x53, 0x3e, 0x9b, 0x56, 0x3a, 0x9d, 0x52, 0x32, 0x99, 0x90, + 0xef, 0x75, 0xf6, 0xcf, 0xeb, 0x84, 0xb4, 0x9d, 0x1a, 0x17, 0xe3, 0x5e, + 0xdc, 0x1e, 0xce, 0x48, 0x72, 0xe6, 0x87, 0x8b, 0xb8, 0x9d, 0x93, 0x9c, + 0xb5, 0xb2, 0xce, 0x29, 0x8e, 0x3b, 0xcd, 0x39, 0xa2, 0x28, 0x52, 0xab, + 0x15, 0xa8, 0xd9, 0x0e, 0xd4, 0x68, 0xb4, 0x54, 0x6f, 0x34, 0x55, 0xa9, + 0x36, 0x54, 0xa9, 0xd5, 0x55, 0xad, 0x35, 0xd5, 0x68, 0xb6, 0x15, 0x04, + 0x41, 0x67, 0xe9, 0xa9, 0x91, 0xbc, 0x83, 0xa5, 0xbc, 0xec, 0xe1, 0xd7, + 0x5b, 0x61, 0x14, 0xeb, 0xab, 0xef, 0x66, 0x35, 0x3a, 0x32, 0xa8, 0x0b, + 0xd3, 0x13, 0xb2, 0xd6, 0x32, 0x28, 0x00, 0x00, 0xe0, 0xa7, 0xaf, 0x35, + 0x59, 0x02, 0x0c, 0xa0, 0x1f, 0xb1, 0x04, 0x18, 0xf8, 0x65, 0x89, 0x84, + 0xa7, 0x3f, 0xfd, 0x65, 0x49, 0xff, 0xf2, 0xc7, 0xaf, 0x55, 0x1c, 0x8c, + 0x38, 0x5e, 0x8e, 0xf9, 0x7c, 0xe5, 0x3a, 0x7f, 0x90, 0xf1, 0x3a, 0xfb, + 0xe5, 0xa5, 0x53, 0x49, 0xa5, 0x53, 0x29, 0xe5, 0x72, 0x69, 0xe5, 0xb2, + 0x19, 0xe5, 0x32, 0x69, 0x65, 0xb2, 0x69, 0x65, 0x33, 0x69, 0xa5, 0x53, + 0x49, 0x25, 0x93, 0x09, 0x25, 0x13, 0xbe, 0x12, 0xbe, 0xff, 0x83, 0x10, + 0x30, 0x8e, 0x62, 0x85, 0x71, 0xac, 0x28, 0xea, 0x54, 0xf2, 0x05, 0x61, + 0xa4, 0x20, 0x88, 0x14, 0x04, 0xa1, 0x5a, 0xed, 0x40, 0xed, 0x20, 0x50, + 0x3b, 0x08, 0xd5, 0x6a, 0x05, 0x9d, 0xff, 0x2f, 0x0c, 0x15, 0x85, 0xb1, + 0x62, 0x6b, 0x0f, 0xc3, 0xa5, 0x67, 0x73, 0x81, 0x39, 0x71, 0x32, 0x58, + 0x6b, 0x75, 0x7e, 0x7a, 0x5c, 0xff, 0xfb, 0x7f, 0xfa, 0xb5, 0x8a, 0x85, + 0x9c, 0x2c, 0x4b, 0xad, 0x81, 0x17, 0xcf, 0xa3, 0x2c, 0x01, 0x06, 0x00, + 0x02, 0x40, 0x00, 0xfd, 0x7b, 0x43, 0xcd, 0xcd, 0x2b, 0xf0, 0xd3, 0x7c, + 0xdf, 0xe8, 0xc9, 0xd3, 0xb2, 0xfe, 0xaf, 0xff, 0xe7, 0x73, 0x65, 0xb2, + 0x55, 0x79, 0x1e, 0xd5, 0x7f, 0x27, 0xfe, 0x82, 0xee, 0xa0, 0x7a, 0xf0, + 0xfb, 0x66, 0x1c, 0x46, 0x9e, 0x8c, 0xe4, 0xfd, 0xf8, 0xdc, 0xf7, 0xfd, + 0x72, 0xde, 0xce, 0xc7, 0xc1, 0xad, 0xf1, 0x0f, 0xfe, 0x17, 0xa7, 0x8d, + 0x67, 0x8c, 0x3e, 0xbe, 0x75, 0x5d, 0xbf, 0xf9, 0xbb, 0xf7, 0xe4, 0xd3, + 0x50, 0x05, 0x78, 0xf1, 0xba, 0x8f, 0x00, 0x10, 0x00, 0x58, 0x02, 0x0c, + 0x00, 0x00, 0x7e, 0xa8, 0x5a, 0x0b, 0xf5, 0xe7, 0xbf, 0xce, 0x2a, 0x99, + 0xaa, 0x11, 0xfe, 0x9d, 0x96, 0x9b, 0xdb, 0xe7, 0xc2, 0x3c, 0xf4, 0x1f, + 0xeb, 0x9c, 0x1e, 0x3e, 0x5e, 0xd4, 0xf9, 0xa9, 0x31, 0xcd, 0x5c, 0x9c, + 0x62, 0x40, 0x00, 0x00, 0xc0, 0x0b, 0xb8, 0xaa, 0x07, 0x00, 0x00, 0x87, + 0x9c, 0x73, 0xba, 0x7d, 0x77, 0x4d, 0xeb, 0x9b, 0xab, 0x4a, 0x26, 0xa9, + 0x92, 0x05, 0x4e, 0x8b, 0x46, 0xab, 0xad, 0x6f, 0xee, 0xce, 0xaa, 0x56, + 0x6f, 0x32, 0x18, 0x00, 0x00, 0xe0, 0x05, 0x04, 0x80, 0x00, 0x00, 0x40, + 0x52, 0xa7, 0xf1, 0xc7, 0xfa, 0x66, 0x4d, 0x5f, 0x7e, 0x3b, 0xa7, 0x54, + 0x3a, 0x62, 0x40, 0x80, 0x53, 0x75, 0xfc, 0x1a, 0xad, 0xae, 0xef, 0xe8, + 0xc1, 0xe3, 0x05, 0xb6, 0xb8, 0x00, 0x00, 0x00, 0x2f, 0x20, 0x00, 0x04, + 0x00, 0x00, 0x92, 0x3a, 0xfb, 0xc3, 0xfd, 0xcf, 0x3f, 0xcd, 0xa9, 0xd6, + 0x28, 0xc9, 0xf7, 0x09, 0x10, 0x80, 0xd3, 0x77, 0x0c, 0x3b, 0x7d, 0x77, + 0xff, 0x89, 0x96, 0x57, 0x37, 0xe9, 0xc8, 0x0c, 0x00, 0x00, 0x7e, 0x80, + 0x00, 0x10, 0x00, 0x00, 0xc8, 0xf7, 0x8c, 0xfe, 0xf2, 0xc5, 0x8a, 0x9e, + 0x2c, 0x2e, 0xaa, 0x58, 0x24, 0x38, 0x00, 0x4e, 0x23, 0x63, 0x8c, 0x9a, + 0xcd, 0x40, 0x5f, 0x7d, 0xf7, 0x58, 0xb5, 0x46, 0x8b, 0x4a, 0x40, 0x00, + 0x00, 0x70, 0x88, 0x00, 0x10, 0x00, 0x80, 0x3e, 0xe7, 0x7b, 0x46, 0x6b, + 0x1b, 0x35, 0x7d, 0xf1, 0xf5, 0x23, 0x15, 0x8b, 0xb1, 0x9c, 0x23, 0x34, + 0x00, 0x4e, 0xed, 0xc5, 0xbd, 0x67, 0xb4, 0xba, 0xbe, 0xad, 0xfb, 0x0f, + 0x9f, 0xca, 0xc6, 0x96, 0x01, 0x01, 0x00, 0x00, 0x9d, 0x6b, 0x04, 0x86, + 0x00, 0x00, 0x80, 0xfe, 0x65, 0x24, 0x35, 0x9a, 0x91, 0xfe, 0xfd, 0x3f, + 0xe6, 0x14, 0xd9, 0xb2, 0x12, 0x09, 0x2e, 0x0d, 0x80, 0xd3, 0xce, 0x49, + 0x7a, 0x30, 0xbb, 0xa8, 0xcd, 0x9d, 0x3d, 0x06, 0x03, 0x00, 0x00, 0x48, + 0x22, 0x00, 0x04, 0x00, 0xa0, 0xaf, 0x39, 0x49, 0x4f, 0x9e, 0xee, 0x6a, + 0x65, 0x7d, 0x55, 0xe9, 0x8c, 0x91, 0x73, 0x8c, 0x09, 0x70, 0x16, 0x94, + 0xab, 0x75, 0xdd, 0xb9, 0x3f, 0xaf, 0x30, 0xa4, 0xa1, 0x0f, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0xa0, 0xaf, 0x55, 0x6b, 0x6d, 0xfd, 0xe9, 0xaf, + 0xb3, 0x72, 0x6a, 0x8a, 0x85, 0xbf, 0xc0, 0x19, 0xe2, 0x8c, 0x9e, 0x2e, + 0x6f, 0x68, 0x61, 0x79, 0x5d, 0x6c, 0x05, 0x08, 0x00, 0x00, 0x08, 0x00, + 0x01, 0x00, 0xe8, 0x53, 0xc6, 0x33, 0xfa, 0xf2, 0x9b, 0x55, 0xed, 0x97, + 0xb7, 0x95, 0x4e, 0x73, 0x49, 0x00, 0x9c, 0xa9, 0xe3, 0xdb, 0x48, 0xad, + 0x56, 0xa0, 0xaf, 0xef, 0xcc, 0xa9, 0x5a, 0x6b, 0xd2, 0x10, 0x04, 0x00, + 0x80, 0x3e, 0xc7, 0xd5, 0x3e, 0x00, 0x00, 0x7d, 0xc8, 0xf7, 0x8d, 0x9e, + 0x2e, 0xec, 0xeb, 0xcb, 0x6f, 0x67, 0x95, 0xce, 0xc6, 0x0c, 0x08, 0x70, + 0x26, 0x8f, 0x73, 0x4f, 0xdb, 0x3b, 0x25, 0x7d, 0x7b, 0x77, 0x56, 0xd6, + 0xd2, 0x10, 0x04, 0x00, 0x80, 0x7e, 0x46, 0x00, 0x08, 0x00, 0x40, 0x9f, + 0x31, 0x46, 0x6a, 0xb5, 0xad, 0xfe, 0xf8, 0x1f, 0x8f, 0xe5, 0xf9, 0x35, + 0x25, 0x69, 0xfc, 0x01, 0x9c, 0xe1, 0xe3, 0xdd, 0xe8, 0xc1, 0xec, 0xa2, + 0x96, 0x57, 0xb7, 0xe4, 0x79, 0x54, 0x01, 0x02, 0x00, 0xd0, 0xaf, 0xb8, + 0xe2, 0x07, 0x00, 0xa0, 0x0f, 0x03, 0x81, 0x6f, 0xbe, 0x5b, 0xd3, 0xf2, + 0xfa, 0xaa, 0x32, 0x19, 0x8f, 0xc6, 0x1f, 0xc0, 0x19, 0x17, 0x04, 0x91, + 0x6e, 0x3f, 0x78, 0xa2, 0x5a, 0xbd, 0xc9, 0x60, 0x00, 0x00, 0xd0, 0xa7, + 0x08, 0x00, 0x01, 0x00, 0xe8, 0x23, 0x46, 0xd2, 0xd6, 0x76, 0x5d, 0x5f, + 0xdf, 0x7e, 0xa2, 0x62, 0x91, 0x25, 0x81, 0x40, 0xbf, 0x58, 0x5b, 0xdf, + 0xd1, 0xd2, 0xca, 0xa6, 0x1c, 0x89, 0x3f, 0x00, 0x00, 0x7d, 0x89, 0x00, + 0x10, 0x00, 0x80, 0x3e, 0x12, 0x5b, 0xa7, 0xbb, 0x0f, 0xd6, 0x55, 0x6b, + 0xec, 0xd1, 0x14, 0x00, 0xe8, 0x23, 0xed, 0x30, 0xd2, 0xea, 0xc6, 0xae, + 0xe2, 0x98, 0xe0, 0x1f, 0x00, 0x80, 0x7e, 0x44, 0x00, 0x08, 0x00, 0x40, + 0x1f, 0x71, 0x4e, 0x6a, 0x34, 0xdb, 0x32, 0x86, 0x10, 0x00, 0xe8, 0x27, + 0x46, 0x46, 0x09, 0xdf, 0x13, 0xb9, 0x3f, 0x00, 0x00, 0xfd, 0x89, 0x00, + 0x10, 0x00, 0x80, 0x7e, 0x0a, 0x01, 0x8c, 0x94, 0xcd, 0x24, 0x25, 0x19, + 0xf6, 0xfe, 0x03, 0xfa, 0xe9, 0xa2, 0xdf, 0x33, 0xca, 0x66, 0xd3, 0x54, + 0xfe, 0x02, 0x00, 0xd0, 0xaf, 0xd7, 0x02, 0x0c, 0x01, 0x00, 0x00, 0xfd, + 0x15, 0x02, 0xe4, 0x73, 0x49, 0xf9, 0x1e, 0x97, 0x00, 0x40, 0x3f, 0x31, + 0xa6, 0xb3, 0x07, 0x28, 0x00, 0x00, 0xe8, 0xd3, 0xfb, 0x00, 0x86, 0x00, + 0x00, 0x80, 0x7e, 0x09, 0x00, 0x8c, 0xea, 0x8d, 0xa6, 0xb6, 0xf7, 0x36, + 0x94, 0x48, 0x5a, 0x96, 0x02, 0x02, 0x7d, 0x24, 0x8e, 0xad, 0xee, 0x3d, + 0x5a, 0xd0, 0xea, 0xc6, 0x0e, 0x55, 0x80, 0x00, 0x00, 0xf4, 0x21, 0x02, + 0x40, 0x00, 0x00, 0xfa, 0x80, 0x31, 0x46, 0xed, 0x20, 0xd0, 0xe7, 0x5f, + 0xdd, 0xd7, 0xd3, 0xa5, 0x35, 0xc2, 0x3f, 0xa0, 0x0f, 0xcf, 0x01, 0xd5, + 0x5a, 0x53, 0x5f, 0x7e, 0xf3, 0x50, 0xb5, 0x7a, 0x93, 0x10, 0x10, 0x00, + 0x80, 0x3e, 0x43, 0x00, 0x08, 0x00, 0xc0, 0x99, 0xbf, 0xf1, 0x97, 0x82, + 0x20, 0xd4, 0x5f, 0xfe, 0x76, 0x4f, 0xf7, 0x1e, 0x2e, 0x70, 0xe3, 0x0f, + 0xf4, 0xeb, 0x85, 0xbf, 0x67, 0xb4, 0xbc, 0xb6, 0xa5, 0x6f, 0xee, 0x3c, + 0x96, 0xb5, 0x6c, 0x02, 0x0a, 0x00, 0x40, 0x5f, 0x5d, 0x07, 0x30, 0x04, + 0x00, 0x00, 0x9c, 0x6d, 0x41, 0x10, 0xe9, 0xcb, 0x6f, 0x1f, 0xea, 0xce, + 0xc3, 0x79, 0xf9, 0x3e, 0x3f, 0xfa, 0x81, 0x7e, 0xe6, 0xfb, 0xbe, 0xee, + 0x3f, 0x5a, 0xd0, 0xec, 0xfc, 0x32, 0x83, 0x01, 0x00, 0x40, 0x1f, 0xe1, + 0x2e, 0x00, 0x00, 0x80, 0x33, 0xcc, 0x39, 0xa7, 0xef, 0xee, 0xcd, 0xe9, + 0xf6, 0x83, 0x79, 0x19, 0x5a, 0x00, 0x00, 0x90, 0x14, 0x46, 0xb1, 0xbe, + 0xbd, 0x3b, 0xa7, 0xfd, 0x72, 0x95, 0xc1, 0x00, 0x00, 0xa0, 0x4f, 0x10, + 0x00, 0x02, 0x00, 0x70, 0x46, 0x19, 0xcf, 0xe8, 0xde, 0xc3, 0x05, 0x7d, + 0x73, 0x77, 0x56, 0x61, 0x14, 0x33, 0x20, 0x00, 0x0e, 0x6d, 0xef, 0xee, + 0xeb, 0x9b, 0xbb, 0x73, 0x8a, 0x38, 0x37, 0x00, 0x00, 0xd0, 0x17, 0x08, + 0x00, 0x01, 0x00, 0x38, 0x83, 0x8c, 0x91, 0x66, 0xe7, 0x56, 0xf4, 0xf9, + 0xd7, 0xf7, 0xd5, 0x6e, 0x87, 0xd4, 0xfe, 0x01, 0xf8, 0x01, 0xe7, 0x9c, + 0xe6, 0x9e, 0xae, 0x68, 0x61, 0x79, 0x83, 0xa6, 0x40, 0x00, 0x00, 0xf4, + 0x01, 0x02, 0x40, 0x00, 0x00, 0xce, 0x18, 0x63, 0xa4, 0xa5, 0x95, 0x2d, + 0x7d, 0xfe, 0xf5, 0x3d, 0x35, 0x9b, 0x6d, 0x9a, 0x7e, 0x00, 0xf8, 0x89, + 0xf3, 0x84, 0x51, 0xb3, 0x19, 0xe8, 0x6f, 0xdf, 0x3e, 0xd0, 0xde, 0x7e, + 0x55, 0x9e, 0xc7, 0x79, 0x02, 0x00, 0x80, 0xb3, 0x8c, 0x00, 0x10, 0x00, + 0x80, 0x33, 0x66, 0x7b, 0xb7, 0xac, 0xcf, 0xbf, 0xba, 0xaf, 0xfd, 0x72, + 0x8d, 0x9b, 0x7a, 0x00, 0x3f, 0xcb, 0xf7, 0x3d, 0xed, 0xec, 0x96, 0xf5, + 0xb7, 0x6f, 0x1e, 0x76, 0x2a, 0x85, 0xf9, 0x65, 0x01, 0x00, 0x00, 0x67, + 0x16, 0x01, 0x20, 0x00, 0x00, 0x67, 0x48, 0xb3, 0x15, 0xe8, 0xaf, 0x5f, + 0xdd, 0xd7, 0xe6, 0xce, 0x1e, 0x37, 0xf3, 0x00, 0x5e, 0x7e, 0x33, 0xe0, + 0x79, 0x9a, 0x5f, 0x5c, 0xd3, 0xa3, 0x27, 0x4b, 0x72, 0x72, 0x0c, 0x08, + 0x00, 0x00, 0x67, 0xf5, 0x67, 0x3e, 0x43, 0x00, 0x00, 0xc0, 0xd9, 0x60, + 0xad, 0xd5, 0x97, 0xdf, 0x3c, 0xd0, 0xfc, 0xd2, 0x3a, 0x1d, 0x7f, 0x01, + 0xbc, 0xb2, 0x38, 0xb6, 0xfa, 0xf6, 0xee, 0x13, 0x6d, 0x6d, 0xef, 0x33, + 0x18, 0x00, 0x00, 0x9c, 0x51, 0x04, 0x80, 0x00, 0x00, 0x9c, 0x01, 0x4e, + 0x4e, 0xb7, 0xef, 0x3f, 0xd1, 0xdd, 0x47, 0x4f, 0x09, 0xff, 0x80, 0xd3, + 0x76, 0xfc, 0x3a, 0x27, 0x6b, 0x9d, 0xac, 0xb5, 0xb2, 0xce, 0x1d, 0xfc, + 0xdd, 0xca, 0x5a, 0x2b, 0xe7, 0x7a, 0x53, 0x95, 0x57, 0xae, 0xd4, 0x74, + 0xfb, 0xde, 0x9c, 0x82, 0x20, 0xe4, 0x1b, 0x02, 0x00, 0xc0, 0x19, 0x94, + 0x60, 0x08, 0x00, 0x00, 0x38, 0xdd, 0x8c, 0x31, 0x5a, 0x58, 0x5a, 0xd7, + 0x37, 0x77, 0x66, 0x15, 0xc7, 0x96, 0xa5, 0xbf, 0xc0, 0x29, 0x61, 0xad, + 0x95, 0x24, 0xe5, 0xf3, 0x59, 0x8d, 0x0c, 0x0e, 0x68, 0x60, 0x20, 0xa7, + 0x6c, 0x3a, 0x2d, 0x19, 0xa7, 0x66, 0x33, 0x50, 0xb9, 0x5a, 0x57, 0xa9, + 0x54, 0x55, 0xbd, 0xd5, 0x92, 0x91, 0xe9, 0xea, 0x9e, 0x9e, 0xce, 0x39, + 0xcd, 0x2d, 0xac, 0x6a, 0x7a, 0x72, 0x54, 0xb7, 0xde, 0xbb, 0xda, 0xb3, + 0xe0, 0x11, 0x00, 0x00, 0xf4, 0x06, 0x01, 0x20, 0x00, 0x00, 0xa7, 0xdc, + 0x7e, 0xb9, 0xaa, 0x2f, 0xbe, 0x79, 0xa8, 0x06, 0x1d, 0x7f, 0x81, 0x53, + 0xc3, 0x49, 0x1a, 0x1f, 0x1b, 0xd6, 0xbb, 0xd7, 0x2e, 0x6a, 0xe6, 0xe2, + 0x94, 0xf2, 0xb9, 0x8c, 0x12, 0xbe, 0x77, 0x78, 0x0c, 0x5b, 0xe7, 0x14, + 0x47, 0x56, 0x95, 0x6a, 0x5d, 0x8b, 0x2b, 0x9b, 0x7a, 0x38, 0xb7, 0xa8, + 0xd2, 0x7e, 0x55, 0x9e, 0xd7, 0x9d, 0x05, 0x3c, 0xc6, 0x18, 0x45, 0x51, + 0xac, 0x2f, 0xbf, 0x7b, 0xa4, 0xb1, 0xd1, 0x21, 0x4d, 0x4f, 0x8c, 0xc8, + 0x12, 0x02, 0x02, 0x00, 0x70, 0x66, 0x98, 0xc7, 0xf3, 0x4b, 0xfc, 0x64, + 0x07, 0xd0, 0x7f, 0x37, 0x5e, 0xce, 0x11, 0x94, 0xe0, 0x4c, 0x08, 0xc2, + 0x50, 0x7f, 0xfe, 0xeb, 0x5d, 0xdd, 0x7f, 0xbc, 0xc0, 0x60, 0x00, 0xa7, + 0x44, 0x2a, 0x99, 0xd0, 0x87, 0xef, 0x5d, 0xd5, 0x87, 0xef, 0x5f, 0x55, + 0x21, 0x9f, 0x3d, 0xf8, 0xb9, 0xf4, 0x33, 0x17, 0xeb, 0xc6, 0x48, 0x72, + 0x2a, 0x57, 0x6a, 0xfa, 0xe6, 0xee, 0x9c, 0x1e, 0xcf, 0x2d, 0x2b, 0x08, + 0xa3, 0xae, 0xbd, 0x36, 0x6b, 0xad, 0xae, 0x5d, 0x3e, 0xaf, 0xff, 0xf2, + 0x8f, 0x9f, 0x2a, 0x93, 0x49, 0x51, 0x09, 0x88, 0xb3, 0x71, 0xdd, 0x27, + 0x27, 0x4f, 0x1e, 0x8d, 0x6e, 0x00, 0xf4, 0x35, 0xf6, 0x00, 0x04, 0x00, + 0xe0, 0x94, 0x32, 0xc6, 0x68, 0x7e, 0x61, 0x5d, 0xb3, 0xf3, 0xcb, 0xdc, + 0xa4, 0x03, 0xa7, 0x80, 0x73, 0x4e, 0xc5, 0x42, 0x4e, 0xff, 0xf9, 0xf7, + 0x7f, 0xa7, 0xdf, 0x7e, 0xf6, 0x81, 0x0a, 0xf9, 0x9c, 0x9c, 0xfb, 0xf9, + 0xf0, 0xef, 0xd9, 0xd7, 0x38, 0x27, 0x0d, 0x0d, 0x0e, 0xe8, 0xf7, 0x7f, + 0xff, 0x91, 0xfe, 0x97, 0xbf, 0xbf, 0xa5, 0x5c, 0x36, 0x2d, 0x6b, 0xbb, + 0x73, 0xcc, 0x7b, 0x9e, 0xa7, 0x85, 0xe5, 0x75, 0xdd, 0x7d, 0x38, 0x7f, + 0xb8, 0x44, 0x19, 0x00, 0x00, 0x9c, 0x7e, 0x04, 0x80, 0x00, 0x00, 0x9c, + 0xc6, 0x1f, 0xe0, 0x9e, 0xa7, 0xed, 0x9d, 0x92, 0xfe, 0xf6, 0xdd, 0x43, + 0xb5, 0x83, 0x90, 0x8a, 0x56, 0xe0, 0x84, 0x73, 0xce, 0x69, 0xa0, 0x90, + 0xd3, 0x1f, 0x7e, 0xf7, 0x89, 0x6e, 0x5c, 0xbd, 0x70, 0xf8, 0x6f, 0xaf, + 0xca, 0x5a, 0xa7, 0x44, 0xc2, 0xd7, 0xfb, 0xef, 0x5e, 0xd6, 0xef, 0x7f, + 0xf3, 0x91, 0xf2, 0xb9, 0x74, 0xd7, 0x96, 0xe8, 0x3a, 0x27, 0xdd, 0x7f, + 0xb4, 0xa0, 0xf5, 0xcd, 0x5d, 0xbe, 0x71, 0x00, 0x00, 0x9c, 0x95, 0xfb, + 0x07, 0x86, 0x00, 0x00, 0x80, 0xd3, 0xc5, 0x18, 0xa3, 0x76, 0x3b, 0xd0, + 0x97, 0xb7, 0x1f, 0xa9, 0x5c, 0xae, 0x75, 0x6d, 0x4f, 0x30, 0x00, 0x47, + 0x27, 0x95, 0x4c, 0xe8, 0xef, 0x3e, 0x7a, 0x47, 0x17, 0xce, 0x4d, 0xbc, + 0x71, 0xc5, 0x6e, 0xe7, 0xeb, 0x8c, 0xae, 0x5d, 0x3e, 0xa7, 0x8f, 0xde, + 0xbf, 0xae, 0x84, 0xef, 0x77, 0xed, 0xf5, 0x96, 0xab, 0x75, 0x7d, 0x73, + 0x67, 0x56, 0x6d, 0xba, 0x02, 0x03, 0x00, 0x70, 0x26, 0x70, 0xc7, 0x00, + 0x00, 0xc0, 0x29, 0x34, 0xf7, 0x74, 0x55, 0x4f, 0x17, 0xd7, 0xa9, 0xfc, + 0x03, 0x4e, 0x89, 0xc9, 0xf1, 0x11, 0x5d, 0xbf, 0x7c, 0xee, 0x48, 0x3a, + 0xf9, 0x7a, 0x9e, 0xa7, 0x9b, 0x37, 0x2e, 0x69, 0x62, 0x74, 0xa8, 0x6b, + 0xaf, 0xd7, 0x18, 0xa3, 0x85, 0xe5, 0x4d, 0xdd, 0x7d, 0xf8, 0x54, 0x62, + 0xdf, 0x34, 0x00, 0x00, 0x4e, 0x3d, 0x02, 0x40, 0x00, 0x00, 0x4e, 0x99, + 0xfd, 0x72, 0xf5, 0x60, 0x7f, 0x2e, 0x6e, 0xca, 0x81, 0x53, 0x71, 0xc1, + 0xed, 0x19, 0xdd, 0xbc, 0x71, 0x49, 0xf9, 0x7c, 0xee, 0xc8, 0x1e, 0x33, + 0x9f, 0xcb, 0xe8, 0xda, 0x95, 0x73, 0xf2, 0xfd, 0xee, 0x5d, 0xce, 0x5b, + 0x67, 0x75, 0xfb, 0xde, 0x9c, 0x56, 0xd6, 0x77, 0xa8, 0x34, 0x06, 0x00, + 0xe0, 0xb4, 0x5f, 0x8f, 0x30, 0x04, 0x00, 0x00, 0x9c, 0x1e, 0xd6, 0x5a, + 0x3d, 0x9e, 0x5f, 0xd1, 0xce, 0x5e, 0x99, 0xc1, 0x00, 0x4e, 0x01, 0xe7, + 0x9c, 0x0a, 0xf9, 0x9c, 0xce, 0x4f, 0x8f, 0x1f, 0x69, 0xb3, 0x1e, 0xcf, + 0xf3, 0x74, 0x7e, 0x6a, 0x5c, 0xe9, 0x74, 0xaa, 0x7b, 0x37, 0x0a, 0xc6, + 0xa8, 0x56, 0x6f, 0xea, 0x8b, 0xaf, 0xee, 0xab, 0x5c, 0xa9, 0x1d, 0x49, + 0xf5, 0x22, 0x00, 0x00, 0x38, 0x1e, 0x04, 0x80, 0x00, 0x00, 0x9c, 0x22, + 0xfb, 0x95, 0xba, 0x1e, 0xcf, 0x2d, 0x2b, 0x8e, 0xe9, 0xce, 0x09, 0x9c, + 0x06, 0xce, 0x39, 0x8d, 0x0e, 0x0f, 0xa8, 0x90, 0xcf, 0x1c, 0x71, 0xb7, + 0x6e, 0xa7, 0x62, 0x31, 0xaf, 0x81, 0x23, 0xac, 0x2a, 0xfc, 0xc9, 0x9b, + 0x05, 0xcf, 0xd3, 0xe6, 0x4e, 0x49, 0xdf, 0xdd, 0x9b, 0x63, 0x3f, 0x40, + 0x00, 0x00, 0x4e, 0x31, 0x02, 0x40, 0x00, 0x00, 0x4e, 0x91, 0x47, 0xb3, + 0x8b, 0xda, 0x2d, 0x95, 0xd9, 0xfb, 0x0f, 0x38, 0x25, 0x9c, 0x93, 0x86, + 0x06, 0x07, 0xe4, 0x7b, 0xfe, 0x91, 0x3f, 0x6e, 0x2a, 0x99, 0x54, 0x21, + 0x97, 0x91, 0xeb, 0xf2, 0x6e, 0x00, 0xd6, 0x3a, 0x3d, 0x7a, 0xb2, 0xac, + 0x35, 0xba, 0x02, 0x03, 0x00, 0x70, 0x6a, 0x11, 0x00, 0x02, 0x00, 0x70, + 0x1a, 0x7e, 0x60, 0x7b, 0x46, 0x7b, 0xa5, 0x8a, 0x1e, 0xcd, 0xaf, 0xb0, + 0x17, 0x17, 0xd0, 0x65, 0xce, 0xb9, 0x17, 0x3e, 0xde, 0xf8, 0xb1, 0xe4, + 0x94, 0x4c, 0x24, 0xba, 0x12, 0xda, 0x1b, 0xf3, 0xec, 0x3f, 0xdd, 0xd7, + 0x6c, 0xb6, 0x75, 0xfb, 0xee, 0x9c, 0x9a, 0xad, 0x36, 0x13, 0x04, 0x00, + 0x80, 0xd3, 0x78, 0x3f, 0xc1, 0x10, 0x00, 0x00, 0x70, 0xf2, 0x39, 0x27, + 0xdd, 0x7b, 0xf4, 0x54, 0xd5, 0x6a, 0x9d, 0xea, 0x3f, 0xa0, 0x1b, 0xc7, + 0x98, 0xa4, 0xd8, 0x5a, 0x59, 0xeb, 0x94, 0x4a, 0x25, 0x35, 0x50, 0xc8, + 0x69, 0xa8, 0x98, 0xd7, 0x60, 0x31, 0xaf, 0x6c, 0x26, 0x2d, 0x23, 0x29, + 0x8e, 0xed, 0x6b, 0x87, 0x81, 0x46, 0x46, 0x41, 0x18, 0x1e, 0xf1, 0xf2, + 0xdf, 0x67, 0xe7, 0x05, 0xd7, 0x95, 0xc7, 0xfd, 0xc9, 0xf7, 0x61, 0x8c, + 0x96, 0xd7, 0xb6, 0x35, 0x37, 0xbf, 0xc2, 0x5e, 0x80, 0x00, 0x00, 0x9c, + 0x42, 0x09, 0x86, 0x00, 0x00, 0x80, 0x93, 0xcd, 0xf3, 0x8c, 0xb6, 0x77, + 0xf7, 0xf5, 0x64, 0x61, 0x9d, 0xea, 0x3f, 0xa0, 0x0b, 0x9c, 0x73, 0x4a, + 0x24, 0x7c, 0x5d, 0xba, 0x34, 0xa5, 0x99, 0x8b, 0x53, 0x1a, 0x1b, 0x1d, + 0x52, 0x2e, 0x93, 0x96, 0xef, 0xfb, 0x72, 0xce, 0xa9, 0xd5, 0x0e, 0x54, + 0xae, 0xd4, 0xb4, 0xb2, 0xbe, 0xad, 0x85, 0xa5, 0x8d, 0x83, 0x86, 0x18, + 0xaf, 0x76, 0x2c, 0x1a, 0xd3, 0xe9, 0xdc, 0x1d, 0xdb, 0xa3, 0xdd, 0xb7, + 0xd3, 0x18, 0xa3, 0x56, 0x3b, 0x50, 0xad, 0xde, 0xe8, 0x55, 0x11, 0xa0, + 0xac, 0xb5, 0xfa, 0xee, 0xfe, 0x13, 0x5d, 0x3c, 0x3f, 0xa9, 0x91, 0xe1, + 0x01, 0x3a, 0x91, 0x03, 0x00, 0x70, 0x8a, 0x10, 0x00, 0x02, 0x00, 0x70, + 0xc2, 0xc5, 0xb1, 0xd5, 0xec, 0xfc, 0xaa, 0x1a, 0xcd, 0x16, 0x83, 0x01, + 0x1c, 0x31, 0xcf, 0x33, 0x9a, 0xb9, 0x30, 0xad, 0x0f, 0xdf, 0xbb, 0xaa, + 0xf3, 0xd3, 0x63, 0xf2, 0xfd, 0xce, 0x5e, 0x7d, 0xcf, 0x57, 0xd6, 0x15, + 0xf2, 0x19, 0x8d, 0x8d, 0x0c, 0xea, 0xda, 0xe5, 0x73, 0xfa, 0xe4, 0xd6, + 0x0d, 0x3d, 0x78, 0xb4, 0xa0, 0x7b, 0x8f, 0x16, 0x5e, 0x69, 0x39, 0xac, + 0x31, 0x46, 0xbb, 0xa5, 0x8a, 0xea, 0xf5, 0xa6, 0x0a, 0x85, 0xdc, 0x91, + 0x56, 0xec, 0x95, 0x2b, 0x35, 0xd5, 0xea, 0xbd, 0x3b, 0x2f, 0x18, 0x63, + 0xb4, 0x57, 0xaa, 0xea, 0xf6, 0x83, 0x79, 0xfd, 0xd3, 0x6f, 0x3f, 0x94, + 0x44, 0x25, 0x20, 0x00, 0x00, 0xa7, 0xe6, 0x9a, 0x87, 0x21, 0x00, 0x00, + 0xe0, 0x64, 0x2b, 0x57, 0xea, 0x5a, 0x58, 0x5a, 0xef, 0xd9, 0x52, 0x3f, + 0xa0, 0x5f, 0xe4, 0xb2, 0x69, 0xfd, 0xf6, 0xd3, 0x0f, 0xf4, 0x5f, 0xff, + 0xf0, 0xa9, 0x2e, 0x5f, 0x9c, 0x92, 0xe7, 0x79, 0x3f, 0xb9, 0xac, 0xd6, + 0xb9, 0x67, 0xcb, 0x6d, 0xa5, 0xa1, 0x81, 0xbc, 0x7e, 0xfb, 0xd9, 0x07, + 0xfa, 0xdf, 0xfe, 0xf0, 0x99, 0xce, 0x4d, 0x8d, 0xbe, 0xf4, 0x39, 0x8c, + 0x31, 0xaa, 0xd5, 0x9b, 0x5a, 0x5a, 0xdd, 0x3c, 0xd2, 0x4a, 0x3d, 0x6b, + 0xad, 0xd6, 0x36, 0x76, 0xd5, 0x0e, 0x82, 0x9e, 0x8e, 0x99, 0xef, 0x7b, + 0x9a, 0x9d, 0x5f, 0xd6, 0xea, 0xfa, 0x2e, 0xdb, 0x11, 0x00, 0x00, 0x70, + 0x8a, 0x10, 0x00, 0x02, 0x00, 0x70, 0x82, 0x59, 0x6b, 0xb5, 0xb8, 0xba, + 0xa9, 0xfd, 0x4a, 0x8d, 0xc1, 0x00, 0x8e, 0x50, 0x26, 0x9d, 0xd2, 0x6f, + 0x3f, 0xfb, 0x40, 0x1f, 0x7f, 0x70, 0x5d, 0xe9, 0x54, 0xea, 0x95, 0x97, + 0xe8, 0xda, 0x83, 0x80, 0xf0, 0xd2, 0xf9, 0x09, 0xfd, 0xe3, 0x6f, 0x3f, + 0xd6, 0xf9, 0xe9, 0xb1, 0x97, 0x86, 0xf3, 0xce, 0x49, 0x8f, 0x9e, 0x2c, + 0xab, 0x56, 0x6f, 0x1e, 0x59, 0x68, 0x56, 0xad, 0x37, 0xf5, 0x64, 0x61, + 0x4d, 0x71, 0x6c, 0x7b, 0x3e, 0x76, 0xad, 0x56, 0xa0, 0xfb, 0x8f, 0x17, + 0xd4, 0x0e, 0x42, 0x26, 0x12, 0x00, 0x00, 0xa7, 0x04, 0x01, 0x20, 0x00, + 0x00, 0x27, 0x58, 0x10, 0x44, 0x9a, 0x7f, 0xba, 0xaa, 0x30, 0x8c, 0x19, + 0x0c, 0xe0, 0x88, 0x38, 0x27, 0xfd, 0xdd, 0x47, 0x37, 0x74, 0xf3, 0xc6, + 0x25, 0x79, 0x9e, 0x79, 0xa3, 0xea, 0x5a, 0x27, 0x69, 0x7c, 0x74, 0x48, + 0xff, 0xf0, 0xeb, 0x5b, 0x1a, 0x2a, 0x16, 0x5e, 0xfa, 0x18, 0x9b, 0xdb, + 0x25, 0x3d, 0x9c, 0x5d, 0x3a, 0xa2, 0xc0, 0xce, 0xe9, 0xde, 0xc3, 0xa7, + 0xda, 0xda, 0x29, 0x1d, 0xdb, 0x18, 0x2e, 0xaf, 0x6e, 0x69, 0x63, 0x73, + 0x97, 0xc9, 0x04, 0x00, 0xc0, 0x29, 0x41, 0x00, 0x08, 0x00, 0xc0, 0x09, + 0xd5, 0xe9, 0xba, 0xb9, 0xa5, 0x8d, 0xed, 0xbd, 0x33, 0xdf, 0x75, 0xd3, + 0x18, 0xf3, 0xd2, 0x0f, 0xcf, 0x18, 0x79, 0x9e, 0x27, 0xcf, 0x33, 0x87, + 0x1f, 0xac, 0x40, 0xc4, 0xeb, 0xb2, 0xd6, 0xea, 0xca, 0xcc, 0xb4, 0x6e, + 0xbd, 0x77, 0x55, 0x9e, 0x79, 0xbb, 0x4b, 0x61, 0xe7, 0x9c, 0xce, 0x4d, + 0x8e, 0xea, 0xd3, 0x4f, 0xde, 0x91, 0x79, 0xc9, 0x31, 0x1a, 0x86, 0x91, + 0x6e, 0xdf, 0x9f, 0xd7, 0xd2, 0xea, 0xc6, 0x5b, 0x2d, 0xe7, 0x77, 0xce, + 0xe9, 0xfe, 0xa3, 0x45, 0xdd, 0x7d, 0xf0, 0x54, 0xd6, 0xda, 0x63, 0x1b, + 0xc7, 0x46, 0xb3, 0xa5, 0x07, 0xb3, 0x8b, 0x0a, 0x42, 0xaa, 0x00, 0x01, + 0x00, 0x38, 0x0d, 0x68, 0x02, 0x02, 0x00, 0xc0, 0x09, 0x64, 0x8c, 0x14, + 0x46, 0x91, 0x1e, 0xcc, 0x2e, 0x2a, 0x0c, 0x63, 0xf9, 0xfe, 0xd9, 0xfd, + 0x9d, 0x5d, 0x3e, 0x9b, 0xd1, 0x85, 0x73, 0xe3, 0x4a, 0x24, 0xfc, 0xc3, + 0x7f, 0xf3, 0x7d, 0xff, 0x85, 0xf7, 0xec, 0x79, 0x46, 0xc9, 0x44, 0x42, + 0x87, 0xd1, 0x89, 0x93, 0x66, 0x17, 0x56, 0xb4, 0xb3, 0x53, 0x3e, 0xf3, + 0x01, 0x29, 0x8e, 0x86, 0x73, 0x4e, 0xe9, 0x54, 0x52, 0x9f, 0x7c, 0x70, + 0x4d, 0xe9, 0x54, 0xf2, 0x48, 0xba, 0xd8, 0xc6, 0xb1, 0xd5, 0xf5, 0x2b, + 0x17, 0x34, 0x3b, 0xbf, 0xaa, 0xc5, 0xe5, 0x8d, 0x9f, 0xed, 0x0e, 0x6c, + 0x8c, 0x51, 0xa5, 0x5a, 0xd7, 0x1f, 0x3f, 0xbf, 0xad, 0xf0, 0xd3, 0x58, + 0x57, 0x67, 0xa6, 0x95, 0x4c, 0x24, 0x64, 0x5f, 0x31, 0x0c, 0xf4, 0x8c, + 0x51, 0x3b, 0x0c, 0x75, 0xff, 0xd1, 0x82, 0xbe, 0xfc, 0xf6, 0x91, 0x5a, + 0x41, 0x20, 0xef, 0x98, 0x13, 0xf0, 0xa5, 0x95, 0x4d, 0x6d, 0x6c, 0xee, + 0x69, 0xe6, 0xe2, 0x14, 0x7b, 0x94, 0x02, 0x00, 0x70, 0xc2, 0x11, 0x00, + 0x02, 0x00, 0x70, 0x02, 0x79, 0xc6, 0xd3, 0xca, 0xea, 0xba, 0x56, 0xd7, + 0x77, 0xce, 0x74, 0xf8, 0xe7, 0x9c, 0xd3, 0xc8, 0x48, 0x51, 0xbf, 0xfb, + 0xfb, 0x5b, 0xca, 0xa4, 0xd3, 0x87, 0xff, 0xde, 0xc9, 0x35, 0x7e, 0x18, + 0x6e, 0x18, 0xa3, 0x1f, 0xec, 0x9f, 0x66, 0xad, 0xd5, 0xde, 0x7e, 0x45, + 0xdb, 0xdb, 0xfb, 0xa2, 0x1b, 0x29, 0x5e, 0x75, 0xbe, 0x4d, 0x4f, 0x8e, + 0x6a, 0x62, 0x7c, 0xe4, 0x48, 0xc2, 0xbf, 0x67, 0x92, 0x89, 0x84, 0xae, + 0xcf, 0x9c, 0xd3, 0xca, 0xea, 0x96, 0x7e, 0xe9, 0x51, 0x7d, 0xdf, 0xd3, + 0x7e, 0xb9, 0xa6, 0x3f, 0x7e, 0xfe, 0x9d, 0x36, 0xb6, 0xf6, 0xf4, 0xc1, + 0xcd, 0x2b, 0x1a, 0x1d, 0x2e, 0xca, 0x18, 0xf3, 0x93, 0xcd, 0x47, 0x3a, + 0xd5, 0xaf, 0x9d, 0x25, 0xcb, 0x1b, 0xdb, 0x25, 0xdd, 0x7d, 0x30, 0xaf, + 0x27, 0x0b, 0xab, 0x6a, 0x07, 0xe1, 0xb1, 0x87, 0x7f, 0xc6, 0x18, 0x35, + 0xdb, 0x81, 0x6e, 0xdf, 0x9f, 0xd7, 0xf4, 0xd4, 0x98, 0x52, 0x49, 0x5f, + 0x64, 0x80, 0x00, 0x00, 0x9c, 0x5c, 0x04, 0x80, 0x00, 0x00, 0x9c, 0x30, + 0xc6, 0x48, 0x41, 0x18, 0xe9, 0xde, 0xe3, 0x05, 0xc5, 0x71, 0x7c, 0xe6, + 0x3b, 0x6d, 0x26, 0x13, 0x9d, 0x6a, 0xbf, 0x57, 0xa9, 0xe2, 0x7b, 0x3e, + 0x20, 0xa1, 0xe2, 0x08, 0x6f, 0x70, 0x74, 0xe9, 0xdc, 0xd4, 0x98, 0x92, + 0xcf, 0x55, 0x9b, 0x1e, 0x95, 0xf1, 0xf1, 0x61, 0xe5, 0x72, 0x99, 0x97, + 0x36, 0xfa, 0xf0, 0x3c, 0x4f, 0xcd, 0x56, 0xa0, 0x3b, 0x0f, 0xe6, 0xb5, + 0xb0, 0xbc, 0xa1, 0xab, 0x33, 0xd3, 0xba, 0x36, 0x73, 0x4e, 0xc3, 0xc3, + 0x45, 0xa5, 0x53, 0xc9, 0xc3, 0xe3, 0x20, 0x8e, 0xad, 0x5a, 0xad, 0xb6, + 0xb6, 0x77, 0xcb, 0x7a, 0xba, 0xb8, 0xa6, 0xf9, 0xa5, 0x75, 0x35, 0x1a, + 0x2d, 0x39, 0xe9, 0xc4, 0x9c, 0x13, 0x7c, 0xcf, 0xd3, 0xe2, 0xca, 0x86, + 0x16, 0x96, 0xd6, 0x75, 0xf3, 0xc6, 0xa5, 0x63, 0x69, 0x48, 0x02, 0x00, + 0x00, 0x5e, 0x0d, 0x01, 0x20, 0x00, 0x00, 0x27, 0x8c, 0x91, 0xd1, 0xfa, + 0xe6, 0x8e, 0xd6, 0xd6, 0x77, 0xcf, 0x7c, 0xf8, 0x27, 0x49, 0x9e, 0xef, + 0xcb, 0xf3, 0x7c, 0xbe, 0xf1, 0xe8, 0xba, 0x64, 0xc2, 0xd7, 0xd0, 0x60, + 0xa1, 0x2b, 0x8f, 0x9d, 0x49, 0xa7, 0x94, 0xcd, 0xa4, 0x55, 0xab, 0x37, + 0x5f, 0xe9, 0xf3, 0x9d, 0x73, 0xaa, 0x54, 0xeb, 0xfa, 0xfa, 0xf6, 0x63, + 0xdd, 0x7e, 0x30, 0xaf, 0x62, 0x21, 0xaf, 0xc1, 0x62, 0x5e, 0x99, 0x74, + 0x52, 0xce, 0x49, 0xed, 0x76, 0xa0, 0x52, 0xa5, 0xa6, 0x5a, 0xb5, 0xa9, + 0x28, 0x8e, 0x4f, 0xec, 0x32, 0x77, 0xe7, 0x9c, 0xee, 0x3e, 0x7c, 0xaa, + 0x4b, 0xe7, 0x27, 0x94, 0xc9, 0xa4, 0x09, 0xe6, 0x01, 0x00, 0x38, 0xa1, + 0x08, 0x00, 0x01, 0x00, 0x38, 0x61, 0xc2, 0x28, 0xd2, 0x93, 0x85, 0x35, + 0x85, 0x51, 0x74, 0xe6, 0xdf, 0xab, 0x31, 0x46, 0x09, 0xdf, 0x67, 0x01, + 0x2f, 0x7a, 0xe2, 0xd9, 0x3e, 0x92, 0x5d, 0xb9, 0xa8, 0xf6, 0x7d, 0xa5, + 0x52, 0x89, 0x37, 0x78, 0x4d, 0x9e, 0x6c, 0xdc, 0x59, 0xce, 0xbe, 0xbb, + 0x57, 0x7e, 0xee, 0xe0, 0xe8, 0xec, 0xfb, 0x67, 0x8c, 0x39, 0xd1, 0x7b, + 0x5c, 0x1a, 0x63, 0xb4, 0xb9, 0xbd, 0xa7, 0xa7, 0xcb, 0x1b, 0x7a, 0xef, + 0xc6, 0x0c, 0x93, 0x0c, 0x00, 0x80, 0x93, 0x7a, 0x1d, 0xc4, 0x10, 0x00, + 0x00, 0x70, 0xb2, 0xec, 0x57, 0xea, 0x5a, 0x59, 0xdb, 0xee, 0x9b, 0x4a, + 0x9a, 0x84, 0xef, 0xf5, 0x45, 0xa5, 0x23, 0x8e, 0x9f, 0x3b, 0xf8, 0xe8, + 0xda, 0x63, 0xbf, 0xc5, 0x83, 0x7b, 0xc6, 0xc8, 0xf7, 0xbd, 0xef, 0x3f, + 0xbc, 0xd3, 0x73, 0x5c, 0xc4, 0xb1, 0xd5, 0xe3, 0xb9, 0x65, 0x35, 0x9a, + 0x2d, 0x26, 0x19, 0x00, 0x00, 0x27, 0x14, 0x01, 0x20, 0x00, 0x00, 0x27, + 0xe9, 0x46, 0xda, 0x5a, 0x2d, 0x2e, 0x6f, 0xa8, 0x52, 0xad, 0xf7, 0xc5, + 0xfb, 0x35, 0xc6, 0x28, 0x91, 0xf0, 0x45, 0xfe, 0x87, 0x9e, 0x1c, 0x5f, + 0xb1, 0x55, 0xbb, 0x1d, 0x74, 0xe5, 0xb1, 0xc3, 0x30, 0xec, 0xda, 0x63, + 0xbf, 0x29, 0xe7, 0x24, 0xeb, 0x9c, 0xac, 0xb5, 0x8a, 0xe3, 0x83, 0x0f, + 0x6b, 0x65, 0xad, 0x3d, 0xf2, 0x5f, 0x30, 0x6c, 0xed, 0x94, 0xb4, 0xbe, + 0xb9, 0xcb, 0x24, 0x03, 0x00, 0xe0, 0x84, 0x62, 0x09, 0x30, 0x00, 0x00, + 0x27, 0x48, 0x18, 0x84, 0x5a, 0x5c, 0xde, 0x38, 0xd8, 0xf3, 0xab, 0x3f, + 0x7e, 0x4f, 0xe7, 0x7b, 0xbe, 0xe8, 0xe2, 0x8b, 0x5e, 0x88, 0xe2, 0x58, + 0xdb, 0x7b, 0x65, 0x5d, 0xbf, 0x72, 0xe1, 0xc8, 0x97, 0xd5, 0x36, 0x1a, + 0x6d, 0x35, 0x9a, 0x6d, 0x9d, 0x84, 0x34, 0xdb, 0x18, 0xa3, 0x54, 0xd2, + 0x57, 0x71, 0x20, 0xaf, 0xb1, 0xe1, 0x41, 0x0d, 0x0d, 0x0d, 0x28, 0x9b, + 0x49, 0xcb, 0x78, 0x52, 0x14, 0x59, 0x55, 0x6b, 0x0d, 0xed, 0x95, 0x2a, + 0xda, 0xdd, 0xaf, 0xa8, 0xd9, 0x68, 0x2b, 0x8a, 0xe3, 0xb7, 0x7e, 0xce, + 0x66, 0x2b, 0xd0, 0xe3, 0x27, 0xcb, 0xba, 0x70, 0x6e, 0x42, 0xa9, 0x24, + 0xb7, 0x18, 0x00, 0x00, 0x9c, 0x34, 0xfc, 0x74, 0x06, 0x00, 0xe0, 0x84, + 0x30, 0xc6, 0x68, 0x65, 0x63, 0x47, 0x1b, 0xdb, 0xa5, 0xbe, 0x09, 0xff, + 0x8c, 0xd1, 0x5b, 0x55, 0x00, 0xd2, 0x6e, 0x00, 0xaf, 0x35, 0xdf, 0x24, + 0xad, 0xad, 0x6f, 0x2b, 0x08, 0x42, 0x65, 0xb3, 0x29, 0x1d, 0x55, 0x11, + 0x9c, 0x73, 0x4e, 0x2b, 0x1b, 0xdb, 0x6a, 0xb6, 0xda, 0xc7, 0xb6, 0x6c, + 0xd7, 0x39, 0x27, 0xcf, 0x33, 0x1a, 0x1c, 0x28, 0xe8, 0xf2, 0xc5, 0x29, + 0xcd, 0x5c, 0x9a, 0xd4, 0xf8, 0xc8, 0x90, 0x32, 0xd9, 0xb4, 0x3c, 0x99, + 0x83, 0x8c, 0xdd, 0x48, 0x72, 0x72, 0xce, 0xc9, 0xc6, 0x4e, 0x95, 0x5a, + 0x5d, 0x1b, 0x9b, 0x7b, 0x9a, 0x5b, 0x5c, 0xd5, 0xfa, 0xc6, 0xee, 0x5b, + 0xbd, 0x7e, 0x63, 0xa4, 0x95, 0xf5, 0x6d, 0x6d, 0xef, 0xec, 0xeb, 0xc2, + 0xb9, 0x71, 0x9a, 0x81, 0x00, 0x00, 0x70, 0xc2, 0x10, 0x00, 0x02, 0x00, + 0x70, 0x42, 0x58, 0x6b, 0x35, 0xf7, 0x64, 0x45, 0x61, 0x18, 0xc9, 0xf7, + 0xfb, 0x65, 0x97, 0x8e, 0xce, 0xbe, 0x67, 0x6f, 0x1a, 0x3a, 0x78, 0x54, + 0x0e, 0xe2, 0x75, 0xe6, 0x8b, 0xe7, 0x69, 0x6b, 0xa7, 0xa4, 0xa7, 0xcb, + 0xeb, 0xba, 0x75, 0xf3, 0x8a, 0xe2, 0xd8, 0xbe, 0xfd, 0x0c, 0x36, 0x46, + 0xd5, 0x7a, 0x43, 0x73, 0x4f, 0x57, 0xe5, 0x9c, 0x3b, 0x96, 0x00, 0xd0, + 0x39, 0xa7, 0x74, 0x3a, 0xa5, 0xf7, 0xde, 0x99, 0xd1, 0x7b, 0xd7, 0x2f, + 0x69, 0x78, 0x68, 0x40, 0x89, 0x84, 0x2f, 0xe7, 0x24, 0x67, 0x9d, 0xe2, + 0x9f, 0x8a, 0xca, 0x8d, 0x34, 0x58, 0x2c, 0x68, 0x68, 0xb0, 0xa0, 0x99, + 0x4b, 0x53, 0x5a, 0x5b, 0xdf, 0xd1, 0xed, 0xfb, 0x4f, 0xb4, 0xb4, 0xba, + 0xf5, 0x46, 0xd5, 0x91, 0xc6, 0x18, 0x35, 0x1a, 0x6d, 0x3d, 0x78, 0xbc, + 0xa8, 0xf3, 0x53, 0xa3, 0x62, 0x5d, 0x3f, 0x00, 0x00, 0x27, 0xec, 0x3a, + 0x88, 0x21, 0x00, 0x00, 0xe0, 0x04, 0xfc, 0x40, 0xf6, 0x8c, 0x36, 0x36, + 0xf7, 0xb4, 0xb8, 0xba, 0xd9, 0x37, 0xd5, 0x7f, 0xd2, 0xf7, 0x15, 0x80, + 0x6f, 0x36, 0x66, 0x9e, 0x52, 0xa9, 0x84, 0x1c, 0x75, 0x80, 0x78, 0x0d, + 0xce, 0x49, 0xdf, 0xdd, 0x9d, 0xd3, 0xde, 0x7e, 0xf5, 0x48, 0x96, 0x01, + 0x1b, 0x49, 0x77, 0xef, 0xcf, 0x6b, 0x67, 0x77, 0xff, 0x58, 0x8e, 0x5d, + 0xe7, 0x9c, 0x06, 0x0a, 0x39, 0xfd, 0xe1, 0x1f, 0x3e, 0xd6, 0x3f, 0x7c, + 0xfa, 0x81, 0x46, 0x47, 0x06, 0x3b, 0x9d, 0x85, 0xad, 0x7b, 0x69, 0x15, + 0x9e, 0x73, 0x4e, 0xd6, 0x3a, 0xa5, 0x53, 0x49, 0x5d, 0x99, 0x99, 0xd6, + 0x7f, 0xfd, 0xa7, 0x4f, 0xf5, 0xf1, 0x07, 0xd7, 0xde, 0xb8, 0x7a, 0xcf, + 0xf3, 0x8c, 0x9e, 0x2e, 0xaf, 0x69, 0xb3, 0x8f, 0xaa, 0x98, 0x01, 0x00, + 0x38, 0x35, 0xf7, 0x1b, 0x0c, 0x01, 0x00, 0x00, 0xc7, 0xcf, 0x39, 0x69, + 0x6e, 0x61, 0x45, 0x41, 0x10, 0xf6, 0x55, 0xe1, 0x8c, 0x67, 0x8c, 0x52, + 0xc9, 0xc4, 0x1b, 0x57, 0x4d, 0xe5, 0x73, 0x59, 0x79, 0x86, 0xcb, 0x99, + 0xb3, 0xce, 0x18, 0x23, 0xcf, 0xeb, 0x74, 0xc6, 0xf5, 0x3d, 0x4f, 0x9e, + 0x67, 0xde, 0xf8, 0x38, 0x31, 0xc6, 0x68, 0x67, 0xaf, 0xac, 0xaf, 0xbf, + 0x7b, 0xa4, 0x66, 0xeb, 0xed, 0x9b, 0x76, 0x3c, 0x9c, 0x5b, 0xd2, 0xed, + 0x07, 0xf3, 0xc7, 0x16, 0xfe, 0x8d, 0x0c, 0x0d, 0xe8, 0x3f, 0xff, 0xfe, + 0x57, 0x7a, 0xef, 0xc6, 0xcc, 0x5b, 0x57, 0x0e, 0x17, 0x0a, 0x39, 0xfd, + 0xfe, 0x37, 0x1f, 0xea, 0x37, 0x9f, 0xbe, 0xff, 0x46, 0xef, 0xc7, 0x18, + 0xa3, 0x56, 0x2b, 0xd0, 0x83, 0xd9, 0x45, 0x59, 0x67, 0x99, 0xb8, 0x00, + 0x00, 0x9c, 0x20, 0x2c, 0x01, 0x06, 0x00, 0xe0, 0x98, 0x19, 0x63, 0x54, + 0xda, 0xaf, 0xe8, 0xe9, 0xd2, 0x46, 0xdf, 0x55, 0xcd, 0x78, 0xbe, 0xa7, + 0x5c, 0x36, 0xfd, 0xc6, 0x5f, 0x3f, 0x34, 0x98, 0x57, 0x22, 0xd1, 0xa9, + 0x76, 0xc2, 0xd9, 0xe1, 0x9c, 0x93, 0x91, 0x51, 0x3e, 0x9f, 0xd1, 0xf0, + 0xd0, 0x80, 0x86, 0x07, 0x07, 0x34, 0x50, 0xc8, 0x29, 0x91, 0xf4, 0x25, + 0x27, 0xb5, 0xdb, 0x81, 0x2a, 0xd5, 0xba, 0xf6, 0xf6, 0xab, 0xda, 0xaf, + 0xd4, 0xd4, 0x6c, 0x05, 0x32, 0x7a, 0xf5, 0x50, 0xd0, 0x18, 0xa3, 0x07, + 0xb3, 0x4b, 0xca, 0xa4, 0x53, 0xfa, 0xe4, 0xc3, 0x1b, 0xca, 0x65, 0x33, + 0xaf, 0x55, 0xf5, 0x66, 0x8c, 0x51, 0x6c, 0x63, 0xcd, 0x2f, 0xac, 0xeb, + 0xf3, 0xaf, 0xee, 0x2b, 0x8c, 0xe2, 0x9e, 0x2f, 0x46, 0x77, 0xce, 0x69, + 0xb0, 0x98, 0xd7, 0xef, 0x7f, 0xf3, 0x91, 0xae, 0x5c, 0x9c, 0x56, 0x6c, + 0xed, 0x91, 0x3c, 0xa6, 0xef, 0xfb, 0xfa, 0xf4, 0xa3, 0x77, 0x14, 0x45, + 0xb1, 0xbe, 0xbd, 0x3b, 0xfb, 0xda, 0xc7, 0x96, 0xe7, 0x79, 0x5a, 0x58, + 0xde, 0xd0, 0xee, 0x5e, 0x59, 0xe3, 0x23, 0x43, 0xb2, 0xec, 0x05, 0x08, + 0x00, 0xc0, 0x89, 0x40, 0x00, 0x08, 0x00, 0xc0, 0xb1, 0x73, 0x5a, 0x5c, + 0xd9, 0x52, 0xbd, 0xd1, 0xea, 0xbb, 0x77, 0x9e, 0x4e, 0xa5, 0x34, 0x50, + 0xc8, 0xbf, 0xf1, 0xd7, 0x0f, 0x0f, 0x0e, 0x28, 0x97, 0xcd, 0xa8, 0x5a, + 0x6b, 0x1c, 0x5b, 0xf3, 0x05, 0x1c, 0xad, 0x38, 0x8e, 0x35, 0x30, 0x90, + 0xd7, 0xf5, 0x99, 0x73, 0xba, 0x76, 0xe5, 0xbc, 0x86, 0x87, 0x06, 0x94, + 0x49, 0xa7, 0xe4, 0x79, 0xdf, 0xef, 0x15, 0xe9, 0x9c, 0x55, 0x14, 0x59, + 0x35, 0x5b, 0x6d, 0x6d, 0xef, 0xee, 0xeb, 0xd1, 0x93, 0x25, 0x2d, 0x2e, + 0x6f, 0x2a, 0x08, 0xc2, 0x57, 0x0e, 0xd1, 0xad, 0x73, 0xfa, 0xf6, 0xde, + 0x13, 0xd5, 0x1a, 0x4d, 0x7d, 0xfc, 0xc1, 0x75, 0x4d, 0x4d, 0x8c, 0xca, + 0xb9, 0x5f, 0x5e, 0x36, 0xfb, 0xac, 0x12, 0xb1, 0xde, 0x68, 0xea, 0xfe, + 0xe3, 0x05, 0xdd, 0xbe, 0xf7, 0x44, 0xb5, 0x7a, 0xeb, 0x58, 0xaa, 0x76, + 0x53, 0xc9, 0x84, 0x3e, 0xfd, 0xe8, 0x5d, 0x5d, 0x3c, 0x3f, 0x71, 0x24, + 0xe1, 0xdf, 0xe1, 0xd9, 0xc8, 0x39, 0x79, 0x9e, 0xa7, 0x8f, 0x3f, 0xb8, + 0xa6, 0x72, 0xa5, 0xa6, 0x27, 0x0b, 0x6b, 0xaf, 0xfd, 0x18, 0xcd, 0x56, + 0x5b, 0xf3, 0x0b, 0xeb, 0x1a, 0x1d, 0x1e, 0x64, 0x42, 0x03, 0x00, 0x70, + 0x42, 0x10, 0x00, 0x02, 0x00, 0x70, 0xcc, 0x1a, 0xcd, 0xb6, 0x16, 0x97, + 0x37, 0x64, 0x6d, 0xff, 0x2d, 0x99, 0x1b, 0x1e, 0x2c, 0xa8, 0x90, 0xcf, + 0xbe, 0xf1, 0x9e, 0x63, 0xb9, 0x5c, 0x46, 0x23, 0x43, 0x03, 0xaa, 0xd6, + 0x1a, 0x4c, 0xa4, 0x33, 0xc0, 0x59, 0xa7, 0x8b, 0xe7, 0x27, 0xf4, 0x9b, + 0x4f, 0xdf, 0xd7, 0xe4, 0xf8, 0x88, 0xfc, 0xe7, 0xc2, 0xbc, 0x1f, 0x87, + 0x73, 0xbe, 0xef, 0xa9, 0x90, 0xcf, 0xaa, 0x90, 0xcf, 0xea, 0xc2, 0xf4, + 0xb8, 0xe6, 0x97, 0xd6, 0xf5, 0xc5, 0xd7, 0x0f, 0x54, 0xae, 0xd4, 0x5e, + 0x29, 0x0c, 0x36, 0xea, 0x34, 0xde, 0x99, 0x9d, 0x5f, 0xd1, 0xda, 0xfa, + 0xae, 0xde, 0x7b, 0x77, 0x46, 0x37, 0xae, 0x5c, 0xd0, 0xf0, 0xd0, 0x40, + 0xe7, 0xeb, 0x9d, 0x7b, 0xae, 0x91, 0x85, 0x93, 0xd4, 0x59, 0xde, 0xba, + 0xb8, 0xba, 0xa1, 0xfb, 0x8f, 0x16, 0xb5, 0xbe, 0xb1, 0x23, 0xeb, 0xdc, + 0xb1, 0x2d, 0xd9, 0xbf, 0x32, 0x33, 0xad, 0xeb, 0x57, 0xce, 0x77, 0x2d, + 0xf8, 0xce, 0xe7, 0xb2, 0xfa, 0xf8, 0x83, 0xeb, 0x5a, 0xdf, 0xdc, 0x55, + 0xa3, 0xd9, 0x7e, 0xad, 0xaf, 0xb5, 0xd6, 0x69, 0x71, 0x65, 0x53, 0xef, + 0xbd, 0x33, 0xa3, 0x42, 0x3e, 0xcb, 0xc4, 0x06, 0x00, 0xe0, 0x04, 0x20, + 0x00, 0x04, 0x00, 0xe0, 0x98, 0x95, 0xf6, 0xab, 0xda, 0x2d, 0x55, 0xfa, + 0xf2, 0xbd, 0x5f, 0xba, 0x30, 0xa9, 0x74, 0x2a, 0xf9, 0xc6, 0x15, 0x4c, + 0x99, 0x74, 0x4a, 0xd3, 0x53, 0xa3, 0x5a, 0x59, 0xdf, 0x66, 0x19, 0xf0, + 0x29, 0x67, 0x8c, 0xd1, 0xe5, 0x99, 0x29, 0xfd, 0xe1, 0x1f, 0x3e, 0xd6, + 0xc0, 0x40, 0xfe, 0xb5, 0x42, 0xe1, 0x64, 0x32, 0xa1, 0x77, 0xaf, 0x5f, + 0xd4, 0x40, 0x21, 0xab, 0x7f, 0xfb, 0xf3, 0xb7, 0x2a, 0xed, 0x57, 0x5f, + 0xf9, 0x6b, 0x9d, 0x93, 0x6a, 0x8d, 0xa6, 0xfe, 0xfa, 0xf5, 0x03, 0xdd, + 0x7b, 0xf0, 0x54, 0xd3, 0x53, 0x63, 0x9a, 0x1c, 0x1f, 0xd2, 0xe0, 0x40, + 0x41, 0xa9, 0x74, 0x52, 0x51, 0x14, 0xab, 0xd9, 0x68, 0x69, 0x7b, 0xaf, + 0xac, 0xd5, 0x8d, 0x6d, 0xed, 0x95, 0x2a, 0x07, 0xd9, 0xe0, 0xf1, 0x55, + 0x9c, 0xa6, 0x53, 0x49, 0xdd, 0xba, 0x79, 0x55, 0x99, 0x4c, 0xba, 0x6b, + 0xbf, 0x38, 0x70, 0xce, 0xe9, 0xdc, 0xd4, 0x98, 0xde, 0x7b, 0x67, 0x46, + 0x5f, 0x7e, 0xfb, 0xe8, 0xb5, 0xdf, 0x6f, 0xa9, 0x5c, 0xd5, 0xe6, 0xf6, + 0x9e, 0x0a, 0xf9, 0xf3, 0x4c, 0x6e, 0x00, 0x00, 0x4e, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x8e, 0x51, 0x1c, 0x5b, 0x2d, 0xad, 0x6e, 0xaa, 0xd1, 0xec, + 0xaf, 0xe5, 0xbf, 0xd6, 0x39, 0x0d, 0x17, 0x0b, 0xba, 0x7c, 0x71, 0xea, + 0xad, 0xf6, 0x08, 0xf3, 0x3c, 0x4f, 0x97, 0xce, 0x4f, 0xea, 0xee, 0xc3, + 0x05, 0xd5, 0xeb, 0x4d, 0x26, 0xd4, 0x29, 0xe5, 0x9c, 0xd3, 0xf4, 0xc4, + 0xa8, 0x7e, 0xff, 0x9b, 0x0f, 0x55, 0x2c, 0xe6, 0xdf, 0x2c, 0xcc, 0x75, + 0xd2, 0x85, 0xe9, 0x71, 0xfd, 0xe3, 0x6f, 0x3e, 0xd2, 0xff, 0xf8, 0xe3, + 0xd7, 0xaa, 0xd5, 0x5f, 0x6f, 0x59, 0xb8, 0x67, 0x8c, 0xea, 0xcd, 0x96, + 0x1e, 0x3f, 0x59, 0xd6, 0xe3, 0xf9, 0x65, 0x19, 0x63, 0xe4, 0x7b, 0xde, + 0x41, 0xa7, 0x5c, 0x7b, 0x18, 0xfa, 0xbd, 0x4d, 0x03, 0x92, 0x23, 0x39, + 0x67, 0x58, 0xab, 0xab, 0x33, 0xd3, 0x9a, 0x9e, 0x1c, 0xed, 0x7a, 0xd5, + 0xb0, 0x31, 0x46, 0xef, 0x5e, 0xbb, 0xa4, 0x87, 0xb3, 0x4b, 0xaa, 0xd5, + 0x9b, 0xaf, 0x35, 0x9e, 0xed, 0x76, 0xa0, 0xc5, 0xe5, 0x4d, 0xcd, 0x5c, + 0x9c, 0x52, 0xc2, 0xf7, 0x99, 0xe4, 0x00, 0x00, 0x1c, 0x33, 0xda, 0xe6, + 0x01, 0x00, 0x70, 0x8c, 0x82, 0x20, 0xd0, 0xf2, 0x6a, 0xff, 0x55, 0xaf, + 0x79, 0xc6, 0xe8, 0xc3, 0xf7, 0xaf, 0x68, 0xb0, 0x58, 0x78, 0xe3, 0xe5, + 0xbf, 0x52, 0x27, 0x38, 0x1a, 0x1d, 0x19, 0xd2, 0xcc, 0x85, 0x49, 0x9a, + 0x0d, 0x9c, 0x52, 0xce, 0x39, 0xe5, 0xb2, 0x69, 0xfd, 0xe6, 0xb3, 0xf7, + 0x35, 0x3c, 0x54, 0x7c, 0xab, 0x63, 0xc1, 0x5a, 0xa7, 0x4b, 0x17, 0x26, + 0xf5, 0xe9, 0xc7, 0xef, 0xbc, 0x71, 0x17, 0x5b, 0xdf, 0x3f, 0xe8, 0x34, + 0x6c, 0xcc, 0xe1, 0xdc, 0xf4, 0x3c, 0x4f, 0xbe, 0xdf, 0xe9, 0x3e, 0x7c, + 0xac, 0x63, 0x25, 0x29, 0x99, 0xf0, 0x75, 0xfd, 0xea, 0xc5, 0x9e, 0x34, + 0x0c, 0xb2, 0xd6, 0x6a, 0x64, 0x78, 0x40, 0x33, 0x97, 0xa6, 0xde, 0xa8, + 0x4a, 0x77, 0x65, 0x63, 0x5b, 0xf5, 0x7a, 0x8b, 0x49, 0x0e, 0x00, 0xc0, + 0x49, 0xb8, 0xfe, 0x66, 0x08, 0x00, 0x00, 0x38, 0x1e, 0xc6, 0x18, 0x6d, + 0x6c, 0x97, 0xb4, 0xb3, 0x57, 0x3e, 0xf6, 0x60, 0xa1, 0x97, 0x3a, 0x15, + 0x4c, 0xe7, 0xf4, 0xde, 0x8d, 0x2b, 0x6f, 0x15, 0xfe, 0x3d, 0x93, 0x4c, + 0x78, 0xfa, 0xe8, 0xbd, 0xab, 0x1a, 0x1e, 0x1c, 0x60, 0x19, 0xf0, 0x29, + 0x64, 0xad, 0xd5, 0xcd, 0x1b, 0x33, 0xba, 0x30, 0x3d, 0x7e, 0x44, 0x15, + 0x6d, 0x4e, 0x37, 0xaf, 0x5f, 0xea, 0x34, 0xc7, 0x88, 0xcf, 0xd6, 0xbe, + 0x9a, 0xce, 0x3a, 0x8d, 0x0c, 0x0f, 0x68, 0x6a, 0x7c, 0x58, 0xce, 0xf5, + 0xea, 0xbd, 0x19, 0x5d, 0xb9, 0x38, 0xa5, 0xa4, 0xff, 0x7a, 0x0b, 0x87, + 0x8c, 0x31, 0x2a, 0x57, 0x6a, 0x5a, 0x5c, 0xd9, 0xa0, 0x41, 0x0f, 0x00, + 0x00, 0x27, 0x00, 0x01, 0x20, 0x00, 0x00, 0xc7, 0x75, 0x33, 0xef, 0x9c, + 0x9e, 0x2c, 0xac, 0x2a, 0x08, 0xc3, 0xbe, 0x79, 0xcf, 0xc6, 0x18, 0x5d, + 0x98, 0x1e, 0xd7, 0x6f, 0x3f, 0x7b, 0x5f, 0xa9, 0xd4, 0xd1, 0xec, 0x44, + 0x62, 0xad, 0xd3, 0xc4, 0xd8, 0xb0, 0x7e, 0xf7, 0xeb, 0x0f, 0x34, 0x3c, + 0x54, 0x60, 0x62, 0x9d, 0xb2, 0x63, 0xa0, 0x90, 0xcf, 0xe9, 0xe6, 0xf5, + 0x4b, 0x47, 0xf8, 0x98, 0x52, 0x32, 0xe9, 0xeb, 0x9d, 0xab, 0x17, 0x94, + 0x48, 0x78, 0x67, 0x6e, 0xbc, 0x26, 0xc7, 0x47, 0x94, 0x4a, 0x26, 0xd5, + 0xab, 0x82, 0x57, 0xe7, 0x9c, 0x46, 0x87, 0x8b, 0xca, 0xe7, 0xd3, 0xaf, + 0x1d, 0xd8, 0x3b, 0x27, 0x2d, 0x2c, 0x6d, 0x9c, 0xb9, 0x20, 0x16, 0x00, + 0x80, 0xd3, 0x88, 0x3d, 0x00, 0x01, 0x00, 0x38, 0x06, 0xc6, 0x18, 0xed, + 0x97, 0x6b, 0x5a, 0x59, 0xdb, 0xfe, 0x41, 0xa7, 0xd3, 0xb3, 0xe6, 0x59, + 0xe7, 0x56, 0xcf, 0xeb, 0x74, 0x6c, 0xbd, 0x74, 0x61, 0x52, 0x9f, 0x7c, + 0x70, 0x4d, 0x23, 0x43, 0xc5, 0x23, 0xa9, 0xfe, 0x7b, 0x26, 0xb6, 0x56, + 0xd7, 0xaf, 0x9c, 0xd7, 0x40, 0x21, 0xab, 0x47, 0x73, 0xcb, 0x5a, 0x5e, + 0xdd, 0x56, 0xb5, 0xde, 0x50, 0x10, 0x84, 0xdf, 0x3f, 0x8f, 0x31, 0x32, + 0x2f, 0xbc, 0xbe, 0x9f, 0xfa, 0xde, 0x88, 0x8a, 0xa5, 0x1e, 0xce, 0x8f, + 0xc9, 0x89, 0x61, 0x0d, 0x16, 0xf3, 0x47, 0x3a, 0x1f, 0x24, 0xa3, 0xa9, + 0x89, 0x11, 0x15, 0x07, 0x0a, 0xda, 0x2f, 0x57, 0x7b, 0xfa, 0xfd, 0xfc, + 0xf1, 0xfb, 0x38, 0xca, 0xe7, 0x36, 0x46, 0x1a, 0x1d, 0x2e, 0x4a, 0x3d, + 0x9e, 0x9e, 0xe9, 0x54, 0x5a, 0x03, 0xf9, 0x9c, 0x2a, 0xd5, 0xd7, 0xdd, + 0x57, 0xd1, 0xd3, 0xe6, 0x96, 0xe4, 0x0d, 0x37, 0x00, 0x00, 0x20, 0x00, + 0x49, 0x44, 0x41, 0x54, 0xf6, 0xae, 0x76, 0x4b, 0x65, 0x4d, 0x8e, 0x0f, + 0x53, 0xa1, 0x0b, 0x00, 0xc0, 0x31, 0x22, 0x00, 0x04, 0x00, 0xe0, 0x18, + 0x78, 0xc6, 0x68, 0x71, 0x65, 0x43, 0xd5, 0x5a, 0xa3, 0x27, 0x7b, 0x79, + 0x1d, 0x15, 0x6b, 0x9d, 0x9c, 0x5c, 0x67, 0x33, 0x32, 0x73, 0xf0, 0xbf, + 0x3f, 0xa9, 0xd3, 0x2c, 0x21, 0x93, 0x49, 0x69, 0x74, 0xa8, 0xa8, 0xf3, + 0xd3, 0xe3, 0xba, 0x74, 0x61, 0x52, 0x63, 0x23, 0x83, 0x4a, 0x26, 0x13, + 0x47, 0x1c, 0xf6, 0x7c, 0xff, 0xda, 0x26, 0xc6, 0x46, 0x34, 0x32, 0x34, + 0xa8, 0x5b, 0x37, 0xeb, 0xda, 0x29, 0x55, 0xb4, 0x57, 0xaa, 0x68, 0xbf, + 0x5c, 0x53, 0xbd, 0xd1, 0x54, 0xab, 0x15, 0x28, 0x8a, 0x6c, 0xe7, 0x75, + 0x4b, 0xf2, 0x3d, 0x5f, 0x7e, 0xc2, 0x97, 0x79, 0xee, 0x4d, 0xf8, 0xbe, + 0xaf, 0x4a, 0xad, 0xae, 0x46, 0xa3, 0xcd, 0x24, 0xed, 0x91, 0xb1, 0xe1, + 0xc1, 0xae, 0x1c, 0x03, 0xe9, 0x74, 0x4a, 0xc5, 0x81, 0x9c, 0xf6, 0xcb, + 0xd5, 0x9e, 0x1c, 0x17, 0xd6, 0x59, 0x25, 0x7c, 0x4f, 0xe9, 0x54, 0x52, + 0x89, 0x84, 0x2f, 0xc9, 0xc8, 0xda, 0x58, 0x41, 0x10, 0x29, 0x8c, 0x63, + 0xc9, 0xe9, 0xa0, 0x81, 0xc8, 0x9b, 0xa7, 0x77, 0xbe, 0xef, 0x29, 0x9f, + 0xcb, 0xca, 0x18, 0xa9, 0x97, 0x5b, 0x5e, 0x7a, 0x9e, 0x51, 0x3e, 0x9f, + 0x7d, 0xed, 0xaf, 0x33, 0x46, 0x6a, 0xb5, 0x43, 0x2d, 0x2e, 0x6f, 0x68, + 0x72, 0x7c, 0x44, 0xbf, 0x70, 0xc2, 0x00, 0x00, 0x00, 0x5d, 0x46, 0x00, + 0x08, 0x00, 0x40, 0x8f, 0x19, 0x23, 0xb5, 0x83, 0x50, 0xf3, 0x4b, 0xeb, + 0xa7, 0xaa, 0xd2, 0xcc, 0x18, 0xe9, 0xa3, 0x0f, 0xae, 0x68, 0x64, 0xa8, + 0xa8, 0x20, 0x8c, 0x14, 0x45, 0x56, 0x51, 0x18, 0xca, 0xfd, 0xe8, 0x3d, + 0x18, 0x19, 0x65, 0x33, 0x29, 0x0d, 0x14, 0x72, 0x1a, 0x1e, 0x1c, 0xd0, + 0x40, 0x21, 0xab, 0x64, 0x32, 0x71, 0x18, 0xf2, 0xb8, 0x2e, 0x26, 0x17, + 0xce, 0x39, 0xf9, 0xbe, 0xa7, 0xa1, 0xc1, 0x01, 0x0d, 0x0d, 0x0e, 0xc8, + 0x5e, 0x3a, 0x27, 0x6b, 0xad, 0xa2, 0xd8, 0xca, 0x39, 0x2b, 0xf7, 0x7c, + 0x05, 0x92, 0x31, 0xf2, 0x7e, 0xf4, 0xda, 0xe3, 0xd8, 0xea, 0x4f, 0x5f, + 0xdc, 0xd6, 0xdc, 0xd3, 0x55, 0x26, 0x6a, 0x0f, 0x78, 0x9e, 0xf7, 0x46, + 0xc1, 0xd2, 0xab, 0xf0, 0x7d, 0x4f, 0xb9, 0x4c, 0xa6, 0xab, 0xaf, 0xdf, + 0x3a, 0x27, 0xdf, 0x33, 0x9a, 0x9a, 0x18, 0xd6, 0x85, 0xe9, 0x71, 0x4d, + 0x8c, 0x8f, 0x68, 0x20, 0x9f, 0x55, 0x32, 0x95, 0x94, 0x91, 0x14, 0xdb, + 0x58, 0x8d, 0x66, 0x5b, 0x7b, 0xa5, 0x8a, 0xd6, 0x36, 0x76, 0xb4, 0xba, + 0xbe, 0xa3, 0x66, 0x3b, 0x78, 0x61, 0xde, 0xbd, 0xfa, 0x31, 0xd8, 0x69, + 0x46, 0xd2, 0xeb, 0x7e, 0x37, 0xc6, 0x48, 0xa9, 0x54, 0xf2, 0x0d, 0xbf, + 0xd6, 0x68, 0x79, 0x6d, 0x5b, 0x1f, 0xdf, 0x0a, 0x0e, 0x96, 0x2e, 0x13, + 0x02, 0x02, 0x00, 0x70, 0x1c, 0x08, 0x00, 0x01, 0x00, 0xe8, 0x31, 0x63, + 0x8c, 0x76, 0x4b, 0x15, 0xed, 0xee, 0x95, 0x4f, 0x55, 0x00, 0xe8, 0x64, + 0x34, 0x73, 0x61, 0x4a, 0xd7, 0x2f, 0x5f, 0x38, 0xec, 0x08, 0x6a, 0x7e, + 0xf6, 0x73, 0x3b, 0x61, 0x9c, 0x79, 0xae, 0x93, 0xea, 0x71, 0xf0, 0x3c, + 0x23, 0xcf, 0xf3, 0x0f, 0x2a, 0xb2, 0x5e, 0x2e, 0x8a, 0xe3, 0x4e, 0xc0, + 0xa2, 0x9e, 0xaf, 0xb2, 0xec, 0xdb, 0x63, 0xa1, 0xd3, 0x00, 0xe7, 0xe8, + 0x47, 0xdb, 0xc8, 0xc8, 0xf3, 0xbd, 0x4e, 0x7a, 0xd5, 0x05, 0xc9, 0x84, + 0xaf, 0x73, 0x53, 0x63, 0xfa, 0xe0, 0xe6, 0x65, 0x9d, 0x9f, 0x1e, 0x57, + 0x26, 0x9d, 0x3a, 0x0c, 0xe6, 0x9e, 0xcd, 0xf9, 0xce, 0x53, 0x1b, 0x5d, + 0x3a, 0x3f, 0xa1, 0x8f, 0xde, 0xbf, 0xae, 0xdd, 0xd2, 0xbe, 0x1e, 0xcf, + 0xad, 0xe8, 0xd1, 0x93, 0x25, 0x35, 0x5b, 0x6d, 0xf5, 0x43, 0x16, 0x66, + 0x8c, 0xd1, 0x5e, 0xa9, 0xa2, 0xd2, 0x7e, 0x4d, 0x53, 0x13, 0xc3, 0x22, + 0xff, 0x03, 0x00, 0xe0, 0x78, 0x10, 0x00, 0x02, 0x00, 0xd0, 0x63, 0xd6, + 0x3a, 0xad, 0xae, 0x6f, 0x2b, 0x08, 0x4e, 0x57, 0xf3, 0x0f, 0xa3, 0x67, + 0x4b, 0x1d, 0xdd, 0x61, 0xc0, 0xf1, 0xb2, 0x7b, 0xf9, 0x53, 0x57, 0xed, + 0x43, 0x38, 0xd1, 0xe3, 0x63, 0xc1, 0xaa, 0xd5, 0x0a, 0x0e, 0x06, 0xde, + 0x74, 0xe1, 0xb1, 0xdb, 0x9d, 0xb5, 0xb2, 0x47, 0x18, 0x02, 0x3a, 0xe7, + 0x34, 0x36, 0x3c, 0xa8, 0x8f, 0x3f, 0xbc, 0xa1, 0x6b, 0x97, 0xa7, 0x95, + 0x4d, 0xa7, 0x65, 0x9d, 0xfb, 0xc9, 0xfd, 0xed, 0x3a, 0xd3, 0xff, 0xfb, + 0x30, 0x70, 0x62, 0x6c, 0x58, 0x13, 0x63, 0xc3, 0xba, 0x7a, 0xf9, 0x9c, + 0xee, 0xdc, 0x7f, 0xa2, 0xf9, 0xc5, 0x75, 0x85, 0x51, 0xf4, 0xca, 0xbf, + 0x08, 0x70, 0xce, 0x29, 0x8a, 0xe2, 0x9e, 0x2f, 0x01, 0xb6, 0xce, 0xa9, + 0xdd, 0x0e, 0xde, 0xf8, 0xeb, 0x83, 0x30, 0xd2, 0xc6, 0xf6, 0xae, 0x26, + 0xc7, 0x87, 0x99, 0xf4, 0x00, 0x00, 0x1c, 0x13, 0x02, 0x40, 0x00, 0x00, + 0x7a, 0xac, 0xdd, 0x0e, 0xb4, 0xb6, 0xb1, 0xcb, 0x86, 0xf8, 0xe8, 0x7b, + 0xce, 0x39, 0x95, 0xca, 0x55, 0x59, 0xeb, 0xe4, 0xfb, 0x47, 0x1b, 0x00, + 0x86, 0x61, 0xa4, 0x6a, 0xbd, 0x71, 0xe4, 0xaf, 0xf9, 0xea, 0xcc, 0x39, + 0xfd, 0xe6, 0xd3, 0xf7, 0x35, 0x36, 0x32, 0x28, 0x49, 0x87, 0xd5, 0xb0, + 0xaf, 0xe2, 0xd9, 0x31, 0x3f, 0x3d, 0x39, 0xaa, 0xe1, 0xc1, 0x82, 0xc6, + 0x46, 0x07, 0xf5, 0xd5, 0x77, 0x8f, 0xd5, 0x6a, 0x87, 0xaf, 0x94, 0x51, + 0x46, 0x71, 0xac, 0x5a, 0xbd, 0xd9, 0xf3, 0x2a, 0x3a, 0x6b, 0x9d, 0x6a, + 0xf5, 0xa6, 0xde, 0x34, 0xa4, 0xb5, 0xd6, 0x6a, 0x63, 0x73, 0x4f, 0xef, + 0x5d, 0x0f, 0x95, 0x4c, 0x72, 0xfb, 0x01, 0x00, 0xc0, 0x71, 0xf0, 0x18, + 0x02, 0x00, 0x00, 0x7a, 0xab, 0x52, 0x6b, 0x6a, 0x6f, 0xbf, 0xc2, 0x40, + 0x00, 0xc6, 0x68, 0x6b, 0x7b, 0x5f, 0x41, 0x10, 0x1c, 0xf9, 0x43, 0x97, + 0xab, 0x75, 0x55, 0xaa, 0x0d, 0x1d, 0x55, 0x65, 0xa1, 0x31, 0x46, 0x37, + 0xae, 0x5e, 0xd0, 0x1f, 0x7e, 0xf7, 0xb1, 0x46, 0x87, 0x8b, 0x87, 0x1d, + 0xae, 0xdf, 0x84, 0x73, 0x4e, 0xe9, 0x74, 0x4a, 0x9f, 0xdc, 0xba, 0xa1, + 0xdf, 0xfd, 0xfa, 0x03, 0x25, 0x93, 0xfe, 0xab, 0x7e, 0xa1, 0x76, 0xf6, + 0xca, 0xea, 0x65, 0xa9, 0xaa, 0x31, 0x52, 0xab, 0xd5, 0x56, 0xb5, 0xd6, + 0x7c, 0xab, 0x42, 0xca, 0xbd, 0xfd, 0xaa, 0x9a, 0x2d, 0x9a, 0xeb, 0x00, + 0x00, 0x70, 0x5c, 0x08, 0x00, 0x01, 0x00, 0xe8, 0x21, 0xe7, 0x9c, 0xb6, + 0x77, 0x4a, 0x6a, 0x34, 0x5b, 0x0c, 0xc6, 0x89, 0x65, 0xd8, 0xff, 0xaf, + 0x57, 0x17, 0xa2, 0xc6, 0x68, 0x6f, 0xbf, 0xa2, 0x85, 0x95, 0xcd, 0x83, + 0xbd, 0x00, 0x8f, 0xee, 0x38, 0x9b, 0x7d, 0xba, 0xa2, 0x66, 0xb3, 0x7d, + 0x64, 0xab, 0x7f, 0x27, 0x27, 0x46, 0xf4, 0xdb, 0x4f, 0xdf, 0x57, 0x21, + 0x9f, 0x3b, 0xba, 0x99, 0x66, 0x8c, 0x6e, 0xdd, 0xbc, 0xaa, 0x5f, 0x7f, + 0x72, 0xf3, 0x95, 0x5e, 0xa7, 0x31, 0x9e, 0xb6, 0xb6, 0xf7, 0x0f, 0x2a, + 0x06, 0x7b, 0x33, 0x4b, 0x8d, 0x31, 0xda, 0xd9, 0x2b, 0xab, 0xd1, 0x6c, + 0xbd, 0xd5, 0x73, 0xd6, 0xeb, 0x4d, 0x95, 0x2b, 0x75, 0x26, 0x3d, 0x00, + 0x00, 0xc7, 0x75, 0xdd, 0xc5, 0x10, 0x00, 0x00, 0xd0, 0x3b, 0x71, 0x6c, + 0xb5, 0xbe, 0xb9, 0xab, 0x30, 0x8c, 0x19, 0x8c, 0x13, 0xc8, 0x18, 0xa3, + 0x84, 0xcf, 0xe5, 0x51, 0x2f, 0x59, 0x6b, 0x75, 0xf7, 0xc1, 0xbc, 0xaa, + 0xb5, 0xe6, 0x91, 0x84, 0x80, 0x9e, 0xe7, 0x69, 0x63, 0x6b, 0x4f, 0x4f, + 0x9e, 0xae, 0x1e, 0xc9, 0xe3, 0x39, 0xe7, 0x94, 0xcf, 0x65, 0xf4, 0xbb, + 0xcf, 0x3e, 0xd0, 0xf0, 0xd0, 0xc0, 0x91, 0xef, 0x6b, 0x69, 0x9d, 0xd3, + 0xc7, 0xef, 0x5f, 0xd3, 0xcd, 0x1b, 0x33, 0x2f, 0x5d, 0xda, 0xeb, 0x79, + 0x46, 0xa5, 0x72, 0x45, 0xeb, 0x9b, 0xbb, 0x47, 0x1a, 0x98, 0xfe, 0xf2, + 0xf7, 0xc7, 0xe9, 0xe9, 0xd2, 0xba, 0xe2, 0xf8, 0xed, 0xce, 0x59, 0xed, + 0x20, 0xd0, 0x4e, 0xa9, 0x4c, 0x17, 0x60, 0x00, 0x00, 0x8e, 0x09, 0x57, + 0xb8, 0x00, 0x00, 0xf4, 0x50, 0xab, 0x1d, 0x68, 0x73, 0xa7, 0x44, 0x8b, + 0xd9, 0x93, 0x7c, 0x71, 0xe4, 0xf9, 0x0c, 0x42, 0x4f, 0xc7, 0xbb, 0x53, + 0xd5, 0xf6, 0xd5, 0x77, 0x8f, 0x14, 0x04, 0xd1, 0x5b, 0x55, 0x99, 0x79, + 0x9e, 0xa7, 0x4a, 0xb5, 0xae, 0xbf, 0x7e, 0x75, 0x5f, 0xf5, 0x46, 0xeb, + 0xc8, 0xaa, 0xe4, 0x3e, 0xb9, 0x75, 0x43, 0xe7, 0xa6, 0xc6, 0x14, 0xc7, + 0xb6, 0x2b, 0x63, 0xe0, 0x27, 0x7c, 0x7d, 0xf4, 0xfe, 0x35, 0x0d, 0x0f, + 0x15, 0x5e, 0x1a, 0x90, 0xc5, 0xb1, 0xd5, 0xec, 0x93, 0xe5, 0xc3, 0x66, + 0x20, 0xdd, 0xfd, 0xde, 0x18, 0xed, 0xec, 0x96, 0xb5, 0xb8, 0xbc, 0x29, + 0xcf, 0x7b, 0xbb, 0xdb, 0x86, 0x38, 0xb6, 0xda, 0xde, 0xd9, 0xef, 0xda, + 0x18, 0x02, 0x00, 0x80, 0x97, 0xfc, 0x5c, 0x67, 0x08, 0x00, 0x00, 0xe8, + 0x0d, 0x63, 0x8c, 0x76, 0x4b, 0x65, 0x95, 0xcb, 0x35, 0x79, 0x86, 0x04, + 0x10, 0xf8, 0xfe, 0xe0, 0x90, 0x1e, 0xce, 0x2d, 0xe9, 0xf6, 0xbd, 0x39, + 0x85, 0x51, 0xf4, 0xc6, 0xc7, 0x57, 0xad, 0xde, 0xd0, 0x5f, 0xfe, 0x76, + 0x57, 0x6b, 0x9b, 0xbb, 0x6f, 0x1d, 0x58, 0x49, 0x9d, 0x06, 0x1f, 0xe7, + 0xa6, 0xc6, 0xf4, 0xde, 0x8d, 0x4b, 0xea, 0xf6, 0xbe, 0x7b, 0x23, 0x43, + 0x03, 0xba, 0x71, 0xe5, 0x82, 0x7c, 0xff, 0x97, 0x03, 0x68, 0xcf, 0xf3, + 0xb4, 0xb0, 0xb2, 0xa5, 0x95, 0xb5, 0x6d, 0x19, 0xd3, 0xdd, 0x4b, 0xf9, + 0x38, 0x76, 0x7a, 0x30, 0xbb, 0xa8, 0x66, 0xab, 0xfd, 0xf6, 0x61, 0xaa, + 0x31, 0xda, 0x2b, 0x55, 0xd4, 0x0e, 0x43, 0xe6, 0x3b, 0x00, 0x00, 0xc7, + 0x80, 0x00, 0x10, 0x00, 0x80, 0x1e, 0x5a, 0x59, 0xdb, 0x51, 0xf0, 0x86, + 0x01, 0x07, 0x70, 0x96, 0x05, 0x61, 0xa4, 0xaf, 0x6e, 0x3f, 0xd6, 0xd7, + 0xb7, 0x1f, 0xab, 0xdd, 0x7e, 0xbd, 0xa6, 0x20, 0xce, 0x39, 0x95, 0xcb, + 0x35, 0xfd, 0xe9, 0xf3, 0x3b, 0x9a, 0x7d, 0xba, 0x7a, 0x64, 0xcb, 0x4c, + 0x7d, 0xcf, 0xd3, 0xf5, 0x2b, 0x17, 0x94, 0x4a, 0x25, 0xbb, 0xde, 0x79, + 0xd7, 0xf7, 0x7d, 0x5d, 0xbd, 0x7c, 0x4e, 0xb9, 0x5c, 0xfa, 0xa5, 0x9f, + 0x1b, 0x86, 0xa1, 0xee, 0x3c, 0x78, 0xa2, 0x7a, 0xa3, 0xd9, 0xb5, 0xd7, + 0x63, 0x8c, 0xd1, 0xca, 0xda, 0x96, 0x1e, 0xcf, 0x2d, 0x1f, 0x49, 0x25, + 0xa5, 0x91, 0x51, 0xa5, 0x5a, 0x57, 0xa5, 0x5a, 0xef, 0xd9, 0xfe, 0x85, + 0x00, 0x00, 0xe0, 0x7b, 0x04, 0x80, 0x00, 0x00, 0xf4, 0x80, 0x31, 0x52, + 0x18, 0x46, 0x5a, 0xdb, 0xdc, 0xa1, 0xfa, 0x0f, 0xf8, 0xa9, 0x63, 0x44, + 0x52, 0x3b, 0x08, 0xf5, 0xe5, 0xb7, 0x8f, 0xf4, 0xdf, 0xff, 0xfd, 0x2b, + 0x3d, 0x5d, 0x5e, 0x57, 0xab, 0xd5, 0x96, 0x51, 0x67, 0x29, 0xaa, 0x31, + 0x3f, 0xfc, 0xf0, 0x8c, 0x91, 0x73, 0x4e, 0xb5, 0x7a, 0x53, 0x0f, 0x66, + 0x17, 0xf5, 0xcf, 0xff, 0xfa, 0x85, 0x1e, 0xcd, 0x2f, 0x1f, 0x59, 0xf8, + 0xe7, 0x9c, 0xd3, 0x50, 0xb1, 0xa0, 0x4b, 0xe7, 0xc7, 0x7b, 0x12, 0x58, + 0x39, 0xe7, 0x34, 0x32, 0x54, 0xd4, 0xd4, 0xf8, 0xc8, 0x2b, 0xd5, 0x1a, + 0x2e, 0xaf, 0x6e, 0xeb, 0xf1, 0xdc, 0xb2, 0xac, 0xb5, 0x5d, 0xf9, 0x5e, + 0x54, 0xaa, 0x75, 0x7d, 0x73, 0x77, 0x56, 0xad, 0x23, 0xea, 0xd0, 0x6c, + 0x8c, 0xd4, 0x0a, 0x42, 0x6d, 0xef, 0xec, 0xab, 0x97, 0x5d, 0x8c, 0x01, + 0x00, 0x40, 0x47, 0x82, 0x21, 0x00, 0x00, 0xa0, 0xfb, 0x8c, 0x3a, 0xdd, + 0x4e, 0xf7, 0x4a, 0x95, 0xae, 0x2f, 0xdb, 0x03, 0x4e, 0xed, 0x71, 0x72, + 0x10, 0xea, 0xcd, 0x2f, 0xae, 0x69, 0x63, 0x6b, 0x4f, 0xe3, 0x63, 0x43, + 0x3a, 0x3f, 0x35, 0xa6, 0xd1, 0x91, 0x41, 0x15, 0x0b, 0x39, 0xa5, 0x0f, + 0x2a, 0xf1, 0x9a, 0xed, 0xb6, 0xca, 0x95, 0xba, 0xb6, 0x76, 0x4a, 0x5a, + 0xdb, 0xd8, 0xd1, 0x6e, 0xa9, 0xa2, 0x20, 0x08, 0x8f, 0x64, 0xd9, 0xef, + 0xf3, 0x46, 0x86, 0x8b, 0xca, 0x65, 0x33, 0x3d, 0x7b, 0xff, 0xc9, 0x84, + 0xaf, 0x8b, 0xe7, 0x26, 0x34, 0x37, 0xbf, 0xfa, 0xd2, 0x7d, 0x42, 0xc3, + 0x28, 0xd2, 0xd7, 0x77, 0x66, 0x55, 0xc8, 0x67, 0x75, 0xe3, 0xda, 0xc5, + 0x23, 0x0b, 0x02, 0x8d, 0x31, 0x6a, 0xb7, 0x03, 0x7d, 0x7d, 0xfb, 0xb1, + 0x56, 0xd6, 0xb6, 0x8e, 0xf6, 0x0d, 0x3a, 0x69, 0x73, 0xbb, 0xc4, 0x44, + 0x07, 0x00, 0xe0, 0x18, 0x10, 0x00, 0x02, 0x00, 0xd0, 0x03, 0xc6, 0x18, + 0xad, 0x6d, 0xec, 0x74, 0x25, 0xa4, 0xc0, 0x51, 0xa3, 0x3a, 0xe9, 0xb8, + 0x79, 0x9e, 0xa7, 0x56, 0x3b, 0xd0, 0xf2, 0xea, 0x96, 0x56, 0xd7, 0xb7, + 0xe5, 0xfb, 0xbe, 0x12, 0xbe, 0xaf, 0x44, 0xc2, 0x97, 0x73, 0x4e, 0x51, + 0x14, 0x2b, 0x8a, 0xad, 0xe2, 0x38, 0x3e, 0xac, 0xf8, 0x3b, 0xea, 0xe3, + 0xca, 0xf3, 0x3c, 0x8d, 0x0c, 0x17, 0x95, 0x48, 0x24, 0x7a, 0x3a, 0xf3, + 0x26, 0xc6, 0x86, 0x94, 0x4c, 0xfa, 0x0a, 0xa3, 0xf8, 0xa5, 0xe7, 0x94, + 0x7a, 0xa3, 0xa9, 0x3f, 0x7d, 0x71, 0x47, 0x92, 0x74, 0xe3, 0xda, 0x05, + 0x59, 0xfb, 0x76, 0x73, 0xd7, 0x18, 0xa3, 0x20, 0x08, 0xf5, 0xf9, 0xd7, + 0xf7, 0x75, 0xe7, 0xe1, 0xd3, 0x23, 0xef, 0x55, 0x64, 0x8c, 0xd1, 0xf6, + 0xee, 0xbe, 0xda, 0xed, 0x50, 0xe9, 0x74, 0x8a, 0x8e, 0xc0, 0x00, 0x00, + 0xf4, 0x10, 0x01, 0x20, 0x00, 0x00, 0x3d, 0x10, 0xd9, 0x58, 0xeb, 0x9b, + 0x7b, 0xa7, 0x7f, 0xef, 0xab, 0x33, 0xbe, 0x7a, 0xd9, 0x18, 0xc9, 0xf7, + 0xbd, 0xc3, 0x4a, 0x34, 0x1c, 0x3f, 0x6b, 0x9d, 0xac, 0x8d, 0x14, 0x86, + 0xbd, 0xdd, 0x3b, 0xd3, 0xf7, 0x3d, 0x15, 0x07, 0x72, 0xf2, 0xbc, 0xde, + 0x4d, 0x7a, 0xe7, 0x9c, 0x06, 0x0a, 0x39, 0x65, 0x32, 0x69, 0x05, 0xaf, + 0xb0, 0x57, 0x9e, 0x31, 0x46, 0xd5, 0x5a, 0x43, 0xff, 0xfa, 0xe7, 0x6f, + 0xd4, 0x68, 0xb6, 0x75, 0xf3, 0xc6, 0x25, 0x25, 0x93, 0x6f, 0x76, 0x79, + 0xef, 0xe4, 0xb4, 0x5f, 0xaa, 0xea, 0x6f, 0xdf, 0x3d, 0xd2, 0xc3, 0xd9, + 0xa5, 0xae, 0xbc, 0x6f, 0x63, 0xa4, 0x5a, 0xad, 0xa9, 0x6a, 0xbd, 0xa9, + 0x4c, 0x26, 0x25, 0x0e, 0x31, 0x00, 0x00, 0x7a, 0x87, 0x00, 0x10, 0x00, + 0x80, 0x2e, 0x33, 0xc6, 0xa8, 0x5e, 0x6f, 0x6a, 0xb7, 0x54, 0x39, 0xfd, + 0x01, 0xa0, 0x73, 0x07, 0x51, 0x81, 0x24, 0xa7, 0x17, 0x42, 0x82, 0xce, + 0xdb, 0x7b, 0xfe, 0xdf, 0xdc, 0xf7, 0x5f, 0x26, 0xf5, 0x24, 0x54, 0x33, + 0xc6, 0xe8, 0xd9, 0xcb, 0x70, 0xd6, 0xc9, 0x3a, 0xf7, 0xa3, 0xa0, 0xc1, + 0xfd, 0x6c, 0xf0, 0xe0, 0x9c, 0x93, 0xef, 0xfb, 0x32, 0x46, 0x84, 0x13, + 0x7d, 0xce, 0xf3, 0x3c, 0x65, 0xd2, 0xa9, 0x1e, 0x87, 0xc1, 0x4e, 0xc9, + 0x44, 0x42, 0x99, 0x74, 0x4a, 0xe5, 0x4a, 0x5d, 0xaf, 0x72, 0xba, 0x30, + 0xc6, 0xa8, 0xd5, 0x0e, 0xf4, 0xe7, 0x2f, 0xee, 0x68, 0x73, 0x67, 0x4f, + 0xb7, 0x6e, 0x5e, 0xd1, 0xd8, 0xc8, 0x90, 0x52, 0xa9, 0x84, 0x9c, 0xfb, + 0xf9, 0x63, 0xae, 0xb3, 0x97, 0x62, 0xe7, 0xff, 0xaf, 0xd6, 0x9a, 0x5a, + 0x59, 0xdb, 0xd2, 0xed, 0xfb, 0xf3, 0xda, 0xdc, 0x2e, 0x75, 0x2d, 0xf4, + 0x34, 0xc6, 0x28, 0x08, 0x43, 0xed, 0xee, 0x95, 0x35, 0x31, 0x36, 0x24, + 0xaa, 0x6d, 0x01, 0x00, 0xe8, 0x1d, 0x02, 0x40, 0x00, 0x00, 0xba, 0xcc, + 0x18, 0xa3, 0xbd, 0xfd, 0xaa, 0x1a, 0xcd, 0xd6, 0xa9, 0x7e, 0x1f, 0xce, + 0x39, 0x3d, 0x9c, 0x5b, 0xd6, 0xd6, 0xce, 0xfe, 0xe1, 0x52, 0xc3, 0x54, + 0x2a, 0xf9, 0x83, 0xb8, 0x2f, 0x91, 0x48, 0xc8, 0xf7, 0xcc, 0xe1, 0x6d, + 0xbd, 0xef, 0x79, 0x4a, 0xa7, 0x93, 0xca, 0xe7, 0xb2, 0x2a, 0x0e, 0xe4, + 0x95, 0xcf, 0x65, 0x0e, 0x1f, 0xeb, 0xa8, 0x79, 0xc6, 0x48, 0x46, 0xaa, + 0xd7, 0x9b, 0x2a, 0x95, 0x6b, 0xaa, 0x54, 0xeb, 0xaa, 0xd5, 0x9b, 0x6a, + 0x05, 0xa1, 0xa2, 0x30, 0x3e, 0x0c, 0x1b, 0xa2, 0x38, 0xfe, 0xd9, 0xa5, + 0x92, 0x9e, 0x31, 0xda, 0xdd, 0xaf, 0xbe, 0xf5, 0x52, 0x4a, 0x9c, 0x7e, + 0x9e, 0x31, 0x4a, 0x24, 0xfc, 0xe3, 0x38, 0x61, 0xc8, 0x4f, 0x78, 0xaf, + 0x7d, 0x8e, 0x89, 0x62, 0xab, 0x87, 0xb3, 0xcb, 0x5a, 0x5d, 0xdb, 0xd1, + 0x85, 0x73, 0xe3, 0x9a, 0xb9, 0x38, 0xa5, 0xc9, 0xf1, 0x61, 0x15, 0xf2, + 0xd9, 0xc3, 0x50, 0x5b, 0xee, 0x20, 0xbe, 0x77, 0x52, 0x10, 0x86, 0x2a, + 0x95, 0x6b, 0x5a, 0x5b, 0xdf, 0xd6, 0xfc, 0xd2, 0x46, 0x67, 0x69, 0x6e, + 0x10, 0x76, 0xbd, 0xe2, 0xd1, 0x39, 0xa7, 0xed, 0xdd, 0x7d, 0xdd, 0x74, + 0x33, 0x4c, 0x32, 0x00, 0x00, 0x7a, 0x88, 0x00, 0x10, 0x00, 0x80, 0x2e, + 0x73, 0xce, 0x6a, 0x7b, 0x67, 0x5f, 0x71, 0x6c, 0x4f, 0xfd, 0x7b, 0x59, + 0x58, 0xda, 0xd0, 0xc2, 0xd2, 0xc6, 0xe1, 0xdf, 0x5f, 0xac, 0x50, 0x32, + 0x3f, 0x5c, 0x25, 0x6c, 0x3a, 0xe1, 0x84, 0xe7, 0x79, 0xca, 0xe7, 0x32, + 0xba, 0x7c, 0x71, 0x5a, 0xb7, 0xde, 0xbb, 0xa2, 0xc1, 0x81, 0xfc, 0x91, + 0x86, 0x80, 0x9e, 0x67, 0xb4, 0x57, 0xaa, 0xe8, 0xfe, 0xe3, 0x45, 0x2d, + 0xae, 0x6c, 0xaa, 0x56, 0x6f, 0x1e, 0xee, 0x0f, 0xf7, 0xe3, 0xa7, 0xf9, + 0xa5, 0xe7, 0x3d, 0xc8, 0x48, 0x00, 0x39, 0xb9, 0x63, 0x5b, 0x06, 0xfe, + 0x26, 0x4f, 0xfb, 0xec, 0x58, 0xac, 0x35, 0x9a, 0x7a, 0xf4, 0x64, 0x59, + 0x73, 0x0b, 0xab, 0xca, 0x65, 0xd3, 0x1a, 0x1e, 0x2a, 0xaa, 0x58, 0xc8, + 0x29, 0x9f, 0xcb, 0xca, 0xf7, 0x3a, 0x15, 0x78, 0x95, 0x5a, 0x53, 0x95, + 0x4a, 0x4d, 0xfb, 0x95, 0xba, 0xda, 0x41, 0x78, 0xd8, 0x40, 0xa4, 0x17, + 0x1d, 0xca, 0x8d, 0x31, 0xda, 0x2b, 0x55, 0x15, 0xc7, 0xf1, 0xe9, 0xaf, + 0x88, 0x06, 0x00, 0xe0, 0x14, 0x21, 0x00, 0x04, 0x00, 0xa0, 0xcb, 0xa2, + 0x28, 0xd6, 0xde, 0x7e, 0x45, 0xce, 0x9d, 0xfe, 0x00, 0xf0, 0xc7, 0x81, + 0xc8, 0x8b, 0x41, 0xc5, 0xcf, 0x25, 0x17, 0xb1, 0xda, 0x41, 0xa8, 0xbd, + 0x52, 0x45, 0xdb, 0x3b, 0x25, 0xfd, 0xaf, 0xff, 0xf8, 0x2b, 0x0d, 0x14, + 0xf2, 0x47, 0xf2, 0x9a, 0x8c, 0x31, 0x7a, 0xf2, 0x74, 0x4d, 0x9f, 0x7f, + 0x75, 0x4f, 0x5b, 0xbb, 0xfb, 0xf2, 0x3d, 0x5f, 0x6f, 0x9a, 0x2b, 0x10, + 0xfe, 0xe1, 0x19, 0x6b, 0x9d, 0xda, 0xed, 0xa0, 0xc7, 0xb3, 0xc2, 0x28, + 0xb6, 0x91, 0xda, 0x41, 0xa0, 0xb7, 0xc9, 0xc6, 0x9e, 0x35, 0x4a, 0xa9, + 0x54, 0x1b, 0x2a, 0x57, 0xea, 0x07, 0xc7, 0xa9, 0x7b, 0xfe, 0xa0, 0x91, + 0x39, 0x38, 0x76, 0x7a, 0xad, 0xb3, 0x6f, 0x61, 0x5d, 0xcd, 0x56, 0x5b, + 0xf9, 0x5c, 0x96, 0xbd, 0x36, 0x01, 0x00, 0xe8, 0x11, 0xda, 0x10, 0x02, + 0x00, 0xd0, 0x65, 0xcd, 0x56, 0xa0, 0xfd, 0x72, 0xad, 0xef, 0xf7, 0x94, + 0x7b, 0x16, 0x38, 0xac, 0xac, 0x6f, 0x6b, 0x76, 0x7e, 0xf5, 0x68, 0x1e, + 0xd3, 0x48, 0xdb, 0xbb, 0xfb, 0xfa, 0xcb, 0x97, 0xf7, 0xb4, 0xb3, 0x57, + 0x51, 0xc2, 0xf7, 0x45, 0x51, 0x11, 0x8e, 0x82, 0x8d, 0xad, 0xea, 0x8d, + 0x96, 0x7a, 0x99, 0xdb, 0x1b, 0x49, 0xcd, 0x66, 0x5b, 0xed, 0x56, 0x78, + 0x74, 0x8f, 0x69, 0x8c, 0x3c, 0xaf, 0x53, 0x85, 0x7b, 0xf8, 0x61, 0xcc, + 0xb1, 0x56, 0xdf, 0xb5, 0xda, 0x81, 0xea, 0x8d, 0x96, 0x38, 0x54, 0x01, + 0x00, 0xe8, 0x1d, 0x02, 0x40, 0x00, 0x00, 0xba, 0xac, 0xd1, 0x68, 0xa9, + 0xde, 0x68, 0x31, 0x10, 0x07, 0x62, 0x6b, 0xb5, 0xb0, 0xbc, 0xa1, 0x30, + 0x7c, 0xfb, 0x90, 0xc3, 0x5a, 0xa7, 0xa5, 0x95, 0x4d, 0x95, 0xab, 0xb5, + 0x9e, 0x76, 0x6b, 0x45, 0x7f, 0xcc, 0xd3, 0x52, 0xb9, 0xa6, 0xc8, 0xc6, + 0x3d, 0x7b, 0xce, 0xce, 0xf2, 0xd8, 0x8a, 0x5a, 0xed, 0xe0, 0x4c, 0x2f, + 0x8f, 0x0d, 0xa3, 0x58, 0x95, 0x6a, 0x9d, 0x49, 0x06, 0x00, 0x40, 0x0f, + 0x11, 0x00, 0x02, 0x00, 0xd0, 0x65, 0xe5, 0x6a, 0x5d, 0xad, 0x76, 0xc0, + 0x40, 0x3c, 0xbb, 0xf8, 0x30, 0x46, 0xfb, 0xe5, 0x9a, 0x9a, 0xad, 0xb7, + 0x0f, 0x39, 0xc2, 0x30, 0xd2, 0xf6, 0x6e, 0x59, 0x71, 0xcc, 0x32, 0x42, + 0x7c, 0xaf, 0xb3, 0xf7, 0xa3, 0xfb, 0xc9, 0x3d, 0x20, 0x5f, 0xe7, 0x31, + 0x76, 0xf6, 0xca, 0x6a, 0xb7, 0x7a, 0x77, 0xec, 0x3a, 0x39, 0xad, 0x6d, + 0xed, 0x9e, 0xf9, 0x26, 0x34, 0xd6, 0x3a, 0x55, 0xaa, 0x75, 0x96, 0xdc, + 0x03, 0x00, 0xd0, 0x43, 0xec, 0x01, 0x08, 0x00, 0x40, 0x97, 0x6f, 0x74, + 0x4b, 0xfb, 0x55, 0x85, 0x61, 0xc4, 0x86, 0xf7, 0x87, 0x8c, 0x82, 0x20, + 0x54, 0xa3, 0xd9, 0xd6, 0x50, 0xb1, 0xf0, 0x56, 0x21, 0x40, 0x14, 0xc7, + 0xaa, 0x37, 0x9a, 0xea, 0xec, 0x6f, 0xc6, 0xf8, 0xf6, 0x33, 0xcf, 0xf3, + 0x94, 0x48, 0x78, 0xca, 0xa4, 0x53, 0xca, 0xa6, 0xd3, 0xf2, 0x13, 0xbe, + 0x9c, 0x75, 0x6a, 0x85, 0xa1, 0x5a, 0xcd, 0x96, 0xc2, 0x28, 0x52, 0x1c, + 0xbf, 0x7a, 0x63, 0x0f, 0x63, 0x8c, 0xca, 0xe5, 0x9a, 0x76, 0xcb, 0x55, + 0xe5, 0xf3, 0xd9, 0xee, 0x1f, 0x15, 0xc6, 0xa8, 0x5a, 0x6d, 0x68, 0x79, + 0x75, 0xeb, 0xcc, 0x2f, 0x63, 0x77, 0xce, 0xa9, 0x52, 0x6d, 0x28, 0x8e, + 0x63, 0x79, 0x1e, 0xf5, 0x08, 0x00, 0x00, 0xf4, 0x02, 0x01, 0x20, 0x00, + 0x00, 0x5d, 0x64, 0xad, 0x55, 0xa9, 0x5c, 0x95, 0x73, 0x8e, 0x00, 0xf0, + 0x80, 0x31, 0x9d, 0xe5, 0x95, 0x41, 0x10, 0x74, 0xfe, 0xf2, 0x16, 0x9b, + 0x23, 0xc6, 0xb1, 0x53, 0x10, 0x44, 0x0c, 0x6a, 0x1f, 0x7a, 0x16, 0xe4, + 0xe5, 0x73, 0x19, 0x4d, 0x8e, 0x0f, 0xeb, 0xdc, 0xf4, 0xb8, 0x26, 0x46, + 0x87, 0x54, 0x1c, 0xc8, 0x2b, 0x9d, 0x4a, 0xca, 0xf3, 0x3c, 0x39, 0x75, + 0x9a, 0x61, 0xd4, 0xeb, 0x4d, 0xed, 0xee, 0x57, 0xb4, 0xbe, 0xb1, 0xab, + 0xb5, 0x8d, 0x1d, 0xed, 0x57, 0xea, 0x8a, 0xa2, 0xf8, 0xa5, 0xcb, 0xc6, + 0x9b, 0xad, 0xb6, 0x66, 0xe7, 0x96, 0x75, 0x7e, 0x6a, 0x4c, 0x7e, 0x97, + 0x83, 0x2a, 0xe7, 0x9c, 0x56, 0x37, 0x76, 0x54, 0xae, 0xd4, 0xfa, 0xe2, + 0x7b, 0x57, 0x6f, 0x34, 0x15, 0x45, 0xb1, 0x52, 0x29, 0x02, 0x40, 0x00, + 0x00, 0x7a, 0x81, 0x00, 0x10, 0x00, 0x80, 0x2e, 0x0a, 0xa3, 0x48, 0xfb, + 0x95, 0x9a, 0xa8, 0x4e, 0xfb, 0xa1, 0xd8, 0x5a, 0x85, 0xd1, 0xdb, 0xef, + 0xad, 0x16, 0xc7, 0xb1, 0xa2, 0x38, 0x66, 0x40, 0xfb, 0x8c, 0x75, 0x4e, + 0xa9, 0x64, 0x42, 0xd7, 0xaf, 0x9c, 0xd7, 0xcd, 0xeb, 0x97, 0x34, 0x36, + 0x32, 0xa4, 0x4c, 0x26, 0x25, 0xa3, 0xe7, 0x7b, 0xdd, 0x76, 0xfe, 0x94, + 0x4c, 0x24, 0x94, 0xcd, 0xa4, 0x35, 0x3e, 0x3a, 0xa4, 0xeb, 0x97, 0xcf, + 0xab, 0x52, 0xad, 0xeb, 0xe9, 0xd2, 0x86, 0x1e, 0xce, 0x2e, 0x6a, 0x67, + 0xaf, 0xfc, 0x8b, 0x15, 0x68, 0xc6, 0x18, 0xcd, 0x2f, 0xad, 0xeb, 0xe6, + 0xe6, 0x25, 0x5d, 0x3c, 0x3f, 0x29, 0x6b, 0xbb, 0xd7, 0x11, 0xa4, 0xd5, + 0x0a, 0xf4, 0xe8, 0xc9, 0xb2, 0xc2, 0xb0, 0x3f, 0xe6, 0x73, 0xa3, 0x19, + 0x28, 0x08, 0x23, 0xa5, 0x52, 0x49, 0x26, 0x34, 0x00, 0x00, 0x3d, 0x40, + 0x00, 0x08, 0x00, 0x40, 0x97, 0x18, 0x23, 0x35, 0x1a, 0x6d, 0x55, 0xab, + 0x0d, 0x3a, 0xd3, 0xfe, 0x88, 0xb3, 0x4e, 0x51, 0x1c, 0xbf, 0x75, 0x2c, + 0xfa, 0x6c, 0x9f, 0x37, 0xf4, 0x0f, 0x6b, 0xad, 0x46, 0x86, 0x06, 0xf4, + 0xd9, 0x27, 0x37, 0x75, 0xed, 0xf2, 0x79, 0x25, 0x12, 0xfe, 0xf7, 0x73, + 0xe1, 0xa7, 0x67, 0xc9, 0xe1, 0x7f, 0x3d, 0xcf, 0xd3, 0xd0, 0xe0, 0x80, + 0x3e, 0xbe, 0x55, 0xd0, 0xe5, 0x8b, 0x93, 0xfa, 0xe2, 0x9b, 0x87, 0x7a, + 0xb2, 0xb0, 0xf6, 0xb3, 0x73, 0xc8, 0x18, 0xa3, 0x56, 0x2b, 0xd0, 0x57, + 0xb7, 0x1f, 0x69, 0x74, 0x78, 0x50, 0xd9, 0x6c, 0xba, 0x2b, 0xf3, 0xcd, + 0x39, 0xa7, 0xd9, 0xa7, 0x2b, 0x5a, 0x5d, 0xdf, 0xee, 0x9b, 0xef, 0x63, + 0xab, 0x1d, 0x28, 0x08, 0x43, 0x49, 0x59, 0x26, 0x35, 0x00, 0x00, 0x3d, + 0x40, 0xcd, 0x3d, 0x00, 0x00, 0x5d, 0x63, 0xb4, 0x5f, 0xa9, 0xaa, 0xd5, + 0x0e, 0x59, 0xfe, 0x0b, 0x1c, 0x01, 0xe7, 0x9c, 0xce, 0x4f, 0x8d, 0xe9, + 0xbf, 0xfc, 0xe1, 0x33, 0xbd, 0xf7, 0xce, 0xe5, 0xc3, 0xf0, 0xef, 0xb5, + 0x2f, 0x80, 0x8d, 0xd1, 0xc8, 0xf0, 0xa0, 0xfe, 0xf0, 0xbb, 0x4f, 0xf4, + 0xe1, 0xfb, 0x57, 0x7f, 0xb1, 0x0a, 0xd0, 0xf3, 0x8c, 0x96, 0x56, 0xb6, + 0xf4, 0xdd, 0xbd, 0x39, 0xc5, 0xd1, 0xd1, 0x57, 0xe7, 0x19, 0x63, 0xb4, + 0xb5, 0x53, 0xd2, 0x77, 0xf7, 0xe6, 0xfa, 0xa6, 0xfa, 0x4f, 0xea, 0x34, + 0xf0, 0x69, 0xb5, 0x42, 0x26, 0x35, 0x00, 0x00, 0x3d, 0x42, 0x05, 0x20, + 0x00, 0x00, 0x5d, 0x62, 0x8c, 0xb4, 0x57, 0xaa, 0xc8, 0xda, 0x58, 0xbe, + 0xef, 0x33, 0x20, 0xe8, 0xaa, 0x67, 0xd5, 0x90, 0xc6, 0x18, 0x25, 0x12, + 0xbe, 0x92, 0x89, 0x84, 0x12, 0x09, 0x5f, 0xbe, 0xef, 0xcb, 0xf3, 0x8c, + 0x12, 0xbe, 0xf7, 0x93, 0x5f, 0x13, 0xc7, 0x56, 0x4e, 0x92, 0x8d, 0xad, + 0x62, 0x6b, 0x65, 0xad, 0x53, 0x6c, 0xad, 0xe2, 0x38, 0x56, 0x1c, 0xdb, + 0x83, 0x8e, 0xb4, 0x9d, 0xc7, 0x3d, 0xee, 0x20, 0xfb, 0xdc, 0xd4, 0x98, + 0xfe, 0xe9, 0xb7, 0x1f, 0x69, 0x7c, 0x6c, 0xf8, 0xad, 0x97, 0xe3, 0x3a, + 0xe7, 0x94, 0xcb, 0xa4, 0xf5, 0x9b, 0xbf, 0x7b, 0x4f, 0x09, 0xcf, 0xd3, + 0xb7, 0xf7, 0xe6, 0x14, 0xc7, 0xf6, 0x27, 0xdf, 0xa3, 0x31, 0x46, 0xdf, + 0xdd, 0x9f, 0x53, 0x21, 0x9f, 0xd5, 0x7b, 0xef, 0x5c, 0x7e, 0xe9, 0xde, + 0x81, 0xaf, 0x7e, 0x8e, 0x30, 0xda, 0x2d, 0x95, 0xf5, 0xc7, 0xcf, 0x6f, + 0x6b, 0xb7, 0x54, 0x51, 0xa2, 0x8f, 0xce, 0x13, 0x61, 0x18, 0xa9, 0xd5, + 0x6e, 0x73, 0xe0, 0x02, 0x00, 0xd0, 0x23, 0x04, 0x80, 0x00, 0x00, 0x74, + 0x89, 0x8d, 0xad, 0x76, 0xf7, 0x2a, 0x62, 0xff, 0xbf, 0xee, 0xea, 0xe7, + 0xd1, 0x75, 0xce, 0xc9, 0x5a, 0xa7, 0x44, 0xc2, 0xd7, 0xf0, 0x60, 0x41, + 0xa3, 0x23, 0x83, 0x1a, 0x1e, 0x1a, 0xd0, 0x60, 0x31, 0xaf, 0x6c, 0x26, + 0xa3, 0x4c, 0x3a, 0xa9, 0x64, 0x32, 0x21, 0xcf, 0x78, 0x3f, 0x19, 0x5a, + 0x39, 0x27, 0x59, 0x67, 0x3b, 0x4b, 0xb2, 0xa3, 0x58, 0xb1, 0xed, 0x84, + 0x7e, 0x61, 0x18, 0x2b, 0x08, 0x3b, 0x9d, 0x9a, 0xab, 0xb5, 0xba, 0xf6, + 0xcb, 0x35, 0x95, 0xca, 0x35, 0xd5, 0xea, 0x0d, 0x45, 0x91, 0x95, 0xe7, + 0xf5, 0x3e, 0x0c, 0x2c, 0x16, 0x72, 0xfa, 0xfb, 0x5f, 0xbd, 0xa7, 0xb1, + 0xd1, 0xa1, 0x23, 0x5b, 0x86, 0x6b, 0x9d, 0x53, 0x3a, 0x95, 0xd2, 0xdf, + 0x7d, 0xfc, 0xae, 0x5a, 0x41, 0xa0, 0x7b, 0x0f, 0x17, 0x7e, 0xf6, 0x73, + 0xc3, 0x30, 0xd6, 0x5f, 0xbf, 0x7e, 0xa0, 0x38, 0xb6, 0xba, 0xf5, 0xde, + 0x15, 0x25, 0x7c, 0x5f, 0xf6, 0x2d, 0x5e, 0x87, 0x31, 0xd2, 0xfa, 0xd6, + 0xae, 0xfe, 0xfc, 0xd7, 0x3b, 0xda, 0xd8, 0xda, 0xeb, 0xab, 0xf0, 0x4f, + 0xea, 0x74, 0xf0, 0x6e, 0x36, 0xdb, 0x34, 0x48, 0x02, 0x00, 0xa0, 0x47, + 0x08, 0x00, 0x01, 0x00, 0xe8, 0x02, 0x63, 0xa4, 0x30, 0xb2, 0xda, 0xaf, + 0xd4, 0xb9, 0xb9, 0xed, 0xe6, 0x85, 0x4c, 0xc2, 0x97, 0xef, 0xf7, 0xe7, + 0x8e, 0x26, 0xd6, 0x3a, 0x15, 0x07, 0x72, 0xba, 0x7c, 0x71, 0x4a, 0x33, + 0x17, 0x27, 0x35, 0x3e, 0x3a, 0xa4, 0x54, 0x2a, 0x29, 0xdf, 0xf3, 0x8f, + 0xac, 0x42, 0xad, 0x13, 0x30, 0x5a, 0xc5, 0xb1, 0x55, 0xab, 0x1d, 0x68, + 0xb7, 0x54, 0xd6, 0xca, 0xda, 0x8e, 0x16, 0x57, 0x36, 0x55, 0x2a, 0x57, + 0x64, 0xd4, 0xa3, 0x20, 0xd0, 0x49, 0xbf, 0xfa, 0xf0, 0xba, 0x2e, 0x9e, + 0x9f, 0x38, 0xf2, 0x3d, 0xf8, 0x9c, 0x73, 0x4a, 0xa7, 0x92, 0xfa, 0xf4, + 0xa3, 0x77, 0xb5, 0xb3, 0x5b, 0xd1, 0xe6, 0xf6, 0xde, 0xcf, 0xbe, 0xa7, + 0x66, 0xab, 0xad, 0xff, 0xf8, 0xdb, 0x5d, 0x55, 0xaa, 0x75, 0xfd, 0xea, + 0xa3, 0x1b, 0x1a, 0x28, 0xe4, 0xdf, 0xb8, 0x12, 0xf1, 0xd1, 0x93, 0x65, + 0x7d, 0xf9, 0xcd, 0x43, 0x95, 0xca, 0xb5, 0xbe, 0x3c, 0x47, 0x58, 0x6b, + 0x55, 0x6f, 0xb6, 0xe4, 0x9c, 0xd8, 0x23, 0x15, 0x00, 0x80, 0x5e, 0x5c, + 0x37, 0x33, 0x04, 0x00, 0x00, 0x74, 0x83, 0x51, 0xb3, 0xd5, 0x56, 0xb3, + 0xd9, 0xe2, 0xe6, 0xf6, 0xa7, 0x87, 0x47, 0x61, 0x10, 0xeb, 0xe7, 0xda, + 0x36, 0xbc, 0xc6, 0xc3, 0xf4, 0x65, 0x78, 0x32, 0x50, 0xc8, 0xe9, 0xfd, + 0x77, 0x66, 0x74, 0xe3, 0xea, 0x45, 0x0d, 0x15, 0xf3, 0x92, 0x31, 0x5d, + 0x69, 0x4e, 0x61, 0x8c, 0x91, 0xef, 0x77, 0x96, 0x11, 0xa7, 0x52, 0x49, + 0x0d, 0x16, 0x0b, 0xba, 0x3a, 0x73, 0x5e, 0xb5, 0x5a, 0x43, 0x73, 0x8b, + 0xab, 0x7a, 0xf0, 0x78, 0x49, 0x7b, 0xa5, 0x4a, 0x57, 0x1b, 0xb1, 0x58, + 0x6b, 0x75, 0xed, 0xf2, 0x39, 0xdd, 0xbc, 0x71, 0xb9, 0xeb, 0x63, 0x7a, + 0xeb, 0xe6, 0x65, 0x95, 0xca, 0x55, 0x85, 0x61, 0xf4, 0xb3, 0x9f, 0x17, + 0x5b, 0xab, 0x6f, 0xee, 0xce, 0x69, 0x63, 0xbb, 0xa4, 0x5f, 0xdd, 0xba, + 0xae, 0x0b, 0xe7, 0xc6, 0x95, 0x4a, 0x25, 0x5f, 0x3a, 0x0f, 0x3b, 0xcb, + 0xac, 0x63, 0xed, 0xed, 0x57, 0x75, 0xef, 0xd1, 0x82, 0x1e, 0xcd, 0x2d, + 0x2a, 0x0c, 0xe3, 0xbe, 0xfd, 0x05, 0x81, 0x73, 0x4e, 0x8d, 0x46, 0xeb, + 0x60, 0xee, 0x70, 0x92, 0x04, 0x00, 0xa0, 0xdb, 0x08, 0x00, 0x01, 0x00, + 0xe8, 0x02, 0x63, 0x3a, 0xd5, 0x42, 0xad, 0x20, 0xa0, 0x02, 0xf0, 0xa7, + 0xc6, 0x47, 0x46, 0x61, 0x14, 0x1d, 0xdc, 0xf8, 0xd3, 0xc5, 0xf7, 0x55, + 0x79, 0x9e, 0xa7, 0x77, 0xae, 0x5e, 0xd0, 0x47, 0x1f, 0x5c, 0xd3, 0xd4, + 0xf8, 0x88, 0x9c, 0x3a, 0x4b, 0x80, 0xd5, 0xa3, 0x4e, 0xc8, 0xcf, 0x82, + 0xbe, 0x42, 0x21, 0xa7, 0x5f, 0xdd, 0x7a, 0x47, 0x57, 0x2e, 0x9e, 0xd3, + 0xb7, 0x77, 0x67, 0xf5, 0x70, 0x6e, 0xe9, 0x17, 0x43, 0xb3, 0xb7, 0x79, + 0xbe, 0x74, 0x2a, 0xa9, 0x0f, 0xdf, 0xbf, 0xa6, 0x54, 0x2a, 0x71, 0xb0, + 0x1f, 0x61, 0xb7, 0xc6, 0xd6, 0x68, 0xe6, 0xe2, 0x94, 0x1e, 0xcc, 0x2e, + 0x69, 0x7d, 0x73, 0xf7, 0xa5, 0x9f, 0xbb, 0xbe, 0xb9, 0xa3, 0xdd, 0xbd, + 0xb2, 0xa6, 0x27, 0x47, 0x34, 0x73, 0x71, 0x4a, 0x13, 0x63, 0x43, 0x2a, + 0xe4, 0x73, 0x4a, 0xa5, 0x92, 0x07, 0xfb, 0x2d, 0x1a, 0x59, 0x6b, 0x15, + 0x46, 0x91, 0x9a, 0xad, 0x40, 0x7b, 0xa5, 0xb2, 0x56, 0xd6, 0xb6, 0xb5, + 0xb4, 0xb2, 0xa9, 0x72, 0xb5, 0x21, 0xcf, 0xf3, 0xfa, 0xfa, 0xdc, 0xe0, + 0x24, 0x35, 0x9a, 0x6d, 0x59, 0x6b, 0xfb, 0xb6, 0x8a, 0x17, 0x00, 0x80, + 0x5e, 0x22, 0x00, 0x04, 0x00, 0xa0, 0x4b, 0xea, 0x8d, 0xd6, 0xcf, 0x36, + 0x15, 0x00, 0x5e, 0x97, 0x31, 0xd2, 0xad, 0x9b, 0x57, 0xf4, 0xeb, 0x5f, + 0xdd, 0x54, 0x36, 0x93, 0x56, 0xfc, 0x96, 0x4d, 0x30, 0xde, 0xc6, 0xb3, + 0x86, 0x23, 0x43, 0xc5, 0xbc, 0x7e, 0xf7, 0xeb, 0x5b, 0x4a, 0x26, 0x7d, + 0x7d, 0xfd, 0xdd, 0xe3, 0x23, 0x5f, 0xcb, 0xe9, 0x9c, 0xd3, 0xb9, 0xa9, + 0x31, 0x4d, 0x4d, 0x8c, 0x74, 0x35, 0xfc, 0xeb, 0x3c, 0x97, 0x54, 0xc8, + 0x65, 0x75, 0x6d, 0xe6, 0xdc, 0x4b, 0x03, 0x40, 0xa9, 0x13, 0xc6, 0x86, + 0x51, 0xac, 0xc5, 0x95, 0x4d, 0xad, 0xae, 0xef, 0x28, 0x93, 0x49, 0x29, + 0x9f, 0xcb, 0x2a, 0x97, 0x4d, 0x2b, 0x99, 0x4c, 0xc8, 0x18, 0xa3, 0x38, + 0x8e, 0xd5, 0x6a, 0x05, 0xaa, 0x35, 0x5a, 0x6a, 0x36, 0x5b, 0x0a, 0x0e, + 0x42, 0x52, 0x02, 0xaf, 0xce, 0x2f, 0x01, 0x5a, 0xed, 0xb6, 0x62, 0x6b, + 0x95, 0xe4, 0xf0, 0x06, 0x00, 0xa0, 0xeb, 0x08, 0x00, 0x01, 0x00, 0xe8, + 0xca, 0xdd, 0xad, 0x51, 0xa3, 0xd9, 0x12, 0x8b, 0xdb, 0x70, 0x14, 0x9c, + 0x73, 0x9a, 0x9e, 0x1c, 0xd5, 0x67, 0x9f, 0xbc, 0xab, 0x6c, 0x26, 0xdd, + 0xd5, 0x25, 0xb7, 0xaf, 0xc3, 0x3a, 0xa7, 0x64, 0x32, 0xa1, 0x5f, 0x7d, + 0xf8, 0x8e, 0x16, 0x57, 0xb6, 0xb4, 0xbd, 0xb3, 0x7f, 0x64, 0xfb, 0x0f, + 0x4a, 0x9d, 0x90, 0xed, 0xf2, 0xc5, 0xc9, 0x9e, 0x36, 0xc8, 0xb8, 0x74, + 0x71, 0x52, 0x99, 0xdb, 0x8f, 0xd4, 0x6c, 0x06, 0x2f, 0xcd, 0x33, 0x8d, + 0x91, 0x8c, 0xf1, 0x64, 0x9d, 0x53, 0xa3, 0xd9, 0x56, 0xa3, 0xd9, 0x7e, + 0xc9, 0xe7, 0x73, 0x36, 0x78, 0x7e, 0xec, 0x9a, 0xad, 0x40, 0x36, 0xb6, + 0x0c, 0x06, 0x00, 0x00, 0x3d, 0xc0, 0xaf, 0x1f, 0x01, 0x00, 0xe8, 0xc6, + 0xcd, 0xad, 0xa4, 0x66, 0xb3, 0xdd, 0xb3, 0xa5, 0x99, 0x38, 0xdb, 0x9c, + 0x73, 0xba, 0x7a, 0xe9, 0x9c, 0x0a, 0xf9, 0xec, 0x89, 0x09, 0xff, 0x9e, + 0x7f, 0x6d, 0xd9, 0x74, 0x4a, 0xc3, 0x83, 0x85, 0x23, 0x7f, 0x6d, 0xb9, + 0x6c, 0x5a, 0x63, 0xa3, 0x43, 0x3d, 0x0b, 0xce, 0x9c, 0x73, 0x1a, 0x2c, + 0xe6, 0x35, 0x36, 0x3c, 0x78, 0xe2, 0xc6, 0xf9, 0x2c, 0x0a, 0xc3, 0x48, + 0x61, 0x1c, 0x33, 0x10, 0x00, 0x00, 0xf4, 0x00, 0x01, 0x20, 0x00, 0x00, + 0x5d, 0xd2, 0x6a, 0x07, 0xa2, 0xfe, 0xef, 0xe7, 0x19, 0x63, 0xe4, 0x99, + 0x4e, 0x17, 0xd9, 0xd7, 0xfb, 0xd0, 0xe1, 0x47, 0xbf, 0x0c, 0xaf, 0x93, + 0x94, 0xcb, 0x67, 0x4e, 0xec, 0xeb, 0xb3, 0xce, 0x75, 0xe6, 0xfb, 0x11, + 0x7e, 0x3f, 0x9c, 0x73, 0xca, 0x65, 0x33, 0xca, 0x65, 0x33, 0x3d, 0x1d, + 0xe7, 0xa4, 0x9f, 0xd0, 0xc4, 0xd8, 0x10, 0x01, 0x60, 0x0f, 0x84, 0x61, + 0xa4, 0xa0, 0x1d, 0x52, 0x19, 0x09, 0x00, 0x40, 0x0f, 0xb0, 0x04, 0x18, + 0x00, 0x80, 0x2e, 0x70, 0x4e, 0x0a, 0x82, 0x88, 0xfc, 0xef, 0xe7, 0x98, + 0x4e, 0x85, 0x64, 0xa9, 0x5c, 0x95, 0x75, 0x4e, 0xfe, 0x4f, 0x34, 0x44, + 0xf0, 0x3c, 0x23, 0xcf, 0xf3, 0x7e, 0xfc, 0x65, 0x07, 0xfb, 0xa7, 0x75, + 0x3e, 0xb7, 0xdb, 0xfb, 0xc2, 0x9d, 0xa0, 0xe1, 0xd2, 0xee, 0x6e, 0x45, + 0xba, 0x71, 0xf2, 0x5e, 0x9b, 0xe7, 0x19, 0x6d, 0x6c, 0x95, 0xb4, 0xb5, + 0xb3, 0x2f, 0xef, 0x08, 0x83, 0x1c, 0x63, 0x8c, 0x72, 0xd9, 0xb4, 0x52, + 0xc9, 0x64, 0xcf, 0x07, 0x7b, 0x70, 0xb0, 0x40, 0x28, 0xd5, 0xed, 0x61, + 0x36, 0x46, 0x51, 0x14, 0xab, 0x1d, 0x04, 0x0c, 0x06, 0x00, 0x00, 0x3d, + 0x40, 0x00, 0x08, 0x00, 0x40, 0x17, 0x38, 0xe7, 0x14, 0xc5, 0x31, 0xf9, + 0xdf, 0xcf, 0xf0, 0x3d, 0x4f, 0x77, 0x1e, 0x3e, 0xd1, 0x83, 0xb9, 0x45, + 0xc9, 0x49, 0xc9, 0x84, 0xff, 0x42, 0x03, 0x09, 0xdf, 0xf3, 0x5e, 0x68, + 0x96, 0x60, 0x8c, 0x51, 0x22, 0xe1, 0x1f, 0x7e, 0x6a, 0x1c, 0x5b, 0x95, + 0x2b, 0xf5, 0x33, 0x1f, 0xd6, 0x18, 0x63, 0xf4, 0x74, 0x79, 0x5d, 0x1f, + 0xbe, 0x77, 0x45, 0x03, 0x03, 0xf9, 0x13, 0x53, 0x9d, 0x66, 0x24, 0x45, + 0x91, 0xd5, 0x9d, 0xfb, 0xf3, 0x6a, 0xb5, 0x82, 0x23, 0xdd, 0xff, 0x4f, + 0x92, 0x92, 0xc9, 0x84, 0x3c, 0xdf, 0xf4, 0xf8, 0xd8, 0x95, 0x72, 0xd9, + 0x8c, 0x3c, 0xd6, 0xc9, 0x74, 0x5d, 0x14, 0xc7, 0x6a, 0x07, 0x21, 0x03, + 0x01, 0x00, 0x40, 0x0f, 0x10, 0x00, 0x02, 0x00, 0xd0, 0x05, 0xce, 0xb9, + 0x63, 0xed, 0xd2, 0x7a, 0x1a, 0x84, 0x61, 0xac, 0x30, 0xec, 0xec, 0xff, + 0xd5, 0xfc, 0xd9, 0x71, 0x7c, 0xe1, 0x5f, 0x5e, 0xf8, 0x9c, 0x7e, 0xa8, + 0xd4, 0x32, 0xc6, 0xa8, 0x5c, 0xae, 0x69, 0x76, 0x61, 0x55, 0xbf, 0xba, + 0x75, 0x72, 0xca, 0x00, 0x9d, 0xa4, 0xd9, 0xa7, 0xcb, 0x9a, 0x7d, 0xba, + 0x72, 0xe4, 0xe1, 0xdf, 0xc1, 0x3b, 0x57, 0xef, 0xcb, 0x68, 0x9d, 0x12, + 0xbe, 0x2f, 0x23, 0x23, 0x16, 0x01, 0x77, 0xff, 0x3c, 0xd9, 0xd9, 0x2a, + 0x81, 0x91, 0x06, 0x00, 0xa0, 0xdb, 0xf8, 0xdd, 0x26, 0x00, 0x00, 0x5d, + 0x60, 0xad, 0x53, 0x14, 0xb1, 0xb9, 0xfd, 0xdb, 0x7a, 0x7e, 0xbf, 0xbf, + 0xce, 0xc7, 0x8b, 0x7b, 0x02, 0xf6, 0xcd, 0x9c, 0x72, 0x4e, 0x77, 0xee, + 0x3d, 0xd1, 0xf2, 0xea, 0xe6, 0x89, 0x79, 0x4d, 0xcb, 0x6b, 0x5b, 0xfa, + 0xdb, 0x37, 0x8f, 0x14, 0x77, 0xa9, 0x93, 0xab, 0x93, 0x3b, 0x86, 0x46, + 0x3a, 0x46, 0x41, 0x18, 0xb2, 0x07, 0x60, 0x8f, 0x34, 0x9b, 0x6d, 0xb1, + 0x57, 0x02, 0x00, 0x00, 0xdd, 0x47, 0x00, 0x08, 0x00, 0x40, 0x97, 0x70, + 0x4b, 0x8b, 0xa3, 0x56, 0xa9, 0x35, 0xf5, 0x97, 0x2f, 0xef, 0x69, 0x65, + 0x6d, 0x5b, 0xbe, 0xef, 0x1f, 0xcf, 0xbc, 0x36, 0x92, 0xe7, 0x79, 0x5a, + 0x5c, 0xd9, 0xd0, 0x9f, 0xff, 0x7a, 0x47, 0xe5, 0x4a, 0xad, 0x2b, 0xcf, + 0xe3, 0x9c, 0x53, 0xd0, 0x0e, 0x7a, 0x5e, 0x49, 0x6b, 0x8c, 0x51, 0xbd, + 0xd1, 0x52, 0x4c, 0x00, 0xd8, 0x13, 0x4d, 0x2a, 0x00, 0x01, 0x00, 0xe8, + 0x09, 0x02, 0x40, 0x00, 0x00, 0x80, 0x53, 0xc2, 0x18, 0x69, 0x6b, 0xb7, + 0xac, 0x7f, 0xfb, 0xf3, 0x37, 0x7a, 0x34, 0xb7, 0xd8, 0xf3, 0x90, 0xd9, + 0x48, 0x8a, 0x63, 0xa7, 0xbb, 0x0f, 0x9e, 0xe8, 0x5f, 0xfe, 0xf4, 0x8d, + 0x76, 0x4b, 0x95, 0xae, 0x3e, 0x5f, 0xa3, 0xd9, 0x56, 0xbb, 0xdd, 0xdb, + 0x3d, 0xe2, 0x9c, 0xb3, 0x2a, 0xed, 0x57, 0xc9, 0xa4, 0x7a, 0x34, 0xa3, + 0x3a, 0x4b, 0x80, 0x01, 0x00, 0x40, 0xb7, 0xb1, 0x07, 0x20, 0x00, 0x00, + 0xc0, 0x29, 0x62, 0x24, 0xed, 0x57, 0xea, 0xfa, 0x1f, 0xff, 0xfe, 0x95, + 0x76, 0x4b, 0x15, 0x7d, 0xf0, 0xee, 0x15, 0xe5, 0x73, 0x99, 0xae, 0x2f, + 0x87, 0x76, 0xce, 0xa9, 0x5c, 0xad, 0xeb, 0xbb, 0x7b, 0x73, 0xba, 0xfb, + 0x70, 0xa1, 0xeb, 0x4b, 0x64, 0x8d, 0x31, 0x6a, 0x34, 0xdb, 0xaa, 0x35, + 0x9a, 0x1a, 0x1a, 0x2c, 0xf4, 0x66, 0x6c, 0x8d, 0x51, 0x10, 0x46, 0xda, + 0xda, 0xdd, 0x97, 0xf1, 0xa8, 0xe1, 0xed, 0x85, 0xa0, 0x1d, 0x1e, 0xcc, + 0x6a, 0x12, 0x57, 0x00, 0x00, 0xba, 0x89, 0x00, 0x10, 0x00, 0x00, 0xe0, + 0x94, 0x31, 0x46, 0x0a, 0x23, 0xab, 0xbf, 0x7d, 0xf3, 0x48, 0xab, 0xeb, + 0x3b, 0xba, 0x75, 0xf3, 0x8a, 0x2e, 0x9c, 0x1b, 0x57, 0x3e, 0x97, 0x95, + 0xa4, 0x23, 0x0b, 0xe7, 0x8c, 0x31, 0x72, 0xce, 0xa9, 0x56, 0x6f, 0x6a, + 0x61, 0x79, 0x43, 0xf7, 0x1e, 0x3d, 0xd5, 0xf6, 0xce, 0x7e, 0xcf, 0xf6, + 0x5e, 0x6c, 0xb6, 0xda, 0xda, 0xd8, 0xdc, 0xd3, 0xf9, 0xa9, 0xb1, 0x9e, + 0x3c, 0xa7, 0x31, 0x46, 0x7b, 0xa5, 0x8a, 0x4a, 0xfb, 0x15, 0x79, 0x86, + 0x00, 0xb0, 0x37, 0xf3, 0x38, 0x66, 0xbf, 0x45, 0x00, 0x00, 0x7a, 0x80, + 0x00, 0x10, 0x00, 0x00, 0xe0, 0x14, 0x7a, 0x96, 0x4f, 0xad, 0xae, 0x6f, + 0x6b, 0x77, 0xaf, 0xac, 0xf1, 0xb1, 0x21, 0xdd, 0xb8, 0x72, 0x41, 0x33, + 0x17, 0xa7, 0x54, 0x2c, 0xe4, 0x25, 0x23, 0x39, 0x6b, 0x5f, 0xbb, 0xae, + 0xca, 0x1c, 0x3c, 0xb8, 0x91, 0xb4, 0x5f, 0xad, 0xeb, 0xe9, 0xe2, 0xba, + 0xe6, 0x9e, 0xae, 0x68, 0x67, 0xb7, 0xac, 0x20, 0x8c, 0xba, 0xd4, 0xed, + 0xf7, 0xa7, 0x39, 0xe7, 0xb4, 0xb8, 0xb2, 0xa1, 0x0f, 0xdf, 0xbf, 0xa2, + 0x74, 0x2a, 0xd5, 0xfd, 0xe7, 0xb3, 0x56, 0x4f, 0x17, 0xd7, 0x15, 0x04, + 0x11, 0x13, 0xac, 0x47, 0xe2, 0x38, 0x56, 0x6c, 0xad, 0x7c, 0x8f, 0x9d, + 0x89, 0x00, 0x00, 0xe8, 0x26, 0x02, 0x40, 0x00, 0x00, 0x80, 0x53, 0xcc, + 0xf3, 0x3c, 0x05, 0x61, 0xa4, 0xd5, 0xf5, 0x1d, 0x6d, 0x6c, 0xed, 0xe9, + 0xf6, 0xfd, 0x27, 0x9a, 0xb9, 0x38, 0xa5, 0xeb, 0x97, 0xcf, 0x69, 0x74, + 0x64, 0x48, 0x89, 0x44, 0xa7, 0x59, 0xc8, 0xcb, 0xaa, 0xac, 0x9e, 0x55, + 0xd8, 0x45, 0x71, 0xac, 0x9d, 0xdd, 0x7d, 0x3d, 0x59, 0x58, 0xd3, 0xc2, + 0xf2, 0xba, 0x2a, 0x95, 0xc6, 0x61, 0x23, 0x0e, 0xaf, 0xc7, 0xcb, 0x62, + 0x3d, 0xcf, 0xd3, 0xc6, 0xd6, 0x9e, 0x16, 0x96, 0x37, 0xf5, 0xde, 0x8d, + 0x4b, 0xb2, 0xb6, 0x7b, 0x95, 0x62, 0xc6, 0x18, 0xed, 0x97, 0x6b, 0x7a, + 0xba, 0xb4, 0xce, 0xa4, 0xea, 0x19, 0xd3, 0xe9, 0x20, 0x6d, 0x9d, 0x8c, + 0x7f, 0x0c, 0x0d, 0x9f, 0x01, 0x00, 0xe8, 0x23, 0x04, 0x80, 0x00, 0x00, + 0x00, 0x67, 0x44, 0x1c, 0x5b, 0xed, 0x96, 0xaa, 0xda, 0xd9, 0x2b, 0xeb, + 0xce, 0x83, 0x79, 0x4d, 0x8e, 0x0f, 0xeb, 0xe2, 0xf9, 0x49, 0x9d, 0x9f, + 0x1a, 0x55, 0xb1, 0x98, 0x57, 0x32, 0x91, 0x94, 0xef, 0x79, 0x87, 0xd5, + 0x83, 0xce, 0x39, 0xc5, 0xd6, 0x29, 0x8a, 0x22, 0x95, 0x2b, 0x75, 0xad, + 0x6f, 0xee, 0x6a, 0x69, 0x65, 0x53, 0x1b, 0x3b, 0x7b, 0x0a, 0xda, 0xa1, + 0x8c, 0xf9, 0xfe, 0x73, 0x8f, 0x8b, 0xb5, 0x56, 0x77, 0xee, 0x3f, 0xd1, + 0xc5, 0x83, 0x25, 0xce, 0xdd, 0x5a, 0x2e, 0x1a, 0xc7, 0xb1, 0xe6, 0x16, + 0x56, 0xb4, 0xdf, 0xa5, 0xae, 0xc6, 0xf8, 0xf9, 0x71, 0x8f, 0xad, 0x55, + 0x42, 0x09, 0xb1, 0x0f, 0x20, 0x00, 0x00, 0xdd, 0x43, 0x00, 0x08, 0x00, + 0x40, 0x17, 0x18, 0xa3, 0x9e, 0xed, 0x93, 0x06, 0xbc, 0x38, 0xf7, 0x3c, + 0x85, 0x61, 0xac, 0xa5, 0xd5, 0x2d, 0x2d, 0xad, 0x6e, 0x29, 0x9d, 0x4a, + 0x69, 0xa8, 0x98, 0xd7, 0xf0, 0xe0, 0x80, 0x06, 0x07, 0x0b, 0xca, 0x65, + 0x52, 0x72, 0x4e, 0x6a, 0x34, 0x5b, 0xaa, 0x54, 0xeb, 0x2a, 0x95, 0x6b, + 0x2a, 0x57, 0x6a, 0x6a, 0xb5, 0x43, 0xc9, 0x48, 0x9e, 0xf1, 0xe4, 0x9d, + 0x90, 0x25, 0x99, 0x9e, 0xe7, 0x69, 0x7d, 0x6b, 0x57, 0xdf, 0xde, 0x99, + 0xd5, 0x6f, 0x3f, 0xfb, 0x40, 0xbe, 0xef, 0x1d, 0x79, 0xa5, 0x98, 0x31, + 0x46, 0x5b, 0x3b, 0xfb, 0xba, 0xff, 0x70, 0x41, 0x51, 0x14, 0x73, 0xec, + 0xf6, 0x7e, 0xd6, 0x32, 0x04, 0x00, 0x00, 0x74, 0x19, 0x01, 0x20, 0x00, + 0x00, 0x5d, 0xe0, 0x79, 0x9e, 0x92, 0x49, 0x7e, 0xcc, 0xe2, 0xf8, 0x18, + 0x23, 0xf9, 0xa6, 0x13, 0xe2, 0x85, 0x61, 0xa8, 0xad, 0xdd, 0x7d, 0x6d, + 0xed, 0x94, 0x64, 0x8c, 0x39, 0x0c, 0xf7, 0xac, 0xb5, 0x07, 0x15, 0x75, + 0xa6, 0xf3, 0xf9, 0xfe, 0xc9, 0xdc, 0x87, 0xcd, 0x33, 0x9e, 0x1e, 0xcc, + 0x2e, 0x69, 0x64, 0xa4, 0xa8, 0x77, 0xaf, 0x5d, 0x3a, 0xd2, 0x80, 0xce, + 0xf3, 0x3a, 0x4b, 0x7f, 0xbf, 0xf8, 0xe6, 0x81, 0xca, 0xd5, 0x3a, 0xe1, + 0x1f, 0x00, 0x00, 0x38, 0x93, 0xb8, 0x33, 0x01, 0x00, 0xa0, 0x4b, 0x88, + 0x11, 0x70, 0x62, 0xe6, 0xe2, 0x41, 0x53, 0x8f, 0x67, 0xeb, 0x79, 0x9f, + 0x2d, 0xa3, 0x35, 0xc6, 0x9c, 0x9a, 0xc0, 0xab, 0xd5, 0x0e, 0xf4, 0xb7, + 0xaf, 0x1f, 0x2a, 0x93, 0x4c, 0xe9, 0xf2, 0xcc, 0xf4, 0x91, 0x3c, 0xa6, + 0x67, 0x8c, 0xca, 0x95, 0xba, 0xfe, 0xfc, 0xc5, 0x5d, 0x2d, 0xad, 0x6c, + 0x12, 0xfe, 0x01, 0x00, 0x80, 0x33, 0x8b, 0x00, 0x10, 0x00, 0x80, 0x2e, + 0xf0, 0x8c, 0x91, 0x9f, 0xf0, 0xd5, 0xa9, 0xad, 0x02, 0x70, 0x14, 0xf6, + 0x2b, 0x35, 0xfd, 0xe9, 0x8b, 0x3b, 0x8a, 0x6c, 0xac, 0xab, 0x33, 0xe7, + 0xdf, 0xba, 0x29, 0xc9, 0x6e, 0xa9, 0xa2, 0xcf, 0xbf, 0xba, 0xa7, 0x27, + 0x0b, 0x6b, 0x84, 0x7f, 0x00, 0x00, 0xe0, 0x4c, 0x23, 0x00, 0x04, 0x00, + 0xa0, 0x0b, 0x8c, 0x31, 0x4a, 0xf8, 0xbe, 0x48, 0x00, 0x81, 0xa3, 0xe3, + 0x79, 0x9e, 0x4a, 0xe5, 0xaa, 0xfe, 0xe7, 0x7f, 0x7c, 0xa7, 0xed, 0x9d, + 0xb2, 0x3e, 0x78, 0xf7, 0xb2, 0x8a, 0xc5, 0xbc, 0x8c, 0x31, 0xaf, 0xd4, + 0x1c, 0xa4, 0x53, 0xf1, 0x28, 0xb5, 0x5a, 0x81, 0x56, 0xd6, 0xb7, 0xf5, + 0xf5, 0xed, 0xc7, 0xda, 0xd8, 0xda, 0x23, 0xfc, 0x03, 0x00, 0x00, 0x67, + 0x1e, 0x01, 0x20, 0x00, 0x00, 0x5d, 0xe0, 0xe4, 0x94, 0x48, 0xf8, 0x0c, + 0x04, 0xba, 0x30, 0xb7, 0xa4, 0x67, 0x5d, 0x30, 0x9c, 0x73, 0x07, 0x7f, + 0x3f, 0xfc, 0x8f, 0x9e, 0x25, 0xce, 0xaf, 0x92, 0x69, 0xfd, 0x30, 0x33, + 0xfb, 0xfe, 0xeb, 0x8d, 0xe9, 0x3c, 0x80, 0x79, 0xfe, 0xef, 0x27, 0x84, + 0xe7, 0x79, 0x6a, 0xb6, 0xda, 0xfa, 0xe6, 0xee, 0xac, 0x56, 0xd6, 0xb7, + 0xf4, 0xce, 0xb5, 0x8b, 0x9a, 0xb9, 0x30, 0xa5, 0xe1, 0xc1, 0x82, 0xbc, + 0x83, 0x06, 0x21, 0xcf, 0x87, 0x81, 0x9d, 0xd7, 0xde, 0x79, 0x2f, 0x8d, + 0x56, 0x5b, 0xeb, 0x9b, 0xbb, 0x7a, 0x3c, 0xb7, 0xac, 0xa5, 0xb5, 0x4d, + 0xb5, 0x5a, 0x01, 0xe1, 0xdf, 0x09, 0x39, 0x5f, 0x02, 0x00, 0x80, 0xee, + 0x22, 0x00, 0x04, 0x00, 0xa0, 0x4b, 0x92, 0x49, 0x5f, 0x94, 0x00, 0xe2, + 0x6d, 0x39, 0xe7, 0x0e, 0x82, 0x3a, 0xd7, 0xa9, 0x2c, 0x4d, 0xf8, 0x4a, + 0xf8, 0xbe, 0x52, 0xe9, 0x94, 0xb2, 0x99, 0xa4, 0x32, 0xa9, 0x94, 0xd2, + 0xe9, 0x94, 0x32, 0xa9, 0xa4, 0x92, 0xc9, 0x84, 0x92, 0xc9, 0x84, 0xfc, + 0x84, 0xaf, 0x54, 0x32, 0x29, 0xf3, 0x0b, 0xc1, 0x8a, 0x93, 0x14, 0x86, + 0x91, 0xa2, 0xd8, 0x2a, 0x0a, 0x23, 0x05, 0x51, 0xa4, 0x20, 0x08, 0xd5, + 0x6e, 0x87, 0x6a, 0x07, 0xa1, 0x5a, 0xad, 0xb6, 0x5a, 0xed, 0x50, 0x51, + 0x1c, 0x29, 0x8a, 0xac, 0xe2, 0x38, 0xee, 0x7c, 0xe1, 0x41, 0x30, 0x78, + 0x9c, 0xc1, 0xd9, 0xb3, 0x8a, 0xbf, 0xad, 0x9d, 0x7d, 0xed, 0xec, 0x55, + 0xf4, 0xdd, 0xbd, 0x27, 0x3a, 0x37, 0x35, 0xa6, 0xe9, 0xc9, 0x11, 0x8d, + 0x0e, 0x0f, 0xaa, 0x50, 0xc8, 0xca, 0xf7, 0x3c, 0x39, 0xe7, 0xd4, 0x6a, + 0x85, 0xda, 0xaf, 0x54, 0xb5, 0xb5, 0x5d, 0xd2, 0xea, 0xfa, 0x8e, 0x76, + 0xf7, 0x2b, 0x8a, 0xa2, 0x58, 0xce, 0x39, 0xc2, 0xbf, 0xe3, 0x9f, 0xdd, + 0x4a, 0x24, 0x13, 0x4a, 0xf8, 0x9e, 0x44, 0x08, 0x08, 0x00, 0x40, 0x57, + 0x11, 0x00, 0x02, 0x00, 0xd0, 0x25, 0xa9, 0x64, 0x8a, 0x80, 0x01, 0xaf, + 0xad, 0xd3, 0xa5, 0xb7, 0x13, 0xf4, 0x65, 0xd2, 0x29, 0x15, 0x0b, 0x79, + 0x15, 0x07, 0x72, 0x1a, 0x2c, 0x16, 0x34, 0x50, 0xc8, 0xa9, 0x90, 0xcf, + 0x2a, 0x9f, 0xcb, 0x28, 0x9d, 0x4a, 0xca, 0xf7, 0x3c, 0x79, 0x9e, 0x27, + 0x3f, 0xd1, 0xe9, 0xde, 0xfb, 0xd3, 0x15, 0x7d, 0xbf, 0xf8, 0x6c, 0x2f, + 0xfc, 0xc9, 0x3a, 0xab, 0x28, 0xb6, 0xb2, 0xd6, 0x2a, 0x8a, 0x62, 0xb5, + 0xda, 0x81, 0xea, 0x8d, 0x96, 0xea, 0x8d, 0x96, 0x2a, 0xd5, 0xba, 0x2a, + 0xd5, 0xba, 0xaa, 0xd5, 0xa6, 0xea, 0xcd, 0xa6, 0x5a, 0xed, 0x40, 0x71, + 0x64, 0x65, 0x9d, 0x7d, 0x2e, 0xa8, 0xec, 0x2d, 0x6b, 0xad, 0xaa, 0xb5, + 0x86, 0x1e, 0xcc, 0x2e, 0xea, 0xc1, 0xec, 0xa2, 0x92, 0x09, 0x5f, 0x89, + 0x84, 0xdf, 0x39, 0xf6, 0x9c, 0x14, 0x5b, 0xab, 0x30, 0x8c, 0x64, 0xad, + 0x3d, 0x55, 0x4d, 0x4f, 0xfa, 0x85, 0x67, 0x8c, 0x64, 0xcc, 0xb1, 0xcc, + 0x1d, 0x00, 0x00, 0xfa, 0x09, 0x01, 0x20, 0x00, 0x00, 0x5d, 0xe0, 0x9c, + 0x94, 0x4a, 0xf2, 0x63, 0x16, 0xbf, 0x34, 0x47, 0x9c, 0x9c, 0x73, 0xf2, + 0x3c, 0x4f, 0x99, 0x74, 0x52, 0xb9, 0x6c, 0x56, 0x83, 0xc5, 0xbc, 0x86, + 0x86, 0x0a, 0x1a, 0x19, 0x2a, 0x6a, 0x78, 0xb0, 0x13, 0xf8, 0x65, 0x32, + 0x69, 0x25, 0x7c, 0x4f, 0xcf, 0x16, 0xe4, 0x3a, 0x3d, 0xbf, 0xc4, 0xb5, + 0x13, 0xba, 0x59, 0xfb, 0xa6, 0xe9, 0x89, 0xfb, 0x89, 0x3f, 0x19, 0x25, + 0x7d, 0x5f, 0x4a, 0x24, 0x94, 0x4e, 0x49, 0x85, 0x7c, 0x56, 0xe3, 0x23, + 0x43, 0x92, 0x39, 0x08, 0x18, 0x9d, 0x53, 0x18, 0xc7, 0x6a, 0xb5, 0x02, + 0xd5, 0xeb, 0x4d, 0x55, 0x6a, 0x75, 0xed, 0xef, 0xd7, 0x54, 0xae, 0xd6, + 0x55, 0xae, 0xd6, 0x55, 0x6f, 0x34, 0xd5, 0x6c, 0x05, 0x0a, 0xc2, 0x48, + 0xae, 0x87, 0xa1, 0x9b, 0x77, 0xf0, 0x1c, 0x51, 0xdc, 0x09, 0x2e, 0x9f, + 0xd7, 0x09, 0x55, 0x3d, 0x26, 0xdd, 0x49, 0x3b, 0x06, 0x24, 0x25, 0x13, + 0x09, 0xf9, 0x7c, 0x6f, 0x00, 0x00, 0xe8, 0x3a, 0xee, 0x4c, 0x00, 0x00, + 0xe8, 0x92, 0x74, 0x2a, 0xc9, 0x20, 0xe0, 0x07, 0x9c, 0x73, 0xb2, 0xd6, + 0xc9, 0xf3, 0x8c, 0x8a, 0x03, 0x39, 0x8d, 0x8d, 0x0c, 0x69, 0x6a, 0x62, + 0x44, 0x63, 0x23, 0x45, 0x0d, 0x16, 0x0b, 0xca, 0x66, 0x33, 0x4a, 0x25, + 0x13, 0xf2, 0xbc, 0xef, 0x2b, 0xa2, 0x9e, 0x7d, 0x4d, 0x2f, 0x97, 0x48, + 0xfe, 0x70, 0x9f, 0x41, 0xbd, 0xf0, 0xdc, 0x09, 0xcf, 0x53, 0x21, 0x9f, + 0x55, 0x21, 0x9f, 0xd5, 0xd4, 0xe4, 0xa8, 0x9c, 0xed, 0x54, 0x0d, 0xb6, + 0x83, 0xe0, 0xb0, 0x52, 0x70, 0xb7, 0x54, 0xd5, 0xce, 0x4e, 0x49, 0x3b, + 0xa5, 0xb2, 0xaa, 0xb5, 0xa6, 0xe2, 0x38, 0x96, 0xf1, 0xbc, 0xc3, 0xa0, + 0xae, 0x5b, 0x3a, 0x5b, 0xfe, 0x51, 0xe5, 0x77, 0x3a, 0x0e, 0x08, 0x29, + 0x9d, 0x4e, 0xbe, 0x72, 0x13, 0x17, 0x00, 0x00, 0xf0, 0xe6, 0x08, 0x00, + 0x01, 0x00, 0xe8, 0x92, 0x74, 0x2a, 0xc5, 0xf6, 0x7f, 0x90, 0xf4, 0x7d, + 0xb5, 0xdf, 0x40, 0x21, 0xaf, 0xf3, 0xd3, 0x63, 0xba, 0x78, 0x6e, 0x42, + 0xd3, 0x93, 0xa3, 0xca, 0x65, 0xd3, 0xf2, 0x7d, 0x5f, 0x9e, 0xf7, 0xc3, + 0x89, 0xf2, 0xe6, 0x15, 0x7d, 0x3d, 0x7a, 0x3f, 0x9d, 0x37, 0x75, 0xf8, + 0xde, 0x24, 0xc9, 0xf7, 0x3d, 0xe5, 0xb2, 0x19, 0xe5, 0xb2, 0x19, 0x8d, + 0x8f, 0x0e, 0xe9, 0xca, 0x25, 0xa7, 0x38, 0x8e, 0xd4, 0x6c, 0x05, 0xda, + 0xda, 0xd9, 0xd7, 0xea, 0xfa, 0xb6, 0x56, 0xd6, 0xb6, 0xb5, 0x5f, 0xa9, + 0x1d, 0x86, 0xa0, 0x40, 0x2e, 0x93, 0x66, 0x10, 0x00, 0x00, 0xe8, 0x01, + 0x02, 0x40, 0x00, 0x00, 0xba, 0xf5, 0x43, 0x36, 0xe9, 0xc9, 0xfb, 0xc5, + 0x36, 0x0c, 0x38, 0xeb, 0x3c, 0x63, 0x94, 0x4a, 0x25, 0x35, 0x35, 0x31, + 0xac, 0x99, 0x8b, 0xd3, 0x9a, 0xb9, 0x30, 0xa9, 0x81, 0x42, 0x4e, 0x46, + 0x67, 0xbf, 0xe5, 0x81, 0xe7, 0x19, 0x79, 0x5e, 0x52, 0xc9, 0x64, 0x52, + 0xc5, 0x81, 0xbc, 0x6e, 0x5c, 0xbd, 0xa0, 0x46, 0xb3, 0xa5, 0x8d, 0xcd, + 0x5d, 0x2d, 0xac, 0x6c, 0x6a, 0x79, 0x75, 0x5b, 0x8d, 0x66, 0x53, 0x36, + 0xb6, 0x1c, 0x23, 0x7d, 0xcb, 0x29, 0x97, 0xcf, 0x32, 0x0c, 0x00, 0x00, + 0xf4, 0xe2, 0xde, 0x84, 0x21, 0x00, 0x00, 0xa0, 0x3b, 0x37, 0xb6, 0xc9, + 0x64, 0x42, 0x89, 0x44, 0x42, 0x41, 0x18, 0xd2, 0x78, 0xa0, 0x5f, 0xbe, + 0xeb, 0x07, 0xd5, 0x70, 0xd9, 0x4c, 0x5a, 0x23, 0xc3, 0x03, 0xba, 0x30, + 0x3d, 0xae, 0x4b, 0x17, 0xa6, 0x34, 0x36, 0x3a, 0xa8, 0x54, 0x32, 0x21, + 0x6b, 0x3b, 0x95, 0x80, 0xae, 0x4f, 0xc7, 0x26, 0x97, 0xcd, 0xe8, 0xfa, + 0x95, 0x0b, 0xba, 0x76, 0xf9, 0xbc, 0xf6, 0x2b, 0x35, 0xad, 0x6e, 0xec, + 0x68, 0x79, 0x75, 0x4b, 0x9b, 0xdb, 0x25, 0xd5, 0xea, 0x4d, 0x45, 0x51, + 0x44, 0xa3, 0x8e, 0xbe, 0x62, 0x54, 0xc8, 0x67, 0x18, 0x06, 0x00, 0x00, + 0x7a, 0x80, 0x00, 0x10, 0x00, 0x80, 0x2e, 0x70, 0x4e, 0xf2, 0x7d, 0x5f, + 0xbe, 0xef, 0x49, 0x21, 0xe3, 0x71, 0xd6, 0x3d, 0xdb, 0xa3, 0x6f, 0x68, + 0xb0, 0xf0, 0xff, 0xb3, 0x77, 0xdf, 0xe1, 0x51, 0x55, 0x89, 0xfb, 0xc0, + 0xdf, 0x73, 0xef, 0xcc, 0x24, 0x93, 0xde, 0x49, 0x42, 0x12, 0xd2, 0xa8, + 0x09, 0x45, 0x54, 0xc4, 0x5e, 0x77, 0xad, 0x20, 0x76, 0xa5, 0x08, 0x8a, + 0x02, 0xa2, 0xee, 0xea, 0x16, 0xbb, 0xfb, 0x73, 0x75, 0x57, 0xd7, 0x5d, + 0xdd, 0xef, 0xda, 0x50, 0xa4, 0x0b, 0x22, 0xcd, 0x8a, 0xd8, 0x00, 0x51, + 0xba, 0xf4, 0x0e, 0x09, 0x09, 0x84, 0x24, 0x24, 0x21, 0x21, 0x21, 0x3d, + 0xd3, 0xee, 0x3d, 0xbf, 0x3f, 0x02, 0x2c, 0xac, 0x90, 0xdc, 0x84, 0xcc, + 0x24, 0x33, 0x79, 0x3f, 0xcf, 0x13, 0x7d, 0x1e, 0x98, 0x73, 0xcb, 0xb9, + 0xf7, 0x64, 0xee, 0x7d, 0x39, 0x05, 0xdd, 0x12, 0xba, 0x20, 0x29, 0x21, + 0x16, 0x31, 0x51, 0x61, 0x08, 0xb0, 0xfa, 0x37, 0xce, 0xe7, 0xa7, 0x4b, + 0x68, 0x9a, 0xce, 0x76, 0x21, 0x25, 0xb4, 0xe3, 0x21, 0x69, 0x68, 0x48, + 0x10, 0x42, 0x43, 0x82, 0x90, 0x9e, 0xd2, 0x15, 0x55, 0x55, 0x75, 0x28, + 0x3a, 0x72, 0x14, 0x07, 0xf3, 0x8b, 0x51, 0x52, 0x5a, 0x01, 0xbb, 0xdd, + 0x09, 0x45, 0x61, 0x10, 0xe8, 0xf3, 0x2f, 0x22, 0x26, 0x15, 0x01, 0x56, + 0x06, 0x80, 0x44, 0x44, 0x44, 0x1e, 0xf9, 0xde, 0x65, 0x15, 0x10, 0x11, + 0x11, 0xb9, 0x87, 0xc5, 0x64, 0x82, 0xd9, 0xa4, 0xa2, 0x81, 0x55, 0xe1, + 0xb3, 0x4e, 0xf4, 0xf8, 0x8b, 0x89, 0x0a, 0x43, 0x8f, 0xb4, 0x44, 0xa4, + 0x76, 0x8b, 0x43, 0x50, 0x60, 0x40, 0x63, 0xf0, 0x7b, 0x5c, 0x47, 0x9f, + 0xcf, 0xaf, 0xbd, 0xeb, 0xce, 0x6c, 0x32, 0x21, 0x2a, 0x32, 0x14, 0x91, + 0x11, 0x21, 0xe8, 0x99, 0x9e, 0x84, 0x23, 0xa5, 0xe5, 0xd8, 0x7f, 0xf0, + 0x30, 0xf2, 0xf2, 0x4b, 0x50, 0xdf, 0x60, 0xe3, 0xea, 0xbd, 0x3e, 0x7c, + 0xfd, 0xfd, 0x2c, 0x66, 0x04, 0xfa, 0xfb, 0x01, 0x1c, 0x04, 0x4e, 0x44, + 0x44, 0xe4, 0x76, 0x0c, 0x00, 0x89, 0x88, 0x88, 0xdc, 0x44, 0x55, 0x15, + 0x28, 0x2a, 0xc3, 0x0b, 0x5f, 0x24, 0x44, 0x63, 0x0f, 0xcf, 0x98, 0xa8, + 0x30, 0xf4, 0x4a, 0x4f, 0x42, 0x4a, 0xb7, 0x78, 0x58, 0xfd, 0xfd, 0x80, + 0x4e, 0x3a, 0xbc, 0xb7, 0x6d, 0xea, 0x54, 0xc0, 0xcf, 0x62, 0x46, 0xb7, + 0x84, 0x58, 0x74, 0x4b, 0x88, 0xc5, 0x91, 0xa3, 0xc7, 0x90, 0x9d, 0x5b, + 0x88, 0x03, 0xf9, 0x45, 0xa8, 0xab, 0xb3, 0x41, 0xd7, 0xd9, 0x83, 0xd2, + 0xd7, 0x58, 0xad, 0xfe, 0xf0, 0xf3, 0xf7, 0x03, 0x17, 0x00, 0x26, 0x22, + 0x22, 0x72, 0x3f, 0x06, 0x80, 0x44, 0x44, 0x44, 0x6e, 0x20, 0xa5, 0x84, + 0xc9, 0x6c, 0x82, 0xd9, 0x64, 0x82, 0x94, 0x8d, 0x81, 0x11, 0x79, 0xff, + 0x35, 0x05, 0x80, 0xc0, 0x00, 0x7f, 0xc4, 0x75, 0x89, 0x44, 0xf7, 0xd4, + 0x44, 0x24, 0xc4, 0x47, 0xc3, 0xea, 0xef, 0x77, 0x72, 0x95, 0x5f, 0x6a, + 0x83, 0x7a, 0x3e, 0xfe, 0xff, 0xd8, 0x98, 0x48, 0x74, 0x89, 0x8e, 0x40, + 0x46, 0xcf, 0x64, 0xe4, 0xe5, 0x17, 0x23, 0xf7, 0x50, 0x31, 0x2a, 0x8e, + 0x55, 0xc3, 0xee, 0x70, 0x42, 0x28, 0x82, 0x0b, 0x6c, 0xfb, 0x40, 0x7b, + 0x0a, 0x0e, 0xb2, 0xc2, 0x6c, 0x52, 0x59, 0x19, 0x44, 0x44, 0x44, 0x1e, + 0xc0, 0x00, 0x90, 0x88, 0x88, 0xc8, 0x8d, 0xfc, 0xfd, 0x2d, 0x68, 0x8c, + 0x34, 0x18, 0x57, 0x78, 0x2b, 0x29, 0x25, 0x74, 0x5d, 0x22, 0x34, 0x24, + 0x10, 0xc9, 0x89, 0xb1, 0x48, 0x4f, 0x4d, 0x40, 0x74, 0x44, 0x28, 0xfc, + 0xfd, 0x2c, 0x90, 0x00, 0x7b, 0xa6, 0xb9, 0xc9, 0x89, 0x7a, 0x8d, 0x08, + 0x0f, 0x41, 0x78, 0x58, 0x30, 0xba, 0xa7, 0x25, 0xa2, 0xb0, 0xb8, 0x0c, + 0x39, 0x07, 0x0f, 0xa3, 0xb0, 0xa8, 0x14, 0x76, 0x87, 0x13, 0x26, 0x95, + 0xe1, 0x91, 0xf7, 0x12, 0x08, 0x09, 0x0e, 0x80, 0xca, 0x6b, 0x48, 0x44, + 0x44, 0xe4, 0x11, 0x0c, 0x00, 0x89, 0x88, 0x88, 0xdc, 0x44, 0x55, 0x14, + 0x44, 0x84, 0x87, 0x20, 0x2f, 0xbf, 0x04, 0x9c, 0xc6, 0xcc, 0x3b, 0xe9, + 0xba, 0x44, 0x60, 0x80, 0x1f, 0x7a, 0xa4, 0x25, 0xa2, 0x77, 0xf7, 0x6e, + 0x08, 0x0b, 0x0d, 0x3e, 0x39, 0xbf, 0x9f, 0xce, 0x1e, 0x7f, 0x1e, 0x71, + 0xa2, 0x67, 0x65, 0x50, 0xa0, 0x15, 0x3d, 0xd3, 0x92, 0x90, 0xd6, 0x2d, + 0x1e, 0x85, 0xc5, 0x65, 0xc8, 0xca, 0xc9, 0x47, 0x5e, 0x7e, 0x09, 0x9c, + 0x2e, 0x0d, 0x8a, 0xc2, 0x80, 0xdd, 0xfb, 0x7e, 0x3f, 0x0a, 0x84, 0x85, + 0x04, 0xf3, 0xda, 0x11, 0x11, 0x11, 0x79, 0x08, 0x03, 0x40, 0x22, 0x22, + 0x22, 0x37, 0x4a, 0x88, 0x8d, 0xc6, 0x8e, 0x3d, 0xb9, 0x9c, 0xe3, 0xde, + 0xcb, 0x08, 0x21, 0x60, 0xf5, 0xb7, 0x20, 0x3d, 0xb5, 0x2b, 0x7a, 0xa5, + 0x77, 0x43, 0x74, 0x64, 0x18, 0x84, 0x10, 0x1c, 0xe6, 0xdb, 0xee, 0xd7, + 0x05, 0x30, 0x9b, 0x4d, 0x48, 0x49, 0x8a, 0x43, 0xb7, 0x84, 0x2e, 0x28, + 0x38, 0x5c, 0x8a, 0xdd, 0x59, 0x79, 0x28, 0x2c, 0x2e, 0x85, 0xd3, 0xa9, + 0xb1, 0x82, 0xbc, 0xe9, 0x25, 0xc4, 0x6c, 0x42, 0x68, 0x70, 0x00, 0x57, + 0x7a, 0x26, 0x22, 0x22, 0xf2, 0xd4, 0x77, 0x2f, 0xab, 0x80, 0x88, 0x88, + 0xc8, 0x3d, 0xa4, 0x94, 0x88, 0x8a, 0x0c, 0x45, 0x58, 0x70, 0x10, 0x2a, + 0xaa, 0x6a, 0xa0, 0xf0, 0x45, 0xb7, 0xc3, 0x5f, 0x2f, 0x21, 0x44, 0xe3, + 0x50, 0xdf, 0xa4, 0x38, 0x74, 0x4f, 0xe9, 0x8a, 0x2e, 0xd1, 0x91, 0x50, + 0x94, 0xc6, 0x9e, 0x80, 0x0c, 0xff, 0x3a, 0x16, 0x45, 0x51, 0x90, 0x9a, + 0x1c, 0x8f, 0x84, 0xb8, 0x68, 0x14, 0x14, 0x95, 0x62, 0x5f, 0x6e, 0x01, + 0x8a, 0x8a, 0xcb, 0x50, 0xdf, 0x60, 0x07, 0x20, 0x38, 0xef, 0x66, 0x07, + 0x67, 0xf5, 0xb7, 0x20, 0x38, 0x38, 0x80, 0x15, 0x41, 0x44, 0x44, 0xe4, + 0x21, 0x0c, 0x00, 0x89, 0x88, 0x88, 0xdc, 0xfa, 0x92, 0xeb, 0x87, 0xd8, + 0x2e, 0x11, 0xa8, 0xa8, 0xac, 0xe6, 0x4a, 0x20, 0x1d, 0x54, 0xe3, 0x1c, + 0x7f, 0x3a, 0xc2, 0xc3, 0x42, 0x90, 0x9e, 0x12, 0x8f, 0xf4, 0x94, 0x04, + 0x44, 0x86, 0x87, 0xc0, 0xa4, 0xaa, 0xd0, 0xa5, 0x04, 0xa7, 0xf8, 0xeb, + 0xb8, 0x34, 0x4d, 0x87, 0xc9, 0x6c, 0x42, 0x6a, 0x72, 0x3c, 0xe2, 0x63, + 0xa3, 0x70, 0xa4, 0xac, 0x02, 0x7b, 0xf7, 0xe7, 0x23, 0x2f, 0xbf, 0x18, + 0x36, 0xbb, 0x83, 0xf3, 0xcb, 0x75, 0x60, 0x81, 0x01, 0x56, 0x58, 0xfd, + 0xfd, 0x59, 0x11, 0x44, 0x44, 0x44, 0x1e, 0xc2, 0x00, 0x90, 0x88, 0x88, + 0xc8, 0x8d, 0x54, 0x55, 0x41, 0x62, 0xd7, 0x18, 0xe4, 0x1e, 0x2c, 0x82, + 0xd3, 0xe5, 0x62, 0x85, 0x74, 0x30, 0xba, 0x94, 0xb0, 0xfa, 0x59, 0xd0, + 0x23, 0x2d, 0x11, 0x99, 0xbd, 0x52, 0x10, 0x16, 0x1a, 0x04, 0x45, 0xe1, + 0x1c, 0x7f, 0xde, 0xa4, 0x71, 0x05, 0x66, 0xc0, 0x62, 0x31, 0x23, 0xb1, + 0x6b, 0x17, 0xc4, 0x75, 0x89, 0x44, 0x61, 0x49, 0x12, 0x76, 0xed, 0xcd, + 0x45, 0x7e, 0xe1, 0x11, 0xe8, 0xba, 0xe4, 0x30, 0xd3, 0x0e, 0x46, 0x08, + 0x81, 0xb0, 0x90, 0x40, 0xf8, 0xfb, 0x59, 0x58, 0x19, 0x44, 0x44, 0x44, + 0x1e, 0xc2, 0x00, 0x90, 0x88, 0x88, 0xc8, 0xcd, 0x2f, 0xba, 0x31, 0x91, + 0x61, 0x08, 0x09, 0xb6, 0xa2, 0xfc, 0x58, 0x0d, 0x2b, 0xa4, 0x23, 0x3d, + 0x04, 0xa9, 0x2a, 0x12, 0xe2, 0x63, 0xd0, 0x3f, 0x33, 0x0d, 0x5d, 0xe3, + 0xa2, 0xa1, 0x08, 0x80, 0x99, 0x9f, 0x0f, 0x5c, 0x57, 0x93, 0x09, 0xc9, + 0x09, 0x5d, 0x90, 0x10, 0x1b, 0x85, 0xfd, 0x07, 0x0a, 0xb1, 0x7d, 0x4f, + 0x2e, 0x8e, 0x55, 0xd6, 0x70, 0xb5, 0xe6, 0x0e, 0x44, 0x51, 0x04, 0x62, + 0xa2, 0xc2, 0x61, 0x32, 0xa9, 0x1c, 0x5a, 0x4f, 0x44, 0x44, 0xe4, 0xa9, + 0x67, 0x24, 0x56, 0x01, 0x11, 0x11, 0x91, 0x7b, 0x85, 0x04, 0x07, 0xa2, + 0x6b, 0x5c, 0x0c, 0x2a, 0x2a, 0x6b, 0xf9, 0xb2, 0xdb, 0xce, 0xa4, 0x94, + 0x30, 0xa9, 0x2a, 0x62, 0xa2, 0xc3, 0x90, 0xd9, 0x2b, 0x15, 0xc9, 0x49, + 0x71, 0xb0, 0xfa, 0x59, 0xa0, 0xe9, 0x3a, 0xc3, 0x3f, 0x1f, 0x63, 0x36, + 0x9b, 0x90, 0xd9, 0x2b, 0x05, 0x5d, 0xe3, 0xa3, 0xb0, 0x3f, 0xb7, 0x10, + 0xfb, 0x72, 0xf2, 0x51, 0x55, 0x5d, 0x07, 0x5d, 0xd7, 0xd9, 0x23, 0xb0, + 0xdd, 0xaf, 0x8d, 0x19, 0x31, 0xd1, 0xe1, 0x10, 0xe0, 0xfa, 0x48, 0x44, + 0x44, 0x44, 0x9e, 0xc2, 0x00, 0x90, 0x88, 0x88, 0xc8, 0xdd, 0x5f, 0xb6, + 0x26, 0x15, 0xa9, 0xdd, 0xe2, 0x90, 0x95, 0x9b, 0x0f, 0xbb, 0xdd, 0xc9, + 0x0a, 0x69, 0x27, 0x9a, 0xa6, 0x23, 0x22, 0x3c, 0x04, 0x19, 0x3d, 0xbb, + 0x21, 0x2d, 0x25, 0x01, 0xa1, 0xc1, 0x81, 0x8d, 0x7f, 0xce, 0x9e, 0x61, + 0x3e, 0x49, 0x4a, 0x09, 0x4d, 0x4a, 0x84, 0x06, 0x07, 0x61, 0x60, 0xbf, + 0x1e, 0x48, 0x4e, 0x8a, 0x45, 0x56, 0x4e, 0x01, 0xb2, 0x72, 0xf2, 0x51, + 0x53, 0xdb, 0x00, 0x55, 0x55, 0x58, 0x49, 0xed, 0x74, 0x5d, 0x22, 0xc3, + 0x23, 0xb6, 0x6d, 0x96, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, + 0x83, 0x11, 0x11, 0x16, 0x02, 0xc9, 0xf8, 0x8f, 0x88, 0x88, 0xc8, 0x73, + 0xef, 0x24, 0xac, 0x02, 0x22, 0x22, 0x22, 0xf7, 0xd2, 0x75, 0x89, 0xb8, + 0xd8, 0x28, 0x24, 0xc6, 0xc5, 0x20, 0xfb, 0x60, 0x21, 0x57, 0x03, 0xf6, + 0x30, 0x29, 0x25, 0x54, 0x45, 0x45, 0xaf, 0x5e, 0x49, 0x18, 0x90, 0x91, + 0x8e, 0x88, 0xf0, 0x10, 0x08, 0x21, 0xd8, 0x1b, 0xb3, 0x13, 0x5d, 0x7f, + 0x21, 0x04, 0x22, 0xc3, 0x43, 0x31, 0xf8, 0xfc, 0x60, 0x24, 0x27, 0xc6, + 0x62, 0xc7, 0x9e, 0x5c, 0xe4, 0xe6, 0x15, 0x9d, 0xfc, 0x3b, 0xf2, 0xe0, + 0xf5, 0xd0, 0x25, 0x92, 0x13, 0x62, 0xe1, 0xe7, 0x67, 0x86, 0xa6, 0x31, + 0x7c, 0x27, 0x22, 0x22, 0xf2, 0x14, 0x06, 0x80, 0x44, 0x44, 0x44, 0x9e, + 0xf8, 0xc2, 0x55, 0x55, 0xf4, 0xec, 0x91, 0x84, 0x83, 0x05, 0xc5, 0x7c, + 0xe9, 0xf5, 0x20, 0x21, 0x04, 0xa2, 0x22, 0x43, 0x31, 0x20, 0x33, 0x1d, + 0xdd, 0x53, 0x13, 0xa1, 0x2a, 0x0a, 0x83, 0xbf, 0x4e, 0x4c, 0x51, 0x14, + 0x74, 0x8d, 0x8d, 0x42, 0x6c, 0x74, 0x04, 0xb2, 0x13, 0x0b, 0xb0, 0x7d, + 0x77, 0x0e, 0x2a, 0x8e, 0xd5, 0x70, 0xc1, 0x17, 0x0f, 0x91, 0x52, 0x22, + 0x30, 0xd0, 0x1f, 0x49, 0x89, 0x5d, 0xd8, 0x0e, 0x89, 0x88, 0x88, 0x3c, + 0xfd, 0x3e, 0xc2, 0x2a, 0x20, 0x22, 0x22, 0x72, 0x3f, 0x5d, 0xd7, 0xd1, + 0xad, 0x6b, 0x17, 0xa4, 0xa7, 0x26, 0x60, 0xcf, 0xbe, 0x3c, 0x0e, 0x3f, + 0x74, 0x7b, 0x7d, 0x4b, 0x04, 0x05, 0x5a, 0x91, 0x9e, 0xd2, 0x15, 0xfd, + 0x7a, 0xa7, 0x22, 0x2c, 0x2c, 0xf8, 0xf8, 0x6a, 0xb1, 0x0c, 0x1d, 0x3a, + 0x3b, 0x09, 0x40, 0x51, 0x15, 0xf4, 0xe9, 0x91, 0x8c, 0xb8, 0xd8, 0x48, + 0xec, 0xc9, 0x3a, 0x84, 0xfd, 0xb9, 0x05, 0xa8, 0xae, 0xad, 0x07, 0x00, + 0xf6, 0x08, 0x74, 0x73, 0xbb, 0x4c, 0x4e, 0x8c, 0x43, 0x64, 0x58, 0x08, + 0x74, 0x9d, 0x6d, 0x91, 0x88, 0x88, 0xc8, 0x93, 0x18, 0x00, 0x12, 0x11, + 0x11, 0x79, 0x88, 0xa2, 0x28, 0xe8, 0xd7, 0x3b, 0x15, 0x87, 0x0f, 0x97, + 0xa2, 0xa6, 0xae, 0x81, 0x41, 0x83, 0x1b, 0x48, 0x29, 0xa1, 0x08, 0x81, + 0x6e, 0x89, 0x5d, 0x30, 0x20, 0xb3, 0x3b, 0xe2, 0x63, 0x23, 0x61, 0x31, + 0x99, 0xd8, 0xc3, 0x8b, 0x7e, 0x45, 0x97, 0x12, 0x61, 0x21, 0xc1, 0x18, + 0x34, 0xb0, 0x37, 0x52, 0x92, 0xe2, 0xb0, 0x73, 0x6f, 0x2e, 0x0e, 0x1c, + 0x2a, 0x86, 0xc3, 0xe1, 0x84, 0xa2, 0x30, 0xa0, 0x77, 0x47, 0xdb, 0xb4, + 0x5a, 0xfd, 0xd0, 0xab, 0x7b, 0x12, 0x20, 0xb8, 0xe4, 0x36, 0x11, 0x11, + 0x91, 0xa7, 0x31, 0x00, 0x24, 0x22, 0x22, 0xf2, 0xe0, 0x0b, 0x70, 0x44, + 0x58, 0x08, 0xba, 0xa7, 0x26, 0x62, 0xeb, 0xae, 0xfd, 0xac, 0x10, 0x37, + 0xd4, 0x6f, 0x80, 0xd5, 0x0f, 0xfd, 0x33, 0xd3, 0xd1, 0xbb, 0x7b, 0x32, + 0x02, 0xac, 0x7e, 0x00, 0xc0, 0xf0, 0x8f, 0x9a, 0xbc, 0x67, 0x54, 0x45, + 0x41, 0x6c, 0x4c, 0x04, 0x22, 0xc2, 0x82, 0x91, 0x92, 0x14, 0x8f, 0x2d, + 0x3b, 0xb3, 0x71, 0xa4, 0xb4, 0x82, 0x21, 0xa0, 0x1b, 0x24, 0x27, 0x74, + 0x41, 0x74, 0x64, 0x18, 0x7b, 0xe2, 0x12, 0x11, 0x11, 0xb5, 0x03, 0x06, + 0x80, 0x44, 0x44, 0x44, 0x9e, 0xfc, 0xe2, 0x35, 0xa9, 0xe8, 0xd3, 0x2b, + 0x19, 0xf9, 0x45, 0xa5, 0x28, 0xaf, 0xa8, 0x62, 0x85, 0xb4, 0x11, 0x21, + 0x04, 0x92, 0xba, 0xc6, 0x60, 0x60, 0xff, 0x9e, 0x48, 0x88, 0x8b, 0x66, + 0xc0, 0x40, 0x2d, 0x66, 0xb1, 0x98, 0xd1, 0x23, 0x2d, 0x11, 0xb1, 0x31, + 0x11, 0xd8, 0xb9, 0xf7, 0x20, 0xf6, 0xee, 0xcf, 0x43, 0x43, 0x83, 0x9d, + 0x15, 0xd3, 0x46, 0x82, 0x02, 0xad, 0xe8, 0xd3, 0x33, 0x19, 0x66, 0x33, + 0x5f, 0x3f, 0x88, 0x88, 0x88, 0xda, 0xe5, 0x79, 0x39, 0xfb, 0x40, 0x3e, + 0x9f, 0x90, 0x89, 0xa8, 0xd3, 0xe1, 0xca, 0x8f, 0xd4, 0xde, 0x76, 0x67, + 0xe5, 0x61, 0xcd, 0x2f, 0x3b, 0xe0, 0x74, 0x69, 0xac, 0x8c, 0x73, 0x6c, + 0xcb, 0x61, 0xa1, 0x41, 0xc8, 0xe8, 0x99, 0x82, 0x5e, 0xdd, 0x93, 0x10, + 0x14, 0x68, 0xe5, 0x22, 0x2b, 0x74, 0x6e, 0x0f, 0xc7, 0xc7, 0xbf, 0x1b, + 0x0e, 0x17, 0x97, 0x61, 0xd7, 0xbe, 0x83, 0xc8, 0x2f, 0x3c, 0x82, 0x06, + 0x9b, 0x03, 0x8a, 0xc2, 0xef, 0x8c, 0x73, 0xa9, 0xd3, 0xbe, 0xbd, 0x53, + 0x71, 0xf1, 0x05, 0x7d, 0x60, 0x32, 0x31, 0x00, 0xa4, 0x76, 0xf8, 0xae, + 0x80, 0x84, 0x02, 0x05, 0x12, 0x7c, 0xf5, 0x25, 0xa2, 0xce, 0x8b, 0xdf, + 0xc0, 0x44, 0x44, 0x44, 0xed, 0xf0, 0x32, 0xdc, 0x23, 0x2d, 0x11, 0x25, + 0xa5, 0x47, 0xb1, 0x7b, 0xdf, 0x21, 0x2e, 0x08, 0xd2, 0x0a, 0xba, 0xae, + 0xc3, 0x6c, 0x32, 0x21, 0x3d, 0x25, 0x1e, 0x7d, 0x7b, 0xa7, 0x21, 0x26, + 0x3a, 0x1c, 0x8a, 0x10, 0x0c, 0xff, 0xe8, 0xdc, 0x83, 0x82, 0xe3, 0xbd, + 0x47, 0xbb, 0xc6, 0x45, 0x23, 0x2a, 0x22, 0x14, 0x79, 0x05, 0x47, 0xb0, + 0x6b, 0xdf, 0x01, 0x14, 0x95, 0x1c, 0x6d, 0x5c, 0x40, 0x84, 0xff, 0x78, + 0xd4, 0xe2, 0xb6, 0x1a, 0xdf, 0x25, 0x0a, 0xfd, 0x33, 0xd3, 0x61, 0x36, + 0x9b, 0xd9, 0x3b, 0x97, 0x88, 0x88, 0xa8, 0x9d, 0x30, 0x00, 0x24, 0x22, + 0x22, 0xf2, 0x30, 0x29, 0x25, 0x2c, 0x66, 0x13, 0x2e, 0x1c, 0xd0, 0x1b, + 0xc7, 0x8e, 0xd5, 0xa2, 0xa8, 0xb4, 0x1c, 0x2a, 0xe7, 0x1b, 0x33, 0x4c, + 0xd7, 0x74, 0x44, 0x46, 0x84, 0x62, 0x40, 0xdf, 0x74, 0xf4, 0x48, 0x4d, + 0x84, 0xc9, 0xa4, 0x36, 0xd6, 0x2b, 0xab, 0x86, 0xda, 0xba, 0x9d, 0x5a, + 0xcc, 0xe8, 0x9e, 0x9a, 0x80, 0x84, 0xae, 0x51, 0xd8, 0x9b, 0x75, 0x08, + 0x3b, 0xf7, 0x1e, 0x40, 0x2d, 0x17, 0xf0, 0x69, 0x51, 0x1d, 0x06, 0x05, + 0x5a, 0x31, 0x68, 0x60, 0x6f, 0x84, 0x06, 0x07, 0x32, 0xfc, 0x23, 0x22, + 0x22, 0x6a, 0x47, 0x1c, 0x02, 0x4c, 0x44, 0x9d, 0xf6, 0xa5, 0x84, 0x2f, + 0x70, 0xd4, 0xde, 0x14, 0x45, 0x20, 0x2f, 0xff, 0x08, 0x56, 0xac, 0xd9, + 0x82, 0x9a, 0xda, 0x7a, 0xde, 0x93, 0x06, 0x58, 0xcc, 0x26, 0xa4, 0x26, + 0xc7, 0xe3, 0xfc, 0x7e, 0x3d, 0x11, 0x1e, 0x16, 0xc4, 0x85, 0x44, 0xc9, + 0xa3, 0x4a, 0x8f, 0x56, 0x62, 0xcb, 0x8e, 0x2c, 0xe4, 0x15, 0x94, 0xb0, + 0xb7, 0x69, 0xb3, 0xdf, 0xb3, 0x80, 0xd9, 0xac, 0xe2, 0xd2, 0x41, 0x99, + 0xe8, 0xd7, 0x27, 0x0d, 0xba, 0xce, 0xc6, 0x4a, 0xed, 0x78, 0x3f, 0x72, + 0x08, 0x30, 0x11, 0x11, 0x03, 0x40, 0x22, 0xea, 0xac, 0x2f, 0x26, 0x0c, + 0x00, 0xa9, 0xe3, 0xbc, 0x96, 0xec, 0xd8, 0x7b, 0x00, 0xbf, 0x6c, 0xda, + 0x0b, 0x87, 0xd3, 0xc9, 0xea, 0x38, 0x4b, 0x7b, 0x55, 0x15, 0x05, 0xd1, + 0x51, 0x61, 0xe8, 0x9f, 0x91, 0x8e, 0x94, 0x6e, 0x71, 0xb0, 0x98, 0x4d, + 0x0c, 0x14, 0xc8, 0xe3, 0x54, 0x45, 0x81, 0xcd, 0xee, 0x40, 0x6e, 0xde, + 0x61, 0x6c, 0xdb, 0x95, 0x83, 0xf2, 0x63, 0xd5, 0xfc, 0x3e, 0x39, 0x0b, + 0x45, 0x51, 0x70, 0x5e, 0xdf, 0xee, 0x18, 0x74, 0x5e, 0x2f, 0xae, 0xa8, + 0x4c, 0x1d, 0xe0, 0x9b, 0x96, 0x01, 0x20, 0x11, 0x11, 0x87, 0x00, 0x13, + 0x11, 0x11, 0xb5, 0x2b, 0x81, 0x3e, 0xdd, 0x93, 0x51, 0x5f, 0x67, 0xc7, + 0xe6, 0x1d, 0x59, 0xac, 0x8e, 0xff, 0xa1, 0xeb, 0x12, 0x01, 0x01, 0x7e, + 0xc8, 0xe8, 0x91, 0x8c, 0x3e, 0x3d, 0x93, 0x11, 0x1a, 0x12, 0x04, 0x48, + 0xc9, 0xf0, 0x8f, 0xda, 0x85, 0xa6, 0xeb, 0x30, 0x9b, 0x4d, 0xe8, 0xd5, + 0xbd, 0x1b, 0xa2, 0xa3, 0xc2, 0xb0, 0x6b, 0xef, 0x41, 0xec, 0xdb, 0x7f, + 0x08, 0x4e, 0x97, 0xc6, 0x10, 0xf0, 0x7f, 0x64, 0xf4, 0x4c, 0xc6, 0x80, + 0xcc, 0x74, 0x86, 0x7f, 0x44, 0x44, 0x44, 0x1d, 0xe5, 0xad, 0x83, 0x3d, + 0x00, 0x89, 0xa8, 0x33, 0x62, 0x8f, 0x0d, 0xea, 0x50, 0x5f, 0xc6, 0x00, + 0x1c, 0x4e, 0x17, 0xd6, 0x6e, 0xdc, 0x85, 0xed, 0xbb, 0x73, 0xb9, 0x28, + 0xc8, 0x71, 0xba, 0x2e, 0x11, 0x1b, 0x13, 0x81, 0x41, 0x03, 0x7b, 0x21, + 0x21, 0x2e, 0x86, 0xf5, 0x42, 0x1d, 0x8e, 0xcb, 0xa5, 0x21, 0xe7, 0xe0, + 0x61, 0x6c, 0xdc, 0xbe, 0x0f, 0xc7, 0x2a, 0x6b, 0x38, 0x97, 0x27, 0x1a, + 0x43, 0xd2, 0x8c, 0x1e, 0xc9, 0xb8, 0x74, 0x50, 0x26, 0xac, 0x56, 0x3f, + 0x0e, 0xd3, 0xa7, 0x8e, 0xf1, 0xdc, 0xc7, 0x1e, 0x80, 0x44, 0x44, 0xec, + 0x01, 0x48, 0x44, 0x44, 0xd4, 0xfe, 0x2f, 0x26, 0x80, 0xc5, 0x62, 0xc6, + 0xe0, 0x0b, 0x32, 0xa0, 0x4b, 0x89, 0xdd, 0xfb, 0xf2, 0xd0, 0xd9, 0xf3, + 0x69, 0x55, 0x55, 0x90, 0xd1, 0xab, 0x1b, 0x06, 0xf6, 0xed, 0x8e, 0xb0, + 0xd0, 0x60, 0xe8, 0x3a, 0xe7, 0x5b, 0xa3, 0x0e, 0xf8, 0x20, 0x6d, 0x52, + 0x91, 0xd1, 0x33, 0x19, 0x91, 0xe1, 0x21, 0xd8, 0xb4, 0x6d, 0x1f, 0xf2, + 0x0a, 0x4b, 0x3a, 0x79, 0xef, 0x54, 0x81, 0xfe, 0x7d, 0xd2, 0x30, 0xf8, + 0x82, 0x0c, 0xf8, 0x5b, 0xcc, 0x0c, 0xff, 0x88, 0x88, 0x88, 0x3a, 0xd2, + 0xb7, 0x34, 0x7b, 0x00, 0x12, 0x51, 0x67, 0xc4, 0x1e, 0x80, 0xd4, 0x21, + 0xbf, 0x94, 0x85, 0x40, 0x43, 0x83, 0x0d, 0xeb, 0x37, 0xef, 0xc1, 0xde, + 0xfd, 0x87, 0x3a, 0x67, 0x90, 0x20, 0x81, 0xa8, 0xa8, 0x50, 0xf4, 0xef, + 0x93, 0x8e, 0x1e, 0x69, 0x09, 0x50, 0x55, 0x95, 0x2b, 0x87, 0x92, 0x77, + 0xb4, 0x5d, 0x9b, 0x1d, 0x3b, 0xf6, 0xe4, 0x62, 0x4f, 0xf6, 0x21, 0xd4, + 0xd4, 0xd4, 0x75, 0xaa, 0xa1, 0xaf, 0x27, 0x56, 0x36, 0xcf, 0xec, 0x9d, + 0x82, 0xf3, 0xfb, 0xf7, 0x82, 0xbf, 0x9f, 0x85, 0xed, 0x96, 0x3a, 0xd8, + 0x57, 0x0b, 0x7b, 0x00, 0x12, 0x11, 0x31, 0x00, 0x24, 0xa2, 0xce, 0xf9, + 0x20, 0xc8, 0x00, 0x90, 0x3a, 0xea, 0x17, 0x33, 0x80, 0x06, 0x9b, 0x1d, + 0x9b, 0x77, 0x64, 0x63, 0xfb, 0x9e, 0x5c, 0xe8, 0x9a, 0xde, 0x29, 0xee, + 0x55, 0x5d, 0xd7, 0x61, 0x32, 0x99, 0xd0, 0x23, 0x2d, 0x01, 0x03, 0x32, + 0xd2, 0x11, 0x19, 0x11, 0xca, 0x9b, 0x81, 0xbc, 0xab, 0xed, 0x0a, 0x01, + 0x4d, 0xd3, 0x50, 0x70, 0xb8, 0x14, 0x5b, 0x76, 0x66, 0xa3, 0xf0, 0x70, + 0x19, 0x84, 0x22, 0x7c, 0xbe, 0xfd, 0xea, 0xba, 0x8e, 0xc0, 0x00, 0x2b, + 0xce, 0xeb, 0xd7, 0x1d, 0x99, 0xbd, 0x52, 0x60, 0x31, 0x9b, 0xd8, 0xf3, + 0x8f, 0x3a, 0xde, 0x73, 0x1f, 0x03, 0x40, 0x22, 0x22, 0x06, 0x80, 0x44, + 0xd4, 0x49, 0x1f, 0x04, 0x19, 0x00, 0x52, 0x07, 0xe7, 0x72, 0x69, 0xd8, + 0xb6, 0x3b, 0x07, 0x9b, 0xb7, 0x67, 0xc1, 0xe9, 0x74, 0xf9, 0xf4, 0xfd, + 0xaa, 0xeb, 0x3a, 0xc2, 0xc3, 0x42, 0x30, 0x30, 0xb3, 0x3b, 0x7a, 0x74, + 0x4f, 0x84, 0x49, 0x55, 0x79, 0x03, 0x90, 0x57, 0xab, 0xab, 0xb7, 0x61, + 0xf3, 0xf6, 0x2c, 0xec, 0xcd, 0x3e, 0x04, 0xa7, 0xcb, 0x77, 0xdb, 0xaf, + 0xa6, 0xe9, 0x88, 0x8e, 0x0c, 0xc5, 0xa0, 0x81, 0x7d, 0x90, 0x96, 0x1c, + 0xcf, 0x0b, 0x4f, 0x1d, 0xf7, 0xb9, 0x8f, 0x01, 0x20, 0x11, 0x11, 0x03, + 0x40, 0x22, 0xea, 0xa4, 0x0f, 0x82, 0x0c, 0x00, 0xc9, 0x1b, 0xbe, 0xa4, + 0x85, 0xc0, 0xde, 0xec, 0x3c, 0x6c, 0xdc, 0xba, 0x0f, 0xd5, 0xb5, 0xf5, + 0x3e, 0x79, 0x8e, 0x26, 0x55, 0x45, 0x52, 0x42, 0x17, 0x5c, 0x78, 0x5e, + 0x2f, 0x44, 0x47, 0x86, 0xb2, 0xe7, 0x10, 0xf9, 0x0c, 0x4d, 0xd7, 0x91, + 0x95, 0x93, 0x8f, 0xcd, 0xdb, 0xb3, 0x50, 0x53, 0xdb, 0xe0, 0x73, 0x43, + 0x62, 0x15, 0x45, 0x20, 0xa9, 0x6b, 0x17, 0x5c, 0x74, 0x7e, 0x1f, 0x44, + 0x47, 0x86, 0x71, 0xc8, 0x2f, 0x75, 0xec, 0xe7, 0x3e, 0x06, 0x80, 0x44, + 0x44, 0x0c, 0x00, 0x89, 0xa8, 0x93, 0x3e, 0x08, 0x32, 0x00, 0x24, 0x6f, + 0xf9, 0xa2, 0x16, 0x02, 0x85, 0x45, 0xa5, 0xd8, 0xb8, 0x6d, 0x1f, 0x8a, + 0x4a, 0x8e, 0x42, 0xd7, 0xbd, 0xff, 0xde, 0x3d, 0xd1, 0xfe, 0xc2, 0x42, + 0x83, 0xd0, 0xb7, 0x77, 0x2a, 0x7a, 0xa6, 0x27, 0xc1, 0xea, 0x6f, 0xe9, + 0xe4, 0x8b, 0x27, 0x90, 0xef, 0xb5, 0xdd, 0xc6, 0xf6, 0x5b, 0x52, 0x5a, + 0x81, 0xad, 0x3b, 0xf7, 0xe3, 0x50, 0xc1, 0x11, 0xd8, 0x9d, 0x4e, 0x28, + 0x5e, 0xde, 0x7e, 0x75, 0x5d, 0x22, 0x24, 0x38, 0x00, 0xbd, 0xba, 0x27, + 0xa1, 0x5f, 0x9f, 0x74, 0x04, 0x5a, 0xfd, 0xa0, 0x33, 0xfc, 0xa3, 0x8e, + 0xfe, 0xbd, 0xc3, 0x00, 0x90, 0x88, 0x88, 0x01, 0x20, 0x11, 0x75, 0xd2, + 0x07, 0x41, 0x06, 0x80, 0xe4, 0x55, 0x41, 0x82, 0x40, 0x75, 0x4d, 0x1d, + 0xb6, 0xed, 0xca, 0xc1, 0xbe, 0xfd, 0xf9, 0x68, 0xb0, 0xd9, 0xa1, 0xaa, + 0xde, 0xb9, 0xc0, 0x80, 0xae, 0xeb, 0xb0, 0x5a, 0xfd, 0xd0, 0x23, 0x35, + 0x11, 0x19, 0xbd, 0x52, 0x10, 0x19, 0x1e, 0x02, 0x21, 0x04, 0x7b, 0x0f, + 0x91, 0xcf, 0x52, 0x14, 0x81, 0xba, 0x7a, 0x1b, 0x0e, 0xe6, 0x97, 0x60, + 0xfb, 0xee, 0x1c, 0x1c, 0x2d, 0xaf, 0xf4, 0xca, 0x05, 0x42, 0x74, 0x5d, + 0x42, 0x55, 0x14, 0x24, 0x26, 0x44, 0xe3, 0xbc, 0xcc, 0xee, 0x88, 0x8f, + 0x8d, 0xe2, 0x22, 0x3d, 0xe4, 0x3d, 0xcf, 0x7d, 0x0c, 0x00, 0x89, 0x88, + 0x18, 0x00, 0x12, 0x51, 0x27, 0x7d, 0x10, 0x64, 0x00, 0x48, 0x5e, 0x48, + 0xd3, 0x74, 0x1c, 0xcc, 0x2f, 0xc6, 0xa6, 0xed, 0x59, 0x28, 0x3b, 0x5a, + 0x09, 0x45, 0x11, 0x5e, 0xd5, 0xe6, 0x00, 0x20, 0x29, 0xa1, 0x0b, 0x06, + 0x64, 0xa6, 0x23, 0x3e, 0x36, 0x8a, 0x73, 0xfd, 0x51, 0xa7, 0xfb, 0xde, + 0xa9, 0xac, 0xaa, 0xc5, 0x8e, 0x3d, 0xb9, 0x8d, 0x73, 0x03, 0x6a, 0x9a, + 0xd7, 0xf4, 0x06, 0x94, 0x52, 0x22, 0x38, 0x28, 0x00, 0xfd, 0x33, 0xd3, + 0xd1, 0x2b, 0x2d, 0x11, 0xfe, 0xfe, 0x7e, 0xbc, 0xa0, 0xe4, 0x5d, 0xed, + 0x8f, 0x01, 0x20, 0x11, 0x11, 0x03, 0x40, 0x22, 0xea, 0xbc, 0x2f, 0x62, + 0x0c, 0x00, 0xc9, 0x5b, 0x55, 0x55, 0xd7, 0x61, 0xcb, 0xce, 0x6c, 0xec, + 0x3f, 0x50, 0x08, 0xa7, 0xd3, 0xd5, 0xe1, 0x8f, 0x57, 0x51, 0x14, 0x44, + 0x46, 0x84, 0x20, 0xa3, 0x47, 0x37, 0x74, 0x4f, 0x4b, 0x84, 0x9f, 0xc5, + 0xc2, 0x5e, 0x43, 0xd4, 0x99, 0xbf, 0x81, 0x70, 0x30, 0xbf, 0x04, 0x3b, + 0xf6, 0xe4, 0xa2, 0xf8, 0x48, 0x39, 0x34, 0x4d, 0xef, 0xd0, 0x47, 0x6b, + 0x32, 0x99, 0x90, 0x96, 0x1c, 0x8f, 0xfe, 0x19, 0x69, 0x88, 0x89, 0x0c, + 0x63, 0x7c, 0x42, 0x5e, 0xda, 0xea, 0x18, 0x00, 0x12, 0x11, 0x31, 0x00, + 0x24, 0xa2, 0xce, 0xf9, 0x20, 0xc8, 0x00, 0x90, 0xbc, 0x98, 0xa2, 0x08, + 0x38, 0x5d, 0x1a, 0xf2, 0x0b, 0x4a, 0xb0, 0x63, 0xef, 0x01, 0x94, 0x94, + 0x56, 0xc0, 0xe1, 0x68, 0x5c, 0x69, 0xb4, 0x23, 0xdc, 0xd6, 0x52, 0x4a, + 0x48, 0x29, 0xe1, 0xef, 0x67, 0x41, 0x64, 0x44, 0x08, 0xd2, 0x52, 0xba, + 0x22, 0x3d, 0xb9, 0x2b, 0x82, 0x83, 0x02, 0x4f, 0xfe, 0x1d, 0x51, 0x67, + 0x6f, 0xc3, 0xf5, 0x0d, 0x76, 0xe4, 0x1c, 0x3c, 0x8c, 0xec, 0xdc, 0x02, + 0x94, 0x57, 0x54, 0xc1, 0x66, 0x77, 0x1c, 0x6f, 0xc3, 0xa2, 0xdd, 0xdb, + 0x2f, 0x00, 0x04, 0x58, 0xfd, 0x11, 0xd7, 0x25, 0x02, 0xbd, 0xd2, 0xbb, + 0xa1, 0x5b, 0x62, 0x2c, 0x4c, 0x26, 0x85, 0xf3, 0x74, 0x92, 0xf7, 0x3e, + 0xf7, 0x31, 0x00, 0x24, 0x22, 0x62, 0x00, 0x48, 0x44, 0x9d, 0xf4, 0x41, + 0x90, 0x01, 0x20, 0x79, 0xfb, 0x17, 0xb8, 0x00, 0x00, 0x81, 0xba, 0xba, + 0x06, 0x1c, 0x3a, 0x7c, 0x04, 0xfb, 0x0f, 0x14, 0xa2, 0xa8, 0xe4, 0x28, + 0x1c, 0x0e, 0x27, 0x14, 0x45, 0x69, 0x97, 0xfb, 0x5b, 0xd7, 0x25, 0xa4, + 0xd4, 0x11, 0x14, 0x18, 0x80, 0xae, 0x71, 0x51, 0x48, 0x4b, 0x8e, 0x47, + 0x5c, 0x97, 0x48, 0x04, 0x06, 0x58, 0x39, 0xcf, 0x1f, 0xd1, 0xaf, 0xda, + 0x70, 0x63, 0x9b, 0xa8, 0xab, 0x6f, 0x40, 0x51, 0x49, 0x39, 0x72, 0x0e, + 0x16, 0xa2, 0xa8, 0xa4, 0x1c, 0x75, 0xf5, 0x0d, 0x10, 0x42, 0xf1, 0xe8, + 0x10, 0x7f, 0x29, 0x25, 0x74, 0x29, 0x21, 0x00, 0x84, 0x87, 0x85, 0x20, + 0xe1, 0x78, 0xfb, 0x8d, 0x89, 0x8e, 0x80, 0xbf, 0x1f, 0x7b, 0xec, 0x92, + 0x0f, 0x3c, 0xf7, 0x31, 0x00, 0x24, 0x22, 0x62, 0x00, 0x48, 0x44, 0x9d, + 0xf4, 0x41, 0x90, 0x01, 0x20, 0xf9, 0xd8, 0xfd, 0xec, 0x70, 0xba, 0x50, + 0x52, 0x5a, 0x8e, 0x83, 0x87, 0x8a, 0x70, 0xa8, 0xb0, 0x14, 0x35, 0xb5, + 0xf5, 0x90, 0xf2, 0xbf, 0x2b, 0x91, 0xba, 0x73, 0xdf, 0x52, 0x4a, 0x28, + 0xaa, 0x82, 0xc8, 0xb0, 0x10, 0xa4, 0x74, 0x8b, 0x43, 0x4a, 0x52, 0x1c, + 0xc2, 0x43, 0x83, 0x61, 0x32, 0xa9, 0x6c, 0x67, 0x44, 0x06, 0xdb, 0x91, + 0xcb, 0xa5, 0xa1, 0xa2, 0xb2, 0x1a, 0x79, 0x05, 0x25, 0xc8, 0xcb, 0x2f, + 0x41, 0x45, 0x65, 0x35, 0x5c, 0x2e, 0xcd, 0x6d, 0xbd, 0x02, 0x65, 0xe3, + 0x8e, 0x21, 0xa5, 0x84, 0xd5, 0xdf, 0x0f, 0x31, 0xd1, 0xe1, 0x48, 0x49, + 0x8a, 0x43, 0x52, 0xd7, 0x2e, 0x08, 0x0c, 0xf4, 0xe7, 0x1c, 0x9d, 0xe4, + 0x5b, 0x6d, 0x8c, 0x01, 0x20, 0x11, 0x11, 0x03, 0x40, 0x22, 0xea, 0xbc, + 0x2f, 0x5b, 0x0c, 0x26, 0xc8, 0xe7, 0xbe, 0xd4, 0x85, 0x00, 0x20, 0x51, + 0x53, 0xdb, 0x80, 0xe2, 0x23, 0xe5, 0x38, 0x5c, 0x72, 0x14, 0x65, 0x47, + 0x8f, 0xa1, 0xa6, 0xb6, 0x1e, 0x4e, 0x97, 0x06, 0xa9, 0x4b, 0x48, 0x48, + 0x34, 0xd7, 0x99, 0xe7, 0x4c, 0xbd, 0x7d, 0x4e, 0xf4, 0x38, 0x3c, 0xb1, + 0x1f, 0x45, 0x11, 0x30, 0x99, 0x54, 0x84, 0x06, 0x07, 0xa2, 0x4b, 0x74, + 0x04, 0x92, 0xba, 0x76, 0x41, 0x6c, 0x4c, 0x38, 0xac, 0x56, 0x3f, 0x0e, + 0x13, 0x24, 0x3a, 0x07, 0x8a, 0x22, 0x60, 0xb3, 0x39, 0x70, 0xb4, 0xa2, + 0x0a, 0x87, 0x4b, 0xca, 0x70, 0xa4, 0xec, 0x18, 0x8e, 0x55, 0xd6, 0xc2, + 0x66, 0x77, 0x40, 0xd3, 0xb4, 0xe3, 0xa1, 0x3b, 0x5a, 0xd4, 0x2b, 0xef, + 0x44, 0xfb, 0x3d, 0xd9, 0x76, 0x55, 0x15, 0x01, 0x56, 0x7f, 0x44, 0x46, + 0x84, 0x20, 0xae, 0x4b, 0x04, 0xba, 0xc6, 0x46, 0x23, 0x2c, 0x34, 0x88, + 0xab, 0xfa, 0x92, 0xef, 0x3e, 0xf7, 0x31, 0x00, 0x24, 0x22, 0x62, 0x00, + 0x48, 0x44, 0x9d, 0xf4, 0x41, 0x90, 0x01, 0x20, 0xf9, 0xf2, 0x97, 0xfb, + 0xf1, 0x97, 0x7c, 0xa9, 0x4b, 0xd8, 0x1c, 0x4e, 0xd4, 0xd4, 0xd6, 0xa3, + 0xba, 0xa6, 0x16, 0x75, 0x75, 0x36, 0x34, 0xd8, 0xec, 0x70, 0x38, 0x5d, + 0x70, 0xb9, 0xb4, 0xb3, 0xbe, 0xe8, 0x6b, 0x9a, 0x0e, 0x4d, 0xd7, 0x4f, + 0x7b, 0x75, 0x32, 0xa9, 0x2a, 0x54, 0x55, 0x81, 0xc5, 0x62, 0x86, 0xd5, + 0xdf, 0x0f, 0xc1, 0x41, 0x01, 0x08, 0x0d, 0x09, 0x42, 0x68, 0x48, 0x20, + 0xfc, 0x2c, 0x66, 0x00, 0x82, 0xf3, 0xfb, 0x11, 0xb5, 0x61, 0x1b, 0x16, + 0x42, 0x40, 0x00, 0x70, 0x69, 0x1a, 0xea, 0xeb, 0x6d, 0xa8, 0xae, 0xa9, + 0x43, 0x65, 0x4d, 0x1d, 0x6a, 0x6a, 0xeb, 0xd1, 0xd0, 0x60, 0x87, 0xcd, + 0xee, 0x38, 0xa5, 0x2d, 0xeb, 0x70, 0xb9, 0xb4, 0xe3, 0xad, 0x15, 0x50, + 0x15, 0x05, 0xaa, 0xaa, 0xc2, 0xa4, 0x2a, 0x30, 0x9b, 0x4c, 0x30, 0x5b, + 0x4c, 0xf0, 0xf7, 0xb3, 0x20, 0x30, 0xc0, 0x8a, 0xa0, 0xa0, 0x00, 0x84, + 0x06, 0x5b, 0x11, 0x1c, 0x14, 0x08, 0x7f, 0x7f, 0x0b, 0x54, 0x45, 0x69, + 0x1c, 0x02, 0xcc, 0xe0, 0x9e, 0x7c, 0xf9, 0xb9, 0x8f, 0x01, 0x20, 0x11, + 0x11, 0x03, 0x40, 0x22, 0xea, 0xa4, 0x0f, 0x82, 0x0c, 0x00, 0xa9, 0x13, + 0x05, 0x09, 0x8d, 0xff, 0x3f, 0x7e, 0xef, 0xeb, 0x12, 0xba, 0x6c, 0x7c, + 0x19, 0x3a, 0xfb, 0x7b, 0xd0, 0xaf, 0x7b, 0x09, 0x0a, 0xd1, 0xf8, 0x1f, + 0xe5, 0x94, 0x60, 0x42, 0x9e, 0xd2, 0x9e, 0x88, 0xc8, 0x33, 0xed, 0x58, + 0x97, 0x12, 0xba, 0xd6, 0x38, 0xdf, 0xa6, 0x4b, 0xd3, 0xa1, 0xeb, 0x3a, + 0x74, 0x5d, 0x42, 0x3f, 0x25, 0xb4, 0x57, 0x84, 0x80, 0xa2, 0x2a, 0x50, + 0x84, 0x80, 0xaa, 0xaa, 0x50, 0x94, 0x13, 0xbd, 0xff, 0x14, 0x08, 0x81, + 0x93, 0xed, 0x9b, 0x6d, 0x97, 0x3a, 0xcd, 0x73, 0x1f, 0x03, 0x40, 0x22, + 0x22, 0x98, 0x58, 0x05, 0x44, 0x44, 0x44, 0x3e, 0xfc, 0xd2, 0x73, 0xfc, + 0x05, 0xff, 0xd4, 0xf7, 0x7c, 0x21, 0x00, 0x01, 0x71, 0x62, 0x44, 0xef, + 0x99, 0xe2, 0x86, 0x66, 0xb7, 0xc9, 0x57, 0x28, 0xa2, 0xf6, 0x6b, 0xc7, + 0x8d, 0x0b, 0x84, 0xa8, 0x50, 0x5b, 0x38, 0x4f, 0xdf, 0x89, 0xe1, 0xc3, + 0x44, 0x44, 0x44, 0xd4, 0xf9, 0x28, 0xac, 0x02, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0xdf, 0xc5, 0x00, 0x90, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xc8, 0x87, 0x31, 0x00, 0x24, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xf2, 0x61, 0x0c, 0x00, 0x89, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0x18, 0x03, 0x40, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1f, 0xc6, 0x00, 0x90, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xc8, 0x87, 0x31, 0x00, + 0x24, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xf2, 0x61, 0x0c, + 0x00, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0x18, + 0x03, 0x40, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1f, + 0x66, 0x62, 0x15, 0x10, 0x11, 0x11, 0x51, 0x47, 0x25, 0xa5, 0x84, 0xd3, + 0xe1, 0x00, 0x84, 0x30, 0x5c, 0xc6, 0x6c, 0x36, 0x43, 0x51, 0x14, 0x48, + 0x29, 0x5b, 0xbd, 0x5f, 0x45, 0x51, 0x60, 0xb7, 0xdb, 0x60, 0x7c, 0x13, + 0x12, 0x80, 0x80, 0x9f, 0x9f, 0xdf, 0x39, 0xed, 0xd7, 0x08, 0x21, 0x04, + 0x54, 0x55, 0x85, 0xcb, 0xe5, 0x82, 0xd3, 0xe9, 0x80, 0x94, 0x8d, 0xd5, + 0x63, 0x36, 0x5b, 0xa0, 0xaa, 0x2a, 0x74, 0x5d, 0x6f, 0xf2, 0x18, 0x5c, + 0x2e, 0x17, 0x74, 0x5d, 0xf7, 0xc8, 0xf5, 0x33, 0x9b, 0xcd, 0x27, 0x8f, + 0xa9, 0x23, 0x53, 0x14, 0x05, 0x42, 0x08, 0xb8, 0x5c, 0x2e, 0xb8, 0x9c, + 0xce, 0xc6, 0xab, 0x29, 0x04, 0x2c, 0x16, 0x0b, 0x14, 0x45, 0x69, 0xb6, + 0x4e, 0x89, 0x88, 0x88, 0x88, 0x3a, 0x3a, 0x06, 0x80, 0x44, 0x44, 0x44, + 0xd4, 0x61, 0xd5, 0xd4, 0xd4, 0x60, 0xe6, 0x8c, 0xa9, 0x38, 0xb0, 0x3f, + 0x07, 0x42, 0x69, 0x7e, 0xe0, 0x82, 0xa2, 0x2a, 0xb8, 0xfa, 0x9a, 0x6b, + 0x71, 0xe3, 0x4d, 0xb7, 0x40, 0x55, 0xd5, 0x56, 0xed, 0x53, 0x55, 0x4d, + 0x38, 0x7c, 0xb8, 0x10, 0x93, 0x27, 0xbd, 0x8b, 0x63, 0xc7, 0x8e, 0x41, + 0x18, 0x08, 0x1f, 0x5d, 0x2e, 0x17, 0xee, 0xb9, 0x6f, 0x38, 0xae, 0xba, + 0xfa, 0x1a, 0xb8, 0x5c, 0x2e, 0xf7, 0x3d, 0xb8, 0x99, 0x4c, 0xa8, 0xaa, + 0xac, 0xc4, 0xc6, 0x8d, 0x1b, 0xb0, 0x65, 0xd3, 0x46, 0x14, 0x15, 0x17, + 0x41, 0x73, 0xb9, 0x60, 0x32, 0x99, 0x91, 0x98, 0x94, 0x84, 0x8b, 0x06, + 0x5f, 0x8c, 0xf3, 0x06, 0x9e, 0x0f, 0xab, 0xd5, 0x0a, 0x4d, 0xd3, 0xce, + 0x70, 0x6e, 0x2a, 0x56, 0xfc, 0xb8, 0x0c, 0x4b, 0x16, 0x2f, 0x3e, 0xe3, + 0xdf, 0xb7, 0x25, 0x21, 0x04, 0x92, 0xba, 0x25, 0x61, 0xc8, 0xad, 0xb7, + 0xa1, 0x7b, 0xf7, 0x1e, 0x1d, 0x36, 0x04, 0x34, 0x5b, 0x2c, 0x28, 0x3f, + 0x7a, 0x14, 0xeb, 0xd7, 0xad, 0xc1, 0xb6, 0xad, 0x5b, 0x71, 0xa4, 0xa4, + 0x04, 0xba, 0xae, 0xc3, 0x62, 0xb1, 0x20, 0x25, 0x35, 0x15, 0x17, 0x5e, + 0x34, 0x18, 0xe7, 0x0f, 0x3c, 0x1f, 0xaa, 0xc9, 0xe4, 0xf6, 0x3a, 0x23, + 0x22, 0x22, 0x22, 0x72, 0xdb, 0x73, 0x24, 0xab, 0x80, 0x88, 0x88, 0x88, + 0x3a, 0xaa, 0xc0, 0xc0, 0x40, 0x44, 0x46, 0x44, 0x61, 0xda, 0x8a, 0xc9, + 0xb0, 0xd9, 0x6c, 0xcd, 0x7e, 0x5e, 0x4a, 0x89, 0xac, 0x7d, 0xfb, 0xd0, + 0xa7, 0x4f, 0x06, 0x52, 0xd3, 0xd2, 0x5b, 0xbc, 0xbf, 0xc6, 0x5e, 0x60, + 0x4e, 0x7c, 0x3c, 0x7b, 0x16, 0xe6, 0x7e, 0x3c, 0x1b, 0x52, 0xca, 0x66, + 0x03, 0x40, 0x29, 0x25, 0xce, 0x1b, 0x38, 0x10, 0x3d, 0x7b, 0xf5, 0x72, + 0x6b, 0xc8, 0x25, 0x84, 0xc0, 0xee, 0x5d, 0x3b, 0xf1, 0xf6, 0x7f, 0xfe, + 0x8d, 0x75, 0x6b, 0xd7, 0xa0, 0xa1, 0xa1, 0xa1, 0x71, 0x7f, 0x8d, 0x9d, + 0x0f, 0xa1, 0xaa, 0x2a, 0x66, 0xcf, 0x9a, 0x81, 0x6b, 0xae, 0xfd, 0x0d, + 0x1e, 0xfb, 0xdd, 0x13, 0xe8, 0x96, 0x9c, 0xfc, 0xab, 0xe3, 0x11, 0x42, + 0x20, 0x27, 0x67, 0x3f, 0xbe, 0xfd, 0xe6, 0x6b, 0xb7, 0x06, 0x95, 0xa7, + 0x5a, 0xb3, 0x6a, 0x15, 0xfe, 0xf2, 0xd7, 0x57, 0x30, 0xe0, 0xbc, 0x81, + 0x1d, 0x2e, 0x40, 0x53, 0x55, 0x15, 0x6b, 0x57, 0xad, 0xc2, 0xa4, 0x49, + 0xef, 0x60, 0xd3, 0x86, 0x0d, 0x70, 0xb9, 0x9c, 0xa7, 0xd5, 0x99, 0xa2, + 0xaa, 0x08, 0x0a, 0x0c, 0xc2, 0xd0, 0x61, 0xb7, 0x61, 0xec, 0x43, 0x0f, + 0x23, 0xa9, 0x5b, 0xb2, 0xc7, 0xea, 0x8d, 0x88, 0x88, 0x88, 0xa8, 0x4d, + 0x9f, 0x7b, 0x1e, 0xff, 0xfd, 0x93, 0x2f, 0xb1, 0x1a, 0x88, 0xa8, 0x33, + 0x12, 0x2d, 0x18, 0x52, 0x48, 0x44, 0xed, 0xf4, 0xa0, 0xa2, 0xaa, 0x88, + 0x8b, 0xef, 0x8a, 0x5d, 0xbb, 0x76, 0x22, 0xff, 0xd0, 0x21, 0x43, 0x65, + 0xca, 0xcb, 0x8f, 0xc2, 0xe1, 0x74, 0xe0, 0xf2, 0x2b, 0xae, 0x6a, 0x71, + 0x2f, 0x40, 0x21, 0x04, 0xd6, 0xac, 0x59, 0x8d, 0x7f, 0xbf, 0xf1, 0x4f, + 0x34, 0x34, 0x34, 0x18, 0x2a, 0x13, 0x12, 0x12, 0x8a, 0x3f, 0x3f, 0xfd, + 0x3c, 0x06, 0x0c, 0x38, 0xcf, 0x6d, 0x01, 0xa0, 0x10, 0x0a, 0xb6, 0x6e, + 0xd9, 0x8c, 0xe7, 0x9e, 0xf9, 0x33, 0x36, 0xfc, 0xb2, 0x1e, 0x0e, 0x87, + 0xe3, 0x57, 0x43, 0x52, 0x75, 0x5d, 0x87, 0xdd, 0x6e, 0xc7, 0xbe, 0xbd, + 0x7b, 0xb0, 0x7b, 0xd7, 0x0e, 0xf4, 0xee, 0x9d, 0x81, 0x2e, 0xb1, 0xb1, + 0xa7, 0x7d, 0x4e, 0x51, 0x14, 0x6c, 0xda, 0xb0, 0x01, 0xeb, 0xd6, 0xae, + 0xf1, 0x58, 0x8f, 0xbc, 0x23, 0x47, 0x4a, 0x90, 0xbb, 0x7f, 0x3f, 0x2e, + 0x1a, 0x7c, 0x09, 0xc2, 0xc3, 0xc3, 0x3b, 0xcc, 0x50, 0x5a, 0x29, 0x25, + 0x56, 0x2c, 0x5b, 0x8a, 0x67, 0x9f, 0xf9, 0x33, 0xf6, 0xee, 0xde, 0x0d, + 0x4d, 0x73, 0xfd, 0xea, 0xd8, 0xa4, 0xae, 0xc3, 0x6e, 0xb7, 0x61, 0xc7, + 0xf6, 0x6d, 0xc8, 0xcd, 0xcd, 0x45, 0xef, 0x3e, 0x7d, 0x10, 0x11, 0x11, + 0xc9, 0x86, 0x49, 0xe4, 0x8d, 0xcf, 0x7d, 0xe0, 0x73, 0x1f, 0x11, 0x75, + 0x6e, 0x5c, 0x04, 0x84, 0x88, 0x88, 0x88, 0x3a, 0x2c, 0x29, 0x25, 0xe2, + 0xe3, 0xe3, 0x31, 0xf1, 0xd1, 0xc7, 0x11, 0x19, 0x19, 0x65, 0xb8, 0xdc, + 0x57, 0x5f, 0x7c, 0x8e, 0xef, 0xbf, 0xfb, 0x06, 0x26, 0x53, 0xcb, 0x06, + 0x3b, 0x94, 0x95, 0x96, 0xe2, 0xa3, 0x19, 0xd3, 0x70, 0xac, 0xa2, 0xc2, + 0xd8, 0x0b, 0xa5, 0x10, 0xb8, 0x65, 0xc8, 0x50, 0x5c, 0x79, 0xd5, 0x95, + 0x6e, 0x0b, 0xd4, 0x4c, 0x26, 0x13, 0x0e, 0x1d, 0xca, 0xc3, 0x2b, 0x2f, + 0xbf, 0x84, 0x7d, 0x7b, 0xf7, 0x1a, 0x2a, 0xb3, 0x79, 0xd3, 0x26, 0xbc, + 0xf2, 0xd7, 0xbf, 0xe0, 0x60, 0x6e, 0x2e, 0x14, 0xa5, 0xfd, 0x1f, 0xf7, + 0x36, 0x6f, 0xde, 0x84, 0x49, 0xef, 0xbd, 0x8d, 0xba, 0xba, 0xba, 0x0e, + 0xf1, 0x8f, 0x2f, 0x42, 0x08, 0xec, 0xdb, 0xbb, 0x07, 0xff, 0xfc, 0xe7, + 0x6b, 0x28, 0x29, 0x2e, 0x36, 0x54, 0x66, 0xd5, 0xca, 0x9f, 0xf0, 0x9f, + 0x37, 0xdf, 0x40, 0x59, 0x69, 0x29, 0x1b, 0x26, 0x11, 0x11, 0x11, 0x79, + 0x1d, 0x06, 0x80, 0x44, 0x44, 0x44, 0xd4, 0xa1, 0x39, 0x9d, 0x4e, 0x0c, + 0xba, 0x68, 0x30, 0x46, 0x8d, 0x1e, 0x63, 0xb8, 0x8c, 0xcd, 0x66, 0xc3, + 0xa4, 0x77, 0xde, 0x46, 0x76, 0x76, 0x96, 0xe1, 0x10, 0x50, 0x08, 0x81, + 0xc5, 0x8b, 0xbf, 0xc4, 0xea, 0x55, 0x2b, 0x0d, 0xef, 0x27, 0xbd, 0x7b, + 0x0f, 0xdc, 0x37, 0x62, 0x24, 0xfc, 0xfd, 0xad, 0x6e, 0x39, 0x77, 0x21, + 0x14, 0xd4, 0xd6, 0xd6, 0x62, 0xd2, 0xbb, 0x6f, 0x63, 0xe7, 0xf6, 0x6d, + 0x2d, 0x2a, 0xbb, 0x65, 0xf3, 0x26, 0x7c, 0xfc, 0xf1, 0x47, 0x86, 0x86, + 0x4e, 0x7b, 0xc2, 0x77, 0xdf, 0x2c, 0xc1, 0x8f, 0xcb, 0x96, 0xb5, 0xfb, + 0x71, 0x08, 0x21, 0xd0, 0xd0, 0xd0, 0x80, 0x29, 0x93, 0x3f, 0x40, 0xce, + 0xfe, 0xfd, 0x2d, 0x2a, 0xbb, 0x7c, 0xd9, 0x0f, 0x58, 0xf2, 0xf5, 0x57, + 0x6c, 0x94, 0x44, 0x44, 0x44, 0xe4, 0x75, 0x18, 0x00, 0x12, 0x11, 0x11, + 0x51, 0x87, 0x76, 0x62, 0x58, 0xe6, 0xa8, 0xd1, 0x0f, 0xe0, 0xf2, 0x2b, + 0xae, 0x34, 0x5c, 0x2e, 0x37, 0x37, 0x07, 0xb3, 0xa6, 0x4f, 0x43, 0x6d, + 0x6d, 0x6d, 0xb3, 0xbd, 0xce, 0x14, 0x45, 0xc1, 0xee, 0x5d, 0x3b, 0x31, + 0x7b, 0xd6, 0x0c, 0x38, 0x9d, 0x4e, 0x43, 0xdb, 0x57, 0x55, 0x15, 0xf7, + 0x8f, 0x79, 0x00, 0xbd, 0xfb, 0x64, 0xb8, 0x6d, 0x58, 0xab, 0x40, 0x63, + 0xe8, 0xf4, 0xc3, 0xf7, 0xdf, 0xb6, 0xaa, 0xde, 0x56, 0xfc, 0xf8, 0x23, + 0x0e, 0x1c, 0xc8, 0xed, 0x10, 0xd7, 0xb1, 0xb6, 0xb6, 0x16, 0xeb, 0xd6, + 0xae, 0x86, 0xdd, 0x6e, 0x6f, 0xd7, 0xe3, 0x30, 0x5b, 0x2c, 0xf8, 0xfc, + 0xd3, 0x85, 0xf8, 0x7a, 0xf1, 0x97, 0x2d, 0x2e, 0xab, 0x69, 0x1a, 0xbe, + 0xf8, 0xfc, 0x53, 0x54, 0x55, 0x56, 0x72, 0x1a, 0x09, 0x22, 0x22, 0x22, + 0xf2, 0x2a, 0x0c, 0x00, 0x89, 0x88, 0x88, 0xa8, 0xc3, 0x93, 0x52, 0x22, + 0x38, 0x38, 0x18, 0x0f, 0x8d, 0x9b, 0x80, 0x98, 0x2e, 0x5d, 0x0c, 0x97, + 0x59, 0xf2, 0xf5, 0x62, 0xac, 0x5a, 0xf9, 0x73, 0x93, 0x01, 0xdd, 0x89, + 0x1e, 0x61, 0x93, 0xdf, 0x9f, 0x84, 0xc2, 0x82, 0x02, 0xc3, 0xc7, 0xf4, + 0xdb, 0xeb, 0x6f, 0xc0, 0xd0, 0x5b, 0x6f, 0x83, 0x84, 0xfb, 0xe6, 0xb4, + 0xcb, 0x3b, 0x74, 0x10, 0xd3, 0xa7, 0x4e, 0x41, 0x6d, 0x4d, 0x4d, 0xab, + 0xca, 0x97, 0x1e, 0x29, 0x41, 0xce, 0xfe, 0xfd, 0x1d, 0x66, 0xde, 0x3d, + 0x87, 0xc3, 0x01, 0xd9, 0x8e, 0xab, 0x01, 0xab, 0xaa, 0x8a, 0xed, 0xdb, + 0xb6, 0x62, 0xca, 0xe4, 0x0f, 0x5a, 0xbd, 0x8d, 0xac, 0xac, 0x2c, 0x64, + 0x65, 0xed, 0x6b, 0xf5, 0x2a, 0xd3, 0x44, 0x44, 0x44, 0x44, 0xed, 0x81, + 0x01, 0x20, 0x11, 0x11, 0x11, 0x79, 0x8d, 0xf3, 0x2f, 0xb8, 0x10, 0xb7, + 0x0e, 0xbb, 0xcd, 0x70, 0xf8, 0x52, 0x5d, 0x5d, 0x85, 0x99, 0xd3, 0xa7, + 0xa2, 0xb8, 0xa8, 0xa8, 0xc9, 0xcf, 0x2d, 0x98, 0xff, 0x09, 0xbe, 0xfb, + 0x76, 0x89, 0xe1, 0xe3, 0x48, 0x48, 0x48, 0xc4, 0xf8, 0x89, 0x8f, 0x21, + 0x24, 0x24, 0x04, 0x52, 0x77, 0x4f, 0xb8, 0xe6, 0x72, 0xb9, 0xb0, 0x70, + 0xde, 0x27, 0xd8, 0xb3, 0x7b, 0x57, 0xab, 0xb7, 0xd1, 0xd0, 0xd0, 0x80, + 0xa2, 0xc2, 0x42, 0x8f, 0x2d, 0xf8, 0xd1, 0x91, 0x09, 0x21, 0x50, 0x55, + 0x55, 0x85, 0xe9, 0x53, 0x26, 0xa3, 0xb0, 0xb0, 0xa0, 0xd5, 0xdb, 0xd1, + 0x5c, 0x2e, 0x1c, 0xca, 0xcb, 0xeb, 0x10, 0x73, 0x2b, 0x12, 0x11, 0x11, + 0x11, 0x19, 0xc5, 0x27, 0x17, 0x22, 0x22, 0x22, 0xf2, 0x1a, 0xfe, 0xfe, + 0xfe, 0xb8, 0xe7, 0xbe, 0x11, 0xc8, 0xec, 0xdb, 0xcf, 0x70, 0x99, 0x4d, + 0x1b, 0x37, 0x60, 0xe1, 0xc2, 0xf9, 0x67, 0x0c, 0x6c, 0x14, 0x45, 0xc5, + 0x9e, 0xdd, 0xbb, 0x30, 0x67, 0xd6, 0x4c, 0xc3, 0xbd, 0xe4, 0xfc, 0xfc, + 0xfc, 0xf0, 0xf0, 0xf8, 0x47, 0x90, 0x91, 0xd1, 0xd7, 0xf0, 0x70, 0xe1, + 0x96, 0x32, 0x9b, 0xcd, 0x58, 0xbb, 0x66, 0x35, 0x16, 0xcc, 0xff, 0x04, + 0x9a, 0xa6, 0x9d, 0xd3, 0xb6, 0x5c, 0x2e, 0x17, 0x6f, 0x1c, 0x34, 0x0e, + 0xdf, 0xfd, 0xfe, 0xdb, 0x25, 0x58, 0xbe, 0x6c, 0xe9, 0x39, 0x6f, 0xcb, + 0x6e, 0xb7, 0x73, 0x08, 0x30, 0x11, 0x11, 0x11, 0x79, 0x15, 0x06, 0x80, + 0x44, 0x44, 0x44, 0xe4, 0x35, 0x74, 0x5d, 0x47, 0x6a, 0x6a, 0x1a, 0x1e, + 0x7c, 0xe8, 0x61, 0x58, 0x2c, 0x16, 0x43, 0x65, 0xa4, 0x94, 0x98, 0x3d, + 0x73, 0x3a, 0x56, 0xaf, 0x5e, 0x05, 0xb3, 0xd9, 0x7c, 0xda, 0xdf, 0x55, + 0x57, 0x57, 0x61, 0xc6, 0xf4, 0xa9, 0x38, 0x74, 0x28, 0xcf, 0xf0, 0x31, + 0x5c, 0x7e, 0xc5, 0x95, 0xb8, 0xf1, 0xa6, 0x9b, 0x21, 0xa5, 0x7b, 0x7a, + 0xd5, 0x29, 0x8a, 0x82, 0x92, 0xe2, 0x62, 0x7c, 0x30, 0xe9, 0x5d, 0x1c, + 0x3b, 0x76, 0xec, 0xdc, 0x37, 0x28, 0xfe, 0xb7, 0x3e, 0xf4, 0x4e, 0xd9, + 0x23, 0xb0, 0xf8, 0xf0, 0x61, 0x7c, 0x3c, 0xe7, 0x23, 0xd4, 0xd6, 0xd6, + 0xb6, 0xc9, 0xf6, 0x24, 0x9b, 0x23, 0x11, 0x11, 0x11, 0x79, 0x11, 0x13, + 0xab, 0x80, 0x88, 0x88, 0x88, 0xbc, 0x89, 0xa6, 0x69, 0xb8, 0xe1, 0xc6, + 0x9b, 0xf1, 0xcb, 0xba, 0x75, 0x98, 0xfb, 0xf1, 0x6c, 0x43, 0x65, 0xaa, + 0xaa, 0xaa, 0x30, 0x79, 0xd2, 0xbb, 0xe8, 0xd3, 0xbb, 0x0f, 0x22, 0x22, + 0x23, 0xa1, 0xeb, 0x3a, 0xa4, 0x94, 0x58, 0xb5, 0xf2, 0x67, 0xfc, 0xb8, + 0x6c, 0x99, 0xe1, 0x40, 0x2c, 0x2e, 0x2e, 0x1e, 0x0f, 0x3e, 0x34, 0x0e, + 0xe1, 0x11, 0x11, 0x6e, 0x99, 0x57, 0x4f, 0x08, 0x01, 0x5d, 0xea, 0x98, + 0x35, 0x73, 0x3a, 0x36, 0x6d, 0xdc, 0xd0, 0xe6, 0xdb, 0xd7, 0x75, 0x1d, + 0x29, 0xa9, 0xe9, 0xb8, 0xe6, 0xba, 0xdf, 0x9c, 0x73, 0xcf, 0xc2, 0x13, + 0x54, 0xa1, 0x60, 0xed, 0xda, 0xd5, 0xa8, 0xaf, 0xaf, 0xef, 0xb0, 0xf7, + 0x8c, 0xcb, 0xe5, 0xc2, 0xf4, 0x69, 0x53, 0xb1, 0x6b, 0xe7, 0x4e, 0x36, + 0x20, 0x22, 0x22, 0x22, 0xea, 0x94, 0x18, 0x00, 0x12, 0x11, 0x11, 0x91, + 0x57, 0x91, 0x52, 0x42, 0x55, 0x55, 0x8c, 0x1d, 0x37, 0x1e, 0xdb, 0xb6, + 0x6e, 0xc1, 0x9e, 0x3d, 0xbb, 0x0d, 0x95, 0x5b, 0xb7, 0x76, 0x0d, 0xe6, + 0x7e, 0x3c, 0x1b, 0x13, 0x26, 0x3e, 0x06, 0xb3, 0xd9, 0x8c, 0x82, 0xfc, + 0x7c, 0x4c, 0x99, 0xfc, 0x3e, 0xaa, 0xab, 0xab, 0x0c, 0x95, 0x57, 0x14, + 0x05, 0xb7, 0xdf, 0x79, 0x17, 0x06, 0x9c, 0x37, 0xd0, 0x6d, 0xe7, 0x26, + 0x84, 0xc0, 0xaa, 0x9f, 0x7f, 0xc2, 0x82, 0x79, 0x9f, 0xb8, 0x65, 0xfb, + 0xba, 0xae, 0xe3, 0xb7, 0xd7, 0xdf, 0x80, 0x9b, 0x87, 0x0c, 0x45, 0x73, + 0x03, 0x58, 0x25, 0x00, 0x5d, 0xd3, 0x9a, 0x5d, 0x40, 0xc5, 0xe5, 0x72, + 0xe2, 0x9e, 0x3b, 0x6f, 0xc7, 0xd6, 0x2d, 0x9b, 0x3b, 0xe4, 0xfd, 0x62, + 0x36, 0x9b, 0xb1, 0xec, 0x87, 0xef, 0xf1, 0xd9, 0x67, 0x0b, 0xd9, 0x78, + 0x88, 0x88, 0x88, 0xa8, 0xd3, 0x62, 0x00, 0x48, 0x44, 0x44, 0x44, 0x5e, + 0x47, 0xd7, 0x75, 0x24, 0x25, 0x75, 0xc3, 0xb8, 0x09, 0x13, 0xf1, 0xc2, + 0xf3, 0xcf, 0x18, 0x5e, 0x25, 0x77, 0xe1, 0xfc, 0x79, 0x18, 0x74, 0xd1, + 0x60, 0x9c, 0x7f, 0xc1, 0x85, 0x98, 0x3e, 0x6d, 0x0a, 0x76, 0xed, 0xdc, + 0x61, 0x78, 0x9f, 0x17, 0x5c, 0x78, 0x11, 0x46, 0x8c, 0xbc, 0x1f, 0x7e, + 0x7e, 0x7e, 0x6d, 0xd6, 0x7b, 0xee, 0x7f, 0x95, 0x95, 0x95, 0x61, 0xd6, + 0x8c, 0xe9, 0xa8, 0xa8, 0x28, 0x77, 0xcb, 0xf6, 0x85, 0x10, 0xc8, 0xc9, + 0xd9, 0x8f, 0xac, 0x7d, 0xfb, 0x9a, 0x1e, 0xc2, 0x2c, 0x01, 0x7f, 0xab, + 0x15, 0x17, 0x0d, 0xbe, 0x18, 0xc1, 0xc1, 0xc1, 0x4d, 0x6e, 0x4f, 0xd7, + 0x65, 0x87, 0x1d, 0x52, 0x6c, 0x32, 0x99, 0x70, 0xe0, 0xc0, 0x01, 0xbc, + 0xfb, 0xf6, 0x7f, 0x50, 0xd7, 0x46, 0x43, 0x7f, 0x89, 0x88, 0x88, 0x88, + 0xbc, 0x11, 0x03, 0x40, 0x22, 0x22, 0x22, 0xf2, 0x4a, 0x52, 0x4a, 0x5c, + 0x7e, 0xc5, 0x95, 0xf8, 0xed, 0x6f, 0x6f, 0xc0, 0xe7, 0x9f, 0x2d, 0x32, + 0x34, 0x24, 0xf7, 0xf0, 0xe1, 0x42, 0x7c, 0x3c, 0xfb, 0x23, 0x1c, 0x38, + 0x90, 0x8b, 0xf9, 0x9f, 0xcc, 0x35, 0xbc, 0xaf, 0xb0, 0xd0, 0x30, 0x4c, + 0x98, 0xf8, 0x28, 0x62, 0xe3, 0xe2, 0xdc, 0xb6, 0xa8, 0x86, 0x94, 0x3a, + 0x3e, 0xff, 0x74, 0x21, 0xd6, 0xad, 0x5d, 0xe3, 0xb6, 0x3a, 0x53, 0x55, + 0x15, 0xab, 0x7e, 0xfe, 0x09, 0x6f, 0xff, 0xe7, 0xdf, 0xcd, 0x9e, 0x47, + 0x4c, 0x4c, 0x2c, 0xa6, 0xce, 0xfc, 0x08, 0xe1, 0xe1, 0xe1, 0xd0, 0xb4, + 0x33, 0x07, 0x7c, 0x42, 0x11, 0x1d, 0x76, 0x35, 0x5c, 0x21, 0x04, 0xea, + 0xeb, 0xeb, 0x31, 0x6b, 0xc6, 0x54, 0xec, 0xdb, 0xb7, 0x97, 0x0d, 0x86, + 0x88, 0x88, 0x88, 0x3a, 0x35, 0x06, 0x80, 0x44, 0x44, 0x44, 0xe4, 0xb5, + 0x42, 0xc3, 0xc2, 0x30, 0x6a, 0xf4, 0x18, 0x6c, 0xda, 0xb8, 0x01, 0xf9, + 0xf9, 0x87, 0x0c, 0x95, 0x59, 0xfa, 0xc3, 0x77, 0x58, 0xf1, 0xe3, 0x72, + 0xd8, 0xed, 0x36, 0xc3, 0xfb, 0xb9, 0x67, 0xf8, 0x08, 0x5c, 0x71, 0xe5, + 0x55, 0x6e, 0x0b, 0xff, 0x14, 0x45, 0xc1, 0x9e, 0xdd, 0x7b, 0x30, 0x6f, + 0xee, 0xc7, 0x70, 0x38, 0x1c, 0x6e, 0xad, 0x33, 0xa7, 0xd3, 0x09, 0x9b, + 0xcd, 0xd6, 0xec, 0xb9, 0x54, 0x57, 0x57, 0x63, 0xf5, 0xca, 0x9f, 0x91, + 0x77, 0x20, 0xf7, 0xec, 0x3d, 0xfc, 0x84, 0x80, 0xd3, 0xe9, 0x40, 0x5d, + 0x5d, 0xc7, 0xeb, 0x5d, 0x27, 0xa5, 0xc4, 0xfa, 0x75, 0x6b, 0xb1, 0xf8, + 0xcb, 0x2f, 0x3b, 0xe5, 0xa2, 0x27, 0x44, 0x44, 0x44, 0x44, 0xa7, 0x62, + 0x00, 0x48, 0x44, 0x44, 0x44, 0x5e, 0x4b, 0xd7, 0x75, 0x64, 0xf6, 0xed, + 0x87, 0x51, 0xa3, 0x1f, 0xc0, 0xeb, 0xaf, 0xfd, 0xcd, 0x50, 0x40, 0xe7, + 0x70, 0x38, 0x5a, 0x14, 0xb2, 0x5d, 0x78, 0xe1, 0x20, 0x0c, 0x1f, 0x79, + 0xbf, 0xdb, 0x42, 0x24, 0x45, 0x51, 0x50, 0x53, 0x53, 0x83, 0xf7, 0xde, + 0x79, 0xcb, 0x70, 0x88, 0xe9, 0x09, 0x95, 0x95, 0x15, 0x78, 0xf9, 0xa5, + 0x17, 0xbd, 0xf6, 0xde, 0x28, 0x3d, 0x72, 0x04, 0xd3, 0xa7, 0x4d, 0xc1, + 0xb1, 0x63, 0x15, 0x6c, 0x28, 0x44, 0x44, 0x44, 0xd4, 0xe9, 0x29, 0xac, + 0x02, 0x22, 0x22, 0x22, 0xf2, 0x66, 0x42, 0x08, 0xdc, 0x71, 0xd7, 0xdd, + 0xb8, 0xfa, 0x9a, 0x6b, 0xdb, 0x7c, 0xdb, 0xc1, 0xc1, 0x21, 0x18, 0x35, + 0xfa, 0x01, 0xc4, 0xc6, 0xc6, 0xba, 0xf5, 0xf8, 0x17, 0x2e, 0x98, 0x87, + 0x65, 0x4b, 0x7f, 0x30, 0x5c, 0x26, 0x32, 0x2a, 0x0a, 0xc1, 0xc1, 0x21, + 0xbc, 0xf8, 0x67, 0x7b, 0xc0, 0x55, 0x14, 0x7c, 0xfe, 0xe9, 0x42, 0xac, + 0x6f, 0xc1, 0x70, 0xea, 0x90, 0x90, 0x50, 0x04, 0x05, 0x05, 0xb1, 0xf2, + 0x88, 0x88, 0x88, 0xc8, 0x37, 0x9f, 0x8f, 0x58, 0x05, 0x44, 0x44, 0x44, + 0xe4, 0xcd, 0x74, 0x5d, 0x47, 0x68, 0x68, 0x28, 0x1e, 0xfb, 0xdd, 0x93, + 0x48, 0x48, 0x4c, 0x6c, 0xd3, 0x6d, 0xdf, 0x32, 0x64, 0x28, 0xae, 0xbc, + 0xfa, 0x1a, 0xb7, 0xcd, 0x73, 0xa7, 0xaa, 0x2a, 0xb6, 0x6d, 0xdd, 0x82, + 0x99, 0xd3, 0xa6, 0x1a, 0x5e, 0x58, 0x44, 0x51, 0x15, 0x8c, 0x1c, 0x35, + 0x1a, 0xf1, 0x5d, 0xbb, 0xf2, 0xe2, 0x9f, 0x81, 0xc9, 0x64, 0xc6, 0x2f, + 0xeb, 0xd7, 0x61, 0xe6, 0xcc, 0xe9, 0x86, 0x7b, 0x6d, 0x0a, 0x21, 0x70, + 0xef, 0xf0, 0x11, 0x48, 0x48, 0x48, 0x64, 0x05, 0x12, 0x11, 0x11, 0x91, + 0x4f, 0x62, 0x00, 0x48, 0x44, 0x44, 0x44, 0x5e, 0x4f, 0xd3, 0x34, 0xf4, + 0xee, 0xd3, 0x07, 0x23, 0x46, 0xde, 0x0f, 0x93, 0xa9, 0x6d, 0x66, 0x38, + 0x49, 0x4e, 0x4e, 0xc1, 0x88, 0xfb, 0xc7, 0x20, 0x38, 0x38, 0xd8, 0xd0, + 0x02, 0x23, 0xad, 0x71, 0xec, 0x58, 0x05, 0x3e, 0x9a, 0x39, 0x03, 0x25, + 0x25, 0xc5, 0x86, 0xcb, 0x5c, 0x73, 0xcd, 0x75, 0xb8, 0xf3, 0xae, 0x7b, + 0x9a, 0x5e, 0xc5, 0xb7, 0xb3, 0x3e, 0xd8, 0x2a, 0x0a, 0xca, 0xcb, 0xcb, + 0xf0, 0xc1, 0xa4, 0x77, 0x51, 0x7e, 0xf4, 0xa8, 0xe1, 0x72, 0xb7, 0x0c, + 0x1d, 0x86, 0xdb, 0xef, 0xb8, 0x0b, 0x3a, 0xeb, 0x94, 0x88, 0x88, 0x88, + 0x7c, 0xf5, 0x39, 0x89, 0x55, 0x40, 0x44, 0x44, 0x44, 0xbe, 0xe2, 0xf6, + 0x3b, 0xee, 0xc2, 0x65, 0x97, 0x5f, 0x71, 0xce, 0xdb, 0xb1, 0x58, 0x2c, + 0x98, 0xf8, 0xd8, 0xe3, 0xc8, 0xcc, 0xcc, 0x74, 0xdb, 0xc2, 0x1f, 0x00, + 0xf0, 0xf3, 0x8a, 0x15, 0x58, 0xb6, 0xec, 0x07, 0xc3, 0x3d, 0xd5, 0xba, + 0x76, 0x4d, 0xc0, 0x83, 0x63, 0x1f, 0x46, 0x50, 0x70, 0x10, 0x20, 0xbd, + 0xef, 0xfa, 0x48, 0x48, 0xb7, 0x1e, 0xb6, 0xa6, 0x69, 0x98, 0x37, 0xf7, + 0x63, 0xac, 0x5e, 0xb5, 0xd2, 0x70, 0x99, 0xb4, 0xb4, 0x74, 0x3c, 0x32, + 0xf1, 0x31, 0x58, 0xad, 0x56, 0xe8, 0xba, 0x64, 0x23, 0x22, 0x22, 0x22, + 0x22, 0x9f, 0xc4, 0x00, 0x90, 0x88, 0x88, 0x88, 0x7c, 0x46, 0x44, 0x64, + 0x24, 0x46, 0x8d, 0x7e, 0x00, 0x91, 0x91, 0x51, 0xe7, 0xb4, 0x9d, 0x21, + 0x43, 0x87, 0xe1, 0xc6, 0x9b, 0x6f, 0x81, 0xd3, 0xe9, 0x74, 0xcf, 0x03, + 0x98, 0xa2, 0xe0, 0xd0, 0xa1, 0x3c, 0x4c, 0x9b, 0x32, 0x19, 0x75, 0xb5, + 0xc6, 0x56, 0xd0, 0x15, 0x42, 0xe0, 0xee, 0x7b, 0xef, 0xc3, 0xf9, 0x17, + 0x0e, 0x82, 0x10, 0xc2, 0xeb, 0xae, 0x8d, 0x94, 0x12, 0x07, 0x0f, 0x1c, + 0x40, 0x79, 0x79, 0xb9, 0x5b, 0xb6, 0x2f, 0x84, 0xc0, 0xb6, 0xad, 0x5b, + 0x30, 0x7f, 0xde, 0x5c, 0xc3, 0x3d, 0x36, 0x03, 0x03, 0x03, 0x31, 0x7e, + 0xe2, 0xa3, 0xe8, 0xde, 0xa3, 0x87, 0x5b, 0x83, 0x5e, 0x22, 0x22, 0x22, + 0xa2, 0xf6, 0xc6, 0x00, 0x90, 0x88, 0x88, 0x88, 0x7c, 0xca, 0xa5, 0x97, + 0x5d, 0x8e, 0x3b, 0xee, 0xbe, 0xbb, 0xd5, 0xe5, 0xd3, 0xbb, 0x77, 0xc7, + 0xd8, 0x71, 0xe3, 0xe1, 0xe7, 0xe7, 0xef, 0x96, 0xa1, 0xbf, 0x42, 0x08, + 0xe8, 0xba, 0x86, 0x19, 0xd3, 0xa6, 0x62, 0xcf, 0x9e, 0xdd, 0x86, 0xcb, + 0x5d, 0x76, 0xf9, 0x15, 0xb8, 0x77, 0xf8, 0x08, 0x98, 0x4c, 0x26, 0x48, + 0xe9, 0x95, 0x1d, 0x00, 0xb1, 0x73, 0xc7, 0x76, 0x2c, 0x9c, 0x3f, 0xd7, + 0x2d, 0x2b, 0x2a, 0xd7, 0xd4, 0x54, 0x63, 0xe6, 0xf4, 0xa9, 0x28, 0x2c, + 0x28, 0x30, 0xf6, 0x10, 0x2c, 0x14, 0x5c, 0xf7, 0xdb, 0xeb, 0x71, 0xf5, + 0x35, 0xd7, 0x35, 0x5e, 0xe7, 0x16, 0x66, 0xaa, 0x82, 0x4d, 0x8d, 0x88, + 0x88, 0x88, 0xbc, 0x88, 0x89, 0x55, 0x40, 0x44, 0x44, 0x44, 0xbe, 0x42, + 0x4a, 0x09, 0xb3, 0xd9, 0x8c, 0x91, 0x23, 0x47, 0xe3, 0x97, 0x75, 0x6b, + 0xb1, 0x7d, 0xdb, 0xb6, 0x16, 0x95, 0x0f, 0x08, 0x08, 0xc0, 0x7d, 0xc3, + 0x47, 0x21, 0x25, 0x25, 0xd5, 0x6d, 0xc7, 0xa8, 0xaa, 0x2a, 0xbe, 0xfc, + 0xe2, 0x4b, 0x2c, 0x98, 0xff, 0x89, 0xe1, 0x32, 0xe1, 0x11, 0x11, 0x98, + 0xf0, 0xc8, 0xa3, 0x88, 0x89, 0xe9, 0xd2, 0xd8, 0x53, 0x4d, 0x34, 0xf6, + 0x5e, 0xb3, 0x5a, 0xad, 0x50, 0x55, 0xf5, 0xec, 0xf5, 0x01, 0xc0, 0x6c, + 0xb1, 0x74, 0x98, 0xeb, 0xa3, 0xeb, 0x3a, 0x16, 0x2e, 0x98, 0x8f, 0x2b, + 0xae, 0xbc, 0x0a, 0x17, 0x0c, 0x1a, 0x0c, 0xdd, 0xe0, 0xc2, 0x27, 0x46, + 0x7c, 0xff, 0xed, 0xb7, 0x58, 0xb1, 0x7c, 0xb9, 0xe1, 0xcf, 0x77, 0x4d, + 0x4c, 0xc4, 0x03, 0x0f, 0x3e, 0x84, 0xf0, 0xf0, 0x70, 0xe8, 0xba, 0x0e, + 0x21, 0x14, 0x04, 0x06, 0x06, 0x22, 0x20, 0x20, 0xa0, 0xc9, 0x45, 0x5f, + 0x5c, 0x2e, 0x17, 0xcc, 0x16, 0xb3, 0xdb, 0xe6, 0x85, 0x24, 0x22, 0x22, + 0x22, 0x72, 0x07, 0x06, 0x80, 0x44, 0x44, 0x44, 0xe4, 0x53, 0x34, 0x4d, + 0x43, 0x52, 0xb7, 0x6e, 0x78, 0xf4, 0xb1, 0x27, 0xf0, 0xa7, 0x3f, 0xfc, + 0x0e, 0xd5, 0xd5, 0xd5, 0x86, 0xcb, 0x0e, 0x1a, 0x7c, 0x31, 0x6e, 0x19, + 0x32, 0xf4, 0x78, 0x2f, 0xbb, 0xb6, 0x0f, 0x78, 0x14, 0x45, 0x41, 0x6e, + 0x4e, 0x0e, 0xa6, 0x7d, 0x38, 0x19, 0x2e, 0x83, 0xc3, 0x8b, 0x55, 0x55, + 0xc5, 0xc3, 0xe3, 0xc6, 0xe3, 0xd2, 0x2b, 0xae, 0x84, 0xe6, 0x72, 0x41, + 0x51, 0x14, 0x04, 0x06, 0x04, 0xe2, 0xf9, 0x17, 0xfe, 0x1f, 0x6a, 0xeb, + 0x6a, 0x9b, 0x1d, 0x0e, 0x9c, 0x94, 0xd4, 0xcd, 0x6d, 0xab, 0x18, 0xb7, + 0x46, 0x59, 0x69, 0x29, 0xde, 0x79, 0xfb, 0x2d, 0xfc, 0xe7, 0xad, 0xee, + 0x08, 0x8f, 0x88, 0x84, 0xae, 0x9f, 0x5b, 0x08, 0x68, 0x32, 0x99, 0x90, + 0x9d, 0xb5, 0x0f, 0x53, 0x3e, 0xfc, 0x00, 0x36, 0xbb, 0xcd, 0x50, 0x19, + 0x8b, 0xc5, 0x0f, 0x0f, 0x8e, 0x7d, 0x08, 0xfd, 0x06, 0x0c, 0x80, 0xd4, + 0x25, 0x54, 0x55, 0x45, 0x97, 0x2e, 0x5d, 0xf0, 0xfc, 0x8b, 0x2f, 0xa1, + 0xbe, 0xbe, 0xae, 0xc9, 0xb2, 0x52, 0x4a, 0xa4, 0xa6, 0xa7, 0x73, 0xc8, + 0x30, 0x11, 0x11, 0x11, 0x79, 0x15, 0x06, 0x80, 0x44, 0x44, 0x44, 0xe4, + 0x73, 0x1c, 0x0e, 0x07, 0x2e, 0xbf, 0xf2, 0x4a, 0xdc, 0x7d, 0xef, 0x70, + 0x4c, 0x9b, 0x32, 0xd9, 0x50, 0x98, 0x17, 0x1d, 0x13, 0x83, 0x87, 0xc7, + 0x4d, 0x40, 0x54, 0x74, 0x0c, 0x34, 0xcd, 0x3d, 0xe1, 0x4e, 0x7d, 0x7d, + 0x3d, 0xe6, 0xcc, 0x9e, 0x85, 0x3d, 0x7b, 0xf7, 0x18, 0x2e, 0x93, 0x91, + 0x99, 0x89, 0x0b, 0x2e, 0x18, 0x84, 0xdc, 0x9c, 0xfd, 0x27, 0xcf, 0x43, + 0x40, 0x20, 0x2a, 0x26, 0x1a, 0xd1, 0x22, 0xa6, 0xc9, 0xb1, 0xc0, 0x12, + 0x12, 0x61, 0x61, 0x61, 0xad, 0x9a, 0x33, 0x50, 0x08, 0x05, 0x71, 0x71, + 0x71, 0x50, 0x4d, 0x6a, 0xb3, 0xe3, 0x8d, 0x85, 0x00, 0x8e, 0x1e, 0x2d, + 0x6f, 0x36, 0x3c, 0x3b, 0x61, 0xcd, 0xaa, 0x95, 0x98, 0x33, 0xe7, 0x23, + 0x3c, 0xfa, 0xd8, 0xef, 0x20, 0x84, 0x68, 0x75, 0xd8, 0xaa, 0x28, 0x0a, + 0x6a, 0x6a, 0xaa, 0xf1, 0xfe, 0xbb, 0xef, 0xe0, 0x40, 0x6e, 0x8e, 0xe1, + 0x72, 0x99, 0x7d, 0xfb, 0xe2, 0xfc, 0x0b, 0x07, 0x21, 0xef, 0xe0, 0xc1, + 0x93, 0xc3, 0x91, 0x05, 0x04, 0xa2, 0x63, 0xa2, 0x21, 0x10, 0xd3, 0x64, + 0x59, 0x29, 0x75, 0x84, 0x06, 0x87, 0xb2, 0x07, 0x20, 0x11, 0x11, 0x11, + 0x79, 0x15, 0x06, 0x80, 0x44, 0x44, 0x44, 0xe4, 0x93, 0x54, 0x55, 0xc5, + 0x1d, 0x77, 0xdd, 0x8d, 0xef, 0xbf, 0xfb, 0x06, 0x05, 0xf9, 0xf9, 0xcd, + 0x7e, 0x7e, 0xc8, 0xd0, 0x5b, 0x71, 0xf1, 0x25, 0x97, 0xba, 0xad, 0x67, + 0x97, 0x94, 0x12, 0x1b, 0x37, 0xfc, 0x82, 0x6f, 0xbe, 0x5e, 0xdc, 0xa2, + 0xa1, 0xaf, 0xd9, 0x59, 0x59, 0x98, 0x30, 0xee, 0xa1, 0xc6, 0x94, 0xad, + 0xc5, 0x3b, 0x05, 0xc6, 0x3f, 0xf2, 0x08, 0xee, 0x1f, 0xf3, 0x60, 0x93, + 0x43, 0x85, 0xcf, 0x24, 0x32, 0x2a, 0x12, 0x6f, 0xfc, 0xe7, 0x6d, 0xa4, + 0xa5, 0xa5, 0x41, 0x6b, 0xe2, 0x78, 0x05, 0x00, 0xa1, 0x28, 0xf8, 0xf2, + 0x8b, 0xcf, 0xf0, 0xfa, 0x6b, 0xaf, 0x1a, 0x3e, 0xb7, 0x4f, 0xe6, 0xcc, + 0xc6, 0xe0, 0xc1, 0x17, 0x63, 0xd0, 0x45, 0x83, 0x9b, 0xdc, 0x7e, 0x53, + 0x14, 0x45, 0xc1, 0x37, 0x4b, 0xbe, 0xc6, 0xb7, 0xdf, 0x7e, 0xd3, 0xa2, + 0x72, 0x7b, 0x76, 0xef, 0xc2, 0x03, 0xf7, 0x8f, 0x6c, 0x79, 0x88, 0x27, + 0x01, 0x97, 0xe6, 0xc2, 0xb3, 0xcf, 0x3d, 0x8f, 0xfb, 0x46, 0x8c, 0x82, + 0xc3, 0xe1, 0x60, 0x43, 0x23, 0x22, 0x22, 0x22, 0xaf, 0xc0, 0x00, 0x90, + 0x88, 0x88, 0x88, 0x7c, 0x96, 0xbf, 0xbf, 0x3f, 0xfc, 0xfd, 0xad, 0x86, + 0x3e, 0x9b, 0x90, 0x98, 0x04, 0x21, 0xdc, 0x33, 0x54, 0x56, 0x08, 0x81, + 0xca, 0xca, 0x4a, 0x4c, 0xfd, 0x70, 0x32, 0xca, 0xca, 0x4a, 0x5b, 0x54, + 0xd6, 0x66, 0xb3, 0xc1, 0x66, 0xb3, 0xb5, 0x7a, 0xdf, 0x0d, 0x0d, 0x0d, + 0xad, 0x2a, 0xa7, 0x2a, 0x0a, 0x22, 0xc2, 0x23, 0x10, 0x15, 0x15, 0x6d, + 0x28, 0xa0, 0xbb, 0xf3, 0xae, 0x7b, 0xb1, 0x7e, 0xed, 0x3a, 0xac, 0xf8, + 0x71, 0x99, 0xa1, 0xed, 0x97, 0x95, 0x95, 0x62, 0xc6, 0xf4, 0x29, 0x48, + 0x49, 0x4d, 0x45, 0x44, 0x44, 0x64, 0xab, 0xea, 0x74, 0xef, 0xde, 0x3d, + 0x98, 0x36, 0x65, 0x32, 0x1c, 0x0e, 0xbb, 0x87, 0xeb, 0xd4, 0xe6, 0x95, + 0x2b, 0x31, 0x13, 0x11, 0x11, 0x51, 0xe7, 0xc5, 0x55, 0x80, 0x89, 0x88, + 0x88, 0x88, 0x00, 0xc0, 0x4d, 0x43, 0x3a, 0x4f, 0x0c, 0x71, 0x9d, 0x33, + 0x7b, 0x16, 0xd6, 0xad, 0x5d, 0xed, 0x3d, 0xd5, 0x71, 0xca, 0x8f, 0x11, + 0xc1, 0xc1, 0xc1, 0x18, 0xf3, 0xe0, 0x58, 0xc4, 0xc6, 0xc5, 0x19, 0xac, + 0x6e, 0x89, 0x55, 0x3f, 0xaf, 0xc4, 0xf2, 0xa5, 0x4b, 0x5b, 0x35, 0x9c, + 0xb6, 0xa1, 0xbe, 0x1e, 0x0b, 0x3e, 0x99, 0x8b, 0x83, 0x07, 0x0e, 0xb4, + 0x5b, 0xfd, 0x10, 0x11, 0x11, 0x11, 0x79, 0x0b, 0x06, 0x80, 0x44, 0x44, + 0x44, 0x44, 0x6e, 0x64, 0x36, 0x5b, 0xb0, 0x76, 0xcd, 0x6a, 0x7c, 0x34, + 0x73, 0xba, 0xcf, 0x9f, 0xeb, 0x85, 0x83, 0x2e, 0xc2, 0x6d, 0x77, 0xdc, + 0x69, 0xb8, 0x77, 0x5c, 0x43, 0x43, 0x3d, 0x66, 0x4c, 0x9b, 0x82, 0xbc, + 0xbc, 0x83, 0x2d, 0x5a, 0xa8, 0x44, 0x55, 0x55, 0xac, 0x5a, 0xb5, 0x12, + 0x5f, 0x7c, 0xfe, 0x69, 0xab, 0x87, 0x0f, 0x13, 0x11, 0x11, 0x11, 0x75, + 0x26, 0x0c, 0x00, 0x89, 0x88, 0x88, 0x88, 0xdc, 0xf5, 0xa0, 0xa5, 0x28, + 0x28, 0x2c, 0x2c, 0xc0, 0xa4, 0x77, 0xdf, 0x42, 0xe5, 0xb1, 0x63, 0x3e, + 0x7f, 0xbe, 0x16, 0x8b, 0x05, 0xf7, 0x0d, 0x1f, 0x89, 0x01, 0xe7, 0x0d, + 0x34, 0x5c, 0x26, 0x27, 0x67, 0x3f, 0x3e, 0x5b, 0xb4, 0x10, 0x8a, 0xa2, + 0x1a, 0xae, 0xd3, 0x92, 0xe2, 0x62, 0x4c, 0x99, 0xfc, 0x3e, 0xaa, 0xaa, + 0xaa, 0x78, 0x93, 0x11, 0x11, 0x11, 0x11, 0x19, 0x79, 0x86, 0x62, 0x15, + 0x10, 0x11, 0x11, 0x11, 0xb9, 0x87, 0xc3, 0xe1, 0xc0, 0x57, 0x5f, 0x7c, + 0x8e, 0xad, 0x5b, 0xb7, 0x7a, 0xdf, 0xc1, 0x4b, 0xc0, 0xe5, 0x74, 0xc2, + 0xe9, 0x70, 0xc0, 0xe9, 0x74, 0x34, 0xfe, 0xbf, 0x99, 0x1f, 0xbb, 0xcd, + 0x86, 0xb8, 0xb8, 0x78, 0x8c, 0x7d, 0x68, 0x1c, 0xfc, 0xfd, 0xfd, 0x0d, + 0xef, 0xea, 0x87, 0xef, 0xbf, 0x45, 0xe9, 0x91, 0x92, 0x66, 0x7b, 0x01, + 0x0a, 0x21, 0xa0, 0xeb, 0x3a, 0xa6, 0x4f, 0x9b, 0x82, 0x6d, 0x5b, 0xb7, + 0xf0, 0x06, 0x23, 0x22, 0x22, 0x22, 0x32, 0x88, 0x8b, 0x80, 0x10, 0x11, + 0x11, 0x11, 0xb9, 0xc9, 0xae, 0x5d, 0x3b, 0xf1, 0xc9, 0xc7, 0x1f, 0xc1, + 0xe9, 0x85, 0xab, 0xc5, 0xd6, 0xd6, 0xd6, 0xe0, 0xfd, 0x49, 0xef, 0x20, + 0x2c, 0x2c, 0xbc, 0xc5, 0x73, 0xf4, 0x09, 0x00, 0x41, 0x41, 0xc1, 0x86, + 0x17, 0xda, 0xc8, 0x3f, 0x74, 0x08, 0xb9, 0xb9, 0x39, 0x88, 0x89, 0x8d, + 0x85, 0xae, 0xeb, 0x67, 0xfd, 0x9c, 0xa2, 0x28, 0x58, 0xfa, 0xfd, 0x77, + 0x98, 0x3f, 0x6f, 0x2e, 0x6f, 0x2e, 0x22, 0x22, 0x22, 0xa2, 0x16, 0x60, + 0x00, 0x48, 0x44, 0x44, 0x44, 0xe4, 0x06, 0x0d, 0xf5, 0xf5, 0x98, 0x35, + 0x63, 0x1a, 0x0a, 0x0a, 0x0a, 0xbc, 0xf2, 0xf8, 0xeb, 0xeb, 0xeb, 0xf1, + 0xcd, 0xd7, 0x8b, 0x3d, 0xb2, 0x2f, 0x4d, 0xd3, 0x50, 0x56, 0x56, 0x8a, + 0xa6, 0x66, 0x0e, 0x14, 0x42, 0xa0, 0xa8, 0xb0, 0x10, 0xd3, 0xa6, 0x7e, + 0x88, 0xda, 0x9a, 0x1a, 0xde, 0x60, 0x44, 0x44, 0x44, 0x44, 0x2d, 0xc0, + 0x21, 0xc0, 0x44, 0x44, 0x44, 0x44, 0x6d, 0xcc, 0x6c, 0xb6, 0xe0, 0xf3, + 0xcf, 0x3e, 0xc5, 0xb7, 0x4b, 0x96, 0xb0, 0x32, 0x0c, 0xd2, 0x35, 0x0d, + 0x68, 0x62, 0xf1, 0x10, 0x87, 0xc3, 0x81, 0x85, 0x0b, 0xe6, 0x63, 0xfb, + 0xb6, 0xad, 0xac, 0x2c, 0x22, 0x22, 0x22, 0xa2, 0x16, 0x62, 0x0f, 0x40, + 0x22, 0x22, 0x22, 0xa2, 0x36, 0xa4, 0x9a, 0x4c, 0xd8, 0xb5, 0x73, 0x3b, + 0xa6, 0x4e, 0x99, 0x0c, 0x5d, 0x37, 0xb6, 0x42, 0xad, 0xa2, 0x28, 0x50, + 0x55, 0x13, 0x00, 0x23, 0x43, 0x6d, 0x05, 0x00, 0x09, 0x97, 0xcb, 0xd5, + 0xe2, 0xa1, 0xb9, 0x1d, 0x95, 0x10, 0x02, 0x21, 0xa1, 0x61, 0xc0, 0x59, + 0xce, 0x47, 0x08, 0x81, 0x3d, 0x7b, 0x76, 0xe3, 0xd3, 0x45, 0xf3, 0xe1, + 0x30, 0x38, 0x9c, 0xba, 0x65, 0x75, 0xda, 0xc8, 0x97, 0xea, 0x94, 0x88, + 0x88, 0x88, 0xe8, 0x54, 0x0c, 0x00, 0x89, 0x88, 0x88, 0x88, 0xda, 0x88, + 0x10, 0x0a, 0xaa, 0xab, 0xaa, 0xf0, 0xc1, 0xfb, 0xef, 0xa1, 0xb0, 0x20, + 0xdf, 0x70, 0xb9, 0x4b, 0x2e, 0xbd, 0x0c, 0xbf, 0xf9, 0xed, 0x0d, 0xd0, + 0xa5, 0x6e, 0x60, 0x1f, 0x02, 0x4e, 0x87, 0x13, 0x93, 0xdf, 0x7f, 0x0f, + 0x47, 0x8f, 0x96, 0xf9, 0x44, 0xbd, 0x45, 0x44, 0x44, 0x20, 0x25, 0x25, + 0xf5, 0x8c, 0xf3, 0xff, 0x09, 0xa5, 0xb1, 0x4e, 0xdf, 0x7f, 0xf7, 0x6d, + 0x1c, 0x3e, 0x7c, 0xd8, 0xf0, 0x36, 0x2f, 0xbf, 0xf2, 0x2a, 0x5c, 0x73, + 0xed, 0x6f, 0x0c, 0x87, 0xb0, 0x95, 0x95, 0x95, 0x98, 0x3b, 0xfb, 0x23, + 0x94, 0x95, 0x95, 0xf2, 0x46, 0x26, 0x22, 0x22, 0x22, 0x9f, 0xc3, 0x00, + 0x90, 0x88, 0x88, 0x88, 0xa8, 0x8d, 0xe8, 0xba, 0x86, 0x25, 0x5f, 0x7f, + 0x85, 0x15, 0xcb, 0x97, 0x19, 0x2e, 0x93, 0x98, 0x94, 0x84, 0x3f, 0x3e, + 0xf5, 0x34, 0xce, 0x3b, 0xef, 0x7c, 0xe8, 0x7a, 0xf3, 0xbd, 0xcf, 0x14, + 0x45, 0xa0, 0xa6, 0xa6, 0x06, 0x8b, 0x16, 0xce, 0xf3, 0x99, 0x00, 0xf0, + 0xf2, 0x2b, 0xae, 0x42, 0x62, 0x52, 0xd2, 0x19, 0x03, 0x40, 0x55, 0x08, + 0xcc, 0xff, 0xe4, 0x63, 0xac, 0xf8, 0x71, 0xb9, 0xe1, 0xed, 0xa5, 0xa4, + 0xa5, 0xe3, 0x99, 0xe7, 0x5e, 0x40, 0x9f, 0x3e, 0x99, 0xd0, 0x74, 0xad, + 0xf9, 0x4e, 0x80, 0x02, 0x28, 0xc8, 0x3f, 0x84, 0x6f, 0xbe, 0x5e, 0xcc, + 0x00, 0x90, 0x88, 0x88, 0x88, 0x7c, 0x12, 0x03, 0x40, 0x22, 0x22, 0x22, + 0xa2, 0x36, 0x92, 0x7f, 0xe8, 0x10, 0x3e, 0x9e, 0xfd, 0x11, 0xea, 0xeb, + 0xeb, 0x0d, 0x7d, 0xde, 0xdf, 0xdf, 0x1f, 0x23, 0x46, 0x8d, 0x46, 0xcf, + 0x9e, 0xbd, 0x5b, 0x34, 0xb4, 0xd5, 0xe5, 0x72, 0x41, 0xea, 0xbe, 0x31, + 0x54, 0x35, 0x3a, 0x3a, 0x1a, 0xc3, 0x47, 0x8e, 0x82, 0xaa, 0xaa, 0xd0, + 0xb4, 0xd3, 0x7b, 0xeb, 0x99, 0xcd, 0x66, 0xfc, 0xb2, 0x7e, 0x1d, 0xa6, + 0x4f, 0x9d, 0x62, 0x78, 0x68, 0xae, 0xc9, 0x6c, 0xc2, 0x23, 0x13, 0x26, + 0xa2, 0x47, 0x8f, 0x9e, 0xb0, 0xdb, 0x6d, 0x86, 0x8f, 0x83, 0xc3, 0x7f, + 0x89, 0x88, 0x88, 0xc8, 0x97, 0x71, 0x11, 0x10, 0x22, 0x22, 0x22, 0xa2, + 0x36, 0xe0, 0x70, 0x38, 0x30, 0x6b, 0xe6, 0x74, 0xec, 0xdd, 0xb3, 0xdb, + 0x70, 0x99, 0x01, 0xe7, 0x9d, 0x8f, 0x5b, 0x86, 0x0c, 0x85, 0xd9, 0x6c, + 0xee, 0x94, 0x75, 0xe6, 0x6f, 0xb5, 0x62, 0xd4, 0x98, 0x07, 0xd0, 0xaf, + 0xff, 0x80, 0x5f, 0x85, 0x7f, 0x42, 0x08, 0x94, 0x95, 0x96, 0x62, 0xfa, + 0xd4, 0x0f, 0x5b, 0xd4, 0xd3, 0x71, 0xc8, 0x2d, 0xb7, 0xe2, 0xe6, 0xa1, + 0xb7, 0xfe, 0x6a, 0x7b, 0x44, 0x44, 0x44, 0x44, 0x9d, 0x19, 0x03, 0x40, + 0x22, 0x22, 0x22, 0xa2, 0x73, 0x64, 0x36, 0x9b, 0xb0, 0x72, 0xe5, 0x4f, + 0xf8, 0xf2, 0x8b, 0xcf, 0x0c, 0x97, 0x89, 0x88, 0x88, 0xc0, 0xb8, 0x09, + 0x13, 0x11, 0x1f, 0xdf, 0xb5, 0x53, 0xf6, 0x3c, 0x0b, 0x0d, 0x0d, 0xc5, + 0xe8, 0x31, 0x0f, 0x62, 0xf4, 0x98, 0xb1, 0x50, 0x94, 0x5f, 0x3f, 0x92, + 0x6a, 0x9a, 0x86, 0xef, 0xbe, 0xfb, 0x06, 0xab, 0x7e, 0xfe, 0xd9, 0xf0, + 0x36, 0xd3, 0xd2, 0xd3, 0x31, 0x66, 0xec, 0x43, 0x9d, 0x36, 0x50, 0x25, + 0x22, 0x22, 0x22, 0x3a, 0x1b, 0x0e, 0x01, 0x26, 0x22, 0x22, 0x22, 0x9f, + 0x25, 0xa5, 0x34, 0x3c, 0xb4, 0x56, 0xd3, 0x34, 0x08, 0xd1, 0xf2, 0x7d, + 0xa8, 0xaa, 0x8a, 0xec, 0xec, 0x6c, 0xfc, 0xfb, 0x9f, 0xaf, 0xa3, 0xa6, + 0xba, 0xda, 0x70, 0xb9, 0x7b, 0xee, 0x1b, 0x81, 0x4b, 0x2f, 0xbb, 0xac, + 0x95, 0x3d, 0xd5, 0x24, 0x1c, 0x4e, 0x83, 0xe7, 0xe5, 0xd2, 0x70, 0xea, + 0x24, 0x78, 0x9a, 0xe6, 0x82, 0xcb, 0xe5, 0x6a, 0xb7, 0x6b, 0xa2, 0xaa, + 0x2a, 0x06, 0x9c, 0x37, 0x10, 0xf7, 0xdc, 0x37, 0x1c, 0xd7, 0xdf, 0x70, + 0x13, 0x02, 0x03, 0x03, 0x7f, 0x35, 0xf7, 0x9f, 0x10, 0x02, 0x7b, 0xf7, + 0xec, 0xc1, 0xb4, 0x29, 0x93, 0xd1, 0x60, 0x6b, 0x30, 0xb4, 0x5d, 0x45, + 0x51, 0x70, 0xdf, 0xf0, 0x91, 0xe8, 0xd9, 0xab, 0x57, 0xab, 0xef, 0x15, + 0x67, 0x4b, 0xee, 0x15, 0x36, 0x2f, 0x22, 0x22, 0x22, 0xf2, 0x22, 0x0c, + 0x00, 0x89, 0x88, 0x88, 0xc8, 0x67, 0x05, 0x06, 0x06, 0xe1, 0x86, 0x1b, + 0x6f, 0x46, 0x71, 0x71, 0x11, 0x44, 0x13, 0xe9, 0x9e, 0xae, 0xb9, 0x90, + 0x96, 0xde, 0xbd, 0x55, 0x61, 0x9c, 0xa6, 0x69, 0x38, 0x94, 0x97, 0x87, + 0x8c, 0xbe, 0x7d, 0x91, 0xd1, 0xb7, 0x5f, 0xb3, 0x9f, 0xd7, 0x75, 0x1d, + 0xd1, 0x51, 0x51, 0x18, 0xf3, 0xe0, 0x58, 0xa8, 0xaa, 0x7a, 0xc6, 0x85, + 0x2f, 0x9a, 0x22, 0xa5, 0x84, 0xaa, 0xaa, 0xb8, 0xf1, 0xa6, 0x5b, 0x50, + 0x58, 0x58, 0x00, 0x45, 0x51, 0x9b, 0xfc, 0x7c, 0xef, 0x8c, 0x0c, 0x08, + 0xa1, 0x9c, 0xdc, 0x77, 0xef, 0xde, 0x19, 0xb8, 0xfd, 0xce, 0xbb, 0xa0, + 0x69, 0xba, 0x47, 0xaf, 0x85, 0xaa, 0x28, 0xe8, 0x12, 0x1b, 0x8b, 0x81, + 0x03, 0xcf, 0x47, 0xbf, 0x01, 0x03, 0x10, 0x1a, 0x1a, 0x76, 0xd6, 0xf3, + 0xd7, 0x75, 0x1d, 0x25, 0x25, 0xc5, 0xe8, 0xd7, 0x7f, 0x00, 0x06, 0x9c, + 0x77, 0xbe, 0xa1, 0xed, 0x77, 0xed, 0xda, 0x15, 0xb7, 0x0c, 0x19, 0x0a, + 0x55, 0x35, 0xb5, 0xaa, 0x47, 0x65, 0x60, 0x60, 0x20, 0x6e, 0xb8, 0xe9, + 0xc4, 0xbd, 0xa2, 0x34, 0x71, 0xaf, 0x68, 0x48, 0xef, 0xde, 0x9d, 0x43, + 0x8c, 0x89, 0x88, 0x88, 0xc8, 0xab, 0x88, 0xec, 0x03, 0xf9, 0x9c, 0xed, + 0x98, 0x88, 0x3a, 0x1d, 0x29, 0x65, 0x93, 0x61, 0x00, 0x11, 0xf9, 0xc8, + 0x83, 0x0e, 0x00, 0x45, 0x55, 0x0d, 0xb5, 0x77, 0x5d, 0xd7, 0x5b, 0x1c, + 0xc6, 0x9d, 0xdc, 0x8f, 0x10, 0x50, 0x55, 0xb5, 0x45, 0xbf, 0x83, 0x74, + 0x5d, 0x3f, 0xa7, 0xa1, 0xbf, 0x6a, 0x2b, 0xcf, 0x4b, 0x28, 0x0a, 0x54, + 0xa5, 0x7d, 0x66, 0x81, 0x91, 0x52, 0x9e, 0x3c, 0xf7, 0xe6, 0x28, 0x8a, + 0x72, 0xc6, 0xa1, 0xc1, 0xee, 0xaa, 0x53, 0x21, 0x44, 0xe3, 0xbd, 0x62, + 0xe0, 0xb3, 0xe7, 0x72, 0xaf, 0x10, 0x51, 0x3b, 0xfc, 0xee, 0x81, 0x84, + 0x02, 0x05, 0x12, 0x7c, 0xf5, 0x25, 0xa2, 0xce, 0x8b, 0x3d, 0x00, 0x89, + 0x88, 0x88, 0xc8, 0x87, 0x5f, 0xfa, 0xe0, 0x91, 0x9e, 0x5a, 0x52, 0x4a, + 0x8f, 0x0f, 0xab, 0x6d, 0xed, 0x79, 0x49, 0x5d, 0x87, 0xcb, 0x0b, 0xc2, + 0x2b, 0x4f, 0x87, 0x6c, 0x52, 0x4a, 0x68, 0xed, 0x38, 0x34, 0x9a, 0x88, + 0x88, 0x88, 0xc8, 0x9d, 0xb8, 0x08, 0x08, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x91, 0x0f, 0x63, 0x00, 0x48, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe4, 0xc3, 0x18, 0x00, 0x12, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0xf9, 0x30, 0xce, 0x01, 0x48, 0x44, 0x44, + 0xe4, 0x85, 0x14, 0x45, 0x81, 0x10, 0x02, 0x0e, 0x87, 0xc3, 0x2d, 0x73, + 0xdc, 0xa9, 0xaa, 0xda, 0xa2, 0x45, 0x2d, 0x3c, 0x45, 0x55, 0x55, 0x48, + 0x29, 0xe1, 0x70, 0x38, 0x4e, 0xce, 0x0f, 0x67, 0x32, 0xa9, 0x30, 0x9b, + 0x2d, 0x86, 0x17, 0x97, 0x68, 0xae, 0x1e, 0x15, 0x45, 0x81, 0xc5, 0xe2, + 0x07, 0x21, 0xce, 0x7d, 0xfe, 0x40, 0x29, 0x25, 0x9c, 0x4e, 0xa7, 0xa1, + 0xcf, 0xf9, 0xf9, 0xf9, 0x35, 0x7b, 0x9c, 0x76, 0xbb, 0xdd, 0x0d, 0xf3, + 0xe2, 0x49, 0x98, 0x4c, 0xe6, 0x93, 0x75, 0xdb, 0xdc, 0x71, 0xba, 0x5c, + 0x4e, 0x18, 0x59, 0x67, 0xc3, 0x64, 0x32, 0xb5, 0x78, 0x11, 0x0f, 0xa7, + 0xc3, 0x01, 0x34, 0xb7, 0xb0, 0x89, 0x94, 0xb0, 0x9c, 0x52, 0x57, 0x42, + 0x08, 0xd8, 0x6d, 0xb6, 0xe6, 0xcb, 0x1d, 0xaf, 0x47, 0x93, 0xc9, 0x74, + 0xca, 0xb9, 0xb8, 0xce, 0x69, 0x21, 0x96, 0x96, 0x12, 0x42, 0xc0, 0xcf, + 0xcf, 0xef, 0xe4, 0x62, 0x28, 0x46, 0xcb, 0x28, 0x8a, 0x0a, 0x87, 0xc3, + 0xee, 0xf6, 0xf9, 0x2c, 0x55, 0x55, 0x85, 0xc5, 0x62, 0x39, 0xe7, 0x05, + 0x6a, 0x88, 0x88, 0x88, 0xa8, 0xe3, 0x61, 0x00, 0x48, 0x44, 0x44, 0xe4, + 0x65, 0x54, 0x55, 0x45, 0x75, 0x75, 0x15, 0x56, 0x1c, 0x00, 0xfe, 0x9c, + 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xaf, 0x5c, 0x89, 0xb5, + 0x6b, 0x57, 0xa3, 0xba, 0xaa, 0x0a, 0x40, 0xdb, 0xad, 0x6a, 0xad, 0xeb, + 0x3a, 0xba, 0x25, 0x27, 0x63, 0xfc, 0x23, 0x8f, 0x22, 0x28, 0x28, 0xa8, + 0x43, 0x04, 0x01, 0x27, 0x02, 0xb0, 0xdd, 0xbb, 0x76, 0xe1, 0x97, 0xf5, + 0x6b, 0x91, 0x9d, 0x9d, 0x85, 0xfa, 0xba, 0x7a, 0x08, 0x21, 0x10, 0x16, + 0x1e, 0x8e, 0xfe, 0xfd, 0x07, 0x60, 0xf0, 0xc5, 0x97, 0x20, 0x31, 0x29, + 0x09, 0x4e, 0xa7, 0xd3, 0xd0, 0x31, 0x9b, 0xcd, 0x66, 0x1c, 0xca, 0x3b, + 0x88, 0xb5, 0x6b, 0xd6, 0x60, 0xd7, 0xce, 0x1d, 0xa8, 0xaa, 0xaa, 0x82, + 0x10, 0x40, 0x40, 0x60, 0x20, 0x7a, 0xf5, 0xce, 0xc0, 0x45, 0x83, 0x07, + 0xa3, 0x77, 0xef, 0x3e, 0xe7, 0xb4, 0x18, 0xc5, 0x81, 0xdc, 0x1c, 0xcc, + 0x9c, 0x3e, 0x0d, 0xb5, 0xb5, 0xb5, 0xcd, 0x9e, 0xdf, 0x23, 0x8f, 0x3e, + 0x8e, 0x9e, 0xbd, 0x7a, 0xfd, 0x2a, 0xe4, 0x31, 0x9b, 0xcd, 0x38, 0x72, + 0xa4, 0x04, 0x3f, 0xaf, 0x58, 0x81, 0x8d, 0x1b, 0x37, 0xa0, 0xa1, 0xbe, + 0xbe, 0x4d, 0xeb, 0x56, 0xd3, 0x34, 0x64, 0xf6, 0xed, 0x8b, 0xb1, 0xe3, + 0xc6, 0xc3, 0xa4, 0x9a, 0xce, 0x5a, 0x77, 0x42, 0x08, 0x14, 0x16, 0x14, + 0x60, 0xfa, 0xd4, 0x0f, 0x71, 0xec, 0xd8, 0xb1, 0x66, 0xb6, 0x2a, 0x31, + 0xe2, 0xfe, 0x31, 0x18, 0x3c, 0xf8, 0x62, 0x43, 0x8b, 0xa3, 0x08, 0x21, + 0xb0, 0x75, 0xeb, 0x16, 0x7c, 0x34, 0x73, 0x3a, 0x9a, 0x5a, 0xa4, 0x53, + 0x4a, 0x1d, 0x11, 0x11, 0x91, 0x78, 0xfc, 0x89, 0x27, 0x11, 0x11, 0x11, + 0x09, 0x00, 0x70, 0xb9, 0x5c, 0x78, 0xe7, 0xad, 0xff, 0x43, 0x41, 0x41, + 0x41, 0x93, 0xab, 0x22, 0x0b, 0x21, 0x70, 0xe9, 0x65, 0x97, 0xe1, 0xd6, + 0xdb, 0xee, 0x80, 0xc9, 0x64, 0x42, 0x45, 0x45, 0x05, 0xa6, 0x4f, 0xf9, + 0x00, 0x87, 0x0f, 0x17, 0x79, 0x6c, 0x55, 0x78, 0x3f, 0x7f, 0x3f, 0x5c, + 0x7c, 0xf1, 0xa5, 0xb8, 0xfe, 0x86, 0x9b, 0x10, 0x18, 0x14, 0xd8, 0x6c, + 0xa0, 0xa7, 0xaa, 0x26, 0x54, 0x57, 0x57, 0x61, 0xd5, 0xca, 0x9f, 0xb1, + 0x7e, 0xed, 0x1a, 0x54, 0x55, 0x55, 0xb9, 0xf5, 0xf8, 0x82, 0x43, 0x42, + 0x30, 0xe8, 0xa2, 0xc1, 0xb8, 0xe6, 0x9a, 0x6b, 0x11, 0x12, 0x1a, 0xea, + 0xf1, 0x85, 0x6d, 0x88, 0x88, 0x88, 0xc8, 0x7d, 0x18, 0x00, 0x12, 0x11, + 0x11, 0x79, 0x11, 0x21, 0x04, 0x4a, 0x8f, 0x1c, 0xc1, 0x9b, 0x6f, 0xbc, + 0x8e, 0x6f, 0x97, 0x7c, 0x8d, 0x86, 0x86, 0x06, 0x48, 0x5d, 0xb6, 0x65, + 0xfe, 0x07, 0x29, 0x25, 0x84, 0x00, 0x22, 0xa3, 0xa2, 0xf0, 0xd0, 0xb8, + 0x09, 0x8d, 0xbd, 0xb2, 0xda, 0x91, 0xa2, 0x28, 0xa8, 0xa9, 0xa9, 0xc1, + 0xec, 0x99, 0x33, 0xf1, 0xf1, 0xc7, 0xb3, 0x50, 0x7e, 0xf4, 0x28, 0x34, + 0x5d, 0xc7, 0x89, 0x6e, 0x68, 0x42, 0x08, 0x2c, 0x9c, 0xff, 0x09, 0x52, + 0xd3, 0xd2, 0x31, 0x7e, 0xc2, 0xa3, 0xb8, 0xe1, 0xa6, 0x9b, 0x9a, 0xec, + 0xcd, 0x26, 0x84, 0x80, 0x04, 0xf0, 0xc9, 0xdc, 0x39, 0x98, 0x35, 0x7d, + 0x2a, 0x0e, 0x1c, 0x3c, 0x08, 0xed, 0x94, 0x9e, 0x60, 0x42, 0x08, 0xa8, + 0xaa, 0x8a, 0xe8, 0xe8, 0x2e, 0x18, 0xf3, 0xe0, 0x83, 0xb8, 0xfb, 0xde, + 0xe1, 0x08, 0x0c, 0x0c, 0x6c, 0x55, 0x10, 0x5a, 0x5e, 0x5e, 0x81, 0xa5, + 0x3f, 0x7c, 0x87, 0x8a, 0x8a, 0x8a, 0xb3, 0x86, 0x4c, 0x52, 0x4a, 0xa8, + 0xaa, 0x8a, 0x7b, 0xee, 0x1b, 0x0e, 0x45, 0x51, 0x4e, 0x0b, 0x85, 0x54, + 0x55, 0x45, 0x76, 0x56, 0x16, 0xfe, 0xf1, 0xea, 0x2b, 0x58, 0xb3, 0x7a, + 0x95, 0xa1, 0xde, 0x84, 0xad, 0xb9, 0xde, 0x3f, 0x2e, 0x5f, 0x8a, 0x84, + 0x84, 0x44, 0x0c, 0xbb, 0xe3, 0x4e, 0x38, 0xec, 0xf6, 0xb3, 0x7e, 0xb6, + 0xb2, 0xaa, 0x12, 0xcb, 0x97, 0x2f, 0x45, 0x71, 0x51, 0x51, 0x93, 0xe7, + 0x03, 0x00, 0x57, 0x5f, 0x7b, 0x1d, 0x84, 0xe1, 0x1e, 0x80, 0x02, 0xc5, + 0x45, 0x45, 0x58, 0xb2, 0xf8, 0xab, 0x93, 0xd7, 0xe0, 0x6c, 0xdb, 0x8e, + 0x8b, 0x8b, 0xc7, 0x43, 0xe3, 0x26, 0x00, 0x11, 0x27, 0xfe, 0x4c, 0xc7, + 0xca, 0x95, 0x3f, 0x63, 0xef, 0x9e, 0xdd, 0xcd, 0x06, 0x79, 0xa1, 0xa1, + 0xa1, 0x18, 0x72, 0xeb, 0x30, 0x00, 0x26, 0x34, 0xd4, 0xd7, 0xe3, 0xe7, + 0x9f, 0x7e, 0x42, 0x76, 0x76, 0x96, 0xc7, 0x02, 0x40, 0x00, 0x58, 0xfc, + 0xe5, 0x17, 0xd8, 0xbc, 0x79, 0x23, 0x9e, 0xfc, 0xc3, 0x9f, 0x11, 0x15, + 0x1d, 0x7d, 0xd6, 0x10, 0x50, 0x51, 0x14, 0x1c, 0x39, 0x52, 0x8c, 0xb7, + 0xfe, 0xfd, 0x26, 0xbe, 0xfc, 0xf2, 0x73, 0x38, 0xec, 0x76, 0xb7, 0x87, + 0xf1, 0x42, 0x08, 0x7c, 0xb6, 0x68, 0x01, 0x6e, 0xba, 0x65, 0x08, 0x9e, + 0xfc, 0xe3, 0x9f, 0x91, 0x90, 0x90, 0xe8, 0x91, 0x55, 0xb4, 0x89, 0x88, + 0x88, 0xc8, 0xfd, 0x18, 0x00, 0x12, 0x11, 0x11, 0x79, 0x91, 0xfa, 0xfa, + 0x7a, 0x7c, 0xf8, 0xc1, 0x24, 0x7c, 0xfe, 0xe9, 0xa2, 0xd3, 0x5f, 0xcc, + 0xdb, 0x38, 0x17, 0x90, 0x12, 0xf8, 0xf0, 0xfd, 0x49, 0xc8, 0xcc, 0xe8, + 0x8b, 0x41, 0x83, 0x07, 0xb7, 0x5b, 0x08, 0x20, 0x84, 0xc0, 0xd1, 0xb2, + 0x32, 0xfc, 0xe7, 0xdf, 0xff, 0xc2, 0xbc, 0x4f, 0xe6, 0x9e, 0xe5, 0x58, + 0x25, 0xec, 0x76, 0x3b, 0xf6, 0xee, 0xd9, 0x8d, 0xe7, 0x9f, 0x7b, 0x0a, + 0x15, 0xc7, 0xca, 0x71, 0xd7, 0xdd, 0xf7, 0x9e, 0x71, 0x48, 0xad, 0x10, + 0x02, 0x0d, 0xf5, 0xf5, 0x98, 0x32, 0xf9, 0x03, 0xbc, 0xff, 0xde, 0xdb, + 0x70, 0x9d, 0xe1, 0xbc, 0x4e, 0x0c, 0x25, 0x2e, 0x2a, 0x2a, 0xc4, 0xbf, + 0x5e, 0x7f, 0x0d, 0x65, 0xa5, 0x65, 0x98, 0xf0, 0xe8, 0x63, 0x08, 0x0e, + 0x0e, 0x6e, 0x5d, 0x5d, 0x9e, 0xb2, 0xdd, 0xb3, 0xd7, 0xf7, 0x99, 0x43, + 0xdc, 0x23, 0x47, 0x8e, 0xe0, 0xdf, 0x6f, 0xfc, 0x13, 0x2b, 0x7e, 0x5c, + 0xee, 0xd6, 0x7a, 0x76, 0x38, 0x1c, 0x78, 0xef, 0x9d, 0xb7, 0xd1, 0xa3, + 0x67, 0x2f, 0xf4, 0xe8, 0xd9, 0xb3, 0xc9, 0x1e, 0x8f, 0x27, 0x4e, 0xc3, + 0x9d, 0x61, 0x54, 0x73, 0x75, 0x75, 0x7a, 0x55, 0x09, 0x43, 0xc7, 0x24, + 0x20, 0x8e, 0x5f, 0x0b, 0xd1, 0xa2, 0x6b, 0xd3, 0xd6, 0x9c, 0x4e, 0x27, + 0xe6, 0xcd, 0xfd, 0x18, 0x7e, 0x7e, 0xfe, 0xf8, 0xc3, 0x9f, 0x9e, 0x42, + 0x40, 0x40, 0xc0, 0x19, 0xf7, 0x5f, 0x57, 0x57, 0x87, 0x19, 0xd3, 0xa6, + 0x62, 0xd1, 0xc2, 0xf9, 0x1e, 0x6b, 0x7f, 0x27, 0x86, 0xd7, 0x7f, 0xf1, + 0xd9, 0xa7, 0x08, 0x0e, 0x0e, 0xc6, 0x9f, 0x9e, 0x7a, 0x06, 0x56, 0x6b, + 0x00, 0x7f, 0xf1, 0x12, 0x11, 0x11, 0xf9, 0x00, 0x2e, 0x02, 0x42, 0x44, + 0x44, 0xe4, 0x25, 0x84, 0x10, 0xd8, 0x9f, 0x9d, 0x85, 0x2f, 0xbe, 0xf8, + 0xcc, 0x23, 0x81, 0x40, 0x59, 0x59, 0x29, 0xde, 0x7f, 0xff, 0x5d, 0x94, + 0x96, 0x96, 0xb6, 0x68, 0x2e, 0xb7, 0xb6, 0x64, 0xb7, 0xdb, 0x31, 0x67, + 0xf6, 0x2c, 0x2c, 0x5c, 0x30, 0xdf, 0xd0, 0xe7, 0xeb, 0x6a, 0x6b, 0xf1, + 0x9f, 0x37, 0xdf, 0xc0, 0xd2, 0x1f, 0xbe, 0x3f, 0x63, 0xaf, 0x2e, 0x97, + 0xcb, 0x89, 0x85, 0x0b, 0xe7, 0xe3, 0xc3, 0xc9, 0xef, 0x9f, 0x31, 0xfc, + 0xfb, 0x5f, 0x4e, 0xa7, 0x13, 0xb3, 0x66, 0x4e, 0xc7, 0xa7, 0x8b, 0x16, + 0x78, 0xfc, 0xdc, 0xa5, 0x94, 0xd8, 0xf0, 0xcb, 0x7a, 0xac, 0xfc, 0x79, + 0x85, 0x47, 0xf6, 0x97, 0x93, 0x93, 0x8d, 0xd9, 0xb3, 0x66, 0x34, 0x3b, + 0x5c, 0x99, 0xda, 0xc6, 0xa2, 0x05, 0xf3, 0xb0, 0x7c, 0xd9, 0x0f, 0x67, + 0x6d, 0xcb, 0x39, 0x39, 0xfb, 0xf1, 0xd5, 0x17, 0x9f, 0xb7, 0x5b, 0xf8, + 0xfe, 0xcd, 0xd7, 0x5f, 0x63, 0xe7, 0x8e, 0x1d, 0xbc, 0x50, 0x44, 0x44, + 0x44, 0x3e, 0x82, 0x01, 0x20, 0x11, 0x11, 0x91, 0xb7, 0x7c, 0x69, 0x2b, + 0x0a, 0xb6, 0x6e, 0xdd, 0x82, 0x63, 0x15, 0x15, 0x1e, 0xdb, 0xe7, 0xfa, + 0xb5, 0x6b, 0xb0, 0x70, 0xfe, 0x27, 0x70, 0x38, 0xec, 0x1e, 0x3f, 0x5f, + 0x21, 0x04, 0x7e, 0x59, 0xb7, 0x16, 0xf3, 0xe6, 0xce, 0x69, 0x51, 0x08, + 0x52, 0x5d, 0x5d, 0x85, 0x0f, 0xde, 0x7b, 0x07, 0x45, 0x87, 0x0f, 0xff, + 0x2a, 0xb8, 0xdc, 0x9f, 0xdd, 0x18, 0x72, 0xd9, 0xed, 0x36, 0xc3, 0xdb, + 0x73, 0x38, 0xec, 0xf8, 0xf0, 0x83, 0x49, 0xd8, 0xb8, 0x61, 0x03, 0x2c, + 0x16, 0x8b, 0xc7, 0xce, 0x5f, 0xd3, 0x34, 0x6c, 0xd9, 0xbc, 0x09, 0x0d, + 0x0d, 0x0d, 0x1e, 0xd9, 0x9f, 0x94, 0x12, 0x4b, 0x96, 0x2c, 0xc6, 0x8f, + 0xcb, 0x96, 0x72, 0x01, 0x08, 0x0f, 0xa8, 0xab, 0xab, 0xc3, 0x67, 0x8b, + 0x16, 0x9e, 0x71, 0x3e, 0x45, 0x29, 0x25, 0xf6, 0xed, 0xd9, 0x83, 0xd2, + 0xd2, 0x23, 0xed, 0x76, 0x7c, 0xc7, 0x8e, 0x55, 0x60, 0xe7, 0xce, 0xed, + 0x1c, 0x02, 0x4c, 0x44, 0x44, 0xe4, 0x2b, 0xef, 0x12, 0xac, 0x02, 0x22, + 0x22, 0x22, 0xef, 0x20, 0x84, 0xf0, 0x68, 0xf8, 0x07, 0x34, 0x0e, 0x0d, + 0x5d, 0x38, 0x7f, 0x1e, 0x76, 0xed, 0xda, 0xe5, 0xf1, 0x73, 0xad, 0xac, + 0xac, 0xc4, 0xb4, 0xa9, 0x93, 0x71, 0xf4, 0xe8, 0xd1, 0x16, 0x97, 0xcf, + 0xce, 0xce, 0xc2, 0x92, 0xaf, 0xbf, 0x82, 0x6a, 0xfa, 0xef, 0x6c, 0x27, + 0x52, 0xea, 0x58, 0xba, 0xf4, 0x7b, 0xe4, 0x1d, 0x3c, 0xd8, 0xe2, 0xed, + 0x1d, 0x2d, 0x2b, 0xc3, 0xa4, 0xf7, 0xde, 0xc2, 0x91, 0x92, 0x23, 0x1e, + 0xeb, 0x0d, 0x29, 0xa5, 0x44, 0x55, 0x55, 0xa5, 0x47, 0xeb, 0xbd, 0xba, + 0xaa, 0x0a, 0x33, 0xa6, 0x4f, 0x45, 0x71, 0x71, 0x91, 0x47, 0xe7, 0xc5, + 0xeb, 0xac, 0x0e, 0xe5, 0xe5, 0xa1, 0xa6, 0xba, 0xfa, 0x8c, 0x7f, 0x57, + 0x51, 0x51, 0xd1, 0xae, 0x41, 0xac, 0xae, 0xeb, 0x28, 0x3f, 0x7a, 0xd4, + 0x0d, 0xab, 0x4e, 0x13, 0x11, 0x11, 0x51, 0x7b, 0x60, 0x00, 0x48, 0x44, + 0x44, 0xe4, 0x45, 0x24, 0x3c, 0x1f, 0x08, 0x14, 0x14, 0xe4, 0x63, 0xca, + 0x07, 0x93, 0x50, 0x57, 0x57, 0xe7, 0x91, 0x50, 0xe8, 0xc4, 0x3e, 0x66, + 0xcd, 0x98, 0x86, 0xb5, 0x6b, 0xd6, 0xb4, 0x7a, 0x3b, 0xab, 0x57, 0xad, + 0x84, 0xdd, 0xd6, 0x00, 0x21, 0x04, 0x84, 0x10, 0xb0, 0xd9, 0xec, 0xd8, + 0xb0, 0x7e, 0x7d, 0xab, 0xb7, 0xb7, 0x76, 0xf5, 0x6a, 0x7c, 0xba, 0x68, + 0xbe, 0x47, 0x03, 0x91, 0xf6, 0xc8, 0x7f, 0x76, 0xee, 0xd8, 0x8e, 0x29, + 0x93, 0x3f, 0x80, 0xae, 0xeb, 0x0c, 0x01, 0xdd, 0x4c, 0x97, 0xfa, 0x59, + 0x43, 0xbe, 0xf6, 0x68, 0xeb, 0xbf, 0x3a, 0x3e, 0x8d, 0x3d, 0x41, 0x89, + 0x88, 0x88, 0x7c, 0x05, 0x03, 0x40, 0x22, 0x22, 0x22, 0x6a, 0xd6, 0xf2, + 0xa5, 0x4b, 0x31, 0x7f, 0xde, 0x5c, 0x08, 0xb8, 0x3f, 0x10, 0x52, 0x55, + 0x15, 0xab, 0x57, 0xad, 0xc4, 0xdc, 0x39, 0xb3, 0xcf, 0x69, 0x3b, 0xf9, + 0xf9, 0x87, 0x50, 0x59, 0x59, 0x79, 0x32, 0xc4, 0xaa, 0xaf, 0xaf, 0x43, + 0x61, 0x61, 0x41, 0xab, 0xb7, 0x27, 0xa5, 0xc4, 0xdc, 0x39, 0xb3, 0xb1, + 0x75, 0xcb, 0x66, 0x9f, 0x0f, 0xc6, 0x3e, 0x5d, 0x30, 0x1f, 0x8b, 0xbf, + 0xfa, 0xb2, 0xdd, 0xe6, 0x7e, 0x24, 0x22, 0x22, 0x22, 0xa2, 0xb6, 0xc5, + 0xa7, 0x3a, 0x22, 0x22, 0x22, 0x6a, 0x96, 0x2e, 0x75, 0x4c, 0xfb, 0x70, + 0x32, 0x36, 0x6c, 0xf8, 0xc5, 0xad, 0xf3, 0xe0, 0x29, 0x8a, 0x82, 0xe2, + 0xe2, 0x22, 0x7c, 0x38, 0xf9, 0x7d, 0x54, 0x54, 0x94, 0x9f, 0xd3, 0xb6, + 0x34, 0x97, 0x0b, 0xba, 0xa6, 0x03, 0x38, 0xde, 0x03, 0xb0, 0xc1, 0x06, + 0xdb, 0x39, 0xce, 0xa7, 0x57, 0x58, 0x58, 0x80, 0x39, 0xb3, 0x67, 0xa1, + 0xb6, 0xb6, 0xc6, 0xa7, 0xaf, 0xb7, 0xcd, 0x6e, 0xc3, 0xe4, 0xf7, 0xdf, + 0x43, 0x76, 0x56, 0xd6, 0x69, 0xc3, 0xa8, 0x89, 0x88, 0x88, 0x88, 0xc8, + 0x3b, 0x31, 0x00, 0x24, 0x22, 0x22, 0xf2, 0x22, 0xed, 0x39, 0x27, 0x58, + 0x59, 0x59, 0x29, 0xde, 0x79, 0xeb, 0xdf, 0x28, 0x2c, 0x2c, 0x74, 0x5b, + 0xcf, 0x30, 0xbb, 0xdd, 0x8e, 0xcf, 0x3f, 0x5d, 0x84, 0x2d, 0x9b, 0x37, + 0x9d, 0xf3, 0xb6, 0xdc, 0xd5, 0x4b, 0x6f, 0xe9, 0xf7, 0xdf, 0xe1, 0xdb, + 0x6f, 0x96, 0x78, 0xa4, 0x77, 0x9c, 0x94, 0xed, 0x37, 0xff, 0xda, 0xfe, + 0xec, 0x2c, 0x4c, 0x9d, 0x32, 0x19, 0x55, 0x95, 0x95, 0xbe, 0xd9, 0x96, + 0x80, 0x0e, 0x3d, 0xbf, 0x5d, 0x47, 0x58, 0x88, 0x45, 0x4a, 0x09, 0x70, + 0x14, 0x30, 0x11, 0x11, 0x91, 0x4f, 0xe0, 0x3f, 0xe9, 0x12, 0x11, 0x11, + 0x79, 0x09, 0x29, 0x25, 0x52, 0x53, 0xd2, 0x70, 0xd9, 0xe5, 0x57, 0xc0, + 0xec, 0xc1, 0xd5, 0x68, 0x4f, 0xe5, 0x67, 0xf1, 0x43, 0xde, 0xc1, 0x03, + 0x88, 0x89, 0x89, 0x06, 0xdc, 0x30, 0x1c, 0x78, 0x7f, 0x76, 0x36, 0x16, + 0xcc, 0xff, 0x04, 0x76, 0x9b, 0xad, 0xc3, 0x5e, 0x07, 0x9b, 0xcd, 0x86, + 0xe9, 0x53, 0x3e, 0xc4, 0x05, 0x17, 0x0e, 0x42, 0x5a, 0x5a, 0xba, 0xdb, + 0x56, 0x49, 0x15, 0x42, 0x20, 0x23, 0x23, 0x13, 0x55, 0x95, 0x95, 0xed, + 0xd3, 0x0b, 0x4f, 0x4a, 0x48, 0x29, 0x51, 0x52, 0x5c, 0x84, 0xf4, 0xee, + 0x3d, 0x7c, 0xae, 0x3d, 0x59, 0xfd, 0xfd, 0x70, 0xf1, 0x25, 0x97, 0x22, + 0x31, 0x31, 0x11, 0xa2, 0x0d, 0xc3, 0x5c, 0x21, 0x04, 0xaa, 0x2a, 0x2b, + 0xb1, 0x79, 0xd3, 0xc6, 0x73, 0xda, 0x4e, 0x52, 0x62, 0x12, 0xae, 0xbc, + 0xea, 0x6a, 0x28, 0xaa, 0xda, 0x6e, 0x75, 0x94, 0xde, 0xa3, 0x3b, 0x84, + 0xc2, 0x79, 0x20, 0x89, 0x88, 0x88, 0x7c, 0x01, 0x03, 0x40, 0x22, 0x22, + 0x22, 0x2f, 0xa1, 0x69, 0x1a, 0x6e, 0xbf, 0xf3, 0x2e, 0xdc, 0x71, 0xd7, + 0x3d, 0x50, 0x14, 0x05, 0x4a, 0x2b, 0x5e, 0xcc, 0x75, 0x29, 0xa1, 0x9f, + 0x43, 0x60, 0x25, 0xa5, 0x3c, 0x1e, 0x78, 0xb5, 0x6d, 0x28, 0x20, 0x84, + 0x40, 0x5d, 0x5d, 0x1d, 0xa6, 0x4c, 0x7e, 0x1f, 0xf9, 0x87, 0x0e, 0x75, + 0xf8, 0x6b, 0x91, 0x93, 0xb3, 0x1f, 0x93, 0xde, 0x7d, 0x1b, 0xaf, 0xfc, + 0xfd, 0x1f, 0xb0, 0x5a, 0xad, 0x6e, 0xe9, 0x49, 0x66, 0x32, 0x99, 0xf0, + 0xd0, 0xb8, 0x09, 0x78, 0x78, 0xfc, 0x44, 0xa8, 0xaa, 0xd2, 0xaa, 0x1e, + 0x8d, 0xba, 0xae, 0x9f, 0xd3, 0xb1, 0xe9, 0xba, 0x0e, 0x5d, 0xfa, 0xe6, + 0x2a, 0xb0, 0xd1, 0x31, 0x5d, 0xf0, 0xca, 0xdf, 0x5f, 0x33, 0xd4, 0x93, + 0x53, 0xd3, 0x75, 0x48, 0x83, 0xf5, 0x68, 0x32, 0x99, 0xf0, 0xf3, 0x8a, + 0x15, 0x18, 0x73, 0xff, 0xf0, 0x56, 0xd7, 0xbd, 0x10, 0x02, 0xc3, 0x6e, + 0xbf, 0x13, 0xb7, 0xdd, 0x79, 0x57, 0xb3, 0x2d, 0xad, 0xb1, 0x4d, 0xea, + 0x30, 0xde, 0x55, 0x4f, 0x18, 0xba, 0x9f, 0x24, 0x00, 0x5d, 0xd3, 0xe0, + 0x72, 0xb9, 0xf8, 0xcb, 0x97, 0x88, 0x88, 0xc8, 0x07, 0x30, 0x00, 0x24, + 0x22, 0x22, 0xf2, 0x22, 0xba, 0xae, 0xc3, 0xe5, 0x72, 0x60, 0xf3, 0xa6, + 0x8d, 0x28, 0x2b, 0x2b, 0x35, 0x1e, 0x0a, 0x1d, 0xcf, 0x06, 0x52, 0x52, + 0x53, 0xd1, 0xaf, 0xff, 0x80, 0x73, 0xea, 0xb5, 0xe6, 0x8e, 0xa1, 0xb5, + 0x26, 0x93, 0x09, 0x5f, 0x7e, 0xfe, 0x29, 0xbe, 0xfb, 0x76, 0x89, 0xd7, + 0x5c, 0x8b, 0xef, 0xbe, 0xf9, 0x06, 0x83, 0x07, 0x5f, 0x8c, 0x3b, 0xef, + 0xbe, 0xd7, 0x6d, 0xfb, 0x90, 0x52, 0xa2, 0xbe, 0xbe, 0x16, 0xeb, 0xd6, + 0xae, 0x41, 0x6d, 0x6d, 0xad, 0xf1, 0xd0, 0x57, 0x02, 0x8a, 0xaa, 0xa2, + 0x4f, 0x9f, 0x0c, 0xa4, 0xa6, 0xa5, 0x9d, 0x53, 0x08, 0xe8, 0x89, 0x85, + 0x5f, 0xda, 0x43, 0x5d, 0x6d, 0x2d, 0x36, 0x6d, 0xda, 0x88, 0xea, 0xea, + 0x6a, 0x9c, 0xf5, 0x96, 0x96, 0x8d, 0xd7, 0x20, 0xb3, 0x5f, 0x3f, 0xa4, + 0xa5, 0xa5, 0x1b, 0xaa, 0x47, 0x4d, 0xd7, 0x21, 0x21, 0xcf, 0x79, 0x08, + 0xef, 0xde, 0xbd, 0xbb, 0xb1, 0x77, 0xcf, 0x1e, 0x28, 0x42, 0x9c, 0x35, + 0x6f, 0xd7, 0x75, 0x89, 0x88, 0xf0, 0x08, 0x0c, 0xbe, 0xe4, 0x62, 0x98, + 0x4c, 0x66, 0x43, 0xdb, 0xd5, 0x34, 0x0d, 0xab, 0x56, 0xae, 0x45, 0x79, + 0x79, 0x79, 0xd3, 0xf7, 0x93, 0x04, 0x52, 0x52, 0xd3, 0xd0, 0xab, 0x77, + 0x6f, 0x2e, 0x06, 0x43, 0x44, 0x44, 0xe4, 0x03, 0x18, 0x00, 0x12, 0x11, + 0x11, 0x79, 0x19, 0xb3, 0xd9, 0x8c, 0xaa, 0xaa, 0x2a, 0xbc, 0xfe, 0xea, + 0xdf, 0x4e, 0x5b, 0xe5, 0xd6, 0x88, 0xf8, 0xf8, 0x04, 0xfc, 0xe3, 0x5f, + 0x6f, 0xe0, 0xfc, 0x0b, 0x2e, 0x74, 0xdb, 0xd0, 0xd5, 0x16, 0x3f, 0x8c, + 0x98, 0xcd, 0xd8, 0xb6, 0x75, 0x0b, 0x3e, 0x98, 0xf4, 0x5e, 0x87, 0x39, + 0x26, 0x23, 0x6c, 0xb6, 0x06, 0xcc, 0x98, 0x3e, 0x0d, 0xe7, 0x0d, 0xbc, + 0x00, 0xa9, 0x69, 0x69, 0x6e, 0x99, 0xb3, 0x4d, 0x4a, 0x09, 0xab, 0x35, + 0x00, 0x87, 0x0f, 0x1f, 0xc6, 0xff, 0xbd, 0xf1, 0x3a, 0x1c, 0x0e, 0x87, + 0xf1, 0xeb, 0x2d, 0x04, 0xfa, 0xf5, 0xed, 0x8f, 0xd7, 0xfe, 0xf9, 0x06, + 0x92, 0xba, 0x75, 0xeb, 0x10, 0x73, 0xca, 0x75, 0x24, 0xc7, 0x8e, 0x1d, + 0xc3, 0x5b, 0xff, 0xf7, 0x26, 0xb2, 0xf6, 0xed, 0x6d, 0x32, 0xe0, 0x72, + 0xb9, 0x5c, 0xf8, 0xcb, 0x4b, 0x2f, 0xa3, 0x47, 0x8f, 0x9e, 0xc6, 0xee, + 0x4f, 0x79, 0xee, 0xe1, 0x9f, 0x94, 0x12, 0x3f, 0xfd, 0xf8, 0x23, 0xde, + 0xfc, 0xd7, 0x3f, 0x60, 0x36, 0x9b, 0x9b, 0x3c, 0xb6, 0x7e, 0xfd, 0x07, + 0x60, 0xe0, 0x05, 0x17, 0xc0, 0x64, 0x32, 0x37, 0xbb, 0x5f, 0x21, 0x04, + 0x34, 0x4d, 0xc3, 0x7b, 0xef, 0xbc, 0x8d, 0xad, 0x5b, 0x36, 0xc1, 0xd4, + 0xc4, 0xd0, 0x72, 0x29, 0x25, 0xc6, 0x3c, 0xf8, 0x10, 0xba, 0xf7, 0xe8, + 0xc1, 0x00, 0x90, 0x88, 0x88, 0xc8, 0x07, 0xf0, 0xdb, 0x9c, 0x88, 0x88, + 0xc8, 0xcb, 0x48, 0x29, 0x71, 0xd3, 0xcd, 0xb7, 0xe0, 0xc9, 0x3f, 0x3e, + 0x05, 0xb3, 0xd9, 0x0c, 0x9b, 0xcd, 0x66, 0xf8, 0xe7, 0xc0, 0x81, 0x1c, + 0xfc, 0xfd, 0xe5, 0x97, 0xb0, 0x6f, 0xef, 0xde, 0x0e, 0x71, 0x2e, 0x42, + 0x08, 0x1c, 0xab, 0xa8, 0xc0, 0xb4, 0x69, 0x1f, 0xa2, 0xb8, 0xb8, 0xc8, + 0xeb, 0xae, 0x45, 0x4e, 0x76, 0x36, 0x3e, 0xf9, 0x78, 0x36, 0x1a, 0xea, + 0xeb, 0xdd, 0x78, 0xc1, 0x75, 0x8c, 0x1a, 0x3d, 0x06, 0xe3, 0x1f, 0x79, + 0x14, 0x52, 0x97, 0xc6, 0xaf, 0x77, 0x43, 0x03, 0x36, 0x6c, 0x58, 0x8f, + 0xd7, 0xfe, 0xfe, 0x32, 0x4a, 0x4b, 0x4b, 0xdd, 0xb6, 0x28, 0x8a, 0x91, + 0x6b, 0xdc, 0xfc, 0x0f, 0x3c, 0xde, 0xcf, 0x50, 0xca, 0xc6, 0xba, 0x74, + 0x38, 0x1c, 0x4d, 0xd6, 0xa3, 0xcb, 0xe5, 0x82, 0xcb, 0xa5, 0x01, 0x1e, + 0xae, 0x3f, 0x97, 0xe6, 0x82, 0xa6, 0x69, 0xcd, 0x1e, 0x9b, 0xcd, 0xde, + 0xf2, 0xf9, 0x32, 0x1d, 0xf6, 0xe3, 0x65, 0x9b, 0xd8, 0xb6, 0xdd, 0x6e, + 0x87, 0xd3, 0xe1, 0xe4, 0x2f, 0x5c, 0x22, 0x22, 0x22, 0x1f, 0xc1, 0x1e, + 0x80, 0x44, 0x44, 0x44, 0x5e, 0x48, 0xd3, 0x34, 0xdc, 0x79, 0xf7, 0xdd, + 0x70, 0x38, 0x1c, 0x78, 0xf3, 0x5f, 0xff, 0x40, 0x55, 0x55, 0x95, 0xe1, + 0xb2, 0xdb, 0xb7, 0x6f, 0xc3, 0x6b, 0x7f, 0x7f, 0x19, 0xff, 0xef, 0xe5, + 0xbf, 0x21, 0x35, 0x35, 0x1d, 0x9a, 0xd6, 0x7e, 0x73, 0x7c, 0xe9, 0xba, + 0x8e, 0x1f, 0xbe, 0xff, 0x0e, 0x3f, 0x2e, 0x5d, 0xe6, 0x9d, 0xd7, 0x41, + 0xd7, 0xf0, 0xd5, 0x97, 0x9f, 0xe3, 0xf2, 0x2b, 0xae, 0xc4, 0x95, 0x57, + 0x5f, 0x0b, 0x5d, 0x6f, 0xfb, 0x1e, 0x8c, 0x12, 0x80, 0x90, 0x12, 0x0f, + 0x8c, 0x7d, 0x08, 0xb6, 0x06, 0x1b, 0xa6, 0x4e, 0xf9, 0x00, 0xb6, 0x16, + 0x2c, 0x92, 0xb2, 0x6c, 0xe9, 0x0f, 0x08, 0x08, 0x08, 0xc4, 0xb3, 0x2f, + 0xfc, 0x05, 0x31, 0x31, 0x31, 0x1e, 0xed, 0x65, 0x29, 0x75, 0x1d, 0x47, + 0x4a, 0x4a, 0x50, 0x57, 0x5f, 0xd7, 0xe4, 0xe7, 0x84, 0x10, 0x28, 0x2d, + 0x3d, 0xc2, 0x86, 0x4d, 0x44, 0x44, 0x44, 0xe4, 0x26, 0x0c, 0x00, 0x89, + 0x88, 0x88, 0xbc, 0x50, 0xe3, 0x50, 0x3f, 0x81, 0x3b, 0xee, 0xba, 0x1b, + 0x4e, 0xa7, 0x13, 0x6f, 0xbe, 0xf1, 0x3a, 0xea, 0xeb, 0xea, 0x0c, 0x97, + 0x5f, 0xbd, 0x6a, 0x25, 0x5e, 0x7b, 0xe5, 0x65, 0xbc, 0xf0, 0xd2, 0xcb, + 0x48, 0x49, 0x4d, 0x85, 0xd3, 0xe1, 0x68, 0x97, 0xf3, 0x38, 0x94, 0x77, + 0x10, 0x73, 0x3e, 0x9a, 0x89, 0xfa, 0x7a, 0x63, 0xc7, 0xae, 0xaa, 0x2a, + 0x22, 0x22, 0x22, 0x50, 0x5e, 0x5e, 0xee, 0x96, 0x85, 0x37, 0x1a, 0xf7, + 0x61, 0x42, 0x72, 0x4a, 0x32, 0x72, 0x73, 0x72, 0x0c, 0x7d, 0xbe, 0xa2, + 0xa2, 0x02, 0x93, 0xde, 0x7b, 0x07, 0x3d, 0x7b, 0xf7, 0x46, 0x5c, 0x5c, + 0xbc, 0x5b, 0x02, 0x36, 0x29, 0x25, 0x2c, 0x16, 0x3f, 0x3c, 0xf8, 0xf0, + 0x38, 0xd8, 0xec, 0x36, 0x4c, 0x9f, 0xfa, 0x61, 0x8b, 0xce, 0x7f, 0xf1, + 0x57, 0x5f, 0xc0, 0x6c, 0x36, 0xe3, 0xa9, 0x67, 0x9f, 0x47, 0x54, 0x54, + 0x94, 0x47, 0x42, 0x40, 0x01, 0xc0, 0xe9, 0x70, 0xe0, 0x83, 0x49, 0xef, + 0x62, 0xcd, 0x9a, 0xd5, 0x40, 0x53, 0xc3, 0x53, 0x05, 0x50, 0x57, 0x5b, + 0xc7, 0x86, 0x4d, 0x44, 0x44, 0x44, 0xe4, 0x26, 0x1c, 0x02, 0x4c, 0x44, + 0x44, 0xe4, 0xa5, 0xa4, 0x94, 0x30, 0x9b, 0xcd, 0xb8, 0xfb, 0xde, 0x7b, + 0xf1, 0xe8, 0xe3, 0xbf, 0x87, 0x6a, 0x6a, 0xd9, 0xbf, 0xeb, 0xad, 0x58, + 0xb1, 0x1c, 0xaf, 0xbf, 0xf6, 0x37, 0x14, 0xe4, 0xe7, 0xb7, 0xcb, 0x1c, + 0x5f, 0x52, 0x4a, 0x7c, 0x34, 0x73, 0x06, 0x76, 0xef, 0xda, 0x69, 0xb8, + 0x4c, 0x66, 0x66, 0x5f, 0x5c, 0x75, 0xcd, 0xb5, 0x50, 0x55, 0xd5, 0x9d, + 0x47, 0x86, 0x11, 0x23, 0x47, 0x23, 0x33, 0xb3, 0x9f, 0xe1, 0x12, 0x9b, + 0x37, 0x6d, 0xc4, 0x9c, 0x59, 0x33, 0xe1, 0xce, 0x69, 0xf6, 0xa4, 0x94, + 0x08, 0x0e, 0x0e, 0xc6, 0xc4, 0xc7, 0x1e, 0xc7, 0xa8, 0xd1, 0x0f, 0xb4, + 0xb8, 0xec, 0xe2, 0xaf, 0xbe, 0xc0, 0xbb, 0x6f, 0xff, 0x07, 0x95, 0x95, + 0x95, 0x1e, 0x1b, 0xce, 0xaa, 0x4b, 0x89, 0x23, 0x47, 0x4a, 0x70, 0xf0, + 0x40, 0x2e, 0x0e, 0x1e, 0x3c, 0x70, 0xf6, 0x9f, 0x03, 0x07, 0x3a, 0x7c, + 0x0f, 0xc0, 0x96, 0xd4, 0x58, 0x7b, 0x0d, 0xb7, 0x26, 0x22, 0x22, 0x22, + 0x3a, 0x1b, 0x06, 0x80, 0x44, 0x44, 0x44, 0x5e, 0xce, 0xdf, 0xdf, 0x8a, + 0x31, 0x63, 0xc6, 0x62, 0xec, 0xc3, 0xe3, 0xa0, 0xb4, 0x20, 0x18, 0x93, + 0x52, 0x62, 0xe9, 0xf7, 0xdf, 0x61, 0xd2, 0xbb, 0x6f, 0xa1, 0xa2, 0xa2, + 0xdc, 0xa3, 0xc7, 0xac, 0xaa, 0x2a, 0x96, 0xfe, 0xf0, 0x3d, 0x16, 0x2d, + 0x5a, 0x60, 0xb8, 0x4c, 0x40, 0x40, 0x20, 0xc6, 0x4d, 0x78, 0x14, 0xa9, + 0xa9, 0x69, 0x6e, 0x5d, 0xd0, 0x42, 0xd3, 0x34, 0x24, 0x27, 0x27, 0xe3, + 0xe1, 0x09, 0x13, 0xe1, 0xef, 0xef, 0x6f, 0xb8, 0xdc, 0xec, 0x8f, 0x66, + 0x62, 0xc5, 0xf2, 0xa5, 0x6e, 0x0d, 0x27, 0xa5, 0x94, 0x08, 0x09, 0x09, + 0xc5, 0x13, 0x4f, 0xfe, 0x11, 0x77, 0xdc, 0x75, 0x77, 0x8b, 0xca, 0x3a, + 0x1c, 0x0e, 0x2c, 0x9c, 0xff, 0x09, 0xe6, 0x7c, 0x34, 0x13, 0xf6, 0x86, + 0x06, 0x8f, 0x5d, 0x6b, 0x01, 0xe1, 0xf5, 0x81, 0x58, 0x6d, 0x6d, 0x0d, + 0xca, 0xca, 0x4a, 0x71, 0xf4, 0x68, 0x99, 0xa1, 0x9f, 0xaa, 0xca, 0x4a, + 0xfe, 0x62, 0x22, 0x22, 0x22, 0xa2, 0x0e, 0x85, 0x43, 0x80, 0x89, 0x88, + 0x88, 0xbc, 0x9c, 0x94, 0x12, 0x7e, 0xfe, 0x7e, 0x78, 0xf4, 0xb1, 0xdf, + 0x43, 0x11, 0x02, 0x53, 0x3f, 0x9c, 0x0c, 0x97, 0xcb, 0xd8, 0xbc, 0x7e, + 0xba, 0xae, 0x63, 0xd1, 0xc2, 0x05, 0x08, 0x0d, 0x0d, 0xc3, 0xf8, 0x47, + 0x1e, 0x45, 0x48, 0x48, 0x88, 0xdb, 0x86, 0xd6, 0x9e, 0xa0, 0x9a, 0x4c, + 0xc8, 0x3f, 0x94, 0x87, 0xf7, 0xdf, 0x7b, 0x07, 0xb6, 0x16, 0x04, 0x51, + 0x23, 0x47, 0x8f, 0xc6, 0xb5, 0xd7, 0xfd, 0x06, 0x93, 0x27, 0x4f, 0x72, + 0x7b, 0x9d, 0x3a, 0x9c, 0x4e, 0x5c, 0x7f, 0xc3, 0x0d, 0xd8, 0xf8, 0xcb, + 0x3d, 0x98, 0x33, 0x7b, 0x96, 0xa1, 0x32, 0x75, 0x75, 0x75, 0x98, 0x39, + 0x63, 0x3a, 0x7a, 0xf5, 0xe9, 0x83, 0xd8, 0xd8, 0x38, 0xb7, 0x85, 0x94, + 0xba, 0xae, 0x23, 0x38, 0x24, 0x04, 0x7f, 0x7a, 0xea, 0x59, 0x48, 0x29, + 0xf1, 0xf9, 0xa7, 0x8b, 0x0c, 0xef, 0xcb, 0x66, 0xb3, 0x61, 0xf2, 0x07, + 0x93, 0x10, 0x18, 0x14, 0x84, 0xe1, 0x23, 0x46, 0xc1, 0x62, 0xb1, 0xb8, + 0xfd, 0x7a, 0xfb, 0x82, 0x19, 0xd3, 0xa7, 0x62, 0xd1, 0x82, 0xf9, 0xc6, + 0xea, 0x59, 0x34, 0x86, 0xad, 0x5c, 0x75, 0x99, 0x88, 0x88, 0x88, 0x3a, + 0x12, 0x06, 0x80, 0x44, 0x44, 0x44, 0x3e, 0x40, 0xd7, 0x75, 0x04, 0x04, + 0x04, 0xe0, 0xc1, 0x87, 0xc6, 0xc1, 0xe1, 0x70, 0xe0, 0xa3, 0x99, 0x33, + 0x0c, 0x87, 0x80, 0x2e, 0xa7, 0x13, 0x33, 0xa6, 0x4d, 0x81, 0xc5, 0xe2, + 0x87, 0xf1, 0x13, 0x27, 0xc2, 0xdf, 0xcf, 0xdf, 0x6d, 0xa1, 0x90, 0x10, + 0x02, 0xf5, 0x75, 0x75, 0x98, 0x36, 0xe5, 0xc3, 0x16, 0x0d, 0xfd, 0x1d, + 0x34, 0x78, 0x30, 0xc6, 0x8c, 0x19, 0x0b, 0x45, 0x55, 0x00, 0x0f, 0x05, + 0x2b, 0xaa, 0xaa, 0x62, 0xf8, 0xc8, 0xfb, 0xb1, 0x69, 0xd3, 0x46, 0xec, + 0xdb, 0xbb, 0xc7, 0x50, 0x99, 0x8d, 0x1b, 0xd6, 0xe3, 0xf3, 0x4f, 0x17, + 0xe1, 0xe1, 0xf1, 0x13, 0xa0, 0xaa, 0x26, 0xb7, 0x5e, 0xef, 0xa8, 0xa8, + 0x28, 0x3c, 0xfe, 0xbb, 0x27, 0x61, 0xb7, 0xdb, 0xb1, 0x64, 0xf1, 0x57, + 0x86, 0xcb, 0xd6, 0xd7, 0xd5, 0xe1, 0xad, 0x7f, 0xbf, 0x01, 0x93, 0x6a, + 0xc2, 0x7d, 0x23, 0x46, 0x42, 0x51, 0x14, 0x86, 0x55, 0xcd, 0x38, 0x56, + 0x51, 0x81, 0x63, 0x15, 0x15, 0xac, 0x08, 0x22, 0x22, 0x22, 0xf2, 0x5a, + 0x1c, 0x02, 0x4c, 0x44, 0x44, 0xe4, 0x23, 0xa4, 0x94, 0x08, 0x0b, 0x0b, + 0xc7, 0xb8, 0x09, 0x13, 0x71, 0xdb, 0x1d, 0x77, 0xb6, 0xa8, 0xac, 0xc3, + 0xe1, 0xc0, 0xfb, 0xef, 0xbd, 0x8d, 0x19, 0xd3, 0xa6, 0xc0, 0xe5, 0x74, + 0xb9, 0x6d, 0xc8, 0xa6, 0x94, 0x12, 0xeb, 0xd6, 0xae, 0xc1, 0xb7, 0x4b, + 0x16, 0x1b, 0x2e, 0x13, 0x1d, 0x1d, 0x83, 0x47, 0x1f, 0xfb, 0x3d, 0xa2, + 0xa2, 0xa3, 0x5b, 0x14, 0x4c, 0xb6, 0x45, 0xa8, 0x95, 0x96, 0x9e, 0x8e, + 0xd1, 0x63, 0x1e, 0x84, 0xd5, 0x6a, 0x35, 0x5c, 0x8f, 0x0b, 0xe7, 0xcf, + 0xc3, 0x9e, 0xdd, 0x7b, 0xdc, 0x3e, 0xec, 0x55, 0x4a, 0x89, 0x84, 0xc4, + 0x44, 0xfc, 0xf1, 0x4f, 0x4f, 0xe3, 0xca, 0xab, 0xae, 0x6e, 0x51, 0xd9, + 0x9a, 0x9a, 0x1a, 0xfc, 0xfb, 0x8d, 0xd7, 0xf1, 0xe5, 0x17, 0x9f, 0xb1, + 0x07, 0x20, 0x11, 0x11, 0x11, 0x51, 0x27, 0xc0, 0x00, 0x90, 0x88, 0x88, + 0xc8, 0xc7, 0x44, 0x47, 0xc7, 0xe0, 0xc9, 0x3f, 0x3c, 0x85, 0xa1, 0xb7, + 0xde, 0xd6, 0xa2, 0x72, 0x2e, 0x97, 0x0b, 0x93, 0xde, 0x7d, 0x07, 0x0b, + 0x16, 0x7c, 0x02, 0x87, 0xc3, 0xe9, 0x96, 0x63, 0x2b, 0x2b, 0x2d, 0xc5, + 0xf4, 0xa9, 0x93, 0x51, 0x5e, 0x6e, 0x6c, 0xce, 0x41, 0x93, 0xc9, 0x84, + 0x21, 0xc3, 0x6e, 0xc3, 0x79, 0x03, 0xcf, 0x3f, 0xf9, 0x67, 0x16, 0x8b, + 0x05, 0x81, 0x41, 0x41, 0x08, 0x6a, 0xe2, 0x27, 0x20, 0x20, 0x10, 0x81, + 0x41, 0xc1, 0xc7, 0xd7, 0xba, 0x68, 0x7d, 0x10, 0xa8, 0x28, 0x0a, 0x7e, + 0x7b, 0xc3, 0x8d, 0xb8, 0xe2, 0xaa, 0xab, 0x0c, 0x97, 0x29, 0x28, 0xc8, + 0xc7, 0x87, 0x1f, 0x4c, 0x42, 0x7d, 0x7d, 0xbd, 0x47, 0x42, 0xc0, 0xe4, + 0x94, 0x14, 0xbc, 0xf0, 0x97, 0x97, 0x71, 0xf9, 0x15, 0x57, 0xb6, 0xa8, + 0x6c, 0x75, 0x75, 0x35, 0xde, 0xfc, 0xd7, 0xeb, 0xf8, 0xf9, 0xa7, 0x15, + 0x0c, 0x01, 0x89, 0x88, 0x88, 0x88, 0x7c, 0x1c, 0x87, 0x00, 0x13, 0x11, + 0x11, 0xf9, 0x18, 0x4d, 0xd3, 0x10, 0x1b, 0x1f, 0x87, 0x3f, 0x3f, 0xfd, + 0x2c, 0xec, 0x0e, 0x3b, 0x7e, 0xf8, 0xee, 0x5b, 0xc3, 0xbd, 0xe1, 0x1a, + 0xea, 0xeb, 0xf1, 0xd6, 0xff, 0xbd, 0x89, 0xa0, 0xa0, 0x60, 0xdc, 0x7c, + 0xcb, 0x90, 0x36, 0x0d, 0xb0, 0xa4, 0x04, 0x16, 0x2d, 0x5a, 0x80, 0x8d, + 0x1b, 0x36, 0x18, 0x2e, 0x93, 0xd9, 0xb7, 0x2f, 0x46, 0xdd, 0x3f, 0x1a, + 0xc1, 0xc1, 0xc1, 0xd0, 0x75, 0x1d, 0x8a, 0xa2, 0xe0, 0x86, 0x9b, 0x6e, + 0x41, 0x9f, 0x8c, 0xcc, 0x66, 0xcf, 0xc9, 0xcf, 0xcf, 0x0f, 0x21, 0xa1, + 0xa1, 0x90, 0x52, 0xb6, 0xfa, 0x3c, 0xa4, 0x94, 0x88, 0x88, 0x88, 0xc4, + 0x84, 0x89, 0x8f, 0x63, 0xe7, 0x8e, 0x9d, 0x28, 0x3a, 0x5c, 0x68, 0xa8, + 0xdc, 0x0f, 0xdf, 0x7f, 0x87, 0x0b, 0x06, 0x0d, 0x42, 0x66, 0x66, 0x5f, + 0xb8, 0x7b, 0xf9, 0x0b, 0x97, 0xcb, 0x85, 0xb4, 0xf4, 0x34, 0x3c, 0xf3, + 0xdc, 0x8b, 0x70, 0x38, 0x1c, 0xf8, 0x65, 0xfd, 0x3a, 0xc3, 0x65, 0x8f, + 0x94, 0x94, 0xe0, 0xd5, 0xbf, 0xbd, 0x0c, 0x6b, 0x40, 0x00, 0x2e, 0xb9, + 0xe4, 0x52, 0x68, 0x9a, 0xc6, 0x06, 0xe4, 0x41, 0x52, 0x4a, 0x48, 0x70, + 0xf8, 0x35, 0x11, 0x11, 0x11, 0xb9, 0x1f, 0x7b, 0x00, 0x12, 0x11, 0x11, + 0xf9, 0x20, 0x97, 0xd3, 0x89, 0xf8, 0xae, 0x5d, 0xf1, 0xf4, 0x33, 0xcf, + 0xe3, 0xba, 0xdf, 0x5c, 0xdf, 0xa2, 0xb2, 0xe5, 0x47, 0x8f, 0xe2, 0xf5, + 0xd7, 0xfe, 0x86, 0xe5, 0x4b, 0x97, 0xc2, 0x62, 0xb1, 0xb4, 0xc9, 0xf1, + 0x98, 0x2d, 0x16, 0x6c, 0xdc, 0xb0, 0x1e, 0xb3, 0x67, 0x4e, 0x37, 0x1c, + 0x32, 0xf9, 0xfb, 0xfb, 0x9f, 0x3c, 0xf6, 0x03, 0xb9, 0xb9, 0x38, 0x78, + 0xf0, 0x00, 0xf2, 0xf2, 0xf2, 0x20, 0xa5, 0x8e, 0x6e, 0xdd, 0x92, 0x91, + 0x9c, 0x9c, 0xd2, 0xe4, 0x4f, 0x7c, 0x7c, 0x57, 0x98, 0xcd, 0x96, 0x73, + 0x1e, 0x0a, 0xec, 0x74, 0x3a, 0xd0, 0xaf, 0x5f, 0x7f, 0x8c, 0x1b, 0xff, + 0x88, 0xe1, 0x15, 0x7e, 0xa5, 0xd4, 0x31, 0x63, 0xea, 0x14, 0x6c, 0xdf, + 0xb6, 0x15, 0x26, 0x93, 0xfb, 0xff, 0xbd, 0xd5, 0xe5, 0x72, 0xa1, 0x47, + 0xcf, 0x9e, 0x78, 0xfa, 0xd9, 0x17, 0x4e, 0xeb, 0x2d, 0x69, 0x44, 0xde, + 0xc1, 0x03, 0x78, 0xe9, 0xc5, 0xe7, 0xb1, 0xe1, 0x97, 0xf5, 0x6d, 0x76, + 0xbd, 0x4f, 0xab, 0x0b, 0x36, 0xc7, 0xb3, 0x52, 0x15, 0xd5, 0xeb, 0x57, + 0x48, 0x26, 0x22, 0x22, 0x22, 0xef, 0xc0, 0x1e, 0x80, 0x44, 0x44, 0x44, + 0x3e, 0x4a, 0xd3, 0x34, 0x24, 0x24, 0x26, 0xe2, 0x4f, 0x4f, 0x3d, 0x83, + 0xba, 0xba, 0x5a, 0xac, 0x5d, 0xb3, 0xda, 0x70, 0xd9, 0x23, 0x25, 0x25, + 0x78, 0xe5, 0xaf, 0x7f, 0x81, 0xc5, 0x6c, 0xc6, 0x75, 0xd7, 0x5f, 0x0f, + 0x87, 0xc3, 0xd1, 0xea, 0xe3, 0x50, 0x14, 0x05, 0x65, 0x47, 0x4a, 0xf1, + 0xde, 0xbb, 0x6f, 0xe3, 0xe8, 0xd1, 0xa3, 0x86, 0xcb, 0xd9, 0xed, 0x76, + 0x4c, 0xfd, 0xf0, 0x03, 0xcc, 0x98, 0x36, 0xb5, 0xc5, 0x21, 0x92, 0xd4, + 0x75, 0xc4, 0xc5, 0x77, 0xc5, 0xb4, 0x19, 0xb3, 0x10, 0x1d, 0x13, 0xd3, + 0x26, 0x75, 0x39, 0xec, 0xf6, 0x3b, 0xb0, 0x6e, 0xdd, 0x1a, 0x7c, 0xff, + 0xed, 0x37, 0x86, 0xca, 0x14, 0x17, 0x17, 0x61, 0xd6, 0xcc, 0xe9, 0xa8, + 0xae, 0xa9, 0xf1, 0xc8, 0xf5, 0x96, 0x52, 0xa2, 0x6f, 0xbf, 0x7e, 0x78, + 0xfa, 0xb9, 0x17, 0xf0, 0xff, 0x5e, 0x78, 0x16, 0x59, 0xfb, 0xf6, 0x19, + 0x2e, 0x9b, 0x9b, 0xb3, 0x1f, 0x2f, 0xfd, 0xe5, 0x05, 0xbc, 0xf6, 0x8f, + 0x7f, 0x61, 0xc0, 0xc0, 0x81, 0x86, 0x17, 0x90, 0x31, 0x54, 0x77, 0xba, + 0xc6, 0x45, 0x46, 0xce, 0xa2, 0x6b, 0x42, 0x02, 0x42, 0x43, 0xc3, 0x58, + 0x11, 0x44, 0x44, 0x44, 0xe4, 0x76, 0x0c, 0x00, 0x89, 0x88, 0x88, 0x7c, + 0x5c, 0xf7, 0x1e, 0x3d, 0xf0, 0xec, 0xf3, 0x2f, 0xe2, 0xb9, 0xa7, 0x9f, + 0xc2, 0xce, 0x9d, 0xdb, 0x0d, 0x97, 0x2b, 0x2e, 0x2e, 0xc2, 0x2b, 0xaf, + 0xbc, 0x84, 0xc0, 0xe0, 0x60, 0x5c, 0x70, 0xe1, 0x85, 0xad, 0x0e, 0x71, + 0x74, 0x5d, 0xc7, 0xfc, 0x79, 0x73, 0xb1, 0xae, 0x05, 0x01, 0x24, 0xd0, + 0x18, 0x68, 0x55, 0x56, 0x56, 0xb6, 0xfa, 0xbc, 0xfd, 0xfd, 0xfd, 0x8e, + 0x1f, 0xb3, 0x40, 0x5b, 0xf4, 0x43, 0x0b, 0x08, 0x08, 0xc0, 0xc3, 0xe3, + 0x1e, 0xc1, 0x9e, 0xdd, 0xbb, 0x50, 0x90, 0x9f, 0x6f, 0xe8, 0xf8, 0x8b, + 0x8b, 0x8a, 0x3c, 0x7a, 0xad, 0xa5, 0x94, 0x18, 0x3c, 0xf8, 0x62, 0x3c, + 0xff, 0xe2, 0x4b, 0x78, 0xf1, 0xb9, 0x67, 0x70, 0xe8, 0x50, 0x9e, 0xe1, + 0xb2, 0x59, 0xfb, 0xf6, 0xe2, 0xef, 0x7f, 0x7f, 0x19, 0xaf, 0xfe, 0xe3, + 0x9f, 0x48, 0x49, 0x49, 0x3d, 0xf7, 0x63, 0x41, 0xe3, 0x7c, 0x8d, 0x0f, + 0x3c, 0x30, 0x16, 0xd7, 0x5f, 0x7f, 0x63, 0x93, 0x9f, 0x15, 0x42, 0x60, + 0xdb, 0xb6, 0xad, 0x98, 0x3b, 0xe7, 0xa3, 0x4e, 0xd3, 0x2e, 0x83, 0x82, + 0x82, 0x70, 0xf3, 0x90, 0xa1, 0x08, 0x0b, 0x0b, 0xe5, 0x2f, 0x29, 0x22, + 0x22, 0x22, 0x72, 0x3b, 0x06, 0x80, 0x44, 0x44, 0x44, 0x3e, 0xce, 0xe5, + 0x72, 0xa1, 0x6f, 0xbf, 0xfe, 0x78, 0xf9, 0xd5, 0xd7, 0xf0, 0xd2, 0x8b, + 0xcf, 0x61, 0xfb, 0xb6, 0x6d, 0x86, 0xcb, 0x1e, 0xca, 0x3b, 0x88, 0x7f, + 0xbc, 0xfa, 0x0a, 0x5e, 0x7a, 0xf9, 0x6f, 0xc8, 0xec, 0xd7, 0x1f, 0xb2, + 0x85, 0x8b, 0x45, 0x08, 0x21, 0xb0, 0x69, 0xe3, 0x06, 0x7c, 0x32, 0x77, + 0x8e, 0xc7, 0xcf, 0xdb, 0x1d, 0x43, 0x2b, 0x7b, 0xf7, 0xe9, 0x83, 0xdb, + 0xef, 0xb8, 0x1b, 0x93, 0xde, 0x7d, 0x0b, 0x4e, 0xa7, 0xb3, 0x43, 0x5e, + 0x6f, 0x87, 0xc3, 0x81, 0xcb, 0xaf, 0xb8, 0x0a, 0x2f, 0xbd, 0xf2, 0x77, + 0xbc, 0xfc, 0xd2, 0x8b, 0x38, 0x78, 0xe0, 0x80, 0xe1, 0xb2, 0x9b, 0x37, + 0x6e, 0xc0, 0x3f, 0x5f, 0xfb, 0x3b, 0x5e, 0xf8, 0x7f, 0x2f, 0x23, 0x29, + 0x29, 0xe9, 0xdc, 0xe6, 0x04, 0x94, 0x80, 0xaa, 0xaa, 0xb8, 0xec, 0x8a, + 0x2b, 0xa1, 0x28, 0x4d, 0xcf, 0x3a, 0x23, 0x14, 0x05, 0x81, 0x41, 0x81, + 0x9d, 0x26, 0x00, 0xb4, 0x58, 0x2c, 0x18, 0x3a, 0xec, 0x36, 0xdc, 0x74, + 0xf3, 0x2d, 0x50, 0x55, 0x13, 0x7b, 0x48, 0x12, 0x11, 0x11, 0x91, 0xdb, + 0x71, 0x0e, 0x40, 0x22, 0x22, 0xa2, 0x4e, 0xc0, 0xe1, 0x68, 0x9c, 0xc7, + 0xee, 0x2f, 0x2f, 0xbd, 0x82, 0xcc, 0xcc, 0xbe, 0x2d, 0x2a, 0xbb, 0x7d, + 0xdb, 0x56, 0xfc, 0xf3, 0x1f, 0xaf, 0xe2, 0x60, 0x6e, 0x8e, 0xe1, 0x39, + 0xf0, 0x4e, 0xa8, 0xa9, 0xa9, 0xc6, 0xec, 0x59, 0x33, 0x0d, 0x2f, 0x9e, + 0xd1, 0xd1, 0xf9, 0xf9, 0xf9, 0xe1, 0xae, 0x7b, 0xee, 0xc5, 0x05, 0x17, + 0x0e, 0xea, 0xd0, 0xc7, 0xe9, 0x74, 0x3a, 0x70, 0xe9, 0x65, 0x97, 0xe3, + 0xe9, 0x67, 0x5f, 0x40, 0x42, 0x62, 0x62, 0x8b, 0xca, 0x2e, 0x5f, 0xb6, + 0x14, 0xff, 0x7a, 0xfd, 0x55, 0x1c, 0x29, 0x29, 0x69, 0xf1, 0xf5, 0x3e, + 0x8d, 0x68, 0xec, 0x05, 0xe8, 0x74, 0x3a, 0x61, 0xb7, 0xdb, 0x9b, 0xfe, + 0xb1, 0xd9, 0xe1, 0x74, 0xba, 0x7c, 0xbe, 0x1d, 0x2a, 0x8a, 0x82, 0x6e, + 0xc9, 0x29, 0x98, 0xf0, 0xc8, 0xa3, 0x78, 0xf2, 0x8f, 0x7f, 0x46, 0x58, + 0x68, 0x38, 0xc3, 0x3f, 0x22, 0x22, 0x22, 0xf2, 0x08, 0xf6, 0x00, 0x24, + 0x22, 0x22, 0xea, 0x24, 0x34, 0x4d, 0x43, 0xdf, 0xbe, 0xfd, 0xf0, 0xc2, + 0x5f, 0xfe, 0x8a, 0x67, 0x9e, 0xfa, 0x23, 0xf2, 0xf2, 0x0e, 0x1a, 0x2e, + 0xbb, 0x6e, 0xed, 0x1a, 0xbc, 0xf5, 0x7f, 0x6f, 0xe2, 0x95, 0xd7, 0x5e, + 0x47, 0x48, 0x70, 0x08, 0x74, 0x03, 0x3d, 0x01, 0x85, 0x10, 0xf8, 0x7a, + 0xf1, 0x97, 0x58, 0xb6, 0xf4, 0x7b, 0x9f, 0xa9, 0x43, 0x5d, 0xd7, 0x11, + 0x1f, 0x1f, 0x8f, 0x87, 0x27, 0x3c, 0x82, 0x9d, 0x3b, 0x77, 0xa0, 0xd6, + 0x43, 0xf3, 0xfb, 0xb5, 0xd6, 0x35, 0xd7, 0x5c, 0x0b, 0x87, 0xdd, 0x81, + 0x17, 0x9f, 0x7f, 0x06, 0x55, 0x55, 0xc6, 0x87, 0x53, 0x7f, 0xf3, 0xf5, + 0x62, 0x44, 0x47, 0x45, 0xe3, 0xcf, 0xcf, 0x3e, 0x07, 0x3f, 0x8b, 0x5f, + 0xa7, 0x0f, 0xa9, 0xee, 0xb9, 0xf7, 0x3e, 0xfc, 0xe6, 0xfa, 0x1b, 0xe1, + 0x3a, 0xa5, 0xd7, 0x67, 0x56, 0xd6, 0x3e, 0x4c, 0x9b, 0xf2, 0x21, 0xaa, + 0xab, 0xab, 0x0c, 0x6d, 0x23, 0x30, 0x30, 0x10, 0xe3, 0x1f, 0x79, 0x14, + 0x43, 0x86, 0x0e, 0x43, 0x4c, 0x97, 0x2e, 0xb0, 0x58, 0x2c, 0xd0, 0x74, + 0xae, 0xba, 0x4c, 0x44, 0x44, 0x44, 0x9e, 0xc1, 0x00, 0x90, 0x88, 0x88, + 0xc8, 0x0b, 0x68, 0x9a, 0x06, 0x5d, 0x6b, 0x83, 0xb0, 0x40, 0x08, 0xf4, + 0x1f, 0x38, 0x10, 0xcf, 0x3c, 0xff, 0x02, 0x5e, 0x78, 0xee, 0x59, 0x1c, + 0x2d, 0x2b, 0x35, 0x5c, 0x74, 0xc9, 0xd7, 0x8b, 0xd1, 0xbb, 0x4f, 0x06, + 0x26, 0x4c, 0x7c, 0xac, 0xd9, 0xcf, 0xaa, 0xaa, 0x8a, 0xfd, 0xd9, 0xd9, + 0x98, 0x35, 0x63, 0xfa, 0x39, 0x2d, 0x20, 0xd2, 0x11, 0xb9, 0x5c, 0x2e, + 0x5c, 0x75, 0xd5, 0x35, 0x18, 0x3d, 0xe6, 0x41, 0xbc, 0xf7, 0xce, 0x5b, + 0x6e, 0xdb, 0x87, 0xae, 0xeb, 0x10, 0xe7, 0x3a, 0x7d, 0xa1, 0x10, 0xf8, + 0xed, 0x0d, 0x37, 0xa0, 0xba, 0xba, 0x0a, 0x7f, 0x7f, 0xe5, 0xaf, 0x68, + 0x68, 0xa8, 0x37, 0x5c, 0x74, 0xfe, 0xbc, 0xb9, 0xe8, 0x37, 0xe0, 0x3c, + 0x0c, 0x1d, 0x76, 0x1b, 0xd0, 0xc9, 0x03, 0xc0, 0x5e, 0xbd, 0x33, 0x70, + 0xfd, 0x0d, 0x37, 0xc2, 0x6e, 0xff, 0xef, 0xbd, 0x3c, 0xf8, 0x92, 0x4b, + 0x90, 0x9b, 0x93, 0x83, 0xc5, 0x5f, 0x7d, 0x61, 0x28, 0x20, 0xad, 0xaf, + 0xab, 0x47, 0xd6, 0xbe, 0x7d, 0xb8, 0x6f, 0x44, 0x30, 0xcc, 0x66, 0x73, + 0x9b, 0x85, 0xaa, 0x52, 0x4a, 0x38, 0x9d, 0xce, 0xc6, 0x76, 0xd6, 0xcc, + 0x36, 0x85, 0xa2, 0xc0, 0xe1, 0x70, 0xb2, 0xd7, 0x21, 0x11, 0x11, 0x51, + 0x27, 0xc4, 0x00, 0x90, 0x88, 0x88, 0xa8, 0x83, 0x53, 0x14, 0x05, 0x9b, + 0x36, 0x6e, 0xc0, 0x92, 0xaf, 0x17, 0x1b, 0xea, 0x79, 0x67, 0x84, 0xd9, + 0x64, 0x42, 0x58, 0x68, 0x68, 0x8b, 0x02, 0x40, 0xa0, 0x31, 0x14, 0xba, + 0xf2, 0xaa, 0xab, 0xd1, 0xbb, 0x4f, 0xc6, 0x59, 0x8f, 0x45, 0x51, 0x14, + 0xd4, 0xd5, 0xd5, 0xe1, 0xbd, 0x77, 0xdf, 0x42, 0x6e, 0x4e, 0x8e, 0x4f, + 0x5e, 0x13, 0x4d, 0xd3, 0x31, 0x62, 0xd4, 0x68, 0x6c, 0xde, 0xb4, 0x11, + 0xeb, 0xd7, 0xad, 0x6d, 0xf3, 0xeb, 0xfd, 0xd3, 0x8f, 0xcb, 0xf1, 0xd3, + 0x4f, 0x2b, 0xce, 0x6d, 0x08, 0xee, 0x29, 0x54, 0x55, 0x45, 0x44, 0x64, + 0x04, 0x0e, 0x17, 0x1a, 0x0f, 0x00, 0x6d, 0x36, 0x1b, 0xe6, 0xcd, 0x9d, + 0x83, 0x41, 0x17, 0x5d, 0x84, 0x2e, 0x5d, 0x62, 0x3b, 0x75, 0x1b, 0x94, + 0x52, 0x42, 0xd3, 0x75, 0xe8, 0xa7, 0xf4, 0xd8, 0x0b, 0x0a, 0x0a, 0xc6, + 0x98, 0x07, 0xc7, 0x62, 0xc7, 0x8e, 0x6d, 0xc8, 0x3b, 0xd8, 0x7c, 0x6f, + 0x5a, 0x09, 0x89, 0xe5, 0xcb, 0x7e, 0xc0, 0x25, 0x97, 0x5e, 0x86, 0xbb, + 0xef, 0x1b, 0xde, 0xe2, 0xf9, 0x34, 0xcf, 0xa6, 0xb4, 0xa4, 0x04, 0xaf, + 0xbf, 0xfa, 0x37, 0x98, 0xcc, 0x66, 0x63, 0xf7, 0xae, 0xcb, 0x85, 0xe2, + 0xe2, 0x22, 0x10, 0x11, 0x11, 0x51, 0xe7, 0xc2, 0x00, 0x90, 0x88, 0x88, + 0xc8, 0x0b, 0xc4, 0xc6, 0xc5, 0x61, 0xe7, 0x8e, 0x6d, 0xd8, 0xb1, 0x7d, + 0x7b, 0xbb, 0x1e, 0xc7, 0x91, 0x92, 0x12, 0x6c, 0xdc, 0xf0, 0x0b, 0x7a, + 0xf6, 0xee, 0xdd, 0xe4, 0xe7, 0xbe, 0xfa, 0xf2, 0x73, 0x2c, 0xfd, 0xfe, + 0x3b, 0x9f, 0xbd, 0x1e, 0x52, 0xea, 0x88, 0x8a, 0x8a, 0xc2, 0xd8, 0x87, + 0xc7, 0x23, 0x3b, 0x2b, 0x0b, 0x15, 0x15, 0xe5, 0x6d, 0xb6, 0x6d, 0x21, + 0x04, 0xba, 0x26, 0x26, 0x60, 0xdd, 0x9a, 0xd5, 0x28, 0x28, 0xc8, 0x6f, + 0xd7, 0xf3, 0xcc, 0xce, 0xda, 0x87, 0xfd, 0xd9, 0xd9, 0x9d, 0x3e, 0x00, + 0x3c, 0x13, 0x5d, 0xd7, 0x91, 0xd9, 0xb7, 0x1f, 0x46, 0x8c, 0x1a, 0x8d, + 0x57, 0x5f, 0xf9, 0xab, 0xa1, 0x5e, 0x75, 0x36, 0x9b, 0x0d, 0x53, 0x26, + 0x4f, 0x42, 0xdf, 0xfe, 0x03, 0x90, 0x99, 0x99, 0x09, 0x97, 0xeb, 0xdc, + 0xe7, 0x3d, 0x2c, 0x2f, 0x2f, 0xc7, 0xc2, 0x05, 0xf3, 0x78, 0x41, 0x88, + 0x88, 0x88, 0xa8, 0x49, 0x5c, 0x04, 0x84, 0x88, 0x88, 0xa8, 0x83, 0xd3, + 0x75, 0x1d, 0xdd, 0x92, 0x53, 0xf0, 0xbb, 0x27, 0xfe, 0x88, 0xe0, 0x90, + 0x90, 0xf6, 0x3d, 0x16, 0x4d, 0x47, 0x45, 0x79, 0x05, 0x74, 0xed, 0xcc, + 0xbd, 0x97, 0x84, 0xa2, 0x20, 0x3b, 0x2b, 0x0b, 0xb3, 0xa6, 0x4f, 0x83, + 0xcd, 0x66, 0xf3, 0xf9, 0x6b, 0x73, 0xd1, 0xe0, 0xc1, 0x18, 0x3a, 0xec, + 0xb6, 0xb6, 0xe9, 0xa9, 0x77, 0x3c, 0x3f, 0xd2, 0x34, 0x0d, 0x19, 0x19, + 0x7d, 0xf1, 0xd8, 0xef, 0x9e, 0x80, 0xc5, 0xcf, 0xaf, 0x5d, 0xcf, 0xcf, + 0x66, 0xb3, 0xa1, 0xaa, 0xb2, 0x92, 0x43, 0x46, 0xcf, 0x42, 0x08, 0x05, + 0x77, 0xdf, 0x73, 0x1f, 0x7e, 0x7b, 0xfd, 0x8d, 0x86, 0xcb, 0xe4, 0xe5, + 0xe5, 0xe1, 0x83, 0x49, 0xef, 0xa0, 0xae, 0xae, 0xce, 0x2d, 0x2b, 0x55, + 0x13, 0x11, 0x11, 0x11, 0x9d, 0x09, 0x03, 0x40, 0x22, 0x22, 0x22, 0x2f, + 0xa0, 0xb9, 0x5c, 0xb8, 0xfa, 0x9a, 0x6b, 0x30, 0xea, 0xfe, 0x31, 0xed, + 0x7a, 0x1c, 0xf2, 0x94, 0xff, 0x9e, 0x49, 0x5d, 0x4d, 0x0d, 0x3e, 0x9e, + 0xf3, 0x11, 0x72, 0x73, 0x8d, 0x0f, 0xfd, 0x35, 0x99, 0x4c, 0x30, 0x9b, + 0x2d, 0x30, 0x9b, 0xcd, 0x86, 0x7e, 0xda, 0x6a, 0x58, 0x6c, 0x5b, 0x08, + 0x08, 0x08, 0xc2, 0x3d, 0xf7, 0x0d, 0x47, 0x6a, 0x5a, 0xfa, 0xb9, 0x3d, + 0x90, 0x29, 0x0a, 0x2c, 0x16, 0xcb, 0xc9, 0xa0, 0x4d, 0xd7, 0x75, 0xdc, + 0x3c, 0x64, 0x08, 0x6e, 0xbe, 0x65, 0x08, 0x6f, 0xfe, 0x0e, 0x4c, 0x4a, + 0x1d, 0xc1, 0xc1, 0xc1, 0x78, 0xe4, 0xd1, 0xc7, 0x91, 0x90, 0x60, 0x7c, + 0xb5, 0xe5, 0xef, 0xbe, 0x59, 0x82, 0x2f, 0x3e, 0x5b, 0x04, 0x30, 0x00, + 0x24, 0x22, 0x22, 0x22, 0x0f, 0xe1, 0x10, 0x60, 0x22, 0x22, 0x22, 0x2f, + 0xa1, 0xeb, 0x12, 0x23, 0x46, 0xdd, 0x8f, 0x6d, 0x5b, 0xb7, 0x60, 0xed, + 0x9a, 0xd5, 0x1d, 0xee, 0xf8, 0x14, 0x45, 0xc1, 0xfa, 0xf5, 0xeb, 0xf0, + 0xf5, 0xe2, 0x2f, 0x0d, 0xcf, 0x55, 0x18, 0x19, 0x19, 0x89, 0x7b, 0x87, + 0x8f, 0x44, 0x74, 0x4c, 0x8c, 0xa1, 0x5e, 0x66, 0x52, 0x4a, 0xac, 0x5e, + 0xb9, 0x12, 0x3f, 0xad, 0x58, 0xde, 0x66, 0xf3, 0x21, 0x9e, 0xdb, 0x35, + 0xd1, 0xd0, 0xab, 0x57, 0x6f, 0x8c, 0x9b, 0x30, 0x11, 0x2f, 0x3c, 0xfb, + 0x34, 0xec, 0xf6, 0xd6, 0xf5, 0x7a, 0x8c, 0x88, 0x88, 0x44, 0x97, 0xd8, + 0xb8, 0xd3, 0xce, 0xc9, 0x62, 0xf1, 0xc3, 0x03, 0x0f, 0x3e, 0x8c, 0xdd, + 0x3b, 0x77, 0x22, 0x3b, 0x3b, 0x8b, 0x0d, 0xa0, 0x83, 0x72, 0xb9, 0x5c, + 0xc8, 0xc8, 0xcc, 0xc4, 0xe8, 0x07, 0xc6, 0xe2, 0x5f, 0xaf, 0xbf, 0x6a, + 0x68, 0xd1, 0x1b, 0x5d, 0xd7, 0x31, 0x73, 0xc6, 0x74, 0xf4, 0xeb, 0x3f, + 0x00, 0x7d, 0x32, 0x32, 0xcf, 0x7c, 0xef, 0xb3, 0xd3, 0x25, 0x11, 0x11, + 0x11, 0xb5, 0x21, 0x06, 0x80, 0x44, 0x44, 0x44, 0x5e, 0x42, 0x4a, 0x89, + 0xe8, 0xe8, 0x18, 0x3c, 0x30, 0xf6, 0x61, 0x64, 0x65, 0xed, 0x43, 0xf9, + 0xd1, 0xa3, 0xed, 0x71, 0x14, 0x67, 0x5c, 0x68, 0x54, 0x55, 0x55, 0x14, + 0x16, 0x14, 0xe0, 0xfd, 0xf7, 0xde, 0x45, 0x55, 0x65, 0xa5, 0xe1, 0xad, + 0xdd, 0x71, 0xd7, 0x3d, 0xf8, 0xdd, 0x13, 0x7f, 0x38, 0xde, 0xfb, 0xad, + 0xf9, 0xcf, 0xeb, 0xba, 0x86, 0xba, 0xda, 0x3a, 0xac, 0xfc, 0x79, 0x45, + 0x87, 0x08, 0x00, 0x81, 0xc6, 0x00, 0xe8, 0xa6, 0x9b, 0x6f, 0xc1, 0xc6, + 0x0d, 0xbf, 0x60, 0xc1, 0xbc, 0xb9, 0xad, 0xda, 0xc6, 0x85, 0x83, 0x2e, + 0x42, 0x97, 0x2e, 0x5d, 0xa0, 0xeb, 0xa7, 0x57, 0x42, 0xcf, 0x5e, 0xbd, + 0x30, 0x7c, 0xd4, 0x68, 0xbc, 0xf6, 0xb7, 0xbf, 0xc2, 0x6e, 0xb7, 0xb7, + 0xdb, 0x7d, 0x47, 0xcd, 0xd7, 0xd1, 0x90, 0x5b, 0x87, 0x61, 0xc3, 0x2f, + 0xeb, 0xb1, 0xf4, 0x07, 0x63, 0x73, 0x5f, 0x1e, 0xc8, 0xcd, 0xc1, 0xc7, + 0x73, 0x3e, 0xc2, 0x0b, 0x7f, 0x79, 0x09, 0xfe, 0xfe, 0xd6, 0x5f, 0xfd, + 0x7d, 0x47, 0xe8, 0x1c, 0x28, 0x14, 0xf6, 0x50, 0x24, 0x22, 0x22, 0xf2, + 0x15, 0x1c, 0x02, 0x4c, 0x44, 0x44, 0xe4, 0x65, 0x2e, 0xbe, 0xe4, 0x52, + 0xdc, 0x71, 0xe7, 0xdd, 0x50, 0x14, 0xcf, 0x7f, 0x8d, 0x2b, 0x8a, 0x82, + 0x80, 0xc0, 0x80, 0xd3, 0xf6, 0x2d, 0x84, 0x80, 0x2e, 0x75, 0xcc, 0x9c, + 0x39, 0x0d, 0xdb, 0xb7, 0x6d, 0x31, 0xbc, 0xad, 0x0b, 0x2e, 0x1c, 0x84, + 0x31, 0x0f, 0x8e, 0x85, 0xaa, 0xaa, 0x70, 0x3a, 0x9d, 0x70, 0xb9, 0x8c, + 0xfc, 0xb8, 0x4e, 0x5b, 0x89, 0xb5, 0x23, 0x90, 0x52, 0xc2, 0xcf, 0xcf, + 0x0f, 0xe3, 0x27, 0x4c, 0x44, 0xef, 0x3e, 0x19, 0x2d, 0x2e, 0x1f, 0x1a, + 0x1a, 0x8a, 0x3b, 0xee, 0xba, 0x0b, 0xaa, 0x6a, 0xc2, 0xff, 0x76, 0xfb, + 0x52, 0x14, 0x05, 0xb7, 0x0e, 0xbb, 0x0d, 0xd7, 0x5d, 0x7f, 0x43, 0xbb, + 0x9c, 0x9b, 0xc9, 0x64, 0x82, 0x35, 0x20, 0x80, 0x8d, 0xce, 0x80, 0xc8, + 0xc8, 0x48, 0xdc, 0x3f, 0xe6, 0x01, 0x44, 0x45, 0x45, 0x19, 0xbe, 0x6f, + 0xbe, 0xf9, 0x7a, 0x31, 0x96, 0x2f, 0x5b, 0x7a, 0xc6, 0xb9, 0x00, 0xc3, + 0xc2, 0xc2, 0xda, 0xf7, 0x25, 0x41, 0x51, 0x10, 0x19, 0x19, 0xd9, 0x2e, + 0xbf, 0x67, 0x88, 0x88, 0x88, 0xc8, 0x0d, 0xdf, 0xed, 0xac, 0x02, 0x22, + 0x22, 0x22, 0xef, 0x62, 0xb5, 0x5a, 0x71, 0xdf, 0x88, 0x91, 0xe8, 0xdb, + 0xb7, 0xbf, 0xc7, 0xf7, 0x1d, 0x14, 0x1c, 0x8c, 0x8c, 0xcc, 0xbe, 0xa7, + 0x85, 0x02, 0xaa, 0xaa, 0x62, 0xd9, 0x0f, 0x3f, 0x60, 0xde, 0xc7, 0x73, + 0x8c, 0x6f, 0x27, 0x28, 0x18, 0xe3, 0x26, 0x4c, 0x44, 0x5c, 0x5c, 0x7c, + 0x87, 0xe9, 0xc9, 0x77, 0x2e, 0x74, 0x5d, 0x47, 0x62, 0x52, 0x22, 0x1e, + 0x7a, 0x78, 0x3c, 0xc2, 0xc3, 0x23, 0x0c, 0x97, 0x33, 0x99, 0x4c, 0x18, + 0x76, 0xfb, 0x9d, 0xb8, 0xf0, 0xc2, 0x8b, 0x20, 0xe5, 0xaf, 0xeb, 0x41, + 0x4a, 0x89, 0xd0, 0xd0, 0x50, 0x8c, 0x1f, 0x3f, 0x11, 0xdd, 0xba, 0x25, + 0x7b, 0xfc, 0xbc, 0xe2, 0xe2, 0xbb, 0x22, 0x39, 0x39, 0x85, 0x8b, 0x55, + 0x18, 0x20, 0xa5, 0xc4, 0x45, 0x83, 0x2f, 0xc6, 0x88, 0x51, 0xf7, 0x1b, + 0xae, 0xaf, 0xda, 0xda, 0x5a, 0x4c, 0x9f, 0x32, 0x05, 0x45, 0x87, 0x0f, + 0xff, 0x2a, 0x54, 0xef, 0x93, 0x91, 0x89, 0xb8, 0xf8, 0xf8, 0x76, 0x3b, + 0x9f, 0xc8, 0xc8, 0x48, 0x64, 0xf6, 0xeb, 0xdf, 0xa1, 0xe6, 0xdc, 0x24, + 0x22, 0x22, 0xa2, 0xd6, 0x63, 0x00, 0x48, 0x44, 0x44, 0xe4, 0x65, 0x34, + 0x4d, 0x43, 0x4a, 0x4a, 0x2a, 0x9e, 0xf8, 0xc3, 0x1f, 0x11, 0x16, 0x1e, + 0xee, 0xb1, 0xfd, 0x0a, 0x45, 0xc1, 0x8d, 0x37, 0xdd, 0x8c, 0xf3, 0xcf, + 0xbf, 0xe0, 0xe4, 0xb0, 0x50, 0x21, 0x04, 0xf2, 0xf3, 0x0f, 0x61, 0xfa, + 0xb4, 0x29, 0x68, 0x68, 0x68, 0x30, 0xbc, 0xad, 0xe1, 0x23, 0x47, 0xe2, + 0xaa, 0xab, 0xaf, 0x81, 0xd3, 0xe9, 0xf4, 0xa1, 0x2b, 0x23, 0xf0, 0xdb, + 0x1b, 0x6e, 0xc4, 0x83, 0x63, 0x1f, 0x46, 0x78, 0x44, 0xf3, 0x21, 0xa0, + 0xbf, 0xbf, 0x3f, 0x86, 0xde, 0x7a, 0x1b, 0x26, 0x4c, 0x7c, 0x0c, 0xfe, + 0x56, 0xeb, 0x59, 0x3f, 0xe7, 0x72, 0xb9, 0xd0, 0xb7, 0x5f, 0x3f, 0x3c, + 0xf6, 0xfb, 0x27, 0x9a, 0xfc, 0x5c, 0x5b, 0xb3, 0x5a, 0xad, 0x18, 0x76, + 0xfb, 0xed, 0xe8, 0x96, 0x9c, 0xcc, 0x46, 0x67, 0x90, 0xaa, 0xaa, 0xb8, + 0xe7, 0xde, 0x11, 0x18, 0x34, 0x78, 0xb0, 0xe1, 0x32, 0x3b, 0x77, 0x6e, + 0xc7, 0xfb, 0x93, 0xde, 0x81, 0xc3, 0xe1, 0x38, 0x2d, 0x38, 0x4c, 0xef, + 0xde, 0x03, 0x37, 0xde, 0x74, 0x0b, 0x4c, 0x26, 0xcf, 0xcf, 0xd8, 0x23, + 0x14, 0x05, 0xd7, 0xfe, 0xe6, 0x7a, 0xf4, 0xed, 0xdb, 0x97, 0x17, 0x95, + 0x88, 0x88, 0xc8, 0x47, 0x30, 0x00, 0x24, 0x22, 0x22, 0xf2, 0x42, 0x0e, + 0x87, 0x03, 0x97, 0x5e, 0x7e, 0x05, 0xc6, 0x3c, 0x30, 0xd6, 0x23, 0xfb, + 0x0b, 0x0e, 0x0e, 0xc6, 0x88, 0x91, 0xf7, 0xe3, 0xf1, 0xdf, 0xff, 0x01, + 0x01, 0x81, 0x81, 0x27, 0x03, 0x40, 0x9b, 0xcd, 0x86, 0xb9, 0x73, 0x3e, + 0xc2, 0xc6, 0x5f, 0xd6, 0x1b, 0xde, 0x56, 0xff, 0x01, 0xe7, 0xe1, 0xee, + 0x7b, 0x87, 0xb7, 0xee, 0x40, 0x24, 0xa0, 0xb9, 0x34, 0xb8, 0x5c, 0xae, + 0x66, 0x3f, 0x6a, 0xb7, 0xdb, 0x21, 0x21, 0x81, 0xe3, 0x99, 0x8a, 0x94, + 0x12, 0x0e, 0xbb, 0xc3, 0xd0, 0x6e, 0x5a, 0xdb, 0x2b, 0xd1, 0x6a, 0xb5, + 0x62, 0xf4, 0xd8, 0xb1, 0x78, 0xe1, 0xc5, 0x97, 0x70, 0xfe, 0xf9, 0x17, + 0x9c, 0xb5, 0x27, 0x58, 0xaf, 0xde, 0xbd, 0xf1, 0x87, 0x3f, 0x3f, 0x8d, + 0x67, 0x9f, 0x7f, 0x11, 0xd1, 0xd1, 0xd1, 0xcd, 0xce, 0xb3, 0xe7, 0x74, + 0x3a, 0x71, 0xfd, 0xf5, 0x37, 0xe2, 0xd6, 0x61, 0xb7, 0x79, 0xe4, 0x7a, + 0x47, 0x47, 0xc7, 0x60, 0xec, 0xb8, 0x09, 0x18, 0x31, 0x72, 0x34, 0x2c, + 0x16, 0xcb, 0x7f, 0xab, 0x5f, 0xd7, 0xe1, 0x70, 0x18, 0x9b, 0x8b, 0x50, + 0xd7, 0x34, 0x18, 0xee, 0x37, 0x28, 0x60, 0x78, 0x68, 0xb7, 0xc3, 0xe1, + 0xf8, 0xd5, 0xfa, 0x18, 0x4e, 0xa7, 0xc3, 0xc0, 0xad, 0x23, 0xe1, 0x72, + 0x3a, 0x71, 0x72, 0x2d, 0x6b, 0x29, 0x0d, 0x2d, 0xd8, 0x01, 0x34, 0x86, + 0xee, 0xc2, 0xe0, 0xe7, 0x62, 0xe3, 0xe3, 0xf1, 0xc4, 0x93, 0x7f, 0x42, + 0xa4, 0xc1, 0xa1, 0xc0, 0x00, 0xb0, 0x68, 0xc1, 0x7c, 0x2c, 0xfe, 0xea, + 0x8b, 0xd3, 0xfe, 0x2c, 0x20, 0x20, 0x00, 0xe3, 0x26, 0x3c, 0x82, 0x7b, + 0x87, 0x8f, 0x84, 0xd5, 0xea, 0xb9, 0x61, 0xd8, 0x7e, 0xfe, 0x7e, 0xb8, + 0xf3, 0xce, 0xbb, 0xf1, 0xfb, 0x27, 0xfe, 0x80, 0xe0, 0xe0, 0x10, 0xfe, + 0xb2, 0x25, 0x22, 0x22, 0xf2, 0x11, 0x5c, 0x04, 0x84, 0x88, 0x88, 0xc8, + 0x8b, 0x0d, 0x1f, 0x39, 0x0a, 0x36, 0x5b, 0x03, 0x8a, 0x0e, 0x17, 0x41, + 0xb8, 0x61, 0xae, 0x2e, 0x21, 0x04, 0xa2, 0xa2, 0xa2, 0x70, 0xc5, 0x15, + 0x57, 0x61, 0xc0, 0xc0, 0x81, 0xb0, 0x5a, 0xad, 0xd0, 0xb4, 0xff, 0x06, + 0x35, 0x55, 0x95, 0x95, 0x50, 0x55, 0x13, 0x86, 0x0e, 0xbb, 0x0d, 0x42, + 0x34, 0xbf, 0x7f, 0xb3, 0xc9, 0x84, 0x1b, 0x6e, 0xba, 0x19, 0x89, 0x89, + 0x49, 0xad, 0x3c, 0x20, 0xa0, 0x77, 0x46, 0x06, 0x6e, 0xbf, 0xf3, 0xee, + 0xd3, 0x8e, 0xe3, 0x7f, 0x49, 0x29, 0x11, 0x19, 0x11, 0x01, 0x3f, 0x3f, + 0x7f, 0x40, 0x4a, 0x48, 0x29, 0x61, 0x0d, 0x08, 0xc0, 0xb0, 0xdb, 0xef, + 0x40, 0x55, 0x55, 0x55, 0x13, 0x75, 0x25, 0x21, 0x84, 0x82, 0xb8, 0xf8, + 0x38, 0xb4, 0x66, 0xed, 0x0b, 0x5d, 0xd7, 0xe1, 0xef, 0xe7, 0x8f, 0x9b, + 0x87, 0x0c, 0xc5, 0xa5, 0x97, 0x5f, 0x8e, 0xcd, 0x9b, 0x36, 0x61, 0xdb, + 0xd6, 0x2d, 0x38, 0x5a, 0x56, 0x06, 0x29, 0x25, 0x42, 0xc2, 0x42, 0xd1, + 0xb7, 0x6f, 0x3f, 0x0c, 0xba, 0xe8, 0x62, 0x44, 0x47, 0x47, 0xc3, 0x6c, + 0x36, 0x1b, 0x0e, 0x1b, 0xfd, 0xad, 0x56, 0x8c, 0x7d, 0x78, 0x3c, 0xfc, + 0xfd, 0xfc, 0x51, 0x59, 0x55, 0x09, 0xa0, 0xed, 0x87, 0xe5, 0x2a, 0x8a, + 0x40, 0x7c, 0x7c, 0x57, 0x5c, 0x7d, 0xcd, 0x75, 0xe8, 0x93, 0x91, 0xf1, + 0xab, 0xe3, 0x0b, 0x8f, 0x88, 0xc4, 0x90, 0xa1, 0xc3, 0x50, 0xd9, 0xcc, + 0x42, 0x2f, 0x42, 0x4a, 0x24, 0x76, 0x4b, 0x6e, 0xf2, 0x1a, 0xfd, 0xcf, + 0x05, 0x43, 0x42, 0x62, 0x22, 0x86, 0xdd, 0x76, 0x47, 0x63, 0x68, 0x7b, + 0x96, 0x73, 0x93, 0xba, 0x8e, 0x88, 0xc8, 0x48, 0x58, 0xff, 0xa7, 0x27, + 0xe4, 0x0d, 0x37, 0xde, 0x84, 0x82, 0xfc, 0xfc, 0x26, 0xdb, 0x80, 0x10, + 0xc0, 0xf9, 0x17, 0x5c, 0x08, 0x45, 0x69, 0x1c, 0xd2, 0x1a, 0x10, 0x18, + 0x88, 0x1b, 0x6f, 0xba, 0x09, 0x45, 0x45, 0x45, 0x4d, 0xde, 0xbb, 0xba, + 0xa6, 0x21, 0xbd, 0x7b, 0x77, 0xc3, 0xe7, 0xe2, 0x72, 0x3a, 0x31, 0xe0, + 0xbc, 0x81, 0x78, 0xf2, 0x0f, 0x7f, 0xc6, 0x86, 0x5f, 0xd6, 0x1b, 0x6e, + 0x97, 0x65, 0xa5, 0xa5, 0xa8, 0xad, 0xad, 0x45, 0x60, 0x60, 0xe0, 0x7f, + 0xef, 0xe1, 0xc8, 0x28, 0x3c, 0xfd, 0xec, 0xf3, 0xb8, 0xe6, 0xda, 0xeb, + 0xb0, 0x7e, 0xdd, 0x5a, 0x94, 0x96, 0x1e, 0x81, 0xbb, 0xd6, 0x64, 0x11, + 0x00, 0x22, 0xa3, 0xa2, 0x30, 0xf8, 0xe2, 0x4b, 0x71, 0xd1, 0xe0, 0xc1, + 0xb0, 0x5a, 0xad, 0x3e, 0x31, 0x3c, 0x9f, 0x88, 0x88, 0x88, 0x8e, 0x7f, + 0xd7, 0x67, 0x1f, 0xc8, 0xe7, 0xd2, 0x6e, 0x44, 0xd4, 0xe9, 0x48, 0x29, + 0x39, 0xa7, 0x15, 0xf9, 0x0c, 0x55, 0x35, 0xb9, 0x75, 0xc5, 0x50, 0x29, + 0x01, 0x29, 0xf5, 0x33, 0x86, 0x01, 0x42, 0x08, 0x28, 0x8a, 0xd2, 0xa2, + 0xf6, 0xa4, 0xe9, 0x3a, 0xe4, 0x39, 0x04, 0x0b, 0x8a, 0xa2, 0x18, 0x5a, + 0x98, 0x40, 0xca, 0xc6, 0x5e, 0x65, 0xa7, 0x0e, 0x57, 0x56, 0x14, 0xd5, + 0x50, 0x5d, 0xe9, 0xba, 0xde, 0x26, 0xe1, 0x47, 0x63, 0xdd, 0x28, 0xa7, + 0xed, 0x53, 0x4a, 0x09, 0x5d, 0xd7, 0x5b, 0xb5, 0xba, 0xae, 0x10, 0xc2, + 0xed, 0x73, 0xb2, 0xc9, 0xe3, 0x81, 0xe9, 0x19, 0xaf, 0x37, 0x1a, 0x87, + 0xb9, 0x1a, 0xa9, 0x44, 0x4d, 0xd3, 0x5a, 0x74, 0x8e, 0xc6, 0xaf, 0xeb, + 0xaf, 0xeb, 0x4f, 0x55, 0x55, 0x43, 0xf7, 0xe0, 0xa9, 0xd7, 0x55, 0x08, + 0x01, 0x45, 0x55, 0x0d, 0xc5, 0xa8, 0xad, 0xb9, 0x1f, 0x8c, 0x9e, 0xcf, + 0xa9, 0xe7, 0x75, 0xb6, 0x90, 0xb1, 0xa5, 0xdb, 0x3a, 0x17, 0x6d, 0x75, + 0xef, 0x13, 0x75, 0xa8, 0xe7, 0x3e, 0x48, 0x28, 0x50, 0x8e, 0xff, 0x03, + 0x03, 0x11, 0x51, 0xe7, 0xc4, 0x00, 0x90, 0x88, 0x3a, 0xe7, 0x83, 0x20, + 0x03, 0x40, 0x22, 0x22, 0x22, 0xa2, 0xce, 0xf1, 0xdc, 0xc7, 0x00, 0x90, + 0x88, 0x88, 0x73, 0x00, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0xf9, 0x32, 0x06, 0x80, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x3e, 0x8c, 0x01, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0xd1, 0xff, 0x67, 0xef, 0xbe, 0xe3, 0xa3, 0xa8, 0xf3, 0x3f, 0x8e, 0xbf, + 0x66, 0x76, 0x37, 0xbd, 0x27, 0x24, 0x90, 0x50, 0x13, 0x42, 0x20, 0xf4, + 0xde, 0x7b, 0x2f, 0x82, 0xa8, 0x88, 0x15, 0xbb, 0x72, 0x96, 0xf3, 0xec, + 0x7a, 0xf6, 0xfb, 0x9d, 0xe7, 0x9d, 0xe5, 0x3c, 0x7b, 0xef, 0x78, 0x9c, + 0x7a, 0x28, 0x82, 0xb4, 0xd0, 0x7b, 0x2f, 0x81, 0x40, 0x1a, 0xa1, 0x05, + 0xd2, 0x7b, 0xcf, 0x96, 0x99, 0xdf, 0x1f, 0x9b, 0x2c, 0x09, 0x29, 0x24, + 0x11, 0xbc, 0x24, 0x7c, 0x9e, 0x8f, 0x07, 0x9a, 0xdd, 0x99, 0x9d, 0x99, + 0xfd, 0x4e, 0xd9, 0x9d, 0xf7, 0x7e, 0x8b, 0x10, 0x42, 0xb4, 0x62, 0x12, + 0x00, 0x0a, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, + 0xd1, 0x8a, 0x49, 0x00, 0x28, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, + 0x42, 0x08, 0x21, 0x44, 0x2b, 0x26, 0x01, 0xa0, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xad, 0x98, 0x04, 0x80, 0x42, + 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0xb4, 0x62, + 0x12, 0x00, 0x0a, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, + 0x08, 0xd1, 0x8a, 0x49, 0x00, 0x28, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x10, 0x42, 0x08, 0x21, 0x44, 0x2b, 0x26, 0x01, 0xa0, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xad, 0x98, 0x04, 0x80, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0xb4, + 0x62, 0x12, 0x00, 0x0a, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, + 0x42, 0x08, 0xd1, 0x8a, 0x49, 0x00, 0x28, 0x84, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x21, 0x44, 0x2b, 0x26, 0x01, 0xa0, 0x10, 0x42, + 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xad, 0x98, 0x04, + 0x80, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, + 0xb4, 0x62, 0x12, 0x00, 0x0a, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x10, 0x42, 0x08, 0xd1, 0x8a, 0x49, 0x00, 0x28, 0x84, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x44, 0x2b, 0x26, 0x01, 0xa0, 0x10, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xad, 0x98, + 0x04, 0x80, 0x42, 0x08, 0x21, 0x5a, 0x15, 0x9b, 0xcd, 0xc6, 0xb2, 0x5f, + 0x7e, 0xe6, 0xcb, 0x2f, 0x3e, 0x23, 0x33, 0x23, 0x43, 0x0a, 0x44, 0x08, + 0x39, 0x57, 0x2f, 0x39, 0x8b, 0xc5, 0xc2, 0x6b, 0x7f, 0xff, 0x1b, 0x5f, + 0x7c, 0xf6, 0x89, 0x94, 0xf9, 0x15, 0x26, 0x27, 0x27, 0x9b, 0xf9, 0xd7, + 0xcd, 0x25, 0x2e, 0xf6, 0x98, 0x14, 0x86, 0x10, 0x42, 0x88, 0x16, 0x45, + 0x02, 0x40, 0x21, 0x84, 0x10, 0xad, 0xca, 0x7b, 0xef, 0xfc, 0x8b, 0xc7, + 0x1f, 0x79, 0x98, 0x57, 0xff, 0xfa, 0x17, 0x6e, 0x9a, 0x7f, 0xdd, 0xef, + 0xba, 0xee, 0x98, 0x23, 0x87, 0xe9, 0x16, 0xda, 0xd1, 0xf1, 0x2f, 0xe6, + 0xc8, 0xe1, 0x66, 0x5f, 0x5e, 0x6f, 0xbd, 0xf9, 0xba, 0x63, 0x7b, 0xc7, + 0x8f, 0x1e, 0xde, 0x6a, 0x8e, 0x83, 0xa6, 0xec, 0x8b, 0x7b, 0xef, 0xba, + 0xdd, 0x31, 0xff, 0xfd, 0xf7, 0xdd, 0xdd, 0xe2, 0xdf, 0x8f, 0x9c, 0xab, + 0x97, 0x47, 0x59, 0x59, 0x19, 0x77, 0xdf, 0xb1, 0x80, 0xcf, 0x3e, 0xf9, + 0x88, 0x5f, 0x96, 0xfe, 0x2c, 0x65, 0x7e, 0x85, 0x9d, 0x0f, 0xeb, 0xd7, + 0x46, 0x71, 0xf0, 0xc0, 0x7e, 0xe6, 0x5f, 0x37, 0x97, 0xed, 0xdb, 0xb6, + 0xca, 0x87, 0xae, 0x10, 0x42, 0x88, 0x16, 0x43, 0x02, 0x40, 0x21, 0x84, + 0x10, 0xad, 0xca, 0xc9, 0x13, 0x49, 0x8e, 0xbf, 0x93, 0x93, 0xcf, 0x60, + 0x36, 0x9b, 0xa5, 0x50, 0x84, 0xf8, 0x8d, 0x3e, 0xfe, 0xe8, 0x83, 0x6a, + 0x81, 0x4b, 0xb7, 0xd0, 0x8e, 0x6c, 0xdc, 0xb0, 0xbe, 0xde, 0xd7, 0x44, + 0xad, 0x59, 0x55, 0xe3, 0x35, 0x1f, 0xbc, 0xf7, 0x4e, 0x8b, 0x3f, 0x57, + 0x5f, 0x78, 0xf6, 0x69, 0x76, 0xee, 0xd8, 0x8e, 0x8b, 0x8b, 0x0b, 0xcf, + 0xbd, 0xf0, 0x52, 0xbd, 0xf3, 0xee, 0xdc, 0xb1, 0x9d, 0x67, 0x9f, 0x79, + 0x8a, 0x59, 0xd3, 0x26, 0xd3, 0xbf, 0x77, 0x24, 0x3d, 0xc2, 0x43, 0x19, + 0x3c, 0xa0, 0x0f, 0xf3, 0xae, 0x99, 0xc3, 0x1b, 0xaf, 0xbd, 0xca, 0xf1, + 0xc4, 0x44, 0xb9, 0x3e, 0xb6, 0x30, 0x57, 0xcd, 0x99, 0xcb, 0xf0, 0x11, + 0x23, 0x29, 0x2d, 0x2d, 0xe5, 0x81, 0x85, 0xf7, 0x72, 0x22, 0x29, 0x49, + 0x0a, 0x45, 0x08, 0x21, 0x44, 0x8b, 0x20, 0x01, 0xa0, 0x10, 0x42, 0x88, + 0x56, 0xe5, 0xae, 0x7b, 0xee, 0xa3, 0x63, 0xc7, 0x4e, 0x78, 0x78, 0x78, + 0xf0, 0xe8, 0xe3, 0x4f, 0xe1, 0xe4, 0xe4, 0x24, 0x85, 0x22, 0xc4, 0x65, + 0xb0, 0xec, 0x97, 0xfa, 0x6b, 0xbf, 0x2d, 0xff, 0xe5, 0x97, 0x56, 0x77, + 0xae, 0x6e, 0xd9, 0xb4, 0x91, 0xa5, 0x3f, 0xff, 0x04, 0xc0, 0xf3, 0x2f, + 0xbe, 0xcc, 0xe0, 0x21, 0x43, 0x6b, 0x9d, 0x2f, 0x21, 0x3e, 0x8e, 0x79, + 0xd7, 0xcc, 0xe1, 0xb6, 0x5b, 0x6e, 0xe4, 0xc7, 0xef, 0x17, 0x93, 0x90, + 0x10, 0x8f, 0xa6, 0xd9, 0xf0, 0xf0, 0x70, 0xa7, 0x20, 0x3f, 0x9f, 0xe8, + 0x43, 0x07, 0xf9, 0xe4, 0xa3, 0x0f, 0x99, 0x39, 0x6d, 0x12, 0x4f, 0x3f, + 0xf9, 0x18, 0x45, 0x45, 0x45, 0x72, 0x7d, 0x6c, 0x21, 0x5c, 0x5c, 0x5c, + 0x78, 0xe7, 0xbd, 0x0f, 0x09, 0x08, 0x08, 0xa0, 0xa4, 0xa4, 0x98, 0x3f, + 0x3f, 0xf5, 0x38, 0x9a, 0xa6, 0x49, 0xc1, 0x08, 0x21, 0x84, 0x68, 0xf6, + 0x8c, 0x52, 0x04, 0x42, 0x08, 0x21, 0x5a, 0x93, 0xde, 0x7d, 0xfa, 0xb2, + 0x6e, 0x93, 0x34, 0xcb, 0x12, 0xe2, 0x72, 0xdb, 0xb0, 0x6e, 0x2d, 0x25, + 0x25, 0xc5, 0xb8, 0xb9, 0xb9, 0xd7, 0x98, 0x56, 0x54, 0x54, 0xc4, 0xa6, + 0x8d, 0xeb, 0x5b, 0xd5, 0xa9, 0x36, 0x04, 0xee, 0x00, 0x00, 0x20, 0x00, + 0x49, 0x44, 0x41, 0x54, 0xb9, 0x6a, 0xb3, 0x59, 0x79, 0xf9, 0xa5, 0xe7, + 0x01, 0xe8, 0xd9, 0xab, 0x17, 0xd7, 0x5d, 0x7f, 0x43, 0xad, 0xf3, 0x45, + 0xad, 0x59, 0xc5, 0xa3, 0x0f, 0x3f, 0x84, 0xd9, 0x6c, 0xa6, 0x6d, 0xdb, + 0x76, 0xdc, 0x79, 0xf7, 0xbd, 0x4c, 0x9e, 0x3a, 0x8d, 0x90, 0x90, 0x90, + 0x8a, 0xe5, 0xd8, 0x88, 0x8b, 0x8d, 0x25, 0x6a, 0xcd, 0x2a, 0xbe, 0xfe, + 0xf2, 0x0b, 0x7e, 0xfa, 0xef, 0x8f, 0xc4, 0x1c, 0x39, 0xc2, 0x37, 0xdf, + 0x2d, 0xc6, 0xcf, 0xcf, 0x5f, 0xae, 0x8f, 0x2d, 0x80, 0xb7, 0x8f, 0x0f, + 0x7f, 0xfc, 0xd3, 0x63, 0xbc, 0xf0, 0xdc, 0x33, 0x1c, 0x38, 0xb0, 0x9f, + 0x25, 0x3f, 0x7e, 0xcf, 0xbc, 0xf9, 0x37, 0x4a, 0xc1, 0x08, 0x21, 0x84, + 0x68, 0xd6, 0xa4, 0x06, 0xa0, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, 0xb4, + 0xd2, 0xd2, 0x52, 0xa2, 0xd6, 0xac, 0xa9, 0x75, 0xda, 0x9a, 0xd5, 0x2b, + 0x29, 0x2f, 0x2f, 0x6f, 0x55, 0xef, 0x77, 0xe3, 0x86, 0x0d, 0x24, 0x9f, + 0x39, 0x03, 0xc0, 0x6d, 0xb7, 0xdf, 0x85, 0xa2, 0x28, 0x35, 0xe6, 0xd9, + 0xb9, 0x63, 0x3b, 0x0f, 0x3f, 0x78, 0x3f, 0x66, 0xb3, 0x99, 0x31, 0xe3, + 0xc6, 0xb3, 0x7a, 0xdd, 0x06, 0x6e, 0xbf, 0xf3, 0x2e, 0x47, 0xf8, 0x07, + 0x60, 0x30, 0x18, 0xe8, 0xd9, 0xab, 0x17, 0x8f, 0x3c, 0xf6, 0x04, 0xab, + 0xd7, 0x6d, 0x20, 0x3c, 0xbc, 0x1b, 0x09, 0xf1, 0x71, 0x3c, 0xf2, 0xc7, + 0x07, 0xd1, 0x75, 0x5d, 0x0e, 0xac, 0x16, 0xe2, 0xea, 0x6b, 0xae, 0xc5, + 0xdb, 0xdb, 0x1b, 0x80, 0x2f, 0xbf, 0xf8, 0x4c, 0x0a, 0x44, 0x08, 0x21, + 0x44, 0xb3, 0x27, 0x01, 0xa0, 0x10, 0x42, 0x88, 0x56, 0xa5, 0xbe, 0x41, + 0x2d, 0x4a, 0x4b, 0x4b, 0xf9, 0xe8, 0x83, 0xf7, 0x98, 0x33, 0x6b, 0x3a, + 0x7d, 0x7b, 0x46, 0xd0, 0x33, 0x22, 0x8c, 0xf1, 0xa3, 0x87, 0xf3, 0xd4, + 0x13, 0x8f, 0x12, 0x1f, 0x17, 0xdb, 0xe0, 0x75, 0xd8, 0x6c, 0x36, 0xbe, + 0xf9, 0xea, 0x4b, 0x66, 0x4d, 0x9b, 0x4c, 0xef, 0x1e, 0xe1, 0x8c, 0x18, + 0x32, 0x80, 0x97, 0x5f, 0x78, 0x8e, 0x82, 0x82, 0x82, 0x8b, 0xbe, 0x36, + 0x3d, 0x2d, 0x8d, 0x37, 0x5e, 0x7b, 0x95, 0xe9, 0x53, 0x26, 0xd0, 0xb7, + 0x67, 0x04, 0x03, 0xfb, 0xf6, 0xe4, 0xc6, 0xeb, 0xaf, 0xe5, 0x87, 0xff, + 0xfc, 0x1b, 0x9b, 0xcd, 0xe6, 0x98, 0xef, 0x81, 0x3f, 0xdc, 0xeb, 0x78, + 0x1f, 0x57, 0xcd, 0x98, 0x5a, 0x63, 0x39, 0xb7, 0xdf, 0x7a, 0x93, 0x63, + 0xfa, 0x0d, 0xd7, 0xcd, 0x6d, 0xd2, 0x3a, 0x1a, 0xe2, 0xf4, 0xe9, 0x53, + 0xfc, 0xdf, 0xcb, 0x2f, 0x32, 0x65, 0xe2, 0x38, 0xfa, 0x44, 0x76, 0x63, + 0x60, 0xdf, 0x9e, 0xdc, 0x30, 0xef, 0x1a, 0x16, 0x7f, 0xb7, 0x08, 0xab, + 0xd5, 0x5a, 0x63, 0xfe, 0xaa, 0x03, 0x69, 0xbc, 0xff, 0xee, 0xdb, 0x8e, + 0x72, 0xea, 0xd5, 0xbd, 0x2b, 0x43, 0x06, 0xf6, 0xe5, 0x81, 0x3f, 0xdc, + 0x4b, 0x42, 0x42, 0xfc, 0x6f, 0x2e, 0x9f, 0x4b, 0xb1, 0x2f, 0x2e, 0x66, + 0xed, 0x9a, 0xd5, 0x5c, 0x33, 0x7b, 0x26, 0xbd, 0xba, 0x77, 0x65, 0xf0, + 0x80, 0x3e, 0x3c, 0xf0, 0x87, 0x7b, 0x6b, 0x1c, 0x27, 0xd7, 0xcc, 0x9e, + 0xe9, 0x78, 0xbf, 0x33, 0xa6, 0x4e, 0xac, 0xb1, 0x8c, 0xf9, 0xd7, 0xcd, + 0x75, 0x4c, 0x9f, 0x36, 0x79, 0x7c, 0x8b, 0x3f, 0xb6, 0x00, 0x47, 0xe8, + 0x01, 0xb0, 0xbc, 0x8e, 0x66, 0xc0, 0xcb, 0xaa, 0x0c, 0x8e, 0xe1, 0xed, + 0xe3, 0xd3, 0xe0, 0x73, 0xb5, 0xa9, 0xe5, 0x99, 0x91, 0x9e, 0xce, 0xdb, + 0x6f, 0xbd, 0xc9, 0xbc, 0x6b, 0xe6, 0x30, 0xb8, 0x7f, 0x6f, 0x7a, 0x84, + 0x87, 0x32, 0x6c, 0x50, 0x7f, 0x16, 0xde, 0x73, 0x27, 0x3b, 0x77, 0x6c, + 0xaf, 0xb6, 0x8c, 0x75, 0x51, 0x6b, 0xaa, 0xf5, 0x4b, 0xb8, 0x2e, 0xea, + 0x7c, 0x88, 0x99, 0x97, 0x9b, 0xcb, 0xa0, 0x7e, 0xbd, 0x1c, 0xd3, 0x9e, + 0x7d, 0xe6, 0x29, 0xc7, 0xb4, 0xff, 0xfe, 0xf0, 0x1f, 0x00, 0x14, 0x45, + 0x61, 0xec, 0xf8, 0x9a, 0xfb, 0xb2, 0xa0, 0xa0, 0x80, 0x47, 0x1f, 0x7e, + 0x10, 0x9b, 0xcd, 0xc6, 0xe4, 0xa9, 0xd3, 0xf8, 0xf8, 0xd3, 0xcf, 0x6b, + 0xad, 0x1d, 0x59, 0x55, 0xdb, 0xb6, 0xed, 0xf8, 0x6a, 0xd1, 0x62, 0xbc, + 0xbd, 0xbd, 0xd9, 0xb9, 0x63, 0x3b, 0xab, 0x56, 0xae, 0xa8, 0xf5, 0x5c, + 0x7a, 0xfb, 0xad, 0x37, 0x89, 0x3d, 0x76, 0x94, 0xfb, 0x17, 0xde, 0xc3, + 0xe0, 0x01, 0x7d, 0xe8, 0x13, 0xd9, 0x8d, 0xb9, 0xb3, 0x67, 0xb0, 0x66, + 0xf5, 0x4a, 0x00, 0x32, 0x33, 0x33, 0x79, 0xf6, 0x99, 0xa7, 0x18, 0x35, + 0x7c, 0xb0, 0xfd, 0xba, 0x36, 0x66, 0x04, 0x6f, 0xbe, 0xfe, 0x0f, 0x2c, + 0x16, 0x4b, 0x8b, 0x2e, 0xf3, 0xe6, 0x7c, 0x3e, 0xb8, 0xb8, 0xb8, 0x30, + 0x7c, 0xc4, 0x48, 0x00, 0x8e, 0x27, 0x26, 0xb2, 0x77, 0xcf, 0x6e, 0xf9, + 0x00, 0x16, 0x42, 0x08, 0xd1, 0xac, 0x49, 0x13, 0x60, 0x21, 0x84, 0x10, + 0x57, 0x84, 0x9c, 0x9c, 0x6c, 0x6e, 0xbd, 0x71, 0x3e, 0x89, 0x89, 0x09, + 0xd5, 0x9e, 0x3f, 0x77, 0xee, 0x1c, 0x3f, 0x2f, 0xf9, 0x2f, 0xcb, 0x96, + 0x2e, 0xe5, 0x1f, 0x6f, 0xbc, 0xc9, 0xec, 0x39, 0x73, 0x2f, 0xba, 0xac, + 0xc7, 0x1f, 0x7d, 0x98, 0x15, 0xcb, 0x97, 0x39, 0x1e, 0x97, 0x97, 0x97, + 0xf3, 0xdd, 0xa2, 0x6f, 0x58, 0xb9, 0xe2, 0xd7, 0x7a, 0x5f, 0xb7, 0x6f, + 0xef, 0x1e, 0x1e, 0x58, 0x78, 0x2f, 0xb9, 0xb9, 0x39, 0xd5, 0x9e, 0xdf, + 0xbf, 0x6f, 0x2f, 0xfb, 0xf7, 0xed, 0x25, 0x6a, 0xcd, 0x6a, 0x3e, 0xfc, + 0xe4, 0x73, 0x4c, 0x26, 0x13, 0xd3, 0xa6, 0xcf, 0x60, 0xed, 0x9a, 0xd5, + 0x00, 0xc4, 0xc7, 0xc5, 0x92, 0x95, 0x95, 0x45, 0x40, 0x40, 0x80, 0x63, + 0x7d, 0xfb, 0xf7, 0xed, 0x75, 0xbc, 0x7e, 0xea, 0x8c, 0x99, 0x4d, 0x5a, + 0xc7, 0xc5, 0xac, 0x8b, 0x5a, 0xc3, 0x63, 0x8f, 0x3e, 0x4c, 0x69, 0x49, + 0x89, 0xe3, 0xb9, 0xb2, 0xb2, 0x32, 0x0e, 0xec, 0xdf, 0xc7, 0x81, 0xfd, + 0xfb, 0xf8, 0xe5, 0xe7, 0x25, 0x7c, 0xfa, 0xe5, 0x37, 0x78, 0x7a, 0x7a, + 0xd6, 0xfa, 0xfa, 0x4f, 0x3e, 0xfa, 0x80, 0xd2, 0xd2, 0x52, 0xc7, 0x63, + 0xb3, 0xd9, 0xcc, 0xda, 0x35, 0xab, 0xd9, 0xb6, 0x65, 0x33, 0x5f, 0x7d, + 0xfb, 0x6f, 0xfa, 0x0f, 0x18, 0xd8, 0xe4, 0xf2, 0xf9, 0xad, 0xfb, 0xe2, + 0x62, 0xf6, 0xee, 0xdd, 0xc3, 0xba, 0xb5, 0x51, 0x35, 0xb6, 0x7d, 0xeb, + 0xe6, 0x4d, 0x7c, 0xf1, 0xf5, 0x22, 0x06, 0x0d, 0x1e, 0x02, 0xc0, 0xac, + 0xd9, 0x73, 0x88, 0x89, 0x39, 0xe2, 0x08, 0x01, 0xce, 0x9d, 0x3d, 0x4b, + 0x48, 0xfb, 0xf6, 0x8e, 0x60, 0x23, 0xfa, 0xd0, 0x41, 0xc7, 0x32, 0x66, + 0xce, 0x9a, 0xdd, 0xa2, 0x8f, 0xad, 0x4a, 0xdd, 0x7b, 0x44, 0x72, 0xfa, + 0xd4, 0x29, 0xd2, 0xd2, 0x52, 0xd9, 0xb1, 0x7d, 0x5b, 0xb5, 0xd7, 0x03, + 0x64, 0x66, 0x64, 0xb0, 0x67, 0xf7, 0x2e, 0x00, 0x3a, 0x74, 0xec, 0x48, + 0x50, 0x50, 0x5b, 0xf6, 0xed, 0xdd, 0xd3, 0xa0, 0x72, 0x6f, 0x4a, 0x79, + 0xee, 0xdf, 0xb7, 0x97, 0xfb, 0xee, 0xbe, 0xa3, 0x46, 0x28, 0x94, 0x93, + 0x93, 0xcd, 0x86, 0xf5, 0xeb, 0xd8, 0xb0, 0x7e, 0x1d, 0x4f, 0x3c, 0xf5, + 0x0c, 0xf7, 0xdc, 0xf7, 0x07, 0x00, 0x26, 0x4d, 0x99, 0xca, 0xb0, 0xe1, + 0x23, 0xd8, 0xb5, 0x73, 0x07, 0x00, 0x6f, 0xbe, 0xf1, 0x0f, 0xc6, 0x4f, + 0x9c, 0x84, 0xc1, 0x60, 0xe0, 0xfd, 0xf7, 0xde, 0x76, 0x2c, 0xc7, 0xdd, + 0xdd, 0x83, 0x47, 0x1e, 0x7b, 0xa2, 0x22, 0x88, 0xb2, 0x3a, 0x42, 0xad, + 0xf0, 0x6e, 0x11, 0xf8, 0xfa, 0xfa, 0xd5, 0xd8, 0xf6, 0xf7, 0xdf, 0x7d, + 0x9b, 0xec, 0xec, 0x6c, 0x7c, 0x7c, 0x7d, 0xf9, 0xbf, 0x57, 0x5e, 0xc5, + 0x60, 0xb0, 0x7f, 0xcd, 0xd6, 0x34, 0x8d, 0xef, 0x17, 0xff, 0x9b, 0xef, + 0x16, 0x7d, 0xc3, 0x99, 0xd3, 0xa7, 0xf0, 0xf3, 0xf3, 0x67, 0xc8, 0xb0, + 0x61, 0xdc, 0x7b, 0xdf, 0xfd, 0x74, 0x0d, 0x0f, 0xa7, 0x4d, 0x9b, 0x36, + 0x3c, 0xf4, 0xf0, 0xa3, 0xfc, 0xf5, 0x2f, 0x2f, 0xf2, 0xf5, 0x97, 0x9f, + 0x33, 0x63, 0xe6, 0xac, 0x1a, 0xcb, 0xde, 0xbc, 0x69, 0x23, 0x9f, 0x7e, + 0xfc, 0x61, 0xb5, 0x41, 0x3b, 0x8e, 0xc6, 0xc4, 0xf0, 0xd0, 0xfd, 0x0b, + 0x79, 0xe9, 0xff, 0x5e, 0xe1, 0x83, 0xf7, 0xde, 0x21, 0x23, 0x3d, 0xfd, + 0xfc, 0x75, 0xed, 0xec, 0x59, 0x3e, 0xfe, 0xf0, 0x7d, 0xd2, 0x52, 0x53, + 0x79, 0xfd, 0x9f, 0xff, 0x6a, 0x91, 0x65, 0xde, 0x12, 0xce, 0x87, 0xa1, + 0xc3, 0x86, 0xb3, 0x7a, 0x95, 0x3d, 0x84, 0xdd, 0xb2, 0x69, 0x63, 0x9d, + 0x7d, 0x42, 0x0a, 0x21, 0x84, 0x10, 0xcd, 0x81, 0xd4, 0x00, 0x14, 0x42, + 0x08, 0x71, 0x45, 0x78, 0xe3, 0x1f, 0x7f, 0x77, 0x84, 0x7f, 0xde, 0x3e, + 0x3e, 0x2c, 0xbc, 0xff, 0x41, 0x1e, 0x7b, 0xe2, 0x29, 0xba, 0x86, 0x87, + 0x3b, 0x6e, 0xf0, 0x9f, 0x7b, 0xe6, 0x29, 0x32, 0x33, 0x33, 0xeb, 0x5d, + 0xce, 0xaf, 0xcb, 0x7f, 0xa9, 0x76, 0x43, 0x6a, 0x32, 0x99, 0xe8, 0xd9, + 0xab, 0x17, 0x6d, 0xda, 0xb4, 0xa9, 0x71, 0xb3, 0x59, 0x55, 0x56, 0x56, + 0x56, 0xb5, 0x1b, 0xd2, 0xca, 0xd7, 0x55, 0xde, 0x68, 0x03, 0x6c, 0xd9, + 0xbc, 0x89, 0x77, 0xdf, 0x7e, 0x0b, 0x80, 0x09, 0x13, 0x27, 0x55, 0xeb, + 0xa0, 0x7f, 0xc7, 0xf6, 0xad, 0xd5, 0x6e, 0x62, 0xab, 0x36, 0xaf, 0x9c, + 0x3a, 0x6d, 0x7a, 0x93, 0xd6, 0x51, 0x9f, 0x93, 0x27, 0x92, 0x78, 0xf4, + 0x4f, 0x0f, 0x39, 0xc2, 0x3f, 0x83, 0xc1, 0x48, 0x44, 0xf7, 0x1e, 0xd5, + 0x82, 0x9e, 0x03, 0x07, 0xf6, 0xf3, 0xf8, 0x23, 0x7f, 0xac, 0x73, 0x19, + 0xa5, 0xa5, 0xa5, 0x18, 0x8d, 0x46, 0x7a, 0xf5, 0xee, 0x43, 0x50, 0xdb, + 0xb6, 0xd5, 0x9e, 0x7f, 0xf2, 0xb1, 0x47, 0xb0, 0xd9, 0xac, 0x4d, 0x2e, + 0x9f, 0xdf, 0xb2, 0x2f, 0x1a, 0x22, 0x3f, 0x2f, 0xcf, 0xd1, 0x54, 0xb3, + 0xea, 0x36, 0x94, 0x95, 0x95, 0xf1, 0xe4, 0xe3, 0x8f, 0x38, 0x6a, 0x3f, + 0xce, 0x98, 0x75, 0x55, 0xb5, 0xa6, 0xa0, 0x55, 0xfb, 0xbd, 0xdb, 0xbc, + 0x79, 0x63, 0xb5, 0xc1, 0x01, 0x66, 0x5d, 0x35, 0xbb, 0xc5, 0x1e, 0x5b, + 0x55, 0x95, 0x95, 0x95, 0x31, 0xfb, 0xea, 0xab, 0x2b, 0xce, 0x1b, 0x1b, + 0x2b, 0x7f, 0x5d, 0x5e, 0xfd, 0x7d, 0xfc, 0xba, 0xcc, 0x51, 0xc3, 0x6a, + 0xf6, 0x9c, 0xb9, 0x94, 0x55, 0x09, 0x81, 0x2f, 0xa6, 0x29, 0xe5, 0xf9, + 0xd7, 0xbf, 0xbc, 0xe8, 0x08, 0x90, 0x42, 0xda, 0xb7, 0xe7, 0xd6, 0xdb, + 0xee, 0xe0, 0x8e, 0x3b, 0xef, 0xa6, 0x73, 0x97, 0x50, 0xc7, 0xbc, 0xff, + 0x7c, 0xe3, 0x35, 0x4e, 0x9d, 0x3c, 0xe1, 0x78, 0xfc, 0xcc, 0xb3, 0xcf, + 0xa3, 0xaa, 0xf6, 0xaf, 0xc1, 0x49, 0xc7, 0x8f, 0xf3, 0xf3, 0x4f, 0xff, + 0xe5, 0xcc, 0x99, 0xd3, 0xfc, 0x7b, 0xd1, 0xb7, 0x8e, 0x79, 0x16, 0xde, + 0xff, 0x80, 0xe3, 0x78, 0x8f, 0x8b, 0x8d, 0x73, 0x84, 0xd9, 0x03, 0x07, + 0x0d, 0xaa, 0xb1, 0xdd, 0xc5, 0xc5, 0x45, 0xfc, 0xf0, 0x9f, 0xc5, 0x00, + 0x3c, 0xf8, 0xd0, 0x9f, 0x1c, 0x7d, 0xf9, 0xd9, 0x6c, 0x56, 0xfe, 0xf4, + 0xd0, 0xfd, 0xbc, 0xf8, 0xfc, 0x9f, 0x49, 0x88, 0x8f, 0xa3, 0xac, 0xac, + 0x8c, 0x94, 0x94, 0x73, 0x2c, 0xfd, 0x69, 0x09, 0x73, 0x66, 0x4d, 0x23, + 0x3d, 0x2d, 0x0d, 0x80, 0x39, 0x57, 0xcf, 0xc5, 0x64, 0x32, 0x71, 0xf0, + 0xc0, 0x7e, 0x32, 0x33, 0x32, 0x6a, 0x2c, 0x3f, 0xe6, 0xc8, 0x61, 0x34, + 0x4d, 0xa3, 0x77, 0x9f, 0xbe, 0xd5, 0xf6, 0x2b, 0xc0, 0x4b, 0xcf, 0x3f, + 0x4b, 0x46, 0x7a, 0x3a, 0x21, 0xed, 0xdb, 0xd3, 0xab, 0x57, 0x6f, 0x8c, + 0xc6, 0xf3, 0xbf, 0xef, 0xff, 0xb2, 0xf4, 0x27, 0xce, 0x9c, 0x39, 0xdd, + 0x22, 0xcb, 0xbc, 0x25, 0x9c, 0x0f, 0x95, 0x3f, 0x04, 0x00, 0xec, 0x91, + 0x1a, 0x80, 0x42, 0x08, 0x21, 0x9a, 0x39, 0x09, 0x00, 0x85, 0x10, 0x42, + 0x5c, 0x11, 0xb6, 0x6e, 0xdd, 0xec, 0xf8, 0xfb, 0x89, 0x27, 0x9f, 0xe6, + 0xd1, 0xc7, 0x9f, 0xe4, 0xbe, 0x3f, 0x3c, 0xc0, 0xd7, 0xdf, 0x2e, 0xae, + 0x16, 0x6c, 0xec, 0xdc, 0xb1, 0xad, 0xde, 0xe5, 0x7c, 0xf3, 0xd5, 0x97, + 0x8e, 0xbf, 0x03, 0x83, 0x82, 0x58, 0xbd, 0x76, 0x23, 0x3f, 0x2f, 0x5b, + 0xc9, 0x96, 0x1d, 0x7b, 0xb8, 0x6e, 0xde, 0xfc, 0x3a, 0x5f, 0xf7, 0xe9, + 0x47, 0x1f, 0x38, 0x6e, 0x48, 0x03, 0x02, 0x02, 0x58, 0x19, 0xb5, 0x9e, + 0x9f, 0x97, 0xad, 0x64, 0xe3, 0x96, 0x1d, 0x3c, 0xfa, 0xf8, 0x93, 0x8e, + 0xf9, 0xbe, 0xfd, 0xfa, 0x2b, 0x2c, 0x16, 0x0b, 0xee, 0xee, 0x1e, 0x8c, + 0x1e, 0x33, 0xd6, 0xf1, 0xfc, 0xf6, 0x6d, 0x5b, 0x6b, 0xfd, 0xbb, 0x4f, + 0xdf, 0x7e, 0x04, 0x07, 0x87, 0x34, 0x69, 0x1d, 0xf5, 0x79, 0xe7, 0xed, + 0xb7, 0x28, 0x2b, 0x2b, 0x03, 0xc0, 0xdf, 0xdf, 0x9f, 0x5f, 0x7e, 0x5d, + 0xc9, 0xf2, 0x95, 0x6b, 0xd8, 0xbe, 0x7b, 0x3f, 0xb7, 0xdf, 0x79, 0x97, + 0x63, 0xbe, 0x8d, 0x1b, 0xd6, 0x57, 0xab, 0x21, 0x53, 0x95, 0xbf, 0xbf, + 0x3f, 0xab, 0xd7, 0x6d, 0xe4, 0xa7, 0x5f, 0x7e, 0x65, 0xeb, 0x8e, 0x3d, + 0xdc, 0x75, 0xcf, 0x7d, 0x8e, 0x69, 0xa7, 0x4f, 0x9f, 0x62, 0xdb, 0xd6, + 0x2d, 0x4d, 0x2e, 0x9f, 0xdf, 0xb2, 0x2f, 0x1a, 0xc2, 0xd3, 0xd3, 0x93, + 0x5f, 0x56, 0xac, 0x76, 0x6c, 0xc3, 0x53, 0xcf, 0x3c, 0xeb, 0x98, 0x76, + 0x36, 0x39, 0x99, 0x4d, 0x1b, 0x37, 0x00, 0xf6, 0x26, 0x9c, 0x03, 0x07, + 0x0d, 0xae, 0x56, 0x1e, 0xb5, 0xfd, 0xdd, 0x23, 0xb2, 0x27, 0x5d, 0x42, + 0xc3, 0x5a, 0xec, 0xb1, 0x55, 0x55, 0x69, 0x49, 0x09, 0x73, 0xe6, 0x5e, + 0xeb, 0x78, 0xbc, 0x7c, 0xd9, 0xd2, 0x6a, 0xd3, 0x97, 0xff, 0x72, 0xfe, + 0xf1, 0x9c, 0xab, 0xe7, 0x52, 0x52, 0x5a, 0xd2, 0xe0, 0x72, 0x6f, 0x4a, + 0x79, 0xfe, 0xbc, 0x6c, 0x25, 0x09, 0x27, 0xce, 0x90, 0x70, 0xe2, 0x0c, + 0x1b, 0xb7, 0xec, 0xe0, 0xf9, 0x17, 0x5f, 0xe6, 0x99, 0xe7, 0x5e, 0xe0, + 0xc7, 0x25, 0x4b, 0x71, 0x75, 0x75, 0x05, 0xec, 0x41, 0xe5, 0x85, 0xaf, + 0xbf, 0xe6, 0xda, 0x79, 0xe7, 0x8f, 0xf7, 0xb7, 0xfe, 0xc9, 0xab, 0x7f, + 0xfd, 0x8b, 0xe3, 0xd8, 0x0a, 0x09, 0x09, 0xe1, 0xf6, 0x3b, 0xef, 0x76, + 0x4c, 0xaf, 0xda, 0xf4, 0xbb, 0x4d, 0x9b, 0xc0, 0x1a, 0xdb, 0xbd, 0x61, + 0xfd, 0x3a, 0x8a, 0x8b, 0x8b, 0x30, 0x18, 0x8c, 0x5c, 0x35, 0x67, 0xce, + 0xf9, 0x7d, 0xf3, 0xf1, 0x47, 0xac, 0x5e, 0xb5, 0x12, 0x55, 0x55, 0x79, + 0xf2, 0xe9, 0x3f, 0xb3, 0x6d, 0xe7, 0x5e, 0x5e, 0x78, 0xe9, 0x2f, 0x00, + 0x58, 0x2c, 0x16, 0x5c, 0xdd, 0xdc, 0x00, 0xfb, 0x8f, 0x12, 0x5d, 0xc3, + 0xbb, 0x01, 0x70, 0xe8, 0xe0, 0x81, 0x1a, 0xcb, 0xf7, 0xf3, 0xf3, 0x67, + 0xd5, 0xda, 0x0d, 0x2c, 0x59, 0xba, 0x9c, 0x0d, 0x9b, 0xb7, 0x33, 0xf3, + 0x82, 0x30, 0xf9, 0x9e, 0xfb, 0xfe, 0xc0, 0x86, 0xcd, 0xdb, 0xf9, 0x69, + 0xd9, 0x0a, 0xbe, 0xf8, 0x7a, 0x51, 0xb5, 0x69, 0xfb, 0xf7, 0xee, 0x6d, + 0x91, 0x65, 0xde, 0x12, 0xce, 0x87, 0xc0, 0xa0, 0x20, 0xc7, 0xdf, 0x71, + 0x8d, 0xe8, 0x46, 0x42, 0x08, 0x21, 0x84, 0xf8, 0x5f, 0x90, 0x00, 0x50, + 0x08, 0x21, 0xc4, 0x15, 0xc1, 0xc5, 0xd9, 0xc5, 0xf1, 0xf7, 0xda, 0xa8, + 0x28, 0x47, 0x2d, 0x9b, 0x36, 0x81, 0x81, 0x44, 0xc7, 0xc4, 0x71, 0x28, + 0x26, 0x96, 0x43, 0x31, 0xb1, 0xcc, 0x98, 0x79, 0x55, 0x9d, 0xcb, 0x28, + 0x2d, 0x29, 0xe1, 0x70, 0xf4, 0x21, 0xc7, 0xe3, 0x5b, 0x17, 0xdc, 0x4e, + 0x87, 0x8e, 0x1d, 0x01, 0x7b, 0xc7, 0xfe, 0x37, 0xdd, 0x72, 0x6b, 0x9d, + 0xaf, 0x5d, 0xb9, 0xf2, 0x7c, 0x93, 0xb5, 0x3b, 0xee, 0xba, 0x87, 0x4e, + 0x9d, 0x3a, 0x3b, 0x1e, 0xdf, 0x7e, 0xe7, 0xdd, 0x8e, 0x9a, 0x31, 0xc5, + 0xc5, 0x45, 0x1c, 0xad, 0x68, 0x8e, 0x37, 0x75, 0xfa, 0xcc, 0x3a, 0x6e, + 0x4a, 0xcf, 0x07, 0x67, 0xd3, 0xa6, 0xcf, 0xf8, 0x4d, 0xeb, 0xa8, 0x8d, + 0xc5, 0x62, 0x61, 0xc3, 0xfa, 0x75, 0x8e, 0xc7, 0x77, 0xdf, 0xbb, 0x90, + 0x6e, 0x11, 0xdd, 0x01, 0x7b, 0xff, 0x67, 0x8f, 0x3f, 0xf9, 0x4c, 0xb5, + 0x9a, 0x80, 0x51, 0xab, 0x57, 0xd5, 0xba, 0x9c, 0xfe, 0x03, 0x06, 0xd2, + 0xb1, 0x63, 0x27, 0xc7, 0xe3, 0x87, 0x1f, 0x79, 0x0c, 0x2f, 0x2f, 0x2f, + 0xc7, 0xe3, 0x3d, 0xbb, 0x77, 0x37, 0x79, 0xdb, 0x7f, 0xcb, 0xbe, 0x68, + 0x88, 0xa1, 0xc3, 0x86, 0xd3, 0xad, 0x5b, 0x84, 0xe3, 0xf1, 0x9d, 0x77, + 0xdf, 0x4b, 0xbb, 0x76, 0xc1, 0x8e, 0xc7, 0x55, 0xfb, 0xfb, 0xaa, 0x1a, + 0xc6, 0xec, 0xde, 0xb5, 0x93, 0xd2, 0xd2, 0x52, 0x6c, 0x36, 0x2b, 0xdb, + 0xb6, 0x9c, 0x0f, 0x9d, 0x2f, 0xd6, 0xfc, 0xb7, 0xb9, 0x1f, 0x5b, 0x55, + 0x15, 0x97, 0x14, 0x13, 0x1e, 0xde, 0x8d, 0xc8, 0x9e, 0x3d, 0x01, 0x88, + 0x3e, 0x74, 0x90, 0xd3, 0xa7, 0x4f, 0x01, 0x70, 0xea, 0xd4, 0x49, 0x62, + 0x8e, 0x1c, 0x06, 0xa0, 0x6f, 0xbf, 0xfe, 0x74, 0xee, 0x12, 0x4a, 0x69, + 0x49, 0x69, 0xa3, 0xca, 0xfe, 0x52, 0x94, 0x27, 0xd8, 0x43, 0xb5, 0xe0, + 0x2a, 0x83, 0x6f, 0xa4, 0x57, 0x69, 0x22, 0x0b, 0xf0, 0xc8, 0xe3, 0x4f, + 0x3a, 0xfa, 0xe8, 0x4b, 0x4b, 0x4b, 0x65, 0xfd, 0xba, 0xb5, 0x8e, 0x69, + 0x4f, 0x3c, 0xf5, 0x67, 0x9c, 0x9d, 0x9d, 0x1d, 0x8f, 0xab, 0xd6, 0x38, + 0xf3, 0xf5, 0xf5, 0xad, 0xb1, 0xae, 0x1d, 0xdb, 0xec, 0x3f, 0x1c, 0x0c, + 0x1b, 0x3e, 0xdc, 0xd1, 0x3c, 0xb8, 0xa0, 0xa0, 0x80, 0x0f, 0xde, 0x7b, + 0xc7, 0xbe, 0x3f, 0x6f, 0xbb, 0x9d, 0xbb, 0xef, 0x5d, 0x48, 0x60, 0x50, + 0x90, 0xa3, 0xb6, 0x99, 0xc9, 0x64, 0xaa, 0x76, 0x3e, 0x84, 0x86, 0xd9, + 0xc3, 0xb5, 0xb3, 0xe7, 0xce, 0xd6, 0x58, 0xfe, 0x80, 0x81, 0x03, 0x1d, + 0xfb, 0x55, 0x51, 0x14, 0xc6, 0x4f, 0xa8, 0xde, 0x57, 0xdf, 0x3d, 0xf7, + 0x2e, 0x74, 0xd4, 0xe2, 0x1b, 0x36, 0x7c, 0x84, 0x23, 0x84, 0x03, 0xc8, + 0xca, 0xca, 0x6c, 0x71, 0x65, 0xde, 0x52, 0xce, 0x07, 0x2f, 0x2f, 0x6f, + 0x47, 0xb9, 0x97, 0x96, 0x94, 0x54, 0xeb, 0x2e, 0x41, 0x08, 0x21, 0x84, + 0x68, 0x6e, 0x24, 0x00, 0x14, 0x42, 0x08, 0x71, 0x45, 0x98, 0x37, 0xff, + 0x46, 0xc7, 0xdf, 0x9b, 0x37, 0x6d, 0x60, 0xd4, 0xf0, 0xc1, 0x5c, 0x35, + 0x63, 0x2a, 0x2f, 0x3e, 0xff, 0x67, 0xb6, 0x6f, 0xdb, 0x8a, 0xb3, 0xb3, + 0x33, 0x6e, 0x6e, 0xee, 0xd5, 0x9a, 0xcf, 0x5d, 0xe8, 0xdc, 0xb9, 0x73, + 0xd5, 0x9a, 0xc3, 0xf5, 0xed, 0xd7, 0xbf, 0x41, 0xeb, 0x2e, 0x2c, 0x2c, + 0x74, 0x34, 0xf5, 0x03, 0x78, 0xfd, 0x1f, 0xaf, 0x56, 0xeb, 0x10, 0xbf, + 0x4f, 0x64, 0xb7, 0x6a, 0xcb, 0x4d, 0x4f, 0xb7, 0xcf, 0x3b, 0x71, 0xd2, + 0x64, 0x47, 0x7f, 0x77, 0x19, 0xe9, 0xe9, 0x1c, 0x4f, 0x4c, 0x24, 0x37, + 0x37, 0x87, 0xd8, 0x63, 0xc7, 0xaa, 0xdc, 0x94, 0xce, 0xfc, 0x4d, 0xeb, + 0xa8, 0x4d, 0x7a, 0x5a, 0x5a, 0xb5, 0x1b, 0xd9, 0x0b, 0xfb, 0xea, 0x73, + 0x72, 0x72, 0xa2, 0x4f, 0xdf, 0x7e, 0x8e, 0xc7, 0x17, 0xf6, 0xab, 0x58, + 0x17, 0x17, 0x17, 0x17, 0xc2, 0xab, 0x84, 0x6a, 0xe7, 0xce, 0x26, 0x37, + 0x79, 0xdb, 0x9b, 0xba, 0x2f, 0x9a, 0x4a, 0x51, 0x14, 0x47, 0x08, 0x6a, + 0xdf, 0xf6, 0xf3, 0x21, 0xcd, 0xf4, 0x19, 0x33, 0x1d, 0xfd, 0xbd, 0x95, + 0x97, 0x97, 0xb3, 0x73, 0xc7, 0x76, 0x0e, 0xec, 0xdf, 0x5f, 0xad, 0x7f, + 0xb4, 0x99, 0xb3, 0xae, 0xaa, 0x77, 0xf9, 0xcd, 0xf9, 0xd8, 0xba, 0x50, + 0x65, 0xa0, 0x57, 0xad, 0x16, 0x60, 0x45, 0xad, 0xbf, 0xaa, 0xb5, 0xff, + 0xae, 0x9e, 0x7b, 0x0d, 0x40, 0xa3, 0x6a, 0x00, 0x36, 0xb5, 0x3c, 0xb3, + 0xb3, 0xb3, 0x79, 0xfb, 0xad, 0x37, 0xb9, 0x6e, 0xee, 0x6c, 0x06, 0xf7, + 0xef, 0x4d, 0xf7, 0xae, 0x9d, 0xe9, 0x16, 0xda, 0x91, 0xa4, 0xe3, 0xc7, + 0x1d, 0xf3, 0x54, 0x6d, 0x72, 0x0e, 0xd0, 0xa6, 0x4d, 0x1b, 0xee, 0xfb, + 0xc3, 0xfd, 0x35, 0xd6, 0xdf, 0x7f, 0xc0, 0x40, 0x66, 0x5c, 0xb0, 0xfc, + 0xfc, 0xfc, 0x7c, 0xc7, 0xdf, 0xb5, 0x0d, 0x6a, 0x12, 0x1b, 0x7b, 0x14, + 0x80, 0x88, 0xee, 0x3d, 0x1c, 0xcf, 0xad, 0x58, 0xbe, 0xcc, 0x51, 0x8b, + 0xf6, 0x96, 0x05, 0xb7, 0x3b, 0x9e, 0xcf, 0xca, 0xca, 0x02, 0xc0, 0xdf, + 0x3f, 0xa0, 0xda, 0x32, 0x5c, 0x5d, 0xec, 0xa1, 0x5d, 0x71, 0x51, 0xd1, + 0x45, 0xcb, 0xc8, 0xcd, 0xd5, 0xad, 0xfa, 0x17, 0x7a, 0x83, 0xa1, 0xda, + 0x63, 0x67, 0x97, 0xf3, 0x3f, 0x78, 0x5c, 0xac, 0xb6, 0x6f, 0x73, 0x2c, + 0xf3, 0x96, 0x72, 0x3e, 0x18, 0x0c, 0x86, 0x6a, 0x21, 0x6e, 0x4e, 0x6e, + 0xae, 0x7c, 0xd8, 0x0a, 0x21, 0x84, 0x68, 0xb6, 0x24, 0x00, 0x14, 0x42, + 0x08, 0x71, 0x45, 0xb8, 0xe7, 0xbe, 0x85, 0xfc, 0xf1, 0x4f, 0x8f, 0x3a, + 0x6a, 0x98, 0xe8, 0xba, 0x4e, 0x7c, 0x5c, 0x2c, 0x8b, 0xbf, 0x5b, 0xc4, + 0xfd, 0x0b, 0xef, 0x61, 0xea, 0xc4, 0xf1, 0x1c, 0x39, 0x1c, 0x5d, 0xef, + 0x32, 0xca, 0xca, 0xaa, 0xd7, 0x64, 0xaa, 0xad, 0x26, 0x50, 0x6d, 0x72, + 0x72, 0xb2, 0x1b, 0xb5, 0xad, 0x95, 0xa1, 0x81, 0xa7, 0xa7, 0x27, 0x23, + 0x47, 0x8d, 0x76, 0x3c, 0xbf, 0x7d, 0xdb, 0x56, 0x76, 0x6c, 0xdb, 0x86, + 0xae, 0xeb, 0x00, 0xf4, 0xec, 0xd5, 0x8b, 0xf6, 0x1d, 0x3a, 0xfc, 0xa6, + 0x75, 0xd4, 0x26, 0x2f, 0xaf, 0xfa, 0x4d, 0xac, 0x67, 0x95, 0x1b, 0xdc, + 0x4a, 0x55, 0xc3, 0x8b, 0x92, 0xe2, 0xe2, 0x06, 0xaf, 0xb7, 0xea, 0x08, + 0xb2, 0xc5, 0xc5, 0x25, 0x4d, 0xde, 0xf6, 0xa6, 0xee, 0x8b, 0xdf, 0xc2, + 0xd5, 0xf5, 0x7c, 0xa8, 0x52, 0x52, 0x72, 0xfe, 0x3d, 0xfb, 0xf9, 0xf9, + 0x33, 0x7c, 0xc4, 0x08, 0xc7, 0xe3, 0x8d, 0x1b, 0xd6, 0x55, 0x6b, 0xfa, + 0xd8, 0xaf, 0xff, 0x80, 0x1a, 0xfd, 0xb6, 0xb5, 0xa4, 0x63, 0xeb, 0x42, + 0x95, 0xef, 0x7d, 0xd6, 0x55, 0x73, 0x30, 0x54, 0x04, 0x4f, 0xcb, 0x2e, + 0x08, 0x00, 0x8d, 0x46, 0xa3, 0x23, 0xd0, 0x69, 0x6c, 0xad, 0xa8, 0xc6, + 0x96, 0xe7, 0x91, 0xc3, 0xd1, 0x4c, 0x9b, 0x34, 0x8e, 0xf7, 0xdf, 0x7d, + 0x9b, 0xc3, 0xd1, 0x87, 0xc8, 0xcf, 0xcf, 0x47, 0xd3, 0x34, 0xc7, 0xb6, + 0xd5, 0x67, 0xd6, 0x55, 0x73, 0x6a, 0x3c, 0x57, 0x5b, 0x4d, 0xb7, 0xaa, + 0xa3, 0xc6, 0x56, 0x96, 0x51, 0x55, 0xa9, 0x29, 0xa9, 0x00, 0x74, 0xec, + 0x74, 0xbe, 0xc6, 0xeb, 0xee, 0x5d, 0xf6, 0x01, 0x2f, 0x82, 0xda, 0xb6, + 0xad, 0x56, 0x0b, 0x2d, 0x3b, 0xdb, 0xbe, 0xcf, 0xaa, 0xd6, 0xa2, 0x05, + 0x1c, 0x35, 0xc9, 0x1a, 0xb2, 0xdd, 0x97, 0x5a, 0x73, 0x2b, 0xf3, 0x96, + 0x74, 0x3e, 0xa8, 0xea, 0xf9, 0xf7, 0x6c, 0x30, 0xc8, 0xad, 0x95, 0x10, + 0x42, 0x88, 0xe6, 0x4b, 0x46, 0x01, 0x16, 0x42, 0x08, 0x71, 0x45, 0x50, + 0x14, 0x85, 0x07, 0xff, 0xf8, 0x27, 0x6e, 0xbc, 0xf9, 0x56, 0x56, 0xad, + 0x58, 0xce, 0x8e, 0x1d, 0xdb, 0xd9, 0xbb, 0x7b, 0x97, 0xa3, 0x66, 0xcf, + 0x99, 0x33, 0xa7, 0xb9, 0x63, 0xc1, 0xcd, 0xac, 0xdf, 0xb4, 0xad, 0xd6, + 0x1a, 0x3e, 0x80, 0xa3, 0xe9, 0x5a, 0xa5, 0x0b, 0x47, 0xc0, 0xac, 0xcb, + 0x85, 0xb5, 0x75, 0x16, 0xdc, 0x7e, 0x07, 0xc3, 0x86, 0x8d, 0xa8, 0x73, + 0xfe, 0x5e, 0x7d, 0xfa, 0x38, 0xfe, 0x9e, 0x36, 0x7d, 0xa6, 0xa3, 0xbf, + 0xb9, 0xed, 0xdb, 0xb6, 0x10, 0x10, 0xd0, 0xa6, 0xda, 0xb4, 0x4b, 0xb1, + 0x8e, 0x0b, 0x79, 0x78, 0x78, 0x54, 0x7b, 0x9c, 0x9b, 0x53, 0xb3, 0xc3, + 0xfd, 0xaa, 0xef, 0xdd, 0xa3, 0x8e, 0x51, 0x80, 0x6b, 0x93, 0x5b, 0xa5, + 0x86, 0x8c, 0xbb, 0xbb, 0x5b, 0x93, 0xb7, 0xbd, 0xa4, 0xb8, 0xa4, 0x49, + 0xfb, 0xe2, 0xb7, 0x28, 0xa9, 0x12, 0x64, 0x55, 0xf6, 0xdd, 0x56, 0x35, + 0xd4, 0xa8, 0xec, 0xd3, 0x70, 0xf3, 0xc6, 0x8d, 0x78, 0x78, 0x7a, 0xd4, + 0x19, 0x6e, 0xb4, 0xb4, 0x63, 0xab, 0xb6, 0xd0, 0x44, 0xd3, 0x34, 0xda, + 0xb4, 0x69, 0xc3, 0xc8, 0x51, 0xa3, 0xd9, 0xb2, 0x79, 0x13, 0xa7, 0x4e, + 0x9e, 0xe0, 0xbb, 0x45, 0xdf, 0x70, 0xea, 0xd4, 0x49, 0x00, 0xc6, 0x8c, + 0x1d, 0x87, 0xaf, 0xaf, 0x1f, 0x36, 0x9b, 0xad, 0xda, 0xc8, 0xb5, 0x0d, + 0xd5, 0x98, 0xf2, 0x7c, 0xf2, 0xf1, 0x47, 0x1c, 0xe7, 0x71, 0x44, 0xf7, + 0x1e, 0xfc, 0xf5, 0x6f, 0x7f, 0xa7, 0x47, 0x64, 0x4f, 0x9c, 0x9c, 0x9c, + 0x98, 0x39, 0x75, 0x52, 0xbd, 0x35, 0x54, 0xdf, 0x7b, 0xb7, 0xe6, 0x08, + 0xb9, 0x5f, 0x7c, 0xf6, 0x09, 0xf3, 0x6f, 0xbc, 0xa9, 0x5a, 0x13, 0x60, + 0x9f, 0x2a, 0xd7, 0x84, 0xfc, 0xbc, 0xbc, 0x3a, 0xcf, 0x87, 0x36, 0x55, + 0xca, 0x30, 0x3e, 0x3e, 0x0e, 0x80, 0xce, 0x9d, 0xbb, 0x54, 0x9b, 0x37, + 0xbb, 0xa2, 0x49, 0xae, 0xdf, 0x05, 0x01, 0x60, 0x5a, 0x9a, 0x3d, 0x44, + 0xbc, 0x30, 0x18, 0x6c, 0x88, 0xda, 0x42, 0xc9, 0x96, 0x5c, 0xe6, 0x2d, + 0xe5, 0x7c, 0xd0, 0x34, 0x8d, 0x82, 0x82, 0xfc, 0x2a, 0xc7, 0xc9, 0xe5, + 0xff, 0x21, 0x42, 0x08, 0x21, 0x84, 0x68, 0x2a, 0x09, 0x00, 0x85, 0x10, + 0x42, 0xb4, 0x7a, 0xf9, 0x79, 0x79, 0x9c, 0xac, 0x18, 0x8d, 0xd2, 0x64, + 0x72, 0xe2, 0x96, 0x05, 0xb7, 0x73, 0xcb, 0x82, 0xdb, 0xb1, 0xd9, 0x6c, + 0x2c, 0xff, 0x65, 0x29, 0xcf, 0x3c, 0xf5, 0x38, 0x36, 0x9b, 0x8d, 0x82, + 0x82, 0x02, 0x36, 0x6e, 0x58, 0xcf, 0xd5, 0xd7, 0x5c, 0x5b, 0xeb, 0x72, + 0x42, 0xda, 0xb7, 0xc7, 0x60, 0x30, 0x3a, 0x9a, 0xb5, 0xc5, 0x1c, 0x39, + 0xcc, 0xe0, 0x21, 0x43, 0x2f, 0xba, 0x7e, 0xff, 0x80, 0x00, 0xbc, 0xbc, + 0xbc, 0x1c, 0x37, 0xb1, 0xb9, 0x39, 0xb9, 0x4c, 0x9a, 0x32, 0xb5, 0xc6, + 0x7c, 0x39, 0x39, 0xd9, 0x8e, 0xd1, 0x43, 0x2b, 0x4d, 0x9c, 0x3c, 0x05, + 0xa3, 0xd1, 0x88, 0xd5, 0x6a, 0x65, 0xcf, 0xee, 0xdd, 0xd5, 0x9a, 0x9b, + 0x4d, 0xad, 0xd2, 0x27, 0xd5, 0x6f, 0x59, 0x47, 0xcd, 0xf7, 0xd9, 0x01, + 0x17, 0x17, 0x17, 0x47, 0xed, 0x98, 0x83, 0x07, 0x0f, 0x30, 0x64, 0xe8, + 0xb0, 0x6a, 0x37, 0xbd, 0x55, 0xfb, 0xe7, 0x0a, 0xeb, 0x1a, 0xde, 0xa0, + 0xfd, 0x50, 0x56, 0x56, 0x46, 0x62, 0x42, 0xbc, 0xe3, 0x71, 0x87, 0x0e, + 0x1d, 0x9b, 0xbc, 0xed, 0xe5, 0xe5, 0xe5, 0x4d, 0xda, 0x17, 0xbf, 0xc5, + 0xf1, 0xc4, 0xc4, 0xf3, 0x65, 0x14, 0x52, 0x7d, 0x30, 0x80, 0xc9, 0x53, + 0xa7, 0xf1, 0xc2, 0x73, 0xcf, 0x60, 0x36, 0x9b, 0xed, 0x41, 0x4e, 0x45, + 0x2b, 0x44, 0x55, 0x55, 0x99, 0x31, 0x73, 0xd6, 0x45, 0x97, 0xdd, 0x9c, + 0x8f, 0xad, 0xda, 0x94, 0x97, 0x95, 0xe1, 0xea, 0xe6, 0xc6, 0x9c, 0xb9, + 0xd7, 0xb0, 0x65, 0xf3, 0x26, 0x00, 0xfe, 0xf1, 0xb7, 0xbf, 0x3a, 0xa6, + 0x57, 0x36, 0x0f, 0x36, 0x57, 0x19, 0x41, 0xb5, 0x31, 0x1a, 0x5a, 0x9e, + 0x67, 0x93, 0x93, 0xab, 0x35, 0x39, 0x7d, 0xe2, 0xa9, 0x67, 0x1a, 0xdc, + 0x5c, 0xf4, 0x68, 0x4c, 0x0c, 0x4b, 0x7f, 0x5a, 0x52, 0xe3, 0xf9, 0x94, + 0x94, 0x73, 0x7c, 0xf1, 0xd9, 0x27, 0xfc, 0xe1, 0x81, 0x87, 0x1c, 0xcf, + 0x55, 0x0d, 0x83, 0xf2, 0x6a, 0x09, 0x00, 0x2b, 0x59, 0xab, 0xd4, 0x14, + 0xac, 0x0c, 0x0a, 0xab, 0x8e, 0x30, 0x0b, 0xb5, 0xd7, 0x00, 0xd4, 0x75, + 0x9d, 0xc4, 0x04, 0x7b, 0x68, 0x56, 0xb5, 0x19, 0xf1, 0xef, 0xa9, 0x39, + 0x95, 0x79, 0x4b, 0x39, 0x1f, 0xf2, 0xf3, 0xf3, 0x1c, 0xb5, 0x43, 0x5d, + 0x5d, 0x5d, 0x71, 0xa9, 0xd2, 0xf4, 0x5a, 0x08, 0x21, 0x84, 0x68, 0x6e, + 0xa4, 0x9e, 0xba, 0x10, 0x42, 0x88, 0x56, 0x2f, 0xe9, 0x44, 0x12, 0xd7, + 0x5f, 0x7b, 0x35, 0xd7, 0x5f, 0x7b, 0x35, 0xd7, 0x5e, 0x3d, 0x8b, 0xd4, + 0xd4, 0x14, 0xc0, 0xde, 0xd4, 0x6e, 0xce, 0xdc, 0x6b, 0xf0, 0xf3, 0xf3, + 0x73, 0xcc, 0x5b, 0x58, 0x58, 0x77, 0x4d, 0x13, 0x67, 0x67, 0x67, 0xfa, + 0xf5, 0x3f, 0x7f, 0xa3, 0xfb, 0xd5, 0x17, 0x9f, 0x73, 0xee, 0xdc, 0x39, + 0xc0, 0xde, 0x44, 0xf0, 0xbb, 0x6f, 0xbf, 0xa9, 0xfd, 0xc3, 0x56, 0x55, + 0x99, 0x3c, 0x65, 0x9a, 0xe3, 0xf1, 0xf2, 0x65, 0x4b, 0x59, 0xfc, 0xdd, + 0xf9, 0x91, 0x3a, 0x35, 0x4d, 0xe3, 0xdf, 0xdf, 0x7d, 0xcb, 0xd4, 0x89, + 0xe3, 0x6a, 0xd4, 0x9c, 0xf1, 0xf6, 0xf6, 0x66, 0xc4, 0xc8, 0x51, 0x80, + 0xbd, 0xe9, 0x65, 0x65, 0x2d, 0xa1, 0x88, 0xee, 0x3d, 0xaa, 0xd5, 0x2c, + 0xfa, 0x2d, 0xeb, 0xb8, 0x90, 0xc9, 0x64, 0x62, 0xcc, 0xd8, 0xf1, 0x8e, + 0xc7, 0x5f, 0x7f, 0xf1, 0x59, 0xb5, 0x1b, 0xfe, 0xb7, 0xdf, 0x7a, 0xd3, + 0x51, 0x86, 0x00, 0x93, 0x26, 0x4f, 0xa9, 0x75, 0x39, 0xfb, 0xf7, 0xed, + 0x73, 0xd4, 0x08, 0x03, 0xf8, 0xe0, 0xbd, 0x77, 0x28, 0xaa, 0xd2, 0xbf, + 0xd9, 0xd0, 0xe1, 0x23, 0x9a, 0xbc, 0xed, 0x4d, 0xdd, 0x17, 0x0d, 0xb5, + 0x7b, 0xd7, 0xce, 0x6a, 0xe5, 0xf4, 0xe3, 0xf7, 0x8b, 0x49, 0x49, 0x39, + 0xe7, 0x78, 0x3c, 0x68, 0xf0, 0x90, 0x6a, 0xf3, 0x7b, 0x7a, 0x7a, 0x32, + 0x66, 0xdc, 0xf8, 0x1a, 0xcb, 0x19, 0x3c, 0x64, 0x28, 0x6d, 0x02, 0x03, + 0x2f, 0xba, 0xbe, 0xe6, 0x7c, 0x6c, 0xd5, 0x46, 0x47, 0xaf, 0xd8, 0xf7, + 0x53, 0x1d, 0xb5, 0xb5, 0xaa, 0x36, 0xa7, 0x9c, 0x30, 0x71, 0x52, 0xb5, + 0xf9, 0x1a, 0xab, 0xa1, 0xe5, 0x59, 0x7a, 0x41, 0x53, 0xd1, 0xc2, 0x2a, + 0x35, 0xc5, 0x12, 0x12, 0xe2, 0x1d, 0x65, 0x58, 0x9b, 0x57, 0xfe, 0xef, + 0x25, 0x47, 0xcd, 0xb9, 0xee, 0x3d, 0x22, 0xb9, 0xf3, 0xee, 0x7b, 0x1d, + 0xd3, 0x3e, 0xfe, 0xf0, 0x03, 0x32, 0x33, 0xcf, 0x0f, 0x9e, 0x11, 0xd6, + 0xb5, 0xab, 0xe3, 0xef, 0xcc, 0xcc, 0x8c, 0x1a, 0xcb, 0xaa, 0x6c, 0xda, + 0x5e, 0x58, 0xa5, 0x36, 0x98, 0x87, 0xa7, 0x3d, 0x40, 0x4a, 0x4b, 0x4d, + 0x75, 0x3c, 0x97, 0x9d, 0x9d, 0x4d, 0xf4, 0xa1, 0x83, 0x8e, 0xf7, 0x58, + 0x69, 0xd7, 0xce, 0x1d, 0xa4, 0xa5, 0xa5, 0x12, 0x10, 0x10, 0x40, 0xcf, + 0x5e, 0xbd, 0x1a, 0x5f, 0x60, 0x97, 0xa0, 0x06, 0x60, 0x73, 0x2a, 0xf3, + 0x96, 0x72, 0x3e, 0x54, 0x3d, 0x46, 0x22, 0x7b, 0xf6, 0x42, 0x08, 0x21, + 0x84, 0x68, 0xce, 0xa4, 0x06, 0xa0, 0x10, 0x42, 0x88, 0x56, 0xaf, 0x5f, + 0xbf, 0xfe, 0x84, 0x75, 0xed, 0x4a, 0xd2, 0xf1, 0xe3, 0x68, 0x9a, 0xc6, + 0x8d, 0xf3, 0xae, 0xe5, 0x9a, 0xeb, 0xe6, 0xe1, 0xe5, 0xe5, 0xcd, 0xd6, + 0x2d, 0x9b, 0x1c, 0x37, 0x71, 0xaa, 0xaa, 0x32, 0x6c, 0xc4, 0xc8, 0x7a, + 0x97, 0xb5, 0xe0, 0xf6, 0x3b, 0xd9, 0xbf, 0x6f, 0x2f, 0x00, 0xa9, 0xa9, + 0x29, 0x4c, 0x9b, 0x34, 0x8e, 0xf0, 0xf0, 0x6e, 0xa4, 0xa7, 0xa7, 0x55, + 0xbb, 0x19, 0xbc, 0xd0, 0x83, 0x7f, 0xfc, 0x13, 0x6b, 0xa3, 0x56, 0x3b, + 0x6a, 0xa6, 0xbc, 0xf8, 0xfc, 0x9f, 0xf9, 0xf0, 0xfd, 0x77, 0x09, 0x0e, + 0x09, 0xe1, 0xcc, 0xe9, 0x53, 0x8e, 0x81, 0x01, 0x1e, 0xba, 0xff, 0x3e, + 0x56, 0x45, 0x6d, 0x70, 0xf4, 0x07, 0x06, 0xf6, 0xda, 0x27, 0x95, 0xb5, + 0xac, 0x2a, 0xd5, 0x36, 0x22, 0xe5, 0x6f, 0x59, 0xc7, 0x85, 0x1e, 0x7a, + 0xf8, 0x4f, 0x6c, 0xda, 0xb8, 0x1e, 0xb3, 0xd9, 0x4c, 0x56, 0x56, 0x16, + 0xb3, 0x67, 0x4e, 0xa5, 0x5b, 0x44, 0x04, 0x39, 0xd9, 0x39, 0xd5, 0xc2, + 0xbf, 0x31, 0x63, 0xc7, 0xd5, 0x59, 0x33, 0x27, 0x37, 0x37, 0x87, 0x19, + 0x53, 0x26, 0xd2, 0xab, 0x77, 0x1f, 0xb2, 0xb2, 0x32, 0x39, 0x9b, 0x9c, + 0xec, 0x98, 0xd6, 0x35, 0x3c, 0xdc, 0x71, 0xb3, 0xdd, 0xd4, 0x6d, 0x6f, + 0xea, 0xbe, 0x68, 0x88, 0xc2, 0xc2, 0x42, 0x66, 0xcf, 0x98, 0x46, 0xcf, + 0x5e, 0xbd, 0x28, 0x2b, 0x2d, 0x25, 0xa1, 0x4a, 0xcd, 0xc5, 0xe0, 0xe0, + 0x10, 0xc6, 0x4f, 0x98, 0x54, 0xe3, 0x35, 0xb3, 0x66, 0xcd, 0x66, 0x5d, + 0xd4, 0x9a, 0x6a, 0xcf, 0x35, 0xa4, 0xf9, 0x6f, 0x4b, 0x38, 0xb6, 0xea, + 0xe2, 0xea, 0xea, 0xca, 0xd4, 0xe9, 0xd3, 0xf9, 0x79, 0xc9, 0x7f, 0xcf, + 0xbf, 0x7e, 0xc6, 0xac, 0x6a, 0xcd, 0x67, 0x9b, 0xaa, 0x21, 0xe5, 0xd9, + 0xb9, 0x73, 0x17, 0xbc, 0x7d, 0x7c, 0x1c, 0xb5, 0xed, 0xfe, 0xfc, 0xf4, + 0x13, 0xac, 0x5b, 0x17, 0x45, 0x59, 0x69, 0x29, 0x5b, 0xb7, 0x6c, 0xae, + 0xd6, 0xfc, 0xb8, 0x6a, 0xbf, 0x97, 0xab, 0x57, 0xad, 0x64, 0xdf, 0xde, + 0x3d, 0x8e, 0xc7, 0x4f, 0xff, 0xf9, 0x39, 0x7a, 0xf7, 0xe9, 0xcb, 0x4f, + 0x4b, 0x7e, 0x24, 0x2f, 0x37, 0x97, 0x92, 0x92, 0x62, 0xde, 0x7a, 0xe3, + 0x35, 0xfe, 0xf6, 0x8f, 0xd7, 0x1d, 0xe1, 0x4e, 0x65, 0xad, 0xd8, 0xfd, + 0xfb, 0xf6, 0xd5, 0xd8, 0xd6, 0xf6, 0x1d, 0x3a, 0x90, 0x93, 0x93, 0xcd, + 0xf1, 0xe3, 0x89, 0x55, 0xae, 0x3b, 0xfd, 0x38, 0x75, 0xf2, 0x04, 0x89, + 0x89, 0x09, 0x7c, 0xb7, 0xe8, 0x1b, 0x86, 0x0c, 0x1d, 0xc6, 0xff, 0xbd, + 0xf4, 0x82, 0x63, 0x3b, 0xe2, 0x62, 0x63, 0xd1, 0x34, 0x8d, 0xbc, 0xbc, + 0x5c, 0x5e, 0xf9, 0xbf, 0x97, 0x01, 0xb8, 0xed, 0xce, 0xbb, 0x1d, 0x83, + 0x71, 0xfc, 0x2f, 0x34, 0xa7, 0x32, 0x6f, 0x09, 0xe7, 0xc3, 0xfe, 0xbd, + 0x7b, 0x1d, 0x7f, 0x0f, 0x1a, 0x34, 0x58, 0x3e, 0x6c, 0x85, 0x10, 0x42, + 0x34, 0x6b, 0x52, 0x03, 0x50, 0x08, 0x21, 0x44, 0xeb, 0xff, 0xb0, 0x53, + 0x55, 0xde, 0xff, 0xf0, 0x53, 0x82, 0xda, 0xb6, 0x05, 0xec, 0xcd, 0xcd, + 0xde, 0x7b, 0xe7, 0x5f, 0xfc, 0xed, 0xaf, 0x2f, 0xb3, 0x75, 0xcb, 0x66, + 0xc0, 0xde, 0x47, 0xe0, 0x53, 0xcf, 0x3c, 0x4b, 0x78, 0x78, 0xb7, 0x7a, + 0x97, 0x35, 0x7d, 0xc6, 0x4c, 0xc7, 0xe8, 0xa6, 0x60, 0x6f, 0x8a, 0x1a, + 0x13, 0x73, 0x84, 0xcc, 0xcc, 0x4c, 0x7c, 0x7d, 0xfd, 0xea, 0x7c, 0x5d, + 0x48, 0xfb, 0xf6, 0x7c, 0xf2, 0xf9, 0x57, 0xd5, 0x9a, 0x9d, 0xa5, 0xa5, + 0xa5, 0x72, 0x60, 0xff, 0x3e, 0xc7, 0x0d, 0xa9, 0xbb, 0xbb, 0x07, 0x4f, + 0x3e, 0xfd, 0x6c, 0x8d, 0x60, 0x6e, 0xf2, 0xe4, 0xa9, 0x35, 0x42, 0x81, + 0xda, 0xfa, 0xa4, 0xfa, 0x2d, 0xeb, 0xb8, 0x50, 0x44, 0xf7, 0x1e, 0xbc, + 0xf6, 0xe6, 0xbf, 0x1c, 0xcd, 0x17, 0x2d, 0x16, 0x0b, 0x47, 0x63, 0x62, + 0xaa, 0x85, 0x7f, 0xbd, 0xfb, 0xf4, 0xe5, 0xf5, 0x7f, 0xfe, 0xab, 0xce, + 0x65, 0x78, 0x7a, 0x7a, 0x62, 0xb5, 0x5a, 0x39, 0x74, 0xf0, 0x40, 0xb5, + 0xf0, 0xcf, 0xcd, 0xcd, 0x9d, 0xd7, 0xde, 0x78, 0x0b, 0x55, 0x55, 0x7f, + 0xd3, 0xb6, 0x37, 0x75, 0x5f, 0x34, 0x84, 0xbd, 0xff, 0x3a, 0x2b, 0x87, + 0xa3, 0x0f, 0x55, 0x0b, 0xff, 0x9c, 0x9c, 0x9c, 0xf8, 0xfb, 0xeb, 0x6f, + 0x3a, 0x46, 0x0c, 0xad, 0x6a, 0xfc, 0xc4, 0x49, 0xd5, 0xfa, 0x2e, 0x33, + 0x18, 0x8c, 0x4c, 0x9d, 0x3e, 0xbd, 0xc1, 0xeb, 0x6c, 0xce, 0xc7, 0x56, + 0x7d, 0xae, 0x9e, 0x7b, 0xed, 0x05, 0x8f, 0xaf, 0xb9, 0x24, 0xe7, 0x6d, + 0x43, 0xca, 0xd3, 0x64, 0x32, 0xf1, 0xdc, 0x0b, 0x2f, 0x39, 0xde, 0x57, + 0x69, 0x69, 0x29, 0x2b, 0x96, 0x2f, 0x63, 0xfd, 0xba, 0xb5, 0x98, 0xcd, + 0xe6, 0x6a, 0xe5, 0x96, 0x91, 0x9e, 0x0e, 0x80, 0xd9, 0x6c, 0xe6, 0xb5, + 0xbf, 0xbf, 0xe2, 0x78, 0x7e, 0xcc, 0xd8, 0x71, 0x8c, 0x18, 0x39, 0x0a, + 0x4f, 0x4f, 0x4f, 0x1e, 0x7c, 0xe8, 0x4f, 0x8e, 0xe7, 0x7f, 0x5a, 0xf2, + 0x23, 0xb1, 0xc7, 0xec, 0xa3, 0xfb, 0x1a, 0x8d, 0x46, 0x47, 0xd0, 0x9d, + 0x98, 0x10, 0x4f, 0xde, 0x05, 0xa3, 0xbd, 0x56, 0xd6, 0x56, 0xab, 0x1a, + 0x1e, 0xdd, 0x71, 0xd7, 0x3d, 0x8e, 0x51, 0xc5, 0x5f, 0x7e, 0xe1, 0x39, + 0x66, 0x4e, 0x9d, 0xc4, 0xae, 0x9d, 0x3b, 0x1c, 0x35, 0x66, 0x77, 0xef, + 0xda, 0xc9, 0xc8, 0xa1, 0x03, 0x19, 0x37, 0x6a, 0x38, 0x09, 0xf1, 0x71, + 0x0c, 0x1b, 0x3e, 0x82, 0xbb, 0xaa, 0xd4, 0x88, 0x6b, 0x8c, 0x4b, 0xd1, + 0x07, 0x60, 0x73, 0x2b, 0xf3, 0x96, 0x70, 0x3e, 0xec, 0xdc, 0xb1, 0xcd, + 0xf1, 0xf7, 0xb8, 0x09, 0x13, 0xe5, 0xc3, 0x56, 0x08, 0x21, 0x44, 0xf3, + 0xbe, 0x27, 0x92, 0x22, 0x10, 0x42, 0x08, 0x71, 0x25, 0x08, 0x0d, 0x0b, + 0x63, 0x55, 0xd4, 0x06, 0x1e, 0x7e, 0xe4, 0x31, 0x22, 0x7b, 0xf6, 0xc4, + 0xdd, 0xdd, 0x03, 0xa3, 0xd1, 0x48, 0x70, 0x70, 0x08, 0xb3, 0xe7, 0xcc, + 0xe5, 0xc7, 0x9f, 0x7e, 0xe1, 0x8e, 0xbb, 0xee, 0x69, 0xd0, 0xb2, 0xfe, + 0xfe, 0xfa, 0x3f, 0x79, 0xe1, 0xa5, 0xbf, 0xd0, 0xad, 0x5b, 0x04, 0x4e, + 0x4e, 0x4e, 0xf8, 0xfa, 0xfa, 0x31, 0x7b, 0xce, 0x5c, 0x96, 0x2c, 0x5d, + 0x5e, 0xef, 0x8d, 0xe9, 0x80, 0x81, 0x83, 0x58, 0xb5, 0x76, 0x3d, 0x0f, + 0x3c, 0xf4, 0x30, 0x3d, 0x22, 0x7b, 0xe2, 0xe6, 0xe6, 0x8e, 0x8b, 0x8b, + 0x0b, 0x5d, 0x42, 0xc3, 0xb8, 0xe3, 0xce, 0xbb, 0x59, 0x19, 0xb5, 0xce, + 0xd1, 0x74, 0xb2, 0x2a, 0x1f, 0x5f, 0x5f, 0x86, 0x0d, 0x1f, 0xee, 0x78, + 0xdc, 0x35, 0x3c, 0xbc, 0x5a, 0x93, 0xc4, 0x4b, 0xb1, 0x8e, 0xda, 0xcc, + 0x98, 0x39, 0x8b, 0x5f, 0x57, 0x45, 0x31, 0x6f, 0xfe, 0x8d, 0x84, 0xb4, + 0x6f, 0x8f, 0xc9, 0x64, 0xc2, 0xc3, 0xc3, 0x83, 0x7e, 0xfd, 0x07, 0xf0, + 0xfc, 0x8b, 0x2f, 0xb3, 0xf8, 0x87, 0x25, 0xf5, 0xbe, 0xdf, 0xa1, 0xc3, + 0x86, 0xf3, 0xce, 0xfb, 0x1f, 0xd1, 0xab, 0x57, 0x6f, 0x9c, 0x9c, 0x9c, + 0xf0, 0xf6, 0xf1, 0x61, 0xea, 0xb4, 0x19, 0x2c, 0x59, 0xba, 0x9c, 0x5e, + 0xbd, 0xfb, 0x5c, 0x92, 0x6d, 0x6f, 0xea, 0xbe, 0xb8, 0x98, 0x47, 0x1e, + 0x7b, 0x82, 0x17, 0xff, 0xf2, 0x57, 0xba, 0x45, 0x74, 0xb7, 0x6f, 0xbb, + 0xb7, 0x37, 0x13, 0x26, 0x4e, 0xe2, 0x87, 0x25, 0xbf, 0x30, 0x6c, 0x78, + 0xed, 0x83, 0x0a, 0xb8, 0xba, 0xba, 0x56, 0xdb, 0xbe, 0x91, 0xa3, 0x46, + 0x35, 0x7a, 0x1b, 0x9a, 0xf3, 0xb1, 0x55, 0xdf, 0x7e, 0xae, 0x0c, 0xd7, + 0x43, 0x42, 0x42, 0x6a, 0x34, 0x8f, 0x6e, 0xaa, 0x86, 0x96, 0xe7, 0x9c, + 0xab, 0xaf, 0xe1, 0xab, 0x6f, 0xff, 0xcd, 0xb0, 0xe1, 0x23, 0x70, 0x73, + 0x73, 0xaf, 0x68, 0x3e, 0x3a, 0x80, 0x8f, 0x3e, 0xfd, 0x82, 0x5b, 0x16, + 0xdc, 0xe6, 0x98, 0x6f, 0xcf, 0xee, 0xdd, 0x58, 0x2c, 0x16, 0xbe, 0xfa, + 0xe2, 0x73, 0x47, 0x20, 0xad, 0xaa, 0x2a, 0x4f, 0x3e, 0xfd, 0x67, 0xc7, + 0x3c, 0x37, 0xdd, 0x72, 0xab, 0xa3, 0xb9, 0xa7, 0xa6, 0x69, 0xfc, 0xed, + 0xaf, 0x7f, 0x71, 0x4c, 0x9b, 0x37, 0xff, 0x46, 0xc0, 0x1e, 0xb6, 0x6d, + 0xd9, 0xb2, 0xa9, 0x7a, 0x70, 0x54, 0xd1, 0xec, 0xf4, 0x44, 0x52, 0x12, + 0x7b, 0x76, 0xef, 0x02, 0xa0, 0x47, 0x64, 0x4f, 0x3e, 0xf8, 0xf8, 0x33, + 0xba, 0x86, 0x87, 0xe3, 0xe4, 0xe4, 0x44, 0x78, 0x78, 0x37, 0xde, 0xfc, + 0xd7, 0x3b, 0x7c, 0xf0, 0xf1, 0x67, 0x3c, 0xfe, 0xe4, 0x33, 0x04, 0x04, + 0x04, 0x90, 0x93, 0x93, 0x83, 0x9f, 0x9f, 0x3f, 0x0f, 0x3c, 0xf4, 0x30, + 0x9f, 0x7e, 0xf1, 0xb5, 0x23, 0x30, 0xfc, 0x5f, 0x69, 0x6e, 0x65, 0xde, + 0x9c, 0xcf, 0x07, 0xb3, 0xd9, 0xcc, 0xce, 0x1d, 0xdb, 0x01, 0x08, 0x0f, + 0xef, 0xc6, 0x40, 0xa9, 0x01, 0x28, 0x84, 0x10, 0xa2, 0x99, 0x53, 0x12, + 0x4e, 0x9c, 0xd1, 0xa5, 0x18, 0x84, 0x10, 0x57, 0x1a, 0x5d, 0xd7, 0x2f, + 0x5a, 0x03, 0x4a, 0x08, 0xd1, 0x78, 0xf7, 0xde, 0x75, 0xbb, 0x63, 0x24, + 0xcd, 0x49, 0x93, 0xa7, 0xf0, 0xc1, 0xc7, 0x9f, 0x5d, 0x51, 0xef, 0xff, + 0xe6, 0x1b, 0xe6, 0xb1, 0x77, 0xcf, 0x6e, 0x00, 0xfe, 0xf1, 0xfa, 0x3f, + 0x99, 0x7b, 0xed, 0x75, 0x72, 0x50, 0xb4, 0x92, 0xf2, 0xb4, 0xd9, 0xac, + 0x4c, 0x1c, 0x3b, 0x9a, 0x94, 0x94, 0x73, 0xf4, 0xee, 0xd3, 0x97, 0x25, + 0x4b, 0x97, 0x57, 0xfb, 0x4c, 0xb9, 0xfa, 0xaa, 0x19, 0xc4, 0x1e, 0x3b, + 0x4a, 0xd7, 0xf0, 0x70, 0x96, 0xfc, 0xbc, 0xbc, 0xc6, 0x48, 0xd1, 0xb5, + 0xd1, 0x34, 0xad, 0x5a, 0x4d, 0x58, 0x29, 0xf3, 0x96, 0xe3, 0xc7, 0xef, + 0x17, 0xf3, 0xec, 0x33, 0x4f, 0x01, 0xf0, 0xca, 0xdf, 0x5f, 0x63, 0xde, + 0xf5, 0x37, 0x48, 0xa1, 0x34, 0xe7, 0xef, 0x7d, 0xe8, 0xa8, 0xa8, 0x4d, + 0xee, 0x97, 0x54, 0x08, 0x21, 0x5a, 0x03, 0xa9, 0x01, 0x28, 0x84, 0x10, + 0x42, 0x08, 0x71, 0x09, 0x6c, 0xda, 0xb8, 0xc1, 0x11, 0x9c, 0x38, 0x39, + 0x39, 0x31, 0x79, 0xea, 0x34, 0x29, 0x94, 0x56, 0x54, 0x9e, 0x06, 0x83, + 0x91, 0xe7, 0x5e, 0xb4, 0xf7, 0xd5, 0x77, 0xe4, 0x70, 0x74, 0xb5, 0x7e, + 0x0f, 0x15, 0x45, 0xe1, 0xc5, 0x97, 0xff, 0x0f, 0x83, 0xc1, 0xc0, 0xf1, + 0xc4, 0x44, 0xee, 0x58, 0x70, 0x33, 0x99, 0x19, 0x19, 0x17, 0xff, 0x22, + 0xde, 0xcc, 0xc2, 0x3f, 0x39, 0x86, 0x1b, 0xa6, 0xa0, 0xa0, 0x80, 0x7f, + 0xbd, 0xf5, 0x26, 0x00, 0x03, 0x06, 0x0c, 0xe4, 0xba, 0x79, 0xf3, 0xa5, + 0x50, 0x84, 0x10, 0x42, 0x34, 0x7b, 0x32, 0x08, 0x88, 0x10, 0x42, 0x08, + 0x21, 0xc4, 0x6f, 0xf0, 0xe1, 0xfb, 0xef, 0xf2, 0xcb, 0xd2, 0x9f, 0x38, + 0x91, 0x94, 0xe4, 0x78, 0x6e, 0xce, 0xdc, 0x6b, 0xf1, 0xf0, 0xf0, 0x90, + 0xc2, 0x69, 0x65, 0xe5, 0x39, 0x69, 0xf2, 0x14, 0x66, 0x5e, 0x35, 0x9b, + 0x15, 0xcb, 0x97, 0xf1, 0xd2, 0x8b, 0xcf, 0x11, 0x1a, 0x16, 0x46, 0xdf, + 0x7e, 0xf6, 0xfe, 0xff, 0x06, 0x0c, 0x1c, 0xc4, 0x5f, 0x5e, 0x79, 0x95, + 0xe7, 0xff, 0xfc, 0x34, 0x07, 0x0e, 0xec, 0x67, 0xd2, 0x84, 0x31, 0xcc, + 0xbb, 0x7e, 0x3e, 0xe3, 0xc6, 0x4f, 0xa4, 0x73, 0xe7, 0x2e, 0x78, 0x7a, + 0x79, 0x91, 0x9b, 0x93, 0xcd, 0xb9, 0x73, 0xe7, 0xd8, 0xb3, 0x7b, 0x17, + 0x21, 0x21, 0x21, 0x5c, 0x7f, 0xc3, 0x4d, 0x52, 0xe6, 0x2d, 0x4c, 0x79, + 0x79, 0x39, 0x8f, 0xfc, 0xf1, 0x01, 0x32, 0x33, 0x32, 0x70, 0x77, 0xf7, + 0xe0, 0x6f, 0xff, 0x78, 0x43, 0x5a, 0x14, 0x08, 0x21, 0x84, 0x68, 0x11, + 0x24, 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0xf8, 0x0d, 0xce, 0x26, 0x27, + 0x57, 0x0b, 0x4e, 0x02, 0x83, 0x82, 0x78, 0xe4, 0xb1, 0x27, 0xa4, 0x60, + 0x5a, 0x69, 0x79, 0xfe, 0xed, 0xef, 0xaf, 0x93, 0x99, 0x91, 0xc1, 0x9e, + 0xdd, 0xbb, 0x78, 0xfe, 0xd9, 0x67, 0x58, 0xb6, 0x62, 0xb5, 0x63, 0xda, + 0xbc, 0xeb, 0x6f, 0x20, 0x38, 0x38, 0x84, 0xe7, 0x9f, 0x7d, 0x9a, 0xb3, + 0xc9, 0xc9, 0x7c, 0xf3, 0xd5, 0x97, 0x7c, 0xf3, 0xd5, 0x97, 0xb5, 0x2e, + 0x67, 0xe4, 0xa8, 0xd1, 0xcd, 0x26, 0x00, 0x94, 0x63, 0xb8, 0xe1, 0x96, + 0x2d, 0xfd, 0x89, 0xad, 0x5b, 0x36, 0xe3, 0xe2, 0xe2, 0xc2, 0x7b, 0x1f, + 0x7e, 0x4c, 0x68, 0x58, 0x98, 0x14, 0x8a, 0x10, 0x42, 0x88, 0x16, 0x41, + 0x02, 0x40, 0x21, 0xc4, 0x15, 0x49, 0x51, 0x94, 0x4b, 0x36, 0x6a, 0xa2, + 0x10, 0xa2, 0x76, 0xba, 0xce, 0x15, 0x71, 0x9e, 0x05, 0xb5, 0x6d, 0x8b, + 0x87, 0x87, 0x07, 0x46, 0xa3, 0x89, 0xe1, 0x23, 0x47, 0xf2, 0xc4, 0x93, + 0xcf, 0xe0, 0xef, 0xef, 0x2f, 0xd7, 0x98, 0x56, 0x5a, 0x9e, 0x2e, 0x2e, + 0x2e, 0x7c, 0xfe, 0xd5, 0xb7, 0xbc, 0xf5, 0xe6, 0xeb, 0xf8, 0x07, 0x04, + 0xd4, 0xd8, 0xae, 0x11, 0x23, 0x47, 0x11, 0xb5, 0x7e, 0x33, 0x6b, 0xd7, + 0xac, 0x66, 0xdd, 0xba, 0x28, 0x8e, 0x1d, 0x8d, 0x21, 0x35, 0x25, 0x95, + 0xf2, 0xf2, 0x32, 0xdc, 0xdd, 0xdd, 0xe9, 0xd4, 0xb9, 0x0b, 0x43, 0x87, + 0x0e, 0xe3, 0xfa, 0x1b, 0x6f, 0x6a, 0x36, 0xef, 0x49, 0x8e, 0xe1, 0x86, + 0x9b, 0x30, 0x69, 0x0a, 0xfd, 0x7f, 0xf8, 0x9e, 0x97, 0xfe, 0xef, 0x6f, + 0x74, 0xef, 0xd1, 0x43, 0xca, 0xa8, 0x05, 0x7d, 0xef, 0x43, 0x01, 0xe9, + 0x02, 0x50, 0x08, 0x71, 0x45, 0x5f, 0x0b, 0x65, 0x10, 0x10, 0x21, 0x84, + 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x2f, 0x19, + 0x04, 0x44, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, + 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, 0x00, 0x85, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, 0xc5, 0x24, 0x00, 0x14, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xa2, 0x15, + 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, + 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, 0x00, 0x85, 0x10, 0x42, + 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, 0xc5, 0x24, 0x00, + 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0xa2, + 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, 0x00, 0x85, 0x10, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, 0xc5, 0x24, + 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, + 0xa2, 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, 0x10, 0x42, + 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, 0x00, 0x85, + 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, 0xc5, + 0x24, 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x10, 0xa2, 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, 0x10, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, 0x00, + 0x85, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x68, + 0xc5, 0x24, 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x10, 0xa2, 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, 0x42, + 0x08, 0x21, 0x84, 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, 0x84, + 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, 0x09, + 0x00, 0x85, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, + 0x68, 0xc5, 0x24, 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, + 0x21, 0x84, 0x10, 0xa2, 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, 0x10, + 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, 0x31, + 0x09, 0x00, 0x85, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, + 0x84, 0x68, 0xc5, 0x24, 0x00, 0x14, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, + 0x08, 0x21, 0x84, 0x10, 0xa2, 0x15, 0x93, 0x00, 0x50, 0x08, 0x21, 0x84, + 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x88, 0x56, 0x4c, 0x02, 0x40, + 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x84, 0x10, 0x42, 0x08, 0x21, 0x5a, + 0x31, 0xa3, 0x14, 0x81, 0x10, 0x42, 0x08, 0x21, 0x84, 0xb8, 0x92, 0xe9, + 0xba, 0x0e, 0xe8, 0xe8, 0xba, 0x94, 0x85, 0x68, 0x99, 0x14, 0x00, 0x45, + 0x41, 0x51, 0x14, 0x29, 0x8c, 0xe6, 0xba, 0x8f, 0x34, 0x0d, 0xb9, 0xc8, + 0x08, 0x71, 0x29, 0x4e, 0x26, 0x05, 0x5d, 0x95, 0xba, 0x6c, 0x4d, 0x21, + 0x01, 0xa0, 0x10, 0x42, 0x08, 0x21, 0x84, 0xb8, 0x22, 0xe9, 0xba, 0x8e, + 0xcd, 0x66, 0xa3, 0xac, 0xac, 0x14, 0xb3, 0xd9, 0x8c, 0xae, 0x69, 0x15, + 0x61, 0xa0, 0x10, 0x2d, 0xe9, 0x5e, 0x58, 0x41, 0x51, 0x55, 0x9c, 0x9d, + 0x9d, 0x71, 0x71, 0x71, 0x45, 0x55, 0x55, 0x09, 0x02, 0x9b, 0x21, 0xf7, + 0x33, 0x27, 0x70, 0x3d, 0x11, 0x8f, 0xee, 0xec, 0x22, 0x85, 0x21, 0x44, + 0x53, 0xaf, 0x77, 0xe5, 0x65, 0x94, 0x86, 0x46, 0x50, 0xd4, 0xb9, 0xab, + 0x14, 0x46, 0x13, 0x48, 0x00, 0x28, 0x84, 0x10, 0xad, 0xfc, 0xe6, 0xb6, + 0x25, 0xdc, 0xcc, 0xaa, 0xf2, 0x2b, 0x9e, 0x10, 0xe2, 0x77, 0x66, 0x2e, + 0x2f, 0x27, 0x3f, 0x3f, 0x8f, 0xbc, 0xdc, 0x1c, 0xf2, 0x72, 0xb2, 0x29, + 0x28, 0x2c, 0xc0, 0x6a, 0xb1, 0xa2, 0xeb, 0x9a, 0x14, 0x8e, 0x68, 0x59, + 0x37, 0xc4, 0x8a, 0x8a, 0x93, 0xb3, 0x13, 0x9e, 0x9e, 0x5e, 0xf8, 0xfa, + 0xfa, 0xe1, 0xe3, 0xeb, 0x87, 0xa7, 0xb7, 0x0f, 0x4e, 0x4e, 0x4e, 0x52, + 0x38, 0xcd, 0x88, 0x53, 0x66, 0x1a, 0x6e, 0xfb, 0xd6, 0x83, 0xc1, 0x24, + 0x85, 0x21, 0x44, 0x53, 0xd9, 0x2c, 0xd8, 0x3c, 0xbd, 0x41, 0x02, 0xc0, + 0x26, 0x91, 0x00, 0x50, 0x08, 0x21, 0x5a, 0x99, 0xb2, 0xb2, 0x32, 0x0e, + 0x1d, 0x3c, 0xc0, 0xd1, 0x98, 0x23, 0xa4, 0xa7, 0xa7, 0x61, 0x2e, 0x37, + 0x37, 0xfb, 0x6d, 0x76, 0x76, 0x76, 0x26, 0x38, 0xa4, 0x3d, 0xbd, 0xfb, + 0xf6, 0xa5, 0x4f, 0x9f, 0xbe, 0x18, 0x8d, 0xf2, 0xf1, 0x24, 0x84, 0xb8, + 0x7c, 0x8a, 0x0a, 0x0b, 0xc9, 0xcf, 0xcb, 0x21, 0x3e, 0x2e, 0x96, 0x43, + 0x07, 0x0f, 0x10, 0x1f, 0x9f, 0x40, 0x56, 0x56, 0x26, 0x66, 0xb3, 0x19, + 0x4d, 0x93, 0x00, 0x50, 0xb4, 0x2c, 0xaa, 0xaa, 0xe2, 0xe4, 0xe4, 0x44, + 0xdb, 0xb6, 0x6d, 0x09, 0x0f, 0x0f, 0x67, 0xc0, 0xc0, 0x41, 0x84, 0x77, + 0x8b, 0xc0, 0xcb, 0xdb, 0x17, 0x77, 0x0f, 0x0f, 0x29, 0xa0, 0xe6, 0xa2, + 0xf2, 0x07, 0x59, 0x9b, 0x45, 0xca, 0x42, 0x88, 0x4b, 0x71, 0x2e, 0x89, + 0x46, 0x93, 0x3b, 0x2c, 0x21, 0x84, 0x68, 0x45, 0x8e, 0x1d, 0x3d, 0xca, + 0x77, 0xdf, 0x7e, 0x4d, 0x54, 0xd4, 0x6a, 0x8a, 0x0a, 0x0b, 0xb1, 0xd9, + 0x6c, 0x2d, 0x62, 0xbb, 0x15, 0x45, 0x41, 0x55, 0x55, 0xfc, 0xfc, 0xfc, + 0x98, 0x79, 0xd5, 0x6c, 0x6e, 0x5d, 0x70, 0x07, 0x1d, 0x3a, 0x76, 0x94, + 0x1d, 0x2a, 0x84, 0xb8, 0xe4, 0xca, 0xcb, 0xcb, 0xc8, 0xcf, 0xcb, 0xe1, + 0xc0, 0xfe, 0x7d, 0xac, 0x5b, 0x1b, 0x45, 0x74, 0x74, 0x34, 0xf9, 0xf9, + 0xf9, 0x94, 0x97, 0x97, 0xa3, 0x49, 0x13, 0x60, 0xd1, 0x02, 0x55, 0x7e, + 0x86, 0x9e, 0x3c, 0x79, 0x92, 0xd8, 0xd8, 0x58, 0x4e, 0x9f, 0x3e, 0xcd, + 0xa4, 0xc9, 0x53, 0x18, 0x30, 0x70, 0x10, 0x4e, 0xce, 0x4e, 0x98, 0x4c, + 0x52, 0x13, 0x50, 0x08, 0x21, 0x84, 0x04, 0x80, 0x42, 0x08, 0xd1, 0x6a, + 0xc4, 0x1e, 0x3b, 0xca, 0x3f, 0xdf, 0x7c, 0x8d, 0xad, 0x9b, 0x37, 0xb5, + 0xb8, 0x1b, 0xd8, 0xca, 0x7e, 0xb8, 0x32, 0x33, 0x33, 0xf9, 0xfa, 0xcb, + 0x2f, 0xc8, 0xca, 0xcc, 0xe2, 0xb1, 0x27, 0x9e, 0x22, 0xa4, 0x7d, 0x7b, + 0xd9, 0xb1, 0x42, 0x88, 0x4b, 0xaa, 0x20, 0x3f, 0x9f, 0x84, 0xf8, 0x38, + 0xd6, 0xad, 0x8d, 0x62, 0xe7, 0xce, 0x9d, 0xe4, 0xe5, 0xe5, 0x49, 0xa1, + 0x88, 0x16, 0x4d, 0xd7, 0x75, 0x34, 0x4d, 0xa3, 0xa8, 0xa8, 0x88, 0xa2, + 0xa2, 0x22, 0x4a, 0x4a, 0x4a, 0x50, 0x14, 0x05, 0x2f, 0x4f, 0x4f, 0x9c, + 0x5d, 0x5c, 0xf1, 0xf3, 0x0f, 0x90, 0x42, 0x12, 0x42, 0x08, 0x21, 0x01, + 0xe0, 0xff, 0xea, 0x26, 0xb7, 0xb8, 0xb8, 0x88, 0x94, 0xb3, 0xe7, 0x88, + 0x8f, 0x3d, 0x46, 0x52, 0xe2, 0x71, 0x4e, 0x9f, 0x3c, 0x41, 0x66, 0x5a, + 0x3a, 0xf9, 0x05, 0xf9, 0x94, 0x97, 0x96, 0xa1, 0xe9, 0x3a, 0x0a, 0x0a, + 0x46, 0x27, 0x23, 0x1e, 0x6e, 0x1e, 0x78, 0xfa, 0x78, 0x13, 0xd0, 0x26, + 0x80, 0xb6, 0xc1, 0xc1, 0x74, 0xec, 0xd8, 0x99, 0xd0, 0xf0, 0xae, 0xb4, + 0xef, 0xd8, 0x11, 0x6f, 0x1f, 0x1f, 0x5c, 0x9c, 0x9d, 0x51, 0x0d, 0x86, + 0x16, 0x5d, 0x26, 0x0d, 0xd1, 0x94, 0xce, 0x8c, 0x2f, 0xe7, 0xb2, 0x5b, + 0x72, 0xb9, 0x88, 0xd6, 0xa7, 0xbc, 0xbc, 0x9c, 0xef, 0x16, 0x7d, 0xdb, + 0x22, 0xc3, 0xbf, 0xda, 0x8e, 0xfd, 0x95, 0x2b, 0x96, 0x13, 0xd2, 0xbe, + 0x3d, 0x8f, 0x3c, 0xf6, 0x84, 0xf4, 0x0f, 0x28, 0x84, 0xb8, 0x64, 0x6c, + 0x36, 0x1b, 0xf9, 0xb9, 0x39, 0x1c, 0x3c, 0xb0, 0x9f, 0xe8, 0xe8, 0x68, + 0x09, 0xff, 0x44, 0xab, 0x94, 0x93, 0x93, 0xc3, 0xe1, 0xc3, 0x87, 0xe9, + 0xdc, 0xa5, 0x0b, 0xc1, 0xed, 0x3b, 0xe0, 0xed, 0xe3, 0x83, 0xc1, 0x20, + 0xb7, 0x7d, 0x42, 0x08, 0x71, 0xa5, 0x93, 0x4f, 0x82, 0xdf, 0x51, 0x59, + 0x69, 0x29, 0x27, 0x8e, 0x27, 0x71, 0x60, 0xef, 0x1e, 0xb6, 0x6c, 0xdc, + 0x48, 0xdc, 0xb1, 0x63, 0x94, 0x14, 0x17, 0x03, 0xf5, 0x87, 0x38, 0xb9, + 0xd9, 0x39, 0x90, 0x5c, 0xfd, 0xe6, 0x58, 0x51, 0x14, 0xda, 0xb6, 0x6b, + 0x47, 0x64, 0xef, 0xde, 0x0c, 0x1b, 0x35, 0x8a, 0xbe, 0xfd, 0xfb, 0xd3, + 0xa9, 0x4b, 0x17, 0x0c, 0x0d, 0x0c, 0x02, 0x2b, 0xfb, 0xb7, 0xf9, 0x5f, + 0xdf, 0x58, 0xdb, 0x6c, 0x36, 0x12, 0xe3, 0xe2, 0xc8, 0xcb, 0xcb, 0xab, + 0x37, 0xb4, 0xf0, 0x0f, 0x08, 0x20, 0x2c, 0x3c, 0xbc, 0xc1, 0xef, 0x0f, + 0x40, 0xb3, 0xd9, 0x38, 0x91, 0x94, 0x44, 0x66, 0x46, 0x86, 0xa3, 0x8c, + 0x2f, 0x5c, 0x87, 0xae, 0x69, 0xf8, 0xf8, 0xf9, 0x11, 0xd1, 0xa3, 0x47, + 0xa3, 0x96, 0xfd, 0x7b, 0x94, 0x4b, 0xf2, 0xe9, 0xd3, 0xa4, 0xa6, 0xa4, + 0xd4, 0x3b, 0x9f, 0xa7, 0x97, 0x17, 0x5d, 0xc3, 0xc3, 0x71, 0x71, 0x75, + 0x95, 0x13, 0xec, 0x0a, 0x17, 0x73, 0xe4, 0x30, 0x6b, 0xd7, 0xac, 0x6e, + 0x35, 0x4d, 0xd7, 0x34, 0x4d, 0x63, 0xd5, 0x8a, 0x5f, 0xb9, 0x6a, 0xce, + 0xd5, 0x74, 0xeb, 0x16, 0x21, 0x3b, 0x58, 0x08, 0x71, 0x69, 0xbe, 0x8b, + 0x95, 0x95, 0x92, 0x9b, 0x9b, 0x43, 0x7c, 0x7c, 0x02, 0xf9, 0xf9, 0xf9, + 0x52, 0x20, 0xa2, 0xd5, 0xca, 0xcd, 0xcd, 0x25, 0x31, 0x21, 0x81, 0x82, + 0xfc, 0x5c, 0xca, 0xcb, 0xcb, 0x71, 0x73, 0x93, 0xdb, 0x3e, 0x21, 0x84, + 0xb8, 0xd2, 0xc9, 0x27, 0xc1, 0xef, 0xc0, 0x66, 0xb3, 0x92, 0x10, 0x17, + 0xcf, 0xe6, 0xf5, 0xeb, 0x59, 0xb9, 0x6c, 0x19, 0x29, 0x67, 0xcf, 0x51, + 0x99, 0xf7, 0x35, 0xa5, 0xf6, 0x56, 0xe5, 0x6b, 0xd2, 0x52, 0x53, 0x49, + 0x4b, 0x4d, 0x65, 0x43, 0x54, 0x14, 0xe1, 0xdd, 0x7b, 0xf0, 0xd7, 0xd7, + 0x5f, 0x23, 0xb4, 0x6b, 0xfd, 0xa3, 0xe1, 0x14, 0x16, 0x14, 0x70, 0x36, + 0x39, 0x99, 0xec, 0xac, 0x2c, 0x14, 0xc0, 0xbf, 0x4d, 0x1b, 0x82, 0x43, + 0x42, 0xf0, 0xf2, 0xf6, 0xfe, 0x9f, 0x94, 0x4d, 0x76, 0x56, 0x26, 0x6f, + 0xbc, 0xf2, 0x37, 0x12, 0xe2, 0x62, 0xeb, 0x9c, 0xc7, 0x6a, 0xb3, 0xd1, + 0x6f, 0xc0, 0x00, 0x5e, 0x79, 0xf3, 0x4d, 0x7c, 0xfd, 0xfc, 0x1a, 0xf5, + 0xc5, 0xe7, 0x93, 0xf7, 0xde, 0x63, 0xfb, 0x96, 0x2d, 0x18, 0xea, 0x08, + 0x3a, 0xad, 0x56, 0x2b, 0x61, 0xe1, 0xe1, 0xbc, 0xfd, 0xc9, 0x27, 0xf8, + 0xf9, 0xfb, 0x37, 0x9b, 0x63, 0xa6, 0xa8, 0xb0, 0x90, 0xaf, 0x3f, 0xfb, + 0x8c, 0x35, 0x2b, 0x56, 0x60, 0xac, 0x23, 0x98, 0xb4, 0xda, 0x6c, 0x84, + 0x86, 0x85, 0xf1, 0xfc, 0x2b, 0xaf, 0x10, 0xd1, 0xa3, 0x87, 0x9c, 0x68, + 0x57, 0xb8, 0x63, 0x47, 0x63, 0x28, 0x28, 0x28, 0x68, 0x55, 0xef, 0x29, + 0x35, 0x35, 0x85, 0xb8, 0xd8, 0x63, 0x12, 0x00, 0x0a, 0x21, 0x2e, 0x09, + 0x5d, 0xd7, 0x29, 0x2f, 0x2b, 0xa3, 0xb0, 0xb0, 0x80, 0x9c, 0x9c, 0x6c, + 0xca, 0xcb, 0xcb, 0xa5, 0x50, 0x44, 0xab, 0x55, 0x56, 0x56, 0x46, 0x46, + 0x46, 0x06, 0x45, 0x45, 0xc5, 0x58, 0x2c, 0x16, 0x47, 0x05, 0x02, 0x21, + 0x84, 0x10, 0x57, 0x2e, 0x09, 0x00, 0x7f, 0x87, 0x0f, 0xdf, 0x75, 0xab, + 0x57, 0xf3, 0xfd, 0xa2, 0x45, 0xc4, 0x1f, 0x8b, 0x45, 0xd7, 0x35, 0x2e, + 0xc7, 0x67, 0x6f, 0x62, 0x5c, 0x2c, 0x85, 0x17, 0xb9, 0xf9, 0x3f, 0x76, + 0xe4, 0x08, 0xbf, 0x2c, 0x59, 0xc2, 0xc1, 0x7d, 0xfb, 0xc8, 0xcb, 0xcd, + 0x45, 0x01, 0xbc, 0x7d, 0x7d, 0xe9, 0x3f, 0x68, 0x20, 0x57, 0xcf, 0xbb, + 0x9e, 0x1e, 0x3d, 0x7b, 0xfe, 0xfe, 0xe5, 0x53, 0x5a, 0x46, 0x4e, 0x4e, + 0x36, 0xa5, 0xa5, 0xa5, 0xf5, 0xce, 0x97, 0x95, 0x99, 0x49, 0x79, 0x59, + 0x59, 0xa3, 0x96, 0x6d, 0x2e, 0x2f, 0x27, 0x2b, 0x23, 0x03, 0xf3, 0x45, + 0xbe, 0xe0, 0x67, 0x67, 0x67, 0x37, 0x7a, 0xd9, 0x97, 0x9b, 0xcd, 0x66, + 0x23, 0x3b, 0x2b, 0x1b, 0x8b, 0xd9, 0x4c, 0x7d, 0xe3, 0x84, 0xe5, 0xe7, + 0xe5, 0x51, 0x56, 0x56, 0x2a, 0x27, 0x9a, 0x20, 0x23, 0x3d, 0x1d, 0x4d, + 0xb3, 0xb5, 0xaa, 0xf7, 0x64, 0xb5, 0x5a, 0xc9, 0x48, 0x4f, 0x97, 0x9d, + 0x2b, 0x84, 0xb8, 0x24, 0x2a, 0xfb, 0x49, 0xab, 0xfc, 0xbf, 0x10, 0xad, + 0xfd, 0x78, 0xb7, 0x5a, 0xad, 0xd8, 0x6c, 0x56, 0x74, 0x4d, 0x06, 0xb6, + 0x11, 0x42, 0x08, 0x21, 0x01, 0xe0, 0x65, 0xbf, 0x79, 0xfd, 0x7e, 0xd1, + 0x22, 0xfe, 0xf3, 0xcd, 0x37, 0x64, 0x65, 0x66, 0x5e, 0xd6, 0x75, 0x75, + 0xea, 0xdc, 0x85, 0x0e, 0x9d, 0x3a, 0xd5, 0x39, 0xfd, 0xd8, 0x91, 0x23, + 0xbc, 0xfe, 0xca, 0x2b, 0x1c, 0x39, 0x74, 0xa8, 0xda, 0xaf, 0x7f, 0x39, + 0x39, 0x39, 0x9c, 0x48, 0x3a, 0xce, 0xb1, 0x98, 0x18, 0x9e, 0x7e, 0xe1, + 0x25, 0x7a, 0xf6, 0xe9, 0xfd, 0xbb, 0x96, 0x91, 0xaa, 0xaa, 0x18, 0x4d, + 0x17, 0x3f, 0x0c, 0x8d, 0x26, 0x63, 0xa3, 0x7f, 0xb5, 0x54, 0x14, 0x05, + 0x83, 0xb1, 0x01, 0xcb, 0x36, 0x18, 0x9a, 0xe5, 0x2f, 0xa2, 0x06, 0x83, + 0x0a, 0xe8, 0x40, 0xdd, 0xdb, 0xa6, 0x1a, 0x0c, 0xa8, 0x8a, 0xf4, 0x8f, + 0x26, 0xc0, 0x62, 0xb5, 0xb6, 0xda, 0x9b, 0x17, 0x21, 0x84, 0xb8, 0x5c, + 0xd7, 0x18, 0x21, 0x84, 0x10, 0x42, 0x88, 0x2b, 0x85, 0x04, 0x80, 0x97, + 0xf1, 0x4b, 0xe5, 0xf7, 0xdf, 0x2e, 0xe2, 0xbb, 0x2f, 0xbf, 0x22, 0x37, + 0x27, 0xfb, 0xb2, 0xaf, 0x2b, 0xbc, 0x7b, 0x04, 0x3e, 0xbe, 0xbe, 0xb5, + 0x4e, 0x2f, 0x2f, 0x2f, 0xe7, 0xdb, 0xcf, 0x3f, 0x27, 0x26, 0x3a, 0xba, + 0xd6, 0xa0, 0x4b, 0x41, 0x21, 0xee, 0xe8, 0x31, 0x3e, 0x7d, 0xff, 0x3d, + 0x5e, 0x7e, 0xed, 0x35, 0xbc, 0xff, 0x47, 0xcd, 0x81, 0x85, 0x10, 0x42, + 0x08, 0x21, 0x9a, 0x2b, 0x27, 0x7f, 0x4f, 0x9c, 0x3a, 0xfa, 0xa0, 0x03, + 0x96, 0xb3, 0x79, 0x58, 0x32, 0x0b, 0x69, 0xee, 0x11, 0x62, 0x50, 0x50, + 0x10, 0xc3, 0x87, 0x0f, 0xa7, 0x77, 0xef, 0xde, 0xb8, 0xba, 0xba, 0x92, + 0x9d, 0x9d, 0xcd, 0xbe, 0x7d, 0xfb, 0xd8, 0xb7, 0x6f, 0x1f, 0xc5, 0xc5, + 0xc5, 0x74, 0xef, 0xde, 0x9d, 0x31, 0x63, 0xc6, 0xe0, 0xed, 0xed, 0x6d, + 0xff, 0xe1, 0xd4, 0x60, 0xe0, 0xc8, 0x91, 0x23, 0x14, 0x16, 0x16, 0xd2, + 0xa9, 0x53, 0x27, 0xda, 0xb5, 0x6b, 0x87, 0xd9, 0x6c, 0x46, 0x51, 0x14, + 0x9c, 0x9c, 0x9c, 0x88, 0x8d, 0x8d, 0x65, 0xf7, 0xee, 0xdd, 0xa4, 0xa5, + 0xa5, 0x61, 0x34, 0x1a, 0x09, 0x0e, 0x0e, 0x66, 0xc0, 0x80, 0x01, 0xc4, + 0xc5, 0xc5, 0xd1, 0xbd, 0x7b, 0x77, 0xc2, 0xc2, 0xc2, 0x00, 0x7b, 0x4b, + 0x06, 0xa3, 0xd1, 0x88, 0xd9, 0x6c, 0x66, 0xed, 0xda, 0xb5, 0x1c, 0x3f, + 0x7e, 0x1c, 0x8b, 0xe5, 0x7c, 0x9b, 0x86, 0x3e, 0x7d, 0xfa, 0x30, 0x72, + 0xe4, 0x48, 0x42, 0x42, 0x42, 0xd0, 0x75, 0x9d, 0xa4, 0xa4, 0x24, 0xb6, + 0x6f, 0xdf, 0x4e, 0x62, 0x62, 0x22, 0xaa, 0xaa, 0xd2, 0xbb, 0x77, 0x6f, + 0x7a, 0xf5, 0xea, 0x45, 0x4c, 0x4c, 0x0c, 0xc7, 0x8e, 0x1d, 0xc3, 0x62, + 0xb1, 0x10, 0x18, 0x18, 0xc8, 0xc8, 0x91, 0x23, 0x89, 0x8b, 0x8b, 0xab, + 0x6b, 0x2c, 0xce, 0xe1, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, + 0xb1, 0x3c, 0x21, 0x84, 0x10, 0x42, 0x5c, 0x9c, 0x04, 0x80, 0x97, 0xc9, + 0xca, 0x65, 0xcb, 0xf8, 0xee, 0xab, 0x2f, 0x2f, 0x7b, 0xf8, 0x57, 0x29, + 0xb2, 0x77, 0xef, 0x3a, 0x07, 0xf4, 0x38, 0x76, 0xf8, 0x30, 0xdb, 0xb7, + 0x6c, 0xb9, 0xe8, 0x32, 0x8e, 0x44, 0x47, 0x73, 0xe4, 0xc0, 0x41, 0x46, + 0x8d, 0x1f, 0x57, 0xe7, 0x3c, 0x36, 0x9b, 0x15, 0x9b, 0x4d, 0xab, 0xf3, + 0x57, 0x73, 0x45, 0x51, 0x30, 0x1a, 0x8d, 0x32, 0x6a, 0xa7, 0x10, 0x42, + 0x08, 0x21, 0x5a, 0x0d, 0xd5, 0xcd, 0x1d, 0xa7, 0x89, 0x53, 0x31, 0x8d, + 0xf6, 0xc1, 0xe0, 0x56, 0x82, 0x53, 0x7c, 0x1a, 0xe6, 0x3d, 0xc9, 0x58, + 0x8e, 0xa6, 0x63, 0xce, 0x6c, 0x9e, 0xfd, 0xaf, 0x76, 0xe9, 0xd2, 0x85, + 0x6b, 0xaf, 0xbd, 0x96, 0xc1, 0x83, 0x07, 0x53, 0x54, 0x54, 0x44, 0x69, + 0x69, 0x29, 0xc1, 0xc1, 0xc1, 0x74, 0xe9, 0xd2, 0x85, 0xb2, 0xb2, 0x32, + 0x0e, 0x1e, 0x3c, 0x48, 0xf7, 0xee, 0xdd, 0xb9, 0xe9, 0xa6, 0x9b, 0x48, + 0x4b, 0x4b, 0xa3, 0xa4, 0xa4, 0x04, 0x83, 0xc1, 0x40, 0x56, 0x56, 0x16, + 0xae, 0xae, 0xae, 0x74, 0xea, 0xd4, 0x89, 0x3e, 0x7d, 0xfa, 0xd0, 0xa9, + 0x53, 0x27, 0x0a, 0x0b, 0x0b, 0x49, 0x4f, 0x4f, 0x27, 0x3f, 0x3f, 0x1f, + 0x17, 0x17, 0x17, 0x00, 0x0c, 0x06, 0x03, 0x1d, 0x3b, 0x76, 0xe4, 0x86, + 0x1b, 0x6e, 0xe0, 0xb3, 0xcf, 0x3e, 0x23, 0x38, 0x38, 0x98, 0x9e, 0x3d, + 0x7b, 0xd2, 0xbe, 0x7d, 0x7b, 0x02, 0x02, 0x02, 0x48, 0x4c, 0x4c, 0x24, + 0x2b, 0x2b, 0x8b, 0x5d, 0xbb, 0x76, 0x39, 0xbe, 0x17, 0x3a, 0x3b, 0x3b, + 0x33, 0x74, 0xe8, 0x50, 0x6e, 0xbf, 0xfd, 0x76, 0x9c, 0x9d, 0x9d, 0x29, + 0x28, 0x28, 0xc0, 0x60, 0x30, 0x10, 0x1e, 0x1e, 0x4e, 0xf7, 0xee, 0xdd, + 0x59, 0xbc, 0x78, 0x31, 0xd1, 0xd1, 0xd1, 0xf4, 0xeb, 0xd7, 0x8f, 0x85, + 0x0b, 0x17, 0xb2, 0x75, 0xeb, 0x56, 0x3e, 0xfa, 0xe8, 0x23, 0x4e, 0x9c, + 0x38, 0x41, 0x60, 0x60, 0x20, 0xf3, 0xe6, 0xcd, 0xe3, 0xc7, 0x1f, 0x7f, + 0xe4, 0xcc, 0x99, 0x33, 0x12, 0x00, 0x0a, 0x21, 0x84, 0x10, 0x8d, 0x24, + 0x01, 0xe0, 0x65, 0x10, 0x77, 0xec, 0x18, 0xdf, 0x7f, 0xf3, 0xad, 0x63, + 0xf4, 0xd9, 0xcb, 0xcd, 0xd5, 0xd5, 0x95, 0xf0, 0xee, 0xdd, 0xeb, 0x9c, + 0x7e, 0x3c, 0xf1, 0x38, 0x65, 0x0d, 0xe8, 0xe3, 0xae, 0xac, 0xac, 0x8c, + 0x84, 0x84, 0xf8, 0x3a, 0x03, 0x40, 0x9b, 0xcd, 0xc6, 0x67, 0x1f, 0x7c, + 0x48, 0x62, 0x42, 0x02, 0xce, 0xce, 0xce, 0xb5, 0x86, 0x80, 0xba, 0x0e, + 0xa1, 0x61, 0xa1, 0xdc, 0x72, 0xc7, 0x1d, 0xb8, 0xba, 0xb9, 0xc9, 0xc1, + 0x20, 0x84, 0x10, 0x42, 0x88, 0x96, 0x4d, 0x51, 0x50, 0x7c, 0x83, 0xb0, + 0x4d, 0xb8, 0x05, 0x6d, 0x88, 0x01, 0x93, 0xdf, 0x71, 0x0c, 0x83, 0x92, + 0x71, 0x1e, 0x18, 0x8c, 0x71, 0x7b, 0x32, 0xfa, 0xba, 0x78, 0xf4, 0x73, + 0xf9, 0x58, 0xf3, 0x9b, 0x4f, 0x9f, 0xbc, 0x26, 0x93, 0x89, 0xb9, 0x73, + 0xe7, 0x32, 0x71, 0xe2, 0x44, 0x12, 0x12, 0x12, 0x58, 0xba, 0x74, 0x29, + 0xd9, 0xd9, 0xd9, 0x74, 0xea, 0xd4, 0x89, 0xde, 0xbd, 0x7b, 0xa3, 0xeb, + 0x3a, 0xaa, 0xaa, 0xe2, 0xe5, 0xe5, 0x85, 0x87, 0x87, 0x07, 0x51, 0x51, + 0x51, 0x9c, 0x3d, 0x7b, 0x16, 0x80, 0x94, 0x94, 0x14, 0x2c, 0x16, 0x0b, + 0x67, 0xcf, 0x9e, 0x25, 0x23, 0x23, 0x83, 0xbb, 0xee, 0xba, 0x8b, 0xd4, + 0xd4, 0x54, 0x56, 0xac, 0x58, 0xc1, 0xd1, 0xa3, 0x47, 0xc9, 0xcd, 0xcd, + 0xad, 0xf6, 0x1d, 0x34, 0x2c, 0x2c, 0x0c, 0xab, 0xd5, 0xca, 0x8e, 0x1d, + 0x3b, 0x48, 0x4b, 0x4b, 0x63, 0xda, 0xb4, 0x69, 0x74, 0xea, 0xd4, 0x89, + 0x2d, 0x5b, 0xb6, 0x90, 0x94, 0x94, 0x54, 0x2d, 0xac, 0xeb, 0xda, 0xb5, + 0x2b, 0xf3, 0xe7, 0xcf, 0xa7, 0x6b, 0xd7, 0xae, 0x7c, 0xfd, 0xf5, 0xd7, + 0x1c, 0x3e, 0x7c, 0x18, 0xa3, 0xd1, 0xc8, 0xf8, 0xf1, 0xe3, 0x19, 0x31, + 0x62, 0x04, 0x0b, 0x16, 0x2c, 0xe0, 0xd5, 0x57, 0x5f, 0xc5, 0xd7, 0xd7, + 0x97, 0x2e, 0x5d, 0xba, 0xe0, 0xe1, 0xe1, 0x41, 0x4c, 0x4c, 0x0c, 0x67, + 0xce, 0x9c, 0xc1, 0x68, 0x34, 0x3a, 0x9e, 0x93, 0xc1, 0x2c, 0x84, 0x10, + 0x42, 0x88, 0xc6, 0x93, 0x00, 0xf0, 0x12, 0x2b, 0x2e, 0x2a, 0x62, 0xd5, + 0xb2, 0x65, 0xc4, 0xc5, 0xc7, 0x35, 0xe9, 0xf5, 0xaa, 0xaa, 0x3a, 0x7a, + 0x7d, 0xab, 0xfa, 0xe5, 0x46, 0xd7, 0x75, 0xc7, 0xf3, 0xba, 0xae, 0x57, + 0x0b, 0xdf, 0xda, 0x85, 0x84, 0xd0, 0xbe, 0x43, 0x87, 0x3a, 0x97, 0x59, + 0x56, 0x56, 0x6a, 0x7f, 0xdd, 0xc5, 0x56, 0xae, 0xeb, 0x58, 0xcd, 0x75, + 0xff, 0x9a, 0x6a, 0xb5, 0x58, 0xd8, 0xb2, 0x71, 0x23, 0x09, 0xb1, 0xb1, + 0xf5, 0x2e, 0xa6, 0x7b, 0x64, 0x24, 0x73, 0xaf, 0xbf, 0x5e, 0x02, 0x40, + 0x21, 0x84, 0x10, 0x42, 0xb4, 0x7c, 0xaa, 0x8a, 0xee, 0xe1, 0x4b, 0x79, + 0xc0, 0x40, 0xf4, 0x52, 0x67, 0x2c, 0xb9, 0x2a, 0x06, 0x8f, 0x32, 0x0c, + 0x23, 0x9d, 0x30, 0xf6, 0x09, 0xc2, 0xa5, 0x5f, 0x20, 0x6c, 0x38, 0x49, + 0xe9, 0xd6, 0x13, 0xd8, 0xd2, 0x0a, 0xd0, 0xcb, 0xff, 0xf7, 0x7d, 0x97, + 0x46, 0x44, 0x44, 0x30, 0x7a, 0xf4, 0x68, 0x4e, 0x9d, 0x3a, 0xc5, 0x9b, + 0x6f, 0xbe, 0xe9, 0x08, 0xd0, 0x62, 0x63, 0x63, 0xd9, 0xbf, 0x7f, 0x3f, + 0xc5, 0xc5, 0xc5, 0x8e, 0xef, 0x99, 0xf9, 0xf9, 0xf9, 0x44, 0x47, 0x47, + 0x73, 0xe2, 0xc4, 0x09, 0x6c, 0x36, 0x1b, 0x65, 0x65, 0x65, 0x98, 0xcd, + 0x66, 0x00, 0xce, 0x9d, 0x3b, 0xc7, 0xd4, 0xa9, 0x53, 0x39, 0x7c, 0xf8, + 0x30, 0xcb, 0x96, 0x2d, 0xa3, 0xb8, 0xb8, 0xb8, 0xda, 0x7a, 0x34, 0x4d, + 0xc3, 0x62, 0xb1, 0x50, 0x5a, 0x5a, 0xca, 0xa1, 0x43, 0x87, 0x38, 0x72, + 0xe4, 0x08, 0x81, 0x81, 0x81, 0x44, 0x44, 0x44, 0x10, 0x15, 0x15, 0x45, + 0x62, 0x62, 0xa2, 0x63, 0x5e, 0x83, 0xc1, 0x40, 0xcf, 0x9e, 0x3d, 0xe9, + 0xd9, 0xb3, 0x27, 0x5f, 0x7e, 0xf9, 0x25, 0x5f, 0x7e, 0xf9, 0xa5, 0x63, + 0xda, 0xd1, 0xa3, 0x47, 0x31, 0x9b, 0xcd, 0x5c, 0x7d, 0xf5, 0xd5, 0x0c, + 0x1a, 0x34, 0x08, 0x45, 0x51, 0x88, 0x89, 0x89, 0x21, 0x20, 0x20, 0x80, + 0xd1, 0xa3, 0x47, 0x73, 0xfa, 0xf4, 0x69, 0x72, 0x72, 0x72, 0xb0, 0x58, + 0x2c, 0x32, 0x80, 0x8b, 0x10, 0x42, 0x08, 0xd1, 0x44, 0x12, 0x00, 0x5e, + 0x42, 0xba, 0xae, 0x13, 0x77, 0xec, 0x18, 0x9b, 0xd6, 0x6f, 0x40, 0xb7, + 0x35, 0x7c, 0x34, 0x4e, 0x55, 0x55, 0x71, 0x77, 0x77, 0x27, 0x30, 0xa8, + 0x2d, 0x5d, 0x23, 0xba, 0xd1, 0xa1, 0x53, 0x27, 0xda, 0x04, 0x06, 0xe2, + 0xee, 0xe1, 0x0e, 0x8a, 0x8a, 0xcd, 0x62, 0xa5, 0xb8, 0xb8, 0x88, 0xdc, + 0x9c, 0x1c, 0x32, 0xd2, 0xd2, 0x49, 0x49, 0x39, 0x47, 0x4a, 0x72, 0x32, + 0x79, 0x79, 0x79, 0x14, 0x17, 0x15, 0xd1, 0x25, 0x2c, 0x0c, 0xdf, 0x3a, + 0xfa, 0xff, 0x03, 0x08, 0xe9, 0xd0, 0x01, 0x14, 0xc5, 0x5e, 0x3d, 0xaf, + 0x1e, 0x26, 0x27, 0x27, 0xda, 0xb4, 0x0d, 0xac, 0x77, 0x1e, 0x85, 0x8b, + 0xff, 0xe2, 0xaa, 0x48, 0xf3, 0x5f, 0x21, 0x84, 0x68, 0x32, 0xab, 0xd5, + 0x8a, 0xd9, 0x5c, 0x5e, 0x51, 0x43, 0xc7, 0x80, 0xb3, 0xb3, 0xf3, 0x25, + 0xeb, 0x56, 0x41, 0xd7, 0x75, 0xca, 0xcb, 0xcb, 0xd1, 0x35, 0x0d, 0xd5, + 0x60, 0x5f, 0xf6, 0xa5, 0xa2, 0x69, 0x1a, 0x66, 0xb3, 0x19, 0x5d, 0xd3, + 0x50, 0x54, 0x15, 0x27, 0x27, 0x27, 0xe9, 0x0e, 0x42, 0xb4, 0x12, 0x0a, + 0x9a, 0xa2, 0x82, 0x41, 0x03, 0xad, 0x0d, 0xb6, 0xb2, 0xa1, 0xe8, 0xaa, + 0x82, 0xa6, 0x1e, 0xc2, 0xec, 0x95, 0x83, 0x32, 0xa3, 0x0b, 0x2e, 0x23, + 0x3b, 0xe0, 0xba, 0xb1, 0x23, 0xd6, 0x65, 0xb1, 0x58, 0xf6, 0x9c, 0xc1, + 0x9a, 0x55, 0xfc, 0x3f, 0xdd, 0xe2, 0xe0, 0xe0, 0x60, 0x6c, 0x36, 0x1b, + 0xd1, 0xd1, 0xd1, 0x9c, 0x39, 0x73, 0x06, 0x57, 0x57, 0x57, 0x46, 0x8e, + 0x1c, 0x49, 0x87, 0x0e, 0x1d, 0x1c, 0xe7, 0xe5, 0xb1, 0x63, 0xc7, 0x50, + 0x55, 0x95, 0x76, 0xed, 0xda, 0xb1, 0x70, 0xe1, 0x42, 0x0a, 0x0a, 0x0a, + 0xb0, 0x58, 0x2c, 0xac, 0x5e, 0xbd, 0x9a, 0x5d, 0xbb, 0x76, 0x51, 0x56, + 0x56, 0xe6, 0xb8, 0xfe, 0x18, 0x8d, 0x46, 0x9c, 0x9d, 0x9d, 0x6b, 0x04, + 0x80, 0x8e, 0x12, 0xaa, 0x08, 0x13, 0x5d, 0x5c, 0x5c, 0x1c, 0x5d, 0xc1, + 0x54, 0x5e, 0x03, 0x2a, 0x03, 0x3b, 0x77, 0x77, 0x77, 0x82, 0x82, 0x82, + 0xb0, 0xd9, 0x6c, 0x6c, 0xda, 0xb4, 0x09, 0x45, 0x51, 0x1c, 0x3f, 0x68, + 0x17, 0x14, 0x14, 0x70, 0xf0, 0xe0, 0x41, 0xc6, 0x8d, 0x1b, 0x47, 0x68, + 0x68, 0x28, 0x46, 0xa3, 0x91, 0x53, 0xa7, 0x4e, 0xb1, 0x63, 0xc7, 0x0e, + 0x82, 0x83, 0x83, 0x99, 0x3e, 0x7d, 0x3a, 0x51, 0x51, 0x51, 0x32, 0x70, + 0x8b, 0xb8, 0xc2, 0xaf, 0x44, 0x15, 0xb7, 0x74, 0x00, 0x7a, 0x3d, 0x95, + 0x3b, 0x74, 0x1d, 0x34, 0x9b, 0xfd, 0xff, 0xaa, 0x6a, 0xff, 0x87, 0xd4, + 0x9a, 0x15, 0x42, 0x48, 0x00, 0x78, 0x49, 0x95, 0x95, 0x95, 0xb1, 0x67, + 0xe7, 0x4e, 0x52, 0xce, 0x26, 0x37, 0xf8, 0x35, 0x7e, 0xfe, 0xfe, 0xf4, + 0xea, 0xdb, 0x97, 0x69, 0xb3, 0xaf, 0x62, 0xf0, 0x90, 0xa1, 0x75, 0x0e, + 0xe4, 0x71, 0xa1, 0xf4, 0xb4, 0x54, 0xa2, 0xf7, 0x1f, 0x24, 0xfa, 0xc0, + 0x01, 0x06, 0x0e, 0x1d, 0x82, 0xab, 0xab, 0x6b, 0x9d, 0xf3, 0xf6, 0xec, + 0xdd, 0x9b, 0xb0, 0xf0, 0x70, 0x12, 0xe3, 0xe3, 0xeb, 0x5d, 0x66, 0xdb, + 0x76, 0xed, 0x18, 0x30, 0x78, 0xb0, 0xec, 0x48, 0x21, 0x44, 0xab, 0x93, + 0x98, 0x98, 0xc0, 0xc1, 0xfd, 0xfb, 0x2e, 0xfe, 0xe5, 0x5a, 0x51, 0x30, + 0x99, 0x9c, 0xf0, 0xf0, 0xf0, 0xa0, 0x4d, 0x60, 0x20, 0x6d, 0xdb, 0xb6, + 0x23, 0xa0, 0x4d, 0x00, 0x06, 0x43, 0xfd, 0x1f, 0x97, 0x56, 0xab, 0x95, + 0x8d, 0xeb, 0xd7, 0x91, 0x9b, 0x9b, 0x53, 0x63, 0x9a, 0x93, 0xb3, 0x0b, + 0x13, 0x27, 0x4d, 0xc6, 0xd3, 0xd3, 0xb3, 0xce, 0xd7, 0x67, 0x67, 0x67, + 0x73, 0x34, 0xe6, 0x08, 0xb1, 0xc7, 0x8e, 0x72, 0xe2, 0x44, 0x12, 0xd9, + 0xd9, 0xd9, 0xd8, 0xac, 0x56, 0x5c, 0x5d, 0x5d, 0x09, 0x0c, 0x0c, 0x22, + 0xac, 0x6b, 0x57, 0x7a, 0xf7, 0xe9, 0x4b, 0x44, 0xf7, 0x1e, 0xf5, 0x5e, + 0xef, 0x6b, 0x93, 0x9f, 0x9f, 0x4f, 0x42, 0x7c, 0x1c, 0xb1, 0xc7, 0x8e, + 0x71, 0xf2, 0xe4, 0x09, 0x32, 0x33, 0x32, 0xb0, 0x58, 0xcc, 0xb8, 0xba, + 0xba, 0xd2, 0x2e, 0x38, 0x84, 0xf0, 0xf0, 0x6e, 0xf4, 0xe9, 0xdb, 0x8f, + 0x2e, 0xa1, 0xa1, 0x18, 0x0c, 0x86, 0x06, 0x2f, 0x57, 0xd7, 0x75, 0xd2, + 0xd3, 0xd3, 0x48, 0x88, 0x8b, 0x23, 0x21, 0x21, 0x9e, 0xd3, 0xa7, 0x4f, + 0xd9, 0x6b, 0xe8, 0x98, 0xcd, 0x38, 0x39, 0x39, 0x13, 0x10, 0x10, 0x40, + 0xa7, 0x2e, 0x5d, 0x88, 0x88, 0xe8, 0x4e, 0x78, 0xb7, 0x08, 0x02, 0x02, + 0x02, 0x2e, 0xda, 0x6c, 0x2f, 0x21, 0x21, 0x9e, 0xd8, 0x63, 0x47, 0x1b, + 0x76, 0x23, 0x54, 0xb1, 0xaf, 0xbc, 0xbc, 0xbc, 0x68, 0x13, 0x18, 0x48, + 0x50, 0x50, 0x5b, 0xbc, 0xbc, 0xbc, 0x2e, 0xba, 0x8e, 0x98, 0x23, 0x87, + 0x39, 0x76, 0x34, 0xa6, 0x61, 0xcb, 0x77, 0x72, 0xc6, 0xc3, 0xc3, 0x83, + 0xa0, 0xa0, 0x20, 0xda, 0xb6, 0x6d, 0x87, 0x9f, 0xbf, 0x7f, 0xa3, 0xca, + 0x48, 0xb4, 0x26, 0xba, 0xfd, 0xfe, 0x59, 0x05, 0xcd, 0xe6, 0x8f, 0x56, + 0x3c, 0x04, 0x55, 0x31, 0xa0, 0x9a, 0xf6, 0xa2, 0x1b, 0xf3, 0x28, 0xf1, + 0x31, 0xa0, 0x5c, 0xdb, 0x15, 0xe3, 0xa0, 0xb6, 0xb8, 0x6c, 0x39, 0x83, + 0x6d, 0x45, 0x3c, 0xe6, 0x9d, 0xa7, 0xb1, 0x95, 0x98, 0xff, 0x27, 0x5b, + 0x5b, 0x19, 0xf2, 0x55, 0x06, 0x66, 0x2e, 0x2e, 0x2e, 0xf4, 0xed, 0xdb, + 0x97, 0x11, 0x23, 0x46, 0xe0, 0xe4, 0xe4, 0x44, 0x78, 0x78, 0x38, 0xbf, + 0xfc, 0xf2, 0x0b, 0xc9, 0xc9, 0xc9, 0xe8, 0xba, 0x8e, 0xc1, 0x60, 0x40, + 0x55, 0x55, 0x0c, 0x06, 0x03, 0x8a, 0xa2, 0x5c, 0x96, 0x26, 0xb6, 0x95, + 0xcb, 0xd5, 0x75, 0x1d, 0x5b, 0x03, 0x7e, 0x28, 0x37, 0x99, 0x4c, 0x6c, + 0xd9, 0xb2, 0x85, 0xae, 0x5d, 0xbb, 0x32, 0x65, 0xca, 0x14, 0x4c, 0x26, + 0x13, 0x16, 0x8b, 0x45, 0x42, 0x40, 0x71, 0xc5, 0x51, 0x00, 0x8b, 0x06, + 0x79, 0x16, 0x0d, 0xab, 0x0e, 0x2a, 0xe0, 0x69, 0x52, 0x70, 0x35, 0x28, + 0x55, 0x4f, 0x30, 0xb0, 0x98, 0x21, 0x3f, 0x15, 0x3c, 0xfd, 0x51, 0xba, + 0xf4, 0x02, 0x77, 0x2f, 0xf4, 0x82, 0x5c, 0x38, 0x11, 0x0d, 0xe5, 0xa5, + 0xe0, 0x1d, 0x04, 0xaa, 0x7c, 0x86, 0x09, 0x71, 0x25, 0x93, 0x00, 0xf0, + 0x12, 0xca, 0x48, 0x4b, 0x63, 0x47, 0x03, 0x06, 0xdb, 0xa8, 0xd4, 0x25, + 0x2c, 0x8c, 0x9b, 0x6e, 0xbb, 0x8d, 0x89, 0x53, 0xa7, 0xe2, 0xe9, 0xe5, + 0xd5, 0xa8, 0x75, 0x05, 0xb5, 0x6d, 0xc7, 0x94, 0x99, 0xed, 0x98, 0x32, + 0x73, 0x46, 0x03, 0xe6, 0x6d, 0xcb, 0xf5, 0x37, 0xdf, 0xcc, 0x7b, 0x6f, + 0xbe, 0x49, 0x7e, 0x7e, 0x7e, 0xad, 0xf3, 0x78, 0x7a, 0x7b, 0x33, 0xf7, + 0xfa, 0xeb, 0xe9, 0xd4, 0xb9, 0x8b, 0xec, 0x48, 0x21, 0xae, 0x60, 0xaa, + 0xaa, 0xe2, 0xe6, 0xe6, 0x46, 0x50, 0xdb, 0xb6, 0x04, 0x06, 0x06, 0x51, + 0x56, 0x56, 0xc6, 0xe1, 0xe8, 0x43, 0xf5, 0xde, 0xac, 0x29, 0x8a, 0x42, + 0xcf, 0x5e, 0xbd, 0xf1, 0xf3, 0xf3, 0x23, 0x23, 0x23, 0x83, 0xb4, 0xb4, + 0x54, 0x0a, 0x0b, 0x0a, 0xb1, 0xd9, 0xac, 0xcd, 0xe6, 0x7d, 0xed, 0xdc, + 0xbe, 0x9d, 0xd7, 0xfe, 0xfe, 0x0a, 0x36, 0xdb, 0xc5, 0x9b, 0x8e, 0x29, + 0x4a, 0x45, 0x39, 0xb8, 0xbb, 0xd3, 0xb6, 0x6d, 0x3b, 0x06, 0x0d, 0x1e, + 0xc2, 0xb8, 0xf1, 0x13, 0x18, 0x3a, 0x6c, 0x78, 0x9d, 0x35, 0xe6, 0x8a, + 0x8b, 0x8b, 0xf9, 0xf2, 0x8b, 0xcf, 0x38, 0x78, 0xe0, 0x40, 0x8d, 0x69, + 0x81, 0x81, 0x81, 0x44, 0x46, 0x46, 0xe2, 0x19, 0x51, 0xb3, 0xaf, 0xd6, + 0xfc, 0xfc, 0x7c, 0x56, 0xfc, 0xba, 0x8c, 0xd5, 0x2b, 0x57, 0x70, 0xe4, + 0xf0, 0x61, 0x4a, 0x4b, 0x4b, 0x6a, 0x34, 0x6f, 0x53, 0x14, 0x05, 0x55, + 0x35, 0xe0, 0xeb, 0xeb, 0xc3, 0x88, 0x91, 0xa3, 0x99, 0x35, 0x7b, 0x0e, + 0xa3, 0xc7, 0x8c, 0xbd, 0x68, 0x10, 0x95, 0x9f, 0x9f, 0xcf, 0xea, 0x95, + 0x2b, 0x88, 0x5a, 0xb3, 0x8a, 0xc3, 0x87, 0xa3, 0x29, 0x2a, 0x2c, 0x42, + 0xd3, 0x6c, 0xd5, 0x6e, 0x9e, 0x2b, 0x07, 0x6e, 0x0a, 0x69, 0xdf, 0x81, + 0xc9, 0x53, 0xa6, 0x72, 0xf5, 0x35, 0xd7, 0x12, 0x1e, 0xde, 0xed, 0xa2, + 0x65, 0x94, 0x74, 0xfc, 0x38, 0x2b, 0x57, 0x2c, 0x67, 0xe3, 0x86, 0xf5, + 0x9c, 0x48, 0x4a, 0xa2, 0xbc, 0xbc, 0xac, 0xc6, 0x31, 0x62, 0xdf, 0x6e, + 0x15, 0x57, 0x57, 0x57, 0xba, 0x45, 0x74, 0x67, 0xc2, 0xc4, 0xc9, 0xcc, + 0x98, 0x39, 0xab, 0xce, 0x2e, 0x2b, 0x74, 0x5d, 0x67, 0xc3, 0xba, 0xb5, + 0xbc, 0xf3, 0xaf, 0x7f, 0x36, 0x6a, 0xdf, 0x9a, 0x9c, 0xec, 0x21, 0x60, + 0xe7, 0xce, 0x5d, 0x18, 0x31, 0x72, 0x14, 0x93, 0xa7, 0x4c, 0xa3, 0x6b, + 0x78, 0x78, 0xad, 0xf3, 0x6a, 0x9a, 0xc6, 0xfa, 0x75, 0x6b, 0xf9, 0xe8, + 0x83, 0xf7, 0x1b, 0x18, 0x58, 0x54, 0xd6, 0xd2, 0xf7, 0x20, 0x38, 0x24, + 0x98, 0x21, 0x43, 0x86, 0x31, 0x6e, 0xc2, 0x44, 0x06, 0x0d, 0x1e, 0x82, + 0xc9, 0x64, 0x92, 0x0b, 0xc6, 0x95, 0x76, 0x07, 0xae, 0x56, 0xfc, 0xd3, + 0x01, 0x9b, 0x3f, 0x5a, 0xf1, 0x40, 0x74, 0x55, 0x45, 0xf1, 0xd9, 0x83, + 0xee, 0x92, 0x0b, 0x46, 0x05, 0x6b, 0x17, 0x0f, 0x0c, 0xed, 0x22, 0x30, + 0x0e, 0x6e, 0x8b, 0xf3, 0xda, 0x93, 0xe8, 0x6b, 0x92, 0x28, 0xdf, 0x7b, + 0xe6, 0x77, 0x6f, 0xb6, 0x9a, 0x9a, 0x9a, 0x8a, 0xc1, 0x60, 0x20, 0x32, + 0x32, 0x92, 0xb6, 0x6d, 0xdb, 0x92, 0x96, 0x96, 0xc6, 0xa2, 0x45, 0x8b, + 0x58, 0xbc, 0x78, 0x31, 0xe3, 0xc6, 0x8d, 0xe3, 0x9e, 0x7b, 0xee, 0xc1, + 0x66, 0xb3, 0x61, 0xb1, 0x58, 0x48, 0x49, 0x49, 0xe1, 0xc3, 0x0f, 0x3f, + 0xe4, 0xe4, 0xc9, 0x93, 0xd8, 0x6c, 0x36, 0x4a, 0x4a, 0x4a, 0x28, 0x2f, + 0x2f, 0xbf, 0xe4, 0xdb, 0x54, 0x5c, 0x5c, 0x4c, 0x66, 0x66, 0x26, 0x26, + 0x93, 0x89, 0x91, 0x23, 0x47, 0xb2, 0x78, 0xf1, 0x62, 0xc7, 0x34, 0x37, + 0x37, 0x37, 0x7a, 0xf4, 0xe8, 0x81, 0x97, 0x97, 0x17, 0xa7, 0x4e, 0x9d, + 0xa2, 0x47, 0x8f, 0x1e, 0x18, 0x0c, 0x06, 0x72, 0x72, 0x72, 0xd8, 0xb8, + 0x71, 0x23, 0x91, 0x91, 0x91, 0xcc, 0x9e, 0x3d, 0x1b, 0x9b, 0xcd, 0x66, + 0xef, 0x2e, 0x47, 0x42, 0x40, 0x71, 0x05, 0x31, 0xa8, 0x90, 0x59, 0xae, + 0xb1, 0xf8, 0x8c, 0x99, 0xe3, 0xa5, 0x3a, 0x9e, 0x06, 0x98, 0xdf, 0xde, + 0x89, 0x9e, 0x5e, 0x06, 0xd4, 0xca, 0x6a, 0x81, 0x39, 0xe7, 0xa0, 0xfb, + 0x50, 0x0c, 0x37, 0xfd, 0x01, 0x25, 0x34, 0x1c, 0xc5, 0xd5, 0x1d, 0x0c, + 0x06, 0xb0, 0x59, 0xd1, 0x8b, 0x8b, 0xd0, 0x92, 0x12, 0xd0, 0x97, 0x7e, + 0x8d, 0x5e, 0x56, 0x0a, 0x46, 0x27, 0xfb, 0x6b, 0x84, 0x10, 0x57, 0x1c, + 0x09, 0x00, 0x2f, 0x11, 0x5d, 0xd7, 0x39, 0x9e, 0x90, 0x40, 0x52, 0x95, + 0xbe, 0x4e, 0xea, 0xd3, 0xa1, 0x53, 0x27, 0xee, 0x7d, 0xf0, 0x41, 0xc6, + 0x4f, 0x9e, 0xfc, 0xbb, 0xd4, 0x26, 0x98, 0x32, 0x73, 0x26, 0x36, 0x9b, + 0x8d, 0x25, 0x8b, 0x17, 0x93, 0x10, 0x1f, 0x5f, 0xf1, 0x4d, 0xd6, 0xde, + 0xab, 0x60, 0x68, 0xd7, 0xae, 0xcc, 0xbf, 0xf5, 0x16, 0x66, 0xce, 0x9e, + 0x2d, 0x3b, 0x52, 0x88, 0x2b, 0x94, 0xc9, 0x64, 0x22, 0xb2, 0x67, 0x2f, + 0x46, 0x8d, 0x1e, 0x43, 0xaf, 0xde, 0x7d, 0x28, 0x2f, 0x2f, 0x27, 0xf6, + 0xd8, 0x51, 0xa2, 0x0f, 0x1d, 0xc4, 0xc9, 0xc9, 0x09, 0x83, 0xc1, 0x80, + 0x9b, 0xbb, 0xbb, 0xfd, 0x6f, 0xd5, 0x80, 0xae, 0xeb, 0x98, 0xcd, 0x66, + 0x4a, 0x4b, 0x4b, 0x30, 0x9b, 0xcd, 0xf8, 0xf9, 0xfb, 0x33, 0x76, 0xec, + 0x38, 0x22, 0x7b, 0xf6, 0x02, 0xe0, 0x70, 0xf4, 0x21, 0xb6, 0x6d, 0xdd, + 0xc2, 0xfe, 0x7d, 0xfb, 0x28, 0x29, 0x29, 0xfe, 0x9f, 0xbf, 0xbf, 0xca, + 0x1a, 0x27, 0xb6, 0x46, 0x74, 0xcf, 0x60, 0x36, 0x9b, 0xc9, 0xcb, 0xcd, + 0x25, 0x3e, 0x2e, 0x96, 0x15, 0xcb, 0x97, 0x31, 0x63, 0xe6, 0x2c, 0x6e, + 0xba, 0x75, 0x41, 0x9d, 0x01, 0x99, 0x7d, 0xf9, 0x35, 0x43, 0x4f, 0x6b, + 0x1d, 0x41, 0x68, 0x62, 0x62, 0x02, 0x9f, 0x7d, 0xf2, 0x11, 0x2b, 0x96, + 0x2f, 0x73, 0xf4, 0xb7, 0x55, 0xf7, 0xb6, 0x5b, 0xc9, 0xca, 0xca, 0x62, + 0xf9, 0xb2, 0xa5, 0xec, 0xde, 0xbd, 0x93, 0x9b, 0x6e, 0xbe, 0x95, 0xdb, + 0xee, 0xb8, 0x13, 0x37, 0x37, 0xf7, 0x5a, 0x5f, 0x73, 0x60, 0xff, 0x3e, + 0xbe, 0xf9, 0xfa, 0x4b, 0xd6, 0x45, 0xad, 0xa9, 0xb7, 0xc6, 0x8c, 0xae, + 0xeb, 0x58, 0x2c, 0x16, 0x4e, 0x9d, 0x3c, 0xc1, 0xe7, 0x9f, 0x7e, 0x4c, + 0xf4, 0xa1, 0x83, 0xdc, 0x71, 0xd7, 0x3d, 0x4c, 0x9c, 0x34, 0xb9, 0xd6, + 0xf9, 0x35, 0x4d, 0xe3, 0xa7, 0x25, 0x3f, 0xf2, 0xfd, 0xe2, 0x7f, 0x73, + 0xe4, 0x70, 0x74, 0xbd, 0xa1, 0x46, 0x65, 0x99, 0x17, 0x15, 0x15, 0x71, + 0x60, 0xff, 0x3e, 0xa2, 0x0f, 0x1d, 0x64, 0xcb, 0xe6, 0x8d, 0xdc, 0x70, + 0xd3, 0xcd, 0xcc, 0x9c, 0x35, 0xbb, 0xd6, 0x1a, 0x46, 0x9a, 0xa6, 0x61, + 0xb5, 0x36, 0x2e, 0x38, 0xb6, 0x5a, 0xad, 0x94, 0x96, 0x94, 0x90, 0x9e, + 0x96, 0xc6, 0xde, 0x3d, 0xbb, 0x89, 0x5a, 0xb3, 0x8a, 0xf9, 0x37, 0xdc, + 0xcc, 0xbc, 0xf9, 0x37, 0xd4, 0xfa, 0xf9, 0x5a, 0x59, 0x9e, 0x8d, 0x61, + 0x36, 0xe7, 0x90, 0x9b, 0x9b, 0xc3, 0xb1, 0xa3, 0x47, 0xf9, 0x75, 0xf9, + 0x2f, 0xcc, 0x9a, 0x7d, 0x35, 0x37, 0xdf, 0xba, 0x80, 0x8e, 0x1d, 0x3b, + 0xc9, 0xc5, 0xe3, 0x4a, 0xa1, 0x70, 0x3e, 0x04, 0xd4, 0x71, 0x84, 0x80, + 0x7a, 0x51, 0x7f, 0x50, 0x75, 0x74, 0xe3, 0x3e, 0x30, 0xe4, 0x82, 0x11, + 0xac, 0xde, 0x4e, 0x68, 0xbd, 0xfc, 0x31, 0x04, 0xb9, 0x62, 0x1a, 0x1c, + 0x8c, 0xd3, 0x8a, 0x44, 0xf4, 0x6d, 0x67, 0xb0, 0x1c, 0x4b, 0xfb, 0xdd, + 0x82, 0xc0, 0xb8, 0xb8, 0x38, 0x76, 0xef, 0xde, 0xcd, 0xe8, 0xd1, 0xa3, + 0x79, 0xf8, 0xe1, 0x87, 0x59, 0xba, 0x74, 0x29, 0x99, 0x99, 0x99, 0xb4, + 0x6f, 0xdf, 0x9e, 0xf1, 0xe3, 0xc7, 0x93, 0x9e, 0x9e, 0xce, 0xfe, 0xfd, + 0xfb, 0x71, 0x71, 0x71, 0xc1, 0xc3, 0xc3, 0x83, 0xb0, 0xb0, 0x30, 0xc7, + 0xf9, 0x92, 0x9d, 0x9d, 0x4d, 0x4a, 0x4a, 0x8a, 0xa3, 0x9f, 0x40, 0xa3, + 0xd1, 0xe8, 0xa8, 0x19, 0x58, 0xa3, 0x58, 0x2a, 0xa6, 0x57, 0x9d, 0x66, + 0x30, 0x18, 0x30, 0x99, 0x4c, 0x35, 0xe6, 0xb7, 0x5a, 0xad, 0x1c, 0x3d, + 0x7a, 0x94, 0x84, 0x84, 0x04, 0xee, 0xbe, 0xfb, 0x6e, 0x34, 0x4d, 0x23, + 0x3a, 0x3a, 0xda, 0x31, 0x08, 0xc8, 0x84, 0x09, 0x13, 0x38, 0x72, 0xe4, + 0x08, 0x07, 0x0f, 0x1e, 0xa4, 0x47, 0x8f, 0x1e, 0x98, 0x4c, 0x26, 0x0c, + 0x06, 0x03, 0xf1, 0xf1, 0xf1, 0x44, 0x45, 0x45, 0x31, 0x74, 0xe8, 0x50, + 0x22, 0x23, 0x23, 0xa5, 0x6b, 0x01, 0x71, 0x45, 0x5e, 0x7e, 0xac, 0x3a, + 0x1c, 0x2a, 0xd6, 0x58, 0x94, 0xab, 0xe1, 0xec, 0xa4, 0x30, 0xb3, 0xad, + 0x5e, 0x79, 0x12, 0x42, 0xf6, 0x59, 0xd4, 0xa9, 0x37, 0xa1, 0x8e, 0x9a, + 0x88, 0xd2, 0xb1, 0x33, 0x8a, 0x8b, 0x6b, 0xcd, 0xcb, 0x57, 0x60, 0x5b, + 0xf4, 0x8e, 0x5d, 0xb0, 0xfd, 0xb4, 0x08, 0xfd, 0x64, 0x9c, 0xfd, 0x22, + 0xa6, 0x34, 0xf2, 0x5c, 0xd2, 0xb5, 0x9a, 0xed, 0x8e, 0x95, 0x8a, 0xff, + 0x54, 0x3d, 0xdf, 0x75, 0xbd, 0xfe, 0xae, 0xa7, 0x14, 0xa5, 0x66, 0x00, + 0x69, 0xb3, 0xda, 0x97, 0x8f, 0x62, 0xaf, 0xa5, 0x58, 0xdf, 0x79, 0xae, + 0xd9, 0xec, 0xff, 0xc0, 0xfe, 0x1e, 0x54, 0x43, 0xcd, 0xe5, 0x55, 0xdd, + 0x06, 0x85, 0x9a, 0xef, 0xf5, 0xc2, 0x6d, 0x54, 0x2b, 0x2e, 0xf2, 0xf5, + 0x6d, 0x7b, 0x6d, 0xcb, 0xa9, 0xaf, 0x9c, 0x1a, 0x3b, 0x7f, 0x43, 0xd7, + 0x55, 0x75, 0xfe, 0xaa, 0x65, 0x59, 0xdb, 0x72, 0x6a, 0xdb, 0x57, 0x95, + 0xf3, 0x56, 0x6d, 0x16, 0x7e, 0xb1, 0x6d, 0xad, 0x6c, 0x56, 0xae, 0x69, + 0xf6, 0xf5, 0x19, 0x0c, 0xf5, 0x94, 0xa9, 0x5e, 0xb1, 0x5d, 0xea, 0x85, + 0x5f, 0xf2, 0xaa, 0x97, 0xb5, 0x90, 0x00, 0xb0, 0x25, 0xb3, 0x5a, 0xad, + 0x1c, 0xda, 0xbf, 0x1f, 0xb3, 0xd9, 0x7c, 0xd1, 0x66, 0x13, 0xee, 0x1e, + 0x1e, 0xcc, 0x9d, 0x37, 0x8f, 0xd1, 0xe3, 0xc7, 0xff, 0x6e, 0x4d, 0x89, + 0xdc, 0xdc, 0xdc, 0xb8, 0xea, 0x9a, 0x6b, 0xe8, 0xd3, 0xbf, 0x1f, 0x47, + 0x0f, 0x1f, 0x26, 0x35, 0x35, 0x15, 0x45, 0x87, 0xe0, 0xf6, 0xed, 0x89, + 0x88, 0x8c, 0x24, 0xb4, 0x6b, 0x57, 0xa9, 0xcd, 0x20, 0xc4, 0x95, 0xf8, + 0xa5, 0x52, 0x51, 0x18, 0x30, 0x70, 0x10, 0xb3, 0xae, 0x9a, 0xcd, 0xf0, + 0x11, 0xa3, 0x38, 0x71, 0x22, 0x89, 0xbd, 0x7b, 0x76, 0x93, 0x72, 0xee, + 0x2c, 0x9e, 0x9e, 0x5e, 0x8c, 0x1d, 0x37, 0x9e, 0x9b, 0x6e, 0x59, 0x80, + 0xbf, 0xbf, 0x3f, 0xde, 0xde, 0xde, 0x38, 0xbb, 0xb8, 0x38, 0x02, 0xc0, + 0xb2, 0xf2, 0x32, 0x8a, 0x0a, 0x0b, 0xc9, 0xca, 0xcc, 0xe4, 0xd4, 0xa9, + 0x93, 0xc4, 0xc5, 0xc6, 0x12, 0x13, 0x73, 0x84, 0xd0, 0xd0, 0x30, 0x46, + 0x8c, 0x1c, 0xc5, 0xdc, 0x6b, 0xae, 0x63, 0xfb, 0xb6, 0xad, 0xac, 0x58, + 0xb1, 0x9c, 0x4d, 0x1b, 0xd6, 0x37, 0x3a, 0xd8, 0x69, 0x2e, 0x74, 0x5d, + 0x27, 0x37, 0x37, 0x87, 0x7f, 0x7f, 0xf7, 0x2d, 0xc9, 0x67, 0x93, 0x79, + 0xf0, 0xa1, 0x87, 0xe9, 0xd7, 0x7f, 0xc0, 0x6f, 0x5a, 0x66, 0xf2, 0x99, + 0x33, 0xbc, 0xfb, 0xaf, 0x7f, 0xb2, 0x66, 0xf5, 0xaa, 0x46, 0xd5, 0x64, + 0xd1, 0x75, 0x9d, 0xf4, 0xb4, 0x34, 0xde, 0x7d, 0xfb, 0x2d, 0xf2, 0xf2, + 0xf2, 0x78, 0xe8, 0xe1, 0x47, 0xf0, 0xf0, 0xf0, 0xa8, 0x36, 0xcf, 0xae, + 0x9d, 0x3b, 0x78, 0xf7, 0xed, 0xb7, 0xd8, 0xb7, 0x77, 0x4f, 0xa3, 0x96, + 0xad, 0x69, 0x1a, 0x7b, 0x76, 0xef, 0x22, 0x2f, 0x2f, 0x0f, 0xa0, 0x46, + 0x08, 0xa8, 0x69, 0x1a, 0x5f, 0x7f, 0xf5, 0x05, 0x1f, 0xbe, 0xff, 0x2e, + 0x79, 0x55, 0x46, 0x01, 0x6d, 0x28, 0x9b, 0xcd, 0xc6, 0x9e, 0xdd, 0xbb, + 0x38, 0x7d, 0xfa, 0x14, 0x05, 0x05, 0x05, 0xdc, 0x78, 0xd3, 0x2d, 0x97, + 0xbc, 0x99, 0xa1, 0xa6, 0x69, 0x1c, 0x8d, 0x89, 0xe1, 0x8d, 0xd7, 0x5e, + 0xa5, 0xb8, 0xb8, 0x88, 0xdb, 0xef, 0xbc, 0xfb, 0x92, 0x7e, 0xce, 0xea, + 0xba, 0x4e, 0x66, 0x66, 0x26, 0x5f, 0x7d, 0xf1, 0x19, 0xe7, 0xce, 0x9e, + 0xe5, 0xc1, 0x3f, 0x3e, 0x4c, 0xf7, 0x1e, 0x91, 0x72, 0x21, 0xb9, 0x92, + 0xee, 0xc2, 0x2b, 0x0f, 0x59, 0x15, 0xd0, 0x00, 0x8b, 0x3f, 0x7a, 0xc1, + 0x00, 0x30, 0xd8, 0xc0, 0x27, 0x1a, 0x9c, 0x73, 0xc0, 0x66, 0x41, 0x33, + 0x18, 0xd0, 0x42, 0xdc, 0xd1, 0x83, 0x3c, 0x50, 0xdb, 0x7b, 0x60, 0x1a, + 0x1c, 0x82, 0x12, 0x75, 0x1c, 0xdb, 0xae, 0x64, 0x6c, 0xc9, 0x79, 0x97, + 0x3d, 0x08, 0x2c, 0x2f, 0x2f, 0xe7, 0xe7, 0x9f, 0x7f, 0x46, 0x55, 0x55, + 0x06, 0x0e, 0x1c, 0xc8, 0xc2, 0x85, 0x0b, 0x29, 0x2c, 0x2c, 0xc4, 0xc7, + 0xc7, 0x07, 0x57, 0x57, 0x57, 0x96, 0x2d, 0x5b, 0xc6, 0xce, 0x9d, 0x3b, + 0x19, 0x3c, 0x78, 0x30, 0x66, 0xb3, 0x99, 0x59, 0xb3, 0x66, 0x51, 0x54, + 0x54, 0x84, 0xc1, 0x60, 0x60, 0xcf, 0x9e, 0x3d, 0xac, 0x5e, 0xbd, 0x9a, + 0xe2, 0xe2, 0x62, 0xac, 0x56, 0x2b, 0xa9, 0xa9, 0xa9, 0xe4, 0xe7, 0xe7, + 0xd7, 0xfa, 0x03, 0x8a, 0xd9, 0x6c, 0xae, 0x36, 0xca, 0x2f, 0xd8, 0x6b, + 0x1f, 0x9f, 0x39, 0x73, 0xa6, 0xd6, 0xf9, 0x13, 0x13, 0x13, 0xf9, 0xfe, + 0xfb, 0xef, 0xb9, 0xf3, 0xce, 0x3b, 0x99, 0x33, 0x67, 0x0e, 0x63, 0xc6, + 0x8c, 0xc1, 0x64, 0x32, 0xe1, 0xe3, 0xe3, 0xc3, 0xc9, 0x93, 0x27, 0xf9, + 0xe1, 0x87, 0x1f, 0x48, 0x4f, 0x4f, 0x27, 0x3f, 0x3f, 0x9f, 0xf4, 0xf4, + 0x74, 0xc7, 0xe7, 0xc6, 0xbe, 0x7d, 0xfb, 0x58, 0xba, 0x74, 0x29, 0x06, + 0x83, 0x81, 0x92, 0x92, 0x12, 0xa9, 0x01, 0x28, 0xae, 0xc8, 0xcb, 0x8f, + 0xbb, 0xaa, 0x80, 0x51, 0x21, 0xd2, 0x00, 0x8e, 0x4f, 0xb6, 0x92, 0x42, + 0x94, 0x11, 0x33, 0x51, 0x27, 0x4c, 0x47, 0xed, 0x1c, 0x56, 0xf7, 0xeb, + 0xdd, 0x3d, 0x50, 0xba, 0xf5, 0x80, 0xb9, 0x37, 0x63, 0xfd, 0xfe, 0x0b, + 0x48, 0x4e, 0xb4, 0xd7, 0x04, 0x6c, 0xdc, 0x87, 0x2c, 0xe8, 0x55, 0xce, + 0x6b, 0x1d, 0xd0, 0xac, 0x60, 0x2e, 0x01, 0x5d, 0x01, 0x4f, 0xff, 0xf3, + 0xfd, 0xce, 0x6b, 0x56, 0x6a, 0x4f, 0xa3, 0x14, 0x50, 0x8d, 0xe7, 0x43, + 0x2b, 0xab, 0x19, 0x4a, 0x0a, 0xc0, 0x3b, 0x10, 0x3c, 0xbd, 0xc1, 0x62, + 0x81, 0xc2, 0x6c, 0x28, 0x2d, 0x01, 0x93, 0x2b, 0x38, 0xbb, 0x9e, 0x0f, + 0xe4, 0x34, 0x1b, 0x14, 0xe5, 0x82, 0x87, 0x2f, 0xf8, 0x06, 0xda, 0x03, + 0xa6, 0xe2, 0x3c, 0x28, 0xc8, 0xb1, 0xbf, 0x17, 0x67, 0xf7, 0xf3, 0xeb, + 0xd4, 0x6c, 0xe7, 0xb7, 0x55, 0xd3, 0xc0, 0xe8, 0x7c, 0x3e, 0x54, 0xd4, + 0x75, 0xb0, 0x59, 0xec, 0x21, 0x98, 0x52, 0x71, 0x61, 0x57, 0x2a, 0xb6, + 0x49, 0xd7, 0x2a, 0xb6, 0xbd, 0x96, 0x00, 0x4c, 0x35, 0xd8, 0xc3, 0xab, + 0x3a, 0xbf, 0xbb, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0x80, 0xe9, 0xd8, 0x5f, + 0x63, 0x34, 0xd5, 0x1f, 0x88, 0xda, 0x6c, 0x15, 0xdb, 0x52, 0xa5, 0x5c, + 0xad, 0xe5, 0xf6, 0x72, 0x35, 0xb9, 0x83, 0x5b, 0x95, 0x2e, 0x64, 0x6c, + 0x56, 0xfb, 0x7b, 0x53, 0x2a, 0xb6, 0x49, 0xa9, 0x58, 0x3e, 0x95, 0xfd, + 0x3e, 0x6a, 0xf5, 0x7d, 0xe9, 0xb7, 0x97, 0xbd, 0xae, 0xdb, 0x97, 0x53, + 0xf5, 0x6d, 0xd8, 0xac, 0x50, 0x56, 0x08, 0xaa, 0x09, 0xdc, 0x7d, 0xce, + 0x37, 0x15, 0xd7, 0x75, 0x28, 0x2b, 0xb6, 0x97, 0xa5, 0x6f, 0x10, 0xb8, + 0xba, 0x83, 0xd9, 0x0c, 0x79, 0xe9, 0x60, 0x2e, 0x07, 0x77, 0xef, 0x2a, + 0x41, 0x5f, 0xc5, 0x7e, 0x77, 0x84, 0x80, 0x95, 0xdb, 0x56, 0x79, 0xfc, + 0x54, 0x1c, 0x13, 0x8a, 0x93, 0xe4, 0x7f, 0x12, 0x00, 0xb6, 0x7c, 0x45, + 0x85, 0x85, 0x1c, 0x8b, 0x39, 0xd2, 0xa0, 0x9b, 0x99, 0xc8, 0x5e, 0xbd, + 0x19, 0x33, 0x61, 0xc2, 0x25, 0xed, 0x7c, 0xbd, 0x21, 0x9c, 0x9c, 0x9c, + 0x08, 0x8f, 0xe8, 0x4e, 0x58, 0x78, 0x37, 0xc7, 0x97, 0xb2, 0xca, 0x3e, + 0x5f, 0x2e, 0x47, 0xa8, 0x20, 0x9a, 0x47, 0x70, 0xa1, 0x69, 0x9a, 0xf4, + 0x59, 0x25, 0xea, 0xbc, 0x26, 0xdc, 0x7a, 0xdb, 0x1d, 0xcc, 0xbf, 0xf1, + 0x26, 0x72, 0x73, 0x72, 0xd8, 0xbb, 0x67, 0x37, 0x25, 0x25, 0xc5, 0x4c, + 0x98, 0x38, 0x89, 0x6e, 0xdd, 0x22, 0xf0, 0xf0, 0xf4, 0xc4, 0x68, 0x6c, + 0xf8, 0xc7, 0x84, 0xc5, 0x62, 0x21, 0x2f, 0x37, 0x97, 0x98, 0x98, 0x23, + 0x1c, 0x3c, 0x70, 0x80, 0xe4, 0xe4, 0x64, 0xfa, 0xf5, 0x1f, 0xc0, 0x88, + 0x51, 0xa3, 0xf8, 0x79, 0xc9, 0x7f, 0xf9, 0xfc, 0xd3, 0x8f, 0xc9, 0xcc, + 0xcc, 0x6c, 0xd1, 0xe7, 0xd3, 0x96, 0x4d, 0x1b, 0x71, 0x71, 0x76, 0xe1, + 0x85, 0x97, 0xfe, 0x42, 0x60, 0x50, 0x50, 0x93, 0x43, 0xaa, 0x1f, 0xfe, + 0xf3, 0xef, 0x46, 0x87, 0x7f, 0x55, 0x59, 0xad, 0x56, 0xfe, 0xf3, 0xef, + 0x45, 0x0c, 0x1d, 0x36, 0x9c, 0x71, 0xe3, 0x27, 0x38, 0xae, 0xe3, 0x29, + 0x29, 0xe7, 0xf8, 0xfc, 0xd3, 0x4f, 0x1a, 0x1d, 0xfe, 0x55, 0x95, 0x10, + 0x1f, 0xc7, 0x97, 0x9f, 0x7f, 0x4a, 0x87, 0x8e, 0x1d, 0xe9, 0xd6, 0x2d, + 0xc2, 0xf1, 0xfc, 0xf2, 0x65, 0x4b, 0xf9, 0xe4, 0xc3, 0xf7, 0x9b, 0x14, + 0xfe, 0x55, 0x95, 0x9e, 0x96, 0xc6, 0xa7, 0x1f, 0x7d, 0x40, 0x40, 0x40, + 0x00, 0x53, 0xa6, 0x4e, 0xbf, 0x2c, 0xfb, 0xaa, 0xa0, 0xa0, 0x80, 0x2f, + 0x3e, 0xff, 0x94, 0x8e, 0x1d, 0x3b, 0x31, 0x79, 0xea, 0xb4, 0xcb, 0x72, + 0x2c, 0xac, 0x8d, 0x5a, 0x8d, 0x8b, 0x8b, 0x0b, 0xcf, 0xbf, 0xf8, 0x32, + 0xde, 0x3e, 0x3e, 0x72, 0x41, 0xb9, 0x12, 0x54, 0x6d, 0x02, 0x5c, 0xed, + 0xe2, 0xe7, 0x0f, 0xb9, 0x83, 0x40, 0xd1, 0xc1, 0xfb, 0xb0, 0x3d, 0x04, + 0xd4, 0x35, 0xd0, 0x14, 0xac, 0x0a, 0xd0, 0xdd, 0x07, 0x42, 0x7d, 0x31, + 0xf4, 0x0c, 0xc0, 0xb4, 0xa1, 0x2d, 0x86, 0x0d, 0x27, 0xb1, 0x1c, 0x4e, + 0x41, 0xcb, 0x2c, 0xbe, 0xac, 0x41, 0x56, 0x7c, 0x7c, 0x3c, 0xdf, 0x7e, + 0xfb, 0x2d, 0x67, 0xcf, 0x9e, 0xa5, 0x5f, 0xbf, 0x7e, 0xb8, 0xb8, 0xb8, + 0x70, 0xf6, 0xec, 0x59, 0x76, 0xef, 0xde, 0xcd, 0xc6, 0x8d, 0x1b, 0x29, + 0x28, 0x28, 0x20, 0x29, 0x29, 0x89, 0x1f, 0x7f, 0xfc, 0x11, 0x1f, 0x1f, + 0x1f, 0x14, 0x45, 0x71, 0x34, 0xbb, 0xad, 0x0c, 0xf4, 0xf2, 0xf2, 0xf2, + 0x58, 0xbe, 0x7c, 0x39, 0x99, 0x99, 0x99, 0x35, 0x9a, 0x05, 0xdb, 0x6c, + 0x36, 0x92, 0x93, 0x93, 0xf9, 0xf1, 0xc7, 0x1f, 0x49, 0x4b, 0x4b, 0x73, + 0x7c, 0x0e, 0x44, 0x47, 0x47, 0x53, 0x5c, 0x5c, 0x4c, 0x76, 0x76, 0x76, + 0x8d, 0xf7, 0x57, 0x5a, 0x5a, 0xca, 0xfa, 0xf5, 0xeb, 0x29, 0x2e, 0x2e, + 0x66, 0xf4, 0xe8, 0xd1, 0x74, 0xe8, 0xd0, 0x01, 0xb3, 0xd9, 0xcc, 0xb6, + 0x6d, 0xdb, 0xd8, 0xb4, 0x69, 0x13, 0x87, 0x0f, 0x1f, 0x46, 0x55, 0x55, + 0x0e, 0x1d, 0x3a, 0x44, 0x6a, 0x6a, 0xaa, 0x63, 0xb9, 0xd9, 0xd9, 0xd9, + 0xfc, 0xf4, 0xd3, 0x4f, 0xa4, 0xa4, 0xa4, 0x10, 0x17, 0x17, 0xd7, 0x62, + 0x7f, 0x50, 0x12, 0xe2, 0x92, 0xdf, 0x73, 0x99, 0x4c, 0x18, 0x26, 0xce, + 0x44, 0xed, 0xd8, 0xb9, 0x61, 0x97, 0xb1, 0x88, 0x48, 0xd4, 0x61, 0xe3, + 0xd0, 0x0a, 0xf3, 0x20, 0x2f, 0xb3, 0x61, 0x21, 0x60, 0xc5, 0x60, 0x22, + 0xea, 0xe4, 0x6b, 0x51, 0xda, 0x85, 0xd8, 0xef, 0xf3, 0x14, 0x05, 0x1d, + 0x05, 0xac, 0x56, 0xf4, 0xa2, 0x7c, 0xf4, 0xe4, 0xd3, 0xe8, 0xfb, 0x36, + 0x82, 0x6a, 0x40, 0xe9, 0x31, 0x08, 0xb5, 0x77, 0x7f, 0xa8, 0xa8, 0x89, + 0xe8, 0xb8, 0x2f, 0x54, 0x55, 0xf4, 0xd2, 0x12, 0xb4, 0x98, 0x03, 0xe8, + 0xd1, 0xbb, 0xec, 0x81, 0x94, 0xa7, 0x2f, 0xea, 0xb4, 0xeb, 0x51, 0x3a, + 0x86, 0xa2, 0xb8, 0xba, 0x81, 0xa6, 0xa1, 0x17, 0x15, 0xa2, 0x9f, 0x4a, + 0x44, 0x8b, 0xde, 0x0d, 0x19, 0x67, 0xc1, 0xc5, 0xdd, 0x1e, 0x6e, 0x19, + 0x0c, 0xa8, 0xd3, 0x6f, 0x42, 0x09, 0x8d, 0x40, 0xf1, 0xf4, 0xb2, 0x2f, + 0xaf, 0xac, 0x04, 0x3d, 0xf9, 0x34, 0xda, 0xc1, 0x9d, 0x70, 0xea, 0x18, + 0xb8, 0x78, 0x80, 0xa7, 0x2f, 0x4a, 0xdf, 0x61, 0x18, 0x42, 0xc3, 0xd1, + 0x35, 0x0d, 0xdd, 0x62, 0x46, 0x5b, 0xb7, 0x0c, 0x72, 0xd2, 0x2b, 0x0a, + 0x4d, 0x45, 0x19, 0x33, 0x13, 0x35, 0xb4, 0x9b, 0xbd, 0x5f, 0xd2, 0xe2, + 0x22, 0xb4, 0x7d, 0x3b, 0xd0, 0xcf, 0x26, 0xa1, 0x0c, 0x1d, 0x8f, 0x1a, + 0xd6, 0x1d, 0x14, 0xa5, 0xfa, 0xc0, 0x96, 0x06, 0x23, 0x5a, 0x66, 0x1a, + 0xda, 0x81, 0x9d, 0x70, 0x26, 0x01, 0x4c, 0xb5, 0xdc, 0xc7, 0x9b, 0x4b, + 0x51, 0x7a, 0x0f, 0x43, 0xed, 0xd9, 0x0f, 0xc5, 0xd3, 0x0b, 0x2d, 0x3b, + 0x13, 0x3d, 0xe6, 0x20, 0x7a, 0xfc, 0x01, 0x70, 0x76, 0xab, 0xad, 0x60, + 0x41, 0xb3, 0xa2, 0xce, 0x59, 0x80, 0xea, 0x1f, 0x80, 0x6e, 0xb3, 0x0f, + 0xa2, 0xa6, 0xa3, 0xa3, 0x5b, 0xcc, 0x90, 0x97, 0x8b, 0x9e, 0x18, 0x8b, + 0x7e, 0x74, 0xb7, 0xbd, 0x0c, 0x74, 0xdd, 0x5e, 0x5e, 0xe3, 0x67, 0xa1, + 0xf8, 0xf9, 0x83, 0xd5, 0x8a, 0x16, 0x17, 0x83, 0xbe, 0xf9, 0x27, 0xe8, + 0xd2, 0x07, 0x75, 0xf0, 0x28, 0xd4, 0xc0, 0x76, 0xe8, 0x9a, 0x76, 0xbe, + 0x36, 0x5e, 0xc5, 0xbe, 0x52, 0x54, 0x15, 0x2d, 0x3f, 0x0f, 0x2d, 0x66, + 0x3f, 0x8a, 0x97, 0x2f, 0x86, 0xbe, 0x83, 0xd1, 0x2d, 0x66, 0x14, 0xd5, + 0x60, 0xaf, 0xd4, 0x6e, 0xb3, 0x40, 0x71, 0x31, 0x7a, 0xf2, 0x29, 0xf4, + 0xe8, 0x9d, 0xf6, 0x3e, 0x23, 0x55, 0x03, 0xd8, 0xca, 0x51, 0x22, 0x07, + 0xa1, 0xf4, 0x1d, 0x8a, 0x1a, 0xd4, 0x0e, 0x4c, 0x26, 0x74, 0x9b, 0x15, + 0x3d, 0x27, 0x1b, 0xfd, 0xd8, 0x21, 0xf4, 0x83, 0xdb, 0xec, 0xf3, 0x59, + 0x2d, 0x28, 0x7d, 0x47, 0xa0, 0x46, 0xf4, 0x42, 0xf1, 0xf1, 0x45, 0x4b, + 0x4f, 0x45, 0xdb, 0xb1, 0x0e, 0x72, 0x32, 0xc0, 0x60, 0x04, 0x2f, 0x1f, + 0xd4, 0xa9, 0xd7, 0xa2, 0x38, 0xbb, 0xa0, 0x6d, 0x89, 0x42, 0x4f, 0x3e, + 0x7e, 0xbe, 0x36, 0xa1, 0x90, 0x00, 0xb0, 0x25, 0xca, 0xcb, 0xcd, 0xe5, + 0xc4, 0xf1, 0xa4, 0x8b, 0xce, 0xe7, 0xe6, 0xee, 0xce, 0xe0, 0x61, 0x43, + 0xe9, 0xd8, 0xb9, 0xf3, 0xef, 0xba, 0x7d, 0x65, 0xa5, 0xa5, 0x98, 0x2d, + 0x16, 0xfb, 0x05, 0xa1, 0xb6, 0x2a, 0xd2, 0x8a, 0x82, 0x8b, 0xb3, 0x33, + 0xce, 0x2e, 0x2e, 0xf5, 0xa5, 0x7a, 0x0d, 0xbb, 0xb9, 0xb5, 0xd9, 0x28, + 0x2a, 0x2c, 0xc4, 0xc5, 0xd5, 0x15, 0x6b, 0x95, 0x5f, 0x84, 0x15, 0x45, + 0xc1, 0xc9, 0xc9, 0x09, 0x67, 0x17, 0x97, 0x66, 0x1f, 0x10, 0x5a, 0x2c, + 0x16, 0x2c, 0xe6, 0xfa, 0x3b, 0xee, 0x36, 0x18, 0x0c, 0xf5, 0x97, 0x57, + 0xe5, 0x67, 0x81, 0xd9, 0x6c, 0xff, 0xa2, 0x5a, 0x57, 0x13, 0xbc, 0x8a, + 0x20, 0xa6, 0xa9, 0x35, 0x30, 0x2b, 0xcb, 0xb2, 0xb8, 0xb8, 0x98, 0x73, + 0xc9, 0xc9, 0x1c, 0x8f, 0x8f, 0x27, 0x2e, 0x36, 0x96, 0xb4, 0x94, 0x14, + 0x8a, 0x0a, 0x8b, 0x40, 0xd7, 0x71, 0x76, 0x71, 0xc6, 0xbf, 0x4d, 0x00, + 0xdd, 0xba, 0xf7, 0xa0, 0x57, 0x9f, 0x3e, 0x74, 0x09, 0x0b, 0xc3, 0xd5, + 0xcd, 0x4d, 0x4e, 0xdc, 0x2b, 0xf9, 0x0b, 0xa3, 0xa2, 0x30, 0x71, 0xd2, + 0x64, 0xee, 0x5b, 0x78, 0x3f, 0x85, 0x85, 0x85, 0xe8, 0xba, 0xce, 0x84, + 0x49, 0x93, 0x1b, 0x34, 0x50, 0x43, 0x5d, 0x4c, 0x26, 0x13, 0x6d, 0x02, + 0x03, 0x19, 0x3f, 0x61, 0x22, 0x36, 0x9b, 0x8d, 0x94, 0x73, 0xe7, 0x28, + 0x2a, 0x2a, 0xc4, 0xc9, 0xd9, 0x99, 0xdb, 0xef, 0xbc, 0x9b, 0x82, 0x82, + 0x02, 0x3e, 0x7c, 0xff, 0xdd, 0x16, 0x5f, 0x73, 0x63, 0xdd, 0xda, 0x35, + 0xf4, 0xeb, 0xdf, 0x9f, 0xbb, 0xef, 0x5d, 0xd8, 0xb4, 0x9b, 0xf2, 0xb8, + 0x58, 0x56, 0xae, 0xfc, 0xb5, 0xce, 0x72, 0x70, 0x77, 0xf7, 0x20, 0x38, + 0x38, 0x18, 0x27, 0x67, 0x27, 0x0a, 0x0a, 0x0a, 0xc8, 0x48, 0x4f, 0xaf, + 0x71, 0xe3, 0xdd, 0xa6, 0x4d, 0x1b, 0x16, 0xdc, 0x7e, 0x27, 0x43, 0x86, + 0x0e, 0xab, 0xf6, 0x23, 0xce, 0xaf, 0xcb, 0x96, 0xb1, 0x6d, 0xeb, 0xe6, + 0xdf, 0x5c, 0xc6, 0x7b, 0xf7, 0xec, 0xe6, 0xe7, 0x25, 0xff, 0xe5, 0x89, + 0xa7, 0x9e, 0x41, 0x55, 0x55, 0x32, 0x33, 0x32, 0x58, 0xf2, 0xe3, 0x0f, + 0x64, 0x67, 0x67, 0x37, 0xe8, 0xd8, 0xba, 0xd8, 0xfa, 0xcf, 0x9d, 0x3b, + 0xc7, 0x8f, 0xdf, 0x7f, 0xcf, 0xc0, 0x41, 0x43, 0xf0, 0xf7, 0xf7, 0xbf, + 0x2c, 0xfb, 0x29, 0x33, 0x23, 0x83, 0x65, 0xbf, 0x2c, 0x65, 0xf8, 0xc8, + 0x51, 0x35, 0x6a, 0x49, 0x5e, 0xaa, 0x10, 0x70, 0xd5, 0xca, 0x5f, 0x19, + 0x30, 0x68, 0x10, 0x37, 0xdd, 0x7c, 0xab, 0x5c, 0x54, 0x5a, 0xfd, 0x45, + 0x93, 0x9a, 0x4d, 0x80, 0xab, 0xfe, 0x7e, 0x6a, 0x0e, 0x80, 0x9c, 0xc1, + 0xf6, 0x09, 0x3e, 0x87, 0xc1, 0x29, 0xc7, 0xfe, 0xb7, 0xae, 0x40, 0xb9, + 0x0d, 0xb3, 0x02, 0xf4, 0xf5, 0xc7, 0x14, 0xea, 0x8d, 0xd3, 0xb0, 0x10, + 0xd4, 0xa8, 0x13, 0x58, 0x57, 0x26, 0x60, 0x3d, 0x95, 0x83, 0x56, 0x58, + 0x5e, 0x7f, 0xed, 0x90, 0xdf, 0x20, 0x39, 0x39, 0x99, 0x6f, 0xbe, 0xf9, + 0x86, 0xef, 0xbe, 0xfb, 0x0e, 0x83, 0xc1, 0x50, 0xa3, 0x4b, 0x80, 0x98, + 0x98, 0x18, 0x62, 0x62, 0xea, 0x1e, 0x14, 0x27, 0x27, 0x27, 0x87, 0x65, + 0xcb, 0x96, 0xd5, 0x3a, 0xcd, 0x6a, 0xb5, 0x72, 0xf2, 0xe4, 0x49, 0x4e, + 0x9e, 0x3c, 0x59, 0xed, 0x3b, 0xcf, 0xc1, 0x83, 0x07, 0x39, 0x78, 0xf0, + 0x60, 0xbd, 0xe7, 0xce, 0xce, 0x9d, 0x3b, 0xd9, 0xb9, 0x73, 0xa7, 0xa3, + 0xa9, 0x70, 0xd5, 0x6e, 0x10, 0x34, 0x4d, 0x63, 0xdf, 0xbe, 0x7d, 0x35, + 0xbe, 0x97, 0xc5, 0xc7, 0xc7, 0x13, 0x7f, 0x91, 0x01, 0xed, 0x84, 0xb8, + 0xa2, 0xd8, 0xac, 0x28, 0xbd, 0x87, 0xa1, 0x74, 0x0e, 0x6d, 0xd4, 0xe0, + 0x1e, 0x6a, 0x9f, 0x01, 0xf6, 0xf0, 0x26, 0xf3, 0x5c, 0xc3, 0x03, 0x40, + 0x05, 0xd4, 0xfe, 0x83, 0x51, 0xbb, 0x46, 0xd8, 0x83, 0x1b, 0x73, 0xc5, + 0x75, 0xcb, 0x68, 0xb4, 0xe7, 0x58, 0xe9, 0xa9, 0xd8, 0x4c, 0x46, 0xf4, + 0x9d, 0xeb, 0x50, 0xba, 0x74, 0xc5, 0x30, 0x62, 0x2c, 0xb8, 0xba, 0x81, + 0xd5, 0x62, 0xaf, 0x5d, 0x06, 0xa0, 0x1a, 0xd0, 0x0b, 0x0b, 0xd0, 0xf3, + 0xb2, 0xd1, 0x0f, 0x6c, 0x81, 0xc0, 0x0e, 0x18, 0x66, 0xce, 0xc7, 0x30, + 0x60, 0x30, 0x78, 0x78, 0x55, 0xd4, 0x82, 0xab, 0x18, 0xc0, 0xa8, 0x47, + 0x4f, 0x68, 0x13, 0x84, 0xb6, 0x7a, 0x09, 0xe4, 0x67, 0x83, 0x87, 0x2f, + 0xea, 0xe4, 0xab, 0x31, 0x0c, 0x1d, 0x89, 0x12, 0x10, 0x68, 0xdf, 0x06, + 0x4d, 0x03, 0xa3, 0x11, 0xbd, 0x47, 0x6f, 0x94, 0x76, 0xed, 0xd1, 0x36, + 0xaf, 0x46, 0xdf, 0xb7, 0x0e, 0xda, 0x76, 0x42, 0xed, 0xdd, 0x1f, 0xb5, + 0xdf, 0xa0, 0xca, 0x9b, 0x53, 0x2c, 0xc7, 0x63, 0xd1, 0xf3, 0xb2, 0xa0, + 0xbc, 0x14, 0xa5, 0x5d, 0x27, 0x0c, 0x83, 0x47, 0xa0, 0x76, 0xb7, 0x77, + 0x5b, 0xa3, 0x17, 0x16, 0xa0, 0xa5, 0x9d, 0x83, 0x94, 0x53, 0xa8, 0x91, + 0x7d, 0x31, 0x0c, 0x19, 0x61, 0xbf, 0xe0, 0x9b, 0xcb, 0xcf, 0xd7, 0xa8, + 0x33, 0x3a, 0xc1, 0x99, 0x93, 0xe8, 0xa7, 0x8e, 0xa3, 0x9f, 0x88, 0xa9, + 0x3d, 0x00, 0x2c, 0x2f, 0x46, 0x1d, 0x32, 0x1a, 0xc3, 0xa0, 0x21, 0xe0, + 0xe4, 0x82, 0x52, 0x52, 0x8c, 0xcd, 0x60, 0x40, 0xdf, 0xfd, 0x2b, 0x04, + 0x85, 0x53, 0xe3, 0xd7, 0x23, 0x1d, 0xb0, 0x5a, 0x30, 0x0c, 0x1e, 0x8e, + 0x12, 0xd4, 0xce, 0x5e, 0x13, 0xd0, 0x62, 0xb6, 0x7f, 0xd6, 0x18, 0x8c, + 0xf6, 0x80, 0xaf, 0x5b, 0x24, 0x36, 0x05, 0xf4, 0xa4, 0xa3, 0x50, 0x5e, + 0x82, 0x32, 0x68, 0x2c, 0x86, 0x51, 0xe3, 0x51, 0x7c, 0x2a, 0x06, 0x0e, + 0xf5, 0xf0, 0xc4, 0xb6, 0x73, 0x15, 0x8a, 0xb7, 0x1f, 0x6a, 0x9f, 0x81, + 0xa8, 0x9d, 0x43, 0xed, 0xe5, 0x62, 0x30, 0xe0, 0xa8, 0x66, 0x67, 0xb3, + 0x81, 0x41, 0x45, 0xc9, 0x48, 0x47, 0xcf, 0xcd, 0x42, 0x69, 0xd7, 0x01, + 0x75, 0xe8, 0xc8, 0x8a, 0xda, 0x7d, 0xa5, 0xf6, 0x0d, 0x51, 0x0d, 0x60, + 0x30, 0xa2, 0x67, 0xa4, 0x63, 0xf3, 0xf4, 0x44, 0xdb, 0xb3, 0x19, 0xb2, + 0x53, 0x50, 0x86, 0x4f, 0xc5, 0x30, 0x76, 0x2a, 0x6a, 0x78, 0x84, 0xbd, + 0x36, 0x9f, 0xc5, 0x62, 0xdf, 0xe7, 0x8a, 0x82, 0xd6, 0x25, 0x0c, 0x9b, + 0xa7, 0x37, 0xfa, 0xee, 0x4d, 0x90, 0x97, 0x8e, 0x12, 0xda, 0x0d, 0x75, + 0xf8, 0x68, 0x14, 0x2f, 0x1f, 0x94, 0x82, 0x7c, 0xd0, 0x34, 0xb4, 0xff, + 0xbc, 0x03, 0xbe, 0xed, 0xc0, 0xd3, 0x1b, 0xe3, 0xc8, 0x71, 0xe0, 0xec, + 0x82, 0x9e, 0x14, 0x87, 0x7e, 0x36, 0xe9, 0x7c, 0x40, 0x29, 0x24, 0x00, + 0x6c, 0x89, 0x4e, 0x9f, 0x3c, 0x49, 0x41, 0x41, 0x01, 0xea, 0x45, 0x0e, + 0x62, 0x7f, 0x3f, 0x3f, 0xfa, 0x0e, 0x18, 0xf0, 0xbb, 0x06, 0x60, 0x45, + 0x85, 0x85, 0xbc, 0xf3, 0xfa, 0xeb, 0x24, 0xc4, 0xc7, 0x63, 0x30, 0x18, + 0x6a, 0xbd, 0x31, 0x53, 0x55, 0x95, 0x88, 0xc8, 0x48, 0x1e, 0x7a, 0xec, + 0x31, 0x5c, 0x2a, 0x42, 0x2d, 0xcd, 0x66, 0xa3, 0xdc, 0x5c, 0x4e, 0x56, + 0x66, 0x16, 0x67, 0xcf, 0x9c, 0x21, 0x31, 0x3e, 0x9e, 0x8c, 0xf4, 0xb4, + 0x8b, 0xae, 0xef, 0xcc, 0xe9, 0xd3, 0xbc, 0xf0, 0xf4, 0x53, 0x98, 0x8c, + 0xa6, 0x6a, 0x4d, 0x5c, 0x14, 0x45, 0x21, 0xb2, 0x57, 0x2f, 0xee, 0x7d, + 0xf0, 0xc1, 0x46, 0x0f, 0x7a, 0xf2, 0x7b, 0x2a, 0x2b, 0x2d, 0xe5, 0xbf, + 0xff, 0xf9, 0x0f, 0x3b, 0x36, 0x6f, 0xc1, 0x58, 0x47, 0x28, 0xa7, 0x6b, + 0x1a, 0x1d, 0x3a, 0x77, 0xe2, 0x96, 0x3b, 0xef, 0x24, 0x38, 0x24, 0xa4, + 0xce, 0x65, 0x15, 0x16, 0x14, 0xf0, 0xd5, 0x27, 0x9f, 0x90, 0x18, 0x17, + 0x5f, 0xeb, 0x05, 0x4e, 0x51, 0x14, 0x4a, 0x4b, 0x4b, 0x18, 0x3a, 0x62, + 0x24, 0x0b, 0xee, 0xbe, 0xab, 0xf1, 0x21, 0xa0, 0x02, 0xa9, 0x29, 0xe7, + 0x38, 0x75, 0xf2, 0x04, 0x1b, 0xd7, 0xae, 0xe3, 0x68, 0xf4, 0x61, 0xb2, + 0xb2, 0x32, 0x2b, 0xba, 0x78, 0x50, 0x6a, 0x7c, 0xe1, 0x56, 0x00, 0x1f, + 0x3f, 0x5f, 0x06, 0x0c, 0x1e, 0xc2, 0x55, 0xd7, 0x5c, 0xc3, 0xa0, 0x21, + 0x43, 0x70, 0x69, 0xe4, 0x88, 0xa2, 0xa2, 0x75, 0x70, 0x75, 0x75, 0x63, + 0xea, 0xf4, 0x99, 0xf8, 0xf8, 0xfa, 0xe2, 0xe6, 0xee, 0x4e, 0x87, 0x8e, + 0x1d, 0x2f, 0xe9, 0xf2, 0x0d, 0x06, 0x83, 0x63, 0x99, 0x16, 0x8b, 0x05, + 0x55, 0x55, 0x99, 0x3c, 0x65, 0x1a, 0xbf, 0x2e, 0xfb, 0x85, 0x33, 0x67, + 0x4e, 0x37, 0xab, 0xb2, 0xf0, 0xf2, 0xf2, 0xaa, 0x56, 0x23, 0xdb, 0x6a, + 0xb5, 0x51, 0x52, 0x52, 0x5c, 0x67, 0x27, 0xf8, 0x9a, 0xa6, 0xb1, 0x61, + 0xfd, 0x3a, 0xae, 0xb9, 0x6e, 0x1e, 0x7e, 0x7e, 0x8d, 0x0f, 0xaf, 0x0e, + 0x47, 0x47, 0x93, 0x72, 0xee, 0x5c, 0xad, 0xd3, 0x7a, 0x44, 0xf6, 0xe4, + 0xce, 0xbb, 0xef, 0x71, 0x0c, 0x38, 0x92, 0x9f, 0x9f, 0xcf, 0xa1, 0x03, + 0x07, 0x58, 0xb3, 0x7a, 0x25, 0x9b, 0x36, 0x6e, 0x40, 0xd3, 0x34, 0xfa, + 0xf5, 0x1f, 0xc0, 0x6d, 0x77, 0xdc, 0xc5, 0xb4, 0xe9, 0x33, 0xaa, 0x85, + 0x7f, 0xe9, 0x69, 0x69, 0xac, 0x8d, 0x5a, 0x5d, 0x67, 0x3f, 0x87, 0xaa, + 0xaa, 0xd2, 0xb9, 0x4b, 0x17, 0xba, 0x76, 0xed, 0x86, 0x97, 0x97, 0x17, + 0x59, 0x59, 0x99, 0x24, 0xc4, 0xc7, 0x93, 0x9a, 0x9a, 0x52, 0xe3, 0x73, + 0xc1, 0xcb, 0xdb, 0x9b, 0x82, 0x82, 0x02, 0x72, 0x73, 0x73, 0xf1, 0xf7, + 0xf7, 0x67, 0xe7, 0xce, 0xed, 0x1c, 0xa8, 0x67, 0x14, 0x65, 0x57, 0x37, + 0x37, 0x7a, 0xf4, 0x88, 0x24, 0x34, 0x34, 0x0c, 0x37, 0x77, 0x37, 0x0a, + 0xf2, 0xf3, 0x39, 0x71, 0xe2, 0x04, 0xf1, 0x71, 0xb1, 0x75, 0x96, 0xe3, + 0x9e, 0xdd, 0x3b, 0xd9, 0xb3, 0x7b, 0x17, 0xd3, 0x67, 0xcc, 0x6c, 0xd8, + 0x31, 0xeb, 0xe6, 0x86, 0x87, 0xbb, 0x7b, 0xb5, 0x6b, 0x5a, 0x69, 0x69, + 0x19, 0x25, 0x25, 0x75, 0xd7, 0xa2, 0xda, 0xbd, 0x7b, 0x27, 0xf1, 0x71, + 0xb1, 0x0c, 0x1c, 0x74, 0xf1, 0x11, 0xee, 0x15, 0x45, 0xc1, 0xdb, 0xc7, + 0x07, 0x53, 0x95, 0x5a, 0xaf, 0x56, 0xab, 0x8d, 0xe2, 0xe2, 0xa2, 0x3a, + 0xfb, 0x68, 0xb4, 0x58, 0x2c, 0xac, 0x5d, 0xb3, 0x9a, 0x99, 0xb3, 0x66, + 0xe3, 0xed, 0xed, 0x2d, 0x17, 0x96, 0xd6, 0x4e, 0xbd, 0x20, 0x00, 0xd4, + 0x6a, 0x0b, 0x01, 0x87, 0x80, 0xae, 0x82, 0xef, 0x41, 0x70, 0xca, 0xad, + 0x7e, 0xa3, 0x57, 0x6e, 0xc5, 0xe2, 0x0c, 0xd6, 0x21, 0x81, 0x98, 0x7a, + 0xf9, 0x63, 0x1c, 0xd6, 0x1e, 0xd3, 0xca, 0xe3, 0x94, 0xaf, 0x8e, 0xc7, + 0x96, 0x52, 0x80, 0x6e, 0xb5, 0x5d, 0xb6, 0x4d, 0x6f, 0x6c, 0x1f, 0xa8, + 0xbf, 0x97, 0xaa, 0x4d, 0x87, 0x85, 0x10, 0x8d, 0x3d, 0x81, 0xca, 0x51, + 0x7a, 0x0d, 0x40, 0x69, 0x64, 0x53, 0x5e, 0xb5, 0x4d, 0x20, 0x36, 0xff, + 0x40, 0x7b, 0x48, 0xd4, 0x88, 0x10, 0xa6, 0xf2, 0xa3, 0x56, 0xcf, 0xcf, + 0x43, 0x4b, 0x8c, 0x85, 0xa2, 0x22, 0x08, 0x6a, 0x8b, 0x21, 0xa2, 0x27, + 0x6a, 0x87, 0x4e, 0x28, 0x13, 0x67, 0x60, 0xd9, 0xbd, 0xd1, 0x5e, 0x8b, + 0x0f, 0x05, 0x05, 0xd0, 0x4e, 0x9f, 0x44, 0x4f, 0x49, 0x76, 0xf4, 0x19, + 0xa7, 0x97, 0x96, 0xa0, 0x27, 0x9f, 0x02, 0x57, 0x2f, 0xd4, 0xb1, 0xd3, + 0x31, 0x8c, 0x99, 0x68, 0xff, 0x6e, 0x75, 0xfa, 0x24, 0xfa, 0xd9, 0x33, + 0x60, 0x32, 0xa1, 0x86, 0x76, 0x45, 0x09, 0x08, 0xc4, 0x30, 0x7c, 0x2c, + 0xe4, 0xe7, 0xa1, 0xad, 0xfa, 0x0f, 0x4a, 0xdf, 0x21, 0x18, 0xa7, 0xcc, + 0x04, 0x93, 0x13, 0x7a, 0x6a, 0x0a, 0xda, 0x89, 0x44, 0x28, 0x2f, 0x43, + 0xe9, 0x1c, 0x8a, 0xda, 0x29, 0x14, 0xc3, 0xd0, 0x91, 0x60, 0x50, 0xb1, + 0xc5, 0xee, 0x43, 0xd1, 0x34, 0x14, 0x9d, 0x2a, 0xe1, 0x97, 0x01, 0x25, + 0x2c, 0x02, 0xfd, 0xf8, 0x31, 0xc8, 0x49, 0x85, 0xb0, 0xe9, 0x28, 0xbe, + 0x75, 0x7c, 0x7f, 0xd3, 0x2b, 0x6e, 0xb0, 0xac, 0x56, 0x6c, 0x47, 0x0f, + 0x43, 0x71, 0xa1, 0xbd, 0xe9, 0xb0, 0xc1, 0x88, 0x9e, 0x99, 0x0e, 0x39, + 0x99, 0xf6, 0xe6, 0xc4, 0xb5, 0x15, 0x8e, 0x5f, 0x5b, 0x94, 0x4e, 0xa1, + 0xf6, 0x10, 0xd3, 0x62, 0x41, 0x71, 0x73, 0x47, 0xe9, 0xd0, 0x05, 0xfc, + 0xda, 0xdb, 0x9b, 0xd0, 0xd6, 0xd6, 0xc7, 0x9e, 0xa2, 0xd8, 0x6b, 0xfe, + 0x01, 0x7a, 0x76, 0x26, 0x5a, 0x52, 0x02, 0x58, 0xad, 0x28, 0x6d, 0xdb, + 0xa1, 0x86, 0x76, 0x43, 0xed, 0xd1, 0x0b, 0xac, 0x66, 0xac, 0x1f, 0xc5, + 0xda, 0x03, 0xc6, 0xbe, 0x03, 0x51, 0x3c, 0x3c, 0xec, 0xc1, 0x9d, 0xb3, + 0x33, 0x6a, 0xdb, 0x60, 0xb4, 0xfe, 0x63, 0xd1, 0xcf, 0x9d, 0x42, 0x3f, + 0x1e, 0x87, 0x56, 0x58, 0x60, 0x6f, 0x65, 0xdb, 0x25, 0x0c, 0xc5, 0xcb, + 0x1b, 0x4a, 0x4b, 0xd1, 0x4e, 0x25, 0x81, 0xb9, 0x1c, 0x3d, 0x3f, 0x0f, + 0x32, 0xd2, 0x20, 0xd8, 0xde, 0x7f, 0xb1, 0x5e, 0x56, 0x8a, 0x76, 0x70, + 0x0f, 0x94, 0x9b, 0x51, 0x3c, 0x3c, 0x50, 0x22, 0xfb, 0xa0, 0x04, 0x87, + 0xa0, 0x8e, 0x9f, 0x6e, 0xdf, 0x47, 0x2e, 0xae, 0xf6, 0xda, 0xa5, 0xe1, + 0xdd, 0xed, 0xcb, 0x89, 0x3b, 0x86, 0x9e, 0x9e, 0x0a, 0x5e, 0x5e, 0xa8, + 0x11, 0x3d, 0x51, 0x3b, 0x85, 0xc2, 0xf4, 0xab, 0xb1, 0x65, 0xa4, 0xa1, + 0x67, 0x9e, 0xac, 0x96, 0x6f, 0x2a, 0x5e, 0xde, 0xa8, 0x03, 0x87, 0xa1, + 0x6d, 0x5b, 0x0d, 0xf9, 0x39, 0xe7, 0x3f, 0x37, 0xcf, 0x17, 0xb2, 0x90, + 0x00, 0xb0, 0x65, 0x3b, 0x95, 0x94, 0xd4, 0xa0, 0xa6, 0xec, 0x01, 0x41, + 0x41, 0x74, 0x09, 0x0b, 0xfb, 0x5d, 0xb7, 0x2d, 0x2f, 0x37, 0x97, 0xcd, + 0x1b, 0x36, 0x90, 0x73, 0x91, 0x9a, 0x1b, 0xf9, 0xf9, 0xf9, 0xf6, 0x9a, + 0x7b, 0x2e, 0x2e, 0x14, 0x16, 0x14, 0x10, 0xb5, 0x72, 0x25, 0x3b, 0xb7, + 0x6d, 0xe7, 0xcc, 0xa9, 0x93, 0x64, 0x65, 0x66, 0x52, 0x50, 0x90, 0x5f, + 0x71, 0x29, 0xaf, 0x5f, 0x69, 0x49, 0x09, 0xc7, 0x0e, 0x1f, 0xa9, 0x33, + 0x8c, 0xbc, 0x61, 0xc1, 0x82, 0xc6, 0x07, 0x80, 0x8a, 0x82, 0xa2, 0x2a, + 0x8e, 0x9b, 0xbe, 0x86, 0xdc, 0xc8, 0x55, 0xfd, 0x7f, 0xa3, 0x02, 0xc0, + 0xb2, 0x32, 0x76, 0x6c, 0xde, 0xcc, 0xde, 0xdd, 0xbb, 0xeb, 0x9d, 0xef, + 0xf4, 0xe9, 0x93, 0x4c, 0x99, 0x31, 0xa3, 0xde, 0x00, 0x30, 0x37, 0x27, + 0x87, 0xed, 0x5b, 0xb6, 0xd4, 0x3b, 0x38, 0x8c, 0xae, 0xeb, 0x94, 0x95, + 0x95, 0x71, 0xe3, 0x6d, 0x0b, 0x1a, 0x1d, 0x00, 0xe6, 0xe5, 0xe4, 0xf2, + 0xee, 0xeb, 0x6f, 0x92, 0x95, 0x93, 0x8d, 0xb9, 0xbc, 0xdc, 0x5e, 0x41, + 0xa1, 0x8e, 0xf7, 0x5c, 0xf9, 0x7c, 0x5e, 0x6e, 0x1e, 0xeb, 0xa3, 0xa2, + 0x38, 0xb0, 0x6f, 0x2f, 0xd7, 0xce, 0xbf, 0x81, 0x79, 0x37, 0xde, 0x88, + 0x7f, 0x9b, 0x36, 0x72, 0x12, 0x5f, 0x61, 0x06, 0x0c, 0x1c, 0xc8, 0xc8, + 0x51, 0xa3, 0x01, 0x7b, 0x0d, 0xd4, 0xcb, 0xa9, 0xf2, 0xb8, 0xee, 0xde, + 0xa3, 0x07, 0x63, 0xc7, 0x4f, 0x60, 0xd1, 0x37, 0x5f, 0x35, 0x9b, 0x5a, + 0x80, 0x06, 0x83, 0x91, 0x9b, 0x6e, 0x59, 0xc0, 0x8c, 0x99, 0xb3, 0xaa, + 0xdd, 0x90, 0x9e, 0x38, 0x91, 0xc4, 0x9a, 0x55, 0x2b, 0x59, 0xbf, 0x6e, + 0x6d, 0xad, 0xdb, 0x7a, 0xfc, 0x78, 0x22, 0x67, 0x4e, 0x9f, 0x6e, 0x74, + 0x00, 0x68, 0xb3, 0xd9, 0x38, 0x7d, 0xfa, 0x54, 0xad, 0x37, 0xe2, 0x46, + 0xa3, 0x91, 0x6b, 0xaf, 0xbb, 0x9e, 0x39, 0x57, 0x5f, 0xe3, 0x78, 0xce, + 0xd7, 0xd7, 0x8f, 0xce, 0x9d, 0xbb, 0x30, 0x72, 0xf4, 0x18, 0xfe, 0xbd, + 0xe8, 0x1b, 0x52, 0x52, 0xce, 0x71, 0xf3, 0x2d, 0x0b, 0xe8, 0xd3, 0xb7, + 0x5f, 0x8d, 0xd7, 0x9f, 0x3c, 0x79, 0x82, 0xa4, 0xe3, 0xb5, 0x5f, 0x6b, + 0x8c, 0x46, 0x23, 0xb7, 0xde, 0x76, 0x07, 0xf3, 0xae, 0xbf, 0x81, 0x8e, + 0x9d, 0x3a, 0x61, 0x30, 0x18, 0x30, 0x9b, 0xcd, 0x24, 0x26, 0xc4, 0xf3, + 0xc3, 0xf7, 0xff, 0x61, 0xc9, 0x8f, 0xdf, 0x03, 0xd0, 0x25, 0x34, 0x94, + 0x91, 0xa3, 0x46, 0x33, 0x66, 0xec, 0x78, 0xfa, 0xf5, 0x1f, 0x80, 0xa7, + 0xa7, 0x27, 0x36, 0x9b, 0x8d, 0x83, 0xfb, 0xf7, 0xd7, 0x79, 0xa3, 0x1e, + 0xd6, 0xb5, 0x2b, 0x77, 0xde, 0x75, 0x0f, 0x13, 0x26, 0x4d, 0xc1, 0xc7, + 0xc7, 0x07, 0x83, 0xc1, 0x80, 0xcd, 0x66, 0x25, 0x27, 0x3b, 0x87, 0xa8, + 0x35, 0xab, 0xf8, 0xe2, 0xf3, 0x4f, 0x49, 0x3e, 0x73, 0xa6, 0xd6, 0x6b, + 0x6d, 0xf4, 0xa1, 0x83, 0x4c, 0x9d, 0x36, 0xfd, 0xa2, 0x5d, 0x51, 0x28, + 0x8a, 0xc2, 0xac, 0xab, 0xe6, 0x70, 0xf3, 0x2d, 0x0b, 0x50, 0x2b, 0x3e, + 0x0b, 0x34, 0x4d, 0x27, 0x23, 0x23, 0x9d, 0x8d, 0x1b, 0xd6, 0xf1, 0xdf, + 0x1f, 0xbe, 0xaf, 0x75, 0xfb, 0x0a, 0x0b, 0x0a, 0x89, 0x8f, 0x8f, 0x6b, + 0x50, 0x00, 0x68, 0x32, 0x99, 0xb8, 0xfb, 0x9e, 0x85, 0x8c, 0x19, 0x3b, + 0xf6, 0x7c, 0x9e, 0x63, 0x36, 0x93, 0x98, 0x98, 0xc0, 0xaa, 0x15, 0xbf, + 0xb2, 0x75, 0x4b, 0xed, 0x35, 0x2b, 0xe3, 0xe3, 0x62, 0x39, 0x9b, 0x9c, + 0x2c, 0x01, 0xe0, 0x95, 0xe0, 0xc2, 0x3e, 0x00, 0xa9, 0x25, 0x04, 0xb4, + 0x04, 0x40, 0xee, 0x60, 0xd0, 0x0d, 0xe0, 0xb7, 0x17, 0x9c, 0x73, 0xed, + 0x81, 0x60, 0x95, 0xfb, 0x1e, 0xdd, 0xaa, 0x61, 0x76, 0x52, 0xb0, 0x8c, + 0x6e, 0x87, 0xcb, 0xc0, 0xb6, 0x18, 0xc7, 0x75, 0xc6, 0xff, 0x97, 0x23, + 0x94, 0x6c, 0x3c, 0x41, 0x61, 0x46, 0xa9, 0x94, 0xb3, 0x10, 0xa2, 0x61, + 0xac, 0x66, 0x14, 0x6f, 0x6f, 0xfb, 0x30, 0xc1, 0x8d, 0xfa, 0xf2, 0x63, + 0x44, 0x71, 0xf3, 0x40, 0x37, 0x3a, 0x35, 0xb2, 0x16, 0x96, 0xfd, 0x33, + 0x50, 0xcf, 0xc9, 0x42, 0x5b, 0xf3, 0x13, 0xda, 0xaa, 0x7f, 0xa2, 0x4c, + 0xfa, 0x23, 0xea, 0x03, 0x4f, 0xa1, 0x04, 0x05, 0x83, 0x8f, 0x5f, 0xc5, + 0x35, 0xf2, 0x7c, 0xda, 0xa3, 0x1d, 0xdc, 0x83, 0xed, 0x83, 0x5b, 0x51, + 0xda, 0x0c, 0xab, 0xb8, 0x76, 0x9a, 0xc0, 0xc9, 0x0d, 0xa5, 0x53, 0x37, + 0x8c, 0xa3, 0x27, 0xd8, 0x97, 0x97, 0x72, 0x16, 0xeb, 0x57, 0xef, 0xc1, + 0x91, 0x2d, 0xe8, 0x85, 0xa7, 0x31, 0x2c, 0x7c, 0x07, 0xc3, 0xf8, 0x29, + 0x28, 0xae, 0xee, 0x28, 0x9d, 0xbb, 0x42, 0x40, 0x08, 0x86, 0x11, 0xe3, + 0xc0, 0xe4, 0x04, 0xc5, 0xc5, 0x58, 0xbf, 0x7e, 0x1f, 0x3d, 0x66, 0x07, + 0x94, 0x16, 0xa0, 0x84, 0xf5, 0x87, 0xbb, 0x1e, 0xb5, 0x37, 0x6d, 0x0e, + 0x0d, 0x47, 0x1b, 0x3f, 0x07, 0xfd, 0xc8, 0xfe, 0xf3, 0x5b, 0x9c, 0x93, + 0x89, 0x12, 0x10, 0x84, 0x1a, 0x1e, 0x89, 0xbe, 0x6b, 0x2b, 0x7a, 0x71, + 0x06, 0x6a, 0x97, 0x70, 0xf0, 0xf2, 0x86, 0xd2, 0x12, 0xf4, 0x1a, 0x61, + 0x94, 0xbd, 0xe9, 0xac, 0x6e, 0x2e, 0xc7, 0xb6, 0xfc, 0x7b, 0xf4, 0x7d, + 0xcb, 0x50, 0x5c, 0xfd, 0xed, 0xe5, 0xe4, 0xe4, 0x06, 0x6e, 0xde, 0x15, + 0xb5, 0xff, 0x2e, 0x78, 0x9d, 0xcd, 0x8a, 0xda, 0x67, 0x34, 0xaa, 0x8f, + 0x2f, 0x7a, 0x6e, 0x2e, 0x7a, 0x71, 0x21, 0x6a, 0xbb, 0x10, 0xd4, 0x36, + 0x81, 0x68, 0x43, 0x26, 0xa2, 0x6f, 0x5f, 0x05, 0x6e, 0x5e, 0xf5, 0x96, + 0xab, 0x96, 0x96, 0x82, 0xed, 0xfb, 0x4f, 0xd0, 0x63, 0x96, 0xa0, 0x8e, + 0xfe, 0x03, 0xdc, 0xfe, 0x00, 0x6a, 0xa7, 0x30, 0x94, 0xae, 0xdd, 0xed, + 0xf3, 0xf8, 0xb5, 0x43, 0xe9, 0xd8, 0x05, 0x8c, 0x26, 0x6c, 0x47, 0x0e, + 0xa2, 0x04, 0xb6, 0x45, 0x0d, 0x6c, 0x87, 0xda, 0x6b, 0x00, 0xb6, 0xad, + 0x3f, 0x63, 0x5b, 0x74, 0x12, 0x4a, 0x0b, 0xc1, 0xd9, 0x0d, 0xe3, 0x73, + 0xef, 0xda, 0x9b, 0x21, 0xe7, 0xe5, 0x60, 0x5d, 0xfc, 0x29, 0xfa, 0xfe, + 0x5f, 0x51, 0xbc, 0xdb, 0x83, 0x87, 0x2f, 0xca, 0xa0, 0x91, 0xf6, 0xd5, + 0x96, 0x94, 0x60, 0x5b, 0xf2, 0x25, 0x9c, 0x3e, 0x0a, 0x9a, 0x86, 0xf1, + 0xd9, 0x0f, 0x50, 0xfa, 0x0d, 0x42, 0x0d, 0x6a, 0x8b, 0xcd, 0xcd, 0x13, + 0x25, 0xb2, 0x2f, 0x6a, 0x87, 0x4e, 0xa0, 0xeb, 0xd8, 0x8e, 0x46, 0x63, + 0xfb, 0xfb, 0x7d, 0x60, 0x70, 0x07, 0x57, 0x2f, 0xf4, 0x69, 0xf3, 0x31, + 0xce, 0xbb, 0x15, 0x35, 0x20, 0x10, 0xad, 0xff, 0x10, 0x7b, 0x0d, 0x45, + 0xcd, 0x76, 0xbe, 0x58, 0x74, 0x1d, 0x35, 0xa0, 0x0d, 0x86, 0x19, 0xf3, + 0xb1, 0x7d, 0xf5, 0x86, 0x04, 0x7f, 0x12, 0x00, 0xb6, 0x3e, 0x29, 0x29, + 0x29, 0x0d, 0xb8, 0xd1, 0x34, 0xd0, 0xa1, 0x53, 0x27, 0x7c, 0xfd, 0xfc, + 0x7e, 0xdf, 0xef, 0xab, 0x15, 0x4d, 0x6f, 0x1b, 0x32, 0x4f, 0xe5, 0xcd, + 0x4d, 0x6a, 0x4a, 0x0a, 0xdf, 0x2f, 0x5a, 0xc4, 0xc9, 0xa4, 0xa4, 0x2a, + 0xdf, 0x7b, 0x95, 0xdf, 0xbc, 0x1d, 0x26, 0x93, 0xa9, 0x49, 0xcd, 0x5c, + 0x0a, 0xf3, 0x0b, 0xd8, 0xbc, 0x6e, 0x03, 0x01, 0x81, 0x6d, 0xb0, 0x5a, + 0xad, 0x17, 0xbd, 0x7c, 0x18, 0x0d, 0x06, 0xb2, 0x32, 0xb3, 0xc8, 0xcd, + 0xc9, 0x69, 0xd2, 0x76, 0x2a, 0xaa, 0x7a, 0xd1, 0xcf, 0xc3, 0xba, 0x46, + 0xc4, 0xbb, 0x70, 0x59, 0x0d, 0xe9, 0x43, 0x4d, 0x55, 0x9a, 0xd6, 0x0f, + 0x63, 0x49, 0x71, 0x31, 0x25, 0xc5, 0xc5, 0x8e, 0xfb, 0x92, 0xc6, 0xdc, + 0xc3, 0xe4, 0xe5, 0xe4, 0xf2, 0xed, 0xe7, 0x9f, 0x63, 0x31, 0x9b, 0x59, + 0x70, 0xcf, 0xdd, 0x78, 0x7b, 0x4b, 0x1f, 0x56, 0x57, 0x0a, 0x83, 0xc1, + 0xc0, 0xa8, 0xd1, 0x63, 0x7e, 0xf7, 0xc0, 0xc2, 0x60, 0x30, 0x30, 0x66, + 0xec, 0x58, 0x96, 0xfe, 0xf4, 0x5f, 0x0a, 0x0b, 0x0b, 0x9b, 0x4d, 0x79, + 0x04, 0x07, 0x87, 0xd4, 0x18, 0xc8, 0xa1, 0x77, 0x9f, 0xbe, 0xf4, 0xea, + 0xd5, 0x87, 0x9c, 0xec, 0x6c, 0x0e, 0x1c, 0xd8, 0x5f, 0xe3, 0x35, 0x45, + 0x85, 0x85, 0xa4, 0x9c, 0x3b, 0xd7, 0x84, 0xc1, 0x40, 0x74, 0x4a, 0x4b, + 0x4a, 0x6a, 0x9d, 0xe2, 0xe4, 0xe4, 0x5c, 0x67, 0xbf, 0x82, 0x6d, 0xda, + 0xb4, 0xe1, 0xc1, 0x3f, 0x3e, 0x4c, 0x71, 0x71, 0x09, 0x5e, 0x75, 0xfc, + 0x80, 0x92, 0x96, 0x9a, 0x4a, 0x59, 0x59, 0x59, 0xad, 0xd3, 0x46, 0x8d, + 0x1e, 0xc3, 0xc2, 0xfb, 0x1f, 0xc0, 0xd7, 0xf7, 0xfc, 0xe7, 0x8f, 0xab, + 0xab, 0x2b, 0x7d, 0xfa, 0xf6, 0xa3, 0x5d, 0x70, 0x08, 0xed, 0xda, 0xb5, + 0xc3, 0xd3, 0xd3, 0x8b, 0x31, 0x63, 0xc7, 0xd2, 0xa1, 0x63, 0xa7, 0x6a, + 0xfd, 0x86, 0x96, 0x96, 0x96, 0x92, 0x94, 0x74, 0xbc, 0xd6, 0xf0, 0xcb, + 0xd9, 0xd9, 0x99, 0xdb, 0x6e, 0xbf, 0x8b, 0x79, 0xf3, 0x6f, 0xbc, 0x60, + 0x5f, 0x1b, 0x69, 0x13, 0x18, 0xc8, 0xcd, 0xb7, 0xde, 0x86, 0xd9, 0x62, + 0xe1, 0x8d, 0x7f, 0xbc, 0x5a, 0x23, 0xa0, 0xd3, 0x75, 0x9d, 0x93, 0xff, + 0xcf, 0xde, 0x9b, 0x47, 0x57, 0x71, 0x9d, 0xf9, 0xda, 0x4f, 0x55, 0x9d, + 0xa3, 0xe9, 0x68, 0x9e, 0x07, 0x34, 0x82, 0x24, 0x40, 0x62, 0x10, 0x12, + 0x08, 0x84, 0xc0, 0x4c, 0x66, 0xb0, 0xc1, 0x60, 0xe3, 0x09, 0xdb, 0xd8, + 0xb1, 0x13, 0x27, 0x4e, 0x3a, 0xe9, 0xbe, 0xee, 0xcc, 0xb7, 0xfb, 0xfb, + 0xd6, 0x5d, 0x7d, 0xfb, 0x7e, 0x7d, 0xd3, 0x9d, 0xd5, 0xdd, 0xe9, 0x74, + 0x3a, 0x71, 0x27, 0x76, 0x6c, 0x63, 0x3c, 0x81, 0xed, 0x78, 0x60, 0x46, + 0x20, 0x06, 0x09, 0x81, 0x64, 0x40, 0x08, 0x84, 0xd1, 0x2c, 0x34, 0xcf, + 0xd3, 0x39, 0x92, 0xce, 0x50, 0x55, 0xdf, 0x1f, 0x25, 0x1d, 0x24, 0x34, + 0x02, 0xc2, 0x60, 0xa8, 0x67, 0x2d, 0x56, 0x9c, 0xa3, 0x3a, 0x55, 0xfb, + 0xec, 0xaa, 0xda, 0xb5, 0xf7, 0xaf, 0xde, 0xf7, 0xf7, 0x56, 0x94, 0x63, + 0xed, 0xef, 0x9f, 0x94, 0x25, 0x41, 0x40, 0x40, 0x00, 0x33, 0x67, 0xcd, + 0x1a, 0x26, 0x16, 0xce, 0x4e, 0x4a, 0x62, 0x51, 0x7a, 0x3a, 0xaa, 0xaa, + 0xf2, 0xc1, 0x7b, 0xef, 0x8e, 0x68, 0xa3, 0xa2, 0xc8, 0xa3, 0x8a, 0x8f, + 0x63, 0x11, 0x15, 0x1d, 0x3d, 0xe2, 0x5a, 0x98, 0x3b, 0x6f, 0x3e, 0x89, + 0x33, 0x67, 0xd1, 0xd4, 0xd4, 0xc4, 0x95, 0xaf, 0x2e, 0x8f, 0x7c, 0x3e, + 0xf5, 0xf4, 0xd0, 0xd0, 0x50, 0x4f, 0x52, 0x72, 0xb2, 0x3e, 0xb8, 0xdc, + 0x0f, 0xe2, 0xdf, 0x68, 0x1e, 0x80, 0x23, 0x44, 0xc0, 0x00, 0xe8, 0x5c, + 0xa0, 0x7d, 0xc1, 0xff, 0x0c, 0xb8, 0x74, 0x0e, 0xd9, 0xc9, 0x90, 0x7b, + 0xc0, 0x20, 0xd2, 0xe7, 0x23, 0x11, 0xb1, 0xdc, 0x87, 0xed, 0xe1, 0x9e, + 0x84, 0x24, 0x7b, 0x70, 0x32, 0x4b, 0xe1, 0xe8, 0x79, 0x85, 0xf6, 0x4e, + 0x3d, 0x32, 0x4e, 0x47, 0x47, 0x67, 0x12, 0x28, 0xea, 0xcd, 0xe9, 0x2a, + 0xb7, 0xf2, 0x22, 0xd6, 0xc5, 0x05, 0xc2, 0x63, 0x11, 0x56, 0xfc, 0x00, + 0x21, 0x71, 0x2e, 0x82, 0x87, 0x27, 0xd8, 0xed, 0x28, 0x95, 0xa5, 0x03, + 0x95, 0x5e, 0xaf, 0x8d, 0x75, 0x42, 0x40, 0x10, 0xc2, 0x8a, 0xbf, 0x45, + 0x70, 0x37, 0x01, 0x02, 0xaa, 0xb5, 0x1f, 0xda, 0x1b, 0x11, 0xc2, 0xa3, + 0xc1, 0x53, 0x2b, 0x6e, 0x21, 0x9f, 0xcd, 0x83, 0xcb, 0x36, 0x1e, 0xbb, + 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0xce, 0x36, 0xf0, 0x9f, + 0x86, 0xe0, 0x1b, 0x86, 0x7a, 0xb1, 0x00, 0xc5, 0xcd, 0x15, 0xfc, 0x83, + 0x51, 0x2f, 0x17, 0x21, 0x04, 0x87, 0x6b, 0x05, 0x4e, 0x54, 0x15, 0xa5, + 0xb4, 0x18, 0xb5, 0xb1, 0x06, 0x3c, 0x7c, 0xc1, 0x3b, 0x08, 0xf5, 0x62, + 0x16, 0xca, 0xd5, 0x47, 0x11, 0x62, 0xe2, 0x10, 0x7c, 0xfc, 0x10, 0x13, + 0x92, 0x91, 0x4f, 0x67, 0x5f, 0x2b, 0x76, 0xdb, 0xdc, 0x88, 0x60, 0xf2, + 0xd4, 0x44, 0x2d, 0x6f, 0x5f, 0xf0, 0x8d, 0x80, 0xe0, 0x50, 0xb0, 0xdb, + 0x50, 0xbb, 0xbb, 0x10, 0xfc, 0xfc, 0x47, 0xef, 0x3e, 0x51, 0x42, 0x88, + 0x8d, 0x07, 0xe3, 0x56, 0x04, 0x83, 0x51, 0x8b, 0x5e, 0xec, 0xe9, 0x82, + 0xb6, 0x06, 0x70, 0x38, 0x46, 0x2e, 0x12, 0x1d, 0x56, 0xc4, 0xb4, 0xa5, + 0xe0, 0xe1, 0x81, 0x5a, 0x59, 0x86, 0x52, 0x51, 0x02, 0x2e, 0x2e, 0x88, + 0x21, 0x61, 0x88, 0x33, 0xe7, 0x20, 0x1f, 0x7a, 0x6f, 0x1c, 0x01, 0xd0, + 0x39, 0x79, 0x02, 0xdf, 0x20, 0x84, 0xe8, 0x35, 0x5a, 0xe1, 0x0f, 0xab, + 0xed, 0xda, 0x93, 0x43, 0x55, 0x11, 0x52, 0x32, 0x11, 0x7c, 0x7c, 0x35, + 0xdf, 0xc3, 0x73, 0x67, 0x10, 0xe6, 0x2f, 0x82, 0x88, 0x28, 0x84, 0x88, + 0x69, 0x10, 0x1c, 0xa3, 0xb5, 0xcb, 0xd5, 0xa4, 0x09, 0x94, 0x03, 0x2f, + 0x4b, 0x05, 0x51, 0xd0, 0xfa, 0x3e, 0x60, 0x3a, 0xb8, 0x7b, 0x0e, 0xa4, + 0x06, 0xab, 0x83, 0x0b, 0x50, 0x04, 0xff, 0x10, 0x54, 0x79, 0xa0, 0x48, + 0x8a, 0x64, 0xd0, 0xce, 0x11, 0x2a, 0xb8, 0xb9, 0x22, 0x4c, 0x8b, 0x06, + 0x37, 0x77, 0xd4, 0xa6, 0x06, 0xd4, 0xa2, 0x02, 0xf0, 0x08, 0x02, 0x93, + 0x1f, 0x28, 0x32, 0xca, 0xf1, 0x7d, 0xa8, 0x6b, 0x1f, 0x41, 0xf0, 0x0f, + 0x40, 0x8c, 0x9f, 0x89, 0x12, 0x12, 0xa9, 0x9d, 0x7b, 0x51, 0x44, 0xed, + 0xee, 0x42, 0xed, 0xe9, 0x42, 0x0c, 0x9b, 0x86, 0x98, 0xb2, 0x10, 0xf9, + 0x48, 0xe2, 0xc4, 0x15, 0x8a, 0x75, 0x74, 0x01, 0xf0, 0x9b, 0x46, 0x53, + 0x63, 0xc3, 0x84, 0x62, 0x90, 0x28, 0x49, 0x84, 0x85, 0x87, 0x4f, 0x6e, + 0x2c, 0xbf, 0xc9, 0xea, 0x70, 0x53, 0x55, 0xd0, 0x43, 0x51, 0x94, 0xe1, + 0xc6, 0xa7, 0x77, 0x98, 0xc6, 0xba, 0x3a, 0x7e, 0xf5, 0xbf, 0xff, 0xe1, + 0xe6, 0xe6, 0xec, 0xba, 0xb7, 0xc0, 0x98, 0xd8, 0x6c, 0x36, 0x3e, 0xf9, + 0xf0, 0x43, 0x22, 0x63, 0x62, 0xd8, 0xf4, 0xe8, 0xa3, 0x7a, 0xb1, 0x90, + 0xfb, 0x84, 0xd0, 0xd0, 0x50, 0x96, 0x64, 0x2c, 0xbd, 0x23, 0xc7, 0x9e, + 0x37, 0x2f, 0x85, 0xd9, 0x49, 0xc9, 0x9c, 0xce, 0x3b, 0x75, 0xd7, 0xf7, + 0x53, 0x4c, 0x6c, 0x2c, 0xb3, 0x92, 0x92, 0x47, 0x15, 0x00, 0x55, 0x55, + 0xbd, 0x29, 0x11, 0x53, 0x10, 0x44, 0x4c, 0x9e, 0xa6, 0x51, 0xff, 0xd6, + 0xd7, 0xd7, 0xcb, 0x81, 0xfd, 0x7b, 0x99, 0x31, 0x23, 0x9e, 0xe9, 0x33, + 0x66, 0x8c, 0x18, 0xbb, 0x24, 0xc9, 0x30, 0xa6, 0xf8, 0xa7, 0x09, 0x51, + 0xdd, 0xa3, 0xce, 0xe7, 0x45, 0x51, 0x24, 0x21, 0x31, 0x71, 0x98, 0xf8, + 0x37, 0x94, 0xa0, 0xa0, 0x20, 0x5e, 0xfe, 0xde, 0xf7, 0xc7, 0x7c, 0x51, + 0xe4, 0xb0, 0xdb, 0xe9, 0xeb, 0x1b, 0x3d, 0x2a, 0xc9, 0xd7, 0xcf, 0x8f, + 0xd4, 0x85, 0xe3, 0x47, 0xd7, 0xa5, 0xa6, 0xa6, 0xe1, 0xe5, 0xe5, 0x4d, + 0x7b, 0xfb, 0xc8, 0x28, 0xf4, 0xee, 0xee, 0x6e, 0xe4, 0x5b, 0xac, 0x86, + 0xea, 0xe1, 0x61, 0x62, 0xf9, 0xf2, 0x15, 0x7c, 0xfa, 0x97, 0x4f, 0x46, + 0x88, 0xab, 0xaa, 0xaa, 0x6a, 0xc7, 0x90, 0x1d, 0x48, 0xd2, 0xcd, 0x4f, + 0x79, 0x66, 0xcd, 0x9a, 0xc5, 0xac, 0xd9, 0xb3, 0x47, 0x15, 0x00, 0xe5, + 0x01, 0xdf, 0x5b, 0x9d, 0xfb, 0x00, 0x61, 0xc8, 0xbf, 0xeb, 0x3d, 0x00, + 0x47, 0x15, 0x01, 0x53, 0xb4, 0x0d, 0xfd, 0x0b, 0x06, 0xd2, 0x81, 0xd5, + 0x21, 0x0b, 0x63, 0xed, 0x7f, 0xc3, 0xac, 0x1d, 0x3c, 0x6d, 0x2f, 0xe1, + 0x19, 0xdf, 0x2a, 0xa2, 0x96, 0x75, 0x93, 0x19, 0x23, 0x92, 0x7e, 0xce, + 0xc8, 0xfe, 0x1c, 0x89, 0x33, 0x45, 0x0e, 0xcc, 0xbd, 0x53, 0x5b, 0xec, + 0x22, 0x30, 0x30, 0x90, 0xa8, 0xa8, 0xa8, 0x01, 0xd1, 0xdf, 0x0b, 0x45, + 0x51, 0x68, 0x6f, 0x6f, 0xa7, 0xbe, 0xbe, 0x9e, 0xca, 0xca, 0xca, 0x31, + 0xef, 0xf5, 0xbb, 0x15, 0xa3, 0xd1, 0x88, 0xbb, 0xbb, 0x3b, 0x0e, 0x87, + 0x83, 0xfe, 0xfe, 0xfe, 0x29, 0xa9, 0xae, 0xec, 0xe2, 0xe2, 0x32, 0xec, + 0xa5, 0xf8, 0xd0, 0xf9, 0xa4, 0xcd, 0x66, 0x1b, 0xd5, 0x12, 0xc0, 0xcd, + 0xcd, 0x0d, 0xa3, 0xd1, 0x88, 0x2c, 0xcb, 0x38, 0x1c, 0x8e, 0x31, 0x6d, + 0x03, 0x74, 0x74, 0xa6, 0x14, 0x17, 0x37, 0xd4, 0xd6, 0x66, 0x54, 0xd9, + 0x81, 0xc0, 0xe4, 0xb3, 0x39, 0x54, 0x6b, 0xbf, 0x26, 0x66, 0xd9, 0xad, + 0xe0, 0x72, 0xe3, 0x56, 0x40, 0x62, 0x68, 0x38, 0xc2, 0xd6, 0x67, 0xb4, + 0x21, 0xcd, 0xd3, 0x53, 0x2b, 0x90, 0x71, 0xa5, 0x18, 0x79, 0xe7, 0x6b, + 0xd7, 0x0a, 0x3b, 0x0c, 0x6a, 0x4c, 0x19, 0x0f, 0x20, 0x2e, 0xcc, 0x70, + 0x0a, 0x5c, 0x6a, 0x6b, 0x33, 0xf2, 0xa7, 0x1f, 0x42, 0x70, 0xb8, 0x96, + 0x12, 0xab, 0xaa, 0xa8, 0x8d, 0xb5, 0x5a, 0xf5, 0xdc, 0xc1, 0x54, 0xdb, + 0xda, 0x0a, 0xe4, 0x8a, 0x62, 0x6d, 0x5f, 0xb2, 0x0d, 0x61, 0xe9, 0x46, + 0x70, 0x75, 0xd3, 0x84, 0xa7, 0x86, 0xba, 0x81, 0x63, 0x68, 0xdf, 0xc5, + 0x7b, 0x9a, 0x26, 0x1e, 0x5a, 0x2c, 0xe0, 0x1f, 0x00, 0x1e, 0xee, 0x30, + 0x98, 0x51, 0xa5, 0xaa, 0xa8, 0xbd, 0xbd, 0x28, 0x4d, 0x4d, 0x88, 0xb1, + 0xd3, 0x11, 0xc2, 0x22, 0x60, 0xf6, 0x22, 0x4d, 0xf4, 0x33, 0x9b, 0xa1, + 0xb5, 0x19, 0xc1, 0x3f, 0x70, 0x60, 0x00, 0xbf, 0x6e, 0xb8, 0x77, 0x75, + 0xc5, 0xf0, 0xf8, 0x73, 0x20, 0x0f, 0x7a, 0x00, 0x1a, 0x51, 0x8a, 0x8b, + 0x90, 0x3f, 0x7c, 0x1d, 0xda, 0x1a, 0x87, 0x57, 0xb7, 0x05, 0xf0, 0xf0, + 0x44, 0x88, 0x99, 0xae, 0x79, 0xe3, 0xd5, 0xd5, 0xa0, 0x1c, 0xfe, 0x08, + 0x21, 0x32, 0x46, 0x13, 0xe8, 0xa6, 0x45, 0x41, 0x48, 0xac, 0xe6, 0x9f, + 0x37, 0xce, 0xfa, 0x5a, 0xf0, 0xf2, 0x46, 0x98, 0xbb, 0x08, 0x12, 0xe7, + 0x21, 0xc6, 0x27, 0x22, 0xc4, 0x27, 0x82, 0x2c, 0x3b, 0x85, 0x55, 0x29, + 0x75, 0xb1, 0x56, 0x44, 0xa3, 0xe4, 0x32, 0x4a, 0x75, 0x39, 0x42, 0xd8, + 0x34, 0xb0, 0xdb, 0x10, 0xfc, 0x83, 0x10, 0xe6, 0x2d, 0x41, 0x3d, 0x75, + 0x58, 0x8b, 0x92, 0x1c, 0xf5, 0xe1, 0x35, 0x0a, 0xae, 0x6e, 0x88, 0xcb, + 0xd6, 0xa2, 0xda, 0xac, 0x5a, 0x94, 0x64, 0xf2, 0x7c, 0x90, 0x24, 0x94, + 0x92, 0x62, 0x30, 0x77, 0x23, 0x78, 0x6a, 0x73, 0x4e, 0xd5, 0x62, 0x41, + 0xad, 0xbb, 0x0a, 0x46, 0x8f, 0xc1, 0xc1, 0x10, 0x0c, 0x46, 0x2d, 0xba, + 0xd2, 0xcf, 0x5f, 0xab, 0x30, 0xed, 0xe6, 0x8e, 0xb3, 0xfa, 0xb1, 0xcd, + 0x86, 0x5a, 0x5b, 0x8d, 0xea, 0x70, 0x20, 0x4c, 0x8b, 0x46, 0xda, 0xb2, + 0x1d, 0xf9, 0x2f, 0xef, 0xe8, 0xf7, 0xeb, 0x5d, 0x82, 0x2e, 0x00, 0x4e, + 0x11, 0x1d, 0xad, 0x13, 0x1b, 0xa3, 0x1b, 0x0c, 0x06, 0x82, 0x26, 0xa8, + 0x1a, 0xd9, 0xde, 0xd6, 0xc6, 0xe1, 0x03, 0xfb, 0xb1, 0x98, 0x2d, 0xda, + 0xe2, 0xef, 0x46, 0xde, 0xce, 0x08, 0x02, 0xde, 0xde, 0xde, 0x2c, 0x5d, + 0xbe, 0x9c, 0x90, 0xb0, 0xb0, 0x29, 0x99, 0xe7, 0xde, 0x3d, 0x93, 0x6e, + 0x41, 0xaf, 0x16, 0x7e, 0x9b, 0xe8, 0xe9, 0xe9, 0xe1, 0xb3, 0x8f, 0x3e, + 0x62, 0x41, 0x5a, 0xda, 0xd7, 0x5e, 0x9c, 0x46, 0xe7, 0xce, 0x90, 0xb6, + 0x30, 0x9d, 0xe9, 0x33, 0xe2, 0xef, 0xc8, 0xb1, 0x7d, 0x7c, 0x7d, 0x59, + 0x92, 0xb1, 0x94, 0xfc, 0x33, 0xa7, 0xa7, 0x64, 0xa1, 0x76, 0x7b, 0x87, + 0x1d, 0x01, 0x2f, 0x2f, 0xaf, 0xd1, 0x27, 0xcf, 0xaa, 0x8a, 0xdd, 0x7e, + 0xe3, 0x0b, 0x3c, 0x51, 0x14, 0x89, 0x8e, 0x8e, 0x41, 0x92, 0x0c, 0xc8, + 0xb2, 0x63, 0xc4, 0x3e, 0xf7, 0x7e, 0xf1, 0x39, 0x35, 0x57, 0xaf, 0xb2, + 0x6c, 0xf9, 0x03, 0x2c, 0x4a, 0x5f, 0x4c, 0x74, 0x4c, 0x0c, 0x7e, 0x7e, + 0xfe, 0xb8, 0x4f, 0xc2, 0xab, 0x53, 0x96, 0x15, 0xc6, 0x7a, 0xbd, 0xea, + 0xea, 0xea, 0x36, 0xe1, 0x82, 0x77, 0xcc, 0x85, 0x02, 0xea, 0x98, 0xde, + 0x61, 0x92, 0x28, 0x0d, 0xf3, 0xcc, 0x1b, 0xfd, 0xd9, 0x67, 0x74, 0xa6, + 0xed, 0x5e, 0xcf, 0x54, 0x5d, 0x03, 0x5e, 0xde, 0xde, 0x18, 0xc6, 0x78, + 0x81, 0xa1, 0x1d, 0xfb, 0x56, 0x23, 0xd8, 0x45, 0x3c, 0x3d, 0xbd, 0xc6, + 0xfc, 0xbb, 0xdd, 0xa1, 0x47, 0x6b, 0xdd, 0x17, 0x5c, 0x9f, 0x02, 0x7c, + 0xbd, 0xe8, 0x37, 0x56, 0x24, 0xa0, 0x20, 0x83, 0xdf, 0x79, 0x4d, 0x04, + 0x14, 0x14, 0x2d, 0x3d, 0x18, 0x08, 0xb5, 0xf5, 0xf0, 0x4c, 0x47, 0x31, + 0xcf, 0x77, 0x5d, 0x22, 0xc9, 0xd1, 0x8a, 0xe8, 0x09, 0x69, 0x49, 0x22, + 0xd1, 0x11, 0x2a, 0x0b, 0x66, 0x49, 0xec, 0x3d, 0xe9, 0x42, 0x76, 0x81, + 0xc8, 0xa5, 0x32, 0x07, 0x56, 0xeb, 0xad, 0xdd, 0x2b, 0xd3, 0xa6, 0x4d, + 0x63, 0xfe, 0xfc, 0xf9, 0x2c, 0x5f, 0xbe, 0x9c, 0xc4, 0xc4, 0x44, 0x42, + 0x43, 0x43, 0xf1, 0xf4, 0xf4, 0x44, 0x51, 0x14, 0xba, 0xba, 0xba, 0xa8, + 0xad, 0xad, 0xa5, 0xa0, 0xa0, 0x80, 0x9c, 0x9c, 0x1c, 0x8a, 0x8a, 0x8a, + 0x30, 0x9b, 0xcd, 0x77, 0xff, 0xe9, 0x10, 0x04, 0xd2, 0xd3, 0xd3, 0x59, + 0xb5, 0x6a, 0x15, 0x56, 0xab, 0x95, 0xfd, 0xfb, 0xf7, 0x53, 0x54, 0x54, + 0x74, 0x4b, 0xe3, 0x4a, 0x50, 0x50, 0x10, 0xab, 0x56, 0xad, 0x22, 0x25, + 0x25, 0x05, 0xbb, 0xdd, 0x3e, 0xec, 0x45, 0x8c, 0x20, 0x08, 0xf4, 0xf4, + 0xf4, 0x50, 0x59, 0x59, 0xc9, 0x85, 0x0b, 0x17, 0x28, 0x2d, 0x2d, 0x75, + 0x56, 0x23, 0x5e, 0xb2, 0x64, 0x09, 0x19, 0x19, 0x19, 0x38, 0x1c, 0x0e, + 0x72, 0x72, 0x72, 0x38, 0x79, 0xf2, 0xa4, 0x7e, 0xbf, 0xe8, 0xdc, 0x7e, + 0x8c, 0xae, 0x28, 0x67, 0x4f, 0x21, 0x2e, 0x19, 0x28, 0xb8, 0x31, 0x49, + 0xd4, 0xa6, 0x06, 0x68, 0x69, 0xd4, 0x52, 0x36, 0x6f, 0x26, 0x50, 0xc2, + 0xe1, 0x00, 0x8b, 0x59, 0xab, 0x54, 0x2b, 0x3b, 0x10, 0x02, 0x83, 0x11, + 0x22, 0xa3, 0x10, 0xd7, 0x6c, 0x46, 0xd9, 0xfd, 0xfa, 0xf0, 0xb9, 0x48, + 0x5f, 0xaf, 0xe6, 0x15, 0x28, 0x08, 0x9a, 0xf8, 0xd5, 0xdd, 0xa5, 0x15, + 0x06, 0x19, 0x5a, 0xb4, 0x44, 0xbd, 0xae, 0x0d, 0x82, 0x78, 0x4d, 0x98, + 0xec, 0x57, 0x87, 0xef, 0x4f, 0x18, 0x75, 0xa2, 0x72, 0xdd, 0xfc, 0x67, + 0xf8, 0x46, 0x4a, 0xc9, 0x25, 0xc4, 0xa8, 0x68, 0xc4, 0x84, 0x24, 0xd4, + 0xa0, 0x10, 0x2d, 0x35, 0xb6, 0xac, 0x04, 0xb5, 0xa1, 0x4e, 0x2b, 0x04, + 0x22, 0x2b, 0xa3, 0x4d, 0xf4, 0xa0, 0xbb, 0x67, 0xa0, 0x28, 0x87, 0xa0, + 0x15, 0xbe, 0xb0, 0xf4, 0x8c, 0xde, 0x67, 0xaa, 0x8a, 0xb8, 0x7c, 0xa3, + 0x56, 0xc5, 0xb8, 0xbf, 0x1f, 0xb5, 0xae, 0x1a, 0xf5, 0xcc, 0x07, 0xa8, + 0x1b, 0xb6, 0x81, 0xa2, 0x20, 0xf8, 0xfa, 0x23, 0xcc, 0x5f, 0x82, 0x9a, + 0x7b, 0x70, 0x8c, 0x6a, 0xc0, 0x03, 0x8f, 0x95, 0xa8, 0x58, 0xc4, 0xa8, + 0xd8, 0xa1, 0x93, 0x24, 0xd4, 0xba, 0x1a, 0x1c, 0x1f, 0xfc, 0x19, 0x3c, + 0x7d, 0xb4, 0x28, 0x48, 0x41, 0xd0, 0x04, 0xba, 0x8a, 0xf3, 0x28, 0x21, + 0xe1, 0x08, 0xcd, 0x4d, 0x88, 0xa1, 0x61, 0x88, 0x73, 0x52, 0x91, 0x8f, + 0x7e, 0x02, 0xc6, 0xc9, 0x5b, 0xd3, 0x08, 0x1e, 0x26, 0xa4, 0xe5, 0x6b, + 0x86, 0xcf, 0x25, 0xaf, 0x5c, 0x42, 0xfe, 0x78, 0x27, 0xb4, 0x34, 0x0c, + 0x44, 0x0b, 0x4e, 0xe6, 0x82, 0xba, 0xee, 0x1c, 0x19, 0x0d, 0x28, 0x35, + 0xd5, 0x28, 0x65, 0x25, 0x18, 0x9f, 0xfd, 0x36, 0xd2, 0xcc, 0x24, 0xd4, + 0xe9, 0x89, 0x7a, 0xc1, 0x8f, 0xbb, 0x04, 0x5d, 0x00, 0x9c, 0x42, 0x11, + 0x65, 0x22, 0x24, 0x49, 0x22, 0x20, 0x30, 0x70, 0xdc, 0x6d, 0xca, 0xcb, + 0x4a, 0xf9, 0xfd, 0xbf, 0xff, 0x06, 0xc7, 0x80, 0x69, 0xfe, 0x8d, 0xfa, + 0x64, 0xf9, 0xf8, 0xf9, 0xe2, 0xeb, 0xe7, 0x37, 0x25, 0x02, 0xa0, 0xce, + 0xfd, 0xc3, 0x85, 0x73, 0xe7, 0xc8, 0xcb, 0xc9, 0x61, 0x5a, 0x54, 0xd4, + 0x94, 0x45, 0x91, 0xea, 0xdc, 0xa5, 0x73, 0x45, 0xa3, 0x91, 0xb4, 0x85, + 0x8b, 0x6e, 0xbb, 0xef, 0xdf, 0x78, 0x0b, 0xb6, 0xc5, 0x4b, 0x32, 0x78, + 0xeb, 0xcf, 0x6f, 0xd0, 0xd1, 0xd1, 0xfe, 0xb5, 0x1d, 0xd7, 0x60, 0x34, + 0xdc, 0x74, 0x7b, 0xa7, 0x9a, 0xa4, 0xe4, 0xb9, 0x84, 0x86, 0x85, 0x52, + 0x57, 0x5b, 0x3b, 0xca, 0x1c, 0x4a, 0xe5, 0x42, 0xe1, 0x79, 0x8a, 0x2e, + 0x14, 0xb2, 0xe3, 0xad, 0x3f, 0x13, 0x18, 0x14, 0x44, 0x6c, 0x6c, 0x1c, + 0x49, 0xc9, 0x73, 0x48, 0x59, 0x90, 0xca, 0x9c, 0xb9, 0xf3, 0xc6, 0x8d, + 0x02, 0xbc, 0x5f, 0xb9, 0x58, 0x74, 0x81, 0xde, 0xde, 0xbe, 0x51, 0xcf, + 0x9f, 0xaf, 0xaf, 0xdf, 0xb0, 0xe8, 0xe6, 0x9b, 0x8d, 0x74, 0xd6, 0xa3, + 0xc9, 0x75, 0x86, 0x45, 0xff, 0x8d, 0xe6, 0x07, 0x08, 0xa3, 0x8b, 0x80, + 0x1d, 0x69, 0x9a, 0xf0, 0xe7, 0x53, 0x04, 0x6e, 0x9a, 0x08, 0x18, 0x61, + 0x35, 0xb3, 0xb9, 0xab, 0x84, 0x17, 0xdb, 0x2f, 0x92, 0x64, 0x6f, 0xd3, + 0xbe, 0xe3, 0x00, 0x0c, 0x0a, 0x41, 0x81, 0x36, 0x56, 0x87, 0x4a, 0x24, + 0xc4, 0x1a, 0x59, 0x38, 0xd7, 0xc0, 0xa7, 0x47, 0x05, 0x72, 0xce, 0xca, + 0xd4, 0x37, 0xc9, 0xc8, 0xf2, 0x8d, 0xcd, 0x0b, 0x0d, 0x06, 0x03, 0xb3, + 0x67, 0xcf, 0x66, 0xf3, 0xe6, 0xcd, 0x6c, 0xda, 0xb4, 0x89, 0xd4, 0xd4, + 0x54, 0x44, 0x51, 0xc4, 0x66, 0xb3, 0xd1, 0xdf, 0xdf, 0x8f, 0x28, 0x8a, + 0xb8, 0xbb, 0xbb, 0x23, 0x49, 0x12, 0x6b, 0xd6, 0xac, 0x21, 0x2f, 0x2f, + 0x8f, 0x3f, 0xfd, 0xe9, 0x4f, 0x64, 0x65, 0x65, 0xdd, 0x55, 0x56, 0x0d, + 0x63, 0xcd, 0xab, 0x17, 0x2e, 0x5c, 0xc8, 0x8f, 0x7e, 0xf4, 0x23, 0x7a, + 0x7b, 0x7b, 0xa9, 0xa9, 0xa9, 0xe1, 0xd2, 0xa5, 0x4b, 0xb7, 0x24, 0x00, + 0x06, 0x07, 0x07, 0xb3, 0x79, 0xf3, 0x66, 0xb6, 0x6d, 0xdb, 0xe6, 0x8c, + 0xe2, 0x1b, 0xea, 0x2b, 0x6d, 0xb5, 0x5a, 0xa9, 0xa9, 0xa9, 0xe1, 0xf8, + 0xf1, 0xe3, 0xbc, 0xff, 0xfe, 0xfb, 0xe4, 0xe5, 0xe5, 0xd1, 0xd7, 0xd7, + 0xc7, 0xa2, 0x45, 0x8b, 0xf8, 0xe1, 0x0f, 0x7f, 0x88, 0xd5, 0x6a, 0xc5, + 0x6a, 0xb5, 0xea, 0x02, 0xa0, 0xce, 0xd7, 0x34, 0x26, 0x89, 0xa8, 0x5f, + 0x15, 0xa0, 0x94, 0x5c, 0x46, 0x9a, 0x9f, 0xa6, 0xa5, 0xe6, 0x4e, 0xa4, + 0xd5, 0x00, 0x4a, 0xde, 0x09, 0xd4, 0xda, 0xb2, 0x71, 0xc5, 0xa8, 0xf1, + 0x50, 0x9a, 0x1a, 0x91, 0xf7, 0xec, 0x42, 0x2d, 0x3e, 0x8b, 0x10, 0x3b, + 0x0b, 0x1e, 0x7e, 0x1c, 0x71, 0x56, 0x32, 0x86, 0x8c, 0x07, 0xb0, 0x9f, + 0x3c, 0xa4, 0x0d, 0x8e, 0x83, 0x05, 0x68, 0x4f, 0x1d, 0x47, 0xd9, 0xf3, + 0x3e, 0x98, 0x7c, 0xb5, 0xcf, 0x1c, 0x0e, 0xb0, 0xf7, 0x23, 0x98, 0x3c, + 0x9d, 0x29, 0xa3, 0x42, 0x58, 0x24, 0x6a, 0xf1, 0xb9, 0x81, 0xaa, 0xbb, + 0x32, 0x84, 0x44, 0x20, 0x2e, 0xc8, 0xd4, 0x84, 0xba, 0x82, 0x13, 0x5a, + 0xc1, 0x0b, 0xab, 0x15, 0x5c, 0x5c, 0x10, 0x42, 0x23, 0xae, 0xa5, 0xb1, + 0x0a, 0x02, 0x58, 0x9a, 0x34, 0x81, 0xcd, 0x64, 0xd2, 0xc4, 0xb9, 0xbe, + 0x7e, 0x4d, 0xb4, 0x1b, 0xfa, 0x9b, 0x2f, 0x17, 0xc1, 0xb2, 0xd5, 0x08, + 0xa1, 0x61, 0x08, 0xde, 0xde, 0x5a, 0xe1, 0x8d, 0xe6, 0x46, 0x4d, 0x8c, + 0x1c, 0xc3, 0x86, 0x49, 0xb5, 0xf6, 0xe3, 0xd8, 0xbd, 0x03, 0xb5, 0xbc, + 0x58, 0x4b, 0xa9, 0x15, 0x06, 0xaa, 0x02, 0xf7, 0x5b, 0x06, 0x52, 0x65, + 0x9d, 0x13, 0x37, 0xad, 0x3a, 0xef, 0xfc, 0x45, 0x9a, 0x48, 0x28, 0x49, + 0x18, 0x9f, 0xfd, 0x36, 0x3c, 0xfd, 0x2d, 0x2d, 0x1a, 0x4f, 0x14, 0xc1, + 0xe4, 0x89, 0x38, 0x6f, 0xa1, 0x26, 0xd0, 0x8d, 0xd3, 0xe7, 0x6a, 0x63, + 0x3d, 0x4a, 0x49, 0x31, 0x6a, 0x5f, 0x2f, 0xf4, 0x6a, 0x51, 0x77, 0x6a, + 0x4d, 0x05, 0x98, 0xbb, 0x10, 0x33, 0x1e, 0x74, 0x8a, 0xbc, 0x86, 0x75, + 0x8f, 0xc0, 0x9a, 0x87, 0xb4, 0x7d, 0x0f, 0x1c, 0x43, 0x88, 0x8c, 0x41, + 0x35, 0x79, 0x21, 0xdc, 0x80, 0x76, 0xa0, 0x76, 0x77, 0x22, 0x7f, 0xfe, + 0x21, 0xb8, 0x99, 0x30, 0x6c, 0x7d, 0x56, 0xfb, 0xac, 0xec, 0x0a, 0xb4, + 0xd4, 0x43, 0x4f, 0x07, 0xf4, 0x69, 0x36, 0x53, 0x98, 0x4c, 0x5a, 0xe1, + 0x90, 0xd2, 0xf3, 0xe0, 0xe2, 0xaa, 0xfd, 0x66, 0x59, 0xd6, 0x0a, 0xa9, + 0x08, 0x02, 0x6a, 0x6f, 0x2f, 0x6a, 0x7f, 0xff, 0x10, 0xbb, 0x30, 0x01, + 0x41, 0x55, 0x51, 0x2e, 0x7d, 0x89, 0x5c, 0x9c, 0x86, 0x34, 0x7b, 0x1e, + 0xe2, 0x03, 0xeb, 0xd1, 0x73, 0x80, 0xef, 0x0e, 0x74, 0x01, 0x70, 0x8a, + 0x18, 0xf4, 0x61, 0x1b, 0x0f, 0x51, 0x14, 0x31, 0x99, 0x4c, 0xe3, 0x6e, + 0x63, 0xb7, 0xd9, 0xb0, 0x98, 0xcd, 0x37, 0x6d, 0x90, 0xef, 0xe2, 0xea, + 0x3a, 0xa6, 0x07, 0xd4, 0x0d, 0xcf, 0x71, 0x6f, 0xc3, 0x62, 0x47, 0x51, + 0xd4, 0xbb, 0xc6, 0xfc, 0xff, 0x5e, 0x64, 0xb0, 0x6f, 0x45, 0x51, 0x44, + 0x51, 0x95, 0x49, 0xfb, 0x36, 0x0a, 0x82, 0x40, 0x76, 0x56, 0x16, 0x1b, + 0x36, 0x6d, 0xba, 0xab, 0x2b, 0x34, 0xeb, 0xdc, 0x3a, 0xbe, 0x7e, 0x7e, + 0xcc, 0x99, 0x3b, 0x6f, 0xc2, 0xed, 0x64, 0x59, 0xa6, 0xab, 0xab, 0x13, + 0x49, 0x32, 0x4c, 0xca, 0x2b, 0xb0, 0xab, 0xab, 0x0b, 0x45, 0x91, 0xf1, + 0xf1, 0xf1, 0x9d, 0x50, 0x44, 0x8e, 0x8b, 0x9b, 0x4e, 0x4c, 0x6c, 0xec, + 0xd7, 0x2a, 0x00, 0xce, 0x9d, 0x3b, 0x8f, 0x85, 0x8b, 0xd2, 0x39, 0x9d, + 0x77, 0xea, 0x8e, 0x8f, 0x41, 0x89, 0x33, 0x13, 0x59, 0xbb, 0x6e, 0x03, + 0x6f, 0xbe, 0xf1, 0xa7, 0x31, 0xdb, 0x32, 0x98, 0xba, 0xda, 0xdd, 0xdd, + 0x4d, 0x45, 0x79, 0x39, 0x47, 0xb2, 0x0e, 0xe3, 0xe5, 0xe5, 0xc5, 0xc2, + 0x45, 0xe9, 0x6c, 0x78, 0x78, 0x23, 0x6b, 0xd7, 0x6d, 0x70, 0x56, 0x6c, + 0xbf, 0x9f, 0xc6, 0x37, 0x45, 0x51, 0x86, 0xf5, 0x99, 0xd5, 0xda, 0xcf, + 0xf1, 0x63, 0xc7, 0xf8, 0xe4, 0xe3, 0x8f, 0x46, 0x44, 0x54, 0x0e, 0x0a, + 0x04, 0x91, 0x91, 0x91, 0xc3, 0x9e, 0xc3, 0x0b, 0x17, 0xa5, 0x93, 0xb2, + 0x20, 0x95, 0xf3, 0xe7, 0xce, 0xea, 0xcf, 0x23, 0x9d, 0x9b, 0x13, 0x00, + 0x19, 0x22, 0xfc, 0x8d, 0x56, 0x0d, 0x78, 0xac, 0xea, 0xc0, 0x82, 0x00, + 0x42, 0x11, 0xd3, 0xa8, 0x64, 0x4b, 0x67, 0x09, 0xdf, 0x6d, 0x2b, 0x24, + 0xc9, 0xda, 0x06, 0xd2, 0x90, 0xfd, 0xaa, 0x03, 0x42, 0xa0, 0x22, 0x13, + 0x19, 0x2e, 0xf3, 0x74, 0x8c, 0x91, 0xd4, 0xb9, 0x06, 0xde, 0xfa, 0x8b, + 0xc8, 0xce, 0xcf, 0x04, 0xaa, 0x6a, 0x6e, 0x2c, 0xda, 0x74, 0xde, 0xbc, + 0x79, 0xbc, 0xf4, 0xd2, 0x4b, 0x3c, 0xf9, 0xe4, 0x93, 0x04, 0x06, 0x06, + 0xd2, 0xda, 0xda, 0x4a, 0x51, 0x51, 0x11, 0x25, 0x25, 0x25, 0xb4, 0xb5, + 0xb5, 0x21, 0x49, 0x12, 0x61, 0x61, 0x61, 0xcc, 0x99, 0x33, 0x87, 0xf8, + 0xf8, 0x78, 0x1e, 0x7e, 0xf8, 0x61, 0xae, 0x5e, 0xbd, 0x4a, 0x71, 0x71, + 0xf1, 0x5d, 0x2f, 0x00, 0x2a, 0x8a, 0x82, 0xc1, 0x60, 0xc0, 0x64, 0x32, + 0x21, 0xcb, 0xf2, 0x94, 0xcc, 0x5b, 0x07, 0xf7, 0x39, 0xf8, 0xdf, 0x55, + 0x55, 0x55, 0xd8, 0xed, 0x76, 0x54, 0x55, 0xd5, 0x2a, 0x85, 0xfb, 0xf8, + 0x10, 0x1f, 0x1f, 0x4f, 0x42, 0x42, 0x02, 0x91, 0x91, 0x91, 0xfc, 0xe3, + 0x3f, 0xfe, 0x23, 0x79, 0x79, 0x79, 0xb8, 0xb8, 0xb8, 0x60, 0x32, 0x99, + 0x10, 0x45, 0xf1, 0x86, 0x0b, 0xba, 0xe9, 0xe8, 0xdc, 0x12, 0xee, 0xde, + 0xc8, 0xef, 0xbd, 0x06, 0x5e, 0xde, 0x48, 0x33, 0x93, 0x26, 0x8c, 0xb2, + 0x52, 0x8e, 0x1f, 0x46, 0x39, 0x7b, 0x4a, 0x13, 0xd5, 0x6e, 0xd6, 0x1a, + 0x43, 0x76, 0x40, 0x47, 0x2b, 0x6a, 0xc9, 0x41, 0x70, 0x75, 0x47, 0xb5, + 0x0c, 0x44, 0x0c, 0xbb, 0xb9, 0x69, 0xc5, 0x35, 0x86, 0xb6, 0xc1, 0x62, + 0x46, 0x2d, 0xfa, 0x00, 0x21, 0x28, 0x6d, 0xe0, 0xc1, 0xac, 0x15, 0x01, + 0x51, 0xeb, 0xab, 0x35, 0xd1, 0xc8, 0xc3, 0x03, 0x31, 0x6d, 0x31, 0xca, + 0xf9, 0x3c, 0xa8, 0x2d, 0x46, 0xed, 0x6d, 0x45, 0x5a, 0xbb, 0x15, 0x69, + 0xf9, 0x1a, 0x04, 0x5f, 0x5f, 0x08, 0x0e, 0x45, 0x7e, 0xf7, 0x8f, 0x28, + 0xd5, 0xe5, 0x88, 0x09, 0xb3, 0x91, 0x12, 0x66, 0xa3, 0x04, 0x87, 0xa3, + 0x5e, 0xca, 0x83, 0x7e, 0x33, 0x24, 0x2c, 0x45, 0x88, 0x8e, 0xd5, 0xda, + 0xd1, 0xde, 0x8a, 0x52, 0x72, 0x49, 0xf3, 0xcf, 0xe3, 0xda, 0xb8, 0xaa, + 0x5e, 0xca, 0x47, 0x35, 0x77, 0x23, 0xf8, 0x07, 0x81, 0x7f, 0x00, 0xaa, + 0xc5, 0x02, 0x4d, 0xf5, 0xda, 0x80, 0x3b, 0x56, 0x77, 0xa9, 0xa0, 0xb6, + 0x36, 0xc0, 0x95, 0xa3, 0xe0, 0x1e, 0xac, 0x7d, 0xe0, 0xe2, 0xa1, 0x09, + 0x99, 0x46, 0xd7, 0x6b, 0x59, 0x7a, 0x82, 0x80, 0x10, 0x32, 0x4d, 0x2b, + 0x96, 0x21, 0x49, 0xd0, 0xdd, 0xa9, 0xa5, 0xd4, 0xa2, 0x6a, 0x7e, 0xf2, + 0x26, 0x4f, 0x04, 0x0f, 0x4f, 0xc4, 0xc8, 0x18, 0x64, 0xdf, 0x10, 0xad, + 0x2a, 0xf1, 0x18, 0xe7, 0x48, 0x6d, 0x6f, 0x45, 0x3e, 0x71, 0x10, 0x9a, + 0x1b, 0x34, 0x71, 0xcf, 0xd6, 0xaf, 0x89, 0x8e, 0x2e, 0x6e, 0x88, 0x0b, + 0x34, 0x81, 0x71, 0x50, 0x1c, 0x14, 0x14, 0x59, 0x4b, 0x71, 0x76, 0xf3, + 0x40, 0xf0, 0xf6, 0x41, 0xf0, 0xf2, 0x46, 0x5a, 0xf9, 0x18, 0xca, 0xc1, + 0x0f, 0xc1, 0x65, 0x92, 0xf3, 0x43, 0x87, 0x8c, 0x5a, 0x72, 0x11, 0xd5, + 0x6a, 0x43, 0x59, 0x90, 0x8e, 0x18, 0x3b, 0x03, 0x69, 0x71, 0x26, 0xea, + 0x85, 0x2f, 0x51, 0xca, 0x4e, 0xa1, 0x36, 0xd6, 0x41, 0xec, 0x0c, 0xc4, + 0xe0, 0x10, 0xd4, 0x39, 0x0b, 0x70, 0x7c, 0xfe, 0x07, 0x04, 0x6b, 0x2f, + 0xb8, 0x7b, 0x22, 0x2e, 0x7f, 0x08, 0xc1, 0xd7, 0x4f, 0x6b, 0x77, 0xe9, + 0x57, 0xd0, 0x5c, 0x03, 0xe2, 0xa2, 0x21, 0x13, 0x30, 0x03, 0x94, 0x16, + 0xa0, 0xe4, 0xce, 0x42, 0x9a, 0x31, 0x53, 0xab, 0x18, 0x3c, 0xb8, 0x3e, + 0xd0, 0xa7, 0x5e, 0xba, 0x00, 0x78, 0x2f, 0x60, 0xb5, 0x4d, 0x3c, 0x21, + 0x13, 0x45, 0x71, 0x42, 0xa3, 0x73, 0x41, 0x10, 0x10, 0x04, 0xe1, 0xa6, + 0x17, 0x25, 0x53, 0x25, 0xda, 0x0d, 0x46, 0x48, 0x8c, 0xd6, 0x8e, 0xc9, + 0x14, 0xbe, 0x18, 0xed, 0xed, 0xab, 0xaa, 0xaa, 0xb8, 0xb9, 0xb9, 0x62, + 0xbc, 0x43, 0x91, 0x47, 0xf7, 0x2a, 0x8a, 0xaa, 0x12, 0x13, 0x1b, 0xcb, + 0x92, 0xcc, 0x4c, 0x92, 0xe6, 0xcd, 0x25, 0x34, 0x34, 0x0c, 0xc9, 0x60, + 0xa0, 0xee, 0x6a, 0x0d, 0x87, 0xf7, 0xef, 0xe7, 0x54, 0x4e, 0x0e, 0x76, + 0x9b, 0x75, 0xc2, 0xfd, 0x14, 0x17, 0x15, 0xd1, 0x50, 0xdf, 0xa0, 0x0b, + 0x80, 0xf7, 0x38, 0x71, 0x71, 0xd3, 0x99, 0x36, 0x44, 0x10, 0x19, 0x8d, + 0xda, 0x9a, 0x1a, 0xde, 0x7f, 0xef, 0x1d, 0xf2, 0x4e, 0x9d, 0xc2, 0xc3, + 0xc3, 0x83, 0x75, 0xeb, 0x37, 0xf0, 0xe4, 0xd3, 0xcf, 0x8c, 0xba, 0xa8, + 0xb1, 0x5a, 0xad, 0xbc, 0xff, 0xee, 0x4e, 0x0e, 0x1f, 0x3a, 0x40, 0x7f, + 0x7f, 0x3f, 0x4b, 0x33, 0x97, 0xb1, 0xed, 0x99, 0xe7, 0x08, 0x09, 0x0d, + 0x1d, 0x73, 0xff, 0x5e, 0xde, 0x5e, 0xcc, 0x9e, 0x9d, 0xc4, 0xb9, 0x51, + 0xbc, 0xf5, 0x6e, 0x17, 0x73, 0xe6, 0xce, 0xe3, 0x27, 0x3f, 0xfb, 0x05, + 0x7f, 0xf8, 0xfd, 0xef, 0xc8, 0x3a, 0x74, 0xf0, 0x8e, 0x0a, 0x3f, 0x92, + 0x64, 0xe0, 0xb1, 0xad, 0x8f, 0x73, 0xb9, 0xf8, 0x12, 0x79, 0xa7, 0x72, + 0x27, 0x2d, 0x7e, 0x75, 0x77, 0x77, 0x93, 0x75, 0xf8, 0x10, 0xa7, 0x72, + 0x73, 0x29, 0x3c, 0x7f, 0x9e, 0x97, 0xbf, 0xf7, 0x0a, 0xa1, 0xa1, 0xf7, + 0x4f, 0xb4, 0xf7, 0xd1, 0xac, 0xc3, 0x34, 0xd4, 0xd7, 0x3b, 0x9f, 0x41, + 0x8a, 0xa2, 0xd0, 0xd6, 0xd6, 0xca, 0xe5, 0xe2, 0xe2, 0x31, 0xc5, 0x64, + 0x4f, 0x2f, 0x2f, 0x66, 0xc4, 0x27, 0x0c, 0xfb, 0x6c, 0xf1, 0x92, 0x0c, + 0x5e, 0xfd, 0xf1, 0x4f, 0x79, 0xed, 0xf7, 0xbf, 0x23, 0x37, 0xe7, 0xa4, + 0x2e, 0x02, 0xea, 0xdc, 0xb8, 0x00, 0x28, 0x30, 0xdc, 0x32, 0x6a, 0x52, + 0xe9, 0xc0, 0x81, 0xd0, 0x9e, 0x4e, 0x44, 0x4f, 0x17, 0x8f, 0xc9, 0xb9, + 0x7c, 0xd7, 0x7a, 0x8e, 0x24, 0x5b, 0x87, 0x26, 0xfe, 0x8d, 0xb9, 0xc8, + 0x06, 0xac, 0x76, 0xe2, 0x13, 0xec, 0x3c, 0xbe, 0xce, 0x40, 0x59, 0x15, + 0x54, 0xd5, 0x4c, 0xbe, 0xb9, 0x09, 0x09, 0x09, 0x3c, 0xf7, 0xdc, 0x73, + 0x6c, 0xdb, 0xb6, 0x0d, 0x6f, 0x6f, 0x6f, 0x0a, 0x0a, 0x0a, 0x78, 0xe7, + 0x9d, 0x77, 0xd8, 0xbb, 0x77, 0x2f, 0xd5, 0xd5, 0xd5, 0xce, 0x08, 0x37, + 0x4f, 0x4f, 0x4f, 0x52, 0x52, 0x52, 0xd8, 0xba, 0x75, 0x2b, 0x91, 0x91, + 0x91, 0x1c, 0x3f, 0x7e, 0x9c, 0xa6, 0xa6, 0xa6, 0x6f, 0xc4, 0x29, 0x19, + 0x7c, 0x31, 0x70, 0xfd, 0xcb, 0x81, 0xa9, 0xa0, 0xb8, 0xb8, 0x98, 0x7f, + 0xf8, 0x87, 0x7f, 0xa0, 0xbc, 0xbc, 0x1c, 0x45, 0x51, 0x90, 0x24, 0x89, + 0xf8, 0xf8, 0x78, 0x1e, 0x7d, 0xf4, 0x51, 0x9e, 0x78, 0xe2, 0x09, 0xd6, + 0xad, 0x5b, 0x47, 0x65, 0x65, 0xa5, 0x33, 0x15, 0x58, 0x96, 0xe5, 0xdb, + 0xd2, 0x0e, 0x1d, 0x9d, 0xf1, 0x27, 0x15, 0x06, 0xe8, 0x6e, 0x43, 0xfe, + 0xe0, 0xcf, 0xb0, 0x72, 0x03, 0xe2, 0xbc, 0x54, 0xa7, 0x30, 0x33, 0xec, + 0x5e, 0xe9, 0x68, 0x43, 0xce, 0x3b, 0x81, 0x72, 0xe2, 0x10, 0x74, 0xb6, + 0x0c, 0x4f, 0xc1, 0xbd, 0xd1, 0xa1, 0xd0, 0xd7, 0x1f, 0x71, 0xe5, 0xc3, + 0x08, 0x0b, 0x97, 0x6b, 0x45, 0x2e, 0x12, 0x66, 0x69, 0xc7, 0xe8, 0xed, + 0x45, 0x6d, 0x6e, 0x40, 0x98, 0x91, 0x74, 0xcd, 0x03, 0x70, 0xc1, 0x62, + 0x84, 0xff, 0x7b, 0x5c, 0x13, 0xc7, 0x04, 0x11, 0xac, 0x7d, 0x28, 0x57, + 0x2e, 0xa2, 0x9e, 0x3d, 0x89, 0x92, 0x77, 0x1c, 0x69, 0xd5, 0x7a, 0xc4, + 0xd0, 0x70, 0x0c, 0xdf, 0xfa, 0x21, 0x6a, 0xdd, 0x66, 0x90, 0x24, 0xc4, + 0x98, 0x38, 0x84, 0xc0, 0x20, 0x54, 0x73, 0x0f, 0x6a, 0xd9, 0x57, 0xd0, + 0x52, 0x83, 0x7c, 0xe2, 0x08, 0x62, 0xdc, 0x0c, 0xf0, 0x30, 0x21, 0xbd, + 0xf4, 0x23, 0x94, 0xb2, 0xf5, 0x08, 0xd6, 0x3e, 0x84, 0xd8, 0x19, 0xce, + 0xb4, 0x59, 0xa5, 0xb2, 0x1c, 0x35, 0xeb, 0x23, 0x84, 0xc8, 0x99, 0xd7, + 0x09, 0x5d, 0x36, 0x94, 0xea, 0x4a, 0x24, 0xbf, 0x00, 0x30, 0xba, 0xa0, + 0xb6, 0xb5, 0xa0, 0x5e, 0x2d, 0x43, 0x88, 0x4d, 0x1c, 0xa2, 0xf6, 0x5d, + 0xe7, 0xf9, 0x69, 0x34, 0x22, 0x3d, 0xba, 0x1d, 0xd6, 0x6f, 0x1d, 0x48, + 0x5f, 0x96, 0x50, 0x3b, 0x5a, 0x51, 0x0b, 0xf3, 0x51, 0x8b, 0x0b, 0xc0, + 0xd5, 0x5d, 0x2b, 0x6c, 0x21, 0x19, 0x11, 0x16, 0xaf, 0x42, 0x70, 0x75, + 0x03, 0x59, 0xc6, 0xb1, 0xe7, 0x2f, 0xa8, 0xa5, 0x97, 0xc0, 0xd5, 0x15, + 0xac, 0xfd, 0x88, 0x99, 0x0f, 0x22, 0xad, 0x7c, 0x10, 0x3c, 0xbd, 0x10, + 0xd3, 0x57, 0xa1, 0x9c, 0xd8, 0x0b, 0x06, 0x97, 0x61, 0x42, 0xa3, 0xf3, + 0x3f, 0x15, 0x45, 0x4b, 0x33, 0xee, 0x6e, 0xd3, 0x44, 0x3c, 0x41, 0xd4, + 0xfa, 0xcd, 0xcb, 0x1b, 0x21, 0x2e, 0x1e, 0x44, 0x11, 0xe5, 0x4c, 0x0e, + 0xca, 0xd9, 0xd3, 0x9a, 0x80, 0x6b, 0xeb, 0x47, 0x98, 0x9d, 0x82, 0xb4, + 0x7c, 0xb5, 0x56, 0x11, 0x78, 0xee, 0x02, 0x94, 0xf7, 0xff, 0x05, 0xbc, + 0xfc, 0x87, 0xec, 0x5e, 0x1d, 0x5f, 0x71, 0x53, 0x54, 0xe8, 0x6a, 0x43, + 0x39, 0x91, 0x85, 0x18, 0x15, 0x83, 0x10, 0x10, 0x8c, 0x90, 0xb2, 0x08, + 0xa1, 0xa1, 0x1a, 0x25, 0x7b, 0x1f, 0xc2, 0xb4, 0x18, 0xc4, 0xf8, 0x99, + 0x88, 0xc9, 0xf3, 0x30, 0xfc, 0x9f, 0x77, 0x50, 0xeb, 0xeb, 0x10, 0x7c, + 0xfd, 0x10, 0x13, 0x93, 0x34, 0xbf, 0xc6, 0xb6, 0x16, 0x94, 0x73, 0x79, + 0xd0, 0x72, 0x75, 0xa4, 0xbf, 0xa1, 0xe2, 0x40, 0x2d, 0x2f, 0x46, 0xfe, + 0xf2, 0x0c, 0xd2, 0x92, 0x65, 0xfa, 0xbd, 0xaa, 0x0b, 0x80, 0xf7, 0x1a, + 0xf7, 0xd6, 0xc3, 0x3e, 0x32, 0x26, 0x86, 0x9f, 0xfc, 0xfd, 0xdf, 0xd3, + 0x54, 0x5f, 0x0f, 0x08, 0x88, 0xa2, 0x66, 0x7c, 0xfc, 0xa7, 0xdf, 0xff, + 0x17, 0x0d, 0x75, 0xe3, 0x57, 0x3c, 0x0e, 0x8b, 0x88, 0x60, 0xfb, 0x8b, + 0x2f, 0xe2, 0xe5, 0xe3, 0x83, 0xec, 0xb8, 0xe6, 0x1b, 0x25, 0x8a, 0x02, + 0xa1, 0xe1, 0x11, 0x04, 0x06, 0x05, 0xea, 0x97, 0xcb, 0x14, 0xe1, 0xe7, + 0xef, 0xcf, 0x73, 0x2f, 0xbe, 0xc4, 0xc6, 0x47, 0xb7, 0xe0, 0x1f, 0x30, + 0xdc, 0xf3, 0x61, 0xee, 0xfc, 0xf9, 0x2c, 0x5f, 0xb5, 0x92, 0x3f, 0xfc, + 0xf6, 0xb7, 0x7c, 0xba, 0x6b, 0xd7, 0x84, 0xc6, 0xde, 0xe6, 0x9e, 0x1e, + 0x8a, 0x2f, 0x16, 0x91, 0x30, 0x33, 0x51, 0xef, 0xd8, 0x7b, 0x75, 0xed, + 0x2a, 0x08, 0x24, 0x25, 0xcf, 0x19, 0xd3, 0xd7, 0x0e, 0xb4, 0x8a, 0xaf, + 0xaf, 0xfd, 0xe1, 0x77, 0xec, 0xfa, 0xe0, 0x7d, 0xa7, 0x90, 0x5f, 0x58, + 0x78, 0x1e, 0x87, 0x43, 0xe6, 0x85, 0x17, 0x5f, 0x1a, 0xb1, 0xfd, 0xbb, + 0x3b, 0x77, 0xf0, 0xef, 0xff, 0xfa, 0x6b, 0x67, 0xf1, 0x85, 0xa2, 0x0b, + 0x85, 0x74, 0x77, 0x77, 0xf3, 0x8b, 0xff, 0xf9, 0xf7, 0x63, 0xa6, 0x19, + 0x4b, 0x92, 0x81, 0xd9, 0xc9, 0xc9, 0x18, 0x0c, 0x06, 0xa7, 0x7f, 0xd2, + 0xd7, 0xc1, 0xdc, 0x79, 0xf3, 0xf9, 0xdb, 0x1f, 0xff, 0x0c, 0x93, 0x87, + 0x89, 0xcf, 0x3e, 0xfd, 0xe4, 0x8e, 0x2e, 0xd2, 0x12, 0x67, 0xce, 0xe2, + 0x07, 0x3f, 0xfc, 0x6b, 0x80, 0x1b, 0x8e, 0x4a, 0xec, 0xed, 0xb5, 0xb0, + 0x73, 0xc7, 0x5b, 0xc8, 0x0e, 0x07, 0x3f, 0xfb, 0xe5, 0xff, 0xc4, 0xc3, + 0xc3, 0x74, 0xef, 0x3f, 0x61, 0x55, 0x95, 0x92, 0x92, 0x2b, 0x94, 0x94, + 0x5c, 0xb9, 0xa1, 0xeb, 0x7d, 0xc1, 0x82, 0x54, 0xe2, 0x13, 0x46, 0x8e, + 0x69, 0x8b, 0x97, 0x64, 0xe0, 0xe5, 0xe5, 0xcd, 0xef, 0x7f, 0xf7, 0x5b, + 0x0e, 0x1d, 0xdc, 0xaf, 0x2f, 0xd8, 0x75, 0x6e, 0x4c, 0xfc, 0x1b, 0xfc, + 0xff, 0x43, 0x6b, 0x7a, 0x4c, 0x24, 0x02, 0x1a, 0x60, 0x7a, 0x5d, 0x3f, + 0xdb, 0x2f, 0xb7, 0xf2, 0x8c, 0xb5, 0x85, 0xf8, 0xc4, 0x7e, 0x88, 0x98, + 0xe4, 0x71, 0x01, 0x45, 0x96, 0x47, 0xb5, 0xa9, 0x1a, 0x8f, 0x35, 0x6b, + 0xd6, 0xb0, 0x71, 0xe3, 0x46, 0xfc, 0xfc, 0xfc, 0x38, 0x75, 0xea, 0x14, + 0xbf, 0xfe, 0xf5, 0xaf, 0xd9, 0xbb, 0x77, 0xef, 0x88, 0x4c, 0x11, 0xb3, + 0xd9, 0x4c, 0x6e, 0x6e, 0x2e, 0x45, 0x45, 0x45, 0xf8, 0xfa, 0xfa, 0xd2, + 0xda, 0xda, 0xfa, 0x8d, 0xf0, 0x00, 0x1c, 0xbc, 0xcf, 0x6f, 0x17, 0x36, + 0x9b, 0x8d, 0xcb, 0x97, 0x2f, 0x3b, 0x05, 0x40, 0x41, 0x10, 0x28, 0x2a, + 0x2a, 0xa2, 0xbc, 0xbc, 0x1c, 0x77, 0x77, 0x77, 0xb6, 0x6e, 0xdd, 0xca, + 0x03, 0x0f, 0x3c, 0x40, 0x54, 0x54, 0x14, 0x46, 0xa3, 0x51, 0x1f, 0x47, + 0x74, 0xee, 0x1c, 0x2e, 0xee, 0x50, 0x55, 0x8c, 0xbc, 0xbf, 0x17, 0xa5, + 0xec, 0x2b, 0x84, 0x69, 0x31, 0x08, 0xfe, 0xfe, 0x5a, 0x4a, 0xaa, 0xcd, + 0x86, 0xda, 0xd1, 0x8e, 0x7a, 0xb5, 0x1c, 0xf5, 0xca, 0x05, 0xe8, 0xee, + 0xd0, 0x44, 0xc3, 0x9b, 0xb8, 0x77, 0x44, 0x37, 0xcd, 0x97, 0x4f, 0x08, + 0x08, 0x44, 0x5a, 0xbc, 0x4c, 0x13, 0xcd, 0x0c, 0x92, 0x16, 0x89, 0xd6, + 0xdc, 0x80, 0x7c, 0xec, 0x30, 0x74, 0xb5, 0x81, 0x8b, 0x2b, 0x82, 0xab, + 0x36, 0x07, 0x14, 0xe3, 0x66, 0x40, 0xdc, 0x8c, 0x6b, 0x3b, 0xe9, 0xef, + 0x03, 0x55, 0x41, 0x3e, 0xf2, 0x17, 0x94, 0x23, 0x5f, 0x80, 0x9b, 0x3b, + 0x52, 0xda, 0x62, 0xc4, 0x69, 0x51, 0x10, 0x11, 0xe9, 0x6c, 0x97, 0xda, + 0xd9, 0x81, 0x9c, 0x77, 0x1c, 0xe5, 0xc4, 0x41, 0x4d, 0x68, 0x2a, 0xca, + 0xc7, 0xb1, 0x2f, 0x14, 0x29, 0xe3, 0x01, 0xc4, 0x90, 0x70, 0xc4, 0xa0, + 0x50, 0x2d, 0xe5, 0xd7, 0x60, 0x44, 0xed, 0xef, 0x47, 0x29, 0x38, 0x85, + 0x72, 0x74, 0x3f, 0xf4, 0xf5, 0x68, 0x05, 0x3a, 0x5c, 0x5c, 0xb4, 0x01, + 0xd4, 0xd5, 0x15, 0x5c, 0x3d, 0x50, 0x8a, 0x0b, 0x91, 0xe6, 0x69, 0x51, + 0x88, 0x6a, 0x5b, 0x2b, 0x6a, 0xc9, 0x59, 0x84, 0xd9, 0x29, 0x5a, 0x5b, + 0x61, 0xa0, 0x78, 0x86, 0xa0, 0xa5, 0xb8, 0x0a, 0x02, 0x18, 0x8d, 0x48, + 0x73, 0x53, 0x86, 0xcf, 0x45, 0x5a, 0x9b, 0x90, 0x5b, 0x9b, 0x50, 0xcf, + 0x1d, 0xd3, 0x04, 0x40, 0x45, 0x05, 0x77, 0x57, 0xa4, 0xa5, 0x2b, 0xb4, + 0xe2, 0x19, 0x0d, 0x75, 0xa8, 0xa5, 0x17, 0x51, 0x0b, 0x8f, 0x82, 0x29, + 0x00, 0x3a, 0xeb, 0x50, 0x42, 0xa7, 0x21, 0xce, 0x5f, 0x80, 0xe0, 0x1f, + 0x84, 0x98, 0xb9, 0x12, 0x25, 0xeb, 0xe3, 0xe1, 0x02, 0xa0, 0x00, 0xc2, + 0xc0, 0x7c, 0x59, 0x30, 0xba, 0x68, 0x7f, 0x13, 0x25, 0xed, 0x9f, 0x22, + 0x83, 0xbb, 0x17, 0xe2, 0x9a, 0xcd, 0x9a, 0xc0, 0x08, 0x28, 0xc5, 0x85, + 0xa8, 0x05, 0x59, 0xda, 0xdf, 0xad, 0x16, 0xd4, 0x3e, 0x33, 0x62, 0xe2, + 0x6c, 0x84, 0x90, 0x30, 0x84, 0x98, 0xe9, 0xb0, 0x60, 0x9d, 0xe6, 0xef, + 0xe8, 0xea, 0x06, 0x82, 0x80, 0xe8, 0xea, 0x8e, 0x2c, 0x19, 0x34, 0xb1, + 0x52, 0x1b, 0x34, 0x11, 0x06, 0x5f, 0xe8, 0xbb, 0xb8, 0x68, 0xd7, 0x88, + 0xec, 0x40, 0x39, 0x97, 0x8b, 0xba, 0x7a, 0x03, 0x42, 0x44, 0x14, 0xd2, + 0xca, 0x75, 0xa8, 0x75, 0x35, 0xa8, 0x87, 0xde, 0x43, 0x3e, 0xf8, 0x39, + 0x38, 0x1c, 0x88, 0x89, 0xb3, 0x91, 0x66, 0xcf, 0x83, 0xf8, 0x59, 0x5a, + 0xff, 0x0a, 0x02, 0x4a, 0x75, 0x05, 0xf2, 0xb1, 0x43, 0xa8, 0x55, 0x03, + 0x73, 0x33, 0xa3, 0xab, 0xd6, 0xdf, 0x8a, 0xa2, 0xf5, 0xa7, 0xe4, 0x0a, + 0x1d, 0xcd, 0x28, 0xa7, 0xb2, 0x11, 0xe7, 0xcc, 0x73, 0x16, 0x15, 0xc1, + 0x60, 0x40, 0x37, 0xf7, 0xd7, 0x05, 0xc0, 0x7b, 0x60, 0x5e, 0x38, 0xf1, + 0x55, 0xac, 0xaa, 0x2a, 0xd6, 0x29, 0x48, 0xcf, 0xfd, 0x3a, 0x70, 0x75, + 0x75, 0x1d, 0x51, 0xd9, 0x51, 0x55, 0x55, 0x76, 0xbf, 0xff, 0xc1, 0x84, + 0x02, 0xa0, 0xbf, 0xbf, 0x3f, 0xeb, 0x36, 0x6d, 0x1a, 0x57, 0x64, 0xd0, + 0x99, 0x1a, 0xa2, 0x63, 0x62, 0x58, 0xb3, 0x61, 0xdd, 0x08, 0xf1, 0x6f, + 0x10, 0x93, 0xa7, 0x27, 0xdb, 0x5f, 0x7a, 0x91, 0xaf, 0x2e, 0x5d, 0xa2, + 0xf0, 0xec, 0xf8, 0xe9, 0x6e, 0x02, 0x02, 0x65, 0x57, 0xae, 0xe8, 0x9d, + 0x7a, 0x0f, 0x23, 0x49, 0x12, 0x09, 0x09, 0x89, 0xe3, 0x2e, 0x98, 0x4a, + 0x4b, 0xae, 0x70, 0xf8, 0xe0, 0x81, 0x61, 0x51, 0xbc, 0x7d, 0xbd, 0xbd, + 0x64, 0x1d, 0x3e, 0xc8, 0x96, 0x47, 0x1f, 0xc3, 0xc7, 0xd7, 0xd7, 0xf9, + 0x79, 0x5b, 0x5b, 0x1b, 0xfb, 0xf7, 0xee, 0x19, 0x56, 0x79, 0x55, 0x51, + 0x14, 0x0e, 0xec, 0xdb, 0xc3, 0xd6, 0xc7, 0x9f, 0x24, 0x29, 0x39, 0x79, + 0xcc, 0xe3, 0xc4, 0xc7, 0x27, 0xe0, 0xe5, 0xe5, 0xfd, 0xb5, 0xa6, 0x01, + 0x03, 0xcc, 0x88, 0x8f, 0xe7, 0x6f, 0x7f, 0xfa, 0x33, 0x3c, 0x3d, 0x3d, + 0x79, 0xff, 0xbd, 0x9d, 0x77, 0xf4, 0x7c, 0x2c, 0x5e, 0x92, 0x81, 0x9f, + 0x9f, 0x1f, 0x1f, 0xed, 0xfe, 0x90, 0x3d, 0x5f, 0x7c, 0x4e, 0x6b, 0x4b, + 0xcb, 0xa4, 0x17, 0x90, 0x8a, 0xa2, 0xf0, 0xd1, 0xee, 0x0f, 0x49, 0x4a, + 0x4e, 0xe6, 0x89, 0xa7, 0xb6, 0xe9, 0x17, 0xf7, 0x68, 0xe3, 0x9f, 0xc9, + 0xc4, 0xc3, 0x9b, 0x1e, 0x19, 0xf3, 0x59, 0x94, 0x94, 0x9c, 0xcc, 0x8f, + 0x7f, 0xfa, 0x33, 0xbc, 0xbd, 0xbd, 0xf9, 0xf8, 0xa3, 0x5d, 0x7a, 0x87, + 0xe9, 0x4c, 0x5e, 0x04, 0x1c, 0xfc, 0xef, 0x41, 0xd1, 0x6f, 0x78, 0x61, + 0xdf, 0xe1, 0x22, 0xa0, 0xaa, 0xcd, 0xb6, 0x67, 0xd4, 0xd5, 0xf1, 0x52, + 0xfe, 0x3e, 0x9e, 0x28, 0x3c, 0xc3, 0x74, 0x59, 0x80, 0xee, 0x69, 0x20, + 0xd6, 0x43, 0x84, 0x65, 0xf4, 0x85, 0x90, 0x30, 0x30, 0x4b, 0x17, 0xe1, + 0xf2, 0x45, 0xf8, 0x60, 0xaf, 0xca, 0xe9, 0xf3, 0x93, 0x6f, 0x6a, 0x52, + 0x52, 0x12, 0xeb, 0xd7, 0xaf, 0x67, 0xc6, 0x8c, 0x19, 0x54, 0x55, 0x55, + 0xb1, 0x73, 0xe7, 0x4e, 0xf6, 0xec, 0xd9, 0x83, 0xd5, 0x3a, 0x7a, 0x46, + 0x80, 0x2c, 0xcb, 0x74, 0x76, 0x76, 0xd2, 0xd5, 0xd5, 0x35, 0xa9, 0x71, + 0xc8, 0x60, 0x30, 0x20, 0x49, 0x92, 0xb3, 0xea, 0xed, 0xa4, 0x16, 0x1d, + 0x06, 0x03, 0x06, 0x83, 0x01, 0xbb, 0xdd, 0x3e, 0x66, 0x61, 0xa1, 0xeb, + 0x31, 0x1a, 0x8d, 0xce, 0xea, 0xbb, 0xa3, 0xcd, 0xab, 0x27, 0xa5, 0x8d, + 0xb8, 0xb8, 0x38, 0xfd, 0xfb, 0x6e, 0x04, 0x55, 0x55, 0x87, 0x45, 0xf5, + 0x0d, 0x1e, 0xaf, 0xae, 0xae, 0x8e, 0xfc, 0xfc, 0x7c, 0xb6, 0x6c, 0xd9, + 0x42, 0x48, 0x48, 0x08, 0x7e, 0x7e, 0x7e, 0x18, 0x0c, 0x86, 0x71, 0xdb, + 0x23, 0x49, 0x12, 0xae, 0xae, 0xae, 0x28, 0x8a, 0x32, 0x25, 0x56, 0x3d, + 0x3a, 0x3a, 0x23, 0x70, 0xf7, 0x82, 0xe6, 0x1a, 0xd4, 0x86, 0x0a, 0x54, + 0xaf, 0x00, 0xf0, 0x0d, 0xd4, 0x84, 0x25, 0x6b, 0x3f, 0x6a, 0x67, 0x2b, + 0x74, 0x36, 0x83, 0x87, 0xcf, 0xc8, 0xea, 0xb5, 0x93, 0x1a, 0xfb, 0xb4, + 0xc2, 0x94, 0x72, 0xde, 0x09, 0x84, 0xca, 0x32, 0xed, 0xdd, 0x87, 0x20, + 0x6a, 0xfe, 0x6f, 0xb2, 0x03, 0xcc, 0xdd, 0xa8, 0xcd, 0x0d, 0xa8, 0x05, + 0xc7, 0xb5, 0xcf, 0x4a, 0x8b, 0x71, 0x18, 0x5d, 0xb4, 0x94, 0x60, 0x84, + 0x6b, 0x5a, 0xa3, 0x20, 0x6a, 0x15, 0x88, 0x2b, 0x4b, 0xb4, 0x94, 0xdd, + 0xa6, 0x1a, 0x94, 0x3d, 0x1f, 0x68, 0x51, 0x83, 0x21, 0xe1, 0x08, 0x1e, + 0x26, 0x54, 0x87, 0x03, 0xcc, 0x3d, 0x28, 0x57, 0x2b, 0x51, 0x2f, 0xe6, + 0x43, 0x77, 0xab, 0xe6, 0x9b, 0xd7, 0x67, 0x46, 0x39, 0xf8, 0x31, 0x6a, + 0x47, 0x1b, 0x62, 0xcc, 0x8c, 0x6b, 0xa9, 0xc6, 0xfd, 0xfd, 0xa8, 0x75, + 0x57, 0x51, 0x2e, 0xe4, 0xc3, 0xd5, 0x2b, 0xe0, 0x1b, 0x8a, 0xda, 0xd3, + 0x81, 0xfc, 0x65, 0x1e, 0x4a, 0x73, 0x33, 0x6a, 0x75, 0x19, 0x88, 0x22, + 0x6a, 0xf1, 0x39, 0x1c, 0x59, 0xfb, 0x11, 0xbc, 0x7d, 0x50, 0x0a, 0xf3, + 0x35, 0xd1, 0xb2, 0xe2, 0x0a, 0x8e, 0x23, 0x07, 0xc0, 0x66, 0x83, 0xea, + 0x32, 0x50, 0x1c, 0x28, 0xe7, 0xf3, 0x51, 0xbb, 0x3a, 0x35, 0xa1, 0x4c, + 0x10, 0x87, 0x8c, 0xeb, 0x12, 0x6a, 0x67, 0x3b, 0x6a, 0x6d, 0x15, 0xb8, + 0x0d, 0xbc, 0x78, 0x15, 0x05, 0x90, 0x1d, 0xc8, 0xe7, 0xb4, 0x88, 0x40, + 0xf5, 0x6a, 0x39, 0x6a, 0x77, 0x07, 0x04, 0x46, 0x83, 0x68, 0x18, 0xf8, + 0xac, 0x0c, 0xf9, 0xd0, 0x5e, 0x84, 0xf0, 0x28, 0xd4, 0x8e, 0x36, 0x4d, + 0x24, 0x1b, 0x3a, 0xce, 0x4b, 0x46, 0xe4, 0x93, 0x47, 0x11, 0x42, 0xc2, + 0x51, 0x2a, 0x4a, 0xc0, 0xd2, 0x7d, 0xed, 0x1c, 0x09, 0x02, 0x28, 0x32, + 0x6a, 0x7d, 0x0d, 0x8e, 0xec, 0x43, 0x9a, 0x98, 0x5b, 0x5d, 0x06, 0x26, + 0x1f, 0x90, 0x5c, 0xb4, 0x74, 0xe4, 0x9e, 0x0e, 0xe4, 0x53, 0xc7, 0x50, + 0xcd, 0x66, 0xd4, 0x9e, 0x6e, 0xed, 0x99, 0xa3, 0x2a, 0x28, 0x79, 0x27, + 0x51, 0x2a, 0xca, 0xa1, 0xa7, 0x0b, 0xb5, 0xa3, 0x45, 0xeb, 0xc3, 0x81, + 0xca, 0xc9, 0x4a, 0xe1, 0x97, 0x20, 0x2b, 0xa8, 0xed, 0xad, 0x5a, 0x35, + 0x68, 0x51, 0x04, 0x4b, 0x37, 0x8e, 0x83, 0x5f, 0x20, 0x44, 0x4f, 0xd7, + 0x44, 0xd0, 0xf6, 0x16, 0xf0, 0xf0, 0x45, 0x3d, 0x9f, 0x83, 0xdc, 0xdb, + 0x83, 0x52, 0xb5, 0x00, 0x21, 0x30, 0x04, 0xc1, 0xcd, 0x15, 0xd5, 0x6e, + 0x47, 0xed, 0xec, 0x40, 0xbd, 0x7c, 0x01, 0xb5, 0xe8, 0xb4, 0x76, 0x4c, + 0xaf, 0x40, 0xd4, 0x92, 0x8b, 0xc8, 0x03, 0xd7, 0x8a, 0x5a, 0x7a, 0x19, + 0x3c, 0xfd, 0xb5, 0x42, 0x26, 0x55, 0x57, 0x90, 0xf7, 0x7d, 0x0a, 0x41, + 0x61, 0x08, 0x92, 0x88, 0x7a, 0xb5, 0x42, 0x13, 0x4f, 0x75, 0x6f, 0x65, + 0x5d, 0x00, 0xfc, 0x26, 0x63, 0x74, 0x99, 0x78, 0x30, 0x55, 0x64, 0x19, + 0x8b, 0xa5, 0xf7, 0x1b, 0xfb, 0x1b, 0x6d, 0x56, 0x2b, 0xca, 0x24, 0x26, + 0x6c, 0xb2, 0xa2, 0x60, 0xed, 0xef, 0x9f, 0x52, 0x01, 0x50, 0x10, 0x84, + 0x9b, 0x2a, 0x4e, 0x71, 0xaf, 0xa7, 0x62, 0xc8, 0xca, 0xc4, 0x13, 0xef, + 0xe0, 0x90, 0x50, 0x16, 0x2d, 0x59, 0x42, 0xf1, 0xc5, 0x8b, 0xd8, 0xc6, + 0x9b, 0xfc, 0x0a, 0x50, 0x73, 0xf5, 0xaa, 0x7e, 0x33, 0xdf, 0xcb, 0x82, + 0x88, 0xa7, 0x27, 0x31, 0xb1, 0xb1, 0xe3, 0x6e, 0xd3, 0xd9, 0xd1, 0x81, + 0x65, 0x14, 0x4f, 0xd3, 0xe6, 0xe6, 0x26, 0xcc, 0x16, 0xcb, 0x30, 0x01, + 0xb0, 0xd7, 0x62, 0xa1, 0xb9, 0x79, 0x64, 0x9a, 0x58, 0x4f, 0x4f, 0x0f, + 0x9d, 0x9d, 0x1d, 0xe3, 0x1e, 0x27, 0x34, 0x2c, 0x8c, 0x80, 0xc0, 0x80, + 0xaf, 0x5d, 0x00, 0x04, 0x08, 0x0b, 0x0b, 0xe7, 0x7f, 0xfc, 0xed, 0x4f, + 0xf0, 0x30, 0x99, 0xd8, 0xb9, 0xe3, 0xed, 0x3b, 0x7a, 0x4e, 0x12, 0x67, + 0xce, 0xe2, 0xe7, 0xbf, 0xfc, 0x3b, 0x56, 0xaf, 0x59, 0xcb, 0xc9, 0xe3, + 0xc7, 0x38, 0x7f, 0xfe, 0x1c, 0x57, 0xab, 0xab, 0xe9, 0xea, 0xea, 0xa2, + 0xaf, 0xaf, 0x77, 0xdc, 0x45, 0xae, 0xcd, 0x66, 0xe3, 0xd0, 0xc1, 0x03, + 0x6c, 0x78, 0x78, 0x13, 0x9e, 0x9e, 0x9e, 0xfa, 0x05, 0x7e, 0x9d, 0xd0, + 0xf0, 0xcc, 0x73, 0xdb, 0x59, 0xbf, 0xe1, 0xe1, 0x71, 0xb7, 0x8b, 0x8d, + 0x9b, 0xce, 0xab, 0x3f, 0xf9, 0x19, 0x1e, 0x26, 0x0f, 0x76, 0x7d, 0xf8, + 0x81, 0xde, 0x71, 0x3a, 0x13, 0x0b, 0x80, 0x83, 0xbe, 0x7f, 0x43, 0x23, + 0xfe, 0xd4, 0x21, 0xc2, 0x9f, 0x3a, 0x44, 0x14, 0x1c, 0xc8, 0xb0, 0x8b, + 0x6b, 0xa8, 0xe7, 0xc5, 0xbc, 0x7d, 0x6c, 0xbd, 0x70, 0x82, 0xd8, 0xb6, + 0x46, 0x04, 0xdc, 0x50, 0x2e, 0x87, 0x68, 0xb6, 0x2f, 0x4b, 0xea, 0x20, + 0xdc, 0x72, 0x4d, 0x34, 0x1c, 0x22, 0xfc, 0x55, 0x56, 0xc3, 0xc9, 0x73, + 0xf0, 0x59, 0x36, 0x9c, 0x3a, 0x0f, 0x8d, 0x2d, 0x93, 0x6f, 0x6a, 0x4a, + 0x4a, 0x0a, 0x89, 0x89, 0x5a, 0xf4, 0xeb, 0xd9, 0xb3, 0x67, 0x39, 0x70, + 0xe0, 0xc0, 0xa4, 0x04, 0xb0, 0xf1, 0xe6, 0x4c, 0x26, 0x93, 0x89, 0x79, + 0xf3, 0xe6, 0xb1, 0x60, 0xc1, 0x02, 0x62, 0x63, 0x63, 0x71, 0x75, 0x75, + 0xa5, 0xbb, 0xbb, 0x9b, 0xe2, 0xe2, 0x62, 0xce, 0x9c, 0x39, 0x43, 0x69, + 0x69, 0xa9, 0xd3, 0x2b, 0x6f, 0x70, 0x3f, 0x2e, 0x2e, 0x2e, 0x2c, 0x58, + 0xb0, 0xc0, 0xf9, 0x1d, 0x77, 0x77, 0x77, 0xba, 0xbb, 0xbb, 0xf9, 0xea, + 0xab, 0xaf, 0x28, 0x28, 0x28, 0xa0, 0xb8, 0xb8, 0xd8, 0x39, 0xcf, 0x1b, + 0x7a, 0xec, 0x45, 0x8b, 0x16, 0xb1, 0x70, 0xe1, 0x42, 0x62, 0x63, 0x63, + 0x31, 0x1a, 0x8d, 0x54, 0x55, 0x55, 0x71, 0xe1, 0xc2, 0x05, 0x64, 0x59, + 0x66, 0xc6, 0x8c, 0x19, 0x5c, 0xbd, 0x7a, 0x95, 0xf3, 0xe7, 0xcf, 0x8f, + 0x29, 0x24, 0x7a, 0x79, 0x79, 0x31, 0x77, 0xee, 0x5c, 0xd2, 0xd2, 0xd2, + 0x88, 0x89, 0x89, 0x41, 0x92, 0x24, 0x1a, 0x1a, 0x1a, 0x38, 0x7b, 0xf6, + 0x2c, 0x27, 0x4f, 0x9e, 0x1c, 0xf5, 0x39, 0x77, 0x23, 0x7d, 0x32, 0xe8, + 0xc1, 0x3a, 0x51, 0x04, 0xe2, 0xac, 0x59, 0xb3, 0x58, 0xb8, 0x70, 0x21, + 0xb3, 0x66, 0xcd, 0x22, 0x20, 0x20, 0x00, 0x9b, 0xcd, 0x46, 0x75, 0x75, + 0xb5, 0xb3, 0x1d, 0xa2, 0x28, 0x92, 0x9e, 0x9e, 0xce, 0xac, 0x59, 0xb3, + 0x68, 0x6d, 0x6d, 0xa5, 0xa0, 0xa0, 0x80, 0xaa, 0xaa, 0xaa, 0x61, 0xc7, + 0x0c, 0x0c, 0x0c, 0x24, 0x23, 0x23, 0x83, 0xe0, 0xe0, 0x60, 0xda, 0xda, + 0xda, 0xc8, 0xcd, 0xcd, 0xa5, 0xb9, 0xb9, 0x59, 0x8f, 0x38, 0xd4, 0xb9, + 0xfe, 0x4a, 0x1d, 0xa8, 0x9c, 0xeb, 0x0e, 0xd6, 0x3e, 0xa8, 0xaf, 0x44, + 0x55, 0xb5, 0x22, 0x1b, 0x88, 0x46, 0xf0, 0x0a, 0xb8, 0x85, 0xb1, 0x4f, + 0x00, 0x15, 0x94, 0x03, 0x1f, 0x6a, 0xfe, 0x7f, 0x83, 0xaa, 0x98, 0xa0, + 0x89, 0x4d, 0xc8, 0x76, 0x2d, 0x1a, 0xd0, 0xc3, 0x47, 0x13, 0xca, 0x8a, + 0x0b, 0x50, 0x2f, 0x9c, 0x1a, 0x88, 0x3a, 0x13, 0x86, 0xb7, 0x51, 0x10, + 0x34, 0x1f, 0x40, 0x37, 0x0f, 0x4d, 0x28, 0x6a, 0xaa, 0x41, 0xfd, 0xe8, + 0x4f, 0xe0, 0x1b, 0x84, 0xe0, 0xed, 0x8f, 0x6a, 0xeb, 0xd7, 0x52, 0x94, + 0xad, 0x7d, 0xda, 0xef, 0x71, 0x33, 0x69, 0xfb, 0x1e, 0xf0, 0xc4, 0x53, + 0x0f, 0xed, 0x42, 0xf6, 0xf0, 0x02, 0xff, 0x10, 0x2d, 0x0a, 0xae, 0xab, + 0x0d, 0x7a, 0xda, 0x35, 0x41, 0x6c, 0xb0, 0xc0, 0x86, 0xb9, 0x0b, 0xf5, + 0xd8, 0x1e, 0x4d, 0x9c, 0x34, 0x18, 0xb4, 0xa8, 0xba, 0x8e, 0x16, 0x94, + 0x5d, 0xff, 0xad, 0x45, 0xd5, 0x19, 0x5d, 0xc0, 0xe4, 0x87, 0x5a, 0x52, + 0x88, 0x7a, 0xf1, 0xcc, 0x40, 0xc4, 0x9f, 0x16, 0x79, 0xa7, 0xe6, 0x1e, + 0x40, 0x3d, 0xb1, 0x67, 0x94, 0xe4, 0x3e, 0x55, 0x3b, 0x9e, 0x41, 0xf3, + 0x30, 0xd4, 0x7e, 0x8b, 0x08, 0x76, 0x1b, 0xca, 0x07, 0x03, 0xfb, 0x15, + 0x45, 0x4d, 0xe0, 0x13, 0x07, 0x8a, 0x94, 0x18, 0x5c, 0xa1, 0xa5, 0x5e, + 0xeb, 0x37, 0x01, 0xed, 0x3c, 0x0c, 0x15, 0x00, 0x11, 0x40, 0x34, 0xa0, + 0x7c, 0xb1, 0x13, 0x14, 0x87, 0xd6, 0x2f, 0x06, 0xe3, 0xb5, 0xf4, 0x6c, + 0x41, 0x04, 0xbb, 0x15, 0x35, 0xe7, 0x20, 0x6a, 0xb6, 0x55, 0xeb, 0x07, + 0x17, 0x77, 0x6d, 0xbb, 0xc1, 0xbe, 0x94, 0x15, 0xd4, 0xfc, 0xa3, 0xc8, + 0xa7, 0x0e, 0x68, 0x9f, 0xbb, 0x6a, 0x51, 0x9a, 0xca, 0xc1, 0x5d, 0x9a, + 0xdf, 0xe0, 0x60, 0x9b, 0x06, 0x8f, 0xab, 0x82, 0x9a, 0x7f, 0x04, 0xf9, + 0xd4, 0x7e, 0x10, 0xa4, 0x81, 0x02, 0x27, 0x22, 0x48, 0x22, 0xea, 0x89, + 0x2f, 0x50, 0x8f, 0x0f, 0x1c, 0xd7, 0xc5, 0x4d, 0xeb, 0x7b, 0x45, 0xd1, + 0xce, 0xe7, 0xa5, 0x33, 0xe0, 0x17, 0x84, 0xe0, 0xe9, 0x83, 0x6a, 0xed, + 0xd7, 0x0a, 0x85, 0x28, 0x0e, 0x4d, 0x78, 0x16, 0xb5, 0xed, 0xd5, 0x8b, + 0x67, 0x50, 0xcf, 0xe7, 0x0c, 0x4c, 0xc4, 0x8c, 0xe0, 0x6a, 0xd2, 0x0e, + 0x68, 0xeb, 0x47, 0xd9, 0xb3, 0x53, 0x3b, 0x1e, 0xaa, 0xb6, 0x6f, 0x51, + 0xd2, 0x05, 0x40, 0x5d, 0x00, 0xfc, 0x86, 0x2f, 0xac, 0x4d, 0x26, 0x3a, + 0xda, 0xc7, 0x5f, 0xc8, 0x3a, 0x64, 0x99, 0x8e, 0xb6, 0xd6, 0x09, 0x05, + 0xab, 0xa9, 0x32, 0x32, 0xbe, 0x97, 0xf0, 0xf5, 0xf3, 0x63, 0xf9, 0xaa, + 0x55, 0x78, 0x79, 0x79, 0x21, 0x4f, 0xe2, 0x4d, 0xb3, 0x28, 0x49, 0x98, + 0x2d, 0x66, 0x72, 0x8f, 0x9f, 0xa0, 0xe5, 0x1b, 0xe2, 0x63, 0x73, 0x3b, + 0x59, 0xb0, 0x70, 0x21, 0xef, 0xbd, 0xfd, 0xf6, 0xf8, 0x02, 0x20, 0xd0, + 0xd4, 0xd8, 0xa8, 0x5f, 0x6c, 0xf7, 0x30, 0xde, 0xde, 0xde, 0x04, 0x06, + 0x05, 0x8d, 0xbb, 0x8d, 0x7f, 0x40, 0x00, 0x5e, 0xde, 0xde, 0x23, 0x22, + 0x14, 0xc2, 0xc3, 0x23, 0x46, 0x88, 0x4c, 0x9e, 0x5e, 0x9e, 0x44, 0x44, + 0x4c, 0x1b, 0x51, 0xcd, 0xd6, 0xdb, 0xc7, 0x07, 0x3f, 0x3f, 0xff, 0x71, + 0x8f, 0xe3, 0xe3, 0xed, 0x43, 0x68, 0x68, 0x18, 0x65, 0xa5, 0xa5, 0x77, + 0xa4, 0x2f, 0x7c, 0x7c, 0x7d, 0xf9, 0xeb, 0xff, 0xf1, 0xb7, 0x78, 0xfb, + 0xf8, 0x60, 0xf2, 0xbc, 0xb3, 0x29, 0xb4, 0x92, 0x64, 0x20, 0x7d, 0xf1, + 0x12, 0x16, 0x2e, 0x4a, 0xc7, 0x6c, 0x36, 0xd3, 0xdc, 0xd4, 0x44, 0x7d, + 0x5d, 0x2d, 0x45, 0x45, 0x17, 0x28, 0xc8, 0x3f, 0xc3, 0xd9, 0x2f, 0x0b, + 0x46, 0x4d, 0xe1, 0x57, 0x55, 0x95, 0xaf, 0x2e, 0x5f, 0xa6, 0xbe, 0xbe, + 0x8e, 0x84, 0x04, 0x3d, 0x75, 0x1f, 0x34, 0xaf, 0xdd, 0xd0, 0xd0, 0x30, + 0x9e, 0x78, 0xea, 0x69, 0x5e, 0xfc, 0xf6, 0x77, 0x26, 0x65, 0xc6, 0x1f, + 0x14, 0x14, 0xc4, 0xab, 0x3f, 0xfe, 0x29, 0x01, 0x01, 0x81, 0xb8, 0xba, + 0xba, 0xea, 0x9d, 0xa8, 0x33, 0xbe, 0x00, 0x38, 0xf8, 0x4f, 0x66, 0xec, + 0x14, 0x26, 0x71, 0xe0, 0x9f, 0x0c, 0x71, 0x4d, 0xf5, 0x3c, 0x7f, 0xea, + 0x00, 0x5b, 0xcf, 0x9d, 0x20, 0xae, 0xad, 0x01, 0x51, 0x55, 0x90, 0x45, + 0x11, 0xa1, 0xcb, 0x0d, 0x8a, 0x43, 0x50, 0x5d, 0x14, 0x04, 0xa1, 0x01, + 0xc2, 0x7b, 0xc1, 0x43, 0x05, 0x19, 0x1a, 0x1b, 0xe1, 0x5c, 0x29, 0xec, + 0x3d, 0x09, 0x27, 0xce, 0xc2, 0xe5, 0x0a, 0xb0, 0xdd, 0x58, 0xed, 0x0f, + 0x12, 0x13, 0x13, 0x09, 0x0c, 0x0c, 0xa4, 0xab, 0xab, 0x8b, 0xe2, 0xe2, + 0x62, 0xca, 0xcb, 0xcb, 0x47, 0xce, 0xad, 0x7c, 0x7d, 0x09, 0x0e, 0x0e, + 0xc6, 0xc5, 0xc5, 0x65, 0x84, 0x98, 0x24, 0x08, 0x02, 0x76, 0xbb, 0x9d, + 0xb6, 0xb6, 0x36, 0x5a, 0x5b, 0x5b, 0x09, 0x09, 0x09, 0x61, 0xc3, 0x86, + 0x0d, 0x6c, 0xd9, 0xb2, 0x85, 0xb4, 0xb4, 0x34, 0xfc, 0xfd, 0xfd, 0x9d, + 0xdb, 0xd4, 0xd6, 0xd6, 0x72, 0xfc, 0xf8, 0x71, 0x76, 0xed, 0xda, 0x45, + 0x5e, 0x5e, 0x1e, 0x16, 0x8b, 0x05, 0x41, 0x10, 0xf0, 0xf7, 0xf7, 0x67, + 0xfd, 0xfa, 0xf5, 0x3c, 0xf1, 0xc4, 0x13, 0xa4, 0xa4, 0xa4, 0x10, 0x10, + 0x10, 0x80, 0x24, 0x49, 0xd8, 0x6c, 0x36, 0xea, 0xeb, 0xeb, 0x39, 0x75, + 0xea, 0x14, 0xef, 0xbc, 0xf3, 0x0e, 0x39, 0x39, 0x39, 0x4e, 0x71, 0xd2, + 0xdb, 0xdb, 0x9b, 0x55, 0xab, 0x56, 0xf1, 0xe2, 0x8b, 0x2f, 0x32, 0x7f, + 0xfe, 0x7c, 0x02, 0x02, 0x02, 0x10, 0x45, 0x91, 0xd6, 0xd6, 0x56, 0xaa, + 0xaa, 0xaa, 0xe8, 0xee, 0xee, 0x26, 0x3e, 0x3e, 0x9e, 0x63, 0xc7, 0x8e, + 0xd1, 0xd0, 0xd0, 0x30, 0xe2, 0x25, 0xa8, 0x2c, 0xcb, 0x04, 0x06, 0x06, + 0xb2, 0x69, 0xd3, 0x26, 0xb6, 0x6c, 0xd9, 0x42, 0x6a, 0x6a, 0x2a, 0xfe, + 0xfe, 0xfe, 0xc8, 0xb2, 0x4c, 0x5f, 0x5f, 0x1f, 0x57, 0xae, 0x5c, 0xe1, + 0xad, 0xb7, 0xde, 0xe2, 0x2f, 0x7f, 0xf9, 0x0b, 0xad, 0xad, 0xad, 0x37, + 0x2c, 0xfc, 0xb9, 0xb8, 0xb8, 0x90, 0x9a, 0x9a, 0x4a, 0x46, 0x46, 0x06, + 0x92, 0x24, 0x51, 0x55, 0x55, 0x45, 0x4b, 0x4b, 0x0b, 0x76, 0xbb, 0xdd, + 0x39, 0x77, 0x1f, 0x14, 0x41, 0x17, 0x2d, 0x5a, 0xc4, 0x77, 0xbf, 0xfb, + 0x5d, 0x96, 0x2e, 0x5d, 0x4a, 0x78, 0x78, 0x38, 0x6e, 0x6e, 0x6e, 0x03, + 0x05, 0xb6, 0xba, 0xb8, 0x72, 0xe5, 0x0a, 0x6f, 0xbc, 0xf1, 0x06, 0xd9, + 0xd9, 0xd9, 0x24, 0x26, 0x26, 0xf2, 0xf2, 0xcb, 0x2f, 0x63, 0xb5, 0x5a, + 0x79, 0xfd, 0xf5, 0xd7, 0x79, 0xf3, 0xcd, 0x37, 0x9d, 0xbf, 0x4b, 0x10, + 0x04, 0xe6, 0xcf, 0x9f, 0xcf, 0xdf, 0xfc, 0xcd, 0xdf, 0x10, 0x1e, 0x1e, + 0xce, 0xbe, 0x7d, 0xfb, 0x28, 0x28, 0x28, 0xd0, 0xc5, 0xbf, 0xfb, 0x53, + 0xde, 0xc3, 0x3e, 0xf0, 0x82, 0xa1, 0x4b, 0x9d, 0xc0, 0x7c, 0x4a, 0x32, + 0xdc, 0x7c, 0x81, 0x8f, 0x71, 0x95, 0x03, 0x97, 0x01, 0xf1, 0xe9, 0xba, + 0x71, 0x11, 0x61, 0xb8, 0x98, 0x23, 0x49, 0x9a, 0x28, 0xa4, 0x8e, 0x31, + 0x8e, 0x22, 0x5c, 0xf3, 0xdc, 0x33, 0xba, 0x69, 0x42, 0x99, 0xb5, 0x1f, + 0xb5, 0xa9, 0x46, 0x13, 0x9f, 0x44, 0x23, 0x98, 0x06, 0x05, 0x2b, 0x75, + 0xe8, 0x02, 0x0f, 0x3c, 0xfd, 0x34, 0xb1, 0xad, 0xa5, 0xe1, 0x9a, 0x28, + 0xe7, 0xee, 0x3d, 0xfc, 0xf8, 0x82, 0xa0, 0x09, 0x50, 0x43, 0x53, 0x9d, + 0x25, 0xc3, 0xb5, 0x36, 0x0d, 0x7e, 0x26, 0x8a, 0x5a, 0xaa, 0x2c, 0x43, + 0x3e, 0x93, 0x06, 0xbe, 0x37, 0x56, 0xdb, 0x85, 0x41, 0xff, 0x87, 0x21, + 0x18, 0x8d, 0xa0, 0x1a, 0x07, 0x0a, 0x3d, 0x09, 0x23, 0x45, 0x43, 0x17, + 0x77, 0xed, 0x77, 0x8c, 0xf5, 0xcc, 0x30, 0x0c, 0xf9, 0xfe, 0x68, 0x1b, + 0x09, 0xa2, 0xd6, 0x4f, 0x02, 0x23, 0xab, 0x16, 0x0b, 0xc2, 0xb5, 0xf3, + 0x32, 0x28, 0xc8, 0x32, 0xf8, 0x99, 0x3a, 0xa4, 0xcd, 0x43, 0x9f, 0x51, + 0x06, 0x30, 0x4a, 0x23, 0xff, 0x36, 0x28, 0x6c, 0xaa, 0x5c, 0xeb, 0x7b, + 0x41, 0xb8, 0x26, 0xc2, 0x9a, 0x7b, 0xb4, 0x88, 0x41, 0x41, 0xd0, 0x84, + 0xc6, 0xeb, 0xdb, 0x22, 0x4a, 0xe0, 0x22, 0x0e, 0xe9, 0xcf, 0x6b, 0x85, + 0x52, 0x70, 0xf3, 0xbc, 0x76, 0x2e, 0x6f, 0x22, 0xa8, 0x47, 0x47, 0x17, + 0x00, 0xef, 0xbe, 0x85, 0xb5, 0xaf, 0x2f, 0xd4, 0x8c, 0xef, 0xcc, 0x2c, + 0xcb, 0x32, 0xad, 0x2d, 0xe3, 0xbf, 0xbe, 0xf5, 0xf0, 0x30, 0x11, 0x10, + 0x10, 0x80, 0xd9, 0x6c, 0x1e, 0x11, 0xf1, 0xe6, 0x70, 0x38, 0xbe, 0x56, + 0xbf, 0xac, 0xbb, 0x89, 0x80, 0xa0, 0x20, 0xbe, 0xf5, 0xf2, 0xcb, 0x84, + 0x45, 0x84, 0x23, 0x4f, 0xc2, 0x04, 0xc7, 0x20, 0x49, 0xd4, 0xd7, 0xd5, + 0x51, 0x55, 0x5e, 0xa1, 0x0b, 0x80, 0x40, 0x4c, 0x5c, 0x1c, 0xee, 0x1e, + 0x1e, 0x98, 0x7b, 0x7a, 0xc6, 0x9d, 0x34, 0x76, 0x77, 0x75, 0xea, 0x37, + 0xf3, 0x3d, 0x8c, 0xaf, 0xaf, 0xdf, 0x84, 0x91, 0xb9, 0xf1, 0x09, 0x89, + 0x3c, 0xf4, 0xf0, 0x46, 0xde, 0x79, 0xfb, 0x2d, 0x67, 0x64, 0x85, 0xb7, + 0xb7, 0x37, 0x6b, 0xd7, 0x6d, 0x18, 0x51, 0x0d, 0xd8, 0xcf, 0xcf, 0x9f, + 0x87, 0x37, 0x3e, 0xc2, 0x57, 0x97, 0x8b, 0xe9, 0xee, 0xee, 0x1e, 0x98, + 0xf3, 0x49, 0x3c, 0xbc, 0xf1, 0x11, 0xe2, 0x13, 0x12, 0xc6, 0x3d, 0x8e, + 0xd1, 0xc5, 0x85, 0xa0, 0xe0, 0xe0, 0x3b, 0xda, 0x1f, 0xae, 0xae, 0xae, + 0x7c, 0xe7, 0xe5, 0xef, 0x8d, 0xeb, 0x8f, 0x39, 0x5a, 0x65, 0xd9, 0xa1, + 0x0b, 0xe4, 0xa9, 0x40, 0x96, 0x65, 0x24, 0x49, 0x42, 0x14, 0x45, 0xbc, + 0xbd, 0xbd, 0xf1, 0xf6, 0xf6, 0x66, 0x46, 0x7c, 0x3c, 0xcb, 0x1e, 0x58, + 0x41, 0x77, 0x77, 0x37, 0x7b, 0xbe, 0xf8, 0x8c, 0xdf, 0xff, 0xee, 0xb7, + 0xa3, 0x0a, 0xf4, 0x3d, 0x3d, 0x3d, 0xb4, 0xb5, 0xb6, 0xc2, 0x04, 0x02, + 0xe0, 0xbd, 0xb0, 0x58, 0x1c, 0xec, 0x23, 0xbb, 0xdd, 0x3e, 0xa6, 0xf8, + 0xb7, 0x6c, 0xf9, 0x0a, 0xbe, 0xf7, 0xfd, 0x1f, 0x90, 0xb2, 0x20, 0xd5, + 0x59, 0xcc, 0x6a, 0x32, 0x98, 0x4c, 0x9e, 0x7c, 0xe7, 0xbb, 0xaf, 0xe0, + 0xb0, 0x8f, 0xad, 0xb2, 0xc8, 0xf7, 0xe9, 0xf3, 0x57, 0x67, 0x14, 0x01, + 0x70, 0x68, 0x04, 0xe0, 0x58, 0x02, 0xa0, 0x0c, 0x71, 0x2d, 0xf5, 0x6c, + 0xcb, 0xcb, 0xe2, 0xe9, 0x33, 0x47, 0x89, 0x6d, 0x6b, 0x42, 0x40, 0xc5, + 0x21, 0x4a, 0x08, 0xa8, 0xa0, 0x0a, 0xd0, 0xe9, 0x86, 0x70, 0x3e, 0x4c, + 0x4b, 0x23, 0x13, 0x1b, 0xe8, 0xf4, 0xb6, 0x70, 0xb9, 0x56, 0xe5, 0x68, + 0x01, 0xec, 0x3b, 0x05, 0x5f, 0x16, 0x43, 0xdf, 0x4d, 0x64, 0x8b, 0xba, + 0xb8, 0xb8, 0x10, 0x12, 0x12, 0x82, 0x87, 0x87, 0x07, 0x2d, 0x2d, 0x2d, + 0x34, 0x36, 0x36, 0x8e, 0x3a, 0x06, 0xcc, 0x9e, 0x3d, 0x9b, 0x47, 0x1f, + 0x7d, 0x94, 0xb0, 0xb0, 0xb0, 0x61, 0x91, 0x74, 0xaa, 0xaa, 0x22, 0x49, + 0x12, 0xed, 0xed, 0xed, 0x1c, 0x3b, 0x76, 0x8c, 0x7d, 0xfb, 0xf6, 0xb1, + 0x71, 0xe3, 0x46, 0x5e, 0x79, 0xe5, 0x15, 0xe6, 0xcf, 0x9f, 0x4f, 0x77, + 0x77, 0x37, 0x45, 0x45, 0x45, 0x74, 0x75, 0x75, 0x11, 0x1a, 0x1a, 0x4a, + 0x42, 0x42, 0x02, 0xb1, 0xb1, 0xb1, 0x04, 0x06, 0x06, 0x22, 0xcb, 0x32, + 0xd9, 0xd9, 0xd9, 0x78, 0x78, 0x78, 0xf0, 0xe0, 0x83, 0x0f, 0xf2, 0xea, + 0xab, 0xaf, 0x92, 0x9a, 0x9a, 0x4a, 0x67, 0x67, 0x27, 0x97, 0x2e, 0x5d, + 0xa2, 0xa7, 0xa7, 0x87, 0xa0, 0xa0, 0x20, 0xe2, 0xe2, 0xe2, 0x78, 0xfe, + 0xf9, 0xe7, 0x09, 0x0c, 0x0c, 0xc4, 0x6e, 0xb7, 0x73, 0xe2, 0xc4, 0x09, + 0xdc, 0xdc, 0xdc, 0x78, 0xe0, 0x81, 0x07, 0xf8, 0xc5, 0x2f, 0x7e, 0x41, + 0x7a, 0x7a, 0x3a, 0xed, 0xed, 0xed, 0x5c, 0xbc, 0x78, 0x11, 0x8b, 0xc5, + 0x42, 0x70, 0x70, 0x30, 0x69, 0x69, 0x69, 0xb8, 0xbb, 0x6b, 0xd1, 0x2d, + 0x35, 0x35, 0x35, 0xb8, 0xbb, 0xbb, 0x8f, 0xf8, 0x5d, 0x2e, 0x2e, 0x2e, + 0x3c, 0xf4, 0xd0, 0x43, 0x7c, 0xff, 0xfb, 0xdf, 0x27, 0x25, 0x25, 0x85, + 0xce, 0xce, 0x4e, 0xce, 0x9e, 0x3d, 0x4b, 0x7b, 0x7b, 0x3b, 0xd3, 0xa7, + 0x4f, 0x27, 0x33, 0x33, 0x13, 0x5f, 0x5f, 0x5f, 0x14, 0x45, 0xe1, 0xbd, + 0xf7, 0xde, 0x1b, 0x77, 0xfc, 0xf7, 0xf7, 0xf7, 0x67, 0xc5, 0x8a, 0x15, + 0x24, 0x26, 0x26, 0x3a, 0x33, 0x4a, 0xa2, 0xa2, 0xa2, 0x58, 0xb7, 0x6e, + 0x1d, 0x4b, 0x96, 0x2c, 0xa1, 0xab, 0xab, 0x8b, 0xac, 0xac, 0x2c, 0x6a, + 0x6b, 0x6b, 0x47, 0xbc, 0xbc, 0xf7, 0xf0, 0xf0, 0x60, 0xfd, 0xfa, 0xf5, + 0x3c, 0xf6, 0xd8, 0x63, 0xb8, 0xb9, 0xb9, 0x51, 0x52, 0x52, 0x42, 0x5d, + 0x5d, 0x1d, 0x6e, 0x6e, 0x6e, 0x24, 0x24, 0x24, 0xb0, 0x7c, 0xf9, 0x72, + 0xfc, 0xfc, 0xfc, 0xe8, 0xec, 0xec, 0xc4, 0x6c, 0x36, 0x63, 0x30, 0x18, + 0x48, 0x49, 0x49, 0xa1, 0xb6, 0xb6, 0x96, 0xcf, 0x3f, 0xff, 0xdc, 0x59, + 0x84, 0x25, 0x38, 0x38, 0x98, 0xcc, 0xcc, 0x4c, 0x56, 0xad, 0x5a, 0x85, + 0xd5, 0x6a, 0xa5, 0xa1, 0xa1, 0xc1, 0xf9, 0xbc, 0xd5, 0xb9, 0xbf, 0x10, + 0x05, 0x08, 0x36, 0xc2, 0x52, 0x37, 0x81, 0x30, 0x23, 0x18, 0xef, 0x84, + 0x86, 0x32, 0x42, 0xe0, 0x1a, 0x67, 0xb0, 0x14, 0x84, 0xc9, 0xfb, 0xbc, + 0x09, 0xc2, 0x8d, 0x89, 0x96, 0x83, 0x1e, 0x79, 0x37, 0xda, 0xd6, 0xa1, + 0x29, 0xbd, 0x8c, 0x22, 0x5c, 0x3a, 0x85, 0x2b, 0xe1, 0xc6, 0x3c, 0xea, + 0x46, 0xec, 0xf7, 0x06, 0xfb, 0xed, 0x96, 0xbf, 0x3f, 0xc6, 0xef, 0x18, + 0xeb, 0x3b, 0x63, 0xfd, 0x6d, 0xbc, 0xdf, 0x3e, 0x28, 0xaa, 0x4e, 0xd4, + 0xe7, 0x08, 0xb7, 0x78, 0xed, 0xe8, 0xdc, 0x6e, 0x74, 0x01, 0x70, 0x8a, + 0x08, 0x0c, 0x9c, 0xb8, 0xb0, 0x85, 0x22, 0xcb, 0x34, 0xd4, 0x8f, 0xef, + 0x9f, 0x97, 0x30, 0x73, 0x26, 0xff, 0xf4, 0xef, 0xff, 0x4e, 0x7f, 0x5f, + 0x9f, 0x73, 0x22, 0x31, 0x58, 0x55, 0xf7, 0xfd, 0x1d, 0x3b, 0xc8, 0x3d, + 0x71, 0xe2, 0xbe, 0x8c, 0x0e, 0xd4, 0x22, 0xb3, 0x5d, 0x90, 0x24, 0x03, + 0x93, 0x5d, 0xd3, 0x0d, 0xfa, 0xc6, 0xe8, 0x68, 0x95, 0x30, 0x7d, 0xbc, + 0x7d, 0x26, 0x14, 0x43, 0xfb, 0x2c, 0x7d, 0x7a, 0x67, 0xdd, 0xc3, 0xf8, + 0xf8, 0xf8, 0xe0, 0x36, 0xf8, 0xa6, 0x73, 0x1c, 0x51, 0xec, 0xbb, 0xaf, + 0xfc, 0x15, 0x7e, 0x7e, 0xfe, 0xe4, 0x9f, 0x39, 0x8d, 0xbb, 0x87, 0x07, + 0xab, 0x56, 0xaf, 0xe1, 0xd1, 0xc7, 0xb6, 0x8e, 0xba, 0xfd, 0x93, 0x4f, + 0x3f, 0x8d, 0xc1, 0x68, 0xe0, 0x68, 0xd6, 0x61, 0xfa, 0xfa, 0xfa, 0x48, + 0x5f, 0xbc, 0x84, 0x27, 0x9e, 0xda, 0x36, 0x61, 0xe4, 0x95, 0x24, 0x49, + 0x04, 0x06, 0x06, 0xdd, 0x15, 0xa2, 0xd2, 0x58, 0xe9, 0xb3, 0xb2, 0x2c, + 0xd3, 0xd8, 0xd0, 0x38, 0xc6, 0x98, 0x24, 0x8c, 0x59, 0xe4, 0xe4, 0x46, + 0x68, 0x6c, 0x6c, 0xa0, 0x20, 0xff, 0x0c, 0xe9, 0x8b, 0x33, 0x08, 0xba, + 0x2e, 0x3a, 0x53, 0x10, 0x04, 0x7c, 0x7c, 0x7c, 0x78, 0x7a, 0xdb, 0xb3, + 0x14, 0x5f, 0xba, 0xc4, 0x87, 0xef, 0xbf, 0x3b, 0xe2, 0xfb, 0x0e, 0x87, + 0xdd, 0x19, 0xad, 0xa9, 0x59, 0x51, 0x8c, 0x1c, 0xf3, 0x54, 0x55, 0xa5, + 0xa3, 0x63, 0xec, 0x94, 0x6c, 0xb3, 0xd9, 0xcc, 0xe9, 0xbc, 0x53, 0xcc, + 0x9c, 0x35, 0x9b, 0x88, 0x88, 0x88, 0x51, 0x16, 0x1d, 0xe2, 0x98, 0xe7, + 0xd3, 0x66, 0xb3, 0xd2, 0xd9, 0x39, 0xfe, 0x8b, 0x83, 0x8e, 0x8e, 0xf6, + 0x51, 0xfd, 0xbb, 0x06, 0x17, 0xeb, 0x93, 0x19, 0xa6, 0x05, 0x41, 0x60, + 0xe5, 0xaa, 0xd5, 0xa4, 0x2c, 0x48, 0xe5, 0xc3, 0xf7, 0xdf, 0xa3, 0xba, + 0xba, 0x6a, 0xe4, 0x33, 0x56, 0x51, 0xb0, 0x58, 0xcc, 0xb8, 0xba, 0xba, + 0xde, 0x90, 0xf8, 0x37, 0xf4, 0x99, 0x31, 0xf6, 0xef, 0xb4, 0x8d, 0x9a, + 0xee, 0x3e, 0x95, 0xd7, 0x7d, 0xac, 0x40, 0xae, 0x00, 0x00, 0x20, 0x00, + 0x49, 0x44, 0x41, 0x54, 0x82, 0xce, 0x37, 0x4c, 0x08, 0x64, 0x0c, 0x11, + 0x70, 0x40, 0x20, 0x8c, 0x6d, 0x6e, 0xe0, 0x89, 0xbc, 0x6c, 0x9e, 0x3f, + 0x79, 0x88, 0xe8, 0xb6, 0x26, 0x54, 0x11, 0x1c, 0x82, 0x84, 0xa0, 0x0e, + 0x54, 0x0e, 0x11, 0x54, 0x2d, 0xab, 0xae, 0xc3, 0x9d, 0xde, 0xfc, 0x20, + 0x6a, 0x7b, 0x7b, 0x39, 0xa6, 0xf6, 0xf3, 0xe9, 0x79, 0x07, 0x39, 0xe7, + 0xa0, 0xab, 0xe7, 0x16, 0x84, 0x02, 0x51, 0x44, 0x92, 0x24, 0xe7, 0xfc, + 0x71, 0xa8, 0xa7, 0xeb, 0x50, 0xe2, 0xe2, 0xe2, 0xd8, 0xbc, 0x79, 0x33, + 0xf1, 0xf1, 0xf1, 0x63, 0xdc, 0xbb, 0x1d, 0xa8, 0xaa, 0x4a, 0x79, 0x79, + 0x39, 0xdb, 0xb7, 0x6f, 0x27, 0x2d, 0x2d, 0x8d, 0xb2, 0xb2, 0x32, 0x3e, + 0xf8, 0xe0, 0x03, 0xf6, 0xed, 0xdb, 0x47, 0x5b, 0x5b, 0x1b, 0x89, 0x89, + 0x89, 0x3c, 0xf9, 0xe4, 0x93, 0x6c, 0xde, 0xbc, 0x99, 0xf5, 0xeb, 0xd7, + 0x53, 0x51, 0x51, 0x41, 0x49, 0x49, 0x09, 0x5e, 0x5e, 0x5e, 0x7c, 0xeb, + 0x5b, 0xdf, 0x22, 0x35, 0x35, 0x95, 0xfa, 0xfa, 0x7a, 0xde, 0x79, 0xe7, + 0x1d, 0xf6, 0xec, 0xd9, 0x43, 0x6b, 0x6b, 0x2b, 0xd3, 0xa7, 0x4f, 0x67, + 0xd3, 0xa6, 0x4d, 0x3c, 0xfb, 0xec, 0xb3, 0x3c, 0xf4, 0xd0, 0x43, 0x94, + 0x95, 0x95, 0x51, 0x59, 0x59, 0x89, 0x87, 0x87, 0x07, 0xcf, 0x3f, 0xff, + 0x3c, 0xe9, 0xe9, 0xe9, 0xb4, 0xb6, 0xb6, 0xf2, 0xc7, 0x3f, 0xfe, 0x91, + 0x03, 0x07, 0x0e, 0xd0, 0xd6, 0xd6, 0x46, 0x7c, 0x7c, 0x3c, 0x5b, 0xb7, + 0x6e, 0xe5, 0xc9, 0x27, 0x9f, 0xc4, 0x68, 0x34, 0x62, 0xb7, 0xdb, 0x87, + 0x89, 0x7f, 0x83, 0x51, 0x77, 0x31, 0x31, 0x31, 0x6c, 0xdd, 0xba, 0x95, + 0xd4, 0xd4, 0x54, 0x2a, 0x2b, 0x2b, 0x79, 0xf7, 0xdd, 0x77, 0xd9, 0xb3, + 0x67, 0x0f, 0xbd, 0xbd, 0xbd, 0xac, 0x5e, 0xbd, 0x9a, 0x57, 0x5f, 0x7d, + 0x95, 0xe4, 0xe4, 0x64, 0x9e, 0x7e, 0xfa, 0x69, 0x4a, 0x4b, 0x4b, 0x39, + 0x71, 0xe2, 0xc4, 0xa8, 0x63, 0xe6, 0x60, 0xff, 0xfc, 0xf2, 0x97, 0xbf, + 0x74, 0xfe, 0x7f, 0x51, 0x14, 0xf1, 0xf5, 0xf5, 0xc5, 0xd7, 0xd7, 0x97, + 0xee, 0xee, 0x6e, 0x8e, 0x1c, 0x39, 0xc2, 0x27, 0x9f, 0x7c, 0x42, 0x7b, + 0x7b, 0xfb, 0x88, 0xe8, 0x3f, 0x83, 0xc1, 0x40, 0x7d, 0x7d, 0x3d, 0xb9, + 0xb9, 0xb9, 0xb4, 0xb5, 0xb5, 0x91, 0x9d, 0x9d, 0xcd, 0xe5, 0xcb, 0x97, + 0x31, 0x99, 0x4c, 0x64, 0x66, 0x66, 0xf2, 0x83, 0x1f, 0xfc, 0x80, 0x39, + 0x73, 0xe6, 0xb0, 0x7a, 0xf5, 0x6a, 0xf6, 0xed, 0xdb, 0xc7, 0xa1, 0x43, + 0x87, 0x98, 0x33, 0x67, 0x0e, 0x69, 0x69, 0x69, 0xcc, 0x9d, 0x3b, 0x97, + 0x63, 0xc7, 0x8e, 0x61, 0xb3, 0xd9, 0x98, 0x3e, 0x7d, 0x3a, 0x0b, 0x07, + 0x3c, 0xb9, 0x0b, 0x0b, 0x0b, 0x39, 0x70, 0xe0, 0xc0, 0x37, 0xa6, 0x40, + 0x8b, 0xce, 0xd4, 0xa1, 0xa8, 0x60, 0x92, 0x04, 0xd6, 0x05, 0x1b, 0x58, + 0xe2, 0x0b, 0x06, 0x11, 0x42, 0x5d, 0x45, 0x5d, 0x4f, 0xd1, 0xd1, 0xd1, + 0xb9, 0x61, 0x74, 0x01, 0x70, 0x8a, 0x08, 0x0d, 0x0f, 0x9f, 0x70, 0x1b, + 0x59, 0x96, 0x69, 0xa8, 0xaf, 0xa3, 0xaf, 0xb7, 0x17, 0x77, 0x0f, 0x8f, + 0x51, 0xb7, 0x31, 0x79, 0x7a, 0xb2, 0xe0, 0xba, 0xe2, 0x1b, 0x83, 0x13, + 0x8a, 0x63, 0x47, 0x8e, 0xde, 0xdf, 0x9d, 0x7c, 0x83, 0x11, 0x2c, 0x7a, + 0x7a, 0xc4, 0x90, 0x85, 0xad, 0xc1, 0x80, 0x8b, 0xdb, 0xc4, 0xa9, 0x6d, + 0x2a, 0x7a, 0x9f, 0xdd, 0xb3, 0xeb, 0x55, 0x41, 0xc0, 0xcb, 0xcb, 0x0b, + 0xe3, 0x24, 0x84, 0x8a, 0xa0, 0xa0, 0x20, 0xbe, 0xff, 0x57, 0x3f, 0xe2, + 0x5b, 0x2f, 0x7d, 0x1b, 0x41, 0x10, 0x9d, 0x11, 0x17, 0xa3, 0x21, 0x49, + 0x06, 0x9e, 0x78, 0xf2, 0x69, 0x36, 0x6e, 0xda, 0x8c, 0xaa, 0x2a, 0x93, + 0xae, 0x48, 0x2b, 0x08, 0x02, 0xde, 0x3e, 0x3e, 0x88, 0xa2, 0x38, 0xe6, + 0xe2, 0xf4, 0x4e, 0x62, 0xb7, 0xdb, 0xd9, 0xbf, 0x6f, 0x0f, 0x79, 0x79, + 0xb9, 0x63, 0xfc, 0x6e, 0x69, 0x98, 0x1f, 0xe2, 0xcd, 0x50, 0x5d, 0x5d, + 0xc5, 0xef, 0x7f, 0xf7, 0x5b, 0x3e, 0xfd, 0xe4, 0x63, 0x36, 0x6d, 0xde, + 0xc2, 0x53, 0x4f, 0x3f, 0x43, 0xca, 0x82, 0xd4, 0x11, 0xd1, 0xdf, 0xfd, + 0xfd, 0x7d, 0x98, 0xcd, 0xa3, 0xab, 0x01, 0xa2, 0x24, 0x39, 0x45, 0x2b, + 0x7f, 0xff, 0x00, 0x24, 0x49, 0xe4, 0x7a, 0x4b, 0x2c, 0x55, 0x55, 0xc9, + 0x3f, 0x9d, 0x47, 0xde, 0xa9, 0x5c, 0x16, 0x2f, 0xc9, 0x18, 0x21, 0x6c, + 0xbd, 0xfb, 0xce, 0x0e, 0xfe, 0xf3, 0x3f, 0xfe, 0x8d, 0x84, 0xc4, 0x99, + 0xac, 0x79, 0x70, 0x2d, 0x2b, 0x57, 0xad, 0x26, 0x21, 0x71, 0xa6, 0x73, + 0x41, 0xeb, 0xea, 0xe6, 0x86, 0x9f, 0x9f, 0xdf, 0xa8, 0xc7, 0x6f, 0x6f, + 0x6f, 0x67, 0xdf, 0x9e, 0x2f, 0x88, 0x9b, 0x3e, 0x03, 0x6f, 0x6f, 0xef, + 0x11, 0x7f, 0x6f, 0x69, 0x69, 0xe1, 0xc0, 0xfe, 0xbd, 0xf4, 0xf4, 0x8c, + 0xde, 0xfe, 0x80, 0x80, 0x00, 0x0c, 0x93, 0x34, 0x24, 0x9f, 0x11, 0x9f, + 0xc0, 0xb7, 0x5f, 0xfe, 0x1e, 0x46, 0xa3, 0x0b, 0xff, 0xfa, 0xeb, 0x5f, + 0x8d, 0x6a, 0xa4, 0xff, 0x65, 0x41, 0x3e, 0x6f, 0xfd, 0xf9, 0x0d, 0x7e, + 0xfe, 0xcb, 0xbf, 0x9b, 0xb2, 0x08, 0x53, 0xab, 0xd5, 0xca, 0x67, 0x7f, + 0xf9, 0x98, 0xfc, 0x33, 0xa7, 0xc7, 0xbc, 0x16, 0xbc, 0xbd, 0x7d, 0xf4, + 0x41, 0xe6, 0xbe, 0x19, 0x4c, 0xaf, 0xbf, 0x09, 0xb9, 0x26, 0x02, 0x0e, + 0xfc, 0x2d, 0xb6, 0xbe, 0x81, 0xa7, 0x73, 0x8f, 0xf0, 0xfc, 0xf1, 0x83, + 0x44, 0xb5, 0x36, 0xa1, 0x88, 0x22, 0x02, 0xaa, 0xa6, 0x0d, 0x0e, 0xa6, + 0x45, 0xa9, 0x02, 0x36, 0x55, 0xa1, 0x43, 0xb6, 0x72, 0xa4, 0xb2, 0x9b, + 0x4f, 0x8b, 0xfb, 0xc9, 0xee, 0x54, 0x69, 0xe9, 0x9d, 0x9a, 0x6b, 0xb6, + 0xad, 0xad, 0x8d, 0xfe, 0xfe, 0x7e, 0x3c, 0x3d, 0x3d, 0x09, 0x18, 0xa3, + 0x50, 0x58, 0x73, 0x73, 0x33, 0x05, 0x05, 0x05, 0x74, 0x74, 0x74, 0x38, + 0x33, 0x4c, 0x64, 0x59, 0x66, 0xda, 0xb4, 0x69, 0x44, 0x47, 0x47, 0x63, + 0xb5, 0x5a, 0x31, 0x1a, 0x8d, 0x64, 0x64, 0x64, 0x90, 0x96, 0x96, 0x86, + 0xcd, 0x66, 0x63, 0xd7, 0xae, 0x5d, 0xfc, 0xe1, 0x0f, 0x7f, 0xa0, 0x76, + 0xc0, 0xfa, 0xe1, 0xab, 0xaf, 0xbe, 0xa2, 0xb1, 0xb1, 0x91, 0xf0, 0xf0, + 0x70, 0x56, 0xac, 0x58, 0xc1, 0xa2, 0x45, 0x8b, 0x48, 0x4f, 0x4f, 0x47, + 0x92, 0x24, 0x32, 0x32, 0x32, 0x90, 0x65, 0x99, 0x9d, 0x3b, 0x77, 0xf2, + 0x9b, 0xdf, 0xfc, 0x86, 0xfa, 0x81, 0x97, 0xe0, 0x97, 0x2f, 0x5f, 0xa6, + 0xb2, 0xb2, 0xd2, 0x19, 0x4d, 0xb7, 0x78, 0xf1, 0x62, 0x52, 0x52, 0x52, + 0x30, 0x18, 0x0c, 0x2c, 0x5d, 0xba, 0x14, 0xbb, 0xdd, 0xce, 0xbb, 0xef, + 0xbe, 0xcb, 0xbf, 0xfd, 0xdb, 0xbf, 0xd1, 0x32, 0x90, 0x39, 0x73, 0xf9, + 0xf2, 0x65, 0x5a, 0x5b, 0x5b, 0x99, 0x31, 0x63, 0x06, 0xe9, 0xe9, 0xe9, + 0x23, 0x5e, 0xf0, 0x0e, 0x46, 0x2d, 0xa6, 0xa5, 0xa5, 0x91, 0x9a, 0x9a, + 0x8a, 0xaa, 0xaa, 0x1c, 0x38, 0x70, 0x80, 0x1d, 0x3b, 0x76, 0xd0, 0xd9, + 0xd9, 0x49, 0x66, 0x66, 0x26, 0xd1, 0xd1, 0xd1, 0xce, 0x97, 0x03, 0x83, + 0x51, 0x88, 0xa3, 0x09, 0x80, 0xce, 0x45, 0x92, 0xc1, 0x40, 0x44, 0x44, + 0x84, 0x73, 0x3e, 0x39, 0x98, 0xf2, 0x7c, 0xf9, 0xf2, 0x65, 0xb2, 0xb2, + 0xb2, 0xf8, 0xf0, 0xc3, 0x0f, 0xc9, 0xcb, 0xcb, 0xd3, 0x2e, 0x83, 0x81, + 0x71, 0x7b, 0xb0, 0x5d, 0x5d, 0x5d, 0x5d, 0xfc, 0xf1, 0x8f, 0x7f, 0xe4, + 0xf4, 0xe9, 0xd3, 0xc4, 0xc5, 0xc5, 0x11, 0x14, 0x14, 0xc4, 0xe2, 0xc5, + 0x8b, 0xb1, 0x5a, 0xad, 0x94, 0x95, 0x95, 0x71, 0xfe, 0xfc, 0x79, 0xd6, + 0xac, 0x59, 0x43, 0x42, 0x42, 0x02, 0x9f, 0x7c, 0xf2, 0x09, 0xd9, 0xd9, + 0xd9, 0x3c, 0xfe, 0xf8, 0xe3, 0x44, 0x44, 0x44, 0xb0, 0x72, 0xe5, 0x4a, + 0xbe, 0xfc, 0xf2, 0x4b, 0xda, 0xdb, 0xdb, 0x49, 0x4a, 0x4a, 0x62, 0xee, + 0xdc, 0xb9, 0x58, 0x2c, 0x16, 0xb2, 0xb3, 0xb3, 0x29, 0x29, 0x29, 0x99, + 0x74, 0x01, 0x15, 0x9d, 0x7b, 0x07, 0x59, 0x05, 0x4f, 0x83, 0xc0, 0x03, + 0x41, 0xc6, 0x41, 0x3b, 0x3e, 0x14, 0x55, 0xfb, 0x5c, 0x47, 0x47, 0x47, + 0xe7, 0x46, 0xd0, 0x05, 0xc0, 0x29, 0x22, 0x32, 0x3a, 0xca, 0xf9, 0xd6, + 0x6f, 0x3c, 0x41, 0xaa, 0xb9, 0xbe, 0x91, 0x9a, 0xea, 0x6a, 0x12, 0x66, + 0xcd, 0xba, 0x31, 0x31, 0x4b, 0x51, 0x41, 0x17, 0x67, 0x74, 0xa6, 0x70, + 0xcd, 0x32, 0xba, 0x28, 0xa3, 0x7b, 0x32, 0xdc, 0xcb, 0xb8, 0xb9, 0xbb, + 0x8f, 0x3a, 0x46, 0xf5, 0xf5, 0xf6, 0x52, 0x53, 0x5b, 0x43, 0xe4, 0xb4, + 0x48, 0xe7, 0xcb, 0x09, 0x41, 0x10, 0x26, 0x2d, 0xe6, 0x01, 0xa3, 0x8a, + 0x84, 0xaa, 0xaa, 0x52, 0x5e, 0x56, 0x86, 0xaf, 0x9f, 0x1f, 0x01, 0x01, + 0x01, 0x23, 0x8e, 0xed, 0x31, 0x46, 0x7b, 0x6e, 0x07, 0x17, 0x0a, 0xcf, + 0x53, 0x90, 0x7f, 0x66, 0xc2, 0x17, 0x03, 0xaa, 0xaa, 0xd2, 0xd7, 0xd7, + 0x47, 0x45, 0x45, 0x39, 0x67, 0xf2, 0x4e, 0x39, 0x17, 0x9f, 0xd7, 0xe3, + 0xe3, 0xeb, 0x4b, 0x44, 0x44, 0xe4, 0x4d, 0xb7, 0xa7, 0xa4, 0xe4, 0x0a, + 0xff, 0xf5, 0x9f, 0xff, 0xc1, 0xbe, 0x3d, 0x5f, 0xa0, 0xaa, 0x2a, 0x9f, + 0x7e, 0xf2, 0x31, 0x05, 0xf9, 0x67, 0x58, 0xb9, 0x6a, 0x0d, 0xa9, 0x69, + 0x0b, 0x89, 0x8e, 0x8e, 0xc1, 0xe8, 0x62, 0xa4, 0xa9, 0xb1, 0x91, 0x63, + 0xd9, 0x47, 0x38, 0x7c, 0xf0, 0xc0, 0xa8, 0xfb, 0xf1, 0xf2, 0xf2, 0x72, + 0x46, 0x0e, 0x46, 0x46, 0x45, 0xe1, 0xed, 0xed, 0x3d, 0xaa, 0xaf, 0x55, + 0x49, 0xc9, 0x15, 0xfe, 0xe5, 0x57, 0xff, 0xc4, 0xc6, 0x47, 0x36, 0x33, + 0x7f, 0x7e, 0x0a, 0x1e, 0x1e, 0x1e, 0xd4, 0xd5, 0xd5, 0x71, 0xe2, 0x58, + 0x36, 0x1f, 0x7f, 0xbc, 0x9b, 0xfe, 0xfe, 0x7e, 0x2e, 0x14, 0x9e, 0xe7, + 0xd2, 0xc5, 0x22, 0x3e, 0xf9, 0xf8, 0x23, 0xd6, 0xae, 0x5d, 0xc7, 0xaa, + 0x35, 0x0f, 0x32, 0x3f, 0x65, 0x01, 0x2e, 0x2e, 0x2e, 0xcc, 0x9c, 0x35, + 0x9b, 0xec, 0xa3, 0x47, 0x46, 0x88, 0xb5, 0x8a, 0xa2, 0xb0, 0xe3, 0xed, + 0x37, 0x69, 0x6b, 0x6b, 0x63, 0xc5, 0xaa, 0x55, 0x24, 0x24, 0x24, 0xe2, + 0xe6, 0xee, 0x4e, 0xaf, 0xc5, 0xc2, 0x57, 0x97, 0x2f, 0x73, 0xf8, 0xd0, + 0x41, 0xb2, 0x0e, 0x1f, 0x1c, 0xb5, 0xdf, 0x45, 0x51, 0x64, 0xe6, 0xac, + 0xd9, 0x37, 0xec, 0xbb, 0xf7, 0xd4, 0xb6, 0x67, 0xa8, 0xae, 0xaa, 0xe4, + 0xdd, 0x9d, 0x3b, 0x46, 0xec, 0x57, 0x55, 0x55, 0xbe, 0xf8, 0xfc, 0x53, + 0xc2, 0xc2, 0xc2, 0xf8, 0xeb, 0x57, 0x7f, 0x3c, 0x22, 0xa2, 0x4f, 0x55, + 0x55, 0xf2, 0xcf, 0x9c, 0xa6, 0xe8, 0x42, 0xe1, 0xc4, 0xcf, 0x5d, 0x55, + 0xc5, 0x62, 0xb1, 0x50, 0x5e, 0x56, 0xca, 0xa9, 0x53, 0xb9, 0x74, 0x75, + 0x75, 0x8d, 0xba, 0x9d, 0xaf, 0xaf, 0x1f, 0x11, 0xd3, 0xa6, 0xe9, 0x03, + 0xcc, 0xfd, 0xfc, 0x40, 0x1d, 0x14, 0x01, 0x0d, 0x10, 0x7b, 0xb5, 0x9e, + 0xe7, 0x8e, 0x1d, 0xe2, 0xc9, 0x9c, 0x6c, 0x22, 0x5b, 0x9a, 0x9c, 0x29, + 0xbf, 0x82, 0x2a, 0x20, 0xa0, 0x6a, 0xf6, 0x80, 0x82, 0x48, 0xb7, 0x6c, + 0xe3, 0x58, 0x4f, 0x3b, 0x9f, 0xb5, 0x37, 0x73, 0xb8, 0xbb, 0x8d, 0x46, + 0xbb, 0x0d, 0xc7, 0x14, 0xbd, 0xb8, 0x54, 0x55, 0x95, 0x8a, 0x8a, 0x0a, + 0x3a, 0x3b, 0x3b, 0x89, 0x8e, 0x8e, 0x26, 0x21, 0x21, 0x81, 0xd0, 0xd0, + 0x50, 0x1a, 0xaf, 0xb3, 0x11, 0xc8, 0xcd, 0xcd, 0xa5, 0xb8, 0xb8, 0x18, + 0x49, 0x92, 0x9c, 0xf7, 0x92, 0xdd, 0x6e, 0xe7, 0xfb, 0xdf, 0xff, 0x3e, + 0xaf, 0xbc, 0xf2, 0x0a, 0x36, 0x9b, 0xcd, 0xb9, 0x0f, 0x57, 0x57, 0x57, + 0xaa, 0xab, 0xab, 0x39, 0x71, 0xe2, 0x84, 0x53, 0xfc, 0x1b, 0x24, 0x3f, + 0x3f, 0x9f, 0x33, 0x67, 0xce, 0xb0, 0x60, 0xc1, 0x02, 0xc2, 0xc2, 0xc2, + 0x48, 0x4e, 0x4e, 0x76, 0x8a, 0x8f, 0x75, 0x75, 0x75, 0x64, 0x65, 0x65, + 0x0d, 0x1b, 0x4b, 0x55, 0x55, 0xa5, 0xb4, 0xb4, 0x94, 0xdc, 0xdc, 0x5c, + 0x16, 0x2f, 0x5e, 0x4c, 0x64, 0x64, 0x24, 0x49, 0x49, 0x49, 0x28, 0x8a, + 0xe2, 0x2c, 0x74, 0x91, 0x9d, 0x9d, 0x3d, 0x2c, 0xd2, 0x4d, 0x96, 0x65, + 0xae, 0x5c, 0xb9, 0x42, 0x41, 0x41, 0x01, 0xa9, 0xa9, 0xa9, 0xa3, 0x2f, + 0x6a, 0x0c, 0x06, 0xa2, 0xa3, 0xa3, 0x31, 0x99, 0x4c, 0x34, 0x34, 0x34, + 0x60, 0xb5, 0x5a, 0xd9, 0xb8, 0x71, 0x23, 0xab, 0x57, 0xaf, 0x66, 0xd1, + 0xa2, 0x45, 0xf8, 0xfa, 0xfa, 0xd2, 0xd4, 0xd4, 0xc4, 0x47, 0x1f, 0x7d, + 0xc4, 0xa1, 0x43, 0x87, 0xc8, 0xcd, 0xcd, 0x1d, 0x63, 0x2e, 0xa4, 0x9d, + 0xe0, 0xb2, 0xb2, 0x32, 0xde, 0x7a, 0xeb, 0x2d, 0xea, 0xeb, 0xeb, 0x51, + 0x14, 0x05, 0x41, 0x10, 0x30, 0x9b, 0xcd, 0x54, 0x57, 0x57, 0x53, 0x56, + 0x56, 0x36, 0x66, 0x2a, 0xee, 0x60, 0x5f, 0xa6, 0xa7, 0xa7, 0xb3, 0x7d, + 0xfb, 0x76, 0xd6, 0xae, 0x5d, 0x4b, 0x44, 0x44, 0x04, 0x06, 0x83, 0x01, + 0x45, 0x51, 0xe8, 0xeb, 0xeb, 0xc3, 0x60, 0x30, 0x0c, 0x3c, 0x67, 0x3d, + 0xb0, 0xdb, 0xed, 0x14, 0x16, 0x16, 0x92, 0x93, 0x93, 0xc3, 0xb6, 0x6d, + 0xdb, 0x58, 0xb1, 0x62, 0x05, 0xef, 0xbe, 0xfb, 0x2e, 0xbe, 0xbe, 0xbe, + 0xa4, 0xa7, 0xa7, 0x33, 0x6d, 0xda, 0x34, 0xae, 0x5c, 0xb9, 0xc2, 0x91, + 0x23, 0x47, 0xc6, 0xb4, 0x40, 0xd0, 0xb9, 0xf7, 0x71, 0x7a, 0x00, 0xea, + 0xcb, 0x41, 0x1d, 0x1d, 0x9d, 0x5b, 0x40, 0x17, 0x00, 0xa7, 0x88, 0xe9, + 0x33, 0xe2, 0x27, 0xb5, 0x5d, 0x5b, 0x5b, 0x1b, 0x5f, 0x15, 0x17, 0xdf, + 0xb0, 0x00, 0xa8, 0x8f, 0xf6, 0x3a, 0xb7, 0x82, 0xa2, 0xaa, 0x93, 0xf2, + 0x4e, 0x34, 0x1a, 0x24, 0xbd, 0xb3, 0xee, 0x61, 0x1c, 0xf6, 0xd1, 0x3d, + 0xcc, 0xdc, 0x3d, 0x3c, 0xa8, 0xaf, 0xab, 0x23, 0xfb, 0xc8, 0x11, 0x62, + 0x62, 0x63, 0x48, 0x4f, 0x5f, 0x82, 0xb7, 0x8f, 0xcf, 0x4d, 0x8b, 0x73, + 0x0e, 0x87, 0x83, 0x8a, 0xf2, 0x32, 0x72, 0x4e, 0x9e, 0xc0, 0xcf, 0xcf, + 0x9f, 0x15, 0x2b, 0x57, 0x8d, 0xba, 0xaf, 0xde, 0xde, 0x5e, 0x6e, 0xcc, + 0x64, 0xe5, 0xe6, 0x39, 0x73, 0x3a, 0x8f, 0x7f, 0xfd, 0xf5, 0x3f, 0x4f, + 0x2a, 0x32, 0x58, 0x55, 0x55, 0xe7, 0xbf, 0xb1, 0x98, 0x3b, 0x77, 0x1e, + 0x31, 0xb1, 0x31, 0x37, 0xd5, 0x96, 0xa2, 0x0b, 0x85, 0xfc, 0xfe, 0xbf, + 0xfe, 0x93, 0xac, 0x43, 0xd7, 0x84, 0x31, 0x55, 0x55, 0xa9, 0xad, 0xa9, + 0xe1, 0x9d, 0xb7, 0xdf, 0x64, 0xd7, 0x07, 0xef, 0xe1, 0xe9, 0xe9, 0x89, + 0x28, 0x49, 0xf4, 0xf5, 0xf6, 0x62, 0x36, 0x9b, 0x47, 0x6d, 0x8b, 0x20, + 0x08, 0x24, 0x27, 0xcf, 0x61, 0x5a, 0xa4, 0x26, 0x44, 0xc6, 0xc6, 0xc6, + 0xb2, 0x20, 0x75, 0x21, 0x07, 0x0f, 0xec, 0x1b, 0xf3, 0xb8, 0xc5, 0x97, + 0x2e, 0xe1, 0xed, 0xed, 0x8d, 0xd1, 0xc5, 0x88, 0xc5, 0x6c, 0xa1, 0xb7, + 0xd7, 0x32, 0x6c, 0xdf, 0xb2, 0x2c, 0x53, 0x59, 0x51, 0xce, 0x7f, 0xbf, + 0xf6, 0x7b, 0xce, 0x9e, 0xfd, 0x92, 0xff, 0xef, 0x57, 0xff, 0x42, 0x74, + 0x74, 0x0c, 0x8b, 0x97, 0x64, 0xf0, 0xc1, 0x7b, 0x3b, 0x69, 0x6b, 0x6b, + 0x1b, 0xf5, 0x7c, 0x7f, 0xf6, 0xe9, 0x27, 0x1c, 0x3c, 0xb0, 0x0f, 0x6f, + 0x1f, 0x1f, 0x8c, 0x46, 0x23, 0x36, 0x9b, 0x8d, 0xee, 0xae, 0xae, 0x71, + 0xab, 0x8e, 0xfa, 0xf9, 0xf9, 0x91, 0x9a, 0xb6, 0xf0, 0x86, 0xfb, 0xcf, + 0xdd, 0xdd, 0x9d, 0x6d, 0xcf, 0x3e, 0x47, 0x69, 0x69, 0x09, 0x67, 0x4e, + 0xe7, 0x8d, 0x1c, 0xef, 0x14, 0x85, 0x77, 0x76, 0xbc, 0x4d, 0x68, 0x58, + 0x18, 0xcf, 0x6e, 0x7f, 0x61, 0xc4, 0xb9, 0x3d, 0x96, 0x7d, 0x94, 0x37, + 0xfe, 0xf4, 0xdf, 0x93, 0x16, 0x52, 0xc6, 0x8b, 0x50, 0x15, 0x04, 0x81, + 0x94, 0x05, 0x0b, 0x88, 0x8c, 0x8c, 0xd2, 0x07, 0x98, 0x7b, 0x9d, 0xa1, + 0x05, 0x40, 0x86, 0x7e, 0x36, 0x88, 0x0b, 0xc4, 0x5e, 0x6d, 0x60, 0xfb, + 0x91, 0x83, 0x3c, 0x96, 0x77, 0x92, 0xe8, 0xe6, 0x66, 0x54, 0xc4, 0x81, + 0xe4, 0x05, 0x01, 0x51, 0x00, 0x17, 0x41, 0xa4, 0x53, 0xb6, 0x71, 0xd6, + 0xd2, 0xc5, 0x81, 0xae, 0x16, 0xf6, 0x75, 0xb5, 0x70, 0xd5, 0xd6, 0x8f, + 0xf9, 0x36, 0x44, 0x74, 0x9d, 0x3d, 0x7b, 0x96, 0x8a, 0x8a, 0x0a, 0xa2, + 0xa3, 0xa3, 0x49, 0x49, 0x49, 0x61, 0xd9, 0xb2, 0x65, 0xec, 0xda, 0xb5, + 0x6b, 0xd8, 0x36, 0x66, 0xb3, 0x19, 0x8b, 0x65, 0xf8, 0x18, 0x10, 0x12, + 0x12, 0x42, 0x78, 0x78, 0x38, 0xfe, 0xfe, 0xfe, 0x5c, 0xbc, 0x78, 0x91, + 0xab, 0x57, 0xaf, 0x32, 0x77, 0xee, 0x5c, 0x44, 0x51, 0xa4, 0x77, 0x60, + 0x3c, 0x1a, 0xed, 0x9e, 0xeb, 0xe9, 0xe9, 0xc1, 0x66, 0xb3, 0xe1, 0xea, + 0xea, 0x8a, 0x97, 0x97, 0x97, 0x56, 0xe1, 0x58, 0x10, 0xb0, 0x5a, 0xad, + 0x74, 0x74, 0x74, 0x8c, 0x10, 0xae, 0x1c, 0x0e, 0x07, 0xed, 0xed, 0xed, + 0xce, 0xef, 0x78, 0x7b, 0x7b, 0x3b, 0xfd, 0x50, 0xfb, 0xfa, 0xfa, 0x68, + 0x6a, 0x6a, 0x1a, 0xe1, 0x7b, 0x6d, 0xb7, 0xdb, 0xe9, 0xe8, 0xe8, 0x70, + 0x8a, 0x71, 0xa3, 0xdd, 0x8f, 0x83, 0xbe, 0x80, 0x21, 0x21, 0x21, 0x3c, + 0xf7, 0xdc, 0x73, 0xce, 0xc8, 0xbc, 0x92, 0x92, 0x12, 0x4e, 0x9f, 0x3e, + 0x4d, 0x76, 0x76, 0x36, 0x85, 0x85, 0x85, 0xb4, 0xb4, 0xb4, 0x4c, 0x58, + 0x15, 0xb9, 0xb3, 0xb3, 0x93, 0x3d, 0x7b, 0xf6, 0x50, 0x51, 0x51, 0xe1, + 0xf4, 0xf8, 0x53, 0x14, 0x05, 0xbb, 0xdd, 0x3e, 0xa6, 0x27, 0xf7, 0x60, + 0x30, 0x40, 0x48, 0x48, 0x08, 0xdf, 0xfe, 0xf6, 0xb7, 0xd9, 0xb2, 0x65, + 0x0b, 0xae, 0xae, 0xae, 0x14, 0x17, 0x17, 0x53, 0x56, 0x56, 0x86, 0xd5, + 0x6a, 0x25, 0x24, 0x24, 0x84, 0x45, 0x8b, 0x16, 0x39, 0xdb, 0x3c, 0x98, + 0x2e, 0x9c, 0x95, 0x95, 0xc5, 0x43, 0x0f, 0x3d, 0xc4, 0x9c, 0x39, 0x73, + 0x58, 0xb8, 0x70, 0x21, 0xaa, 0xaa, 0x92, 0x94, 0x94, 0x84, 0xcd, 0x66, + 0x23, 0x2f, 0x2f, 0x8f, 0xd3, 0xa7, 0x4f, 0xeb, 0xd1, 0x7f, 0x3a, 0x3a, + 0x3a, 0x3a, 0x3a, 0xb7, 0x84, 0x2e, 0x00, 0x4e, 0x11, 0xe1, 0x51, 0x91, + 0x84, 0x85, 0x87, 0xd3, 0xd8, 0xd0, 0x30, 0xee, 0x76, 0x5d, 0x5d, 0x9d, + 0x9c, 0x3e, 0x75, 0x8a, 0xe5, 0xab, 0x56, 0xe1, 0x3b, 0x46, 0x4a, 0x95, + 0x8e, 0xce, 0x54, 0x23, 0xcb, 0x32, 0xf6, 0x31, 0x3c, 0xb8, 0x86, 0x0b, + 0x41, 0x26, 0xbd, 0xb3, 0xee, 0x51, 0x54, 0x55, 0xe5, 0xcb, 0x82, 0x7c, + 0x0e, 0x1f, 0x3a, 0xc0, 0xba, 0xf5, 0x0f, 0x8d, 0xf8, 0xfb, 0x8a, 0x95, + 0xab, 0xf0, 0xf0, 0xf0, 0x60, 0xef, 0x17, 0x9f, 0xf3, 0x97, 0x4f, 0x3e, + 0x26, 0x29, 0x29, 0x99, 0x85, 0x8b, 0xd2, 0x99, 0x11, 0x1f, 0x8f, 0x97, + 0x97, 0xf7, 0xb8, 0x9e, 0x7e, 0xaa, 0xaa, 0x62, 0xb5, 0x5a, 0x69, 0x6c, + 0x6c, 0xe0, 0x62, 0xd1, 0x05, 0x4e, 0xe7, 0x9d, 0xc2, 0x62, 0xb6, 0xb0, + 0x70, 0x51, 0x3a, 0xeb, 0x36, 0x3c, 0x34, 0x6a, 0x74, 0xe0, 0xd9, 0x2f, + 0x0b, 0x38, 0x7a, 0x24, 0x6b, 0xdc, 0x22, 0x1b, 0x53, 0x89, 0xa2, 0x68, + 0x82, 0xde, 0x54, 0x2c, 0x9e, 0x3c, 0x3c, 0x4c, 0xac, 0x5d, 0xb7, 0x01, + 0x93, 0xc9, 0xf3, 0x86, 0xbf, 0x6b, 0xb5, 0x5a, 0xc9, 0x39, 0x79, 0x62, + 0x98, 0xf8, 0x77, 0x7d, 0x5f, 0xf6, 0xf7, 0xf7, 0x8f, 0x9a, 0xde, 0x3a, + 0xe2, 0x7e, 0x75, 0xf7, 0x60, 0xdd, 0xfa, 0x87, 0x9c, 0xed, 0x30, 0x99, + 0x3c, 0x79, 0xe8, 0xe1, 0x8d, 0xe4, 0x9c, 0x3c, 0x81, 0xc5, 0x62, 0x1e, + 0x63, 0x2c, 0x70, 0xd0, 0xd1, 0xd1, 0x3e, 0xe1, 0xbe, 0x45, 0x51, 0x24, + 0x63, 0x69, 0x26, 0x51, 0x51, 0xd1, 0x00, 0xa4, 0x2c, 0x48, 0xe5, 0xc1, + 0x75, 0xeb, 0xf9, 0xe0, 0xbd, 0x77, 0xc7, 0x14, 0x46, 0x27, 0xdb, 0xee, + 0xc1, 0x45, 0xef, 0xfa, 0x0d, 0x0f, 0x33, 0x3f, 0x65, 0xc1, 0x4d, 0x9d, + 0x83, 0x84, 0xc4, 0x99, 0x6c, 0x7f, 0xe1, 0x5b, 0x54, 0x57, 0x57, 0x8d, + 0x5a, 0x1c, 0xc5, 0x62, 0x31, 0xf3, 0xe6, 0x1b, 0xaf, 0x13, 0x31, 0x2d, + 0x92, 0x15, 0x2b, 0x57, 0x8d, 0xe8, 0xe3, 0xa9, 0x5a, 0x44, 0x7b, 0x7b, + 0x7b, 0xb3, 0x6e, 0xc3, 0xc3, 0xe3, 0xa6, 0xc9, 0xeb, 0xdc, 0x83, 0x0c, + 0x2d, 0x02, 0x39, 0x10, 0x38, 0x1f, 0x53, 0xdb, 0xc0, 0x73, 0x87, 0x0f, + 0xb0, 0xf9, 0x54, 0x0e, 0xd1, 0xcd, 0x8d, 0xa0, 0xaa, 0x28, 0xa2, 0x88, + 0x88, 0x8a, 0x8b, 0x20, 0xd0, 0xab, 0x38, 0x38, 0xdb, 0xdb, 0x43, 0x56, + 0x57, 0x0b, 0x47, 0x7a, 0xda, 0xb8, 0xd4, 0xd7, 0x43, 0xab, 0xe3, 0xf6, + 0x45, 0x73, 0x15, 0x16, 0x16, 0x92, 0x95, 0x95, 0x45, 0x52, 0x52, 0x12, + 0xc9, 0xc9, 0xc9, 0xbc, 0xf4, 0xd2, 0x4b, 0x34, 0x34, 0x34, 0x70, 0xf2, + 0xe4, 0xc9, 0x11, 0xf7, 0xc3, 0xb5, 0xb1, 0xcd, 0x83, 0x8d, 0x1b, 0x37, + 0xb2, 0x64, 0xc9, 0x12, 0x44, 0x51, 0xa4, 0xb8, 0xb8, 0x98, 0xf3, 0xe7, + 0xcf, 0x13, 0x15, 0x15, 0x85, 0xa2, 0x28, 0xf8, 0xfa, 0xfa, 0x12, 0x12, + 0x12, 0x32, 0x72, 0x31, 0x61, 0x30, 0x10, 0x1c, 0x1c, 0x8c, 0x87, 0x87, + 0x07, 0xcd, 0xcd, 0xcd, 0xb4, 0xb4, 0xb4, 0x38, 0x7d, 0x3f, 0x7d, 0x7c, + 0x7c, 0x98, 0x36, 0x6d, 0x1a, 0xe7, 0xce, 0x9d, 0x1b, 0x21, 0x02, 0x46, + 0x44, 0x44, 0xe0, 0xee, 0xee, 0x4e, 0x4b, 0x4b, 0x0b, 0x2d, 0x2d, 0x2d, + 0x08, 0x82, 0x80, 0x2c, 0xcb, 0x98, 0x4c, 0x26, 0x22, 0x23, 0x23, 0xc9, + 0xcf, 0xcf, 0x1f, 0x31, 0x2e, 0x85, 0x84, 0x84, 0x60, 0x30, 0x18, 0xc6, + 0x18, 0xe7, 0x15, 0xba, 0xba, 0xba, 0x90, 0x65, 0x19, 0xa3, 0xd1, 0x88, + 0xc3, 0xe1, 0x20, 0x2f, 0x2f, 0x8f, 0xdc, 0xdc, 0x5c, 0x4e, 0x9f, 0x3e, + 0x4d, 0x65, 0x65, 0x25, 0x8d, 0x8d, 0x8d, 0xc3, 0xc4, 0x3b, 0x41, 0x10, + 0xc6, 0x1c, 0xd3, 0x64, 0x59, 0xa6, 0xbb, 0xbb, 0x7b, 0x4c, 0x0b, 0x83, + 0xb1, 0x9e, 0x87, 0x2e, 0x2e, 0x2e, 0xc4, 0xc7, 0xc7, 0xb3, 0x7a, 0xf5, + 0x6a, 0x02, 0x03, 0x03, 0xd9, 0xbd, 0x7b, 0x37, 0x3b, 0x76, 0xec, 0xa0, + 0xb8, 0xb8, 0x18, 0x55, 0x55, 0x09, 0x0d, 0x0d, 0xe5, 0x9f, 0xfe, 0xe9, + 0x9f, 0x58, 0xbe, 0x7c, 0xb9, 0xd3, 0xaf, 0x71, 0xb0, 0xad, 0xf9, 0xf9, + 0xf9, 0xac, 0x5e, 0xbd, 0x9a, 0xcd, 0x9b, 0x37, 0x23, 0x49, 0x12, 0x89, + 0x89, 0x89, 0xd4, 0xd7, 0xd7, 0x73, 0xec, 0xd8, 0xb1, 0x09, 0xfd, 0x56, + 0x75, 0x74, 0x74, 0x74, 0x74, 0x74, 0x26, 0x42, 0x17, 0x00, 0xa7, 0x08, + 0x3f, 0x3f, 0x7f, 0x66, 0x27, 0xcf, 0x99, 0x50, 0x00, 0x54, 0x14, 0x85, + 0x8b, 0x85, 0x85, 0x9c, 0x2b, 0xf8, 0x92, 0x95, 0x0f, 0xae, 0xd1, 0x3b, + 0x4e, 0xe7, 0x6b, 0xc1, 0x66, 0xb5, 0xd2, 0xdb, 0x6b, 0x99, 0x70, 0x3b, + 0x1f, 0x5f, 0xdd, 0xc7, 0xea, 0x5e, 0xa6, 0xbe, 0xbe, 0x8e, 0xdf, 0xfd, + 0xf6, 0x3f, 0xb0, 0xd9, 0x6c, 0x6c, 0xdc, 0xb4, 0x79, 0x44, 0x04, 0xc5, + 0xa2, 0xf4, 0xc5, 0xcc, 0x4e, 0x4a, 0xe6, 0xe4, 0x89, 0xe3, 0x1c, 0xc9, + 0x3a, 0xc4, 0xbb, 0xef, 0xbc, 0x4d, 0x68, 0x58, 0x38, 0xb1, 0xb1, 0x71, + 0x44, 0x45, 0x47, 0x13, 0x12, 0x12, 0x8a, 0x8f, 0xaf, 0x2f, 0x6e, 0x6e, + 0x5a, 0x21, 0x91, 0x5e, 0x8b, 0x85, 0xf6, 0xf6, 0x36, 0x6a, 0x6b, 0x6b, + 0xa9, 0xaa, 0xac, 0xa0, 0xbc, 0xac, 0x8c, 0x69, 0x91, 0x91, 0x3c, 0xb0, + 0x62, 0x15, 0x2b, 0x56, 0xad, 0x22, 0x26, 0x26, 0x76, 0xd4, 0x76, 0xe4, + 0xe6, 0x9c, 0xe4, 0xbf, 0xff, 0xf0, 0x5f, 0x9c, 0x3b, 0xfb, 0xe5, 0x37, + 0xae, 0x0f, 0x45, 0x51, 0xe4, 0xa9, 0x6d, 0xcf, 0xf0, 0xd0, 0xc6, 0x4d, + 0x37, 0xf5, 0x7d, 0x57, 0x57, 0x57, 0x96, 0x2d, 0x5f, 0xc1, 0xd9, 0x2f, + 0x0b, 0x38, 0x96, 0x7d, 0xf4, 0xa6, 0xbd, 0x4a, 0xc7, 0x6a, 0xc7, 0x9a, + 0xb5, 0xeb, 0x28, 0x3c, 0x7f, 0x8e, 0xb7, 0xdf, 0xfa, 0xf3, 0x4d, 0x8b, + 0x5c, 0x82, 0x20, 0xb0, 0xf9, 0xd1, 0xc7, 0xd8, 0xf6, 0xec, 0x73, 0xd7, + 0x7c, 0x00, 0x5d, 0x5d, 0xd9, 0xf6, 0xcc, 0x73, 0x5c, 0xad, 0xae, 0xe6, + 0x54, 0x6e, 0xce, 0x2d, 0x7b, 0xac, 0x66, 0x2c, 0xcd, 0xe4, 0xe9, 0x67, + 0x9e, 0x9d, 0xb0, 0x58, 0xcc, 0x78, 0x3c, 0xb8, 0x76, 0x3d, 0x95, 0x15, + 0x15, 0xfc, 0xe6, 0xdf, 0xfe, 0x75, 0x54, 0x21, 0xb9, 0xba, 0xba, 0x8a, + 0x3f, 0xbf, 0xfe, 0x47, 0x42, 0x42, 0x42, 0x98, 0x35, 0x3b, 0x69, 0xca, + 0xaf, 0x05, 0x49, 0x92, 0x78, 0x6a, 0xdb, 0x33, 0x3c, 0xb8, 0x76, 0x9d, + 0x3e, 0xb8, 0xdc, 0x2f, 0x0c, 0x8d, 0x00, 0x1c, 0x52, 0x11, 0x38, 0xa6, + 0xbe, 0x81, 0x6d, 0x59, 0x87, 0xd9, 0x9c, 0x9b, 0x43, 0x4c, 0x53, 0x23, + 0xa2, 0xaa, 0xa2, 0x1a, 0x24, 0x0c, 0x02, 0x58, 0x15, 0x85, 0x2b, 0xfd, + 0x66, 0x4e, 0x5b, 0xda, 0x39, 0xdc, 0xdd, 0x4a, 0xbe, 0xa5, 0x93, 0x5a, + 0x7b, 0xff, 0x6d, 0x6f, 0xaa, 0xd5, 0x6a, 0x65, 0xff, 0xfe, 0xfd, 0x24, + 0x24, 0x24, 0xf0, 0xd4, 0x53, 0x4f, 0xb1, 0x66, 0xcd, 0x1a, 0xec, 0x76, + 0x3b, 0xfe, 0xfe, 0xfe, 0x5c, 0xb8, 0x70, 0x81, 0xc6, 0xc6, 0x46, 0xa7, + 0x60, 0x6f, 0x32, 0x99, 0x88, 0x8e, 0x8e, 0x66, 0xd9, 0xb2, 0x65, 0xbc, + 0xf0, 0xc2, 0x0b, 0xcc, 0x9e, 0x3d, 0x9b, 0xf2, 0xf2, 0x72, 0x8e, 0x1e, + 0x3d, 0x4a, 0x71, 0x71, 0x31, 0x33, 0x66, 0xcc, 0x70, 0x56, 0xfc, 0x5d, + 0xb9, 0x72, 0x25, 0xa5, 0xa5, 0xa5, 0x14, 0x16, 0x6a, 0x69, 0xf4, 0xee, + 0xee, 0xee, 0x2c, 0x5d, 0xba, 0x94, 0xf4, 0xf4, 0x74, 0x3c, 0x3c, 0x3c, + 0xa8, 0xa9, 0xa9, 0xe1, 0xc2, 0x85, 0x0b, 0x18, 0x8d, 0x46, 0x9a, 0x9a, + 0x9a, 0x08, 0x0a, 0x0a, 0x62, 0xed, 0xda, 0xb5, 0x54, 0x57, 0x57, 0x73, + 0xf6, 0xec, 0x59, 0x54, 0x55, 0xc5, 0xd5, 0xd5, 0x95, 0xc5, 0x8b, 0x17, + 0xb3, 0x62, 0xc5, 0x0a, 0x3c, 0x3d, 0x3d, 0x29, 0x28, 0x28, 0xa0, 0xa8, + 0xa8, 0x08, 0x17, 0x17, 0x17, 0xaa, 0xaa, 0xaa, 0x88, 0x8d, 0x8d, 0xe5, + 0xa1, 0x87, 0x1e, 0xa2, 0xb4, 0xb4, 0x94, 0x73, 0xe7, 0xce, 0xa1, 0xaa, + 0x2a, 0xee, 0xee, 0xee, 0x64, 0x66, 0x66, 0x92, 0x91, 0x91, 0x81, 0x28, + 0x8a, 0x23, 0xc6, 0xa0, 0x41, 0xf1, 0x70, 0xd0, 0x2b, 0x30, 0x30, 0x30, + 0x90, 0xe6, 0xe6, 0x66, 0x0e, 0x1c, 0x38, 0xc0, 0xee, 0xdd, 0xbb, 0x9d, + 0xd1, 0xcb, 0x69, 0x69, 0x69, 0x24, 0x25, 0x25, 0xd1, 0xd4, 0xd4, 0x44, + 0x7e, 0x7e, 0xfe, 0xa8, 0x51, 0xcd, 0x43, 0xf7, 0x39, 0x58, 0x4c, 0x65, + 0xb2, 0x63, 0x9e, 0xaa, 0xaa, 0x88, 0xa2, 0x88, 0x9f, 0x9f, 0x1f, 0x41, + 0x41, 0x41, 0x28, 0x8a, 0xc2, 0xe5, 0xcb, 0x97, 0x39, 0x79, 0xf2, 0xa4, + 0xb3, 0x18, 0x53, 0x54, 0x54, 0x14, 0xbe, 0x03, 0x1e, 0xb2, 0x43, 0xed, + 0x83, 0x6a, 0x6b, 0x6b, 0x39, 0x72, 0xe4, 0x08, 0x19, 0x19, 0x19, 0x2c, + 0x5b, 0xb6, 0x0c, 0x83, 0xc1, 0x80, 0xab, 0xab, 0x2b, 0xd9, 0xd9, 0xd9, + 0xe4, 0xe4, 0xe4, 0xe8, 0xf7, 0x9f, 0x8e, 0x8e, 0x8e, 0x8e, 0xce, 0x2d, + 0xa3, 0x0b, 0x80, 0x53, 0x84, 0x9b, 0xab, 0x2b, 0xf3, 0xd3, 0x52, 0x39, + 0x72, 0xe8, 0x00, 0x13, 0xa5, 0xb4, 0xd5, 0xd7, 0xd6, 0xf2, 0x97, 0xdd, + 0xbb, 0x88, 0x9d, 0x1e, 0x47, 0x4c, 0x5c, 0xdc, 0xbd, 0x37, 0x3f, 0x1e, + 0x48, 0xfb, 0xb8, 0x1f, 0xf8, 0xa6, 0x24, 0x66, 0x37, 0x35, 0x36, 0xd2, + 0xd7, 0xd7, 0x37, 0xe1, 0x04, 0x36, 0x60, 0x12, 0xd5, 0xac, 0x75, 0xbe, + 0xd9, 0x7c, 0x75, 0xb9, 0x98, 0xff, 0xfb, 0x7f, 0xfe, 0x37, 0x95, 0x15, + 0x15, 0x6c, 0x7e, 0xf4, 0x31, 0xa2, 0xa2, 0xa2, 0x87, 0xdd, 0xaf, 0x9e, + 0x9e, 0x9e, 0xac, 0x5b, 0xbf, 0x81, 0xca, 0x8a, 0x72, 0xbe, 0xf8, 0xec, + 0x53, 0x5a, 0x5a, 0x5a, 0x28, 0xba, 0x50, 0xe8, 0x5c, 0x08, 0x0d, 0x2e, + 0x86, 0x40, 0x7b, 0xa1, 0x21, 0xcb, 0x8a, 0x53, 0x7c, 0x11, 0x04, 0x81, + 0x94, 0xd4, 0x54, 0xb6, 0x3e, 0xf1, 0x24, 0x5e, 0x5e, 0x5e, 0x23, 0x8e, + 0xdd, 0xd2, 0xd2, 0xc2, 0xbe, 0x3d, 0x5f, 0xf0, 0xc1, 0x7b, 0x3b, 0x29, + 0x2d, 0x2d, 0xf9, 0xc6, 0xf5, 0x9d, 0xbb, 0x87, 0x07, 0x4f, 0x3d, 0xbd, + 0x8d, 0xef, 0x7d, 0xff, 0x07, 0x37, 0xec, 0x5b, 0x37, 0x94, 0xa4, 0xe4, + 0x64, 0xfe, 0xfa, 0xd5, 0x1f, 0xe3, 0xee, 0xee, 0xce, 0xc1, 0x03, 0xfb, + 0x6f, 0x58, 0xa8, 0x73, 0x73, 0x73, 0x63, 0xdb, 0x33, 0xcf, 0xf1, 0xca, + 0x0f, 0xfe, 0x6a, 0x44, 0x3b, 0x5c, 0x5c, 0x5c, 0xf8, 0xce, 0xf7, 0xbe, + 0x8f, 0xcd, 0x66, 0xe3, 0xc3, 0x0f, 0xde, 0xbb, 0x61, 0xbf, 0x28, 0x49, + 0x32, 0xb0, 0xf9, 0xd1, 0x47, 0xf9, 0xfe, 0x5f, 0xfd, 0x08, 0x7f, 0xff, + 0xe1, 0x85, 0x03, 0x66, 0xcd, 0x4e, 0xe2, 0x95, 0x1f, 0xfc, 0x10, 0x51, + 0x14, 0xc9, 0x39, 0x79, 0xe2, 0xa6, 0x44, 0x40, 0x51, 0x14, 0xc9, 0x5c, + 0xfe, 0x00, 0xdf, 0x7b, 0xe5, 0x07, 0x24, 0xce, 0x9c, 0x75, 0x4b, 0xe7, + 0x43, 0x14, 0x45, 0xb6, 0x3d, 0xf3, 0x1c, 0xe5, 0x65, 0x65, 0x7c, 0xf6, + 0xe9, 0x27, 0xa3, 0xb6, 0x27, 0xef, 0x54, 0x2e, 0x6f, 0xfe, 0xf9, 0x75, + 0x7e, 0xf6, 0x8b, 0xbf, 0x1b, 0xb3, 0x10, 0xc2, 0xcd, 0xe0, 0xe1, 0x61, + 0x62, 0xdb, 0xb3, 0xcf, 0xf1, 0xdd, 0x57, 0xfe, 0xea, 0x96, 0x44, 0x4c, + 0x9d, 0x6f, 0x30, 0x03, 0xbe, 0x7f, 0x31, 0xf5, 0x0d, 0x6c, 0x3d, 0x9a, + 0xcd, 0xe3, 0xd9, 0xc7, 0x88, 0x6a, 0x69, 0x42, 0x42, 0x05, 0xd1, 0x80, + 0x4d, 0x96, 0xa9, 0x91, 0xfb, 0x29, 0xee, 0xef, 0x62, 0x5f, 0x57, 0x13, + 0x39, 0xe6, 0x76, 0x4a, 0xac, 0x96, 0xaf, 0xb5, 0x89, 0x17, 0x2e, 0x5c, + 0xe0, 0xbd, 0xf7, 0x34, 0x4b, 0x81, 0x0d, 0x1b, 0x36, 0xb0, 0x69, 0xd3, + 0x26, 0x42, 0x43, 0x43, 0x9d, 0xde, 0x7f, 0x1d, 0x1d, 0x1d, 0x88, 0xa2, + 0x48, 0x50, 0x50, 0x10, 0x29, 0x29, 0x29, 0x64, 0x66, 0x66, 0x92, 0x90, + 0x90, 0x40, 0x5b, 0x5b, 0x1b, 0x1f, 0x7d, 0xf4, 0x11, 0x07, 0x0f, 0x1e, + 0xa4, 0xa7, 0xa7, 0x87, 0x82, 0x82, 0x02, 0xce, 0x9c, 0x39, 0xc3, 0x86, + 0x0d, 0x1b, 0xd8, 0xbc, 0x79, 0x33, 0xaa, 0xaa, 0x72, 0xe4, 0xc8, 0x11, + 0x3a, 0x3b, 0x3b, 0x89, 0x8c, 0x8c, 0xe4, 0x89, 0x27, 0x9e, 0x60, 0xe1, + 0xc2, 0x85, 0x74, 0x75, 0x75, 0x91, 0x9b, 0x9b, 0x4b, 0x7e, 0x7e, 0x3e, + 0x7e, 0x7e, 0x7e, 0x64, 0x67, 0x67, 0xf3, 0xe8, 0xa3, 0x8f, 0xb2, 0x71, + 0xe3, 0x46, 0x00, 0x8e, 0x1c, 0x39, 0x42, 0x73, 0x73, 0x33, 0xd1, 0xd1, + 0xd1, 0x6c, 0xd9, 0xb2, 0x85, 0xc5, 0x8b, 0x17, 0x63, 0x36, 0x9b, 0x9d, + 0x69, 0xb9, 0x9e, 0x9e, 0x9e, 0x1c, 0x3d, 0x7a, 0x94, 0x69, 0xd3, 0xa6, + 0xb1, 0x61, 0xc3, 0x06, 0xfa, 0xfb, 0xfb, 0xc9, 0xca, 0xca, 0xa2, 0xa9, + 0xa9, 0x89, 0xc4, 0xc4, 0x44, 0x1e, 0x7f, 0xfc, 0x71, 0x92, 0x92, 0x34, + 0x31, 0x7f, 0x68, 0x61, 0x0e, 0x41, 0x10, 0x10, 0x45, 0x11, 0x59, 0x96, + 0x39, 0x7b, 0xf6, 0x2c, 0x39, 0x39, 0x39, 0x44, 0x47, 0x47, 0x13, 0x1a, + 0x1a, 0xca, 0xfc, 0xf9, 0xf3, 0x69, 0x6c, 0x6c, 0xa4, 0xab, 0xab, 0x8b, + 0x90, 0x90, 0x10, 0xb6, 0x6e, 0xdd, 0x4a, 0x5a, 0x5a, 0x1a, 0xb9, 0xb9, + 0xb9, 0x74, 0x74, 0x74, 0x8c, 0x2a, 0x00, 0x0e, 0x3e, 0xe3, 0x6e, 0x64, + 0x2e, 0x3b, 0xd8, 0x86, 0xc1, 0xc2, 0x56, 0x1d, 0x1d, 0x1d, 0xb4, 0xb4, + 0xb4, 0x10, 0x1b, 0x1b, 0xcb, 0xfc, 0xf9, 0xf3, 0x79, 0xe4, 0x91, 0x47, + 0xa8, 0xae, 0xae, 0x26, 0x26, 0x26, 0x86, 0xa7, 0x9e, 0x7a, 0x6a, 0xc4, + 0xef, 0x00, 0xcd, 0x16, 0x23, 0x3b, 0x3b, 0x9b, 0xa7, 0x9f, 0x7e, 0x9a, + 0xb9, 0x73, 0xe7, 0x02, 0x70, 0xf5, 0xea, 0x55, 0x4e, 0x9e, 0x3c, 0x49, + 0x49, 0x49, 0x89, 0x7e, 0xcf, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xdc, 0x32, + 0xba, 0x00, 0x38, 0x55, 0xf3, 0x40, 0x49, 0x62, 0xce, 0xfc, 0xf9, 0x84, + 0x86, 0x4d, 0x9c, 0x06, 0x0c, 0x70, 0x3a, 0x27, 0x87, 0x3f, 0xfc, 0xc7, + 0x6f, 0x79, 0xe1, 0xe5, 0xef, 0x30, 0x2b, 0x69, 0x32, 0x91, 0x09, 0xd7, + 0x1b, 0xcf, 0xdc, 0xc5, 0xa2, 0xd8, 0x5d, 0x58, 0xd1, 0xf3, 0x76, 0x20, + 0xdb, 0x1d, 0xc8, 0x0e, 0xc7, 0x37, 0xa2, 0xad, 0x65, 0x25, 0x25, 0x13, + 0x7a, 0xdd, 0x00, 0x84, 0x84, 0x85, 0xe9, 0x37, 0xf3, 0x7d, 0x40, 0x4b, + 0x4b, 0x0b, 0xbf, 0xff, 0xdd, 0x6f, 0xc9, 0x3e, 0x7a, 0x84, 0x55, 0xab, + 0xd7, 0x90, 0x91, 0xb9, 0x8c, 0xa8, 0xa8, 0x68, 0xbc, 0xbc, 0xbc, 0x30, + 0x18, 0x24, 0xf6, 0x7c, 0xf1, 0x39, 0x3b, 0xdf, 0x79, 0x7b, 0x58, 0x9a, + 0x94, 0xaa, 0xaa, 0x38, 0x1c, 0x8e, 0x31, 0x7d, 0x8f, 0x06, 0xb7, 0xd9, + 0xf3, 0xf9, 0x67, 0x44, 0x47, 0xc7, 0xf0, 0x9d, 0xef, 0xbe, 0x02, 0x68, + 0xa9, 0x98, 0x75, 0xb5, 0xb5, 0x9c, 0xce, 0x3b, 0xc5, 0xb1, 0xec, 0xa3, + 0x9c, 0xfd, 0xb2, 0xe0, 0x1b, 0x65, 0x62, 0x2e, 0x08, 0x02, 0xae, 0xae, + 0xae, 0xcc, 0x9d, 0x37, 0x9f, 0x47, 0x36, 0x6f, 0x61, 0xd3, 0xe6, 0x47, + 0xa7, 0x24, 0xdd, 0x33, 0x39, 0x79, 0x0e, 0x7f, 0xf7, 0xff, 0xfc, 0x2f, + 0xe2, 0xa6, 0xcf, 0xe0, 0xe3, 0xdd, 0xbb, 0x68, 0x6c, 0x6c, 0x98, 0x50, + 0x50, 0x33, 0x18, 0x0c, 0xcc, 0x4e, 0x4a, 0xe6, 0xb1, 0xc7, 0x9f, 0xe0, + 0xd1, 0xc7, 0x1e, 0x1f, 0xb3, 0x1d, 0x41, 0x41, 0x41, 0xfc, 0xe4, 0xe7, + 0xbf, 0x20, 0x3a, 0x26, 0x96, 0xdd, 0xbb, 0x3e, 0xa0, 0xbc, 0xac, 0x74, + 0x42, 0x91, 0x51, 0x10, 0x04, 0xc2, 0xc3, 0xc3, 0x79, 0xec, 0xf1, 0x27, + 0xd9, 0xf6, 0xec, 0x76, 0x02, 0xc7, 0x78, 0x19, 0xb0, 0x78, 0x49, 0x06, + 0xa1, 0xa1, 0xa1, 0xbc, 0xff, 0xde, 0xbb, 0x7c, 0xf1, 0xf9, 0xa7, 0xb4, + 0x34, 0x37, 0x4f, 0x4a, 0x08, 0x14, 0x04, 0x81, 0xe0, 0x90, 0x10, 0x1e, + 0xde, 0xf8, 0x08, 0x4f, 0x6f, 0x7b, 0x86, 0x98, 0xd8, 0xa9, 0x79, 0xf9, + 0xe5, 0xe3, 0xeb, 0xcb, 0xf6, 0x17, 0xbe, 0x45, 0x45, 0x45, 0xf9, 0xa8, + 0x85, 0x3d, 0x06, 0x0b, 0xac, 0x84, 0x85, 0x85, 0xf3, 0xa3, 0xbf, 0x79, + 0xf5, 0x96, 0x5e, 0x4e, 0x09, 0x82, 0x80, 0x9b, 0x9b, 0x1b, 0xf3, 0x53, + 0x16, 0xb0, 0x79, 0xcb, 0x63, 0x6c, 0x7c, 0x64, 0x33, 0x2e, 0x93, 0xa8, + 0xaa, 0xad, 0x73, 0x2f, 0x4e, 0xfa, 0x70, 0x8a, 0x7f, 0x5b, 0xb2, 0x8f, + 0xb3, 0xed, 0xe0, 0x11, 0xa2, 0x9a, 0x9b, 0x11, 0x45, 0x81, 0x7e, 0x01, + 0x7a, 0x1d, 0x36, 0x4a, 0xad, 0x3d, 0x1c, 0xec, 0x69, 0x22, 0xab, 0xa7, + 0x85, 0xf3, 0x7d, 0x5d, 0x77, 0xa4, 0x99, 0x76, 0xbb, 0x9d, 0x63, 0xc7, + 0x8e, 0x61, 0xb7, 0xdb, 0x31, 0x9b, 0xcd, 0x6c, 0xd8, 0xb0, 0x81, 0xd4, + 0xd4, 0x54, 0x16, 0x2e, 0x5c, 0x88, 0xc5, 0x62, 0xa1, 0xbf, 0xbf, 0xdf, + 0x79, 0x5d, 0x0f, 0x16, 0xa3, 0xa8, 0xa8, 0xa8, 0xe0, 0x83, 0x0f, 0x3e, + 0xe0, 0xf5, 0xd7, 0x5f, 0xa7, 0xba, 0xba, 0x1a, 0xd0, 0xfc, 0xf3, 0xde, + 0x7c, 0xf3, 0x4d, 0x02, 0x03, 0x03, 0x49, 0x49, 0x49, 0xe1, 0x3b, 0xdf, + 0xf9, 0x0e, 0x9b, 0x36, 0x6d, 0xc2, 0x62, 0xb1, 0xe0, 0xe7, 0xe7, 0x47, + 0x68, 0x68, 0x28, 0x16, 0x8b, 0x85, 0xdd, 0xbb, 0x77, 0xf3, 0xe9, 0xa7, + 0x9f, 0xd2, 0xde, 0xde, 0x4e, 0x6f, 0x6f, 0x2f, 0x3b, 0x77, 0xee, 0x24, + 0x3c, 0x3c, 0x9c, 0xb4, 0xb4, 0x34, 0x5e, 0x7c, 0xf1, 0x45, 0x1e, 0x7e, + 0xf8, 0x61, 0xcc, 0x66, 0x33, 0xbe, 0xbe, 0xbe, 0x84, 0x86, 0x86, 0xd2, + 0xd3, 0xd3, 0xc3, 0xae, 0x5d, 0xbb, 0xf8, 0xe4, 0x93, 0x4f, 0x68, 0x69, + 0x69, 0xc1, 0x6c, 0x36, 0xb3, 0x7b, 0xf7, 0x6e, 0x62, 0x63, 0x63, 0x59, + 0xb2, 0x64, 0x09, 0x2f, 0xbe, 0xf8, 0x22, 0x1b, 0x36, 0x6c, 0xc0, 0x62, + 0xb1, 0xe0, 0xed, 0xed, 0x4d, 0x60, 0x60, 0x20, 0x56, 0xab, 0x75, 0xd8, + 0x8b, 0x0f, 0x45, 0x51, 0x70, 0x38, 0x1c, 0x28, 0x8a, 0xa2, 0x79, 0xa9, + 0xd6, 0xd6, 0xf2, 0xee, 0xbb, 0xef, 0x12, 0x11, 0x11, 0xc1, 0xea, 0xd5, + 0xab, 0xf9, 0xf6, 0xb7, 0xbf, 0xcd, 0x43, 0x0f, 0x3d, 0x44, 0x77, 0x77, + 0x37, 0x7e, 0x7e, 0x7e, 0x84, 0x85, 0x85, 0x39, 0xfd, 0xfc, 0xc6, 0x1a, + 0x17, 0x07, 0x7d, 0x3f, 0x07, 0xb7, 0x9b, 0x0c, 0x43, 0xdb, 0x31, 0x58, + 0xe9, 0xf7, 0xe8, 0xd1, 0xa3, 0xf8, 0xf8, 0xf8, 0xb0, 0x61, 0xc3, 0x06, + 0x16, 0x2e, 0x5c, 0x48, 0x77, 0x77, 0x37, 0x9e, 0x9e, 0x9e, 0x04, 0x06, + 0x06, 0x3a, 0xdb, 0x33, 0xd8, 0xee, 0xc1, 0xf3, 0x55, 0x54, 0x54, 0x44, + 0x5e, 0x5e, 0x1e, 0x71, 0x71, 0x71, 0x78, 0x7a, 0x7a, 0x52, 0x5c, 0x5c, + 0xcc, 0x99, 0x33, 0x67, 0xf4, 0x7b, 0x4e, 0x47, 0x47, 0x47, 0x47, 0x67, + 0x4a, 0xd0, 0x05, 0xc0, 0x29, 0x24, 0x3a, 0x26, 0x86, 0xc5, 0x99, 0x99, + 0xfc, 0xe5, 0x3a, 0x93, 0xe5, 0x51, 0xc5, 0x23, 0x59, 0xe6, 0x58, 0xd6, + 0x61, 0xaa, 0x2a, 0xca, 0x79, 0xe2, 0x99, 0x67, 0x58, 0xbe, 0x6a, 0x25, + 0x41, 0xc1, 0x21, 0x63, 0xcf, 0x35, 0x25, 0x91, 0x3b, 0x1d, 0x6f, 0xa6, + 0xa5, 0x29, 0x4c, 0xbc, 0x5d, 0x6f, 0x6f, 0x2f, 0x5d, 0x9d, 0x9d, 0xdf, + 0xec, 0x68, 0x32, 0x41, 0xab, 0xd6, 0x37, 0x9e, 0xe8, 0x6a, 0x31, 0x9b, + 0xe9, 0x18, 0x27, 0x75, 0x04, 0xc0, 0xe8, 0xe2, 0x82, 0x28, 0xde, 0xbe, + 0xc2, 0x1a, 0xa2, 0x24, 0x61, 0x30, 0x4c, 0x1c, 0x7d, 0x72, 0xe6, 0xd4, + 0x29, 0xac, 0x13, 0x78, 0x73, 0xa9, 0xaa, 0x4a, 0x64, 0x4c, 0xb4, 0x7e, + 0x23, 0xdf, 0x27, 0xc8, 0xb2, 0xcc, 0xc5, 0xa2, 0x0b, 0x14, 0x5f, 0xba, + 0xc8, 0x8e, 0xb7, 0xde, 0x24, 0x2c, 0x3c, 0x8c, 0xd0, 0xd0, 0x30, 0x4c, + 0x26, 0x4f, 0x8a, 0x2e, 0x14, 0xd2, 0xdc, 0xd4, 0x74, 0xd3, 0x0b, 0xce, + 0xd7, 0xff, 0xf8, 0x1a, 0x97, 0x2e, 0x16, 0xa1, 0x28, 0x0a, 0xcd, 0x4d, + 0x4d, 0x34, 0x36, 0x36, 0xd0, 0xd1, 0xd1, 0x71, 0x47, 0xcd, 0xcb, 0x4d, + 0x9e, 0x26, 0x42, 0x43, 0x43, 0x51, 0x94, 0x89, 0xc7, 0x51, 0x51, 0x14, + 0x70, 0x73, 0x77, 0x27, 0x28, 0x28, 0x98, 0x99, 0xb3, 0x66, 0x31, 0x3f, + 0x25, 0x95, 0xb4, 0xb4, 0x85, 0x04, 0x87, 0x84, 0x8c, 0xfb, 0xbd, 0xd0, + 0xd0, 0x50, 0x22, 0x22, 0x22, 0x46, 0x7c, 0x1e, 0x18, 0x14, 0x8c, 0x20, + 0x8e, 0xac, 0xb0, 0x1d, 0x1c, 0x12, 0xc2, 0x8f, 0xfe, 0xe6, 0x55, 0x32, + 0x97, 0x2d, 0xe7, 0x48, 0xd6, 0x61, 0x72, 0x73, 0x4e, 0x50, 0x73, 0xf5, + 0x2a, 0xfd, 0xfd, 0xfd, 0x4e, 0x93, 0x7b, 0xa3, 0xd1, 0x05, 0x3f, 0x7f, + 0x3f, 0x66, 0xcd, 0x9a, 0xcd, 0xd2, 0xcc, 0x65, 0x64, 0x2e, 0x7f, 0x80, + 0xe8, 0xe8, 0x98, 0x89, 0x7f, 0xaf, 0xc9, 0x93, 0x17, 0x5e, 0x7c, 0x89, + 0x8c, 0xa5, 0x4b, 0x39, 0x96, 0x7d, 0x94, 0xdc, 0x9c, 0x93, 0x94, 0x96, + 0x96, 0xd0, 0xd3, 0xdd, 0x8d, 0xc3, 0xe1, 0x70, 0xa6, 0xa9, 0xb9, 0xbb, + 0xbb, 0x13, 0x15, 0x1d, 0xc3, 0x92, 0x8c, 0x0c, 0x56, 0xae, 0x5a, 0x43, + 0xca, 0x82, 0x54, 0xa7, 0x69, 0xfe, 0x58, 0xc4, 0xc4, 0xc6, 0xf1, 0xd3, + 0x9f, 0xff, 0x82, 0x35, 0x0f, 0xae, 0xe5, 0xe4, 0x89, 0xe3, 0xe4, 0x9d, + 0xca, 0xa5, 0xba, 0xaa, 0x12, 0xb3, 0xd9, 0x8c, 0x2c, 0xcb, 0xce, 0x94, + 0x36, 0x49, 0x92, 0x30, 0x99, 0x3c, 0x89, 0x89, 0x8d, 0x65, 0xf1, 0x92, + 0x0c, 0x32, 0x97, 0x2d, 0x27, 0x65, 0xc1, 0x02, 0x24, 0xc9, 0x30, 0x6e, + 0xbb, 0xc3, 0xc2, 0xc2, 0x47, 0x15, 0xdf, 0xbc, 0xbd, 0xbd, 0x47, 0xfd, + 0xce, 0xdc, 0x79, 0xf3, 0x79, 0x6e, 0xfb, 0x0b, 0xbc, 0xf6, 0x87, 0xdf, + 0xd1, 0xd7, 0xdb, 0x37, 0xea, 0x36, 0x87, 0x0f, 0x1d, 0x64, 0xde, 0xfc, + 0x14, 0x96, 0x3f, 0xb0, 0x02, 0x6f, 0x6f, 0xef, 0x51, 0x8f, 0x31, 0xd6, + 0xb3, 0xd7, 0xcd, 0xcd, 0x8d, 0xe0, 0x60, 0x2d, 0x8d, 0x38, 0x65, 0xc1, + 0x02, 0x16, 0xa4, 0x2e, 0x74, 0x56, 0x5e, 0xd6, 0xb9, 0x9f, 0x18, 0x32, + 0x1f, 0x10, 0x21, 0xba, 0xb6, 0x91, 0xc7, 0x8e, 0x1c, 0x63, 0xdb, 0xc1, + 0x2c, 0xa2, 0x9a, 0x9b, 0x70, 0x88, 0x02, 0xaa, 0xaa, 0x50, 0x66, 0xed, + 0x21, 0xdb, 0xdc, 0xc2, 0xfe, 0xee, 0x26, 0x0a, 0xfa, 0x3a, 0xb0, 0xa9, + 0x77, 0xf6, 0xa5, 0x68, 0x5f, 0x5f, 0x1f, 0x47, 0x8e, 0x1c, 0xa1, 0xb4, + 0xb4, 0x94, 0xfc, 0xfc, 0x7c, 0xd6, 0xac, 0x59, 0xc3, 0xdc, 0xb9, 0x73, + 0xf1, 0xf7, 0xf7, 0xc7, 0xcd, 0xcd, 0xcd, 0xe9, 0x3b, 0x5a, 0x53, 0x53, + 0x43, 0x41, 0x41, 0x01, 0xfb, 0xf6, 0xed, 0x63, 0xff, 0xfe, 0xfd, 0xc3, + 0x22, 0xe3, 0x54, 0x55, 0xe5, 0xc3, 0x0f, 0x3f, 0xa4, 0xb7, 0xb7, 0x97, + 0x27, 0x9f, 0x7c, 0x92, 0x8c, 0x8c, 0x0c, 0x82, 0x83, 0x83, 0x9d, 0x82, + 0xdc, 0xf9, 0xf3, 0xe7, 0xd9, 0xbb, 0x77, 0x2f, 0x3b, 0x76, 0xec, 0xe0, + 0xab, 0xaf, 0xbe, 0x02, 0x34, 0x4f, 0xd0, 0xcf, 0x3f, 0xff, 0x1c, 0x87, + 0xc3, 0xc1, 0x13, 0x4f, 0x3c, 0x41, 0x66, 0x66, 0x26, 0xa1, 0xa1, 0xa1, + 0xf8, 0xfb, 0xfb, 0x63, 0xb3, 0xd9, 0x28, 0x2c, 0x2c, 0x64, 0xef, 0xde, + 0xbd, 0xec, 0xdc, 0xb9, 0x93, 0x2b, 0x57, 0xae, 0x38, 0xdb, 0x9a, 0x9d, + 0x9d, 0x8d, 0xa2, 0x28, 0x3c, 0xf5, 0xd4, 0x53, 0xac, 0x5c, 0xb9, 0xd2, + 0x79, 0x9c, 0xda, 0xda, 0x5a, 0x0a, 0x0a, 0x0a, 0x88, 0x8c, 0x8c, 0x24, + 0x25, 0x25, 0xc5, 0x29, 0xd2, 0xb5, 0xb5, 0xb5, 0x71, 0xe5, 0xca, 0x15, + 0xfa, 0xfb, 0xfb, 0xb1, 0x58, 0x2c, 0x48, 0x92, 0xc4, 0x91, 0x23, 0x47, + 0x90, 0x65, 0x99, 0xea, 0xea, 0x6a, 0x1e, 0x78, 0xe0, 0x01, 0x22, 0x22, + 0x22, 0x08, 0x08, 0x08, 0xc0, 0xe1, 0x70, 0x70, 0xf1, 0xe2, 0x45, 0x0e, + 0x1e, 0x3c, 0xc8, 0xce, 0x9d, 0x3b, 0x39, 0x7f, 0xfe, 0xfc, 0xa8, 0xcf, + 0xc6, 0xa6, 0xa6, 0x26, 0xca, 0xcb, 0xcb, 0xa9, 0xaa, 0xaa, 0x9a, 0xf4, + 0x73, 0xab, 0xb9, 0xb9, 0x99, 0x92, 0x92, 0x12, 0xec, 0x76, 0x3b, 0xad, + 0xad, 0xad, 0x34, 0x36, 0x36, 0xf2, 0xc6, 0x1b, 0x6f, 0x60, 0xb5, 0x5a, + 0x59, 0xb3, 0x66, 0x0d, 0xe1, 0xe1, 0xe1, 0x78, 0x7b, 0x7b, 0xd3, 0xd8, + 0xd8, 0xc8, 0xdb, 0x6f, 0xbf, 0x8d, 0xc1, 0x60, 0x60, 0xe1, 0xc2, 0x85, + 0xd4, 0xd4, 0xd4, 0x60, 0xb1, 0x5c, 0x8b, 0x0c, 0xb5, 0xd9, 0x6c, 0xd4, + 0xd5, 0xd5, 0x61, 0xb7, 0xdb, 0xe9, 0xeb, 0xeb, 0x23, 0x3f, 0x3f, 0x9f, + 0x8b, 0x17, 0x2f, 0xea, 0xb7, 0x9f, 0x8e, 0x8e, 0x8e, 0x8e, 0xce, 0x94, + 0xa0, 0x0b, 0x80, 0x53, 0xba, 0xc0, 0xf4, 0x64, 0x71, 0x66, 0x26, 0xd9, + 0x87, 0x0f, 0xd3, 0x39, 0xe0, 0xf3, 0x31, 0x1e, 0x0e, 0x87, 0x83, 0xf2, + 0xd2, 0x52, 0x7e, 0xf3, 0x2f, 0xff, 0xc2, 0xfb, 0x3b, 0x76, 0x30, 0x67, + 0xfe, 0x7c, 0x62, 0xa7, 0x4f, 0x27, 0x28, 0x38, 0x18, 0xa3, 0xd1, 0x88, + 0x22, 0x2b, 0x58, 0x2c, 0x66, 0x5a, 0x5b, 0x5a, 0x68, 0x6a, 0x6c, 0xe0, + 0x4c, 0xee, 0xa9, 0x3b, 0xfa, 0xfb, 0x44, 0x51, 0xc4, 0xc3, 0xc3, 0x63, + 0xc2, 0xed, 0x5a, 0x5b, 0x5a, 0x38, 0x71, 0x34, 0x9b, 0xb8, 0x19, 0x33, + 0xbe, 0x99, 0x53, 0xfc, 0x81, 0xb7, 0xe1, 0x13, 0x45, 0x5c, 0x76, 0xf7, + 0xf4, 0x70, 0x36, 0x3f, 0x9f, 0x65, 0x2b, 0x57, 0xe2, 0x3a, 0xe0, 0x89, + 0x76, 0xfd, 0x24, 0xf2, 0xfc, 0x97, 0x5f, 0xd2, 0xde, 0xd6, 0x7a, 0xdb, + 0xda, 0xda, 0xde, 0xd6, 0x46, 0x79, 0xc9, 0x15, 0xc2, 0x47, 0x11, 0x1d, + 0x06, 0xf9, 0x32, 0x3f, 0x9f, 0xc2, 0x73, 0xe7, 0x26, 0x35, 0x89, 0x4d, + 0x48, 0x48, 0xd4, 0x6f, 0xe4, 0xfb, 0x0c, 0x2d, 0x55, 0xa9, 0x9d, 0x8e, + 0x8e, 0x76, 0x8a, 0x2f, 0x5d, 0x9a, 0x92, 0x7d, 0x9a, 0xcd, 0x66, 0x0e, + 0x1f, 0x3a, 0x78, 0x57, 0xfd, 0xce, 0x8d, 0x1b, 0x1f, 0x21, 0x3d, 0x7d, + 0xc9, 0xe4, 0x1e, 0x8c, 0x06, 0x09, 0x37, 0x77, 0x77, 0x3c, 0x3d, 0xbd, + 0xf0, 0xf0, 0xf0, 0x98, 0x50, 0x10, 0x03, 0xcd, 0xe8, 0xfe, 0x27, 0x3f, + 0xfb, 0xe5, 0xe8, 0x45, 0x4d, 0x04, 0xc1, 0x59, 0x4c, 0x63, 0xb4, 0x71, + 0x35, 0x35, 0x6d, 0x21, 0x29, 0x0b, 0x52, 0x79, 0xfe, 0x85, 0x17, 0xa9, + 0xae, 0xae, 0xa2, 0xa5, 0xb9, 0x99, 0xbe, 0xfe, 0x3e, 0x5c, 0x5c, 0x5c, + 0xf0, 0xf7, 0x0f, 0x20, 0x22, 0x22, 0x82, 0xd0, 0xd0, 0x30, 0xdc, 0x27, + 0x31, 0xfe, 0x5e, 0x3f, 0x96, 0x25, 0x24, 0xce, 0x24, 0x21, 0x71, 0x26, + 0x4f, 0x6d, 0x7b, 0x96, 0x86, 0xfa, 0x3a, 0x1a, 0x1a, 0x1a, 0xe8, 0xec, + 0xe8, 0xc0, 0x21, 0x3b, 0x30, 0x99, 0x3c, 0x09, 0x0e, 0x0e, 0x26, 0x32, + 0x32, 0x8a, 0xa0, 0xe0, 0xe0, 0x1b, 0x8a, 0x8e, 0x93, 0x24, 0x03, 0x69, + 0x0b, 0x17, 0x91, 0x9a, 0xb6, 0x90, 0xe7, 0xbf, 0xf5, 0x22, 0xf5, 0xf5, + 0xf5, 0x34, 0x36, 0x34, 0xd0, 0xd1, 0xd1, 0x8e, 0xcd, 0x6a, 0xc5, 0xc5, + 0xc5, 0x05, 0x3f, 0x3f, 0x7f, 0x42, 0xc3, 0xc2, 0x08, 0x8f, 0x88, 0x18, + 0x91, 0x4e, 0x3c, 0x56, 0x7b, 0x37, 0x6f, 0x79, 0x94, 0xa5, 0x99, 0xcb, + 0x46, 0xfd, 0xbb, 0x9f, 0xbf, 0xff, 0x98, 0xe7, 0x62, 0xcb, 0x63, 0x5b, + 0x99, 0x9f, 0x92, 0x32, 0x6e, 0xb5, 0x73, 0x1f, 0x5f, 0x5f, 0x24, 0x49, + 0xe2, 0xf1, 0x27, 0x9f, 0x66, 0xcd, 0x83, 0xeb, 0x26, 0xd5, 0x1e, 0x49, + 0x12, 0x71, 0x77, 0xf7, 0xc0, 0xd3, 0xcb, 0x13, 0x0f, 0x0f, 0xd3, 0x7d, + 0x63, 0x6f, 0xa1, 0x33, 0xda, 0x05, 0x31, 0xf0, 0xcf, 0x05, 0xa2, 0xab, + 0x1b, 0x79, 0xf2, 0x40, 0x16, 0x5b, 0x8f, 0x1e, 0x27, 0xaa, 0xa9, 0x05, + 0x59, 0x94, 0x68, 0xb4, 0xf7, 0x72, 0xc4, 0xdc, 0xc4, 0x17, 0xdd, 0xf5, + 0x9c, 0xeb, 0xef, 0xa4, 0x53, 0xbe, 0x7b, 0x22, 0x9d, 0x55, 0x55, 0xa5, + 0xa6, 0xa6, 0x86, 0xd7, 0x5e, 0x7b, 0x8d, 0xdd, 0xbb, 0x77, 0x13, 0x17, + 0x17, 0x47, 0x78, 0x78, 0x38, 0x26, 0x93, 0xc9, 0x59, 0xc1, 0xb7, 0xb6, + 0xb6, 0x96, 0xaa, 0xaa, 0x2a, 0xba, 0xba, 0xba, 0xc6, 0x8c, 0xd2, 0xde, + 0xbb, 0x77, 0x2f, 0x67, 0xce, 0x9c, 0x61, 0xfa, 0xf4, 0xe9, 0x44, 0x45, + 0x45, 0xe1, 0xe6, 0xe6, 0x46, 0x77, 0x77, 0x37, 0xe5, 0xe5, 0xe5, 0x54, + 0x54, 0x54, 0x0c, 0x13, 0xb2, 0x06, 0x39, 0x78, 0xf0, 0x20, 0x05, 0x05, + 0x05, 0xcc, 0x98, 0x31, 0x83, 0xc8, 0xc8, 0x48, 0xdc, 0xdd, 0xdd, 0xe9, + 0xee, 0xee, 0xa6, 0xb2, 0xb2, 0x92, 0xd2, 0xd2, 0x52, 0xfa, 0xfa, 0xfa, + 0x86, 0x55, 0xda, 0xb6, 0x5a, 0xad, 0x9c, 0x38, 0x71, 0x82, 0xc2, 0xc2, + 0x42, 0x66, 0xcd, 0x9a, 0x45, 0x44, 0x44, 0x04, 0x82, 0x20, 0x50, 0x59, + 0x59, 0x49, 0x7f, 0x7f, 0x3f, 0x3f, 0xff, 0xf9, 0xcf, 0x49, 0x49, 0x49, + 0xa1, 0xaf, 0xaf, 0x0f, 0xb3, 0xd9, 0xcc, 0x17, 0x5f, 0x7c, 0xc1, 0xc5, + 0x8b, 0x17, 0xb1, 0xd9, 0x6c, 0xd4, 0xd7, 0xd7, 0x3b, 0xf7, 0x75, 0xfc, + 0xf8, 0x71, 0x2e, 0x5e, 0xbc, 0x48, 0x6c, 0x6c, 0x2c, 0x31, 0x31, 0x31, + 0x98, 0x4c, 0x26, 0xcc, 0x66, 0xb3, 0xb3, 0xad, 0xdd, 0xdd, 0xdd, 0xa3, + 0xfe, 0xc6, 0x8a, 0x8a, 0x0a, 0x7e, 0xf5, 0xab, 0x5f, 0xf1, 0xfa, 0xeb, + 0xaf, 0x63, 0xb1, 0x58, 0xa8, 0xac, 0xac, 0x9c, 0x54, 0x94, 0xf3, 0x67, + 0x9f, 0x7d, 0x46, 0x4e, 0x4e, 0x8e, 0xb3, 0xba, 0x31, 0x40, 0x5e, 0x5e, + 0x1e, 0x57, 0xae, 0x5c, 0x61, 0xe7, 0xce, 0x9d, 0x44, 0x46, 0x46, 0x22, + 0x8a, 0x22, 0x75, 0x75, 0x75, 0x14, 0x17, 0x17, 0xe3, 0xe1, 0xe1, 0x81, + 0xa7, 0xa7, 0x27, 0x56, 0xab, 0x95, 0xe6, 0xe6, 0x66, 0xe7, 0x7e, 0x3c, + 0x3d, 0x3d, 0x89, 0x8f, 0x8f, 0xc7, 0xcb, 0xcb, 0x8b, 0xfc, 0xfc, 0x7c, + 0x72, 0x72, 0x72, 0xf4, 0xe2, 0x1f, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x53, + 0x86, 0x2e, 0x00, 0x4e, 0xb1, 0x40, 0xb6, 0x20, 0x2d, 0x8d, 0x8c, 0xe5, + 0xcb, 0xd9, 0xfb, 0xe9, 0xa7, 0x93, 0xfe, 0x5e, 0x5f, 0x6f, 0x2f, 0x55, + 0x15, 0x15, 0x5c, 0xad, 0xaa, 0x72, 0x2e, 0x3a, 0xae, 0x9f, 0xb8, 0x0d, + 0xf5, 0x3a, 0xb9, 0x63, 0xbf, 0x4f, 0x92, 0x08, 0x98, 0x44, 0xd4, 0x83, + 0xc5, 0x6c, 0x66, 0xe7, 0x9b, 0x7f, 0xa6, 0xb3, 0xa3, 0x83, 0xcc, 0x15, + 0x0f, 0xe0, 0xeb, 0xef, 0x8f, 0x20, 0x80, 0xad, 0xdf, 0x8a, 0x9b, 0xbb, + 0x3b, 0x91, 0xd1, 0x51, 0xe3, 0x46, 0x80, 0xdc, 0xf1, 0x9b, 0xc2, 0x68, + 0x24, 0x30, 0x68, 0x72, 0xd1, 0x8b, 0x7b, 0x3f, 0xff, 0x02, 0x57, 0x37, + 0x37, 0x56, 0xad, 0x5b, 0x87, 0x8f, 0x8f, 0x0f, 0xaa, 0xaa, 0xd2, 0xdd, + 0xdd, 0x4d, 0xe9, 0x95, 0x2b, 0x1c, 0x3f, 0x72, 0x84, 0x73, 0x05, 0x5f, + 0xd2, 0x3b, 0x46, 0x35, 0xce, 0xa9, 0xa0, 0xa6, 0xaa, 0x9a, 0xff, 0xf7, + 0xe7, 0xbf, 0x60, 0xd1, 0x92, 0x25, 0x64, 0x2c, 0x5f, 0x4e, 0xdc, 0x8c, + 0x19, 0x98, 0x3c, 0x4d, 0x18, 0x24, 0x03, 0x7d, 0x7d, 0x7d, 0x5c, 0x2c, + 0xbc, 0xc0, 0xee, 0xf7, 0xde, 0xa5, 0x66, 0xe0, 0xda, 0x1a, 0x8f, 0xf0, + 0x88, 0x08, 0x22, 0x63, 0x62, 0xf4, 0x1b, 0x59, 0xe7, 0x9e, 0xc4, 0xc7, + 0xd7, 0x17, 0x9f, 0x01, 0xd3, 0xf5, 0xdb, 0x45, 0x64, 0x54, 0xd4, 0x2d, + 0x3d, 0x3f, 0x42, 0x42, 0x43, 0x09, 0x09, 0x0d, 0xbd, 0x2d, 0x6d, 0xf3, + 0xf6, 0xf6, 0xc6, 0xdb, 0xdb, 0xfb, 0x96, 0x7d, 0xf7, 0x46, 0x68, 0x22, + 0x82, 0x80, 0xbf, 0x7f, 0x00, 0xfe, 0xfe, 0x01, 0x24, 0x27, 0xcf, 0xb9, + 0xe5, 0xfd, 0xf9, 0xfa, 0xf9, 0xe1, 0xeb, 0xe7, 0x77, 0x53, 0xed, 0x88, + 0x8d, 0x9b, 0x3e, 0xa9, 0x6d, 0x03, 0x03, 0x03, 0xc7, 0x4c, 0x71, 0xd6, + 0xd1, 0x19, 0x1d, 0x15, 0x64, 0x07, 0x88, 0x22, 0xd1, 0x55, 0x0d, 0x6c, + 0xdb, 0x97, 0xc5, 0x96, 0x63, 0xb9, 0xc4, 0x34, 0xb6, 0xd0, 0x22, 0xdb, + 0x38, 0xde, 0xd3, 0xc2, 0x61, 0x73, 0x23, 0xa7, 0xfb, 0xda, 0x68, 0x76, + 0x58, 0xb1, 0xab, 0x77, 0x9f, 0x15, 0x8a, 0xaa, 0xaa, 0xd8, 0xed, 0x76, + 0x1a, 0x1b, 0x1b, 0x69, 0x6b, 0x6b, 0xc3, 0x60, 0x30, 0x38, 0x05, 0x75, + 0x59, 0x96, 0x27, 0xb4, 0x78, 0x00, 0xed, 0x85, 0x51, 0x73, 0x73, 0x33, + 0x1d, 0x1d, 0x1d, 0x14, 0x16, 0x6a, 0xde, 0xb0, 0x8a, 0xa2, 0x60, 0xb3, + 0xd9, 0xc6, 0x7c, 0xc9, 0x28, 0xcb, 0x32, 0x2d, 0x2d, 0x2d, 0x74, 0x76, + 0x76, 0x4e, 0xf8, 0x1d, 0x7f, 0x7f, 0x7f, 0x96, 0x2d, 0x5b, 0x46, 0x6a, + 0x6a, 0x2a, 0x15, 0x15, 0x15, 0x7c, 0xf4, 0xd1, 0x47, 0x1c, 0x3f, 0x7e, + 0x1c, 0x49, 0xd2, 0x32, 0x29, 0xd2, 0xd2, 0xd2, 0x88, 0x8d, 0xd5, 0x8a, + 0x4b, 0xd5, 0xd6, 0xd6, 0x62, 0xb1, 0x58, 0xe8, 0xe9, 0xe9, 0x71, 0x56, + 0xd7, 0x1d, 0x2a, 0x24, 0xaa, 0xaa, 0x4a, 0x5b, 0x5b, 0x1b, 0x5d, 0x5d, + 0x5d, 0x5c, 0xba, 0x74, 0xc9, 0xe9, 0xcd, 0x37, 0x5e, 0x5b, 0x41, 0x7b, + 0x39, 0x5f, 0x5f, 0x5f, 0x4f, 0x63, 0x63, 0xe3, 0xb0, 0xf9, 0xf7, 0x44, + 0x0c, 0x56, 0x3f, 0x1e, 0xfa, 0x1d, 0x45, 0x51, 0x68, 0x6b, 0x6b, 0x23, + 0x3f, 0x3f, 0xdf, 0x19, 0x6d, 0xe8, 0x70, 0x38, 0xb0, 0xd9, 0x6c, 0xc3, + 0xfc, 0xb2, 0x07, 0xb7, 0x77, 0x75, 0x75, 0x65, 0xd1, 0xa2, 0x45, 0x64, + 0x66, 0x66, 0x22, 0x8a, 0x22, 0xa7, 0x4e, 0x9d, 0x72, 0x46, 0x54, 0xea, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0x4c, 0x89, 0xd6, 0xa1, 0x77, 0xc1, 0xd4, + 0xe2, 0xe7, 0xef, 0xcf, 0xe6, 0xad, 0x5b, 0xb9, 0x74, 0xe1, 0x02, 0xd5, + 0x95, 0x95, 0x37, 0xf4, 0x5d, 0xe5, 0x2e, 0xf7, 0xce, 0x13, 0x05, 0x81, + 0x98, 0xb8, 0xb8, 0x61, 0x15, 0xcb, 0xc6, 0xa2, 0xa3, 0xbd, 0x9d, 0x1d, + 0x6f, 0xbc, 0xce, 0xee, 0xf7, 0xde, 0xc5, 0xcb, 0xdb, 0x07, 0x44, 0xb0, + 0xf6, 0xf5, 0x13, 0x15, 0x1d, 0xcd, 0x3f, 0xfc, 0xf3, 0x3f, 0x13, 0x19, + 0x7d, 0xf7, 0xa6, 0x9a, 0x1a, 0x8d, 0x46, 0xc2, 0xa7, 0x45, 0xa2, 0xa2, + 0x22, 0x4c, 0x10, 0x05, 0x68, 0x31, 0xf7, 0xb0, 0xe3, 0x8d, 0x37, 0xf8, + 0x74, 0xf7, 0x6e, 0xbc, 0x7d, 0x7d, 0xb5, 0x37, 0xe9, 0xdd, 0xdd, 0xf4, + 0x74, 0x77, 0x83, 0xc0, 0x84, 0xdf, 0x9f, 0x0a, 0xcc, 0x3d, 0x3d, 0x64, + 0x1d, 0x38, 0x40, 0xd6, 0x81, 0x03, 0x98, 0x3c, 0x3d, 0x35, 0x1f, 0x37, + 0x17, 0x23, 0x96, 0x1e, 0x33, 0x5d, 0x9d, 0x9d, 0x93, 0x9e, 0xbc, 0xce, + 0x4d, 0x49, 0x71, 0x56, 0xa5, 0xd3, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0x71, 0x4e, 0xd0, 0x10, 0x3a, 0xda, 0x89, 0xc8, 0x3d, 0xc9, 0xf6, 0x26, + 0x2b, 0x9b, 0x4e, 0x9f, 0xc5, 0xbd, 0xf6, 0x2a, 0x47, 0x7a, 0xdb, 0xc9, + 0xee, 0x6f, 0xe6, 0x98, 0xa5, 0x99, 0x3a, 0x47, 0x1f, 0x66, 0xe5, 0x9b, + 0xe1, 0x0b, 0x6c, 0xb7, 0xdb, 0x6f, 0xc9, 0x8b, 0xf5, 0x66, 0xbe, 0x3f, + 0x99, 0xef, 0xf8, 0xfa, 0xfa, 0xb2, 0x66, 0xcd, 0x1a, 0xb6, 0x6f, 0xdf, + 0x4e, 0x55, 0x55, 0x15, 0x06, 0x83, 0x81, 0x63, 0xc7, 0x8e, 0xd1, 0xdb, + 0xdb, 0xcb, 0x8c, 0x19, 0x33, 0xd8, 0xba, 0x75, 0x2b, 0xc9, 0xc9, 0xc9, + 0x74, 0x74, 0x74, 0x70, 0xee, 0xdc, 0x39, 0x67, 0x64, 0xdc, 0x44, 0x82, + 0x9e, 0xe3, 0x06, 0xfd, 0x9a, 0x55, 0x55, 0xbd, 0x61, 0xcb, 0x8a, 0xf1, + 0xe6, 0xf0, 0xa3, 0xfd, 0xf6, 0xd1, 0xc4, 0x45, 0x2f, 0x2f, 0x2f, 0x56, + 0xaf, 0x5e, 0xcd, 0xb4, 0x69, 0xd3, 0x28, 0x2b, 0x2b, 0xe3, 0xf8, 0xf1, + 0xe3, 0xd4, 0xd4, 0xd4, 0xe8, 0xf7, 0x9f, 0x8e, 0x8e, 0x8e, 0x8e, 0xce, + 0x94, 0xa1, 0x0b, 0x80, 0xb7, 0x81, 0xf9, 0xa9, 0xa9, 0x6c, 0x7b, 0xe1, + 0x05, 0xfe, 0xfb, 0xb7, 0xbf, 0xa5, 0x7d, 0x02, 0x8f, 0xb8, 0x6f, 0x12, + 0x82, 0x28, 0x32, 0x2b, 0x39, 0x99, 0x09, 0xac, 0xf1, 0xae, 0x6d, 0x2f, + 0x08, 0xf4, 0xf7, 0xf7, 0xd3, 0x3f, 0xc4, 0x7b, 0xae, 0xbd, 0x4d, 0x33, + 0x86, 0xfe, 0x3a, 0x90, 0x15, 0xf9, 0xa6, 0x0a, 0x92, 0x18, 0x8d, 0x46, + 0xe2, 0x66, 0xcc, 0xc0, 0xc3, 0xc3, 0x83, 0xbe, 0xbe, 0xbe, 0x49, 0xfd, + 0xce, 0x9e, 0x9e, 0x1e, 0x7a, 0x7a, 0x7a, 0x86, 0x7d, 0xf6, 0xb5, 0x9e, + 0x9b, 0x81, 0xe3, 0xf5, 0x5a, 0x2c, 0xf4, 0x5a, 0x2c, 0x37, 0x75, 0x6e, + 0x97, 0x2c, 0x5f, 0x86, 0xcb, 0x2d, 0x54, 0x36, 0xd5, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xb9, 0x27, 0x51, 0x55, 0x84, 0xb6, 0x16, 0xdc, 0x3e, 0x78, + 0x13, 0xa1, 0x47, 0xa2, 0xb0, 0xbd, 0x93, 0x92, 0xde, 0x36, 0x72, 0x6d, + 0xed, 0x5c, 0xee, 0xef, 0xa2, 0x43, 0xb1, 0xe9, 0x7d, 0x34, 0x05, 0x74, + 0x77, 0x77, 0x73, 0xf9, 0xf2, 0x65, 0xba, 0xbb, 0xbb, 0x99, 0x37, 0x6f, + 0x1e, 0x3f, 0xfd, 0xe9, 0x4f, 0x79, 0xf0, 0xc1, 0x07, 0xb1, 0x58, 0x2c, + 0x44, 0x47, 0x47, 0x33, 0x77, 0xee, 0x5c, 0x0c, 0x06, 0x03, 0x07, 0x0f, + 0x1e, 0xe4, 0xf4, 0xe9, 0xd3, 0x63, 0xa6, 0xf1, 0x7e, 0x23, 0x17, 0x64, + 0x06, 0x03, 0xc9, 0xc9, 0xc9, 0xac, 0x5f, 0xbf, 0x1e, 0x83, 0xc1, 0x40, + 0x5e, 0x5e, 0x1e, 0xc5, 0xc5, 0xc5, 0x77, 0x7d, 0x70, 0x80, 0x8e, 0x8e, + 0x8e, 0x8e, 0xce, 0x37, 0xec, 0x79, 0xa3, 0x77, 0xc1, 0xd4, 0x23, 0x8a, + 0x22, 0x5b, 0x1e, 0xdf, 0x4a, 0xaf, 0xc5, 0xc2, 0x8e, 0xd7, 0xdf, 0xa0, + 0xa3, 0xfd, 0x6b, 0x16, 0x01, 0xd5, 0xdb, 0x53, 0x2c, 0x44, 0x10, 0x04, + 0x12, 0x67, 0xcd, 0x62, 0xf6, 0xdc, 0xb9, 0x5c, 0xbe, 0x58, 0x74, 0x53, + 0xdf, 0x97, 0x44, 0xe1, 0x6b, 0x13, 0xc7, 0x6e, 0x24, 0x75, 0xe3, 0x7a, + 0xe2, 0xa6, 0x4f, 0x27, 0x61, 0xe6, 0x4c, 0x0a, 0xcf, 0x9d, 0xbb, 0x2f, + 0xae, 0xd9, 0xe4, 0x39, 0x73, 0x99, 0x3b, 0x6f, 0xfe, 0xa4, 0xbc, 0xce, + 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0xee, 0x37, 0xd4, 0xfe, 0x5e, 0x5a, + 0xce, 0x1c, 0xe5, 0x33, 0xc1, 0x0d, 0x59, 0x10, 0xa8, 0x93, 0xfb, 0x74, + 0xe1, 0x6f, 0x8a, 0x69, 0x6d, 0x6d, 0xe5, 0x93, 0x4f, 0x3e, 0xc1, 0xd5, + 0xd5, 0x95, 0xe7, 0x9f, 0x7f, 0x9e, 0xb8, 0xb8, 0x38, 0xb6, 0x6c, 0xd9, + 0x82, 0x28, 0x8a, 0xce, 0x54, 0xe2, 0x63, 0xc7, 0x8e, 0xf1, 0xa7, 0x3f, + 0xfd, 0x89, 0xf2, 0xf2, 0xf2, 0x7b, 0xea, 0xb7, 0x7b, 0x79, 0x79, 0x11, + 0x1b, 0x1b, 0x8b, 0xd1, 0x68, 0xe4, 0xf2, 0xe5, 0xcb, 0x1c, 0x3c, 0x78, + 0x90, 0xa6, 0x9b, 0x2c, 0xc6, 0xa5, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x33, + 0x16, 0xba, 0x00, 0x78, 0x9b, 0x90, 0x24, 0x03, 0x4f, 0x6f, 0xdf, 0x8e, + 0x20, 0x08, 0xbc, 0xf7, 0xf6, 0xdb, 0x34, 0x37, 0x36, 0x7e, 0x2d, 0xc7, + 0x55, 0x14, 0xd5, 0xe9, 0x95, 0x72, 0x3b, 0xf0, 0xf3, 0xf7, 0xe7, 0xa1, + 0x4d, 0x1b, 0x29, 0xbd, 0x5c, 0x8c, 0xe3, 0x0e, 0x56, 0xf4, 0xbc, 0xdd, + 0x04, 0x06, 0x07, 0x93, 0xb9, 0x62, 0x05, 0x97, 0x2f, 0x5e, 0xc2, 0x66, + 0xbf, 0xb7, 0x27, 0xf8, 0x1e, 0x26, 0x13, 0x8f, 0x6c, 0x7d, 0x8c, 0x88, + 0x69, 0xd3, 0xf4, 0x1b, 0x57, 0x47, 0x47, 0x47, 0x47, 0x47, 0x67, 0x14, + 0x54, 0xa0, 0x4b, 0xb6, 0x51, 0x88, 0x2e, 0xfa, 0xdd, 0x4e, 0x1a, 0x1a, + 0x1a, 0x78, 0xed, 0xb5, 0xd7, 0x28, 0x2f, 0x2f, 0x27, 0x23, 0x23, 0x83, + 0xb8, 0xb8, 0x38, 0xdc, 0xdc, 0xdc, 0x68, 0x6d, 0x6d, 0xe5, 0xfc, 0xf9, + 0xf3, 0x9c, 0x38, 0x71, 0x82, 0x73, 0xf7, 0xe0, 0xcb, 0x59, 0x45, 0x51, + 0xa8, 0xaa, 0xaa, 0xe2, 0xb5, 0xd7, 0x5e, 0xa3, 0xad, 0xad, 0x8d, 0xc3, + 0x87, 0x0f, 0xdf, 0x53, 0x11, 0x8e, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x77, + 0x07, 0xba, 0x00, 0x78, 0x1b, 0x31, 0x1a, 0x8d, 0x3c, 0xf9, 0xec, 0xb3, + 0x84, 0x85, 0x87, 0xb3, 0x6b, 0xe7, 0x4e, 0x8a, 0x0a, 0x0b, 0xb1, 0xd9, + 0x6e, 0xd3, 0xc4, 0x51, 0x05, 0x4f, 0x6f, 0x2f, 0xd2, 0xd2, 0x17, 0x31, + 0x23, 0x31, 0xf1, 0xb6, 0xfe, 0xa6, 0x15, 0x0f, 0x3e, 0xc8, 0x85, 0xf3, + 0xe7, 0x39, 0xb4, 0x6f, 0xdf, 0x3d, 0x7b, 0xee, 0x5c, 0x5d, 0x5d, 0x59, + 0xb5, 0x76, 0x2d, 0x17, 0xce, 0x9d, 0xe3, 0xf8, 0xd1, 0x6c, 0xa6, 0x22, + 0x68, 0xd1, 0xe4, 0xe9, 0x49, 0x7f, 0x5f, 0xdf, 0x0d, 0xfb, 0xca, 0x5c, + 0x8f, 0x28, 0x8a, 0x98, 0x3c, 0x3d, 0x71, 0x71, 0x71, 0xa1, 0xad, 0xf5, + 0xd6, 0x2a, 0x0c, 0x0b, 0xa2, 0xc8, 0xfa, 0x8d, 0x1b, 0xc9, 0x5c, 0xb1, + 0x12, 0xf1, 0x36, 0x0a, 0xc7, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x77, + 0x1b, 0x7a, 0x55, 0xe7, 0xbb, 0x93, 0xde, 0xde, 0x5e, 0x3e, 0xfb, 0xec, + 0x33, 0xf6, 0xee, 0xdd, 0x8b, 0x87, 0x87, 0x07, 0x92, 0x24, 0x61, 0xb5, + 0x5a, 0xbf, 0x36, 0x0b, 0x99, 0x3b, 0x41, 0x57, 0x57, 0x17, 0x47, 0x8f, + 0x1e, 0xe5, 0xe8, 0xd1, 0xa3, 0xfa, 0x05, 0x70, 0x2f, 0x33, 0x90, 0x69, + 0xa3, 0x1a, 0x75, 0xcb, 0x1d, 0x1d, 0x9d, 0x9b, 0x7e, 0x76, 0xdb, 0xad, + 0xce, 0x7b, 0x49, 0xe7, 0xc6, 0xd1, 0x05, 0xc0, 0xdb, 0x8c, 0x8b, 0x8b, + 0x0b, 0xab, 0xd6, 0xae, 0x65, 0x7a, 0x7c, 0x3c, 0xb9, 0x27, 0x4e, 0xb0, + 0xff, 0xf3, 0x2f, 0x28, 0xf9, 0xea, 0xf2, 0x2d, 0x8b, 0x40, 0x83, 0xa8, + 0xaa, 0x8a, 0xaf, 0x9f, 0x1f, 0x29, 0x69, 0x69, 0xac, 0x5a, 0xbb, 0x96, + 0x79, 0x0b, 0x52, 0x08, 0x09, 0x0d, 0x1b, 0xb6, 0x8d, 0xa2, 0x28, 0x58, + 0xad, 0xd6, 0x09, 0xf7, 0x63, 0x1f, 0xa8, 0x4a, 0x36, 0x11, 0x21, 0xa1, + 0xa1, 0xbc, 0xf8, 0xbd, 0xef, 0x21, 0x88, 0x22, 0x87, 0xf7, 0xed, 0x45, + 0x51, 0x26, 0x9f, 0x66, 0xeb, 0x70, 0xc8, 0xc3, 0xd2, 0x72, 0x15, 0x45, + 0xc1, 0x3e, 0x09, 0x51, 0xd4, 0x6a, 0xb5, 0xde, 0xb0, 0x0f, 0x8a, 0xaa, + 0x74, 0xdc, 0xea, 0xb6, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, + 0xa8, 0x93, 0x32, 0x7e, 0xb6, 0xd9, 0x6c, 0xa8, 0x8c, 0xfc, 0x0d, 0x51, + 0x31, 0x31, 0xbc, 0xfc, 0xc3, 0x1f, 0x22, 0x4a, 0x12, 0xd9, 0x87, 0x0f, + 0xdf, 0xf4, 0x42, 0xc1, 0xcf, 0xdf, 0x9f, 0x95, 0x0f, 0x3e, 0x48, 0x44, + 0x64, 0x24, 0x6f, 0xff, 0xe9, 0x4f, 0x74, 0x0d, 0x98, 0x56, 0x0f, 0xc5, + 0x6e, 0xb7, 0x0f, 0x4f, 0x57, 0x56, 0x55, 0x64, 0x87, 0x83, 0xd1, 0xcc, + 0x16, 0x15, 0x45, 0x61, 0x46, 0x42, 0x02, 0x5b, 0x9f, 0x7e, 0x8a, 0x83, + 0x7b, 0xf7, 0x91, 0x7b, 0xfc, 0x04, 0x0e, 0xc7, 0x8d, 0x9b, 0x79, 0x1b, + 0x8c, 0x06, 0x1e, 0xde, 0xb2, 0x85, 0x6f, 0xbd, 0xfc, 0xf2, 0xa4, 0xab, + 0x1e, 0xeb, 0xdc, 0xbd, 0xb8, 0xde, 0xc5, 0xfe, 0x8d, 0xa2, 0x28, 0xe2, + 0xe5, 0xe5, 0x45, 0x57, 0x57, 0x97, 0x7e, 0xa2, 0x74, 0x74, 0x74, 0xee, + 0xdc, 0xa2, 0x41, 0x10, 0x10, 0x45, 0xd1, 0xf9, 0xbf, 0x3a, 0x77, 0x37, + 0x0e, 0x87, 0x83, 0xee, 0xee, 0x6e, 0x04, 0x41, 0xb8, 0x69, 0x4b, 0x97, + 0xfb, 0xfd, 0x7a, 0x37, 0x18, 0x0c, 0x48, 0x92, 0x01, 0x41, 0xd4, 0xc5, + 0xee, 0xbb, 0x81, 0xf6, 0xb4, 0xa5, 0xb4, 0xa7, 0x2d, 0xd5, 0x3b, 0x42, + 0x47, 0x47, 0xe7, 0x8e, 0xa1, 0x0b, 0x80, 0x5f, 0xd3, 0x03, 0x38, 0x26, + 0x2e, 0x8e, 0xf0, 0x69, 0xd3, 0xc8, 0x7c, 0xe0, 0x01, 0x2e, 0x5e, 0xb8, + 0x40, 0xde, 0xc9, 0x93, 0x14, 0x9e, 0x3b, 0x47, 0x7d, 0x6d, 0xed, 0xa4, + 0xaa, 0xea, 0x0e, 0x45, 0x55, 0x55, 0x3c, 0x4c, 0xa6, 0xff, 0xbf, 0xbd, + 0x7b, 0x8f, 0x92, 0xa2, 0xbc, 0x13, 0xff, 0xff, 0xa9, 0xaa, 0xbe, 0x4d, + 0xcf, 0x30, 0x57, 0x18, 0xee, 0x88, 0x5c, 0x04, 0x62, 0x54, 0x54, 0x08, + 0xeb, 0x25, 0x0a, 0x8a, 0x7a, 0xb2, 0xa8, 0x2c, 0xf1, 0xe7, 0x1d, 0x0f, + 0x60, 0x34, 0x31, 0x26, 0x5e, 0x50, 0xc3, 0xea, 0xaa, 0x31, 0x1b, 0xbc, + 0xec, 0x39, 0x71, 0xcd, 0xaa, 0x59, 0xb9, 0x69, 0xd6, 0x75, 0x61, 0x35, + 0x9b, 0x88, 0xc6, 0xcb, 0xe2, 0x1a, 0x60, 0x93, 0xac, 0x6e, 0xdc, 0x18, + 0x17, 0x88, 0x72, 0x37, 0x20, 0x10, 0xb9, 0x0e, 0x33, 0xcc, 0xbd, 0x67, + 0xba, 0xbb, 0xfa, 0xf7, 0x87, 0x3b, 0x7e, 0x1d, 0xaa, 0xba, 0xa7, 0xab, + 0xbb, 0x6e, 0x5d, 0xf3, 0x7e, 0x9d, 0xc3, 0xe1, 0x9c, 0xa7, 0xab, 0x9e, + 0xe7, 0xa9, 0xa7, 0xaa, 0x6b, 0xaa, 0x3e, 0xfd, 0x54, 0x7d, 0xe4, 0xa4, + 0x89, 0x13, 0x65, 0xca, 0xb4, 0xaf, 0xc8, 0x99, 0x5f, 0x99, 0x26, 0x27, + 0x8e, 0x1d, 0x2b, 0x35, 0xb5, 0xb5, 0xa6, 0x8f, 0xff, 0x56, 0xd7, 0xd4, + 0xc8, 0xe4, 0x33, 0xce, 0x94, 0x8d, 0xff, 0xfb, 0x87, 0xac, 0xaf, 0x07, + 0xec, 0x79, 0xbf, 0xdf, 0x80, 0xca, 0xca, 0xbc, 0xb6, 0x67, 0xfc, 0x84, + 0x09, 0x72, 0xd7, 0x5f, 0xff, 0xb5, 0x9c, 0x76, 0xc6, 0xe9, 0xb2, 0xe6, + 0x97, 0xaf, 0xcb, 0xe6, 0x8f, 0x3e, 0x14, 0x3d, 0x9d, 0xce, 0xba, 0x1d, + 0x3d, 0xef, 0xe3, 0xab, 0xaa, 0xa9, 0x92, 0x78, 0x3c, 0xfe, 0x79, 0x79, + 0x79, 0x45, 0x85, 0x8c, 0x1c, 0x75, 0x82, 0xb4, 0xb5, 0xb6, 0x65, 0xbd, + 0xc0, 0xd3, 0x75, 0x5d, 0xc6, 0x8c, 0x1d, 0x27, 0xf1, 0xf2, 0x72, 0x4b, + 0xe3, 0x5e, 0x5e, 0x51, 0x21, 0xa3, 0x46, 0x8f, 0x96, 0x3f, 0xef, 0xdb, + 0xf7, 0xf9, 0x05, 0xff, 0xf1, 0xf5, 0xa7, 0x53, 0x29, 0x39, 0x71, 0xdc, + 0x58, 0x29, 0x2b, 0x8b, 0x9b, 0xd6, 0x31, 0xe9, 0xe4, 0x93, 0x65, 0xd1, + 0x83, 0x0f, 0xca, 0x97, 0x4e, 0x39, 0x45, 0xde, 0x7e, 0xe3, 0x0d, 0xf9, + 0x78, 0xe7, 0xce, 0x3e, 0xf7, 0x55, 0x4f, 0x1b, 0x63, 0xc6, 0x8d, 0x93, + 0x73, 0xce, 0x3f, 0x5f, 0xce, 0x39, 0xef, 0x3c, 0x99, 0x74, 0xf2, 0xc9, + 0xd2, 0xde, 0xde, 0x2e, 0xbf, 0x7b, 0xe7, 0x1d, 0xd9, 0xfc, 0xc7, 0x3f, + 0x8a, 0xa6, 0x69, 0x9f, 0xef, 0xf7, 0xae, 0xae, 0x2e, 0x19, 0x31, 0x6a, + 0xa4, 0x68, 0x5f, 0xb8, 0x19, 0x09, 0x47, 0x22, 0x32, 0x72, 0xd4, 0x09, + 0xb2, 0xb9, 0xea, 0x43, 0xc3, 0x4d, 0x4a, 0x24, 0x12, 0x95, 0x69, 0xe7, + 0x9c, 0x23, 0x97, 0xcc, 0xba, 0x54, 0x4e, 0x9f, 0x32, 0x55, 0xfe, 0xf0, + 0xde, 0xff, 0xc8, 0xda, 0xb7, 0xd6, 0xc8, 0xc6, 0x0f, 0x3e, 0xf8, 0xfc, + 0x42, 0x39, 0x57, 0xdf, 0x14, 0x45, 0x91, 0x2f, 0x9f, 0x76, 0x9a, 0x7c, + 0xfd, 0xea, 0xab, 0xe5, 0xdc, 0xf3, 0xcf, 0x97, 0x9a, 0xda, 0x5a, 0xbe, + 0xa4, 0x01, 0x30, 0x7c, 0xf8, 0x70, 0xd1, 0x34, 0xcd, 0x72, 0xb6, 0x43, + 0x57, 0xfe, 0xd0, 0x84, 0x42, 0x72, 0xd6, 0xd9, 0xe7, 0xc8, 0xe1, 0xc3, + 0x87, 0x65, 0xc3, 0xff, 0x7e, 0xc0, 0x8d, 0x1c, 0x00, 0xcf, 0xae, 0xc7, + 0xa2, 0xb1, 0x98, 0x0c, 0x18, 0x50, 0x29, 0xb5, 0xb5, 0x75, 0x12, 0x8d, + 0x46, 0x7d, 0x79, 0xce, 0x84, 0xf9, 0x75, 0x15, 0xac, 0x89, 0xc5, 0x62, + 0x52, 0x5f, 0x5f, 0x2f, 0x15, 0x15, 0xe5, 0x12, 0x0e, 0x87, 0x99, 0xf1, + 0x0a, 0x00, 0x10, 0x65, 0xc7, 0xae, 0xbd, 0xfc, 0x55, 0x75, 0x59, 0xcf, + 0x8c, 0xbc, 0xe6, 0x63, 0xc7, 0x64, 0xcf, 0xee, 0xdd, 0xf2, 0xf1, 0xf6, + 0xed, 0xf2, 0xc9, 0xee, 0x5d, 0xb2, 0xff, 0xd3, 0x4f, 0xa5, 0xe1, 0xf0, + 0x11, 0x69, 0x6b, 0x6d, 0x93, 0x44, 0x67, 0xa7, 0xe8, 0x19, 0x5d, 0x14, + 0x51, 0x24, 0x16, 0x8f, 0x49, 0x75, 0x75, 0x8d, 0x0c, 0x1e, 0x3a, 0x54, + 0x46, 0x8d, 0x1e, 0x2d, 0x27, 0x4d, 0x98, 0x20, 0xe3, 0x26, 0x4c, 0x90, + 0xc1, 0x43, 0x87, 0x4a, 0x45, 0x45, 0x85, 0x68, 0x9a, 0xd6, 0xe7, 0x1f, + 0xf5, 0xe6, 0xe6, 0x63, 0xd2, 0xd6, 0xda, 0x9a, 0x23, 0x00, 0x28, 0x52, + 0x31, 0x60, 0x80, 0x54, 0x55, 0x55, 0x5b, 0xdb, 0x96, 0x74, 0x5a, 0x9a, + 0x9b, 0x9b, 0x65, 0xc7, 0xb6, 0x6d, 0xf2, 0xc7, 0x0d, 0x1b, 0x64, 0xd7, + 0xc7, 0x7f, 0x92, 0x43, 0x07, 0x0e, 0x48, 0x7b, 0x7b, 0x9b, 0xa4, 0x53, + 0x69, 0x89, 0x44, 0x23, 0x52, 0x3f, 0x64, 0xb0, 0x8c, 0x19, 0x3b, 0x4e, + 0x4e, 0x9a, 0x34, 0x49, 0x4e, 0x3e, 0xf5, 0x54, 0x19, 0x31, 0x72, 0xe4, + 0xe7, 0xfd, 0xcd, 0x64, 0x32, 0xd2, 0x78, 0xf4, 0xa8, 0x74, 0x76, 0x76, + 0x66, 0x0d, 0x00, 0x2a, 0x8a, 0x22, 0xb1, 0x58, 0x4c, 0x6a, 0xeb, 0xea, + 0x2c, 0x07, 0x4a, 0x9b, 0x8f, 0x1d, 0x93, 0xb6, 0xb6, 0xb6, 0xcf, 0xeb, + 0x31, 0xab, 0xbf, 0xa7, 0xee, 0x5c, 0xb3, 0x01, 0xd2, 0xe9, 0xb4, 0x1c, + 0x6d, 0x68, 0x90, 0xad, 0x1f, 0x7d, 0x24, 0x1b, 0xfe, 0xf0, 0x81, 0xec, + 0xdc, 0xb1, 0x5d, 0x8e, 0x1c, 0x3a, 0x24, 0x2d, 0xcd, 0xc7, 0xa4, 0xab, + 0x2b, 0x29, 0x5a, 0x48, 0x93, 0xea, 0xea, 0x6a, 0x19, 0x36, 0x7c, 0x84, + 0x4c, 0x98, 0x34, 0x51, 0x4e, 0x3b, 0xe3, 0x0c, 0x39, 0x69, 0xd2, 0x24, + 0xa9, 0xa9, 0xad, 0x95, 0x50, 0x28, 0xf4, 0x79, 0xdb, 0x0d, 0x0d, 0x47, + 0xa4, 0xb3, 0xbd, 0x43, 0x54, 0x55, 0xfd, 0x3c, 0x18, 0x97, 0x4e, 0xa7, + 0xa5, 0xaa, 0xa6, 0x46, 0xaa, 0xab, 0xab, 0x7b, 0xf5, 0xbd, 0xb5, 0xa5, + 0xc5, 0xf4, 0xfd, 0x2f, 0xaa, 0xaa, 0x4a, 0x65, 0x65, 0xa5, 0x54, 0x0c, + 0x18, 0xf0, 0xf9, 0xf1, 0xd4, 0xd9, 0xd9, 0x29, 0x9f, 0xee, 0xdb, 0x27, + 0x1f, 0xfd, 0x71, 0x93, 0x6c, 0xf9, 0x68, 0xb3, 0xec, 0xd9, 0xbd, 0x4b, + 0x1a, 0x1b, 0xfe, 0xdf, 0xb8, 0x96, 0x97, 0x97, 0xcb, 0x90, 0xa1, 0xc3, + 0x64, 0xfc, 0xc4, 0x09, 0x72, 0xc6, 0xd4, 0xa9, 0x32, 0xe9, 0xe4, 0x93, + 0xa5, 0xba, 0xa6, 0x86, 0x19, 0x10, 0x01, 0xb2, 0xf9, 0xa3, 0x8f, 0xe4, + 0xbb, 0xdf, 0xbe, 0x59, 0x3e, 0xfd, 0xf4, 0x53, 0x5f, 0xde, 0x74, 0x5f, + 0x73, 0xdd, 0xf5, 0x72, 0xf1, 0x25, 0x5f, 0x93, 0x67, 0x97, 0x2f, 0x95, + 0x77, 0xdf, 0xf9, 0xaf, 0xbc, 0xd7, 0xbd, 0xeb, 0x9e, 0x45, 0x72, 0xcb, + 0xad, 0xdf, 0x65, 0x07, 0x03, 0xb0, 0x45, 0x3a, 0x9d, 0x96, 0x5d, 0x1f, + 0x6f, 0x97, 0xd7, 0x7f, 0xf9, 0xaa, 0xbc, 0xf6, 0xda, 0x6b, 0xb2, 0x7f, + 0xff, 0x7e, 0x06, 0x05, 0x81, 0x34, 0x6a, 0xd4, 0x28, 0xb9, 0x7c, 0xf6, + 0x6c, 0x99, 0x75, 0xe9, 0xe5, 0x32, 0x7a, 0xcc, 0x58, 0xd1, 0x34, 0xe6, + 0x7d, 0x00, 0x40, 0x7f, 0x47, 0x00, 0x10, 0x00, 0x02, 0x72, 0x53, 0xfb, + 0xe4, 0x8f, 0xff, 0x5e, 0x56, 0x2c, 0x5b, 0x62, 0xdb, 0x2b, 0x06, 0xec, + 0xf4, 0xe5, 0x2f, 0x9f, 0x22, 0xcb, 0x9e, 0xfd, 0x27, 0x39, 0x78, 0xf0, + 0x80, 0x3c, 0xf3, 0x93, 0xa7, 0x64, 0xfd, 0xba, 0xb5, 0x79, 0xcd, 0xea, + 0x20, 0x00, 0x08, 0xc0, 0x6e, 0x0d, 0x47, 0x0e, 0xc9, 0x87, 0x9b, 0x36, + 0xca, 0xab, 0xaf, 0xac, 0x96, 0xdf, 0xfd, 0xee, 0x77, 0x72, 0xcc, 0xe4, + 0xd5, 0x1c, 0x40, 0x29, 0xab, 0xad, 0xad, 0x95, 0xb3, 0xcf, 0x3e, 0x5b, + 0xe6, 0xcc, 0xf9, 0xba, 0x9c, 0x7c, 0xea, 0x64, 0xa9, 0xad, 0xe3, 0x55, + 0x2f, 0x00, 0x00, 0x1e, 0x01, 0x06, 0x80, 0x40, 0xd0, 0x34, 0x4d, 0xe6, + 0xde, 0x30, 0x4f, 0x8e, 0x36, 0x34, 0xc8, 0xea, 0x97, 0x7f, 0x21, 0xe9, + 0xb4, 0xbf, 0x1e, 0x6b, 0xfb, 0xe4, 0x93, 0xdd, 0xb2, 0x75, 0xeb, 0x16, + 0x39, 0xef, 0xfc, 0xe9, 0x72, 0xd7, 0xf7, 0xfe, 0x5a, 0xe2, 0xf1, 0x72, + 0x79, 0xe3, 0xf5, 0x5f, 0xf2, 0x68, 0x17, 0x00, 0xd7, 0x55, 0x56, 0x56, + 0xcb, 0x49, 0x13, 0x26, 0xca, 0xcc, 0x8b, 0x2e, 0x16, 0x11, 0x91, 0x4d, + 0x9b, 0x36, 0x49, 0x73, 0x73, 0xf3, 0xe7, 0xef, 0x1b, 0xe6, 0xbc, 0x84, + 0x52, 0xd3, 0xf3, 0x5e, 0xcb, 0x58, 0x2c, 0x26, 0xd5, 0xd5, 0xd5, 0x72, + 0xda, 0x69, 0xa7, 0xc9, 0xcc, 0x8b, 0x2e, 0x92, 0xf1, 0x13, 0x26, 0xe6, + 0xf5, 0x7a, 0x1f, 0x00, 0x40, 0xff, 0x40, 0x00, 0x10, 0x00, 0x02, 0xa2, + 0x7e, 0xf0, 0x60, 0x59, 0x78, 0xcf, 0x22, 0x19, 0x3e, 0x62, 0x84, 0xfc, + 0xfb, 0x9b, 0x6f, 0xc8, 0x9e, 0x4f, 0x76, 0xfb, 0xe6, 0xfd, 0x56, 0x9d, + 0x9d, 0x09, 0xf9, 0xe8, 0xc3, 0x3f, 0xca, 0x79, 0xe7, 0x4f, 0x97, 0xf1, + 0xe3, 0x4f, 0x92, 0x85, 0x77, 0x7f, 0x4f, 0x62, 0x65, 0x65, 0xf2, 0xf2, + 0xcf, 0x7f, 0x66, 0x39, 0xc1, 0x0f, 0x00, 0x14, 0x23, 0x12, 0x8d, 0x4a, + 0x55, 0x75, 0xad, 0x9c, 0x71, 0xe6, 0x14, 0x29, 0x2f, 0x2f, 0x97, 0x13, + 0x4e, 0x38, 0x41, 0xb6, 0x6f, 0xdf, 0x21, 0x0d, 0x0d, 0x47, 0xa4, 0xbb, + 0xbb, 0x9b, 0x73, 0x12, 0x4a, 0x8e, 0xaa, 0xaa, 0x12, 0x89, 0x44, 0x64, + 0xf0, 0xe0, 0x21, 0x72, 0xd2, 0x49, 0xe3, 0xe5, 0x8c, 0x33, 0xa7, 0xc8, + 0xf8, 0x93, 0x26, 0xc8, 0x80, 0xca, 0x6a, 0x09, 0x87, 0x23, 0x0c, 0x10, + 0x00, 0x40, 0x44, 0x08, 0x00, 0x02, 0x40, 0xa0, 0x0c, 0x1c, 0x38, 0x50, + 0xbe, 0xfd, 0x9d, 0xdb, 0xe4, 0xd2, 0xcb, 0x67, 0xcb, 0x8e, 0x6d, 0xdb, + 0xa4, 0xa1, 0xa1, 0xa1, 0xa0, 0x2c, 0xd1, 0x4e, 0x18, 0x3b, 0x6e, 0xbc, + 0xe8, 0xba, 0x2e, 0xaa, 0xaa, 0xca, 0x88, 0x91, 0x23, 0x65, 0xe1, 0xdd, + 0xdf, 0x93, 0x78, 0xbc, 0x4c, 0x56, 0xfd, 0xcb, 0x0b, 0xbc, 0x88, 0x1f, + 0x80, 0xab, 0x2a, 0x06, 0x0c, 0x90, 0x48, 0x24, 0x22, 0x91, 0x48, 0x54, + 0x46, 0x8c, 0x1c, 0x25, 0x5f, 0x6d, 0x6a, 0x94, 0x96, 0xd6, 0x16, 0x49, + 0x25, 0x53, 0x92, 0xc9, 0x10, 0x00, 0x44, 0x69, 0x51, 0x14, 0x55, 0x22, + 0xd1, 0x88, 0x0c, 0x18, 0x50, 0x29, 0x35, 0xb5, 0xb5, 0x52, 0x5d, 0x5d, + 0x2b, 0x03, 0xaa, 0xaa, 0x25, 0x12, 0x21, 0xf8, 0x07, 0x00, 0xf8, 0x7f, + 0x08, 0x00, 0x02, 0x40, 0xe0, 0x6e, 0x04, 0x14, 0x19, 0x35, 0xea, 0x04, + 0x19, 0x35, 0xea, 0x04, 0x5f, 0xf7, 0x73, 0xe0, 0xc0, 0x81, 0x72, 0xdb, + 0x1d, 0x77, 0x49, 0x59, 0x59, 0x5c, 0xfe, 0xf9, 0xf9, 0x9f, 0x4a, 0x67, + 0x47, 0x07, 0x3b, 0x0f, 0x80, 0x6b, 0x22, 0xd1, 0xa8, 0x0c, 0xac, 0x1f, + 0x2c, 0xb5, 0x75, 0x03, 0x25, 0xd1, 0x95, 0x90, 0xae, 0xae, 0x2e, 0xc9, + 0xf0, 0x08, 0x30, 0x4a, 0xf4, 0xef, 0xbe, 0xa2, 0xaa, 0x12, 0x8d, 0x46, + 0x25, 0x16, 0x2b, 0x13, 0x55, 0x55, 0xc9, 0xfa, 0x0b, 0x00, 0x30, 0x20, + 0x00, 0x08, 0x00, 0xf0, 0x4c, 0x65, 0x65, 0xa5, 0x7c, 0xe7, 0xb6, 0x3b, + 0xa4, 0xa2, 0x62, 0x80, 0x3c, 0xb7, 0x62, 0x99, 0x34, 0x35, 0x35, 0x32, + 0x28, 0x00, 0x5c, 0xa3, 0x28, 0x8a, 0x68, 0xa1, 0x90, 0x94, 0x87, 0x2a, + 0x24, 0x1e, 0x8f, 0x0b, 0xb1, 0x3f, 0x94, 0xec, 0xb1, 0xfc, 0xd9, 0x01, + 0x4d, 0xe0, 0x0f, 0x00, 0x90, 0x15, 0x01, 0x40, 0x00, 0x80, 0xa7, 0xa2, + 0xd1, 0xa8, 0xdc, 0xf4, 0xcd, 0x6f, 0x49, 0x6d, 0x5d, 0xad, 0xac, 0x58, + 0xb6, 0x54, 0x76, 0xef, 0xfa, 0x13, 0x83, 0x02, 0xc0, 0x75, 0x8a, 0xa2, + 0x0a, 0xb1, 0x13, 0x00, 0x00, 0x10, 0x54, 0x04, 0x00, 0x01, 0x00, 0x9e, + 0x53, 0x55, 0x55, 0xfe, 0xbf, 0x2b, 0xaf, 0x96, 0xea, 0xaa, 0x6a, 0x79, + 0x76, 0xc5, 0x32, 0xf9, 0xdf, 0x0f, 0xfe, 0xc0, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x5d, 0xf7, 0x5c, 0x0c, 0x01, 0x00, 0xc0, 0x2f, 0x66, 0x5e, + 0x7c, 0x89, 0x2c, 0xba, 0xf7, 0x6f, 0x64, 0xfa, 0x8c, 0x0b, 0x78, 0x8c, + 0x09, 0x81, 0x74, 0xd2, 0x98, 0x51, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x5c, + 0xc7, 0x0c, 0x40, 0x00, 0x80, 0xaf, 0x9c, 0x71, 0xe6, 0x14, 0xb9, 0xe7, + 0xaf, 0xef, 0x93, 0xea, 0xea, 0x6a, 0x82, 0x80, 0x08, 0x9c, 0x1d, 0xbb, + 0xf6, 0x32, 0x08, 0x00, 0x00, 0x00, 0x70, 0x9d, 0xb2, 0x63, 0xd7, 0x5e, + 0x5e, 0x77, 0x0c, 0x00, 0xf0, 0x9d, 0x43, 0x07, 0x0f, 0x4a, 0x7b, 0x7b, + 0xbb, 0x8c, 0x19, 0x3b, 0x96, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x80, 0x22, + 0x30, 0x03, 0x10, 0x00, 0xe0, 0x4b, 0x83, 0x87, 0x0c, 0x61, 0x10, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x06, 0xbc, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x04, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x23, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8c, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x23, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, + 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8c, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x23, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x16, 0x62, 0x08, 0x72, 0x1b, 0x7f, 0xe2, 0x48, 0x06, 0x01, + 0xc8, 0x62, 0xe7, 0xee, 0x7d, 0x0c, 0x02, 0xe7, 0x35, 0x80, 0xf3, 0x1a, + 0x38, 0xef, 0x01, 0x9c, 0xf7, 0x00, 0x00, 0x3e, 0x47, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x28, 0x2f, 0x8b, 0x49, 0x5d, 0x4d, 0x95, + 0x64, 0x18, 0x0a, 0xf4, 0x73, 0x8a, 0x88, 0x1c, 0x6d, 0x6a, 0x96, 0xf6, + 0xce, 0x04, 0x83, 0x61, 0x13, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x80, 0xaa, 0xa9, 0x12, 0x8d, 0x46, 0x18, 0x08, 0xe0, 0xff, 0xbe, + 0x0f, 0xb0, 0x71, 0x3c, 0x19, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xb8, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x91, 0x04, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xdb, 0xb2, 0x65, 0x4b, 0xc9, 0xf4, + 0x55, 0xd7, 0x75, 0x99, 0x30, 0x61, 0x82, 0x84, 0xc3, 0x61, 0x5b, 0xea, + 0xfb, 0xf0, 0xc3, 0x0f, 0x45, 0xd3, 0xb4, 0x5e, 0x65, 0x99, 0x4c, 0x46, + 0x46, 0x8c, 0x18, 0x21, 0x55, 0x55, 0x55, 0x86, 0xe5, 0x53, 0xa9, 0x94, + 0x6c, 0xdf, 0xbe, 0x5d, 0x14, 0x45, 0x29, 0xba, 0xed, 0xca, 0xca, 0x4a, + 0x19, 0x31, 0x62, 0x84, 0xa5, 0x75, 0x76, 0xec, 0xd8, 0x21, 0xa9, 0x54, + 0xca, 0xd1, 0x31, 0x1e, 0x38, 0x70, 0xa0, 0xd4, 0xd7, 0xd7, 0x1b, 0xca, + 0x93, 0xc9, 0xa4, 0x6c, 0xdf, 0xbe, 0x5d, 0x54, 0xb5, 0x74, 0xe6, 0x7b, + 0x7d, 0xe9, 0x4b, 0x5f, 0xe2, 0x0b, 0xee, 0x02, 0x02, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xdc, 0x99, 0x67, 0x9e, 0x29, 0x89, 0x44, 0xa2, + 0x64, 0xfa, 0xdb, 0xd4, 0xd4, 0x24, 0xd5, 0xd5, 0xd5, 0xb6, 0xd4, 0x75, + 0xda, 0x69, 0xa7, 0x49, 0x26, 0x93, 0x31, 0x94, 0x6f, 0xd8, 0xb0, 0x41, + 0x26, 0x4f, 0x9e, 0x6c, 0x28, 0x4f, 0x24, 0x12, 0xf2, 0xe5, 0x2f, 0x7f, + 0xd9, 0x96, 0xb6, 0x57, 0xac, 0x58, 0x21, 0x37, 0xdd, 0x74, 0x93, 0xa5, + 0x75, 0x1e, 0x7a, 0xe8, 0x21, 0x79, 0xe9, 0xa5, 0x97, 0x1c, 0x1b, 0x5b, + 0x45, 0x51, 0xe4, 0xf5, 0xd7, 0x5f, 0x97, 0x59, 0xb3, 0x66, 0x19, 0x3e, + 0x6b, 0x6f, 0x6f, 0x97, 0x53, 0x4e, 0x39, 0xa5, 0x64, 0x8e, 0x93, 0x58, + 0x2c, 0x26, 0x9d, 0x9d, 0x9d, 0x7c, 0xc1, 0x5d, 0xc0, 0x23, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb7, 0x0a, 0x99, 0xc9, 0x67, 0xc7, 0xec, + 0x3f, 0x20, 0x48, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, + 0xde, 0x01, 0x08, 0x00, 0xc8, 0x29, 0x08, 0x8f, 0x4f, 0x98, 0xbd, 0x33, + 0xc6, 0xab, 0x6d, 0xcf, 0xd5, 0x97, 0x42, 0xdb, 0x2b, 0x74, 0xfb, 0xd8, + 0xef, 0x00, 0x00, 0x00, 0x40, 0xff, 0x40, 0x00, 0xb0, 0x1f, 0xdf, 0x2c, + 0x67, 0xbb, 0x31, 0xca, 0xd6, 0x7f, 0xa7, 0x6f, 0xa4, 0xac, 0x8e, 0x9b, + 0xd5, 0xfe, 0x7b, 0x75, 0xe3, 0x58, 0xea, 0xc7, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x9a, 0x33, 0x67, 0x8e, 0xc4, 0x62, 0x31, 0x4f, 0xda, 0xd6, + 0x34, 0x4d, 0x56, 0xae, 0x5c, 0x69, 0x69, 0x9d, 0xae, 0xae, 0x2e, 0x49, + 0x26, 0x93, 0xa6, 0x75, 0x95, 0x95, 0x95, 0xd9, 0xd2, 0x2f, 0x55, 0x55, + 0x65, 0xce, 0x9c, 0x39, 0x12, 0x8d, 0x46, 0x8b, 0xae, 0x2b, 0x1a, 0x8d, + 0x4a, 0x47, 0x47, 0x87, 0xe8, 0xba, 0x9e, 0x77, 0xdb, 0x23, 0x47, 0x8e, + 0x94, 0x6b, 0xaf, 0xbd, 0xd6, 0x96, 0xed, 0xf8, 0xc3, 0x1f, 0xfe, 0x20, + 0xdb, 0xb7, 0x6f, 0xb7, 0x65, 0x5c, 0xe6, 0xce, 0x9d, 0x2b, 0xe9, 0x74, + 0xda, 0x93, 0x63, 0x25, 0x91, 0x48, 0xc8, 0x2b, 0xaf, 0xbc, 0xc2, 0x17, + 0xd6, 0x43, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x4b, + 0x97, 0x2e, 0x95, 0xfa, 0xfa, 0x7a, 0xcf, 0xda, 0x7f, 0xf1, 0xc5, 0x17, + 0x2d, 0x05, 0x95, 0x7e, 0xf5, 0xab, 0x5f, 0xc9, 0x65, 0x97, 0x5d, 0x66, + 0x28, 0xbf, 0xff, 0xfe, 0xfb, 0xe5, 0xe1, 0x87, 0x1f, 0xb6, 0xa5, 0x4f, + 0xf1, 0x78, 0x5c, 0x5e, 0x7e, 0xf9, 0x65, 0x5b, 0xea, 0xda, 0xb6, 0x6d, + 0x9b, 0x94, 0x97, 0x97, 0x5b, 0x5a, 0xa7, 0xad, 0xad, 0xcd, 0xf2, 0x3a, + 0xd9, 0x7c, 0xff, 0xfb, 0xdf, 0x97, 0xc5, 0x8b, 0x17, 0x17, 0x5d, 0x8f, + 0xa6, 0x69, 0xf2, 0x2f, 0xff, 0xf2, 0x2f, 0x9e, 0x1d, 0x27, 0x87, 0x0f, + 0x1f, 0x26, 0x00, 0xe8, 0x31, 0xde, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5c, 0xa1, 0x28, 0x8a, 0xe9, 0x53, 0x52, 0x7e, 0x7d, 0x72, 0xca, + 0xea, 0x93, 0x52, 0x8a, 0xa2, 0xd8, 0xfa, 0x74, 0x15, 0x4f, 0x6a, 0xc1, + 0x2e, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe3, + 0x11, 0x60, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x7e, 0x9a, 0x99, 0x92, 0xef, + 0x6c, 0x10, 0xb3, 0x3e, 0x17, 0x33, 0x93, 0xc4, 0x8d, 0xfa, 0x4a, 0x71, + 0x4c, 0xfd, 0xde, 0x67, 0x00, 0x00, 0x44, 0x98, 0x01, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x1a, 0x33, 0x00, 0x5d, 0xe4, 0xd5, 0xaf, + 0x74, 0x5e, 0xfd, 0x52, 0xe9, 0x74, 0xbb, 0x4e, 0x67, 0x2b, 0xb6, 0x2b, + 0x2b, 0x31, 0xc7, 0x03, 0x38, 0xaf, 0x95, 0xee, 0xb1, 0x5d, 0xe8, 0xf6, + 0xe5, 0xea, 0x8b, 0xdb, 0xdf, 0xc1, 0x5c, 0xed, 0x15, 0xba, 0x7d, 0x41, + 0xdf, 0xef, 0x00, 0x00, 0x70, 0xad, 0xe6, 0xec, 0xdf, 0xdb, 0x81, 0x03, + 0x07, 0xf6, 0xea, 0x5b, 0x26, 0x93, 0x11, 0x55, 0x55, 0x73, 0xb6, 0x3f, + 0x70, 0xe0, 0xc0, 0x5e, 0x65, 0x0d, 0x0d, 0x0d, 0x05, 0x5d, 0xe7, 0x94, + 0xd2, 0xbb, 0x06, 0xdd, 0xec, 0xab, 0x5f, 0x8f, 0x15, 0xd8, 0x87, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb3, 0x6e, 0xdd, 0x3a, 0xb9, + 0xe7, 0x9e, 0x7b, 0x8a, 0x0e, 0xc8, 0x24, 0x12, 0x09, 0xf9, 0xc7, 0x7f, + 0xfc, 0x47, 0x99, 0x31, 0x63, 0x86, 0x2d, 0xfd, 0xfa, 0xda, 0xd7, 0xbe, + 0x26, 0xfb, 0xf7, 0xef, 0x37, 0x94, 0xe7, 0xea, 0x67, 0x22, 0x91, 0x30, + 0x2d, 0xd7, 0x34, 0xcd, 0xb4, 0xbc, 0xbd, 0xbd, 0x5d, 0x26, 0x4d, 0x9a, + 0x64, 0x08, 0x1a, 0x6e, 0xd8, 0xb0, 0x41, 0x3a, 0x3b, 0x3b, 0x25, 0x16, + 0x8b, 0xf9, 0x6e, 0x7f, 0xd5, 0xd5, 0xd5, 0xc9, 0xe8, 0xd1, 0xa3, 0x0d, + 0x63, 0xb2, 0x67, 0xcf, 0x1e, 0xc7, 0xdb, 0xfe, 0xcf, 0xff, 0xfc, 0x4f, + 0xf9, 0xce, 0x77, 0xbe, 0x53, 0xf4, 0xb8, 0x64, 0x32, 0x19, 0x79, 0xfc, + 0xf1, 0xc7, 0xe5, 0xc2, 0x0b, 0x2f, 0xe4, 0x0b, 0xe8, 0x43, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x98, 0x4c, 0x26, 0x23, 0x7f, 0xfc, + 0xe3, 0x1f, 0x45, 0xd7, 0xf5, 0xa2, 0xeb, 0xb2, 0xa3, 0x8e, 0x1e, 0xaa, + 0xaa, 0xe6, 0x9c, 0xed, 0x67, 0x26, 0x14, 0x0a, 0x59, 0xde, 0xf6, 0x3f, + 0xff, 0xf9, 0xcf, 0xb2, 0x6f, 0xdf, 0xbe, 0x92, 0xd9, 0x5f, 0x4d, 0x4d, + 0x4d, 0xd2, 0xd4, 0xd4, 0xe4, 0x49, 0xdb, 0xba, 0xae, 0xcb, 0xd6, 0xad, + 0x5b, 0x6d, 0xd9, 0xb7, 0xbc, 0x9f, 0xd4, 0xbf, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x05, 0xde, 0x5c, 0x3b, 0x2d, 0xdf, 0x99, 0x3b, 0xc5, 0xcc, + 0xf0, 0xf1, 0x6a, 0xdd, 0x7c, 0x1f, 0x77, 0x2b, 0x66, 0xb9, 0xfe, 0x76, + 0x1c, 0x00, 0x00, 0x90, 0x0d, 0x49, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x18, 0x8f, 0x00, 0xfb, 0x80, 0x5d, 0x53, 0xfa, 0x9d, 0x7e, 0xfc, + 0xc0, 0x6a, 0xd6, 0x5d, 0xab, 0x59, 0x97, 0xec, 0x5a, 0xde, 0xe9, 0x71, + 0xe6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x75, 0x7f, 0xc8, 0x6b, + 0x01, 0x50, 0x08, 0x02, 0x80, 0x00, 0x00, 0xd7, 0x2e, 0x56, 0x8a, 0xe5, + 0x76, 0x60, 0xdb, 0x4f, 0xdb, 0xd0, 0xdf, 0x7e, 0xc4, 0xf0, 0x72, 0xbf, + 0x03, 0x00, 0x00, 0xe7, 0x6c, 0xde, 0xbc, 0x59, 0x36, 0x6f, 0xde, 0x6c, + 0xcb, 0xf5, 0xc1, 0x39, 0xe7, 0x9c, 0x23, 0x23, 0x46, 0x8c, 0xb0, 0xb4, + 0xde, 0x2f, 0x7e, 0xf1, 0x0b, 0x89, 0x44, 0x22, 0xbd, 0xca, 0x74, 0x5d, + 0x97, 0x19, 0x33, 0x66, 0xc8, 0xe0, 0xc1, 0x83, 0x6d, 0xe9, 0xd7, 0xea, + 0xd5, 0xab, 0x2d, 0x65, 0xd4, 0x0d, 0x87, 0xc3, 0x59, 0xaf, 0xab, 0xd6, + 0xac, 0x59, 0x23, 0x75, 0x75, 0x75, 0x86, 0xf2, 0x21, 0x43, 0x86, 0x70, + 0x30, 0xc1, 0x12, 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x4d, 0xec, 0x4e, + 0x8a, 0x51, 0xcc, 0xba, 0xc5, 0xcc, 0x1a, 0x29, 0xa6, 0x2f, 0x6e, 0x24, + 0x06, 0xc9, 0xb7, 0x5d, 0xaf, 0x12, 0x88, 0x78, 0x75, 0x1c, 0x00, 0xa5, + 0x60, 0xf7, 0xee, 0xdd, 0x72, 0xf5, 0xd5, 0x57, 0xdb, 0x52, 0xd7, 0x86, + 0x0d, 0x1b, 0x2c, 0x05, 0x00, 0x55, 0x55, 0x95, 0x1b, 0x6e, 0xb8, 0xc1, + 0xf4, 0xb3, 0x2d, 0x5b, 0xb6, 0xd8, 0x12, 0x00, 0x54, 0x14, 0x45, 0xe6, + 0xcd, 0x9b, 0x57, 0xd0, 0x7a, 0xc7, 0x7f, 0xff, 0x15, 0x45, 0x91, 0xc9, + 0x93, 0x27, 0xdb, 0xd2, 0x2f, 0x80, 0x77, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x28, 0x8a, 0xe2, 0xd9, 0x93, 0x0d, 0xba, 0xae, 0x3b, + 0xde, 0x46, 0xa1, 0x41, 0x7c, 0xab, 0xaf, 0xd6, 0x02, 0xac, 0x22, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x78, 0x07, 0x20, 0x8a, 0x66, + 0x57, 0x96, 0xde, 0x6c, 0xec, 0xca, 0xf6, 0xeb, 0x74, 0x56, 0x62, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x22, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x94, 0xb8, 0x62, 0x92, 0x7b, 0x14, 0x93, 0x64, 0x23, 0x5f, 0x6e, 0x24, + 0xe3, 0x70, 0x23, 0x81, 0x08, 0x80, 0xe2, 0x95, 0x97, 0x97, 0xcb, 0x2d, + 0xb7, 0xdc, 0x62, 0x28, 0x6f, 0x6f, 0x6f, 0x97, 0x17, 0x5e, 0x78, 0xc1, + 0x74, 0x9d, 0xdb, 0x6e, 0xbb, 0x4d, 0x52, 0xa9, 0x54, 0xaf, 0xb2, 0x54, + 0x2a, 0x95, 0x35, 0xd3, 0xae, 0xaa, 0xaa, 0xb2, 0x60, 0xc1, 0x02, 0x89, + 0x46, 0xa3, 0x79, 0xf5, 0x29, 0x95, 0x4a, 0x49, 0x57, 0x57, 0x97, 0x1c, + 0x3b, 0x76, 0xcc, 0xf0, 0x59, 0x57, 0x57, 0x97, 0xdc, 0x7c, 0xf3, 0xcd, + 0x12, 0x0a, 0x85, 0xf2, 0x3e, 0x9f, 0xbc, 0xf1, 0xc6, 0x1b, 0xb2, 0x77, + 0xef, 0xde, 0xa2, 0xc7, 0x2a, 0x93, 0xc9, 0x48, 0x73, 0x73, 0xb3, 0xe9, + 0x76, 0x46, 0x22, 0x11, 0x89, 0xc7, 0xe3, 0x1c, 0x50, 0xc8, 0x1b, 0x01, + 0x40, 0x00, 0x00, 0x37, 0xcd, 0x16, 0x6e, 0x26, 0xed, 0xb8, 0x11, 0x76, + 0xb3, 0x4e, 0x00, 0x00, 0x00, 0x3f, 0x99, 0x3e, 0x7d, 0xba, 0x4c, 0x9f, + 0x3e, 0xdd, 0x50, 0xde, 0xd0, 0xd0, 0x20, 0x2b, 0x57, 0xae, 0x34, 0x4d, + 0xd4, 0xf1, 0xd4, 0x53, 0x4f, 0x59, 0x6a, 0x23, 0x1e, 0x8f, 0xcb, 0x73, + 0xcf, 0x3d, 0x67, 0x69, 0x9d, 0xa5, 0x4b, 0x97, 0xca, 0xe9, 0xa7, 0x9f, + 0x6e, 0x28, 0x5f, 0xb2, 0x64, 0x89, 0x2c, 0x5f, 0xbe, 0xdc, 0x52, 0x5d, + 0xc7, 0x8e, 0x1d, 0x93, 0x7f, 0xfd, 0xd7, 0x7f, 0x2d, 0x7a, 0xac, 0x34, + 0x4d, 0x93, 0x89, 0x13, 0x27, 0x9a, 0x7e, 0xf6, 0xea, 0xab, 0xaf, 0xca, + 0xec, 0xd9, 0xb3, 0x39, 0xa0, 0x90, 0x37, 0xde, 0x01, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x75, 0xfc, 0x0c, 0x3f, 0xb7, 0x65, 0x9b, 0xe1, + 0x97, 0xef, 0xcc, 0xbf, 0x2f, 0xb2, 0x2b, 0xdb, 0x70, 0xb6, 0x31, 0x51, + 0x14, 0xa5, 0xa0, 0x7e, 0xa1, 0x7f, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0xc0, 0x98, 0x33, 0x0a, 0x83, 0x52, 0xcf, 0x7e, 0xeb, 0x74, + 0xff, 0x79, 0x21, 0x34, 0x00, 0x00, 0x28, 0x95, 0xeb, 0x9f, 0x7c, 0xae, + 0x87, 0x8a, 0x49, 0xd0, 0xe1, 0xc6, 0x72, 0xf9, 0x6e, 0xaf, 0xdd, 0x7d, + 0x01, 0x00, 0x20, 0x48, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x30, 0xdd, 0xdd, 0xdd, 0xa2, 0x69, 0x5a, 0xd1, 0xf5, 0xe8, 0xba, 0x2e, + 0xc9, 0x64, 0xd2, 0xf1, 0xfe, 0x46, 0x22, 0x11, 0x5f, 0x8e, 0x63, 0x21, + 0xef, 0xda, 0x53, 0x55, 0xe3, 0xc3, 0x96, 0x3d, 0x3f, 0x3e, 0x58, 0x9d, + 0x98, 0x62, 0xd7, 0xfb, 0x04, 0x73, 0xe9, 0xd9, 0xbf, 0x66, 0xfd, 0xb6, + 0x42, 0xd3, 0x34, 0xe9, 0xee, 0xee, 0xe6, 0xcb, 0xe7, 0x53, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x98, 0x4b, 0x2e, 0xb9, 0x44, 0x5a, + 0x5b, 0x5b, 0x6d, 0xa9, 0xcb, 0xce, 0x84, 0x13, 0x6f, 0xbd, 0xf5, 0x96, + 0x3c, 0xf1, 0xc4, 0x13, 0x86, 0x99, 0xb7, 0x5d, 0x5d, 0x5d, 0x96, 0x83, + 0x5d, 0x2f, 0xbf, 0xfc, 0xb2, 0x3c, 0xf3, 0xcc, 0x33, 0x79, 0x07, 0xae, + 0xf6, 0xed, 0xdb, 0x27, 0x1b, 0x37, 0x6e, 0x94, 0x58, 0x2c, 0x96, 0x77, + 0x1b, 0x8f, 0x3e, 0xfa, 0xa8, 0xac, 0x5a, 0xb5, 0x2a, 0xef, 0xe5, 0x15, + 0x45, 0x91, 0xf7, 0xdf, 0x7f, 0xdf, 0x50, 0x9e, 0xc9, 0x64, 0xe4, 0xf9, + 0xe7, 0x9f, 0x97, 0xeb, 0xae, 0xbb, 0x2e, 0xef, 0xed, 0x0c, 0x85, 0x42, + 0xf2, 0xe0, 0x83, 0x0f, 0xca, 0x63, 0x8f, 0x3d, 0xe6, 0xe8, 0xb1, 0x72, + 0xd1, 0x45, 0x17, 0x49, 0x22, 0x91, 0xf0, 0xdd, 0xb1, 0x02, 0x7b, 0xb1, + 0x67, 0x00, 0x00, 0xb0, 0x59, 0xae, 0x47, 0xc9, 0x0a, 0x7d, 0x1d, 0x01, + 0x8f, 0xa7, 0x01, 0x00, 0x00, 0x2b, 0x34, 0x4d, 0xb3, 0x65, 0x06, 0xa0, + 0xdd, 0xd2, 0xe9, 0xb4, 0xac, 0x5d, 0xbb, 0xd6, 0x96, 0x6b, 0x9b, 0xae, + 0xae, 0x2e, 0x59, 0xbf, 0x7e, 0xbd, 0xa3, 0xfd, 0xdd, 0xb9, 0x73, 0xa7, + 0xec, 0xdc, 0xb9, 0xb3, 0xe8, 0x7a, 0x14, 0x45, 0x91, 0x70, 0x38, 0x2c, + 0xe1, 0x70, 0xd8, 0xf2, 0x7e, 0xec, 0xaf, 0xc7, 0x0a, 0xec, 0x45, 0x12, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x98, 0x01, 0x08, + 0x00, 0x00, 0x00, 0xd8, 0xc4, 0xab, 0xd9, 0xba, 0x76, 0x27, 0xb6, 0x28, + 0x66, 0xdd, 0x62, 0x12, 0xaf, 0x15, 0x93, 0xcc, 0xa4, 0x98, 0x71, 0xf1, + 0xd3, 0xf8, 0x01, 0x00, 0xe0, 0x04, 0x02, 0x80, 0xfd, 0xf8, 0x42, 0xd1, + 0x89, 0x8b, 0x36, 0x3f, 0x6c, 0x6f, 0xb6, 0xfe, 0x5b, 0xcd, 0x0e, 0x6c, + 0xb5, 0x9e, 0xa0, 0x1e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xf3, + 0x50, 0xda, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa2, 0x8a, + 0xcd, 0xdc, 0xea, 0xf7, 0x6d, 0xc9, 0x95, 0x30, 0x23, 0x93, 0xc9, 0x98, + 0xae, 0xd3, 0x13, 0x6c, 0xb3, 0x23, 0xe8, 0xa6, 0x28, 0x4a, 0xd6, 0x59, + 0xc2, 0xaa, 0xaa, 0x4a, 0x3a, 0x9d, 0x36, 0x2c, 0xff, 0xc5, 0xff, 0xcd, + 0xfa, 0xc5, 0x71, 0x0a, 0x2f, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x44, 0xbd, 0xf9, 0xe6, 0x9b, 0x52, 0x55, 0x55, 0xe5, 0x49, 0xdb, + 0x91, 0x48, 0xc4, 0xb6, 0xa0, 0xd6, 0xfc, 0xf9, 0xf3, 0xe5, 0xd6, 0x5b, + 0x6f, 0x35, 0x04, 0xd4, 0x44, 0x44, 0x5e, 0x7d, 0xf5, 0x55, 0xd3, 0x75, + 0x86, 0x0d, 0x1b, 0x26, 0xef, 0xbe, 0xfb, 0xae, 0xa1, 0xbc, 0xb3, 0xb3, + 0x53, 0x2e, 0xb8, 0xe0, 0x02, 0x5b, 0xfa, 0xb5, 0x68, 0xd1, 0x22, 0x99, + 0x33, 0x67, 0x8e, 0x69, 0xd6, 0xe2, 0xe9, 0xd3, 0xa7, 0x1b, 0x96, 0xcf, + 0x64, 0x32, 0xb2, 0x7e, 0xfd, 0x7a, 0x29, 0x2b, 0x2b, 0x33, 0xed, 0x97, + 0xd9, 0xb6, 0x74, 0x77, 0x77, 0xcb, 0x55, 0x57, 0x5d, 0xe5, 0xe8, 0xbe, + 0xca, 0x64, 0x32, 0xf2, 0xef, 0xff, 0xfe, 0xef, 0xd2, 0xdd, 0xdd, 0xed, + 0xc9, 0xb1, 0xd2, 0xdc, 0xdc, 0xcc, 0x97, 0xd5, 0x63, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0xf3, 0xe7, 0xcf, 0x0f, 0xc4, 0x76, + 0x8c, 0x18, 0x31, 0x42, 0xa6, 0x4e, 0x9d, 0x6a, 0xfa, 0x99, 0xaa, 0xaa, + 0xa6, 0x81, 0xc6, 0x0d, 0x1b, 0x36, 0xc8, 0xe4, 0xc9, 0x93, 0x0d, 0xe5, + 0x6d, 0x6d, 0x6d, 0xa2, 0x28, 0x8a, 0x2d, 0xc1, 0xc9, 0x71, 0xe3, 0xc6, + 0xc9, 0xb4, 0x69, 0xd3, 0x0c, 0xe5, 0x89, 0x44, 0xc2, 0x74, 0x79, 0x45, + 0x51, 0x64, 0xea, 0xd4, 0xa9, 0x52, 0x51, 0x51, 0x61, 0xf8, 0x6c, 0xe3, + 0xc6, 0x8d, 0xa6, 0x81, 0x49, 0x45, 0x51, 0x1c, 0x0f, 0x00, 0xea, 0xba, + 0x2e, 0xb3, 0x66, 0xcd, 0xe2, 0x0b, 0xd3, 0x8f, 0x11, 0x00, 0x04, 0x00, + 0x38, 0xa2, 0x54, 0x1e, 0x71, 0xc8, 0xd5, 0x4f, 0x27, 0xde, 0x89, 0x5a, + 0x68, 0x7b, 0xb9, 0x3e, 0xcb, 0x55, 0xa7, 0xdb, 0xfb, 0x81, 0xf7, 0xdb, + 0xa0, 0x3f, 0x71, 0xfa, 0xbd, 0xc9, 0x7e, 0xdb, 0xb6, 0x7c, 0xbf, 0xdf, + 0xf9, 0x26, 0xd9, 0xf0, 0x53, 0xbb, 0x1c, 0x07, 0x80, 0xff, 0xcf, 0x49, + 0x41, 0xbe, 0xc6, 0xe0, 0x3c, 0x02, 0x37, 0xf0, 0x10, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0xcc, 0x00, 0x74, 0x51, 0xa9, 0x47, + 0xf5, 0xad, 0x66, 0xd1, 0xb5, 0x3a, 0x0e, 0x56, 0xeb, 0xf7, 0x2a, 0x1b, + 0xaf, 0x5d, 0xfd, 0xe1, 0x57, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x06, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x5c, 0xb6, 0x6c, + 0xb4, 0x7e, 0xd4, 0xd7, 0xe4, 0x88, 0xe3, 0xb7, 0xc3, 0xa9, 0xc9, 0x1d, + 0x76, 0xb4, 0xe3, 0x44, 0xdf, 0x0a, 0xd9, 0x8f, 0x5f, 0x5c, 0x27, 0x9f, + 0xf5, 0x4b, 0xe5, 0x58, 0x61, 0x62, 0x8c, 0x7b, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x73, 0xb7, 0xde, 0x7a, 0x6b, 0xc9, 0xf4, 0xb5, + 0xb3, 0xb3, 0x53, 0x54, 0xd5, 0xfc, 0x8d, 0x63, 0xd5, 0xd5, 0xd5, 0xb2, + 0x70, 0xe1, 0x42, 0x43, 0xf9, 0xb0, 0x61, 0xc3, 0xa4, 0xb1, 0xb1, 0x51, + 0x74, 0x5d, 0xef, 0x55, 0xae, 0x69, 0x5a, 0xd6, 0x76, 0x9a, 0x9b, 0x9b, + 0xa5, 0xa1, 0xa1, 0xc1, 0x50, 0xde, 0xd5, 0xd5, 0x25, 0xb7, 0xdf, 0x7e, + 0xbb, 0x84, 0x42, 0xbd, 0x43, 0x1e, 0xed, 0xed, 0xed, 0x96, 0x03, 0x4e, + 0xed, 0xed, 0xed, 0x72, 0xf4, 0xe8, 0x51, 0xd3, 0x2c, 0xc0, 0x56, 0xc5, + 0x62, 0x31, 0xb9, 0xf3, 0xce, 0x3b, 0x0d, 0xdb, 0xd4, 0xd1, 0xd1, 0x61, + 0xba, 0xed, 0xaa, 0xaa, 0xca, 0xb0, 0x61, 0xc3, 0xe4, 0xee, 0xbb, 0xef, + 0x36, 0x1d, 0x47, 0x33, 0xaa, 0xaa, 0xca, 0xad, 0xb7, 0xde, 0x6a, 0x9a, + 0x85, 0x18, 0xfd, 0x9b, 0xb2, 0x63, 0xd7, 0x5e, 0xde, 0xd6, 0x9d, 0xc3, + 0xf8, 0x13, 0x47, 0x5a, 0x1f, 0xd4, 0x12, 0xff, 0x55, 0xc6, 0xe9, 0x47, + 0x74, 0x59, 0xbe, 0xb4, 0x8e, 0x87, 0x5c, 0x76, 0xee, 0xde, 0xc7, 0x49, + 0xa2, 0x1f, 0x9c, 0xd7, 0x0a, 0x4d, 0x3e, 0xe1, 0xfa, 0x1f, 0x34, 0x07, + 0xfa, 0x59, 0xe8, 0xf7, 0xb7, 0x54, 0xda, 0x63, 0xbf, 0x73, 0x5e, 0xe3, + 0xbc, 0x07, 0x2b, 0xdf, 0xad, 0x7c, 0x93, 0x6c, 0x14, 0x73, 0x8e, 0xc8, + 0xf7, 0x3c, 0x58, 0x4c, 0xc2, 0x0f, 0x92, 0x15, 0x71, 0xde, 0xf3, 0xb3, + 0x01, 0x15, 0x71, 0x19, 0x32, 0xa8, 0xae, 0x5f, 0x6e, 0xfb, 0xc1, 0x83, + 0x07, 0x65, 0xe8, 0xd0, 0xa1, 0xb6, 0xd4, 0x75, 0xf5, 0xd5, 0x57, 0xcb, + 0x4b, 0x2f, 0xbd, 0x64, 0x69, 0x9d, 0x67, 0x9f, 0x7d, 0x56, 0x6e, 0xbe, + 0xf9, 0x66, 0x5b, 0xce, 0x9f, 0x2d, 0x2d, 0x2d, 0xa6, 0x59, 0x80, 0x0b, + 0x39, 0xff, 0x1d, 0x38, 0x70, 0x40, 0x86, 0x0c, 0x19, 0xd2, 0x3f, 0x8f, + 0x89, 0x23, 0x47, 0xa5, 0xb5, 0xad, 0x83, 0x13, 0x83, 0x4d, 0x48, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x97, 0x6d, 0xd6, 0xa0, 0x55, + 0x41, 0x79, 0xac, 0xd4, 0xae, 0xf1, 0x00, 0x44, 0x78, 0x04, 0x18, 0x00, + 0xd0, 0xcf, 0x2f, 0xae, 0x0a, 0x9d, 0x41, 0x56, 0xe8, 0xb6, 0x97, 0x4a, + 0x7b, 0xfd, 0xe1, 0xa2, 0x1a, 0x00, 0x00, 0x00, 0xe8, 0x2f, 0x08, 0x00, + 0x3a, 0xa0, 0xd4, 0x1f, 0x2b, 0xb0, 0xab, 0xff, 0x3c, 0x8a, 0x1b, 0x8c, + 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x36, 0xe6, 0x93, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc6, 0x0c, 0x40, 0x00, 0x00, + 0x00, 0xa0, 0x0f, 0x6e, 0x3c, 0x49, 0x50, 0x4c, 0x62, 0x0b, 0xbb, 0xdb, + 0x2d, 0x66, 0x0c, 0xec, 0xee, 0xb3, 0x1b, 0xc9, 0x47, 0xf2, 0xdd, 0x8e, + 0x62, 0xfa, 0xe2, 0x55, 0x62, 0x15, 0x04, 0x47, 0x2a, 0x95, 0xf2, 0xac, + 0x6d, 0x55, 0x55, 0xb3, 0xbe, 0x8f, 0xce, 0xae, 0x7e, 0xe5, 0xaa, 0x67, + 0xda, 0xb4, 0x69, 0x86, 0x0c, 0xb9, 0x8a, 0xa2, 0xc8, 0xa1, 0x43, 0x87, + 0x64, 0xcf, 0x9e, 0x3d, 0x45, 0xb7, 0xd3, 0xb3, 0x7d, 0x53, 0xa7, 0x4e, + 0xcd, 0xbb, 0x1e, 0x5d, 0xd7, 0xe5, 0x83, 0x0f, 0x3e, 0x30, 0xfd, 0x2c, + 0x9d, 0x4e, 0xe7, 0x6c, 0xc7, 0xcc, 0x09, 0x27, 0x9c, 0x20, 0xf5, 0xf5, + 0xf5, 0xbd, 0xca, 0x76, 0xee, 0xdc, 0x99, 0xf5, 0x9c, 0xaa, 0xeb, 0xba, + 0x61, 0x4c, 0x7a, 0xc6, 0x25, 0x5b, 0xe6, 0xe4, 0x6c, 0x63, 0x5c, 0xc8, + 0xfe, 0xd5, 0x34, 0xcd, 0xb4, 0x6f, 0x85, 0xf4, 0x0b, 0xee, 0x20, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcf, 0x4d, 0x9c, 0x38, 0x51, 0xd2, + 0xe9, 0xb4, 0xeb, 0xed, 0x36, 0x35, 0x35, 0xc9, 0x2b, 0xaf, 0xbc, 0x22, + 0x33, 0x66, 0xcc, 0x30, 0xfd, 0x3c, 0x1c, 0x0e, 0xcb, 0xe8, 0xd1, 0xa3, + 0x8b, 0x6e, 0x27, 0x99, 0x4c, 0x9a, 0x06, 0x8e, 0x44, 0x44, 0xde, 0x7b, + 0xef, 0x3d, 0xc3, 0x67, 0xaa, 0xaa, 0xca, 0xaa, 0x55, 0xab, 0x64, 0xee, + 0xdc, 0xb9, 0x96, 0xda, 0xb9, 0xe6, 0x9a, 0x6b, 0x0c, 0x81, 0xbb, 0x4f, + 0x3e, 0xf9, 0x44, 0x36, 0x6f, 0xde, 0x2c, 0xf3, 0xe7, 0xcf, 0xcf, 0xbb, + 0x9e, 0x44, 0x22, 0x21, 0xe5, 0xe5, 0xe5, 0x86, 0xf2, 0x4c, 0x26, 0x23, + 0xa7, 0x9e, 0x7a, 0xaa, 0x21, 0xa0, 0x96, 0x4c, 0x26, 0xe5, 0xf1, 0xc7, + 0x1f, 0x97, 0x6b, 0xae, 0xb9, 0xc6, 0xb4, 0xbe, 0x5d, 0xbb, 0x76, 0x99, + 0x96, 0x67, 0x0b, 0xcc, 0xfd, 0xee, 0x77, 0xbf, 0x93, 0xeb, 0xaf, 0xbf, + 0xde, 0x10, 0x84, 0xbb, 0xec, 0xb2, 0xcb, 0xe4, 0xa9, 0xa7, 0x9e, 0xca, + 0x7b, 0x5f, 0x25, 0x12, 0x09, 0x59, 0xb9, 0x72, 0xa5, 0x5c, 0x78, 0xe1, + 0x85, 0x79, 0xaf, 0xf3, 0xc9, 0x27, 0x9f, 0xc8, 0xd1, 0xa3, 0x47, 0xa5, + 0xb6, 0xb6, 0xd6, 0xb0, 0xfc, 0xaf, 0x7f, 0xfd, 0x6b, 0xb9, 0xf1, 0xc6, + 0x1b, 0x0d, 0xfd, 0x9a, 0x3b, 0x77, 0xae, 0x2c, 0x5e, 0xbc, 0x98, 0x2f, + 0xb2, 0x87, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x73, 0x9f, + 0x7e, 0xfa, 0xa9, 0x24, 0x12, 0x09, 0x4f, 0xda, 0xce, 0x16, 0x98, 0x13, + 0xf9, 0x6c, 0x26, 0xd8, 0x27, 0x9f, 0x7c, 0xe2, 0x78, 0x1f, 0xcc, 0x02, + 0x61, 0x85, 0xcc, 0x38, 0xee, 0xea, 0xea, 0x32, 0xed, 0xaf, 0xa2, 0x28, + 0x96, 0xb2, 0xee, 0xe6, 0x5a, 0x76, 0xef, 0xde, 0xbd, 0x96, 0xc7, 0xd1, + 0x6a, 0xc6, 0xdf, 0x4c, 0x26, 0x63, 0x3a, 0xfb, 0x31, 0x99, 0x4c, 0xe6, + 0x5c, 0xef, 0xf8, 0x6d, 0x57, 0x55, 0xb5, 0xcf, 0x59, 0xc6, 0xc7, 0xaf, + 0x13, 0x0a, 0x85, 0x2c, 0xf5, 0x4b, 0x51, 0x14, 0x4f, 0x67, 0xb0, 0xe2, + 0xff, 0xf6, 0x35, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, + 0xaf, 0x92, 0x52, 0x02, 0x3d, 0x98, 0x01, 0xe8, 0x83, 0x2f, 0xb6, 0xd5, + 0x77, 0x7a, 0xd8, 0x75, 0xe2, 0x70, 0xfa, 0x5d, 0x22, 0x4e, 0x67, 0xe3, + 0xb5, 0xab, 0xff, 0x5e, 0x65, 0x0d, 0xf6, 0x5b, 0x16, 0x63, 0xde, 0x2d, + 0x83, 0xfe, 0x7a, 0x6c, 0xe4, 0xda, 0xbe, 0x5c, 0xdf, 0x3b, 0x3f, 0x8d, + 0x8b, 0x13, 0xe7, 0x07, 0xce, 0x09, 0x00, 0x00, 0x00, 0x40, 0x70, 0x10, + 0x00, 0x04, 0x00, 0x00, 0x00, 0xfa, 0x50, 0x4c, 0x50, 0xbc, 0x98, 0xe4, + 0x19, 0x5e, 0x25, 0x93, 0x28, 0x26, 0x31, 0x48, 0x31, 0xc9, 0x4c, 0xdc, + 0x48, 0x84, 0x92, 0x6f, 0x9f, 0xdd, 0x18, 0x53, 0xbb, 0x8f, 0x0d, 0x00, + 0xc1, 0xfc, 0x3b, 0x02, 0xd8, 0x81, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x93, 0x2b, 0xb3, 0x6b, 0x36, 0x85, 0xbc, 0xa7, 0x2d, 0x14, + 0x0a, 0x99, 0x06, 0xa9, 0xad, 0xd6, 0x95, 0x2d, 0x4b, 0x6c, 0xae, 0xf7, + 0xe6, 0xf5, 0xb4, 0xff, 0x45, 0x6e, 0x06, 0xda, 0xb2, 0x65, 0xc2, 0xf5, + 0x72, 0x1f, 0x3b, 0xd1, 0x9f, 0xe3, 0xc7, 0xb8, 0xaf, 0x6c, 0xbe, 0xc7, + 0xef, 0x4b, 0x45, 0x51, 0x78, 0x04, 0xda, 0x07, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x30, 0xaf, 0xbc, 0xf2, 0x8a, 0x9c, 0x7f, 0xfe, + 0xf9, 0x79, 0x2f, 0x1f, 0x0a, 0x85, 0xa4, 0xba, 0xba, 0xda, 0x72, 0xe0, + 0xee, 0xe0, 0xc1, 0x83, 0x86, 0xe0, 0x8e, 0xa6, 0x69, 0x72, 0xc7, 0x1d, + 0x77, 0xc8, 0x4f, 0x7f, 0xfa, 0xd3, 0xbc, 0xeb, 0xb9, 0xe7, 0x9e, 0x7b, + 0xe4, 0xfb, 0xdf, 0xff, 0xbe, 0x21, 0xd3, 0xb1, 0xaa, 0xaa, 0x32, 0x6b, + 0xd6, 0x2c, 0x19, 0x3e, 0x7c, 0x78, 0xaf, 0xf2, 0x64, 0x32, 0x29, 0xb7, + 0xde, 0x7a, 0xab, 0x34, 0x34, 0x34, 0x18, 0xea, 0xea, 0xec, 0xec, 0x94, + 0x79, 0xf3, 0xe6, 0x49, 0x34, 0x1a, 0x35, 0xd4, 0x75, 0x7c, 0x06, 0xe0, + 0x1e, 0x0f, 0x3e, 0xf8, 0xa0, 0x69, 0x56, 0xdb, 0x4b, 0x2e, 0xb9, 0x44, + 0xae, 0xb8, 0xe2, 0x0a, 0x43, 0x79, 0x34, 0x1a, 0x95, 0x86, 0x86, 0x06, + 0x4b, 0x81, 0xad, 0x1d, 0x3b, 0x76, 0xc8, 0x82, 0x05, 0x0b, 0x24, 0x1c, + 0x0e, 0x17, 0xbd, 0x7f, 0x67, 0xcf, 0x9e, 0x2d, 0x8d, 0x8d, 0x8d, 0x86, + 0xf2, 0xd6, 0xd6, 0x56, 0x99, 0x3b, 0x77, 0xae, 0xc4, 0xe3, 0xf1, 0x5e, + 0xe5, 0xd9, 0xfa, 0xa9, 0xeb, 0xba, 0x3c, 0xf1, 0xc4, 0x13, 0xf2, 0x6f, + 0xff, 0xf6, 0x6f, 0x86, 0xcf, 0x0e, 0x1f, 0x3e, 0x2c, 0x6d, 0x6d, 0x6d, + 0x86, 0x63, 0x22, 0x93, 0xc9, 0x48, 0x65, 0x65, 0xa5, 0x69, 0x7d, 0xe7, + 0x9e, 0x7b, 0xae, 0x34, 0x35, 0x35, 0x19, 0xca, 0x1b, 0x1b, 0x1b, 0xe5, + 0x86, 0x1b, 0x6e, 0x90, 0xb2, 0xb2, 0x32, 0xc3, 0x67, 0xcb, 0x97, 0x2f, + 0xe7, 0x0b, 0xeb, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x4c, 0x79, 0x79, 0xb9, 0x54, 0x55, 0x55, 0x39, 0xde, 0x4e, 0x75, 0x75, + 0xb5, 0x69, 0x79, 0x24, 0x12, 0xb1, 0x54, 0x4f, 0x34, 0x1a, 0x95, 0x8a, + 0x8a, 0x0a, 0xd3, 0xcf, 0xd6, 0xac, 0x59, 0x63, 0x3a, 0xb3, 0xef, 0x8e, + 0x3b, 0xee, 0x30, 0xdd, 0x46, 0x4d, 0xd3, 0xe4, 0x85, 0x17, 0x5e, 0xb0, + 0xd4, 0xfe, 0xcb, 0x2f, 0xbf, 0x6c, 0x5a, 0x3e, 0x75, 0xea, 0x54, 0xd3, + 0x72, 0x45, 0x51, 0xb2, 0x6e, 0x7b, 0x36, 0xe1, 0x70, 0x58, 0x9e, 0x7f, + 0xfe, 0xf9, 0xa2, 0xc7, 0x5c, 0x51, 0x14, 0x99, 0x3d, 0x7b, 0xb6, 0xe9, + 0xb6, 0x67, 0x32, 0x19, 0x59, 0xb5, 0x6a, 0x95, 0xa5, 0xfa, 0xd6, 0xac, + 0x59, 0x63, 0x5a, 0x1e, 0x0a, 0x85, 0xa4, 0xbc, 0xbc, 0xdc, 0xf2, 0x7e, + 0x3c, 0x3e, 0xf0, 0x2a, 0xf2, 0x59, 0xf6, 0xe5, 0x95, 0x2b, 0x57, 0x9a, + 0x8e, 0x09, 0x01, 0x40, 0x77, 0x90, 0x05, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x56, 0x21, 0x8f, 0x8f, 0xda, 0xf5, 0xc8, 0x29, 0x8f, 0xae, + 0x3a, 0xab, 0xaf, 0xc7, 0x89, 0x61, 0x1f, 0x66, 0x00, 0xba, 0xc8, 0xae, + 0xec, 0xae, 0x56, 0xeb, 0x71, 0xba, 0x5d, 0xab, 0xef, 0x58, 0xb0, 0xda, + 0x1f, 0xaf, 0x4e, 0xb8, 0x5e, 0x65, 0x67, 0xe6, 0x0f, 0x0c, 0x00, 0x00, + 0xc1, 0xba, 0x21, 0x75, 0x23, 0xf9, 0x43, 0x31, 0xd7, 0x0f, 0xc5, 0xac, + 0x6b, 0x77, 0xc2, 0x0f, 0x3b, 0xae, 0xc9, 0x0a, 0x19, 0x3f, 0xbb, 0xc7, + 0xc5, 0xee, 0x63, 0x83, 0xe4, 0x01, 0x00, 0x80, 0x62, 0x11, 0x00, 0x04, + 0x00, 0x38, 0x72, 0x03, 0xe4, 0xc4, 0xcd, 0x8a, 0x13, 0x01, 0xf2, 0x42, + 0xfb, 0x99, 0xab, 0x2f, 0x4e, 0xd4, 0xe9, 0xf6, 0x58, 0x07, 0xe1, 0x78, + 0x01, 0x00, 0x00, 0x00, 0xf0, 0x19, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x9c, 0x59, 0x26, 0x55, 0x45, 0x51, 0xfa, 0xcc, 0x92, 0xeb, + 0x25, 0x55, 0x55, 0x4d, 0x7f, 0xe4, 0x73, 0xe3, 0x87, 0x3f, 0x3b, 0x7e, + 0x38, 0x76, 0xf3, 0xe9, 0xac, 0x6c, 0x63, 0x95, 0x6d, 0xd9, 0x52, 0xdd, + 0x7e, 0xb3, 0x63, 0x18, 0xee, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xcf, 0xfd, 0xe4, 0x27, 0x3f, 0x31, 0x04, 0x88, 0x54, 0x55, 0x95, + 0x9f, 0xfd, 0xec, 0x67, 0xf2, 0x1f, 0xff, 0xf1, 0x1f, 0x86, 0xe5, 0xf7, + 0xec, 0xd9, 0x23, 0x5b, 0xb6, 0x6c, 0x31, 0x94, 0xc7, 0x62, 0x31, 0x19, + 0x33, 0x66, 0x8c, 0xa5, 0xb6, 0xf7, 0xec, 0xd9, 0x23, 0x5b, 0xb7, 0x6e, + 0xb5, 0x14, 0xa0, 0x3a, 0xef, 0xbc, 0xf3, 0x64, 0xca, 0x94, 0x29, 0x86, + 0xcf, 0x36, 0x6d, 0xda, 0x24, 0x4f, 0x3f, 0xfd, 0xb4, 0xa3, 0x63, 0x15, + 0x0a, 0x85, 0x64, 0xc9, 0x92, 0x25, 0xb6, 0xbc, 0x5f, 0xae, 0xbe, 0xbe, + 0xde, 0xd2, 0xb6, 0xe7, 0xb2, 0x6b, 0xd7, 0x2e, 0xd3, 0x72, 0x45, 0x51, + 0xe4, 0xd9, 0x67, 0x9f, 0xb5, 0x14, 0xcc, 0x0d, 0x87, 0xc3, 0xa6, 0xfb, + 0xb7, 0xbb, 0xbb, 0x5b, 0x96, 0x2f, 0x5f, 0x9e, 0x57, 0x90, 0xb0, 0x2f, + 0x89, 0x44, 0xc2, 0xb6, 0x7d, 0x12, 0x8d, 0x46, 0x65, 0xd9, 0xb2, 0x65, + 0x86, 0x7d, 0x42, 0x00, 0xd0, 0x3d, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xb9, 0x1b, 0x6f, 0xbc, 0xd1, 0xb4, 0xfc, 0x4f, 0x7f, 0xfa, + 0x93, 0xbc, 0xfd, 0xf6, 0xdb, 0x86, 0x00, 0xd5, 0x37, 0xbe, 0xf1, 0x0d, + 0xd3, 0xe5, 0x6f, 0xba, 0xe9, 0x26, 0x59, 0xb1, 0x62, 0x45, 0xde, 0xed, + 0x2a, 0x8a, 0x92, 0xb5, 0xae, 0x5c, 0x9a, 0x9b, 0x9b, 0xa5, 0xb2, 0xb2, + 0xd2, 0x50, 0xbe, 0x66, 0xcd, 0x1a, 0xd3, 0x60, 0xa6, 0x9d, 0x62, 0xb1, + 0x98, 0x7c, 0xf3, 0x9b, 0xdf, 0xb4, 0xa5, 0xae, 0xed, 0xdb, 0xb7, 0xcb, + 0xc4, 0x89, 0x13, 0x6d, 0xeb, 0x9b, 0xa2, 0x28, 0x86, 0x6d, 0x57, 0x14, + 0x45, 0x16, 0x2c, 0x58, 0x60, 0xa9, 0x9e, 0x77, 0xde, 0x79, 0x47, 0x4e, + 0x3e, 0xf9, 0x64, 0x43, 0xf9, 0xfc, 0xf9, 0xf3, 0xe5, 0x9f, 0xfe, 0xe9, + 0x9f, 0x7c, 0x77, 0xfc, 0x56, 0x55, 0x55, 0xd9, 0xb6, 0x4f, 0x50, 0x18, + 0x02, 0x80, 0x00, 0x00, 0x00, 0x40, 0x01, 0x8a, 0x49, 0x26, 0xe1, 0x46, + 0x62, 0x0b, 0xb3, 0xe5, 0xec, 0x4e, 0xd0, 0xe1, 0x15, 0xaf, 0x92, 0x9e, + 0xd8, 0x7d, 0xbc, 0x90, 0xf0, 0x03, 0x76, 0x48, 0xa7, 0xd3, 0x96, 0x96, + 0x8f, 0xc7, 0xe3, 0x8e, 0x9c, 0xeb, 0x8e, 0x97, 0x6d, 0x36, 0x9b, 0x9f, + 0x1f, 0x59, 0x76, 0xa3, 0xbf, 0x4e, 0x7f, 0xc7, 0x63, 0xb1, 0x18, 0x5f, + 0x0a, 0x98, 0x22, 0x00, 0xe8, 0xe2, 0xc5, 0xa0, 0x5d, 0x59, 0x7a, 0xad, + 0x5e, 0xb4, 0x38, 0x9d, 0x65, 0xd8, 0xae, 0x13, 0x9b, 0x5d, 0x59, 0x77, + 0xed, 0xea, 0xbf, 0xd3, 0xfb, 0xdd, 0xab, 0x3f, 0x08, 0x4c, 0xb1, 0x06, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x7f, 0x51, 0x19, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0xb8, 0x98, 0x01, 0x08, 0x00, 0x70, 0x84, 0x13, + 0xb3, 0x4d, 0x0b, 0x9d, 0x21, 0x9b, 0xab, 0x2f, 0xb9, 0x3e, 0xcb, 0xd5, + 0x5e, 0xa1, 0xdb, 0xe7, 0xf6, 0x36, 0xb8, 0xdd, 0x17, 0xb7, 0x8f, 0x17, + 0x1e, 0x95, 0x03, 0x00, 0x00, 0x00, 0xfa, 0x46, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x12, 0x75, 0xe4, 0xc8, 0x11, 0x09, 0x87, 0xc3, 0x86, + 0x1f, 0xc5, 0x74, 0x5d, 0x17, 0x5d, 0xd7, 0x2d, 0xfd, 0x58, 0x16, 0x0e, + 0x87, 0x4d, 0x7f, 0x94, 0xcb, 0x56, 0x57, 0x79, 0x79, 0xb9, 0x74, 0x77, + 0x77, 0x1b, 0x96, 0x4f, 0xa7, 0xd3, 0x12, 0x89, 0x44, 0x4c, 0xdb, 0xc8, + 0x56, 0xde, 0x57, 0xbf, 0x8e, 0x7f, 0x17, 0x5f, 0x26, 0x93, 0x31, 0x6d, + 0xdb, 0x6e, 0xd1, 0x68, 0xd4, 0x72, 0x5f, 0xb3, 0xe9, 0xd9, 0x06, 0xab, + 0xef, 0x6d, 0xb4, 0x6b, 0x1c, 0xd1, 0xbf, 0xf1, 0x08, 0x30, 0x00, 0x00, + 0x00, 0xd0, 0x07, 0x45, 0x51, 0xf2, 0xfa, 0x67, 0x26, 0x93, 0xc9, 0x18, + 0xfe, 0xe5, 0xbb, 0x6e, 0xbe, 0xcb, 0xe5, 0xcb, 0xac, 0x2f, 0x6e, 0x8c, + 0x41, 0x31, 0xdb, 0x66, 0xb6, 0x9c, 0xd9, 0x76, 0xe4, 0xbb, 0x6d, 0x76, + 0xaf, 0x6b, 0xf7, 0x76, 0x00, 0x56, 0x3d, 0xfb, 0xec, 0xb3, 0xd2, 0xd5, + 0xd5, 0x25, 0xdd, 0xdd, 0xdd, 0xbd, 0xfe, 0xad, 0x5b, 0xb7, 0x4e, 0x54, + 0xd5, 0xda, 0x2d, 0x7f, 0x47, 0x47, 0x87, 0xa1, 0x9e, 0xee, 0xee, 0x6e, + 0x59, 0xbf, 0x7e, 0xbd, 0xe9, 0xb1, 0xdd, 0xde, 0xde, 0x6e, 0xba, 0x7c, + 0x3a, 0x9d, 0x96, 0xf9, 0xf3, 0xe7, 0x9b, 0x1e, 0xf7, 0x17, 0x5f, 0x7c, + 0xb1, 0xe5, 0x63, 0x3d, 0x91, 0x48, 0x18, 0xda, 0x48, 0x26, 0x93, 0xf2, + 0x95, 0xaf, 0x7c, 0xc5, 0x74, 0xf9, 0xd6, 0xd6, 0xd6, 0xac, 0xe7, 0xa8, + 0xce, 0xce, 0x4e, 0xd3, 0x75, 0x9e, 0x7c, 0xf2, 0x49, 0xd3, 0xe5, 0xc7, + 0x8e, 0x1d, 0x2b, 0xa1, 0x50, 0xfe, 0x73, 0xa7, 0x52, 0xa9, 0x54, 0xd6, + 0x71, 0xfc, 0xf0, 0xc3, 0x0f, 0x4d, 0x83, 0x7f, 0xe5, 0xe5, 0xe5, 0x79, + 0x9f, 0x63, 0x7b, 0xfe, 0x4d, 0x9b, 0x36, 0xcd, 0xb6, 0xbf, 0x65, 0x6f, + 0xbe, 0xf9, 0xa6, 0xe5, 0x75, 0x1a, 0x1a, 0x1a, 0x4c, 0x97, 0x5f, 0xb3, + 0x66, 0x8d, 0xe9, 0xf2, 0xdf, 0xfa, 0xd6, 0xb7, 0xf8, 0xb2, 0x7a, 0x8c, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x93, 0x4c, 0x26, 0x6d, + 0x0b, 0x2a, 0x17, 0x32, 0xd3, 0xae, 0xae, 0xae, 0xce, 0xb3, 0x6d, 0xef, + 0x2b, 0x18, 0x6f, 0xa6, 0xbc, 0xbc, 0x3c, 0x6b, 0x7d, 0xa9, 0x54, 0xca, + 0x52, 0xfb, 0x89, 0x44, 0xc2, 0xb4, 0xbc, 0xab, 0xab, 0xcb, 0xb4, 0xbc, + 0xb5, 0xb5, 0xd5, 0xb3, 0xb1, 0x52, 0x55, 0xd5, 0xf2, 0x2c, 0xc7, 0x50, + 0x28, 0x94, 0x35, 0xb8, 0x6c, 0x36, 0x33, 0x51, 0x51, 0x14, 0x4f, 0x8f, + 0x07, 0xfc, 0xdf, 0x7e, 0x63, 0x08, 0xbc, 0xe7, 0x74, 0x36, 0x5b, 0xbb, + 0xb2, 0xeb, 0x3a, 0x5d, 0xbf, 0xd3, 0xd9, 0x93, 0xbd, 0xea, 0x8f, 0x5d, + 0xc7, 0x83, 0xd5, 0xf1, 0x27, 0xdb, 0x2f, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x0f, 0x98, 0xe1, 0xec, 0x3d, 0x66, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x30, 0x1e, 0x01, 0x06, 0x00, 0xe4, 0x94, 0x6b, 0xba, 0xbe, 0x13, + 0x8f, 0x9a, 0x3b, 0xd1, 0x5e, 0xa1, 0x75, 0xe6, 0xfa, 0xcc, 0xed, 0x7e, + 0x16, 0xda, 0x9e, 0x13, 0x8f, 0x5b, 0x14, 0x5a, 0xa7, 0x13, 0xe3, 0xe9, + 0xf6, 0xb6, 0x03, 0x76, 0x1f, 0xfb, 0x7d, 0x2d, 0x67, 0xf7, 0x71, 0x9c, + 0x6f, 0x1b, 0x76, 0xf7, 0xa5, 0x98, 0x31, 0x28, 0x66, 0xb9, 0x62, 0xb6, + 0xcd, 0x8d, 0x71, 0xb1, 0x7b, 0xdb, 0x00, 0xa7, 0x58, 0x4d, 0x26, 0x22, + 0xf2, 0xd9, 0x7b, 0xf0, 0xcc, 0x92, 0x67, 0xf4, 0x64, 0x14, 0xb6, 0xa3, + 0x8d, 0x42, 0x68, 0x9a, 0x66, 0x5a, 0x9e, 0x4e, 0xa7, 0xb3, 0xf6, 0xf7, + 0x8b, 0xff, 0xe7, 0x23, 0x5b, 0xd2, 0x10, 0x45, 0x51, 0x44, 0xd3, 0xb4, + 0xac, 0xe7, 0x92, 0xe3, 0x13, 0x84, 0xf4, 0xf4, 0xd5, 0xca, 0xb5, 0x65, + 0x47, 0x47, 0x87, 0xa5, 0xbe, 0x29, 0x8a, 0x52, 0x50, 0x56, 0xe2, 0x6c, + 0xe3, 0xf8, 0xc5, 0xed, 0xfc, 0xa2, 0x6c, 0xef, 0x3f, 0x84, 0x7b, 0x08, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x73, 0x4b, 0x96, 0x2c, 0x31, + 0x94, 0x25, 0x93, 0x49, 0x99, 0x37, 0x6f, 0x9e, 0x54, 0x55, 0x55, 0xd9, + 0xd2, 0xc6, 0x13, 0x4f, 0x3c, 0x21, 0x65, 0x65, 0x65, 0xbd, 0xca, 0x14, + 0x45, 0x91, 0xcd, 0x9b, 0x37, 0x67, 0x0d, 0x3a, 0x2f, 0x5f, 0xbe, 0xdc, + 0x10, 0x40, 0xd2, 0x75, 0x5d, 0x16, 0x2e, 0x5c, 0x28, 0xf7, 0xdd, 0x77, + 0x9f, 0x61, 0xf9, 0x5f, 0xff, 0xfa, 0xd7, 0x72, 0xcb, 0x2d, 0xb7, 0x18, + 0xea, 0x7b, 0xef, 0xbd, 0xf7, 0x4c, 0xeb, 0xca, 0x46, 0xd7, 0x75, 0x99, + 0x35, 0x6b, 0x96, 0x8c, 0x1e, 0x3d, 0xda, 0xf2, 0x38, 0x86, 0xc3, 0xe1, + 0x5e, 0x65, 0x99, 0x4c, 0x46, 0x4e, 0x3f, 0xfd, 0x74, 0xd9, 0xbc, 0x79, + 0xb3, 0x61, 0xf9, 0x3f, 0xfd, 0xe9, 0x4f, 0xf2, 0x97, 0x7f, 0xf9, 0x97, + 0x79, 0xd7, 0x9f, 0xc9, 0x64, 0x64, 0xe9, 0xd2, 0xa5, 0xa6, 0x89, 0x35, + 0x46, 0x8e, 0x1c, 0x29, 0x5b, 0xb7, 0x6e, 0x35, 0x6c, 0x7b, 0x24, 0x12, + 0x91, 0x13, 0x4f, 0x3c, 0xd1, 0x74, 0x1b, 0xff, 0xeb, 0xbf, 0xfe, 0x4b, + 0x06, 0x0d, 0x1a, 0x94, 0x77, 0xfb, 0x66, 0x49, 0x38, 0x7a, 0x6c, 0xd9, + 0xb2, 0xc5, 0x34, 0x70, 0x37, 0x70, 0xe0, 0x40, 0x4b, 0x63, 0x98, 0x4e, + 0xa7, 0x65, 0xc5, 0x8a, 0x15, 0xa6, 0x89, 0x53, 0xc6, 0x8f, 0x1f, 0x2f, + 0xdb, 0xb6, 0x6d, 0x33, 0x94, 0xc7, 0x62, 0x31, 0xbe, 0xc4, 0x1e, 0x23, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcf, 0xdd, 0x79, 0xe7, 0x9d, + 0xa6, 0xd9, 0x78, 0xaf, 0xb9, 0xe6, 0x1a, 0xdb, 0xda, 0x58, 0xb4, 0x68, + 0x91, 0xe5, 0xd9, 0x60, 0xdf, 0xfa, 0xd6, 0xb7, 0x4c, 0xcb, 0x9b, 0x9a, + 0x9a, 0xa4, 0xba, 0xba, 0xda, 0x50, 0xbe, 0x73, 0xe7, 0x4e, 0xd3, 0xe5, + 0xdf, 0x7e, 0xfb, 0x6d, 0x79, 0xfb, 0xed, 0xb7, 0x2d, 0xb5, 0x7d, 0xce, + 0x39, 0xe7, 0x58, 0xde, 0xc6, 0x3b, 0xee, 0xb8, 0xc3, 0xb4, 0x7c, 0xcb, + 0x96, 0x2d, 0x72, 0xd2, 0x49, 0x27, 0x19, 0xca, 0x0b, 0x99, 0x1d, 0xb7, + 0x70, 0xe1, 0x42, 0xd3, 0xf2, 0x55, 0xab, 0x56, 0xc9, 0xf8, 0xf1, 0xe3, + 0xf3, 0xae, 0x47, 0x51, 0x14, 0x19, 0x3b, 0x76, 0xac, 0x0c, 0x19, 0x32, + 0xc4, 0x96, 0xfd, 0x3b, 0x69, 0xd2, 0x24, 0x5b, 0xea, 0xc9, 0x64, 0x32, + 0xf2, 0xbd, 0xef, 0x7d, 0xcf, 0xb4, 0xbf, 0x6f, 0xbf, 0xfd, 0xb6, 0xe9, + 0x38, 0xc2, 0x7b, 0x04, 0x00, 0x1d, 0xe0, 0x74, 0x16, 0x57, 0xa7, 0xb3, + 0xee, 0x5a, 0xed, 0xa7, 0x5d, 0xed, 0x7a, 0x95, 0xb5, 0xd6, 0xab, 0x6c, + 0xc2, 0x5e, 0xe1, 0x71, 0x11, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0xb8, 0xf1, + 0x88, 0xac, 0x57, 0xf7, 0x64, 0xc4, 0x09, 0xd8, 0x46, 0xb8, 0x70, 0x0e, + 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0x62, 0x06, + 0x20, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x37, 0x66, 0xd0, 0x17, 0x93, 0x74, + 0xc2, 0xee, 0xe4, 0x14, 0x6e, 0x24, 0xfc, 0x28, 0xa6, 0x5d, 0xaf, 0xda, + 0x70, 0x63, 0x5d, 0xaf, 0x8e, 0x3f, 0x00, 0xa5, 0xff, 0x77, 0x04, 0xc8, + 0x85, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x67, 0x96, 0x3d, + 0xb6, 0xaf, 0xa0, 0x92, 0xaa, 0xaa, 0xbd, 0x96, 0x29, 0x34, 0x08, 0x65, + 0xd7, 0x6b, 0xae, 0xec, 0x6c, 0xa7, 0xaf, 0x36, 0xec, 0x7c, 0x1c, 0xd5, + 0x8e, 0xd7, 0x5b, 0x95, 0xf2, 0xe3, 0xb1, 0xf9, 0xf6, 0xdd, 0xad, 0x4c, + 0xce, 0x28, 0x0c, 0x01, 0x40, 0x00, 0x80, 0x23, 0x72, 0x5d, 0x94, 0x39, + 0x71, 0x01, 0xe4, 0xc4, 0xaf, 0xaa, 0x4e, 0x6c, 0x83, 0x13, 0x17, 0xc4, + 0x6e, 0x8f, 0x75, 0x10, 0xf6, 0x03, 0x00, 0x00, 0xa5, 0xe6, 0xee, 0xbb, + 0xef, 0x36, 0x94, 0xa5, 0x52, 0x29, 0x69, 0x6c, 0x6c, 0x34, 0x4d, 0x54, + 0xa1, 0xeb, 0xba, 0xdc, 0x7f, 0xff, 0xfd, 0x86, 0xbf, 0xa3, 0x23, 0x47, + 0x8e, 0xb4, 0xdc, 0xf6, 0xdc, 0xb9, 0x73, 0x65, 0xcc, 0x98, 0x31, 0x79, + 0xff, 0x9d, 0xef, 0xee, 0xee, 0x36, 0xcd, 0x36, 0x9b, 0xcb, 0xb9, 0xe7, + 0x9e, 0x2b, 0x33, 0x67, 0xce, 0x14, 0x5d, 0xd7, 0xf3, 0x5a, 0x5e, 0xd7, + 0x75, 0x89, 0xc7, 0xe3, 0xa6, 0x9f, 0x69, 0x9a, 0x26, 0xf7, 0xdd, 0x77, + 0x5f, 0xde, 0x7d, 0xd0, 0x75, 0x5d, 0xda, 0xdb, 0xdb, 0xe5, 0xc0, 0x81, + 0x03, 0x86, 0xcf, 0xda, 0xdb, 0xdb, 0xe5, 0xfe, 0xfb, 0xef, 0x37, 0x04, + 0xb7, 0xd2, 0xe9, 0xb4, 0x3c, 0xf2, 0xc8, 0x23, 0xa6, 0xf5, 0xfd, 0xcd, + 0xdf, 0xfc, 0x8d, 0xa1, 0x6d, 0x45, 0x51, 0xa4, 0xac, 0xac, 0x4c, 0x0e, + 0x1e, 0x3c, 0x68, 0x18, 0xc7, 0xe3, 0xb3, 0x12, 0xe7, 0xa3, 0xbd, 0xbd, + 0x5d, 0x5a, 0x5a, 0x5a, 0x2c, 0x5d, 0x4f, 0x0d, 0x1b, 0x36, 0xcc, 0xf4, + 0xb3, 0xd6, 0xd6, 0x56, 0x69, 0x6b, 0x6b, 0xcb, 0x3a, 0x8e, 0xf9, 0xf6, + 0x4f, 0x51, 0x14, 0xa9, 0xac, 0xac, 0x34, 0xfd, 0x2c, 0x99, 0x4c, 0xca, + 0x91, 0x23, 0x47, 0x4c, 0xaf, 0xdd, 0x86, 0x0e, 0x1d, 0xca, 0x17, 0xdc, + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb9, 0xbf, 0xfd, + 0xdb, 0xbf, 0x35, 0x2d, 0xbf, 0xef, 0xbe, 0xfb, 0xe4, 0xef, 0xfe, 0xee, + 0xef, 0x0c, 0xe5, 0x6b, 0xd7, 0xae, 0x95, 0x1f, 0xfc, 0xe0, 0x07, 0xb6, + 0xb4, 0x3d, 0x6f, 0xde, 0x3c, 0xb9, 0xf0, 0xc2, 0x0b, 0x1d, 0xdd, 0xbe, + 0xe9, 0xd3, 0xa7, 0xcb, 0x43, 0x0f, 0x3d, 0x64, 0x4b, 0x5d, 0x65, 0x65, + 0x65, 0xf2, 0xf0, 0xc3, 0x0f, 0x5b, 0x5a, 0x67, 0xc5, 0x8a, 0x15, 0x32, + 0x75, 0xea, 0x54, 0x43, 0xf9, 0xf2, 0xe5, 0xcb, 0x65, 0xf1, 0xe2, 0xc5, + 0x86, 0xf2, 0x44, 0x22, 0x61, 0x1a, 0x00, 0x54, 0x14, 0x45, 0xee, 0xbd, + 0xf7, 0x5e, 0xa9, 0xa8, 0xa8, 0x30, 0x7c, 0xb6, 0x71, 0xe3, 0x46, 0xdb, + 0x82, 0x5d, 0x1b, 0x36, 0x6c, 0x90, 0xaf, 0x7e, 0xf5, 0xab, 0x96, 0xd6, + 0xc9, 0x16, 0xc0, 0xfd, 0xfd, 0xef, 0x7f, 0x2f, 0x33, 0x67, 0xce, 0xb4, + 0xb4, 0x8e, 0x55, 0x4d, 0x4d, 0x4d, 0x32, 0x7c, 0xf8, 0x70, 0x43, 0x79, + 0x28, 0x14, 0x92, 0x64, 0x32, 0xc9, 0x17, 0xdc, 0x05, 0x04, 0x00, 0x5d, + 0xe4, 0x55, 0xf6, 0x5b, 0xbb, 0xb2, 0x0c, 0x97, 0x4a, 0x76, 0x63, 0xaf, + 0xfa, 0x63, 0x57, 0x3f, 0x9d, 0x56, 0x2a, 0xd9, 0x8a, 0x01, 0x00, 0x00, + 0x00, 0xe4, 0x7f, 0x8d, 0xcf, 0xf5, 0xbc, 0x33, 0xf7, 0x49, 0x41, 0x79, + 0xda, 0xc0, 0xea, 0x8c, 0x4c, 0x91, 0xcf, 0x82, 0x73, 0x4e, 0x73, 0xa3, + 0x0d, 0xfc, 0xdf, 0x58, 0x33, 0x04, 0x00, 0x00, 0x00, 0x80, 0x73, 0x37, + 0x90, 0xf9, 0x26, 0xed, 0x28, 0x26, 0x71, 0x84, 0xdd, 0xc9, 0x29, 0x8a, + 0x59, 0xae, 0x98, 0xfe, 0xe5, 0xab, 0x98, 0x31, 0x75, 0x63, 0xfc, 0xbc, + 0x4a, 0x16, 0x02, 0x00, 0x40, 0x36, 0xbc, 0xa1, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x46, 0xe2, 0x34, 0xf0, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3e, 0xd7, 0xdd, 0xdd, 0x6d, 0x28, 0xd3, 0x34, 0xcd, 0x34, 0x03, + 0xb0, 0xc8, 0x67, 0x19, 0x82, 0xcd, 0xd6, 0xc9, 0x26, 0x14, 0x0a, 0xc9, + 0xa0, 0x41, 0x83, 0x64, 0xe2, 0xc4, 0x89, 0x86, 0x76, 0x73, 0xbd, 0xa7, + 0xcd, 0x4a, 0x1b, 0x3d, 0xfd, 0x32, 0x93, 0x4e, 0xa7, 0x45, 0xd7, 0x75, + 0xd3, 0xcf, 0x23, 0x91, 0x48, 0xd6, 0xba, 0xf2, 0xcd, 0x1a, 0xdc, 0x57, + 0x5d, 0xd1, 0x68, 0x54, 0x66, 0xcc, 0x98, 0x61, 0x3a, 0xc6, 0x66, 0xed, + 0x58, 0xdd, 0xee, 0x9e, 0xba, 0xce, 0x3a, 0xeb, 0x2c, 0x89, 0xc5, 0x62, + 0x79, 0x2d, 0x7f, 0xf0, 0xe0, 0x41, 0xcb, 0x81, 0xbb, 0x41, 0x83, 0x06, + 0xc9, 0x29, 0xa7, 0x9c, 0x62, 0x78, 0x9d, 0xc0, 0xb1, 0x63, 0xc7, 0x4c, + 0xc7, 0xb7, 0xa7, 0xfe, 0x73, 0xcf, 0x3d, 0xd7, 0x90, 0xed, 0x77, 0xfb, + 0xf6, 0xed, 0x59, 0xf7, 0x49, 0xae, 0x6d, 0x34, 0x7b, 0xdf, 0xa0, 0xa2, + 0x28, 0x72, 0xea, 0xa9, 0xa7, 0x4a, 0x5d, 0x5d, 0x9d, 0x69, 0xfb, 0x70, + 0x9e, 0xb2, 0x63, 0xd7, 0x5e, 0x5e, 0x32, 0x91, 0xc3, 0xf8, 0x13, 0xad, + 0xa7, 0x48, 0xf7, 0x2a, 0xb9, 0x46, 0xa9, 0xf4, 0x93, 0x24, 0x20, 0xfe, + 0x54, 0xc8, 0xf6, 0xee, 0xdc, 0xbd, 0x8f, 0x93, 0x44, 0x3f, 0x38, 0xaf, + 0x15, 0x7a, 0x0c, 0xbb, 0xfd, 0x0e, 0xa3, 0x5c, 0xc8, 0x2f, 0x3a, 0xb3, + 0x00, 0x00, 0x1d, 0xd8, 0x49, 0x44, 0x41, 0x54, 0xfd, 0x2c, 0xb4, 0x2f, + 0x4e, 0x6c, 0x7b, 0x7f, 0xae, 0xb3, 0x14, 0xf6, 0x3b, 0xe7, 0x35, 0xce, + 0x7b, 0x4e, 0x1c, 0x93, 0x7e, 0x7a, 0x77, 0x5e, 0x50, 0xde, 0x01, 0x68, + 0xf7, 0x35, 0x97, 0x57, 0xdb, 0xe6, 0x87, 0x77, 0x00, 0x72, 0xde, 0xf3, + 0x97, 0x01, 0x15, 0x71, 0x19, 0x32, 0xa8, 0xce, 0xf4, 0xb3, 0x21, 0x43, + 0x86, 0x18, 0x82, 0x4e, 0x8a, 0xa2, 0x48, 0x4b, 0x4b, 0x8b, 0x69, 0x80, + 0x26, 0x1e, 0x8f, 0x4b, 0x34, 0x1a, 0xcd, 0xbb, 0xed, 0xa6, 0xa6, 0x26, + 0xc9, 0x64, 0x32, 0x96, 0xbf, 0x0f, 0x8a, 0xa2, 0x48, 0x4d, 0x4d, 0x4d, + 0xde, 0xed, 0x74, 0x75, 0x75, 0x49, 0x47, 0x47, 0x87, 0xa1, 0x3c, 0x14, + 0x0a, 0x49, 0x65, 0x65, 0xa5, 0xa1, 0xfd, 0x9e, 0x7e, 0x99, 0x79, 0xf1, + 0xc5, 0x17, 0xe5, 0x1b, 0xdf, 0xf8, 0x46, 0xde, 0x01, 0xb5, 0xa6, 0xa6, + 0x26, 0xe9, 0xec, 0xec, 0x34, 0x5d, 0x3e, 0x5b, 0x1b, 0xdb, 0xb6, 0x6d, + 0x93, 0x2f, 0x7d, 0xe9, 0x4b, 0x86, 0x6d, 0xcc, 0x64, 0x32, 0x72, 0xec, + 0xd8, 0x31, 0xd3, 0xf1, 0x68, 0x69, 0x69, 0x31, 0xcd, 0x02, 0x6c, 0xe7, + 0x7d, 0xef, 0x3b, 0xef, 0xbc, 0x63, 0x9a, 0x05, 0xf8, 0x96, 0x5b, 0x6e, + 0x91, 0x25, 0x4b, 0x96, 0x18, 0xda, 0x51, 0x14, 0xc5, 0x74, 0x5f, 0xb5, + 0xb6, 0xb6, 0xca, 0x9a, 0x35, 0x6b, 0x64, 0xe6, 0xcc, 0x99, 0x79, 0xaf, + 0x93, 0x4d, 0x2a, 0x95, 0x92, 0xd5, 0xab, 0x57, 0x5b, 0xce, 0x28, 0x9c, + 0x6d, 0x1b, 0x0f, 0x1e, 0x39, 0x2a, 0xad, 0x6d, 0x1d, 0x9c, 0x18, 0x6c, + 0xc2, 0x0c, 0x40, 0x17, 0x03, 0x29, 0x5e, 0x05, 0xac, 0xec, 0x0a, 0x40, + 0x39, 0x1d, 0xa0, 0x73, 0xba, 0x9f, 0x5e, 0x05, 0x1e, 0x4b, 0xe5, 0xf8, + 0x01, 0x00, 0x00, 0xd6, 0xfe, 0xfe, 0xbb, 0x91, 0xe8, 0xc1, 0xee, 0xa0, + 0x96, 0xdd, 0x63, 0xe0, 0xc6, 0x98, 0x16, 0x93, 0x78, 0x23, 0xdf, 0x3e, + 0x17, 0x13, 0xec, 0x2b, 0x66, 0xdd, 0x62, 0xb6, 0x17, 0xfd, 0x4f, 0x73, + 0x73, 0xb3, 0x24, 0x12, 0x89, 0xbc, 0x97, 0xef, 0xe8, 0xe8, 0x30, 0x0d, + 0xb4, 0xd9, 0xfd, 0x5d, 0xd7, 0x34, 0x4d, 0x9a, 0x9a, 0x9a, 0x8a, 0xde, + 0xbe, 0x54, 0x2a, 0x25, 0x8d, 0x8d, 0x8d, 0x96, 0xcf, 0x73, 0x9d, 0x9d, + 0x9d, 0xd2, 0xd9, 0xd9, 0xe9, 0xf8, 0x39, 0xce, 0x8e, 0x6d, 0x74, 0xf3, + 0x7e, 0x2c, 0x5b, 0x3b, 0xc7, 0x6f, 0x87, 0xaa, 0xaa, 0x96, 0xd7, 0xc9, + 0xe6, 0x8b, 0x75, 0x71, 0x2f, 0xea, 0x3f, 0xbc, 0x03, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x8c, 0x77, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf7, + 0x9b, 0xf7, 0x50, 0xc8, 0x34, 0x83, 0x6d, 0x32, 0x99, 0xb4, 0xf4, 0x9e, + 0x48, 0x45, 0x51, 0x0c, 0xd9, 0x5e, 0x45, 0xc4, 0x52, 0xa6, 0xd7, 0x2f, + 0x8a, 0x44, 0x22, 0x59, 0x33, 0x11, 0xdb, 0xc1, 0x6a, 0x96, 0xdf, 0x5c, + 0xdb, 0x58, 0xe8, 0xfb, 0x34, 0xcd, 0xc6, 0x3d, 0x93, 0xc9, 0x48, 0x32, + 0x99, 0xf4, 0xfc, 0x98, 0x38, 0xfe, 0xbd, 0x7b, 0x76, 0xbf, 0x67, 0x4f, + 0x55, 0xd5, 0x9c, 0x59, 0xa0, 0x8f, 0x5f, 0x16, 0x3e, 0x3e, 0x87, 0x30, + 0x04, 0x00, 0x00, 0x00, 0x80, 0x75, 0x76, 0x27, 0x6b, 0x70, 0x23, 0xf9, + 0x43, 0xbe, 0xf5, 0xd9, 0x9d, 0x9c, 0xc2, 0x8d, 0xb1, 0xb2, 0x9b, 0x9f, + 0xc6, 0x80, 0xc4, 0x20, 0x10, 0x11, 0x39, 0x74, 0xe8, 0x90, 0xa1, 0x4c, + 0x55, 0x55, 0x79, 0xe8, 0xa1, 0x87, 0xe4, 0x47, 0x3f, 0xfa, 0x51, 0xde, + 0xc7, 0xc4, 0x77, 0xbe, 0xf3, 0x1d, 0x79, 0xfc, 0xf1, 0xc7, 0x0d, 0x41, + 0x3b, 0x4d, 0xd3, 0xe4, 0xfc, 0xf3, 0xcf, 0x97, 0xfa, 0xfa, 0xfa, 0xbc, + 0xfb, 0xd4, 0xd2, 0xd2, 0x22, 0x8d, 0x8d, 0x8d, 0x05, 0x05, 0xe9, 0xec, + 0x3e, 0x6f, 0x7d, 0xd1, 0x95, 0x57, 0x5e, 0x29, 0xff, 0xfc, 0xcf, 0xff, + 0x6c, 0xe8, 0x57, 0x26, 0x93, 0xb1, 0x94, 0x19, 0x59, 0x44, 0xe4, 0xa4, + 0x93, 0x4e, 0x92, 0xc6, 0xc6, 0x46, 0xc3, 0xf7, 0x30, 0x91, 0x48, 0x48, + 0x5d, 0x5d, 0x9d, 0x6d, 0xdb, 0x79, 0xd1, 0x45, 0x17, 0x49, 0x75, 0x75, + 0x75, 0xde, 0xcb, 0x2f, 0x58, 0xb0, 0x40, 0x9a, 0x9b, 0x9b, 0x8b, 0x3e, + 0x3f, 0xea, 0xba, 0x2e, 0x3f, 0xf8, 0xc1, 0x0f, 0x64, 0xd9, 0xb2, 0x65, + 0x86, 0xcf, 0x0e, 0x1f, 0x3e, 0x2c, 0x1d, 0x1d, 0x1d, 0x96, 0x02, 0xbc, + 0xbf, 0xff, 0xfd, 0xef, 0xe5, 0xca, 0x2b, 0xaf, 0x34, 0x94, 0x4f, 0x9b, + 0x36, 0x4d, 0xee, 0xb9, 0xe7, 0x1e, 0xbe, 0xc8, 0x1e, 0x22, 0x00, 0xe8, + 0x03, 0x5e, 0x65, 0xef, 0x2d, 0xf5, 0x2c, 0xbd, 0x76, 0xf5, 0xc7, 0xab, + 0xac, 0xbe, 0x4e, 0xd7, 0x43, 0x86, 0x25, 0x78, 0x79, 0xfe, 0xea, 0xeb, + 0x18, 0x2c, 0xf4, 0x7b, 0x51, 0x68, 0x9d, 0x4e, 0xf4, 0xc5, 0x4f, 0xe3, + 0xe9, 0xc4, 0xf9, 0xcf, 0xed, 0xbe, 0x38, 0xd1, 0x4f, 0x00, 0x00, 0x82, + 0x24, 0x1e, 0x8f, 0x9b, 0x96, 0x5b, 0x9d, 0x75, 0xa5, 0xaa, 0x6a, 0xd6, + 0x20, 0xd8, 0x7f, 0xff, 0xf7, 0x7f, 0x5b, 0x9e, 0x09, 0x18, 0x8b, 0xc5, + 0x7c, 0x37, 0x56, 0xaa, 0xaa, 0xda, 0xd6, 0x2f, 0x4d, 0xd3, 0xa4, 0xbc, + 0xbc, 0xbc, 0xe8, 0x71, 0xef, 0xcb, 0xda, 0xb5, 0x6b, 0x2d, 0x5d, 0x1b, + 0xcd, 0x9f, 0x3f, 0x3f, 0xeb, 0x31, 0x61, 0xd5, 0xbb, 0xef, 0xbe, 0x6b, + 0x5a, 0x1e, 0x0a, 0x85, 0x2c, 0x07, 0x4c, 0xd3, 0xe9, 0xb4, 0xfc, 0xe2, + 0x17, 0xbf, 0x30, 0x94, 0x8f, 0x1b, 0x37, 0x8e, 0x2f, 0xb1, 0xd7, 0xdf, + 0x0b, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x60, 0x72, + 0x8a, 0x3f, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0xbc, + 0x03, 0x10, 0x00, 0x00, 0x00, 0xe8, 0x83, 0x1b, 0xc9, 0x1a, 0x8a, 0x49, + 0x3a, 0x91, 0xef, 0xe3, 0x55, 0xc5, 0xac, 0x9b, 0xef, 0xf6, 0xda, 0xdd, + 0xae, 0xdd, 0xeb, 0xda, 0xbd, 0x6d, 0x5e, 0x25, 0x24, 0x01, 0xbe, 0x78, + 0x0c, 0x6a, 0x9a, 0x96, 0xd7, 0x71, 0xd2, 0xd7, 0x32, 0xd9, 0xea, 0xd1, + 0x75, 0x9d, 0xe3, 0xd0, 0x23, 0xaa, 0xaa, 0x1a, 0xce, 0x33, 0x76, 0x9f, + 0x77, 0x14, 0x45, 0x31, 0x7d, 0xa7, 0xa1, 0xa6, 0x69, 0x05, 0xd7, 0xf9, + 0xc5, 0x75, 0x15, 0x45, 0xe1, 0x31, 0x60, 0x1f, 0x20, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x89, 0xba, 0xf8, 0xe2, 0x8b, 0xe5, 0xcc, 0x33, + 0xcf, 0xcc, 0x7b, 0xf9, 0x70, 0x38, 0x2c, 0xef, 0xbf, 0xff, 0xbe, 0x21, + 0xa0, 0xa7, 0x28, 0x8a, 0xac, 0x5c, 0xb9, 0xd2, 0x34, 0xd8, 0xb4, 0x71, + 0xe3, 0x46, 0x79, 0xf8, 0xe1, 0x87, 0x4d, 0x83, 0x80, 0x1f, 0x7c, 0xf0, + 0x81, 0x21, 0x4b, 0xac, 0xae, 0xeb, 0x72, 0xfa, 0xe9, 0xa7, 0x9b, 0x26, + 0x90, 0xf8, 0xf3, 0x9f, 0xff, 0x2c, 0xfb, 0xf7, 0xef, 0xcf, 0xbb, 0xbf, + 0x99, 0x4c, 0x46, 0xa6, 0x4d, 0x9b, 0x66, 0xdb, 0x78, 0x6d, 0xd8, 0xb0, + 0x41, 0x92, 0xc9, 0xa4, 0xa1, 0x8d, 0x09, 0x13, 0x26, 0x58, 0xca, 0xc2, + 0xeb, 0x06, 0x45, 0x51, 0x64, 0xd9, 0xb2, 0x65, 0x52, 0x53, 0x53, 0x63, + 0xf8, 0x6c, 0xcc, 0x98, 0x31, 0xb6, 0xb5, 0xf1, 0xc0, 0x03, 0x0f, 0xc8, + 0xe4, 0xc9, 0x93, 0x0d, 0xfb, 0x37, 0x93, 0xc9, 0x98, 0x1e, 0x2b, 0x7d, + 0x31, 0x4b, 0x02, 0x62, 0x67, 0xc6, 0x64, 0x14, 0x86, 0x00, 0xa0, 0x4f, + 0xbe, 0xd4, 0x7e, 0xaa, 0x27, 0xd7, 0x89, 0xd7, 0x4a, 0xbb, 0xa5, 0x92, + 0xdd, 0xd8, 0xae, 0xec, 0xba, 0x5e, 0xd5, 0x63, 0xd7, 0xb8, 0x01, 0x00, + 0x00, 0x00, 0x28, 0x3d, 0xd3, 0xa7, 0x4f, 0xb7, 0xb4, 0xfc, 0xb1, 0x63, + 0xc7, 0x4c, 0x03, 0x4a, 0xb9, 0xee, 0x15, 0xaa, 0xab, 0xab, 0xe5, 0x91, + 0x47, 0x1e, 0x31, 0x7c, 0xae, 0x69, 0x9a, 0x4c, 0x99, 0x32, 0xc5, 0x74, + 0x9d, 0xc6, 0xc6, 0x46, 0xd3, 0x00, 0xe0, 0x86, 0x0d, 0x1b, 0xe4, 0xf2, + 0xcb, 0x2f, 0xf7, 0xec, 0x1e, 0x66, 0xe1, 0xc2, 0x85, 0xf2, 0x9b, 0xdf, + 0xfc, 0xc6, 0x50, 0xbe, 0x79, 0xf3, 0x66, 0x5f, 0x06, 0x00, 0x2f, 0xbf, + 0xfc, 0x72, 0xa9, 0xaf, 0xaf, 0x77, 0xb4, 0x8d, 0xe9, 0xd3, 0xa7, 0xcb, + 0x05, 0x17, 0x5c, 0x60, 0xcb, 0xfd, 0xf5, 0xaf, 0x7e, 0xf5, 0x2b, 0xb9, + 0xe2, 0x8a, 0x2b, 0xf8, 0x62, 0xfa, 0x10, 0x01, 0x40, 0x00, 0x80, 0x23, + 0x0a, 0xbd, 0x50, 0xcb, 0x75, 0x91, 0x91, 0xab, 0xce, 0x42, 0xd7, 0xf3, + 0xdb, 0x45, 0x9e, 0x5f, 0xb6, 0xbd, 0xd0, 0x1f, 0x6b, 0x0a, 0x5d, 0xcf, + 0xed, 0xe3, 0x05, 0x00, 0x80, 0xfe, 0x4a, 0xd7, 0x75, 0x09, 0x85, 0x42, + 0x92, 0x4a, 0xa5, 0x2c, 0xad, 0x63, 0xe6, 0xf8, 0x99, 0x7f, 0xf9, 0xfc, + 0x8d, 0xee, 0x79, 0xa4, 0xd5, 0xab, 0xbf, 0xd3, 0x03, 0x06, 0x0c, 0xb0, + 0xf5, 0x1a, 0xc6, 0x8d, 0xfd, 0x55, 0x2a, 0x6d, 0x98, 0x3d, 0x46, 0x0c, + 0xff, 0x60, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc6, + 0x0c, 0x40, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0xf9, 0x26, 0xe3, 0xb0, 0x3b, + 0x91, 0x47, 0x31, 0xcb, 0xe5, 0xbb, 0x1d, 0x66, 0xdc, 0x98, 0x99, 0xe3, + 0xa7, 0x64, 0x26, 0x76, 0x8f, 0x81, 0x1b, 0xfb, 0x12, 0x00, 0x00, 0x2b, + 0x98, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x33, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x4e, 0xd1, 0x68, 0x34, 0xef, + 0x77, 0xc5, 0xe9, 0xba, 0x9e, 0x75, 0x36, 0x6b, 0x57, 0x57, 0x97, 0x44, + 0xa3, 0x51, 0xd3, 0x8c, 0xb3, 0xba, 0xae, 0x5b, 0x7e, 0x37, 0x61, 0x2c, + 0x16, 0x33, 0xd4, 0xd5, 0xd2, 0xd2, 0x92, 0x75, 0x9d, 0xa6, 0xa6, 0x26, + 0xd3, 0xe4, 0x24, 0x56, 0xdf, 0x5f, 0x97, 0xc9, 0x64, 0x4c, 0xeb, 0xb1, + 0x7b, 0x36, 0xb2, 0xa6, 0x69, 0x8e, 0xef, 0xdb, 0x5c, 0x6d, 0x68, 0x9a, + 0x26, 0xa1, 0x90, 0x31, 0x74, 0xd4, 0xdd, 0xdd, 0xcd, 0x8c, 0xe5, 0x12, + 0x43, 0x00, 0xd0, 0x01, 0x5e, 0x65, 0x77, 0x75, 0x3a, 0x1b, 0xaf, 0x5d, + 0xdb, 0x65, 0xb5, 0x3f, 0x7e, 0x7d, 0x19, 0x6b, 0xb1, 0xe3, 0x66, 0xd7, + 0xf2, 0xa5, 0x92, 0x7d, 0x18, 0x00, 0x00, 0x00, 0x80, 0xfd, 0xf7, 0x15, + 0x07, 0x0e, 0x1c, 0x90, 0x21, 0x43, 0x86, 0x14, 0x5d, 0x7f, 0x2c, 0x16, + 0xcb, 0xda, 0xc6, 0xda, 0xb5, 0x6b, 0xa5, 0xa3, 0xa3, 0xc3, 0x96, 0xed, + 0xf8, 0xfa, 0xd7, 0xbf, 0x2e, 0x9d, 0x9d, 0x9d, 0x86, 0xf2, 0xc6, 0xc6, + 0x46, 0x19, 0x34, 0x68, 0x90, 0xa1, 0x3c, 0x1c, 0x0e, 0x67, 0xed, 0xd7, + 0xa6, 0x4d, 0x9b, 0x4c, 0xeb, 0x4a, 0xa5, 0x52, 0x59, 0xd7, 0x49, 0xa7, + 0xd3, 0xa6, 0xc1, 0xbe, 0xa5, 0x4b, 0x97, 0xca, 0xc4, 0x89, 0x13, 0x0d, + 0xe5, 0x4f, 0x3e, 0xf9, 0xa4, 0xdc, 0x7e, 0xfb, 0xed, 0x86, 0xf2, 0xb2, + 0xb2, 0x32, 0x49, 0x24, 0x12, 0x8e, 0xee, 0xf3, 0x70, 0x38, 0x9c, 0x35, + 0x03, 0xf0, 0xea, 0xd5, 0xab, 0x65, 0xce, 0x9c, 0x39, 0xa6, 0xe3, 0x58, + 0x57, 0x57, 0x67, 0xba, 0x4e, 0x59, 0x59, 0x99, 0x61, 0xbc, 0x32, 0x99, + 0x4c, 0xd6, 0x0c, 0xc0, 0xb9, 0xee, 0x13, 0xef, 0xbe, 0xfb, 0x6e, 0x79, + 0xe2, 0x89, 0x27, 0xf2, 0xde, 0x96, 0x83, 0x07, 0x0f, 0xca, 0xd0, 0xa1, + 0x43, 0xb9, 0x17, 0xf5, 0x10, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x73, 0xb1, 0x58, 0xcc, 0xfc, 0xa6, 0xde, 0xa6, 0xcc, 0xab, 0x4e, + 0x07, 0xb3, 0xfa, 0xd2, 0xdd, 0xdd, 0x6d, 0x5a, 0x9e, 0x4c, 0x26, 0xb3, + 0xae, 0x93, 0x6d, 0x46, 0x62, 0x22, 0x91, 0xc8, 0x1a, 0x00, 0xcc, 0xd6, + 0x8e, 0xd9, 0x2c, 0x37, 0x11, 0x91, 0x78, 0x3c, 0xee, 0xd9, 0x98, 0x74, + 0x75, 0x75, 0x99, 0x96, 0x2b, 0x8a, 0x22, 0x91, 0x48, 0xc4, 0xf2, 0xf1, + 0x60, 0x16, 0x2c, 0xcd, 0x15, 0x7c, 0xcb, 0x36, 0x26, 0x22, 0x62, 0x69, + 0xa6, 0x66, 0xae, 0x7e, 0x65, 0x3b, 0xae, 0x61, 0x3f, 0x66, 0x00, 0x02, + 0x00, 0x1c, 0x91, 0x6b, 0x36, 0x6b, 0xa1, 0xbf, 0xf2, 0x39, 0x51, 0x67, + 0xa1, 0x9c, 0x68, 0x2f, 0x57, 0x9d, 0x85, 0xce, 0x86, 0x2e, 0x74, 0xbd, + 0x42, 0xfb, 0x52, 0xe8, 0x7a, 0x4e, 0xd4, 0x09, 0xf8, 0xe5, 0xdc, 0x57, + 0x8a, 0xc9, 0x24, 0xdc, 0x48, 0xa8, 0x61, 0x77, 0x9f, 0xbd, 0x4a, 0x0c, + 0x52, 0x4c, 0x1b, 0x24, 0x06, 0x01, 0x00, 0xb8, 0x85, 0x19, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x8c, 0x47, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xe8, 0x27, 0x34, 0x4d, 0x93, 0x48, 0x24, 0x62, 0xfa, 0x4e, 0x36, + 0x45, 0x51, 0x4c, 0xdf, 0x3b, 0x97, 0xeb, 0x5d, 0x70, 0x6e, 0xf4, 0xd7, + 0x2c, 0x4b, 0x6d, 0x4f, 0xd6, 0xe0, 0x6c, 0x22, 0x91, 0x88, 0xe9, 0xe3, + 0xf3, 0xd9, 0xb6, 0x25, 0x95, 0x4a, 0x99, 0xbe, 0x57, 0xcf, 0xea, 0xbb, + 0xee, 0x0a, 0x15, 0x0a, 0x85, 0x4c, 0xf7, 0x49, 0x32, 0x99, 0xb4, 0xf4, + 0x1a, 0x80, 0x4c, 0x26, 0x93, 0x73, 0xcc, 0x8e, 0x7f, 0xa7, 0xa2, 0xa2, + 0x28, 0xa2, 0xaa, 0xaa, 0xe9, 0xf2, 0x76, 0xee, 0xf7, 0x4c, 0x26, 0x23, + 0xaa, 0xaa, 0x1a, 0xea, 0xf4, 0xf2, 0xd8, 0xea, 0x6f, 0x18, 0x69, 0x07, + 0xd8, 0xf5, 0x8e, 0x0e, 0xbb, 0xde, 0x59, 0x62, 0x57, 0x3d, 0x56, 0xb3, + 0xf7, 0xda, 0x95, 0x1d, 0xd8, 0xea, 0x76, 0xd9, 0x95, 0xf5, 0xd8, 0x6f, + 0xc7, 0x43, 0xa9, 0x8f, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x7c, 0xf0, + 0xc1, 0x07, 0xf2, 0xda, 0x6b, 0xaf, 0x19, 0xca, 0xeb, 0xeb, 0xeb, 0x65, + 0xd7, 0xae, 0x5d, 0x92, 0x4e, 0xa7, 0x7b, 0x07, 0x07, 0x42, 0x21, 0x19, + 0x36, 0x6c, 0x98, 0x69, 0x5d, 0x2b, 0x56, 0xac, 0x90, 0xf5, 0xeb, 0xd7, + 0xe7, 0xdd, 0x76, 0x57, 0x57, 0x97, 0xdc, 0x7f, 0xff, 0xfd, 0x32, 0x60, + 0xc0, 0x80, 0xa2, 0xb7, 0x23, 0x9d, 0x4e, 0xcb, 0xa1, 0x43, 0x87, 0x4c, + 0x03, 0x93, 0x35, 0x35, 0x35, 0xa6, 0xeb, 0x94, 0x95, 0x95, 0xc9, 0xae, + 0x5d, 0xbb, 0x0c, 0xe5, 0x9a, 0xa6, 0xc9, 0x8f, 0x7f, 0xfc, 0x63, 0x69, + 0x6b, 0x6b, 0x33, 0xb4, 0x31, 0x67, 0xce, 0x1c, 0xd9, 0xbd, 0x7b, 0xb7, + 0x61, 0x9d, 0x03, 0x07, 0x0e, 0xc8, 0x03, 0x0f, 0x3c, 0x60, 0x08, 0x90, + 0x55, 0x55, 0x55, 0xc9, 0x5d, 0x77, 0xdd, 0x65, 0x69, 0x5b, 0x3e, 0xfe, + 0xf8, 0x63, 0x79, 0xfe, 0xf9, 0xe7, 0x0d, 0x75, 0x75, 0x74, 0x74, 0xc8, + 0xbe, 0x7d, 0xfb, 0x0c, 0x01, 0x4d, 0x4d, 0xd3, 0xe4, 0xb1, 0xc7, 0x1e, + 0x93, 0x27, 0x9f, 0x7c, 0x32, 0xef, 0x36, 0x2a, 0x2b, 0x2b, 0x65, 0xcf, + 0x9e, 0x3d, 0x86, 0xfb, 0x3e, 0x4d, 0xd3, 0xb2, 0x66, 0x8b, 0x5e, 0xb5, + 0x6a, 0x95, 0x9c, 0x77, 0xde, 0x79, 0x86, 0x7b, 0x48, 0x3b, 0xef, 0x65, + 0x6b, 0x6b, 0x6b, 0x65, 0xef, 0xde, 0xbd, 0xdc, 0x8f, 0x7a, 0x88, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x60, 0x13, 0xbb, 0x7f, 0xf8, 0x73, 0x23, 0xf9, + 0x43, 0x31, 0x89, 0x28, 0xdc, 0x58, 0xce, 0x4f, 0xfb, 0x2d, 0xdf, 0xfe, + 0xd9, 0x9d, 0xdc, 0x83, 0xc4, 0x20, 0x28, 0x44, 0x53, 0x53, 0x93, 0x2c, + 0x5e, 0xbc, 0xd8, 0x70, 0xac, 0xdc, 0x76, 0xdb, 0x6d, 0x32, 0x78, 0xf0, + 0x60, 0x4b, 0xc7, 0xf8, 0xaa, 0x55, 0xab, 0x2c, 0xb7, 0x7f, 0xef, 0xbd, + 0xf7, 0xda, 0xb6, 0x2d, 0x75, 0x75, 0x75, 0x96, 0x96, 0xd7, 0x34, 0x2d, + 0x6b, 0x30, 0xf3, 0xb7, 0xbf, 0xfd, 0xad, 0xbc, 0xf1, 0xc6, 0x1b, 0x86, + 0xf2, 0xeb, 0xaf, 0xbf, 0xde, 0x74, 0x9d, 0xe6, 0xe6, 0x66, 0x79, 0xe4, + 0x91, 0x47, 0x0c, 0xe5, 0x97, 0x5e, 0x7a, 0xa9, 0xe5, 0x00, 0x60, 0x5b, + 0x5b, 0x9b, 0x69, 0x5d, 0x22, 0x22, 0x3f, 0xfa, 0xd1, 0x8f, 0x4c, 0xcb, + 0xad, 0x06, 0x51, 0x35, 0x4d, 0x93, 0xe1, 0xc3, 0x87, 0xe7, 0xbd, 0xbc, + 0xa2, 0x28, 0x52, 0x57, 0x57, 0x27, 0x43, 0x87, 0x0e, 0x75, 0xf4, 0x78, + 0x0c, 0x87, 0xc3, 0x96, 0xfa, 0x05, 0xfb, 0xf1, 0x0e, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0xc8, 0x2c, 0xa0, 0xc7, 0x0c, 0x2c, 0xff, 0x31, + 0x7b, 0xf4, 0x17, 0xb0, 0x1b, 0x33, 0x00, 0x01, 0x00, 0x8e, 0xc8, 0x35, + 0x33, 0x21, 0xd7, 0x85, 0x67, 0xa1, 0xeb, 0x15, 0x7a, 0x31, 0x5b, 0xe8, + 0x0c, 0x8a, 0xa0, 0x5f, 0x3c, 0x17, 0xba, 0x7d, 0x4e, 0xec, 0x5b, 0x27, + 0xf6, 0x1f, 0x00, 0x00, 0x00, 0xd0, 0x9f, 0x10, 0x66, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x8c, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x4c, 0x4f, 0x36, 0xd8, 0x2f, 0xce, 0xb2, 0xef, 0x2b, 0x73, + 0xae, 0xa6, 0x69, 0xa6, 0xb3, 0xeb, 0x75, 0x5d, 0xcf, 0xfa, 0x6e, 0x4b, + 0xb3, 0xc7, 0x57, 0x8f, 0x4f, 0x30, 0x92, 0x2f, 0x55, 0x55, 0x0d, 0x4f, + 0x05, 0xe4, 0xea, 0x6f, 0x21, 0xd2, 0xe9, 0xb4, 0x21, 0x09, 0x47, 0x26, + 0x93, 0xc9, 0xfa, 0x34, 0x42, 0xcf, 0x36, 0x1e, 0xff, 0x79, 0xa1, 0xdb, + 0x68, 0x55, 0xae, 0x7e, 0x79, 0x49, 0xd7, 0x75, 0xc3, 0xb8, 0xf0, 0x28, + 0xb3, 0xbf, 0x11, 0x00, 0x2c, 0xd1, 0x13, 0xb9, 0x9f, 0x4e, 0x24, 0x7e, + 0xcb, 0xde, 0xeb, 0xd5, 0x89, 0xd0, 0xe9, 0xed, 0xca, 0x56, 0x0f, 0xd9, + 0x7e, 0x01, 0x00, 0x08, 0x2e, 0xaf, 0x92, 0x4e, 0x14, 0x73, 0xbd, 0x99, + 0x6f, 0x9f, 0xed, 0x4e, 0x6c, 0xe1, 0xf7, 0xfa, 0xfc, 0x70, 0xfd, 0x8f, + 0xfe, 0x65, 0xf8, 0xf0, 0xe1, 0xb2, 0x6c, 0xd9, 0x32, 0x43, 0x00, 0x30, + 0x1e, 0x8f, 0xcb, 0x96, 0x2d, 0x5b, 0x0c, 0xc7, 0x95, 0xa6, 0x69, 0xf2, + 0xd4, 0x53, 0x4f, 0x49, 0x24, 0x12, 0x31, 0xd4, 0xb5, 0x79, 0xf3, 0x66, + 0xf9, 0xfb, 0xbf, 0xff, 0x7b, 0xd3, 0x2c, 0xb1, 0xcf, 0x3d, 0xf7, 0x9c, + 0xa1, 0x3c, 0x95, 0x4a, 0xc9, 0xae, 0x5d, 0xbb, 0x24, 0x1a, 0x8d, 0xe6, + 0xdd, 0xdf, 0x8e, 0x8e, 0x0e, 0x59, 0xba, 0x74, 0xa9, 0x21, 0x38, 0x97, + 0x4e, 0xa7, 0x65, 0xc7, 0x8e, 0x1d, 0x92, 0x4c, 0x26, 0x0d, 0x6d, 0x8f, + 0x1c, 0x39, 0x52, 0xaa, 0xaa, 0xaa, 0x0c, 0x75, 0xa5, 0x52, 0x29, 0xd9, + 0xb6, 0x6d, 0x9b, 0xe1, 0x7b, 0xac, 0xaa, 0xaa, 0x5c, 0x7b, 0xed, 0xb5, + 0x72, 0xd5, 0x55, 0x57, 0xf5, 0x2a, 0xd7, 0x75, 0x5d, 0x1a, 0x1b, 0x1b, + 0x65, 0xf3, 0xe6, 0xcd, 0x86, 0xba, 0x9a, 0x9b, 0x9b, 0x65, 0xc5, 0x8a, + 0x15, 0x86, 0xe0, 0x96, 0xa6, 0x69, 0xb2, 0x75, 0xeb, 0x56, 0x43, 0x80, + 0x32, 0x93, 0xc9, 0xc8, 0xc4, 0x89, 0x13, 0x25, 0x14, 0x0a, 0x59, 0xfa, + 0x8e, 0x9b, 0xd5, 0xa5, 0x69, 0x9a, 0x1c, 0x3a, 0x74, 0xc8, 0x74, 0x9d, + 0x3d, 0x7b, 0xf6, 0x98, 0xf6, 0x37, 0x12, 0x89, 0xc8, 0xf8, 0xf1, 0xe3, + 0x2d, 0xb5, 0xfd, 0xc9, 0x27, 0x9f, 0x98, 0x1e, 0x13, 0xe9, 0x74, 0x5a, + 0x4e, 0x3d, 0xf5, 0x54, 0xd3, 0xf5, 0x2e, 0xbe, 0xf8, 0x62, 0x39, 0xe3, + 0x8c, 0x33, 0x0c, 0xc7, 0x97, 0xaa, 0xaa, 0xa6, 0xfd, 0x2a, 0x2b, 0x2b, + 0x93, 0x31, 0x63, 0xc6, 0xf0, 0xc5, 0xf4, 0xf2, 0x9a, 0x62, 0xc7, 0xae, + 0xbd, 0xfc, 0x35, 0xc9, 0x61, 0xfc, 0x89, 0x23, 0x7d, 0x77, 0xc1, 0xe7, + 0x74, 0x00, 0xd0, 0xe9, 0x0b, 0x12, 0xa7, 0x03, 0x65, 0x5e, 0xf5, 0xdf, + 0x6a, 0xfd, 0x5e, 0x05, 0x5a, 0xed, 0xbc, 0xb0, 0xdc, 0xb9, 0x7b, 0x1f, + 0x27, 0x89, 0x7e, 0x70, 0x5e, 0x2b, 0xf4, 0x9d, 0x6e, 0x4e, 0xd4, 0xe9, + 0xc4, 0xf9, 0xc0, 0xed, 0xf6, 0x4a, 0xa5, 0x2f, 0x7e, 0xda, 0x3e, 0x37, + 0x6f, 0x7c, 0x39, 0xaf, 0x71, 0xde, 0xb3, 0x72, 0x8c, 0xda, 0x7d, 0x6c, + 0x16, 0xf3, 0x3d, 0xb7, 0x3b, 0x00, 0xe8, 0xf6, 0xf5, 0xa4, 0x1d, 0xfd, + 0x0b, 0x4a, 0x40, 0xd1, 0xed, 0xc0, 0x23, 0xe7, 0x3d, 0x7f, 0x19, 0x50, + 0x11, 0x97, 0x21, 0x83, 0xcc, 0x33, 0xde, 0x96, 0x95, 0x95, 0x49, 0x22, + 0x91, 0x30, 0x94, 0x1f, 0x3a, 0x74, 0x48, 0xea, 0xeb, 0xeb, 0xf3, 0x6e, + 0xa3, 0xb1, 0xb1, 0x31, 0x6b, 0x56, 0xdd, 0x6c, 0xc7, 0xda, 0xda, 0xb5, + 0x6b, 0xe5, 0x92, 0x4b, 0x2e, 0x31, 0x9d, 0x8d, 0x97, 0x6d, 0x9d, 0x6f, + 0x7f, 0xfb, 0xdb, 0xb2, 0x74, 0xe9, 0xd2, 0xbc, 0xfb, 0xf5, 0xc0, 0x03, + 0x0f, 0xc8, 0xe2, 0xc5, 0x8b, 0x2d, 0x9d, 0x6b, 0x36, 0x6c, 0xd8, 0x20, + 0x93, 0x27, 0x4f, 0x36, 0x94, 0xb7, 0xb5, 0xb5, 0x65, 0xcd, 0x9e, 0xdb, + 0xd9, 0xd9, 0x29, 0xb1, 0x58, 0xcc, 0x50, 0xfe, 0xec, 0xb3, 0xcf, 0xca, + 0xcd, 0x37, 0xdf, 0x6c, 0x28, 0x5f, 0xb1, 0x62, 0x85, 0xdc, 0x74, 0xd3, + 0x4d, 0x86, 0xf2, 0x44, 0x22, 0x21, 0x65, 0x65, 0x65, 0xa6, 0x6d, 0xb4, + 0xb6, 0xb6, 0x4a, 0x45, 0x45, 0x85, 0xa1, 0x7c, 0xe3, 0xc6, 0x8d, 0x72, + 0xfa, 0xe9, 0xa7, 0x3b, 0x7a, 0x0c, 0xdd, 0x72, 0xcb, 0x2d, 0xb2, 0x64, + 0xc9, 0x12, 0xdb, 0xce, 0xd9, 0x56, 0xcf, 0x3f, 0xeb, 0xd6, 0xad, 0x93, + 0x99, 0x33, 0x67, 0x1a, 0xca, 0xef, 0xbd, 0xf7, 0x5e, 0x79, 0xec, 0xb1, + 0xc7, 0x2c, 0xd5, 0x75, 0xf0, 0xc8, 0x51, 0x69, 0x6d, 0xeb, 0xe0, 0xc4, + 0x60, 0x13, 0xe6, 0x67, 0x02, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x8f, 0x58, + 0x99, 0x9d, 0xe6, 0x07, 0x85, 0x3c, 0x5a, 0xea, 0xb7, 0x27, 0xc3, 0xfa, + 0xf3, 0x71, 0xc2, 0xd3, 0x69, 0x3e, 0xf9, 0x1e, 0x31, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0xf1, 0x0e, 0x40, 0x00, 0x40, 0x4e, + 0x4e, 0x3c, 0x76, 0x54, 0x68, 0x9d, 0x4e, 0xf4, 0xc5, 0x89, 0xc7, 0x91, + 0x4b, 0xe5, 0xd1, 0x68, 0xb7, 0xc7, 0xd3, 0xed, 0xbe, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x0c, 0x01, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x26, 0x76, 0xbf, + 0xbf, 0x2d, 0xdf, 0x75, 0x8b, 0x49, 0xbc, 0x51, 0x4c, 0xbb, 0x76, 0x6f, + 0x47, 0x31, 0xe3, 0xec, 0xd5, 0x3e, 0xf2, 0x53, 0x5f, 0x80, 0xa0, 0x9f, + 0x13, 0xbd, 0xe8, 0xaf, 0x5b, 0xeb, 0xf0, 0xdd, 0x87, 0xd3, 0x08, 0x00, + 0xfa, 0xe4, 0xa4, 0xe1, 0x45, 0xbb, 0x56, 0x93, 0x53, 0xf8, 0x2d, 0xd9, + 0x87, 0x5d, 0xfd, 0x29, 0x95, 0x64, 0x2b, 0x56, 0xfb, 0x49, 0x76, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0xeb, 0xea, 0xea, 0x32, 0xcd, 0x5e, 0x3b, + 0x70, 0xe0, 0x40, 0xf9, 0xab, 0xbf, 0xfa, 0x2b, 0xc3, 0xf2, 0xfb, 0xf7, + 0xef, 0x97, 0xff, 0xf9, 0x9f, 0xff, 0x31, 0x94, 0xa7, 0x52, 0x29, 0xe9, + 0xee, 0xee, 0x96, 0x74, 0x3a, 0xdd, 0xab, 0xbc, 0x90, 0xf7, 0xff, 0xe5, + 0xd2, 0xd9, 0xd9, 0x69, 0xb8, 0x57, 0x52, 0x14, 0x45, 0x22, 0x91, 0x88, + 0x69, 0x7f, 0xcb, 0xcb, 0xcb, 0xb3, 0xd6, 0x75, 0xde, 0x79, 0xe7, 0x19, + 0x12, 0xaa, 0x74, 0x75, 0x75, 0x49, 0x22, 0x91, 0x30, 0x64, 0x33, 0x16, + 0xf9, 0x2c, 0xab, 0xee, 0xa5, 0x97, 0x5e, 0x2a, 0xe1, 0x70, 0xb8, 0x57, + 0x79, 0x28, 0x14, 0x92, 0x9f, 0xff, 0xfc, 0xe7, 0xb6, 0x6c, 0x9f, 0x5b, + 0xe3, 0x98, 0x48, 0x24, 0x4c, 0xef, 0x39, 0xbb, 0xba, 0xba, 0xb2, 0xf6, + 0xcb, 0xec, 0x58, 0x11, 0x91, 0xac, 0xc9, 0x54, 0x60, 0x2f, 0xb2, 0x00, + 0xf7, 0xa1, 0x90, 0xac, 0x71, 0x5e, 0x65, 0xad, 0x25, 0x00, 0x68, 0xef, + 0x7e, 0x29, 0x95, 0x00, 0x9a, 0xd3, 0xfb, 0x25, 0x17, 0xb2, 0xc6, 0xf5, + 0x9f, 0xf3, 0x5a, 0xa0, 0xff, 0x10, 0xf2, 0x08, 0xb0, 0x2f, 0xc6, 0xd3, + 0x2f, 0x38, 0xaf, 0x71, 0xde, 0xb3, 0x72, 0x6c, 0xdb, 0x9d, 0xc1, 0xd5, + 0xee, 0x75, 0xdd, 0xb8, 0xbe, 0xf0, 0x6a, 0x46, 0x61, 0x31, 0xed, 0xda, + 0xbd, 0x2f, 0xfd, 0x94, 0x09, 0x99, 0xf3, 0x5e, 0xe9, 0x73, 0x2b, 0x0b, + 0xf0, 0xe0, 0xc1, 0x83, 0x25, 0x95, 0x4a, 0xe5, 0x7d, 0xfc, 0xe5, 0xca, + 0x02, 0x9c, 0x4d, 0x53, 0x53, 0x93, 0x54, 0x57, 0x57, 0x1b, 0xca, 0xdf, + 0x7c, 0xf3, 0x4d, 0xb9, 0xec, 0xb2, 0xcb, 0x6c, 0x39, 0xd6, 0x73, 0x65, + 0x01, 0xae, 0xac, 0xac, 0xb4, 0xd4, 0xc6, 0x96, 0x2d, 0x5b, 0x64, 0xd2, + 0xa4, 0x49, 0xb6, 0xec, 0xc7, 0x6b, 0xaf, 0xbd, 0x56, 0x5e, 0x7a, 0xe9, + 0x25, 0x43, 0xf9, 0xaa, 0x55, 0xab, 0xe4, 0xba, 0xeb, 0xae, 0x2b, 0x89, + 0xfb, 0x4c, 0x91, 0xcf, 0x02, 0x93, 0xc9, 0x64, 0xd2, 0xf4, 0xb3, 0xdb, + 0x6f, 0xbf, 0x5d, 0x9e, 0x7e, 0xfa, 0xe9, 0xa2, 0xdb, 0x88, 0xc5, 0x62, + 0xd2, 0xd9, 0xd9, 0x69, 0xfa, 0x19, 0x59, 0x80, 0xed, 0x45, 0x12, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, 0xed, 0x49, 0x2c, 0x9e, + 0x2c, 0x2b, 0x3d, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0xe3, 0x1d, 0x80, 0x00, 0x00, 0x00, 0x80, 0xcb, 0x8a, 0x49, 0xda, + 0xe1, 0xc6, 0x23, 0xa2, 0x6e, 0xcc, 0xec, 0xb0, 0xfb, 0xf1, 0xe1, 0x62, + 0x1e, 0xcf, 0xb5, 0x7b, 0xb9, 0x7c, 0xb9, 0xf1, 0x78, 0x38, 0x00, 0x00, + 0x22, 0x04, 0x00, 0x01, 0x00, 0x3e, 0xb8, 0x09, 0x74, 0x9a, 0x13, 0x37, + 0x49, 0x6e, 0xbf, 0x93, 0xcf, 0xed, 0xf7, 0x03, 0x96, 0xca, 0xbb, 0xfc, + 0x4a, 0xfd, 0x9d, 0x83, 0x00, 0x00, 0xa0, 0x7f, 0xe0, 0xba, 0x04, 0x5e, + 0x23, 0x00, 0x18, 0xa0, 0x2f, 0xb6, 0xd3, 0xed, 0x96, 0x4a, 0x92, 0x11, + 0xbf, 0x6d, 0xaf, 0x5d, 0xed, 0xf2, 0x07, 0x03, 0x00, 0x00, 0x00, 0xe8, + 0xbf, 0xea, 0xeb, 0xeb, 0x0d, 0x89, 0x3b, 0x0e, 0x1f, 0x3e, 0x5c, 0x50, + 0x5d, 0xb1, 0x58, 0x4c, 0x2a, 0x2b, 0x2b, 0x2d, 0xd5, 0x55, 0x55, 0x55, + 0x95, 0x77, 0xb6, 0xd6, 0x86, 0x86, 0x06, 0x5b, 0xb7, 0x7d, 0xf8, 0xf0, + 0xe1, 0x86, 0xfb, 0xa1, 0xa3, 0x47, 0x8f, 0xe6, 0xbc, 0x67, 0x8b, 0xc5, + 0x62, 0x52, 0x53, 0x53, 0x93, 0x57, 0xfd, 0x8d, 0x8d, 0x8d, 0xb6, 0xdd, + 0xc3, 0x2a, 0x8a, 0x22, 0xa1, 0x50, 0x48, 0x86, 0x0e, 0x1d, 0xda, 0x6b, + 0xbd, 0xee, 0xee, 0xee, 0xac, 0xeb, 0x29, 0x8a, 0x22, 0xd1, 0x68, 0xd4, + 0x90, 0x51, 0x58, 0x51, 0x14, 0x69, 0x68, 0x68, 0x30, 0xcd, 0xac, 0x5b, + 0x55, 0x55, 0x95, 0x33, 0x43, 0xb1, 0x15, 0x1d, 0x1d, 0x1d, 0x72, 0xec, + 0xd8, 0xb1, 0xbc, 0xef, 0x75, 0x15, 0x45, 0xe1, 0xfe, 0xb4, 0x04, 0x11, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe7, 0x76, 0xec, 0xd8, 0x61, + 0x5a, 0x1e, 0x89, 0x44, 0x2c, 0xd5, 0x53, 0x53, 0x53, 0x63, 0x39, 0x40, + 0x37, 0x63, 0xc6, 0x0c, 0x39, 0x70, 0xe0, 0x80, 0xa5, 0x75, 0xac, 0xf6, + 0x2b, 0x97, 0x7d, 0xfb, 0xf6, 0xf5, 0x0a, 0xa0, 0xf5, 0x08, 0x87, 0xc3, + 0xa6, 0xcb, 0x97, 0x97, 0x97, 0x4b, 0x53, 0x53, 0x53, 0xde, 0xf5, 0xab, + 0xaa, 0x2a, 0xab, 0x56, 0xad, 0x92, 0xef, 0x7e, 0xf7, 0xbb, 0x86, 0xcf, + 0x16, 0x2c, 0x58, 0x20, 0x73, 0xe7, 0xce, 0x35, 0x94, 0x27, 0x12, 0x09, + 0x39, 0xf5, 0xd4, 0x53, 0x65, 0xe4, 0xc8, 0xde, 0x99, 0xe6, 0xdb, 0xdb, + 0xdb, 0xe5, 0xad, 0xb7, 0xde, 0x92, 0x78, 0x3c, 0xde, 0x2b, 0x48, 0xa6, + 0x28, 0x8a, 0x7c, 0xf4, 0xd1, 0x47, 0x72, 0xee, 0xb9, 0xe7, 0x4a, 0x34, + 0x1a, 0x35, 0xec, 0xdb, 0xb6, 0xb6, 0x36, 0x49, 0xa7, 0xd3, 0xbd, 0xca, + 0x43, 0xa1, 0x90, 0x3c, 0xf8, 0xe0, 0x83, 0xf2, 0xd8, 0x63, 0x8f, 0xf5, + 0x2a, 0x57, 0x14, 0x45, 0x9e, 0x7f, 0xfe, 0x79, 0xf9, 0xda, 0xd7, 0xbe, + 0x56, 0xf4, 0xd8, 0x2a, 0x8a, 0x22, 0xeb, 0xd7, 0xaf, 0x37, 0xad, 0x2b, + 0x95, 0x4a, 0xc9, 0x45, 0x17, 0x5d, 0x64, 0xc8, 0xfe, 0xdc, 0xb3, 0x2d, + 0x28, 0x2d, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb9, 0xe3, + 0x83, 0x46, 0x85, 0xea, 0x99, 0x6d, 0x66, 0x85, 0xa6, 0x69, 0xa2, 0x69, + 0x9a, 0x67, 0xdb, 0x6e, 0xb5, 0xcf, 0x85, 0x6c, 0x63, 0x2a, 0x95, 0x92, + 0xf5, 0xeb, 0xd7, 0x1b, 0xca, 0xaf, 0xbd, 0xf6, 0xda, 0xac, 0xeb, 0xec, + 0xdc, 0xb9, 0x53, 0x76, 0xee, 0xdc, 0x69, 0x28, 0x0f, 0x85, 0x42, 0xa6, + 0x01, 0x50, 0x55, 0x55, 0xe5, 0xdd, 0x77, 0xdf, 0x35, 0x2d, 0x0f, 0x85, + 0x42, 0x12, 0x0a, 0x85, 0x4c, 0xc7, 0xde, 0x4c, 0x38, 0x1c, 0xb6, 0xed, + 0x98, 0xc8, 0x16, 0x48, 0x15, 0x11, 0x59, 0xbb, 0x76, 0x2d, 0x5f, 0xbe, + 0x80, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf4, 0xa1, 0x98, 0x44, 0x14, + 0xc5, 0x2c, 0xe7, 0x46, 0x9f, 0x8b, 0x49, 0x30, 0x91, 0xef, 0xba, 0xc5, + 0xbc, 0xba, 0xc5, 0xee, 0x04, 0x1d, 0xf9, 0xf6, 0xaf, 0x98, 0x7d, 0x54, + 0xcc, 0xb8, 0xf0, 0x58, 0x1d, 0x50, 0xda, 0x82, 0xf0, 0xfe, 0x6c, 0x04, + 0x93, 0xca, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x45, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x1e, 0x01, + 0x76, 0x40, 0xa9, 0x4c, 0xf9, 0xcd, 0xf6, 0x78, 0x81, 0x5d, 0xd9, 0x7b, + 0xad, 0x8e, 0x83, 0xd3, 0xe3, 0x66, 0x57, 0x3f, 0xed, 0x3a, 0x1e, 0x9c, + 0xce, 0x7a, 0xcc, 0xe3, 0x23, 0xf0, 0xf2, 0x3c, 0xd2, 0x1f, 0xce, 0xbd, + 0x6e, 0xb7, 0x97, 0x6b, 0xac, 0x9d, 0xe8, 0x4b, 0xa9, 0x9c, 0x43, 0x38, + 0xd7, 0x01, 0x00, 0x00, 0xbb, 0xd8, 0x99, 0xb8, 0xa4, 0xbf, 0xb2, 0xfa, + 0xbe, 0x48, 0xc6, 0xdc, 0x3d, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xb9, 0x95, 0x2b, 0x57, 0x96, 0xcc, 0x0f, 0x5f, 0xa9, 0x54, 0x4a, + 0xae, 0xbe, 0xfa, 0x6a, 0x89, 0xc7, 0xe3, 0xb6, 0xd4, 0xf7, 0xe2, 0x8b, + 0x2f, 0x4a, 0x2a, 0x95, 0x2a, 0xba, 0x9e, 0x64, 0x32, 0x29, 0x37, 0xdc, + 0x70, 0x83, 0x69, 0xd2, 0x8b, 0x8b, 0x2f, 0xbe, 0x58, 0xde, 0x7f, 0xff, + 0x7d, 0x43, 0x79, 0x4b, 0x4b, 0x8b, 0xbc, 0xf0, 0xc2, 0x0b, 0x86, 0x1f, + 0x5c, 0xcd, 0xb2, 0x12, 0x17, 0x2a, 0x93, 0xc9, 0x98, 0xee, 0x5f, 0x55, + 0x55, 0x65, 0xd3, 0xa6, 0x4d, 0x96, 0xea, 0xea, 0xe8, 0xe8, 0x90, 0x9f, + 0xfd, 0xec, 0x67, 0x86, 0x84, 0x22, 0xa9, 0x54, 0x4a, 0x16, 0x2c, 0x58, + 0xe0, 0xe8, 0x7e, 0x57, 0x55, 0x55, 0x96, 0x2d, 0x5b, 0x26, 0x53, 0xa6, + 0x4c, 0xe1, 0x5d, 0x88, 0x3e, 0x44, 0x00, 0x10, 0x00, 0x00, 0x00, 0xe8, + 0x83, 0x9f, 0x6e, 0x64, 0xbc, 0x4a, 0x4e, 0x91, 0x6f, 0x5f, 0x8a, 0x19, + 0x2b, 0xaf, 0x12, 0x97, 0xd8, 0x3d, 0x7e, 0x76, 0x1f, 0x6b, 0xcc, 0x76, + 0x86, 0x88, 0xc8, 0xbc, 0x79, 0xf3, 0x44, 0xd7, 0xf5, 0x92, 0xe9, 0xef, + 0x9c, 0x39, 0x73, 0x6c, 0x09, 0x00, 0x2a, 0x8a, 0x22, 0xd7, 0x5d, 0x77, + 0x9d, 0x6d, 0xfd, 0xba, 0xee, 0xba, 0xeb, 0x4c, 0x03, 0x80, 0xa3, 0x46, + 0x8d, 0x92, 0x51, 0xa3, 0x46, 0x19, 0xca, 0xb7, 0x6d, 0xdb, 0x26, 0x5f, + 0xfd, 0xea, 0x57, 0xb3, 0xf6, 0xcd, 0x8e, 0xef, 0xa7, 0xa2, 0x28, 0x72, + 0xc3, 0x0d, 0x37, 0xd8, 0xb2, 0x7d, 0xdd, 0xdd, 0xdd, 0x72, 0xe3, 0x8d, + 0x37, 0x9a, 0x7e, 0xe6, 0x74, 0x00, 0x50, 0x44, 0x64, 0xf4, 0xe8, 0xd1, + 0x72, 0xda, 0x69, 0xa7, 0xf1, 0x85, 0xf5, 0x21, 0xde, 0x01, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xcf, 0xf5, 0xd7, 0x47, 0x25, 0xbd, 0x0e, 0x80, + 0xe7, 0x6a, 0xdf, 0xae, 0xbe, 0xb9, 0x11, 0xd8, 0xb5, 0xf2, 0x58, 0x6e, + 0x29, 0xef, 0x2f, 0x64, 0x47, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x80, 0xf1, 0x0e, 0x40, 0x17, 0x79, 0x35, 0x15, 0xd6, 0xe9, 0x6c, 0xbc, + 0x76, 0x65, 0xa7, 0x75, 0x3a, 0x5b, 0xae, 0x57, 0xef, 0xee, 0xb1, 0x6b, + 0xbf, 0xfb, 0xad, 0x1e, 0x00, 0x00, 0x00, 0x00, 0xde, 0x53, 0x14, 0xc5, + 0xd3, 0xf7, 0x94, 0x16, 0xf2, 0xf8, 0xaa, 0xaa, 0xaa, 0x96, 0xee, 0x4b, + 0x0a, 0x6d, 0xc3, 0xae, 0x7b, 0xa1, 0x6c, 0x63, 0x5c, 0x48, 0xbf, 0xec, + 0xac, 0xcb, 0xca, 0xf6, 0x9b, 0x8d, 0x47, 0xa1, 0xe3, 0x68, 0xc7, 0xb2, + 0x70, 0x1f, 0x01, 0x40, 0x00, 0x80, 0x63, 0x17, 0xa3, 0x76, 0x73, 0x22, + 0x80, 0x9d, 0xab, 0xce, 0x42, 0xb7, 0xa1, 0xd0, 0x3a, 0xdd, 0xbe, 0x78, + 0xf7, 0x53, 0x52, 0x83, 0x5c, 0x7d, 0xe1, 0x87, 0x0b, 0xf8, 0x95, 0x1b, + 0xc7, 0xa6, 0x1b, 0xc9, 0x38, 0xdc, 0x68, 0xc3, 0xef, 0xc9, 0x3d, 0xdc, + 0xd8, 0xe7, 0x76, 0x8f, 0x33, 0xe7, 0x46, 0xf4, 0xf8, 0xee, 0x77, 0xbf, + 0x2b, 0xe5, 0xe5, 0xe5, 0xde, 0x04, 0x14, 0x42, 0x21, 0x79, 0xe4, 0x91, + 0x47, 0x2c, 0x1d, 0x8f, 0x55, 0x55, 0x55, 0xb2, 0x68, 0xd1, 0xa2, 0xbc, + 0xd7, 0x51, 0x55, 0x55, 0x1e, 0x7d, 0xf4, 0x51, 0x4b, 0xfd, 0x1a, 0x37, + 0x6e, 0x9c, 0x5c, 0x75, 0xd5, 0x55, 0x86, 0xa0, 0x5a, 0x47, 0x47, 0x87, + 0xe5, 0x73, 0x45, 0x59, 0x59, 0x99, 0xdc, 0x7d, 0xf7, 0xdd, 0xa6, 0x59, + 0x75, 0x1f, 0x7f, 0xfc, 0x71, 0x4b, 0x75, 0xc5, 0xe3, 0x71, 0xb9, 0xe7, + 0x9e, 0x7b, 0x0c, 0xef, 0xe3, 0x0b, 0x87, 0xc3, 0xb2, 0x78, 0xf1, 0x62, + 0x5b, 0xf6, 0x89, 0xa6, 0x69, 0x72, 0xe7, 0x9d, 0x77, 0x4a, 0x2c, 0x16, + 0xeb, 0x55, 0xde, 0xd5, 0xd5, 0x55, 0xd0, 0x79, 0xeb, 0xbe, 0xfb, 0xee, + 0x93, 0x74, 0x3a, 0x6d, 0x69, 0xbd, 0xc3, 0x87, 0x0f, 0x5b, 0x5a, 0xbe, + 0xbe, 0xbe, 0x9e, 0x2f, 0xb2, 0x1b, 0xd7, 0xdb, 0x3b, 0x76, 0xed, 0xe5, + 0x2f, 0x47, 0x0e, 0xe3, 0x4f, 0x1c, 0x69, 0xdb, 0x1f, 0x77, 0xbf, 0xcd, + 0x00, 0xb4, 0x3a, 0x13, 0xcf, 0xe9, 0x0b, 0x27, 0xa7, 0x67, 0x00, 0x96, + 0xca, 0x4d, 0x80, 0xdf, 0x8e, 0x9f, 0x5c, 0x76, 0xee, 0xde, 0xc7, 0x49, + 0xa2, 0x1f, 0x9c, 0xd7, 0x0a, 0x0d, 0xcc, 0xb8, 0x1d, 0x00, 0x74, 0x22, + 0x80, 0xe4, 0x76, 0x00, 0xb0, 0x3f, 0x07, 0x4b, 0xfc, 0x12, 0x00, 0xe4, + 0xbc, 0xc6, 0x79, 0xcf, 0xca, 0x31, 0xea, 0x55, 0x00, 0xd0, 0xab, 0x80, + 0x98, 0x9f, 0x02, 0x80, 0x41, 0x09, 0xf6, 0x15, 0x33, 0xce, 0x76, 0x1d, + 0x7f, 0x9c, 0xf7, 0xfc, 0x65, 0x40, 0x45, 0x5c, 0x86, 0x0c, 0xaa, 0x33, + 0xfd, 0xac, 0xac, 0xac, 0x4c, 0x12, 0x89, 0x84, 0xa1, 0xfc, 0xe8, 0xd1, + 0xa3, 0x52, 0x5b, 0x5b, 0xeb, 0x59, 0x9f, 0x43, 0xa1, 0x90, 0x69, 0x80, + 0xa8, 0xa9, 0xa9, 0x49, 0xaa, 0xab, 0xab, 0x6d, 0x69, 0x43, 0xd3, 0x34, + 0x4b, 0x33, 0xe4, 0xae, 0xbb, 0xee, 0x3a, 0x59, 0xb5, 0x6a, 0x95, 0xa3, + 0xdb, 0x9d, 0x4a, 0xa5, 0x4c, 0xb3, 0x09, 0x2b, 0x8a, 0x22, 0x2d, 0x2d, + 0x2d, 0x52, 0x51, 0x51, 0xe1, 0xd8, 0x79, 0x43, 0x51, 0x14, 0x79, 0xfd, + 0xf5, 0xd7, 0x65, 0xd6, 0xac, 0x59, 0xb6, 0x6c, 0xcb, 0xba, 0x75, 0xeb, + 0x64, 0xe6, 0xcc, 0x99, 0xa6, 0xfb, 0x36, 0x99, 0x4c, 0xda, 0x52, 0x57, + 0x21, 0xe7, 0xdb, 0x83, 0x47, 0x8e, 0x4a, 0x6b, 0x5b, 0x07, 0x27, 0x06, + 0x9b, 0x30, 0x3f, 0x13, 0x00, 0x00, 0x00, 0x00, 0x80, 0x12, 0x95, 0x4a, + 0xa5, 0x18, 0x84, 0xe3, 0xb8, 0x91, 0x55, 0x97, 0x71, 0xb7, 0xc7, 0xf1, + 0x33, 0x15, 0xe1, 0x1c, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x8c, 0x24, 0x20, 0x3e, 0x60, 0xd7, 0x3b, 0x4c, 0xbc, 0x7a, 0x47, 0x9c, + 0xdf, 0xde, 0xd1, 0x67, 0xd7, 0x3b, 0x06, 0x9d, 0xce, 0x86, 0x6c, 0xd7, + 0x71, 0xc2, 0x0b, 0xa0, 0x01, 0x00, 0x08, 0xc6, 0x75, 0x9d, 0xdd, 0xef, + 0x9c, 0xb3, 0xfb, 0x5d, 0x72, 0x6e, 0xbc, 0x8f, 0x30, 0xdf, 0xfa, 0xec, + 0xbe, 0xfe, 0x31, 0xeb, 0x9f, 0x1b, 0xef, 0x50, 0xb4, 0x7b, 0x9c, 0x01, + 0x00, 0xc8, 0x86, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, + 0x99, 0x4c, 0x46, 0xe2, 0xf1, 0xb8, 0xa1, 0x5c, 0x51, 0x14, 0x89, 0x46, + 0xa3, 0x96, 0xeb, 0x8b, 0xc5, 0x62, 0xa2, 0xaa, 0xc6, 0x87, 0x34, 0x13, + 0x89, 0x84, 0xe9, 0x3b, 0x0d, 0xcd, 0x12, 0x90, 0x14, 0x2a, 0x12, 0x89, + 0xf8, 0xb2, 0x2e, 0xd8, 0x8b, 0x00, 0x20, 0x00, 0x00, 0x2e, 0x5f, 0x2c, + 0x66, 0xe3, 0xa7, 0xcc, 0xc9, 0x85, 0xd6, 0x19, 0xf4, 0x7e, 0x02, 0x00, + 0x50, 0x2a, 0xd6, 0xad, 0x5b, 0x27, 0x57, 0x5e, 0x79, 0xa5, 0x84, 0x42, + 0xc5, 0xdd, 0xf6, 0x1f, 0x39, 0x72, 0x44, 0xd6, 0xad, 0x5b, 0x27, 0x17, + 0x5c, 0x70, 0x81, 0x2d, 0xfd, 0x7a, 0xfd, 0xf5, 0xd7, 0xe5, 0x9b, 0xdf, + 0xfc, 0xa6, 0x69, 0xe6, 0x60, 0x33, 0xba, 0xae, 0xbb, 0x92, 0xd4, 0xc3, + 0xaa, 0xb2, 0xb2, 0x32, 0x69, 0x6b, 0x6b, 0x33, 0xbd, 0x6e, 0xb9, 0xfe, + 0xfa, 0xeb, 0xe5, 0xad, 0xb7, 0xde, 0x12, 0x4d, 0xd3, 0x3e, 0x2f, 0x4f, + 0x24, 0x12, 0xb2, 0x6c, 0xd9, 0x32, 0xb9, 0xf6, 0xda, 0x6b, 0x4d, 0xeb, + 0xeb, 0xe8, 0xe8, 0x30, 0xad, 0xeb, 0xc1, 0x07, 0x1f, 0x94, 0x87, 0x1f, + 0x7e, 0xd8, 0x70, 0x8d, 0xf3, 0xf5, 0xaf, 0x7f, 0xdd, 0x34, 0x00, 0x59, + 0x88, 0xf6, 0xf6, 0x76, 0xcb, 0xeb, 0x2c, 0x5c, 0xb8, 0x50, 0x56, 0xae, + 0x5c, 0x69, 0xb8, 0x4e, 0xeb, 0xec, 0xec, 0xe4, 0xcb, 0xe7, 0x53, 0x04, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x98, 0x4c, 0x26, 0x23, 0xcd, + 0xcd, 0xcd, 0xb6, 0x04, 0xcf, 0xec, 0xfc, 0x51, 0x4d, 0x55, 0x55, 0x39, + 0x74, 0xe8, 0x50, 0x20, 0x7e, 0xa8, 0xcb, 0xf6, 0x23, 0xa5, 0xae, 0xeb, + 0xd2, 0xd8, 0xd8, 0x68, 0x69, 0x1c, 0xad, 0xfe, 0xe0, 0xd9, 0xde, 0xde, + 0x5e, 0x50, 0xe0, 0xce, 0x2e, 0xba, 0xae, 0x4b, 0x43, 0x43, 0x03, 0x5f, + 0xb4, 0x12, 0x42, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x39, 0xfd, 0xce, 0x78, 0xa0, 0x2f, 0xcc, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xb8, 0x29, 0xed, 0xc5, 0x8d, 0x99, 0x39, 0x5e, 0x25, 0x10, 0x71, 0x63, + 0x7b, 0xf3, 0x4d, 0x2a, 0x62, 0xd6, 0x2e, 0xaf, 0x2f, 0x00, 0x00, 0x38, + 0x81, 0x00, 0x20, 0xf2, 0xbe, 0xe8, 0x70, 0x3a, 0x5b, 0x71, 0xb6, 0xfa, + 0xbd, 0xfa, 0xa5, 0xc4, 0xae, 0xec, 0xc6, 0x7e, 0xbb, 0x88, 0x23, 0x9b, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfb, 0xfe, 0x12, 0xb0, 0x1b, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x4b, 0xaa, 0xaa, 0x4a, 0x38, + 0x1c, 0xb6, 0x14, 0x40, 0x4b, 0x24, 0x12, 0x9e, 0xf6, 0x39, 0x91, 0x48, + 0x18, 0xb2, 0xe1, 0x2a, 0x8a, 0x92, 0x77, 0xe2, 0x93, 0x2f, 0x4a, 0xa5, + 0x52, 0xb6, 0x65, 0xd6, 0x4d, 0xa7, 0xd3, 0xa6, 0x7d, 0xd0, 0x34, 0xad, + 0x57, 0xc2, 0x92, 0x1e, 0xc5, 0x26, 0x90, 0x81, 0xbf, 0xb0, 0x37, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x2f, 0xe9, 0xba, 0x2e, 0xef, 0xbd, 0xf7, + 0x9e, 0x74, 0x77, 0x77, 0xe7, 0xbd, 0x4e, 0x3a, 0x9d, 0x96, 0x97, 0x5f, + 0x7e, 0x39, 0xef, 0xa7, 0xc9, 0x74, 0x5d, 0x97, 0xf3, 0xce, 0x3b, 0x4f, + 0xea, 0xeb, 0xeb, 0xf3, 0x6e, 0x23, 0x99, 0x4c, 0xca, 0xea, 0xd5, 0xab, + 0x25, 0x1c, 0x0e, 0xf7, 0x2a, 0xcf, 0x64, 0x32, 0xb2, 0x68, 0xd1, 0x22, + 0xb9, 0xef, 0xbe, 0xfb, 0x0c, 0xeb, 0xe4, 0xaa, 0xff, 0xe7, 0x3f, 0xff, + 0xb9, 0x21, 0x08, 0x97, 0xc9, 0x64, 0xe4, 0xd2, 0x4b, 0x2f, 0x95, 0x39, + 0x73, 0xe6, 0x14, 0x3d, 0x8e, 0xaa, 0xaa, 0xca, 0xd4, 0xa9, 0x53, 0x0d, + 0xe5, 0x8a, 0xa2, 0xc8, 0x3f, 0xfc, 0xc3, 0x3f, 0xc8, 0x5f, 0xfc, 0xc5, + 0x5f, 0x98, 0x26, 0x8c, 0x31, 0x1b, 0x47, 0x55, 0x55, 0x65, 0xfb, 0xf6, + 0xed, 0x1c, 0x9c, 0x25, 0x86, 0x00, 0x20, 0x00, 0x00, 0x2e, 0xca, 0x75, + 0x21, 0xea, 0xc4, 0xa3, 0x21, 0x6e, 0xb7, 0x57, 0x68, 0x5f, 0x72, 0xb1, + 0x33, 0x63, 0x1e, 0x00, 0x00, 0x28, 0x3d, 0x93, 0x27, 0x4f, 0xb6, 0xb4, + 0x7c, 0x5b, 0x5b, 0x9b, 0x9c, 0x7d, 0xf6, 0xd9, 0x96, 0xd6, 0xd9, 0xb2, + 0x65, 0x8b, 0xa5, 0x00, 0x60, 0x3a, 0x9d, 0x96, 0x6b, 0xae, 0xb9, 0xc6, + 0xf4, 0xb3, 0xd6, 0xd6, 0x56, 0xa9, 0xa8, 0xa8, 0xb0, 0xd4, 0xfe, 0x55, + 0x57, 0x5d, 0x65, 0x5a, 0x7e, 0xe0, 0xc0, 0x01, 0x19, 0x32, 0x64, 0x88, + 0xa3, 0xd7, 0x67, 0x13, 0x27, 0x4e, 0x94, 0x29, 0x53, 0xa6, 0x98, 0x7e, + 0x3e, 0x6d, 0xda, 0x34, 0x0e, 0xc0, 0x80, 0x20, 0x00, 0x08, 0x00, 0x00, + 0x00, 0xf4, 0x13, 0x76, 0x27, 0xde, 0x70, 0x23, 0x08, 0x5f, 0xcc, 0x8f, + 0x15, 0xf9, 0x26, 0xde, 0xb0, 0x7b, 0x39, 0xaf, 0x12, 0x9c, 0x00, 0xe8, + 0xfd, 0xfd, 0xf2, 0xe2, 0xbb, 0x63, 0xe7, 0x79, 0x51, 0x55, 0x55, 0x76, + 0x24, 0xec, 0x3b, 0x9e, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xb8, 0x98, 0x01, 0x88, 0xbc, 0x59, 0xcd, 0xde, 0x6b, 0xf5, 0xd7, + 0x16, 0xa7, 0xb3, 0xee, 0x5a, 0xfd, 0x25, 0xc6, 0x6f, 0x8f, 0x95, 0xf1, + 0x98, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x01, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb9, 0x7c, 0x1f, 0xb3, 0x2f, 0xb4, 0xae, + 0x62, 0xea, 0xcb, 0xb7, 0x1d, 0x26, 0x6e, 0x58, 0xdb, 0x27, 0x3c, 0xe6, + 0xec, 0x1e, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x53, 0xa7, + 0x9d, 0x76, 0x9a, 0x9c, 0x7d, 0xf6, 0xd9, 0x86, 0x4c, 0xb4, 0x9d, 0x9d, + 0x9d, 0xd2, 0xde, 0xde, 0x2e, 0xc9, 0x64, 0xd2, 0xb0, 0x4e, 0x3c, 0x1e, + 0x97, 0x48, 0x24, 0x62, 0x28, 0x57, 0x55, 0x55, 0xe6, 0xcd, 0x9b, 0x67, + 0xf8, 0x4c, 0x55, 0x55, 0x79, 0xf5, 0xd5, 0x57, 0xe5, 0xc0, 0x81, 0x03, + 0x86, 0x75, 0xda, 0xda, 0xda, 0xe4, 0xd8, 0xb1, 0x63, 0x79, 0xf7, 0xb7, + 0xbb, 0xbb, 0x5b, 0xe6, 0xce, 0x9d, 0x2b, 0xe5, 0xe5, 0xe5, 0x86, 0x72, + 0x2f, 0x83, 0x5a, 0xba, 0xae, 0x4b, 0x4b, 0x4b, 0x8b, 0xe9, 0x98, 0x64, + 0xd3, 0xd1, 0xd1, 0x21, 0xcd, 0xcd, 0xcd, 0x86, 0xe0, 0xe8, 0xf1, 0x19, + 0x8e, 0x8b, 0x71, 0xca, 0x29, 0xa7, 0xc8, 0x39, 0xe7, 0x9c, 0x63, 0x68, + 0x83, 0x77, 0x9c, 0xba, 0x87, 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x13, + 0x3f, 0xdd, 0xc8, 0xd8, 0x39, 0x93, 0xa6, 0xd8, 0x75, 0xed, 0x9e, 0x11, + 0x63, 0x77, 0x7d, 0xf9, 0x26, 0xfc, 0x70, 0xa3, 0xcf, 0xdc, 0x0c, 0xa3, + 0xbf, 0xba, 0xec, 0xb2, 0xcb, 0x64, 0xf1, 0xe2, 0xc5, 0x96, 0xbe, 0x3f, + 0x1b, 0x36, 0x6c, 0x30, 0xcd, 0x10, 0x1c, 0x8f, 0xc7, 0xe5, 0xa7, 0x3f, + 0xfd, 0xa9, 0xe9, 0x3a, 0xfb, 0xf6, 0xed, 0x93, 0x37, 0xde, 0x78, 0xc3, + 0x50, 0xfe, 0x95, 0xaf, 0x7c, 0xc5, 0x52, 0x7f, 0x67, 0xcd, 0x9a, 0x65, + 0x5a, 0x8f, 0xd7, 0x5a, 0x5a, 0x5a, 0xa4, 0xa6, 0xa6, 0x26, 0xef, 0xe5, + 0x75, 0x5d, 0x97, 0xd9, 0xb3, 0x67, 0x3b, 0xfe, 0xf7, 0xe8, 0xd2, 0x4b, + 0x2f, 0x95, 0x47, 0x1f, 0x7d, 0x94, 0x03, 0xdd, 0x43, 0x04, 0x00, 0x01, + 0x00, 0x81, 0xbf, 0x09, 0x2e, 0xf4, 0x86, 0x2c, 0xd7, 0x36, 0x14, 0x7a, + 0x63, 0x18, 0x84, 0x71, 0x09, 0xfa, 0x31, 0x01, 0x00, 0x00, 0xfc, 0x45, + 0x55, 0x55, 0xc3, 0xcc, 0xc0, 0x20, 0x5e, 0x2b, 0x71, 0x6f, 0x00, 0x47, + 0xbf, 0x47, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x5c, + 0xcc, 0x00, 0xf4, 0x01, 0xbf, 0x45, 0xc2, 0x9d, 0xfe, 0x25, 0xc3, 0x6f, + 0xd9, 0x7b, 0xbd, 0xea, 0x8f, 0x5d, 0xf5, 0xdb, 0x55, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x26, 0x66, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x40, 0x4c, 0x0a, 0x00, 0xd0, 0x83, 0x19, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x37, 0xd6, 0xbd, 0x14, 0x93, 0x14, 0xc3, 0x6c, 0xdd, 0x7c, 0xeb, + 0xcb, 0xf7, 0xc9, 0x98, 0x7c, 0x97, 0x33, 0x6b, 0xa3, 0x98, 0xed, 0xc8, + 0xb7, 0xbe, 0x7c, 0xc7, 0x20, 0xdf, 0x3e, 0xf3, 0xee, 0x2c, 0x14, 0x42, + 0x55, 0x55, 0x99, 0x30, 0x61, 0x42, 0xd1, 0x19, 0x69, 0x3b, 0x3b, 0x3b, + 0x5d, 0xc9, 0x6a, 0xdb, 0x73, 0x9c, 0x1f, 0xff, 0xae, 0x3f, 0x55, 0x55, + 0xa5, 0xbc, 0xbc, 0x5c, 0x4e, 0x38, 0xe1, 0x84, 0x5e, 0xe5, 0xad, 0xad, + 0xad, 0x39, 0xbf, 0xcf, 0xe9, 0x74, 0xda, 0xf0, 0xb9, 0xaa, 0xaa, 0x59, + 0xbf, 0x4f, 0xe3, 0xc6, 0x8d, 0x93, 0x58, 0x2c, 0x96, 0x77, 0x7f, 0x8f, + 0xcf, 0xfe, 0x9b, 0xef, 0x36, 0xea, 0xba, 0x6e, 0xda, 0xaf, 0xf2, 0xf2, + 0x72, 0x39, 0xf1, 0xc4, 0x13, 0x7b, 0x95, 0xef, 0xd9, 0xb3, 0x47, 0x74, + 0x5d, 0xb7, 0xf4, 0xfe, 0x43, 0x5d, 0xd7, 0xa5, 0xac, 0xac, 0x4c, 0xc6, + 0x8e, 0x1d, 0x6b, 0xf8, 0xec, 0xa3, 0x8f, 0x3e, 0x32, 0x5d, 0x67, 0xd4, + 0xa8, 0x51, 0x52, 0x59, 0x59, 0x69, 0x7a, 0x3e, 0xfa, 0xf0, 0xc3, 0x0f, + 0x4d, 0xd7, 0x99, 0x38, 0x71, 0xa2, 0x84, 0x42, 0xc6, 0x90, 0x52, 0x73, + 0x73, 0xb3, 0xec, 0xdb, 0xb7, 0x8f, 0x2f, 0xa0, 0x0f, 0x11, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0xa6, 0x4f, 0x9f, 0x2e, 0x9b, 0x36, + 0x6d, 0xb2, 0xa5, 0x2e, 0x37, 0x02, 0x80, 0xcf, 0x3c, 0xf3, 0x8c, 0xbc, + 0xf9, 0xe6, 0x9b, 0x86, 0x00, 0xdd, 0xfe, 0xfd, 0xfb, 0xa5, 0xa5, 0xa5, + 0x45, 0x52, 0xa9, 0x94, 0x61, 0x1d, 0x4d, 0xd3, 0x4c, 0xeb, 0x6a, 0x6f, + 0x6f, 0x97, 0x09, 0x13, 0x26, 0xc8, 0xc0, 0x81, 0x03, 0x0d, 0xdb, 0xb1, + 0x65, 0xcb, 0x16, 0xd3, 0x75, 0x5e, 0x79, 0xe5, 0x15, 0x99, 0x38, 0x71, + 0x62, 0xde, 0xfd, 0x2d, 0xe4, 0x47, 0xa0, 0x0f, 0x3f, 0xfc, 0x50, 0xae, + 0xb8, 0xe2, 0x0a, 0x43, 0xf0, 0x70, 0xd3, 0xa6, 0x4d, 0xa2, 0xeb, 0xba, + 0xa4, 0xd3, 0xe9, 0x5e, 0xe5, 0xa1, 0x50, 0x48, 0x7e, 0xf8, 0xc3, 0x1f, + 0xca, 0xea, 0xd5, 0xab, 0xf3, 0x6e, 0x63, 0xc6, 0x8c, 0x19, 0xd2, 0xd1, + 0xd1, 0x61, 0x18, 0x2f, 0x4d, 0xd3, 0x4c, 0xf7, 0xa3, 0xaa, 0xaa, 0xb2, + 0x7c, 0xf9, 0x72, 0x99, 0x39, 0x73, 0xa6, 0x61, 0xec, 0x43, 0xa1, 0x90, + 0xe9, 0x76, 0x86, 0x42, 0x21, 0xf9, 0xed, 0x6f, 0x7f, 0x6b, 0xc8, 0x36, + 0xac, 0x28, 0x8a, 0xac, 0x5b, 0xb7, 0x4e, 0x2e, 0xb9, 0xe4, 0x12, 0xbe, + 0x80, 0x3e, 0x44, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x51, + 0x55, 0xd5, 0x95, 0xc0, 0x9d, 0x5d, 0x9a, 0x9a, 0x9a, 0xa4, 0xa9, 0xa9, + 0x29, 0xeb, 0xe7, 0x66, 0xb3, 0xcd, 0xb2, 0xc9, 0x64, 0x32, 0xb2, 0x7f, + 0xff, 0x7e, 0xf9, 0xf4, 0xd3, 0x4f, 0xf3, 0x5e, 0x47, 0xd3, 0x34, 0x4b, + 0x6d, 0x14, 0x42, 0xd7, 0x75, 0xf9, 0xf8, 0xe3, 0x8f, 0x4d, 0xf7, 0x95, + 0xa2, 0x28, 0xa6, 0xed, 0x27, 0x93, 0x49, 0x4b, 0x81, 0xdc, 0xb3, 0xce, + 0x3a, 0xcb, 0xf2, 0x78, 0x69, 0x9a, 0x96, 0x35, 0x98, 0x6a, 0x75, 0xbc, + 0xac, 0xd6, 0x03, 0xf7, 0x10, 0x00, 0x04, 0x00, 0x14, 0xac, 0x3f, 0xbf, + 0x57, 0x26, 0xd7, 0xe3, 0x58, 0xb9, 0xc6, 0xc5, 0x89, 0xf5, 0xdc, 0xde, + 0x3e, 0x27, 0x8e, 0x17, 0x1e, 0x6f, 0x03, 0x00, 0x00, 0x00, 0x9c, 0x43, + 0x00, 0x90, 0x1b, 0xe5, 0xa2, 0x6f, 0x06, 0xb3, 0x6d, 0x97, 0x57, 0xd9, + 0x6f, 0xad, 0x8e, 0xbf, 0x57, 0x37, 0x9d, 0x5e, 0x1d, 0x0f, 0xdc, 0x64, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xbf, 0x10, 0x00, 0x04, 0x00, 0x00, + 0x00, 0xfa, 0xe0, 0xf7, 0x1f, 0xd0, 0xdc, 0xe8, 0x9f, 0xdd, 0x6d, 0xd0, + 0xe7, 0xd2, 0x3c, 0xd6, 0x00, 0x00, 0xa5, 0x89, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x25, 0x2a, 0x28, 0x41, 0x63, 0x55, 0x55, 0x4d, 0xb3, + 0xf0, 0x5a, 0xc9, 0x80, 0x9b, 0x8f, 0xb2, 0xb2, 0x32, 0x4f, 0x9f, 0xce, + 0x33, 0x6b, 0xbf, 0xaf, 0x77, 0x35, 0xc6, 0xe3, 0x71, 0x43, 0x59, 0x32, + 0x99, 0x94, 0x64, 0x32, 0xe9, 0xcb, 0x7d, 0x19, 0x8d, 0x46, 0x7b, 0xbd, + 0x0b, 0x50, 0x51, 0x94, 0x7e, 0xfd, 0xea, 0x20, 0xbf, 0x20, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x89, 0xba, 0xff, 0xfe, 0xfb, 0x4d, 0x03, + 0x44, 0x6e, 0x50, 0x14, 0xc5, 0xb6, 0x00, 0xdd, 0x5d, 0x77, 0xdd, 0x25, + 0x0f, 0x3c, 0xf0, 0x80, 0x21, 0x13, 0xae, 0xdd, 0x01, 0xce, 0x8f, 0x3f, + 0xfe, 0xd8, 0x10, 0x68, 0x54, 0x14, 0x45, 0xde, 0x7a, 0xeb, 0x2d, 0x59, + 0xb2, 0x64, 0x89, 0x63, 0x63, 0x95, 0xc9, 0x64, 0x64, 0xfa, 0xf4, 0xe9, + 0xf2, 0xe9, 0xa7, 0x9f, 0x9a, 0x66, 0xdb, 0xbd, 0xe5, 0x96, 0x5b, 0x24, + 0x12, 0x89, 0xf4, 0x2a, 0x4f, 0x24, 0x12, 0xb2, 0x68, 0xd1, 0x22, 0x59, + 0xb8, 0x70, 0xa1, 0xa1, 0xbe, 0xf7, 0xde, 0x7b, 0x4f, 0x66, 0xcd, 0x9a, + 0x65, 0x28, 0xff, 0xcd, 0x6f, 0x7e, 0x23, 0x77, 0xdc, 0x71, 0x87, 0xa1, + 0x8d, 0x6c, 0x01, 0x38, 0x5d, 0xd7, 0xe5, 0x27, 0x3f, 0xf9, 0x89, 0xbc, + 0xf6, 0xda, 0x6b, 0x86, 0xcf, 0xb2, 0x05, 0x26, 0xd3, 0xe9, 0xb4, 0xdc, + 0x7b, 0xef, 0xbd, 0x86, 0x71, 0xcc, 0x64, 0x32, 0x72, 0xf9, 0xe5, 0x97, + 0xcb, 0xfe, 0xfd, 0xfb, 0x0d, 0xeb, 0x90, 0x1c, 0xc4, 0x7b, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0xcf, 0x3d, 0xf7, 0x5c, 0x20, + 0xb6, 0x23, 0x16, 0x8b, 0x49, 0x55, 0x55, 0x95, 0xe3, 0xed, 0xd4, 0xd6, + 0xd6, 0x9a, 0xce, 0x34, 0x6c, 0x6f, 0x6f, 0x97, 0xa7, 0x9f, 0x7e, 0xda, + 0xd1, 0xb6, 0xcf, 0x3a, 0xeb, 0x2c, 0xa9, 0xa9, 0xa9, 0x31, 0xfd, 0x6c, + 0xd9, 0xb2, 0x65, 0xa6, 0xe5, 0x3f, 0xfc, 0xe1, 0x0f, 0xa5, 0xb6, 0xb6, + 0xd6, 0x50, 0x5e, 0x59, 0x59, 0x69, 0xba, 0xfc, 0xd6, 0xad, 0x5b, 0x65, + 0xeb, 0xd6, 0xad, 0x96, 0xfa, 0xf5, 0xcb, 0x5f, 0xfe, 0xd2, 0xd2, 0xf2, + 0x99, 0x4c, 0x46, 0x56, 0xac, 0x58, 0x61, 0x28, 0x57, 0x14, 0x45, 0x66, + 0xcf, 0x9e, 0x6d, 0xda, 0x5f, 0x78, 0x4f, 0x65, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9c, 0x53, 0xc8, 0x23, 0xb0, 0x7d, 0x3d, 0x1a, 0x1c, + 0x84, 0x6d, 0x84, 0x7b, 0x98, 0x01, 0xe8, 0x80, 0x52, 0x7f, 0x07, 0x83, + 0xd5, 0xfe, 0xdb, 0xb5, 0xbd, 0x4e, 0x8f, 0x5b, 0xa9, 0xf4, 0x93, 0xe3, + 0x10, 0x1c, 0x4b, 0xa5, 0xbf, 0x7d, 0x85, 0xd6, 0xe9, 0xa7, 0xbe, 0x04, + 0x7d, 0xac, 0x01, 0x00, 0x00, 0x80, 0xfe, 0x84, 0x19, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0xe2, 0x47, 0x4b, 0x78, 0x8d, 0x19, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfd, 0xe6, 0x3d, 0x14, 0x92, 0x50, + 0xa8, 0x34, 0x6e, 0xe1, 0x8f, 0x4f, 0xe4, 0x61, 0xb6, 0x2d, 0x5f, 0x0c, + 0x88, 0x39, 0x11, 0x1c, 0x3b, 0xbe, 0x8d, 0x7c, 0xda, 0xf1, 0x72, 0x7c, + 0x55, 0x55, 0x35, 0x3c, 0xf2, 0xdb, 0xd7, 0x23, 0xb5, 0x66, 0xeb, 0x78, + 0xa9, 0xd4, 0x1e, 0x59, 0xee, 0x77, 0xe7, 0x10, 0x86, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xfb, 0xf1, 0x8f, 0x7f, 0x5c, 0x32, 0x7d, 0x4d, + 0xa5, 0x52, 0x12, 0x0e, 0x87, 0x4d, 0x3f, 0x1b, 0x3e, 0x7c, 0xb8, 0x3c, + 0xf3, 0xcc, 0x33, 0x86, 0xf2, 0x61, 0xc3, 0x86, 0xd9, 0xd6, 0x7e, 0x38, + 0x1c, 0x96, 0xa7, 0x9f, 0x7e, 0xda, 0x90, 0x79, 0xb6, 0xbb, 0xbb, 0x3b, + 0x6b, 0x90, 0x6a, 0xc2, 0x84, 0x09, 0x8e, 0x66, 0x01, 0x16, 0x11, 0x19, + 0x3b, 0x76, 0x6c, 0xd6, 0xcf, 0x9e, 0x79, 0xe6, 0x19, 0x43, 0x7f, 0x93, + 0xc9, 0xa4, 0x69, 0xc2, 0x12, 0x11, 0x91, 0x41, 0x83, 0x06, 0x65, 0x4d, + 0x1c, 0xe2, 0xa5, 0xa1, 0x43, 0x87, 0xf2, 0x65, 0xf5, 0x29, 0x65, 0xc7, + 0xae, 0xbd, 0xcc, 0x43, 0xcd, 0x61, 0xfc, 0x89, 0x23, 0x19, 0x04, 0x20, + 0x8b, 0x9d, 0xbb, 0xf7, 0x31, 0x08, 0x9c, 0xd7, 0x00, 0xce, 0x6b, 0xe0, + 0xbc, 0x07, 0x70, 0xde, 0x83, 0x4d, 0x06, 0x54, 0xc4, 0x65, 0xc8, 0xa0, + 0x3a, 0x06, 0x02, 0x10, 0x91, 0x83, 0x47, 0x8e, 0x4a, 0x6b, 0x5b, 0x07, + 0x03, 0x61, 0x13, 0xe6, 0x67, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, + 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8c, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7e, 0xb8, 0x41, 0x57, 0x14, 0x06, 0x01, 0xe0, + 0xfb, 0xe0, 0x88, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf7, + 0x9a, 0x5b, 0xdb, 0xa5, 0xb9, 0xb5, 0x9d, 0x81, 0x00, 0x60, 0x3b, 0x66, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x65, 0xc7, 0xae, 0xbd, + 0x19, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x26, 0x66, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x60, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, + 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x60, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x60, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x23, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x23, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x01, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x30, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x80, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x8c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x04, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xfb, 0xff, 0x01, + 0xc1, 0xf4, 0x73, 0xb3, 0xaa, 0xc0, 0x6d, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0x00 +}; + +uint32_t about_png_size = 82028; + diff --git a/yabause/src/about.h b/yabause/src/about.h new file mode 100644 index 0000000000..61eae98fb1 --- /dev/null +++ b/yabause/src/about.h @@ -0,0 +1,9 @@ +/* Autogenerated by bin2c */ + +#pragma once +#include + +extern "C" { + extern uint8_t about_png[]; + extern uint32_t about_png_size; +} diff --git a/yabause/src/android/.gitignore b/yabause/src/android/.gitignore new file mode 100644 index 0000000000..4216b17336 --- /dev/null +++ b/yabause/src/android/.gitignore @@ -0,0 +1,5 @@ +/.gradle/ +/local.properties +/.idea +.DS_Store +*.iml \ No newline at end of file diff --git a/yabause/src/android/AndroidManifest.xml.in b/yabause/src/android/AndroidManifest.xml.in deleted file mode 100644 index be3cc19caf..0000000000 --- a/yabause/src/android/AndroidManifest.xml.in +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/yabause/src/android/AndroidNdkGdb.cmake b/yabause/src/android/AndroidNdkGdb.cmake new file mode 100644 index 0000000000..0677dcda91 --- /dev/null +++ b/yabause/src/android/AndroidNdkGdb.cmake @@ -0,0 +1,96 @@ +# Copyright (c) 2014, Pavel Rojtberg +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# ------------------------------------------------------------------------------ +# Usage: +# 1. place AndroidNdkGdb.cmake somewhere inside ${CMAKE_MODULE_PATH} +# 2. inside your project add +# +# include(AndroidNdkGdb) +# android_ndk_gdb_enable() +# # for each target +# add_library(MyLibrary ...) +# android_ndk_gdb_debuggable(MyLibrary) + + +# add gdbserver and general gdb configuration to project +# also create a mininal NDK skeleton so ndk-gdb finds the paths +# +# the optional parameter defines the path to the android project. +# uses PROJECT_SOURCE_DIR by default. +macro(android_ndk_gdb_enable) + if(ANDROID) + # create custom target that depends on the real target so it gets executed afterwards + add_custom_target(NDK_GDB ALL) + + if(${ARGC}) + set(ANDROID_PROJECT_DIR ${ARGV0}) + else() + set(ANDROID_PROJECT_DIR ${PROJECT_SOURCE_DIR}) + endif() + + set(NDK_GDB_SOLIB_PATH ${ANDROID_PROJECT_DIR}/obj/local/${ANDROID_NDK_ABI_NAME}/) + file(MAKE_DIRECTORY ${NDK_GDB_SOLIB_PATH}) + + # 1. generate essential Android Makefiles + file(MAKE_DIRECTORY ${ANDROID_PROJECT_DIR}/jni) + if(NOT EXISTS ${ANDROID_PROJECT_DIR}/jni/Android.mk) + file(WRITE ${ANDROID_PROJECT_DIR}/jni/Android.mk "APP_ABI := ${ANDROID_NDK_ABI_NAME}\n") + endif() + if(NOT EXISTS ${ANDROID_PROJECT_DIR}/jni/Application.mk) + file(WRITE ${ANDROID_PROJECT_DIR}/jni/Application.mk "APP_ABI := ${ANDROID_NDK_ABI_NAME}\n") + endif() + + # 2. generate gdb.setup + get_directory_property(PROJECT_INCLUDES DIRECTORY ${PROJECT_SOURCE_DIR} INCLUDE_DIRECTORIES) + string(REGEX REPLACE ";" " " PROJECT_INCLUDES "${PROJECT_INCLUDES}") + file(WRITE ${LIBRARY_OUTPUT_PATH}/gdb.setup "set solib-search-path ${NDK_GDB_SOLIB_PATH}\n") + file(APPEND ${LIBRARY_OUTPUT_PATH}/gdb.setup "directory ${PROJECT_INCLUDES}\n") + + # 3. copy gdbserver executable + file(COPY ${ANDROID_NDK}/prebuilt/android-${ANDROID_ARCH_NAME}/gdbserver/gdbserver DESTINATION ${LIBRARY_OUTPUT_PATH}) + endif() +endmacro() + +# register a target for remote debugging +# copies the debug version to NDK_GDB_SOLIB_PATH then strips symbols of original +macro(android_ndk_gdb_debuggable TARGET_NAME) + if(ANDROID) + get_property(TARGET_LOCATION TARGET ${TARGET_NAME} PROPERTY LOCATION) + + # create custom target that depends on the real target so it gets executed afterwards + add_dependencies(NDK_GDB ${TARGET_NAME}) + + # 4. copy lib to obj + add_custom_command(TARGET NDK_GDB POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TARGET_LOCATION} ${NDK_GDB_SOLIB_PATH}) + + # 5. strip symbols + add_custom_command(TARGET NDK_GDB POST_BUILD COMMAND ${CMAKE_STRIP} ${TARGET_LOCATION}) + endif() +endmacro() diff --git a/yabause/src/android/AndroidNdkModules.cmake b/yabause/src/android/AndroidNdkModules.cmake new file mode 100644 index 0000000000..64f37fdee2 --- /dev/null +++ b/yabause/src/android/AndroidNdkModules.cmake @@ -0,0 +1,58 @@ +# Copyright (c) 2014, Pavel Rojtberg +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +macro(android_ndk_import_module_cpufeatures) + if(ANDROID) + include_directories(${ANDROID_NDK}/sources/android/cpufeatures) + add_library(cpufeatures ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) + target_link_libraries(cpufeatures dl) + endif() +endmacro() + +macro(android_ndk_import_module_native_app_glue) + if(ANDROID) + include_directories(${ANDROID_NDK}/sources/android/native_app_glue) + add_library(native_app_glue ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c) + target_link_libraries(native_app_glue log) + endif() +endmacro() + +macro(android_ndk_import_module_ndk_helper) + if(ANDROID) + android_ndk_import_module_cpufeatures() + android_ndk_import_module_native_app_glue() + + include_directories(${ANDROID_NDK}/sources/android/ndk_helper) + file(GLOB _NDK_HELPER_SRCS ${ANDROID_NDK}/sources/android/ndk_helper/*.cpp ${ANDROID_NDK}/sources/android/ndk_helper/gl3stub.c) + add_library(ndk_helper ${_NDK_HELPER_SRCS}) + target_link_libraries(ndk_helper log android EGL GLESv2 cpufeatures native_app_glue) + + unset(_NDK_HELPER_SRCS) + endif() +endmacro() \ No newline at end of file diff --git a/yabause/src/android/CMakeLists.txt b/yabause/src/android/CMakeLists.txt index de52f9fecb..f4f866d835 100644 --- a/yabause/src/android/CMakeLists.txt +++ b/yabause/src/android/CMakeLists.txt @@ -1,187 +1,102 @@ -find_program(NDK_BUILD ndk-build) - -if(NOT NDK_BUILD) - message(FATAL_ERROR "ndk build not found, bye") -endif() - -find_program(SDK_ANDROID android) - -if(NOT SDK_ANDROID) - message(FATAL_ERROR "sdk android tool not found, bye") -endif() - -find_program(ANT NAMES ant ant.bat) - -if(NOT ANT) - message(FATAL_ERROR "ant not found, bye") -endif() +#---------------------------------------------------------------------------------------- +# Android build. +#---------------------------------------------------------------------------------------- +# How to build on Windows host. +# Requirements: +# 1) android-ndk-r10d or above. +# 2) ninja (https://github.com/martine/ninja) +# 3) Visual C++ ( for c68k code generation ) +# Build step: +# 1) edit ANDROID_NDK PATH on "yabause/src/android/CMakeLists.txt" +# 2) cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=yabause/src/android/androidtoolchain.cmake +# 3) edit settings listed below +# ANDROID_ABI armeabi-v7a with NEON +# ANDROID_NATIVE_API_LEVEL 21 +# YAB_PORTS android +# YAB_WANT_ARM7 checked +# 4) "Configure" and "Generate" +# 5) exec command prompt and exec "vcvarsall.bat x86" for building using cl.exe +# 6) exec eclipse and import "yabause/src/android" +#---------------------------------------------------------------------------------------- + +set(ENV{ANDROID_NDK} "C:/NVPACK/android-ndk-r10e") + +project(yabause-android) + +yab_port_start() + +#if( YAB_WANT_VULKAN ) +# set( LIBRARY_NAME yabause_native_vulkan ) +#else() + set( LIBRARY_NAME yabause_native ) +#endif() + +include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_libpng.cmake ) +#include( ${CMAKE_SOURCE_DIR}/CMake/Packages/external_zlib.cmake ) + +set( SOURCES + jni/SndOboe.h + jni/SndOboe.cpp + jni/yui.cpp + #jni/sndaudiotrack.c + jni/sndopensl.c + jni/jniBackupManager.cpp + jni/jniBackupManager.h + jni/jsoncpp.cpp + jni/ChdFileInfo.cpp + jni/ChdFileInfo.h +) -if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) - set(yabause_android_SHADOW - build.xml - project.properties - jni/yui.c - jni/miniegl.h - jni/sndaudiotrack.c - jni/sndaudiotrack.h - jni/sndopensl.c - jni/sndopensl.h - src/org/yabause/android/Cartridge.java - src/org/yabause/android/GameInfo.java - src/org/yabause/android/GameInfoManager.java - src/org/yabause/android/GameList.java - src/org/yabause/android/GameListAdapter.java - src/org/yabause/android/Home.java - src/org/yabause/android/PadEvent.java - src/org/yabause/android/PadManager.java - src/org/yabause/android/PadManagerV8.java - src/org/yabause/android/PadManagerV16.java - src/org/yabause/android/SaveList.java - src/org/yabause/android/SaveListAdapter.java - src/org/yabause/android/SaveListModeListener.java - src/org/yabause/android/Yabause.java - src/org/yabause/android/YabauseAudio.java - src/org/yabause/android/YabauseView.java - src/org/yabause/android/YabausePad.java - src/org/yabause/android/YabauseSettings.java - src/org/yabause/android/YabauseStorage.java - res/drawable-hdpi/icon.png - res/drawable-ldpi/icon.png - res/drawable-mdpi/icon.png - res/drawable-xhdpi/banner.png - res/layout/game_item.xml - res/layout/home.xml - res/layout/main.xml - res/layout/save_item.xml - res/layout-v11/save_item.xml - res/layout/save_list.xml - res/menu/save_list.xml - res/values/strings.xml - res/xml/preferences.xml - ) - - foreach(item IN LISTS yabause_android_SHADOW) - message(STATUS ${item}) - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}" - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}" - ) - endforeach() -endif() +set (OBOE_DIR ./oboe) +add_subdirectory (${OBOE_DIR} ./oboe) +include_directories (${OBOE_DIR}/include) -set(YABAUSE_JNI_SRC "sndaudiotrack.c") -if (YAB_WANT_OPENSL) - set(YABAUSE_JNI_SRC "${YABAUSE_JNI_SRC} sndopensl.c") - set(YABAUSE_JNI_LIB "-lOpenSLES") -endif() -if (YAB_USE_SSF) - set(YABAUSE_JNI_LIB "${YABAUSE_JNI_LIB} -lz") +if( YAB_WANT_VULKAN ) +set( SOURCES ${SOURCES} ../vulkan/Window_android.cpp ) endif() -set(YABAUSE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/jni/Android.mk.in - ${CMAKE_CURRENT_BINARY_DIR}/jni/Android.mk - @ONLY +set (PORT_LIBRARIES + log + jnigraphics + OpenSLES + android + GLESv3 + EGL + c++_static ) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.in - ${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml - @ONLY -) +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DJSONCPP_NO_LOCALE_SUPPORT -fexceptions " ) -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/local.properties" - COMMAND ${SDK_ANDROID} update project -p "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS - "${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml" - "${CMAKE_CURRENT_BINARY_DIR}/build.xml" - "${CMAKE_CURRENT_BINARY_DIR}/project.properties" - "${CMAKE_CURRENT_BINARY_DIR}/jni/Android.mk" -) -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/jni/libyabause.a" - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/../libyabause.a ${CMAKE_CURRENT_BINARY_DIR}/jni/libyabause.a - DEPENDS yabause "${CMAKE_CURRENT_BINARY_DIR}/../config.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/local.properties" -) +set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/app/src/main/jniLibs/${ANDROID_NDK_ABI_NAME} ) +#set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) +#include(AndroidNdkGdb) +#android_ndk_gdb_enable() -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libs/armeabi/libyabause.so" - COMMAND "${NDK_BUILD}" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/libyabause.a" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/yui.c" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/miniegl.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/sndaudiotrack.c" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/sndaudiotrack.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/sndopensl.c" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/jni/sndopensl.h" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) +link_directories( ${LIBCHDR_LIB_DIR} ${LIBPNG_LIB_DIR} ${LIBZ_LIB_DIR} ${SHADERC_LIBRARY_DIR} ${link_directories}) -set(yabause_android_RES - "${CMAKE_CURRENT_BINARY_DIR}/res/drawable-hdpi/icon.png" - "${CMAKE_CURRENT_BINARY_DIR}/res/drawable-ldpi/icon.png" - "${CMAKE_CURRENT_BINARY_DIR}/res/drawable-mdpi/icon.png" - "${CMAKE_CURRENT_BINARY_DIR}/res/drawable-xhdpi/banner.png" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout/game_item.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout/home.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout/main.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout/save_item.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout-v11/save_item.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/layout/save_list.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/menu/save_list.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/values/strings.xml" - "${CMAKE_CURRENT_BINARY_DIR}/res/xml/preferences.xml" -) -set(yabause_android_SRC - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/Cartridge.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/GameInfo.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/GameInfoManager.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/GameList.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/GameListAdapter.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/Home.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/PadEvent.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/PadManager.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/PadManagerV8.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/PadManagerV16.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/SaveList.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/SaveListAdapter.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/SaveListModeListener.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/Yabause.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/YabauseAudio.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/YabauseView.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/YabausePad.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/YabauseSettings.java" - "${CMAKE_CURRENT_BINARY_DIR}/src/org/yabause/android/YabauseStorage.java" -) +add_library(${LIBRARY_NAME} SHARED ${SOURCES} ) +#android_ndk_gdb_debuggable(${LIBRARY_NAME}) -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/bin/Yabause-debug.apk" - COMMAND "${ANT}" ARGS "debug" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libs/armeabi/libyabause.so" - DEPENDS ${yabause_android_SRC} - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml" - DEPENDS ${yabause_android_RES} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +include_directories( + ${YABAUSE_INCLUDE_DIR} + ${PROJECT_BINARY_DIR}/../ + ${PROJECT_SOURCE_DIR}/../ + ${png_INCLUDE_DIR} ) - -add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/bin/Yabause-release-unsigned.apk" - COMMAND "${ANT}" ARGS "release" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libs/armeabi/libyabause.so" - DEPENDS ${yabause_android_SRC} - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml" - DEPENDS ${yabause_android_RES} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +target_link_libraries(${LIBRARY_NAME} yabause ${YABAUSE_LIBRARIES} + ${PORT_LIBRARIES} + ${LIBCHDR_LIBRARIES} + png16 + ${ZLIB_LIBRARY_RELEASE} + ${VULKAN_LIBRARIES} + oboe + #${zlib_STATIC_LIBRARIES} + # ${PROJECT_SOURCE_DIR}/debuglib/libNvidia_gfx_debugger_stub.a ) + +add_dependencies(${LIBRARY_NAME} libchdr) +add_dependencies(${LIBRARY_NAME} png) + -if(CMAKE_BUILD_TYPE STREQUAL "Release") - add_custom_target(yabause-android ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/bin/Yabause-release-unsigned.apk") -else() - add_custom_target(yabause-android ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/bin/Yabause-debug.apk") -endif() diff --git a/yabause/src/android/android-windows.cmake b/yabause/src/android/android-windows.cmake deleted file mode 100644 index 1b9e63defa..0000000000 --- a/yabause/src/android/android-windows.cmake +++ /dev/null @@ -1,17 +0,0 @@ -SET(CMAKE_SYSTEM_NAME Linux) -SET(CMAKE_SYSTEM_VERSION 1) - -SET(CMAKE_C_COMPILER "C:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-gcc.exe") -SET(CMAKE_CXX_COMPILER "C:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-g++.exe") -SET(CMAKE_ASM-ATT_COMPILER "C:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-as.exe") - -SET(CMAKE_FIND_ROOT_PATH "C:/android-ndk-r8e/platforms/android-8/arch-arm/usr") - -set(CMAKE_C_FLAGS "--sysroot=C:/android-ndk-r8e/platforms/android-8/arch-arm" CACHE STRING "GCC flags" FORCE) -set(CMAKE_CXX_FLAGS "--sysroot=C:/android-ndk-r8e/platforms/android-8/arch-arm" CACHE STRING "G++ flags" FORCE) - -SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -SET(ANDROID ON) diff --git a/yabause/src/android/android.cmake b/yabause/src/android/android.cmake deleted file mode 100644 index a1a49536ce..0000000000 --- a/yabause/src/android/android.cmake +++ /dev/null @@ -1,14 +0,0 @@ -SET(CMAKE_SYSTEM_NAME Linux) -SET(CMAKE_SYSTEM_VERSION 1) - -SET(CMAKE_C_COMPILER arm-linux-androideabi-gcc) -SET(CMAKE_CXX_COMPILER arm-linux-androideabi-g++) -SET(CMAKE_ASM-ATT_COMPILER arm-linux-androideabi-as) - -SET(CMAKE_FIND_ROOT_PATH /home/guillaume/projects/android/toolchains/android-18/sysroot/usr/) - -SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -SET(ANDROID ON) diff --git a/yabause/src/android/android.toolchain.cmake b/yabause/src/android/android.toolchain.cmake new file mode 100644 index 0000000000..366778d0df --- /dev/null +++ b/yabause/src/android/android.toolchain.cmake @@ -0,0 +1,1699 @@ +# Copyright (c) 2010-2011, Ethan Rublee +# Copyright (c) 2011-2014, Andrey Kamaev +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# ------------------------------------------------------------------------------ +# Android CMake toolchain file, for use with the Android NDK r5-r10d +# Requires cmake 2.6.3 or newer (2.8.9 or newer is recommended). +# See home page: https://github.com/taka-no-me/android-cmake +# +# Usage Linux: +# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk +# $ mkdir build && cd build +# $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake .. +# $ make -j8 +# +# Usage Windows: +# You need native port of make to build your project. +# Android NDK r7 (and newer) already has make.exe on board. +# For older NDK you have to install it separately. +# For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm +# +# $ SET ANDROID_NDK=C:\absolute\path\to\the\android-ndk +# $ mkdir build && cd build +# $ cmake.exe -G"MinGW Makefiles" +# -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake +# -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" .. +# $ cmake.exe --build . +# +# +# Options (can be set as cmake parameters: -D=): +# ANDROID_NDK=/opt/android-ndk - path to the NDK root. +# Can be set as environment variable. Can be set only at first cmake run. +# +# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary +# Interface (ABI). This option nearly matches to the APP_ABI variable +# used by ndk-build tool from Android NDK. +# +# Possible targets are: +# "armeabi" - ARMv5TE based CPU with software floating point operations +# "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions +# this ABI target is used by default +# "armeabi-v7a with NEON" - same as armeabi-v7a, but +# sets NEON as floating-point unit +# "armeabi-v7a with VFPV3" - same as armeabi-v7a, but +# sets VFPV3 as floating-point unit (has 32 registers instead of 16) +# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP +# "x86" - IA-32 instruction set +# "mips" - MIPS32 instruction set +# +# 64-bit ABIs for NDK r10 and newer: +# "arm64-v8a" - ARMv8 AArch64 instruction set +# "x86_64" - Intel64 instruction set (r1) +# "mips64" - MIPS64 instruction set (r6) +# +# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for. +# Option is read-only when standalone toolchain is used. +# Note: building for "android-L" requires explicit configuration. +# +# ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 - the name of compiler +# toolchain to be used. The list of possible values depends on the NDK +# version. For NDK r10c the possible values are: +# +# * aarch64-linux-android-4.9 +# * aarch64-linux-android-clang3.4 +# * aarch64-linux-android-clang3.5 +# * arm-linux-androideabi-4.6 +# * arm-linux-androideabi-4.8 +# * arm-linux-androideabi-4.9 (default) +# * arm-linux-androideabi-clang3.4 +# * arm-linux-androideabi-clang3.5 +# * mips64el-linux-android-4.9 +# * mips64el-linux-android-clang3.4 +# * mips64el-linux-android-clang3.5 +# * mipsel-linux-android-4.6 +# * mipsel-linux-android-4.8 +# * mipsel-linux-android-4.9 +# * mipsel-linux-android-clang3.4 +# * mipsel-linux-android-clang3.5 +# * x86-4.6 +# * x86-4.8 +# * x86-4.9 +# * x86-clang3.4 +# * x86-clang3.5 +# * x86_64-4.9 +# * x86_64-clang3.4 +# * x86_64-clang3.5 +# +# ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions +# instead of Thumb. Is not available for "armeabi-v6 with VFP" +# (is forced to be ON) ABI. +# +# ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker +# errors even if they are not used. +# +# ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared +# libraries. Automatically turned for NDK r5x and r6x due to GLESv2 +# problems. +# +# ANDROID_STL=gnustl_static - specify the runtime to use. +# +# Possible values are: +# none -> Do not configure the runtime. +# system -> Use the default minimal system C++ runtime library. +# Implies -fno-rtti -fno-exceptions. +# Is not available for standalone toolchain. +# system_re -> Use the default minimal system C++ runtime library. +# Implies -frtti -fexceptions. +# Is not available for standalone toolchain. +# gabi++_static -> Use the GAbi++ runtime as a static library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7 and newer. +# Is not available for standalone toolchain. +# gabi++_shared -> Use the GAbi++ runtime as a shared library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7 and newer. +# Is not available for standalone toolchain. +# stlport_static -> Use the STLport runtime as a static library. +# Implies -fno-rtti -fno-exceptions for NDK before r7. +# Implies -frtti -fno-exceptions for NDK r7 and newer. +# Is not available for standalone toolchain. +# stlport_shared -> Use the STLport runtime as a shared library. +# Implies -fno-rtti -fno-exceptions for NDK before r7. +# Implies -frtti -fno-exceptions for NDK r7 and newer. +# Is not available for standalone toolchain. +# gnustl_static -> Use the GNU STL as a static library. +# Implies -frtti -fexceptions. +# gnustl_shared -> Use the GNU STL as a shared library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7b and newer. +# Silently degrades to gnustl_static if not available. +# +# ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on +# chosen runtime. If disabled, then the user is responsible for settings +# these options. +# +# What?: +# android-cmake toolchain searches for NDK/toolchain in the following order: +# ANDROID_NDK - cmake parameter +# ANDROID_NDK - environment variable +# ANDROID_STANDALONE_TOOLCHAIN - cmake parameter +# ANDROID_STANDALONE_TOOLCHAIN - environment variable +# ANDROID_NDK - default locations +# ANDROID_STANDALONE_TOOLCHAIN - default locations +# +# Make sure to do the following in your scripts: +# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" ) +# SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" ) +# The flags will be prepopulated with critical flags, so don't loose them. +# Also be aware that toolchain also sets configuration-specific compiler +# flags and linker flags. +# +# ANDROID and BUILD_ANDROID will be set to true, you may test any of these +# variables to make necessary Android-specific configuration changes. +# +# Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64 +# will be set true, mutually exclusive. NEON option will be set true +# if VFP is set to NEON. +# +# ------------------------------------------------------------------------------ + +cmake_minimum_required( VERSION 2.6.3 ) + +if( DEFINED CMAKE_CROSSCOMPILING ) + # subsequent toolchain loading is not really needed + return() +endif() + +if( CMAKE_TOOLCHAIN_FILE ) + # touch toolchain variable to suppress "unused variable" warning +endif() + +# inherit settings in recursive loads +get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) +if( _CMAKE_IN_TRY_COMPILE ) + include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL ) +endif() + +# this one is important +if( CMAKE_VERSION VERSION_GREATER "3.0.99" ) + set( CMAKE_SYSTEM_NAME Android ) +else() + set( CMAKE_SYSTEM_NAME Linux ) +endif() + +# this one not so much +set( CMAKE_SYSTEM_VERSION 1 ) + +# rpath makes low sense for Android +set( CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "" ) +set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." ) + +# NDK search paths +set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" ) +if( NOT DEFINED ANDROID_NDK_SEARCH_PATHS ) + if( CMAKE_HOST_WIN32 ) + file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS ) + set( ANDROID_NDK_SEARCH_PATHS "${ANDROID_NDK_SEARCH_PATHS}" "$ENV{SystemDrive}/NVPACK" ) + else() + file( TO_CMAKE_PATH "$ENV{HOME}" ANDROID_NDK_SEARCH_PATHS ) + set( ANDROID_NDK_SEARCH_PATHS /opt "${ANDROID_NDK_SEARCH_PATHS}/NVPACK" ) + endif() +endif() +if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH ) + set( ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH /opt/android-toolchain ) +endif() + +# known ABIs +set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP;arm64-v8a" ) +set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" ) +set( ANDROID_SUPPORTED_ABIS_x86 "x86" ) +set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" ) +set( ANDROID_SUPPORTED_ABIS_mips "mips" ) +set( ANDROID_SUPPORTED_ABIS_mips64 "mips64" ) + +# API level defaults +set( ANDROID_DEFAULT_NDK_API_LEVEL 21 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 21 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 21 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 21 ) + + +macro( __LIST_FILTER listvar regex ) + if( ${listvar} ) + foreach( __val ${${listvar}} ) + if( __val MATCHES "${regex}" ) + list( REMOVE_ITEM ${listvar} "${__val}" ) + endif() + endforeach() + endif() +endmacro() + +macro( __INIT_VARIABLE var_name ) + set( __test_path 0 ) + foreach( __var ${ARGN} ) + if( __var STREQUAL "PATH" ) + set( __test_path 1 ) + break() + endif() + endforeach() + + if( __test_path AND NOT EXISTS "${${var_name}}" ) + unset( ${var_name} CACHE ) + endif() + + if( " ${${var_name}}" STREQUAL " " ) + set( __values 0 ) + foreach( __var ${ARGN} ) + if( __var STREQUAL "VALUES" ) + set( __values 1 ) + elseif( NOT __var STREQUAL "PATH" ) + if( __var MATCHES "^ENV_.*$" ) + string( REPLACE "ENV_" "" __var "${__var}" ) + set( __value "$ENV{${__var}}" ) + elseif( DEFINED ${__var} ) + set( __value "${${__var}}" ) + elseif( __values ) + set( __value "${__var}" ) + else() + set( __value "" ) + endif() + + if( NOT " ${__value}" STREQUAL " " AND (NOT __test_path OR EXISTS "${__value}") ) + set( ${var_name} "${__value}" ) + break() + endif() + endif() + endforeach() + unset( __value ) + unset( __values ) + endif() + + if( __test_path ) + file( TO_CMAKE_PATH "${${var_name}}" ${var_name} ) + endif() + unset( __test_path ) +endmacro() + +macro( __DETECT_NATIVE_API_LEVEL _var _path ) + set( __ndkApiLevelRegex "^[\t ]*#define[\t ]+__ANDROID_API__[\t ]+([0-9]+)[\t ]*.*$" ) + file( STRINGS ${_path} __apiFileContent REGEX "${__ndkApiLevelRegex}" ) + if( NOT __apiFileContent ) + message( SEND_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken." ) + endif() + string( REGEX REPLACE "${__ndkApiLevelRegex}" "\\1" ${_var} "${__apiFileContent}" ) + unset( __apiFileContent ) + unset( __ndkApiLevelRegex ) +endmacro() + +macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root ) + if( EXISTS "${_root}" ) + file( GLOB __gccExePath RELATIVE "${_root}/bin/" "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" ) + __LIST_FILTER( __gccExePath "^[.].*" ) + list( LENGTH __gccExePath __gccExePathsCount ) + if( NOT __gccExePathsCount EQUAL 1 AND NOT _CMAKE_IN_TRY_COMPILE ) + message( WARNING "Could not determine machine name for compiler from ${_root}" ) + set( ${_var} "" ) + else() + get_filename_component( __gccExeName "${__gccExePath}" NAME_WE ) + string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" ) + endif() + unset( __gccExePath ) + unset( __gccExePathsCount ) + unset( __gccExeName ) + else() + set( ${_var} "" ) + endif() +endmacro() + + +# fight against cygwin +set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools") +mark_as_advanced( ANDROID_FORBID_SYGWIN ) +if( ANDROID_FORBID_SYGWIN ) + if( CYGWIN ) + message( FATAL_ERROR "Android NDK and android-cmake toolchain are not welcome Cygwin. It is unlikely that this cmake toolchain will work under cygwin. But if you want to try then you can set cmake variable ANDROID_FORBID_SYGWIN to FALSE and rerun cmake." ) + endif() + + if( CMAKE_HOST_WIN32 ) + # remove cygwin from PATH + set( __new_path "$ENV{PATH}") + __LIST_FILTER( __new_path "cygwin" ) + set(ENV{PATH} "${__new_path}") + unset(__new_path) + endif() +endif() + + +# detect current host platform +if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) ) + set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" ) + mark_as_advanced( ANDROID_NDK_HOST_X64 ) +endif() + +set( TOOL_OS_SUFFIX "" ) +if( CMAKE_HOST_APPLE ) + set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" ) + set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" ) +elseif( CMAKE_HOST_WIN32 ) + set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" ) + set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" ) + set( TOOL_OS_SUFFIX ".exe" ) +elseif( CMAKE_HOST_UNIX ) + set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" ) + set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" ) +else() + message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" ) +endif() + +if( NOT ANDROID_NDK_HOST_X64 ) + set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) +endif() + +# see if we have path to Android NDK +if( NOT ANDROID_NDK AND NOT ANDROID_STANDALONE_TOOLCHAIN ) + __INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK ) +endif() +if( NOT ANDROID_NDK ) + # see if we have path to Android standalone toolchain + __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN ) + + if( NOT ANDROID_STANDALONE_TOOLCHAIN ) + #try to find Android NDK in one of the the default locations + set( __ndkSearchPaths ) + foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} ) + foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} ) + list( APPEND __ndkSearchPaths "${__ndkSearchPath}/android-ndk${suffix}" ) + endforeach() + endforeach() + __INIT_VARIABLE( ANDROID_NDK PATH VALUES ${__ndkSearchPaths} ) + unset( __ndkSearchPaths ) + + if( ANDROID_NDK ) + message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" ) + message( STATUS " If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" ) + else() + #try to find Android standalone toolchain in one of the the default locations + __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH ) + + if( ANDROID_STANDALONE_TOOLCHAIN ) + message( STATUS "Using default path for standalone toolchain ${ANDROID_STANDALONE_TOOLCHAIN}" ) + message( STATUS " If you prefer to use a different location, please define the variable: ANDROID_STANDALONE_TOOLCHAIN" ) + endif( ANDROID_STANDALONE_TOOLCHAIN ) + endif( ANDROID_NDK ) + endif( NOT ANDROID_STANDALONE_TOOLCHAIN ) +endif( NOT ANDROID_NDK ) + +# remember found paths +if( ANDROID_NDK ) + get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE ) + set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE ) + set( BUILD_WITH_ANDROID_NDK True ) + if( EXISTS "${ANDROID_NDK}/RELEASE.TXT" ) + file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX "r[0-9]+[a-z]?" ) + string( REGEX MATCH "r([0-9]+)([a-z]?)" ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" ) + else() + set( ANDROID_NDK_RELEASE "r1x" ) + set( ANDROID_NDK_RELEASE_FULL "unreleased" ) + endif() + string( REGEX REPLACE "r([0-9]+)([a-z]?)" "\\1*1000" ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE}" ) + string( FIND " abcdefghijklmnopqastuvwxyz" "${CMAKE_MATCH_2}" __ndkReleaseLetterNum ) + math( EXPR ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE_NUM}+${__ndkReleaseLetterNum}" ) +elseif( ANDROID_STANDALONE_TOOLCHAIN ) + get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE ) + # try to detect change + if( CMAKE_AR ) + string( LENGTH "${ANDROID_STANDALONE_TOOLCHAIN}" __length ) + string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidStandaloneToolchainPreviousPath ) + if( NOT __androidStandaloneToolchainPreviousPath STREQUAL ANDROID_STANDALONE_TOOLCHAIN ) + message( FATAL_ERROR "It is not possible to change path to the Android standalone toolchain on subsequent run." ) + endif() + unset( __androidStandaloneToolchainPreviousPath ) + unset( __length ) + endif() + set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE ) + set( BUILD_WITH_STANDALONE_TOOLCHAIN True ) +else() + list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH) + message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain. + You should either set an environment variable: + export ANDROID_NDK=~/my-android-ndk + or + export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain + or put the toolchain or NDK in the default path: + sudo ln -s ~/my-android-ndk ${ANDROID_NDK_SEARCH_PATH}/android-ndk + sudo ln -s ~/my-android-toolchain ${ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH}" ) +endif() + +# android NDK layout +if( BUILD_WITH_ANDROID_NDK ) + if( NOT DEFINED ANDROID_NDK_LAYOUT ) + # try to automatically detect the layout + if( EXISTS "${ANDROID_NDK}/RELEASE.TXT") + set( ANDROID_NDK_LAYOUT "RELEASE" ) + elseif( EXISTS "${ANDROID_NDK}/../../linux-x86/toolchain/" ) + set( ANDROID_NDK_LAYOUT "LINARO" ) + elseif( EXISTS "${ANDROID_NDK}/../../gcc/" ) + set( ANDROID_NDK_LAYOUT "ANDROID" ) + endif() + endif() + set( ANDROID_NDK_LAYOUT "${ANDROID_NDK_LAYOUT}" CACHE STRING "The inner layout of NDK" ) + mark_as_advanced( ANDROID_NDK_LAYOUT ) + if( ANDROID_NDK_LAYOUT STREQUAL "LINARO" ) + set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment + set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../${ANDROID_NDK_HOST_SYSTEM_NAME}/toolchain" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" ) + elseif( ANDROID_NDK_LAYOUT STREQUAL "ANDROID" ) + set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment + set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../gcc/${ANDROID_NDK_HOST_SYSTEM_NAME}/arm" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" ) + else() # ANDROID_NDK_LAYOUT STREQUAL "RELEASE" + set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/toolchains" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME2}" ) + endif() + get_filename_component( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK_TOOLCHAINS_PATH}" ABSOLUTE ) + + # try to detect change of NDK + if( CMAKE_AR ) + string( LENGTH "${ANDROID_NDK_TOOLCHAINS_PATH}" __length ) + string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath ) + if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK_TOOLCHAINS_PATH ) + message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first. + " ) + endif() + unset( __androidNdkPreviousPath ) + unset( __length ) + endif() +endif() + + +# get all the details about standalone toolchain +if( BUILD_WITH_STANDALONE_TOOLCHAIN ) + __DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" ) + set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} ) + set( __availableToolchains "standalone" ) + __DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" ) + if( NOT __availableToolchainMachines ) + message( FATAL_ERROR "Could not determine machine name of your toolchain. Probably your Android standalone toolchain is broken." ) + endif() + if( __availableToolchainMachines MATCHES x86_64 ) + set( __availableToolchainArchs "x86_64" ) + elseif( __availableToolchainMachines MATCHES i686 ) + set( __availableToolchainArchs "x86" ) + elseif( __availableToolchainMachines MATCHES aarch64 ) + set( __availableToolchainArchs "arm64" ) + elseif( __availableToolchainMachines MATCHES arm ) + set( __availableToolchainArchs "arm" ) + elseif( __availableToolchainMachines MATCHES mips64el ) + set( __availableToolchainArchs "mips64" ) + elseif( __availableToolchainMachines MATCHES mipsel ) + set( __availableToolchainArchs "mips" ) + endif() + execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" -dumpversion + OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE ) + string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" ) + if( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/bin/clang${TOOL_OS_SUFFIX}" ) + list( APPEND __availableToolchains "standalone-clang" ) + list( APPEND __availableToolchainMachines ${__availableToolchainMachines} ) + list( APPEND __availableToolchainArchs ${__availableToolchainArchs} ) + list( APPEND __availableToolchainCompilerVersions ${__availableToolchainCompilerVersions} ) + endif() +endif() + +macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath ) + foreach( __toolchain ${${__availableToolchainsLst}} ) + if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}${__toolchain_subpath}" ) + SET( __toolchainVersionRegex "^TOOLCHAIN_VERSION[\t ]+:=[\t ]+(.*)$" ) + FILE( STRINGS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}/setup.mk" __toolchainVersionStr REGEX "${__toolchainVersionRegex}" ) + if( __toolchainVersionStr ) + string( REGEX REPLACE "${__toolchainVersionRegex}" "\\1" __toolchainVersionStr "${__toolchainVersionStr}" ) + string( REGEX REPLACE "-clang3[.][0-9]$" "-${__toolchainVersionStr}" __gcc_toolchain "${__toolchain}" ) + else() + string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" ) + endif() + unset( __toolchainVersionStr ) + unset( __toolchainVersionRegex ) + else() + set( __gcc_toolchain "${__toolchain}" ) + endif() + __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK_TOOLCHAINS_PATH}/${__gcc_toolchain}${__toolchain_subpath}" ) + if( __machine ) + string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9x]+)?$" __version "${__gcc_toolchain}" ) + if( __machine MATCHES x86_64 ) + set( __arch "x86_64" ) + elseif( __machine MATCHES i686 ) + set( __arch "x86" ) + elseif( __machine MATCHES aarch64 ) + set( __arch "arm64" ) + elseif( __machine MATCHES arm ) + set( __arch "arm" ) + elseif( __machine MATCHES mips64el ) + set( __arch "mips64" ) + elseif( __machine MATCHES mipsel ) + set( __arch "mips" ) + else() + set( __arch "" ) + endif() + #message("machine: !${__machine}!\narch: !${__arch}!\nversion: !${__version}!\ntoolchain: !${__toolchain}!\n") + if (__arch) + list( APPEND __availableToolchainMachines "${__machine}" ) + list( APPEND __availableToolchainArchs "${__arch}" ) + list( APPEND __availableToolchainCompilerVersions "${__version}" ) + list( APPEND ${__availableToolchainsVar} "${__toolchain}" ) + endif() + endif() + unset( __gcc_toolchain ) + endforeach() +endmacro() + +# get all the details about NDK +if( BUILD_WITH_ANDROID_NDK ) + file( GLOB ANDROID_SUPPORTED_NATIVE_API_LEVELS RELATIVE "${ANDROID_NDK}/platforms" "${ANDROID_NDK}/platforms/android-*" ) + string( REPLACE "android-" "" ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_SUPPORTED_NATIVE_API_LEVELS}" ) + set( __availableToolchains "" ) + set( __availableToolchainMachines "" ) + set( __availableToolchainArchs "" ) + set( __availableToolchainCompilerVersions "" ) + if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_TOOLCHAIN_NAME}/" ) + # do not go through all toolchains if we know the name + set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" ) + __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" ) + if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 ) + __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" ) + if( __availableToolchains ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} ) + endif() + endif() + endif() + if( NOT __availableToolchains ) + file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK_TOOLCHAINS_PATH}" "${ANDROID_NDK_TOOLCHAINS_PATH}/*" ) + if( __availableToolchainsLst ) + list(SORT __availableToolchainsLst) # we need clang to go after gcc + endif() + __LIST_FILTER( __availableToolchainsLst "^[.]" ) + __LIST_FILTER( __availableToolchainsLst "llvm" ) + __LIST_FILTER( __availableToolchainsLst "renderscript" ) + __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" ) + if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 ) + __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" ) + if( __availableToolchains ) + set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} ) + endif() + endif() + endif() + if( NOT __availableToolchains ) + message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." ) + endif() +endif() + +# build list of available ABIs +set( ANDROID_SUPPORTED_ABIS "" ) +set( __uniqToolchainArchNames ${__availableToolchainArchs} ) +list( REMOVE_DUPLICATES __uniqToolchainArchNames ) +list( SORT __uniqToolchainArchNames ) +foreach( __arch ${__uniqToolchainArchNames} ) + list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} ) +endforeach() +unset( __uniqToolchainArchNames ) +if( NOT ANDROID_SUPPORTED_ABIS ) + message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." ) +endif() + +# choose target ABI +__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} ) +# verify that target ABI is supported +list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx ) +if( __androidAbiIdx EQUAL -1 ) + string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" ) + message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain. + Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\" + " ) +endif() +unset( __androidAbiIdx ) + +message( "Specified ANDROID_ABI = \"${ANDROID_ABI}\" " ) + +# set target ABI options +if( ANDROID_ABI STREQUAL "x86" ) + set( X86 true ) + set( ANDROID_NDK_ABI_NAME "x86" ) + set( ANDROID_ARCH_NAME "x86" ) + set( ANDROID_LLVM_TRIPLE "i686-none-linux-android" ) + set( CMAKE_SYSTEM_PROCESSOR "i686" ) +elseif( ANDROID_ABI STREQUAL "x86_64" ) + set( X86 true ) + set( X86_64 true ) + set( ANDROID_NDK_ABI_NAME "x86_64" ) + set( ANDROID_ARCH_NAME "x86_64" ) + set( CMAKE_SYSTEM_PROCESSOR "x86_64" ) + set( ANDROID_LLVM_TRIPLE "x86_64-none-linux-android" ) +elseif( ANDROID_ABI STREQUAL "mips64" ) + set( MIPS64 true ) + set( ANDROID_NDK_ABI_NAME "mips64" ) + set( ANDROID_ARCH_NAME "mips64" ) + set( ANDROID_LLVM_TRIPLE "mips64el-none-linux-android" ) + set( CMAKE_SYSTEM_PROCESSOR "mips64" ) +elseif( ANDROID_ABI STREQUAL "mips" ) + set( MIPS true ) + set( ANDROID_NDK_ABI_NAME "mips" ) + set( ANDROID_ARCH_NAME "mips" ) + set( ANDROID_LLVM_TRIPLE "mipsel-none-linux-android" ) + set( CMAKE_SYSTEM_PROCESSOR "mips" ) +elseif( ANDROID_ABI STREQUAL "arm64-v8a" ) + set( ARM64_V8A true ) + set( ANDROID_NDK_ABI_NAME "arm64-v8a" ) + set( ANDROID_ARCH_NAME "arm64" ) + set( ANDROID_LLVM_TRIPLE "aarch64-none-linux-android" ) + set( CMAKE_SYSTEM_PROCESSOR "aarch64" ) + set( VFPV3 true ) + set( NEON true ) +elseif( ANDROID_ABI STREQUAL "armeabi" ) + set( ARMEABI true ) + set( ANDROID_NDK_ABI_NAME "armeabi" ) + set( ANDROID_ARCH_NAME "arm" ) + set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" ) + set( CMAKE_SYSTEM_PROCESSOR "armv5te" ) +elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" ) + set( ARMEABI_V6 true ) + set( ANDROID_NDK_ABI_NAME "armeabi" ) + set( ANDROID_ARCH_NAME "arm" ) + set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" ) + set( CMAKE_SYSTEM_PROCESSOR "armv6" ) + # need always fallback to older platform + set( ARMEABI true ) +elseif( ANDROID_ABI STREQUAL "armeabi-v7a") + set( ARMEABI_V7A true ) + set( ANDROID_NDK_ABI_NAME "armeabi-v7a" ) + set( ANDROID_ARCH_NAME "arm" ) + set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" ) + set( CMAKE_SYSTEM_PROCESSOR "armv7-a" ) +elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" ) + set( ARMEABI_V7A true ) + set( ANDROID_NDK_ABI_NAME "armeabi-v7a" ) + set( ANDROID_ARCH_NAME "arm" ) + set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" ) + set( CMAKE_SYSTEM_PROCESSOR "armv7-a" ) + set( VFPV3 true ) +elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" ) + set( ARMEABI_V7A true ) + set( ANDROID_NDK_ABI_NAME "armeabi-v7a" ) + set( ANDROID_ARCH_NAME "arm" ) + set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" ) + set( CMAKE_SYSTEM_PROCESSOR "armv7-a" ) + set( VFPV3 true ) + set( NEON true ) +else() + message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." ) +endif() + + +if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" ) + # really dirty hack + # it is not possible to change CMAKE_SYSTEM_PROCESSOR after the first run... + file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" ) +endif() + +if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 ) + __INIT_VARIABLE( ANDROID_FORCE_ARM_BUILD VALUES OFF ) + set( ANDROID_FORCE_ARM_BUILD ${ANDROID_FORCE_ARM_BUILD} CACHE BOOL "Use 32-bit ARM instructions instead of Thumb-1" FORCE ) + mark_as_advanced( ANDROID_FORCE_ARM_BUILD ) +else() + unset( ANDROID_FORCE_ARM_BUILD CACHE ) +endif() + +# choose toolchain +if( ANDROID_TOOLCHAIN_NAME ) + list( FIND __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" __toolchainIdx ) + if( __toolchainIdx EQUAL -1 ) + list( SORT __availableToolchains ) + string( REPLACE ";" "\n * " toolchains_list "${__availableToolchains}" ) + set( toolchains_list " * ${toolchains_list}") + message( FATAL_ERROR "Specified toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing in your NDK or broken. Please verify that your NDK is working or select another compiler toolchain. +To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values:\n${toolchains_list}\n" ) + endif() + list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch ) + if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME ) + message( SEND_ERROR "Selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." ) + endif() +else() + set( __toolchainIdx -1 ) + set( __applicableToolchains "" ) + set( __toolchainMaxVersion "0.0.0" ) + list( LENGTH __availableToolchains __availableToolchainsCount ) + math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" ) + foreach( __idx RANGE ${__availableToolchainsCount} ) + list( GET __availableToolchainArchs ${__idx} __toolchainArch ) + if( __toolchainArch STREQUAL ANDROID_ARCH_NAME ) + list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion ) + string( REPLACE "x" "99" __toolchainVersion "${__toolchainVersion}") + if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion ) + set( __toolchainMaxVersion "${__toolchainVersion}" ) + set( __toolchainIdx ${__idx} ) + endif() + endif() + endforeach() + unset( __availableToolchainsCount ) + unset( __toolchainMaxVersion ) + unset( __toolchainVersion ) +endif() +unset( __toolchainArch ) +if( __toolchainIdx EQUAL -1 ) + message( FATAL_ERROR "No one of available compiler toolchains is able to compile for ${ANDROID_ARCH_NAME} platform." ) +endif() +list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME ) +list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME ) +list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION ) + +unset( __toolchainIdx ) +unset( __availableToolchains ) +unset( __availableToolchainMachines ) +unset( __availableToolchainArchs ) +unset( __availableToolchainCompilerVersions ) + +# choose native API level +__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL ) +string( REPLACE "android-" "" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" ) +string( STRIP "${ANDROID_NATIVE_API_LEVEL}" ANDROID_NATIVE_API_LEVEL ) +# adjust API level +set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} ) +foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} ) + if( (__level LESS ANDROID_NATIVE_API_LEVEL OR __level STREQUAL ANDROID_NATIVE_API_LEVEL) AND NOT __level LESS __real_api_level ) + set( __real_api_level ${__level} ) + endif() +endforeach() +if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL STREQUAL __real_api_level ) + message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'") + set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} ) +endif() +unset(__real_api_level) +# validate +list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx ) +if( __levelIdx EQUAL -1 ) + message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." ) +else() + if( BUILD_WITH_ANDROID_NDK ) + __DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" ) + if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL AND NOT __realApiLevel GREATER 9000 ) + message( SEND_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken." ) + endif() + unset( __realApiLevel ) + endif() + set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE ) + set( CMAKE_ANDROID_API ${ANDROID_NATIVE_API_LEVEL} ) + if( CMAKE_VERSION VERSION_GREATER "2.8" ) + list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS ) + set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} ) + endif() +endif() +unset( __levelIdx ) + + +# remember target ABI +set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE ) +if( CMAKE_VERSION VERSION_GREATER "2.8" ) + list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} ) + set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} ) +endif() + + +# runtime choice (STL, rtti, exceptions) +if( NOT ANDROID_STL ) + set( ANDROID_STL gnustl_static ) +endif() +set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" ) +set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" ) +mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES ) + +if( BUILD_WITH_ANDROID_NDK ) + if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$") + message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". +The possible values are: + none -> Do not configure the runtime. + system -> Use the default minimal system C++ runtime library. + system_re -> Same as system but with rtti and exceptions. + gabi++_static -> Use the GAbi++ runtime as a static library. + gabi++_shared -> Use the GAbi++ runtime as a shared library. + stlport_static -> Use the STLport runtime as a static library. + stlport_shared -> Use the STLport runtime as a shared library. + gnustl_static -> (default) Use the GNU STL as a static library. + gnustl_shared -> Use the GNU STL as a shared library. +" ) + endif() +elseif( BUILD_WITH_STANDALONE_TOOLCHAIN ) + if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$") + message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". +The possible values are: + none -> Do not configure the runtime. + gnustl_static -> (default) Use the GNU STL as a static library. + gnustl_shared -> Use the GNU STL as a shared library. +" ) + endif() +endif() + +unset( ANDROID_RTTI ) +unset( ANDROID_EXCEPTIONS ) +unset( ANDROID_STL_INCLUDE_DIRS ) +unset( __libstl ) +unset( __libsupcxx ) + +if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" ) + message( WARNING "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf). +You are strongly recommended to switch to another NDK release. +" ) +endif() + +if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" ) + message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header: +See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2 + diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h + index 5e28c64..65892a1 100644 + --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h + +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h + @@ -51,7 +51,11 @@ typedef long int ssize_t; + #endif + #ifndef _PTRDIFF_T + #define _PTRDIFF_T + -typedef long ptrdiff_t; + +# ifdef __ANDROID__ + + typedef int ptrdiff_t; + +# else + + typedef long ptrdiff_t; + +# endif + #endif +" ) +endif() + + +# setup paths and STL for standalone toolchain +if( BUILD_WITH_STANDALONE_TOOLCHAIN ) + set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" ) + set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" ) + set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" ) + + if( NOT ANDROID_STL STREQUAL "none" ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/include/c++/${ANDROID_COMPILER_VERSION}" ) + if( NOT EXISTS "${ANDROID_STL_INCLUDE_DIRS}" ) + # old location ( pre r8c ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" ) + endif() + if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" ) + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" ) + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" ) + else() + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" ) + endif() + # always search static GNU STL to get the location of libsupc++.a + if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" ) + elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" ) + elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) + endif() + if( __libstl ) + set( __libsupcxx "${__libstl}/libsupc++.a" ) + set( __libstl "${__libstl}/libstdc++.a" ) + endif() + if( NOT EXISTS "${__libsupcxx}" ) + message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain. + Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c. + You need to either upgrade to newer NDK or manually copy + $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a + to + ${__libsupcxx} + " ) + endif() + if( ANDROID_STL STREQUAL "gnustl_shared" ) + if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" ) + elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" ) + endif() + endif() + endif() +endif() + +# clang +if( "${ANDROID_TOOLCHAIN_NAME}" STREQUAL "standalone-clang" ) + set( ANDROID_COMPILER_IS_CLANG 1 ) + execute_process( COMMAND "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/clang${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE ANDROID_CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) + string( REGEX MATCH "[0-9]+[.][0-9]+" ANDROID_CLANG_VERSION "${ANDROID_CLANG_VERSION}") +elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" ) + string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}") + string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-${ANDROID_COMPILER_VERSION}" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" ) + if( NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}/bin/clang${TOOL_OS_SUFFIX}" ) + message( FATAL_ERROR "Could not find the Clang compiler driver" ) + endif() + set( ANDROID_COMPILER_IS_CLANG 1 ) + set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" ) +else() + set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" ) + unset( ANDROID_COMPILER_IS_CLANG CACHE ) +endif() + +string( REPLACE "." "" _clang_name "clang${ANDROID_CLANG_VERSION}" ) +if( NOT EXISTS "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" ) + set( _clang_name "clang" ) +endif() + + +# setup paths and STL for NDK +if( BUILD_WITH_ANDROID_NDK ) + set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" ) + set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" ) + + if( ANDROID_STL STREQUAL "none" ) + # do nothing + elseif( ANDROID_STL STREQUAL "system" ) + set( ANDROID_RTTI OFF ) + set( ANDROID_EXCEPTIONS OFF ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" ) + elseif( ANDROID_STL STREQUAL "system_re" ) + set( ANDROID_RTTI ON ) + set( ANDROID_EXCEPTIONS ON ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" ) + elseif( ANDROID_STL MATCHES "gabi" ) + if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7 + message( FATAL_ERROR "gabi++ is not available in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.") + endif() + set( ANDROID_RTTI ON ) + set( ANDROID_EXCEPTIONS OFF ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" ) + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" ) + elseif( ANDROID_STL MATCHES "stlport" ) + if( NOT ANDROID_NDK_RELEASE_NUM LESS 8004 ) # before r8d + set( ANDROID_EXCEPTIONS ON ) + else() + set( ANDROID_EXCEPTIONS OFF ) + endif() + if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7 + set( ANDROID_RTTI OFF ) + else() + set( ANDROID_RTTI ON ) + endif() + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" ) + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" ) + elseif( ANDROID_STL MATCHES "gnustl" ) + set( ANDROID_EXCEPTIONS ON ) + set( ANDROID_RTTI ON ) + if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" ) + if( ARMEABI_V7A AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.7" AND ANDROID_NDK_RELEASE STREQUAL "r8d" ) + # gnustl binary for 4.7 compiler is buggy :( + # TODO: look for right fix + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.6" ) + else() + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" ) + endif() + else() + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" ) + endif() + set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" "${__libstl}/include/backward" ) + if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" ) + set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" ) + else() + set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" ) + endif() + else() + message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" ) + endif() + # find libsupc++.a - rtti & exceptions + if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" ) + set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r8b or newer + if( NOT EXISTS "${__libsupcxx}" ) + set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r7-r8 + endif() + if( NOT EXISTS "${__libsupcxx}" ) # before r7 + if( ARMEABI_V7A ) + if( ANDROID_FORCE_ARM_BUILD ) + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" ) + else() + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" ) + endif() + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD ) + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" ) + else() + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" ) + endif() + endif() + if( NOT EXISTS "${__libsupcxx}") + message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.") + endif() + endif() +endif() + + +# case of shared STL linkage +if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl ) + string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" ) + # TODO: check if .so file exists before the renaming +endif() + + +# ccache support +__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE ) +if( _ndk_ccache ) + if( DEFINED NDK_CCACHE AND NOT EXISTS NDK_CCACHE ) + unset( NDK_CCACHE CACHE ) + endif() + find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary") +else() + unset( NDK_CCACHE CACHE ) +endif() +unset( _ndk_ccache ) + + +# setup the cross-compiler +if( NOT CMAKE_C_COMPILER ) + if( NDK_CCACHE AND NOT ANDROID_SYSROOT MATCHES "[ ;\"]" ) + set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" ) + set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" ) + if( ANDROID_COMPILER_IS_CLANG ) + set( CMAKE_C_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler") + set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler") + else() + set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler") + set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler") + endif() + else() + if( ANDROID_COMPILER_IS_CLANG ) + set( CMAKE_C_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler") + set( CMAKE_CXX_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler") + else() + set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler" ) + set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler" ) + endif() + endif() + set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" ) + set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" ) + if( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" ) + # Use gcc-ar if we have it for better LTO support. + set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" ) + else() + set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" ) + endif() + set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" ) + set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" ) + set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" ) + set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" ) + set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" ) + set( CMAKE_ASM-ATT_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-as${TOOL_OS_SUFFIX}" CACHE PATH "as" ) +endif() + +set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" ) +if( CMAKE_VERSION VERSION_LESS 2.8.5 ) + set( CMAKE_ASM_COMPILER_ARG1 "-c" ) +endif() +if( APPLE ) + find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool ) + if( NOT CMAKE_INSTALL_NAME_TOOL ) + message( FATAL_ERROR "Could not find install_name_tool, please check your installation." ) + endif() + mark_as_advanced( CMAKE_INSTALL_NAME_TOOL ) +endif() + +# Force set compilers because standard identification works badly for us +#include( CMakeForceCompiler ) +#CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU ) +if( ANDROID_COMPILER_IS_CLANG ) + set( CMAKE_C_COMPILER_ID Clang ) +endif() + +set( CMAKE_C_PLATFORM_ID Linux ) +if( X86_64 OR MIPS64 OR ARM64_V8A ) + set( CMAKE_C_SIZEOF_DATA_PTR 8 ) +else() + set( CMAKE_C_SIZEOF_DATA_PTR 4 ) +endif() +set( CMAKE_C_HAS_ISYSROOT 1 ) +set( CMAKE_C_COMPILER_ABI ELF ) +#CMAKE_FORCE_CXX_COMPILER( "${CMAKE_CXX_COMPILER}" GNU ) +if( ANDROID_COMPILER_IS_CLANG ) + set( CMAKE_CXX_COMPILER_ID Clang) +endif() +set( CMAKE_CXX_PLATFORM_ID Linux ) +set( CMAKE_CXX_SIZEOF_DATA_PTR ${CMAKE_C_SIZEOF_DATA_PTR} ) +set( CMAKE_CXX_HAS_ISYSROOT 1 ) +set( CMAKE_CXX_COMPILER_ABI ELF ) +set( CMAKE_CXX_SOURCE_FILE_EXTENSIONS cc cp cxx cpp CPP c++ C ) +# force ASM compiler (required for CMake < 2.8.5) +set( CMAKE_ASM_COMPILER_ID_RUN TRUE ) +set( CMAKE_ASM_COMPILER_ID GNU ) +set( CMAKE_ASM_COMPILER_WORKS TRUE ) +set( CMAKE_ASM_COMPILER_FORCED TRUE ) +set( CMAKE_COMPILER_IS_GNUASM 1) +set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm ) + +foreach( lang C CXX ASM ) + if( ANDROID_COMPILER_IS_CLANG ) + set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_CLANG_VERSION} ) + else() + set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_COMPILER_VERSION} ) + endif() +endforeach() + +# flags and definitions +remove_definitions( -DANDROID ) +add_definitions( -DANDROID ) + +if( ANDROID_SYSROOT MATCHES "[ ;\"]" ) + if( CMAKE_HOST_WIN32 ) + # try to convert path to 8.3 form + file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "@echo %~s1" ) + execute_process( COMMAND "$ENV{ComSpec}" /c "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "${ANDROID_SYSROOT}" + OUTPUT_VARIABLE __path OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE __result ERROR_QUIET ) + if( __result EQUAL 0 ) + file( TO_CMAKE_PATH "${__path}" ANDROID_SYSROOT ) + set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) + else() + set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) + endif() + else() + set( ANDROID_CXX_FLAGS "'--sysroot=${ANDROID_SYSROOT}'" ) + endif() + if( NOT _CMAKE_IN_TRY_COMPILE ) + # quotes can break try_compile and compiler identification + message(WARNING "Path to your Android NDK (or toolchain) has non-alphanumeric symbols.\nThe build might be broken.\n") + endif() +else() + set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) +endif() + +# NDK flags +if (ARM64_V8A ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" ) + set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" ) + set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" ) + if( NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" ) + endif() +elseif( ARMEABI OR ARMEABI_V7A) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" ) + if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 ) + #set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" ) + set( ANDROID_CXX_FLAGS_RELEASE "-marm -fno-omit-frame-pointer -fno-strict-aliasing" ) + set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" ) + if( NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" ) + endif() + else() + # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI + set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" ) + set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" ) + if( NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" ) + endif() + endif() +elseif( X86 OR X86_64 ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" ) + if( NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" ) + endif() + set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" ) + set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" ) +elseif( MIPS OR MIPS64 ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-strict-aliasing -finline-functions -funwind-tables -fmessage-length=0" ) + set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" ) + set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer" ) + if( NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" ) + set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" ) + endif() +elseif() + set( ANDROID_CXX_FLAGS_RELEASE "" ) + set( ANDROID_CXX_FLAGS_DEBUG "" ) +endif() + +set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries + +if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" ) +endif() + +if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/ +endif() + +# ABI-specific flags +if( ARMEABI_V7A ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" ) + if( NEON ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon-vfpv4" ) + elseif( VFPV3 ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" ) + else() + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" ) + endif() +elseif( ARMEABI_V6 ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2 +elseif( ARMEABI ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" ) +endif() + +if( ANDROID_STL MATCHES "gnustl" AND (EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}") ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) +else() + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) +endif() + +# STL +if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) + if( EXISTS "${__libstl}" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" ) + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" ) + endif() + if( EXISTS "${__libsupcxx}" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" ) + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" ) + # C objects: + set( CMAKE_C_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_C_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_C_LINK_EXECUTABLE " -o " ) + set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" ) + set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" ) + set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" ) + endif() + if( ANDROID_STL MATCHES "gnustl" ) + if( NOT EXISTS "${ANDROID_LIBM_PATH}" ) + set( ANDROID_LIBM_PATH -lm ) + endif() + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} ${ANDROID_LIBM_PATH}" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} ${ANDROID_LIBM_PATH}" ) + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} ${ANDROID_LIBM_PATH}" ) + endif() +endif() + +# variables controlling optional build flags +if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7 + # libGLESv2.so in NDK's prior to r7 refers to missing external symbols. + # So this flag option is required for all projects using OpenGL from native. + __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON ) +else() + __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF ) +endif() +__INIT_VARIABLE( ANDROID_NO_UNDEFINED VALUES ON ) +__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON ) +__INIT_VARIABLE( ANDROID_GOLD_LINKER VALUES ON ) +__INIT_VARIABLE( ANDROID_NOEXECSTACK VALUES ON ) +__INIT_VARIABLE( ANDROID_RELRO VALUES ON ) + +set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" ) +set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" ) +set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Put each function in separate section and enable garbage collection of unused input sections at link time" ) +set( ANDROID_GOLD_LINKER ${ANDROID_GOLD_LINKER} CACHE BOOL "Enables gold linker" ) +set( ANDROID_NOEXECSTACK ${ANDROID_NOEXECSTACK} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" ) +set( ANDROID_RELRO ${ANDROID_RELRO} CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" ) +mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO ) + +# linker flags +set( ANDROID_LINKER_FLAGS "" ) + +if( ARMEABI_V7A ) + # this is *required* to use the following linker flags that routes around + # a CPU bug in some Cortex-A8 implementations: + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" ) +endif() + +if( ANDROID_NO_UNDEFINED ) + if( MIPS ) + # there is some sysroot-related problem in mips linker... + if( NOT ANDROID_SYSROOT MATCHES "[ ;\"]" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined -Wl,-rpath-link,${ANDROID_SYSROOT}/usr/lib" ) + endif() + else() + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" ) + endif() +endif() + +if( ANDROID_SO_UNDEFINED ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" ) +endif() + +if( ANDROID_FUNCTION_LEVEL_LINKING ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" ) +endif() + +if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" ) + if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" ) + elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" ) + elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND NOT _CMAKE_IN_TRY_COMPILE ) + message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342 + On Linux and OS X host platform you can workaround this problem using gold linker (default). + Rerun cmake with -DANDROID_GOLD_LINKER=ON option in case of problems. +" ) + endif() +endif() # version 4.6 + +if( ANDROID_NOEXECSTACK ) + if( ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Xclang -mnoexecstack" ) + else() + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" ) + endif() + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" ) +endif() + +if( ANDROID_RELRO ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" ) +endif() + +if( ANDROID_COMPILER_IS_CLANG ) + set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} -Qunused-arguments ${ANDROID_CXX_FLAGS}" ) + if( BUILD_WITH_ANDROID_NDK ) + set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" ) + endif() +endif() + +# cache flags +set( CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags" ) +set( CMAKE_C_FLAGS "" CACHE STRING "c flags" ) +set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c++ Release flags" ) +set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c Release flags" ) +set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" ) +set( CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" ) +set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags" ) +set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" ) +set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" ) + +# put flags to cache (for debug purpose only) +set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Android specific c/c++ flags" ) +set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" ) +set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG}" CACHE INTERNAL "Android specific c/c++ Debug flags" ) +set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Android specific c/c++ linker flags" ) + +# finish flags +set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" ) +set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" ) +set( CMAKE_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" ) +set( CMAKE_C_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" ) +set( CMAKE_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" ) +set( CMAKE_C_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" ) +set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" ) +set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" ) +set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) + +if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" ) + set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" ) + set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" ) + set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" ) +endif() + +# pie/pic +if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE) AND (CMAKE_VERSION VERSION_GREATER 2.8.8) ) + set( CMAKE_POSITION_INDEPENDENT_CODE TRUE ) + set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie") +else() + set( CMAKE_POSITION_INDEPENDENT_CODE FALSE ) + set( CMAKE_CXX_FLAGS "-fpic ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-fpic ${CMAKE_C_FLAGS}" ) +endif() + +# configure rtti +if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES ) + if( ANDROID_RTTI ) + set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" ) + else() + set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" ) + endif() +endif() + +# configure exceptios +if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES ) + if( ANDROID_EXCEPTIONS ) + set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" ) + else() + set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" ) + endif() +endif() + +# global includes and link directories +include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} ) +get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning +link_directories( "${__android_install_path}" ) + +# detect if need link crtbegin_so.o explicitly +if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK ) + set( __cmd "${CMAKE_CXX_CREATE_SHARED_LIBRARY}" ) + string( REPLACE "" "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" __cmd "${__cmd}" ) + string( REPLACE "" "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" __cmd "${__cmd}" ) + string( REPLACE "" "${CMAKE_CXX_FLAGS}" __cmd "${__cmd}" ) + string( REPLACE "" "" __cmd "${__cmd}" ) + string( REPLACE "" "${CMAKE_SHARED_LINKER_FLAGS}" __cmd "${__cmd}" ) + string( REPLACE "" "-shared" __cmd "${__cmd}" ) + string( REPLACE "" "" __cmd "${__cmd}" ) + string( REPLACE "" "" __cmd "${__cmd}" ) + string( REPLACE "" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain_crtlink_test.so" __cmd "${__cmd}" ) + string( REPLACE "" "\"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" __cmd "${__cmd}" ) + string( REPLACE "" "" __cmd "${__cmd}" ) + separate_arguments( __cmd ) + foreach( __var ANDROID_NDK ANDROID_NDK_TOOLCHAINS_PATH ANDROID_STANDALONE_TOOLCHAIN ) + if( ${__var} ) + set( __tmp "${${__var}}" ) + separate_arguments( __tmp ) + string( REPLACE "${__tmp}" "${${__var}}" __cmd "${__cmd}") + endif() + endforeach() + string( REPLACE "'" "" __cmd "${__cmd}" ) + string( REPLACE "\"" "" __cmd "${__cmd}" ) + execute_process( COMMAND ${__cmd} RESULT_VARIABLE __cmd_result OUTPUT_QUIET ERROR_QUIET ) + if( __cmd_result EQUAL 0 ) + set( ANDROID_EXPLICIT_CRT_LINK ON ) + else() + set( ANDROID_EXPLICIT_CRT_LINK OFF ) + endif() +endif() + +if( ANDROID_EXPLICIT_CRT_LINK ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" ) +endif() + +# setup output directories +set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) + +if( DEFINED LIBRARY_OUTPUT_PATH_ROOT + OR EXISTS "${CMAKE_SOURCE_DIR}/AndroidManifest.xml" + OR (EXISTS "${CMAKE_SOURCE_DIR}/../AndroidManifest.xml" AND EXISTS "${CMAKE_SOURCE_DIR}/../jni/") ) + set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Root for binaries output, set this to change where Android libs are installed to" ) + if( NOT _CMAKE_IN_TRY_COMPILE ) + if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" ) + set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" ) + else() + set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" ) + endif() + set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for Android libs" ) + endif() +endif() + +# copy shaed stl library to build directory +if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" AND DEFINED LIBRARY_OUTPUT_PATH ) + get_filename_component( __libstlname "${__libstl}" NAME ) + execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) + if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") + message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) + endif() + unset( __fileCopyProcess ) + unset( __libstlname ) +endif() + + +# set these global flags for cmake client scripts to change behavior +set( ANDROID True ) +set( BUILD_ANDROID True ) + +# where is the target environment +set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" ) + +# only search for libraries and includes in the ndk toolchain +set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) +set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) +set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) + + +# macro to find packages on the host OS +macro( find_host_package ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + SET( WIN32 1 ) + SET( UNIX ) + elseif( CMAKE_HOST_APPLE ) + SET( APPLE 1 ) + SET( UNIX ) + endif() + find_package( ${ARGN} ) + SET( WIN32 ) + SET( APPLE ) + SET( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +endmacro() + + +# macro to find programs on the host OS +macro( find_host_program ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + SET( WIN32 1 ) + SET( UNIX ) + elseif( CMAKE_HOST_APPLE ) + SET( APPLE 1 ) + SET( UNIX ) + endif() + find_program( ${ARGN} ) + SET( WIN32 ) + SET( APPLE ) + SET( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +endmacro() + + +# export toolchain settings for the try_compile() command +if( NOT _CMAKE_IN_TRY_COMPILE ) + set( __toolchain_config "") + foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN + ANDROID_NDK_HOST_X64 + ANDROID_NDK + ANDROID_NDK_LAYOUT + ANDROID_STANDALONE_TOOLCHAIN + ANDROID_TOOLCHAIN_NAME + ANDROID_ABI + ANDROID_NATIVE_API_LEVEL + ANDROID_STL + ANDROID_STL_FORCE_FEATURES + ANDROID_FORCE_ARM_BUILD + ANDROID_NO_UNDEFINED + ANDROID_SO_UNDEFINED + ANDROID_FUNCTION_LEVEL_LINKING + ANDROID_GOLD_LINKER + ANDROID_NOEXECSTACK + ANDROID_RELRO + ANDROID_LIBM_PATH + ANDROID_EXPLICIT_CRT_LINK + ANDROID_APP_PIE + ) + if( DEFINED ${__var} ) + if( ${__var} MATCHES " ") + set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" ) + else() + set( __toolchain_config "${__toolchain_config}set( ${__var} ${${__var}} CACHE INTERNAL \"\" )\n" ) + endif() + endif() + endforeach() + file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" ) + unset( __toolchain_config ) +endif() + + +# force cmake to produce / instead of \ in build commands for Ninja generator +if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 ) + # it is a bad hack after all + # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW + set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW + set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion +# enable_language( C ) +# enable_language( CXX ) + # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it + unset( MINGW ) +endif() + + +# Variables controlling behavior or set by cmake toolchain: +# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64" +# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version) +# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none +# ANDROID_FORBID_SYGWIN : ON/OFF +# ANDROID_NO_UNDEFINED : ON/OFF +# ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version) +# ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF +# ANDROID_GOLD_LINKER : ON/OFF +# ANDROID_NOEXECSTACK : ON/OFF +# ANDROID_RELRO : ON/OFF +# ANDROID_FORCE_ARM_BUILD : ON/OFF +# ANDROID_STL_FORCE_FEATURES : ON/OFF +# ANDROID_LIBM_PATH : path to libm.so (set to something like $(TOP)/out/target/product//obj/lib/libm.so) to workaround unresolved `sincos` +# Can be set only at the first run: +# ANDROID_NDK : path to your NDK install +# NDK_CCACHE : path to your ccache executable +# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain +# ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems) +# ANDROID_NDK_LAYOUT : the inner NDK structure (RELEASE, LINARO, ANDROID) +# LIBRARY_OUTPUT_PATH_ROOT : +# ANDROID_STANDALONE_TOOLCHAIN +# +# Primary read-only variables: +# ANDROID : always TRUE +# ARMEABI : TRUE for arm v6 and older devices +# ARMEABI_V6 : TRUE for arm v6 +# ARMEABI_V7A : TRUE for arm v7a +# ARM64_V8A : TRUE for arm64-v8a +# NEON : TRUE if NEON unit is enabled +# VFPV3 : TRUE if VFP version 3 is enabled +# X86 : TRUE if configured for x86 +# X86_64 : TRUE if configured for x86_64 +# MIPS : TRUE if configured for mips +# MIPS64 : TRUE if configured for mips64 +# BUILD_WITH_ANDROID_NDK : TRUE if NDK is used +# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used +# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform +# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI +# ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK +# ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor) +# ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI +# ANDROID_SYSROOT : path to the compiler sysroot +# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform +# ANDROID_COMPILER_IS_CLANG : TRUE if clang compiler is used +# +# Secondary (less stable) read-only variables: +# ANDROID_COMPILER_VERSION : GCC version used (not Clang version) +# ANDROID_CLANG_VERSION : version of clang compiler if clang is used +# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform +# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI +# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux" +# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK) +# ANDROID_CLANG_TOOLCHAIN_ROOT : path to clang tools +# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK +# ANDROID_STL_INCLUDE_DIRS : stl include paths +# ANDROID_RTTI : if rtti is enabled by the runtime +# ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime +# ANDROID_GCC_TOOLCHAIN_NAME : read-only, differs from ANDROID_TOOLCHAIN_NAME only if clang is used +# +# Defaults: +# ANDROID_DEFAULT_NDK_API_LEVEL +# ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH} +# ANDROID_NDK_SEARCH_PATHS +# ANDROID_SUPPORTED_ABIS_${ARCH} +# ANDROID_SUPPORTED_NDK_VERSIONS diff --git a/yabause/src/android/app/build.gradle b/yabause/src/android/app/build.gradle new file mode 100644 index 0000000000..904a96a51d --- /dev/null +++ b/yabause/src/android/app/build.gradle @@ -0,0 +1,331 @@ +/* + Copyright 2019 devMiyax(smiyaxdev@gmail.com) + +This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +YabaSanshiro is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +along with YabaSanshiro; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("com.google.firebase.crashlytics") + id 'org.jetbrains.kotlin.kapt' + //id("com.dicedmelon.gradle.jacoco-android") +} + + +android { + namespace "org.devmiyax.yabasanshiro" + signingConfigs { + pro { + if( System.getenv('KEY_FILE_NAME') == null ){ + storeFile file("dmy") + }else { + storeFile file(System.getenv('KEY_FILE_NAME')) + } + storePassword System.getenv('STORE_PASSWORD') + keyAlias System.getenv('KEY_ALIAS') + keyPassword System.getenv('KEY_PASSWORD') + } + + release { + if( System.getenv('KEY_FILE_NAME') == null ){ + storeFile file("dmy") + }else { + storeFile file(System.getenv('KEY_FILE_NAME')) + } + storePassword System.getenv('STORE_PASSWORD') + keyAlias System.getenv('KEY_ALIAS') + keyPassword System.getenv('KEY_PASSWORD') + } + + } + + sourceSets { + test.java.srcDirs += 'src/test/java' + androidTest.java.srcDirs += 'src/androidTest/java' + } + + testOptions { + unitTests { + includeAndroidResources = true + returnDefaultValues = true + } + } + + compileSdkVersion 34 + + defaultConfig { + applicationId "org.devmiyax.yabasanshioro2" + minSdkVersion 24 + targetSdkVersion 34 + multiDexEnabled true + versionCode 110 + versionName '1.16.2' + multiDexEnabled true + vectorDrawables.useSupportLibrary = true + signingConfig signingConfigs.pro + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + javaCompileOptions { + annotationProcessorOptions { + arguments += ["room.schemaLocation": "$projectDir/schemas".toString()] + } + } + +/* + externalNativeBuild { + + // For ndk-build, instead use ndkBuild {} + cmake { + + //cd Passes optional arguments to CMake. + arguments "-DANDROID_ABI=armeabi-v7a","-DANDROID_NATIVE_API_LEVEL=19","-DYAB_PORTS=android", + "-DYAB_WANT_C68K=FALSE","-DYAB_WANT_ARM7=TRUE","-DYAB_WANT_DYNAREC_DEVMIYAX=TRUE", + "-DANDROID_FORCE_ARM_BUILD=FALSE","-DCMAKE_BUILD_TYPE=Release" + } + } + ndk { + // Specifies the ABI configurations of your native + // libraries Gradle should build and package with your APK. + abiFilters 'armeabi-v7a' + } +*/ + } + + buildTypes { + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + applicationVariants.all { variant -> + renameAPK(variant, defaultConfig, 'R') + } + firebaseCrashlytics { + nativeSymbolUploadEnabled true + unstrippedNativeLibsDir 'src/main/jniLibs' + } + ndk{ + debugSymbolLevel 'FULL' + } + resValue "string", "app_name", "Yaba Sanshiro 2" + } + pro { + //debuggable true + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + applicationIdSuffix ".pro" + versionNameSuffix '-PRO' + buildConfigField 'String', 'AUTHORITY', '"org.devmiyax.yabasanshioro2.pro.contentprovider"' + resValue "string", "app_name", "Yaba Sanshiro 2 Pro" + applicationVariants.all { variant -> + renameAPK(variant, defaultConfig, 'P') + } + firebaseCrashlytics { + nativeSymbolUploadEnabled true + unstrippedNativeLibsDir 'src/main/jniLibs' + } + ndk{ + debugSymbolLevel 'FULL' + } + } + debug { + debuggable true + testCoverageEnabled true + applicationIdSuffix ".debug" + versionNameSuffix '-DEBUG' + resValue "string", "app_name", "Yaba Sanshiro 2 debug" + buildConfigField 'String', 'AUTHORITY', '"org.devmiyax.yabasanshioro2.debug.contentprovider"' + packagingOptions { + doNotStrip "**/*/*.so" + } + firebaseCrashlytics { + nativeSymbolUploadEnabled true + //strippedNativeLibsDir 'src/main/jniLibs' + //unstrippedNativeLibsDir 'src/main/jniLibs' + } + + } + } + + buildFeatures { + viewBinding true + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + buildToolsVersion '34.0.0' + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } + lint { + abortOnError false + } + +/* + externalNativeBuild { + cmake { + path '../../../CMakeLists.txt' + } + } +*/ +} + +//crashlytics { +// enableNdk true +// androidNdkOut 'src/main/jniLibs' +// androidNdkLibsOut 'src/main/jniLibs' +// manifestPath 'src/main/AndroidManifest.xml' +//} + +def renameAPK(variant, defaultConfig, buildType) { + variant.outputs.all { + def formattedDate = new Date().format('yyMMdd') + outputFileName = "${applicationName}-V${variant.versionCode}-${variant.versionName}-${formattedDate}-${variant.name}.apk" + } +} + +allprojects { + repositories { + google() + jcenter() + mavenCentral() + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url 'http://fan-adn.github.io/nendSDK-Android-lib/library' } + + } +} + +task printVersionName { + doLast { + println android.defaultConfig.versionName + } +} + +//repositories { +// mavenCentral() +// maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } +// maven { url 'http://fan-adn.github.io/nendSDK-Android-lib/library' } +// maven { url 'https://maven.fabric.io/public' } +//} + +//repositories { +// mavenCentral() +// maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } +// maven { url 'http://fan-adn.github.io/nendSDK-Android-lib/library' } +// maven { url 'https://maven.fabric.io/public' } +//} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + //noinspection GradleCompatible + implementation platform('com.google.firebase:firebase-bom:33.1.2') + + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.documentfile:documentfile:1.0.1' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'androidx.activity:activity-ktx:1.9.1' + implementation 'androidx.leanback:leanback:1.2.0-alpha04' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.3.2' + implementation 'androidx.tvprovider:tvprovider:1.0.0' + implementation "androidx.window:window:1.3.0" + implementation("androidx.viewpager2:viewpager2:1.1.0") + + implementation 'com.google.firebase:firebase-core:21.1.1' + implementation 'com.google.firebase:firebase-auth:23.0.0' + implementation 'com.google.firebase:firebase-database:21.0.0' + implementation 'com.google.firebase:firebase-storage:21.0.0' + implementation 'com.google.firebase:firebase-ads:23.2.0' + implementation 'com.google.firebase:firebase-messaging:24.0.0' + implementation 'com.google.firebase:firebase-config:22.0.0' + implementation 'com.google.android.gms:play-services-analytics:18.1.0' + implementation 'com.firebaseui:firebase-ui-auth:7.2.0' + + + implementation 'com.github.bumptech.glide:glide:4.11.0' + implementation 'commons-io:commons-io:2.13.0' + implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' + implementation 'com.squareup.okhttp3:okhttp:4.11.0' + implementation 'com.google.code.gson:gson:2.10.1' + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'com.google.firebase:firebase-crashlytics-ktx' + implementation 'com.google.firebase:firebase-analytics-ktx' + implementation 'com.google.firebase:firebase-crashlytics-ndk' + //implementation 'net.cattaka:adapter-toolbox:0.5.2' + implementation "com.google.android.material:material:1.12.0" + implementation 'com.google.android.play:review-ktx:2.0.1' + + // Add the In-App Messaging dependency: + implementation 'com.google.firebase:firebase-inappmessaging-display:21.0.0' + + implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + implementation 'io.reactivex.rxjava2:rxjava:2.2.6' + + implementation "androidx.preference:preference-ktx:1.2.1" + + implementation "io.noties.markwon:core:4.1.0" + + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-inline:2.27.0' + testImplementation "org.hamcrest:hamcrest-all:1.3" + testImplementation "androidx.test.ext:junit-ktx:1.2.1" + testImplementation "androidx.test:core-ktx:1.6.1" + testImplementation "org.robolectric:robolectric:4.3.1" + testImplementation "androidx.arch.core:core-testing:2.2.0" + + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test:rules:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' + + + + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3" + + implementation "com.google.android.gms:play-services-games:23.2.0" + + implementation "org.apache.commons:commons-compress:1.21" + implementation "org.tukaani:xz:1.8" + + implementation "com.android.billingclient:billing-ktx:7.0.0" + + implementation 'com.frybits.harmony:harmony:1.1.11' + + implementation 'androidx.cardview:cardview:1.0.0' + + implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4' + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.4" + + def room_version = "2.6.1" + implementation("androidx.room:room-runtime:$room_version") + annotationProcessor("androidx.room:room-compiler:$room_version") + kapt "androidx.room:room-compiler:$room_version" + +} + +// ADD THIS AT THE BOTTOM +apply plugin: 'com.google.gms.google-services' +apply plugin: 'kotlin-android' + diff --git a/yabause/src/android/app/google-services.json b/yabause/src/android/app/google-services.json new file mode 100644 index 0000000000..56630bf473 --- /dev/null +++ b/yabause/src/android/app/google-services.json @@ -0,0 +1,385 @@ +{ + "project_info": { + "project_number": "1", + "firebase_url": "https://uoyabause.firebaseio.com", + "project_id": "uoyabause", + "storage_bucket": "uoyabause.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.devmiyax.yabasanshioro2" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.devmiyax.yabasanshioro2.debug" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.devmiyax.yabasanshioro2.pro" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.uoyabause.android" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.android", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.android", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.android", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + }, + "admob_app_id": "ca-app-pub-1~1" + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.uoyabause.uranus" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + }, + "admob_app_id": "ca-app-pub-1~2817605115" + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.uoyabause.uranus.debug" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus.debug", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus.debug", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1:android:1", + "android_client_info": { + "package_name": "org.uoyabause.uranus.pro" + } + }, + "oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus.pro", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus.pro", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "org.uoyabause.uranus.pro", + "certificate_hash": "1" + } + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "1-1-1-A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1-1.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "org.devmiyax.yabasanshiro" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/yabause/src/android/app/proguard-rules.pro b/yabause/src/android/app/proguard-rules.pro new file mode 100644 index 0000000000..909220863a --- /dev/null +++ b/yabause/src/android/app/proguard-rules.pro @@ -0,0 +1,29 @@ +-keepattributes *Annotation* +-keepattributes SourceFile,LineNumberTable +-keep public class * extends java.lang.Exception +-keep class com.crashlytics.** { *; } +-dontwarn com.crashlytics.** +-keep class com.activeandroid.** { *; } +-keep class com.activeandroid.**.** { *; } +-keep class * extends com.activeandroid.Model +-keep class * extends com.activeandroid.serializer.TypeSerializer +-keep public class org.uoyabause.android.YabauseRunnable.** { *; } +-keep class org.uoyabause.android.Yabause.** { *; } +-keepclassmembers class **.Yabause { *; } +-keep class com.google.protobuf.** { *; } +-dontwarn com.google.protobuf.** + + # Add this global rule + -keepattributes Signature + + # This rule will properly ProGuard all the model classes in + # the package com.yourcompany.models. Modify to fit the structure + # of your app. + -keepclassmembers class org.uoyabause.android.backup.BackupItem { + *; + } + + -keepclassmembers class org.uoyabause.android.cheat.CheatItem { + *; + } + diff --git a/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/AutoBackupManagerTest.kt b/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/AutoBackupManagerTest.kt new file mode 100644 index 0000000000..17afa624c4 --- /dev/null +++ b/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/AutoBackupManagerTest.kt @@ -0,0 +1,857 @@ +package org.uoyabause.android + +import android.os.Build +import android.util.Log +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseError +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.database.ValueEventListener +import com.google.firebase.storage.FirebaseStorage +import kotlinx.coroutines.runBlocking +import org.junit.After +import org.junit.Assert.* +import org.junit.Before +import org.junit.BeforeClass +import org.junit.Test +import org.junit.runner.RunWith +import org.uoyabause.android.AutoBackupManager.AutoBackupManagerListener +import org.uoyabause.android.phone.placeholder.PlaceholderContent +import java.io.File +import java.io.FileOutputStream +import java.lang.Thread.sleep +import java.util.Random + + +@RunWith(AndroidJUnit4::class) +class AutoBackupManagerTest { + + var testState = 0 + + fun waitAsync(){ + var timecount = 0 + val timeout = 3000 + timecount = 0 + while( testState == 0 ){ + sleep(10) + timecount += 1 + if( timecount > timeout ){ + assertNotNull("time out",null) + } + } + assertEquals("Fail async function", testState,1) + testState = 0 + } + + companion object { + var emuhost = "192.168.11.5" + lateinit var database : FirebaseDatabase + lateinit var storage : FirebaseStorage + @JvmStatic + @BeforeClass + fun setUpClass() { + + val context = InstrumentationRegistry.getInstrumentation().targetContext + if( Build.PRODUCT == "sdk_gphone_x86_64" ){ + emuhost = "10.0.2.2" + } + + FirebaseAuth.getInstance().useEmulator(emuhost, 9099) + FirebaseAuth.getInstance() + .signInWithEmailAndPassword("devmiyax@gmail.com", "testpass01") + + val cu = FirebaseAuth.getInstance().currentUser + + var testState = 0 + database = FirebaseDatabase.getInstance() + database.useEmulator(emuhost, 9000) + //database.getReference("user-posts").child(cu!!.uid).removeValue { error, ref -> testState = 1 } + //while( testState == 0 ){sleep(10) } + + storage = FirebaseStorage.getInstance() + storage.useEmulator(emuhost, 9199) + } + } + + @Before + fun setUp() { + } + + @After + fun tearDown() { + runBlocking { + } + } + + @Test + fun downloadBackupMemory() { + + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(AutoBackupManager.ConflictResult.CLOUD) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + onMainThread() + } + } + + assertNotNull(FirebaseAuth.getInstance().currentUser) + val currentUser = FirebaseAuth.getInstance().currentUser + + clearTestData() + + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + // テストデータを送信 + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + + var outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + var premodtime = localFile.lastModified() + + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + // テストデータのファイル名を取得 + val backupReference = database.getReference("user-posts").child(currentUser!!.uid) + .child("backupHistory") + + testState = 0 + var filename = "" + backupReference.orderByChild("date") + .limitToLast(1) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(dataSnapshot: DataSnapshot) { + if (dataSnapshot.exists()) { + val latestData = dataSnapshot.children.last().value as Map<*, *> + assertNotNull(latestData["filename"]) + filename = latestData["filename"] as String + testState = 1 + + } + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + + } + }) + + waitAsync() + + // テスト、テストデータをローカルに取得できることを確認 + val destinationDirectory = File(YabauseStorage.storage.getMemoryPath("/")) + testTarget.isOnSubscription = true + testTarget.downloadBackupMemory( + filename, + FirebaseAuth.getInstance().currentUser!!, + destinationDirectory, + null + ){ + + } + } + + + @Test + fun uploadBackupMemory() { + + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(AutoBackupManager.ConflictResult.CLOUD) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + + if( result == AutoBackupManager.SyncResult.FAIL ) { + testState = -1 + } + + onMainThread() + } + } + + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + clearTestData() + + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + val localUpdateTime = localFile.lastModified() + + testTarget.isOnSubscription = true + + testState = 0 + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + val backupReference = database.getReference("user-posts").child(currentUser.uid) + .child("backupHistory") + + testState = 0 + backupReference.orderByChild("date") + .limitToLast(1) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(dataSnapshot: DataSnapshot) { + if (dataSnapshot.exists()) { + val latestData = dataSnapshot.children.last().value as Map<*, *> + assertNotNull(latestData["deviceName"]) + assertEquals(latestData["deviceName"], android.os.Build.MODEL ) + assertNotNull(latestData["date"]) + assertEquals(latestData["date"], localUpdateTime ) + assertNotNull(latestData["md5"]) + assertNotNull(latestData["filename"]) + testState = 1 + + } + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + + } + }) + + waitAsync() + } + + fun generateRandomByteArray(size: Int): ByteArray { + val byteArray = ByteArray(size) + Random().nextBytes(byteArray) + return byteArray + } + + private fun clearTestData(){ + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + testState = 0 + database.getReference("user-posts").child(currentUser!!.uid).removeValue().addOnCompleteListener { + testState = 1 + } + waitAsync() + + testState = 0 + val storageRef = storage.reference.child(currentUser.uid) + storageRef.listAll() + .addOnSuccessListener { listResult -> + var delcount = 0 + val sz = listResult.items.size + if( sz > 0 ) { + listResult.items.forEach { item -> + item.delete() + .addOnSuccessListener { + // ファイルの削除に成功した場合の処理 + delcount++ + if (delcount >= sz) { + testState = 1 + } + + } + .addOnFailureListener { exception -> + // ファイルの削除に失敗した場合の処理 + delcount++ + if (delcount >= sz) { + testState = 1 + } + + } + } + }else{ + testState = 1 + } + } + .addOnFailureListener { exception -> + // ディレクトリ内のファイルの一覧取得に失敗した場合の処理 + } + waitAsync() + + } + + + @Test + fun syncDownload() { + /* + クラウドにあるものが新しい場合アップロードされる + */ + var testmode = 0 + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(AutoBackupManager.ConflictResult.CLOUD) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + + if( result == AutoBackupManager.SyncResult.FAIL ) { + testState = -1 + return + }else { + + if( testmode == 1) { + testState = 1 + } + + } + onMainThread() + } + } + + clearTestData() + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + + var outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + var premodtime = localFile.lastModified() + + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + // 現在のデータをアップロードする + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + // ファイルの日付を古くする + //var modtime = System.currentTimeMillis() + outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + localFile.setLastModified(premodtime - 105000) + + val lmd5 = testTarget.escapeFileName(testTarget.calculateMD5(localFile)) + + // テストしたい処理、クラウドのほうが古いのでダウンロードされるはず + testState = 0 + testmode = 1 + testTarget.syncBackup() + waitAsync() + + val dlocalFile = File(mem) + val localUpdateTime = dlocalFile.lastModified() + + assertEquals("Confirm if same time as download time",localUpdateTime,premodtime) + //assertEquals("Confirm if same md5",md5,lmd5) + + } + + @Test + fun syncUpload() { + /* + クラウドにあるものが古い場合アップロードされる + */ + + var testmode = 0 + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(AutoBackupManager.ConflictResult.CLOUD) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + + if( result == AutoBackupManager.SyncResult.FAIL ) { + testState = -1 + return + }else { + + if( testmode == 1) { + testState = 1 + } + + } + onMainThread() + } + } + + clearTestData() + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + + var outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + // 現在のデータをアップロードする + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + //一秒進める + sleep(1000) + + outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + // 新しくなったファイルを送信する + var modtime = System.currentTimeMillis() + localFile.setLastModified(modtime) + modtime = localFile.lastModified() + val lmd5 = testTarget.escapeFileName(testTarget.calculateMD5(localFile)) + + // テストしたい処理、クラウドのほうが古いのでアップロードされるはず + testState = 0 + testmode = 1 + testTarget.syncBackup() + waitAsync() + + // アップロードされたことを確認する + val backupReference = database.getReference("user-posts").child(currentUser.uid) + .child("backupHistory") + testState = 0 + var localUpdateTime = 0L + var md5 = "" + backupReference.orderByChild("date") + .limitToLast(1) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(dataSnapshot: DataSnapshot) { + if (dataSnapshot.exists()) { + val latestData = dataSnapshot.children.last().value as Map<*, *> + localUpdateTime = latestData["date"] as Long + md5 = latestData["md5"] as String + testState = 1 + } + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + + } + }) + + waitAsync() + assertEquals("Confirm if same time as upload time",localUpdateTime,modtime) + assertEquals("Confirm if same md5",md5,lmd5) + } + + @Test + fun syncConflictLocal() { + syncConflict(AutoBackupManager.ConflictResult.LOCAL) + } + + @Test + fun syncConflictCloud() { + syncConflict(AutoBackupManager.ConflictResult.CLOUD) + } + + fun syncConflict( conflictMode: AutoBackupManager.ConflictResult) { + /* + 自分のデータがクラウドに上げる前に、ほかのデバイスがクラウドに上げてしまって、自分のデータを残すか、クラウドのデータを取得するか、ユーザーの判断が必要な状況 + */ + + var lmd5 = "" + var testmode = 0 + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(conflictMode) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + + if( result == AutoBackupManager.SyncResult.FAIL ) { + testState = -1 + return + }else { + + if( testmode == 1) { + testState = 1 + } + + } + onMainThread() + } + } + + clearTestData() + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + var outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + // 現在のデータをアップロードする + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + //5秒進める + sleep(5000) + + // 新しくなったファイルを送信する + outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + var modtime = localFile.lastModified() + if( conflictMode == AutoBackupManager.ConflictResult.CLOUD) { + lmd5 = testTarget.escapeFileName(testTarget.calculateMD5(localFile)) + } + + + // テストしたい処理、クラウドのほうが古いのでアップロードされるはず + testState = 0 + testmode = 1 + testTarget.syncBackup() + waitAsync() + + // この中間のファイルを作成する + + // 新しくなったファイルを送信する + outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + // 最新のファイルから3秒戻した時間にする + localFile.setLastModified(modtime - 3000) + + // テストがローカルモードのときはローカルファイルを正解データとする + if( conflictMode == AutoBackupManager.ConflictResult.LOCAL) { + lmd5 = testTarget.escapeFileName(testTarget.calculateMD5(localFile)) + modtime = localFile.lastModified() + } + + + // テストしたい処理、コンフリクトが検出される + testState = 0 + testmode = 1 + testTarget.syncBackup() + waitAsync() + + // ローカルのファイルがアップロードされたことを確認する + val backupReference = database.getReference("user-posts").child(currentUser.uid) + .child("backupHistory") + testState = 0 + var localUpdateTime = 0L + var md5 = "" + backupReference.orderByChild("date") + .limitToLast(1) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(dataSnapshot: DataSnapshot) { + if (dataSnapshot.exists()) { + val latestData = dataSnapshot.children.last().value as Map<*, *> + localUpdateTime = latestData["date"] as Long + md5 = latestData["md5"] as String + testState = 1 + } + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + + } + }) + + waitAsync() + if( conflictMode == AutoBackupManager.ConflictResult.CLOUD) { + assertEquals("Confirm if same time as upload time",localUpdateTime,modtime) + assertEquals("Confirm if same md5",md5,lmd5) + } else { + assertNotEquals("Confirm if same time as upload time", localUpdateTime, modtime) + assertEquals("Confirm if same md5", md5, lmd5) + } + } + + @Test + fun testRollBackMemory(){ + /* + ロールバックのテスト + */ + + var lmd5 = "" + var testmode = 0 + val listener = object : AutoBackupManagerListener { + override fun enable(): Boolean { + return true + } + + override fun getTitle(): String { + return "test title" + } + + override fun askConflict(onResult: (result: AutoBackupManager.ConflictResult) -> Unit) { + onResult(AutoBackupManager.ConflictResult.CLOUD) + } + + override fun onStartSyncBackUp() { + + } + + override fun onFinish( + result: AutoBackupManager.SyncResult, + message: String, + onMainThread: () -> Unit, + ) { + assertNotEquals( result, AutoBackupManager.SyncResult.FAIL) + + if( result == AutoBackupManager.SyncResult.FAIL ) { + testState = -1 + return + }else { + + if( testmode == 1) { + testState = 1 + } + + } + onMainThread() + } + } + + clearTestData() + val currentUser = FirebaseAuth.getInstance().currentUser + assertNotNull(currentUser) + + val mem = YabauseStorage.storage.getMemoryPath("memory.ram") + val localFile = File(mem) + val testTarget = AutoBackupManager( + listener + ) + testTarget.setDatabase(database) + testTarget.setStorage(storage) + + var outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + var modtime = localFile.lastModified() + lmd5 = testTarget.escapeFileName(testTarget.calculateMD5(localFile)) + + // 現在のデータをアップロードする + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + //5秒進める + sleep(5000) + + // 新しくなったファイルを送信する + outputStream = FileOutputStream(localFile) + outputStream.write(generateRandomByteArray(512) ) + outputStream.flush() + outputStream.close() + + testState = 0 + testTarget.isOnSubscription = true + testTarget.uploadBackupMemory(localFile,currentUser!!){ + testState = 1 + } + waitAsync() + + testState = 0 + val latestData = mutableListOf>() + val backupReference = database.getReference("user-posts").child(currentUser.uid) + .child("backupHistory") + + val query = backupReference.orderByChild("date") + query.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + val children = snapshot.children.reversed() + for (childSnapshot in children) { + var mapdata = (childSnapshot.value as Map<*, *>).toMutableMap() + mapdata["key"] = childSnapshot.key + latestData.add(mapdata) + + } + testState = 1 + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + } + }) + waitAsync() + + Log.d(this.javaClass.canonicalName,"before ${latestData.toString()}") + val expectedFilename = latestData.last()["filename"] + val expectedMd5 = latestData.last()["md5"] + + sleep(5000) + + testState = 0 + testmode = 1 + testTarget.rollBackMemory( latestData.last()["filename"] as String, latestData.last()["key"] as String ){ + + } + waitAsync() // syncBackupまで実行されるはず + + + + testState = 0 + latestData.clear() + query.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + val children = snapshot.children.reversed() + for (childSnapshot in children) { + var mapdata = (childSnapshot.value as Map<*, *>).toMutableMap() + mapdata["key"] = childSnapshot.key + latestData.add(mapdata) + + } + testState = 1 + } + override fun onCancelled(error: DatabaseError) { + testState = -1 + } + }) + waitAsync() + + Log.d(this.javaClass.canonicalName,"after ${latestData.toString()}") + + assertEquals("Confirm if last data to be top",expectedFilename,latestData.first()["filename"]) + assertEquals("Confirm if last md5 to be top",expectedMd5,latestData.first()["md5"]) + + } + + + +} \ No newline at end of file diff --git a/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/GameInfoTest.kt b/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/GameInfoTest.kt new file mode 100644 index 0000000000..c304d5c552 --- /dev/null +++ b/yabause/src/android/app/src/androidTest/java/org/uoyabause/android/GameInfoTest.kt @@ -0,0 +1,303 @@ +package org.uoyabause.android + +import androidx.room.Room +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.uoyabause.android.GameInfo +import java.io.BufferedWriter +import java.io.File +import java.io.FileWriter + +/* Copyright 2019 devMiyax(smiyaxdev@gmail.com) + + This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + YabaSanshiro is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with YabaSanshiro; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +@RunWith(AndroidJUnit4::class) +class GameInfoTest { + @Rule + var tempFolder: TemporaryFolder = TemporaryFolder() + + val db: GameInfoDatabase by lazy { + Room.databaseBuilder( + YabauseApplication.appContext, + GameInfoDatabase::class.java, "test-database" + ).build() + } + val dao: GameInfoDao by lazy { + db.gameInfoDao() + } + + @Before + fun cleanTable() { + //new Delete().from(GameInfo.class).execute(); + } + + @Test + fun removeInstance_ccdFilesAreRemoved() { + // SetUpTest + + try { + tempFolder.newFile("DoDonPachi (JP).ccd") + tempFolder.newFile("DoDonPachi (JP).img") + } catch (e: Exception) { + Assert.assertEquals(1, -1) + } + val len_before = tempFolder.root.list().size + Assert.assertEquals(2, len_before.toLong()) + + val game = GameInfo() + game.file_path = tempFolder.root.toString() + "/DoDonPachi (JP).ccd" + dao.insertAll(game) + + // Execute + game.removeInstance() + + // Validation + val list = dao.getAll() + val count = list.count() + Assert.assertEquals(0, count.toLong()) + + val len = tempFolder.root.list().size + Assert.assertEquals(0, len.toLong()) + } + + + @Test + fun removeInstance_mdsFilesAreRemoved() { + // SetUpTest + + try { + tempFolder.newFile("Doom (U).mds") + tempFolder.newFile("Doom (U).mdf") + } catch (e: Exception) { + Assert.assertEquals(1, -1) + } + val len_before = tempFolder.root.list().size + Assert.assertEquals(2, len_before.toLong()) + + val game = GameInfo() + game.file_path = tempFolder.root.toString() + "/Doom (U).mds" + dao.insertAll(game) + + // Execute + game.removeInstance() + + // Validation + val list = dao.getAll() + val count = list.count() + Assert.assertEquals(0, count.toLong()) + + val len = tempFolder.root.list().size + Assert.assertEquals(0, len.toLong()) + } + + + @Test + fun removeInstance_chdFilesAreRemoved() { + // SetUpTest + + try { + tempFolder.newFile("Assault Suit Leynos 2 (Japan).cue.chd") + } catch (e: Exception) { + Assert.assertEquals(1, -1) + } + val len_before = tempFolder.root.list().size + Assert.assertEquals(1, len_before.toLong()) + + val game = GameInfo() + game.file_path = tempFolder.root.toString() + "/Assault Suit Leynos 2 (Japan).cue.chd" + dao.insertAll(game) + + // Execute + game.removeInstance() + + // Validation + val list = dao.getAll() + val count = list.count() + Assert.assertEquals(0, count.toLong()) + + val len = tempFolder.root.list().size + Assert.assertEquals(0, len.toLong()) + } + + + @Test + fun removeInstance_cueFilesAreRemoved() { + // SetUpTest + + val f = File(tempFolder.root, "Assault Suit Leynos 2 (Japan).cue") + try { + val fww = FileWriter(f) + val fw = BufferedWriter(FileWriter(f)) + fw.write("CATALOG 0000000000000") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 01).bin\" BINARY") + fw.newLine() + fw.write("TRACK 01 MODE1/2352") + fw.newLine() + fw.write("INDEX 01 00:00:00") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 02).bin\" BINARY") + fw.newLine() + fw.write("TRACK 02 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:02:00") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 03).bin\" BINARY") + fw.newLine() + fw.write("TRACK 03 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 04).bin\" BINARY") + fw.newLine() + fw.write("TRACK 04 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 05).bin\" BINARY") + fw.newLine() + fw.write("TRACK 05 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 06).bin\" BINARY") + fw.newLine() + fw.write("TRACK 06 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 07).bin\" BINARY") + fw.newLine() + fw.write("TRACK 07 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 08).bin\" BINARY") + fw.newLine() + fw.write("TRACK 08 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 09).bin\" BINARY") + fw.newLine() + fw.write("TRACK 09 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 10).bin\" BINARY") + fw.newLine() + fw.write("TRACK 10 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 11).bin\" BINARY") + fw.newLine() + fw.write("TRACK 11 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 12).bin\" BINARY") + fw.newLine() + fw.write("TRACK 12 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 13).bin\" BINARY") + fw.newLine() + fw.write("TRACK 13 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.write("FILE \"Assault Suit Leynos 2 (Japan) (Track 14).bin\" BINARY") + fw.newLine() + fw.write("TRACK 14 AUDIO") + fw.newLine() + fw.write("INDEX 00 00:00:00") + fw.newLine() + fw.write("INDEX 01 00:01:74") + fw.newLine() + fw.close() + + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 01).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 02).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 03).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 04).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 05).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 06).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 07).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 08).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 09).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 10).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 11).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 12).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 13).bin") + tempFolder.newFile("Assault Suit Leynos 2 (Japan) (Track 14).bin") + + tempFolder.newFile("dmy.cue") + } catch (e: Exception) { + Assert.assertEquals(1, -1) + } + + val len_before = tempFolder.root.list().size + Assert.assertEquals(16, len_before.toLong()) + + val game = GameInfo() + game.file_path = tempFolder.root.toString() + "/Assault Suit Leynos 2 (Japan).cue" + dao.insertAll(game) + + // Execute + game.removeInstance() + + // Validation + val list = dao.getAll() + val count = list.count() + Assert.assertEquals(0, count.toLong()) + + val len = tempFolder.root.list().size + Assert.assertEquals(1, len.toLong()) + } +} \ No newline at end of file diff --git a/yabause/src/android/app/src/androidTest/java/org/uoyabause/yabasanshiro/ExampleInstrumentedTest.kt b/yabause/src/android/app/src/androidTest/java/org/uoyabause/yabasanshiro/ExampleInstrumentedTest.kt new file mode 100644 index 0000000000..468ac73d30 --- /dev/null +++ b/yabause/src/android/app/src/androidTest/java/org/uoyabause/yabasanshiro/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package org.devmiyax.yabasanshiro + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + //val appContext = InstrumentationRegistry.getInstrumentation().targetContext + //assertEquals("org.uoyabause.uranus.debug", appContext.packageName) + } +} diff --git a/yabause/src/android/app/src/debug/AndroidManifest.xml b/yabause/src/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..d1891aeeb1 --- /dev/null +++ b/yabause/src/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + diff --git a/yabause/src/android/app/src/debug/ic_launcher-playstore.png b/yabause/src/android/app/src/debug/ic_launcher-playstore.png new file mode 100644 index 0000000000..83e08d9416 Binary files /dev/null and b/yabause/src/android/app/src/debug/ic_launcher-playstore.png differ diff --git a/yabause/src/android/app/src/debug/ic_launcher-web.png b/yabause/src/android/app/src/debug/ic_launcher-web.png new file mode 100644 index 0000000000..292df7730d Binary files /dev/null and b/yabause/src/android/app/src/debug/ic_launcher-web.png differ diff --git a/yabause/src/android/app/src/debug/res/drawable/ic_launcher_background.xml b/yabause/src/android/app/src/debug/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..ca3826a46c --- /dev/null +++ b/yabause/src/android/app/src/debug/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..c4a603d4cc --- /dev/null +++ b/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..c4a603d4cc --- /dev/null +++ b/yabause/src/android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000..1674656dc3 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..4b203ae423 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000..ecf18e7016 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000..f6184facff Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..983446bd81 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000..caa56077d7 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..592547f8fb Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..c091179680 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..b9c3923004 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000..c58f2c0c9a Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..4c039cb45c Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..d7f4def2c7 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000..f551424b4c Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..21304ea7b3 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..97f8bb8c64 Binary files /dev/null and b/yabause/src/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/yabause/src/android/app/src/debug/res/values/ic_launcher_background.xml b/yabause/src/android/app/src/debug/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000..3d2b3810bb --- /dev/null +++ b/yabause/src/android/app/src/debug/res/values/ic_launcher_background.xml @@ -0,0 +1,23 @@ + + + + #B7BEC8 + \ No newline at end of file diff --git a/yabause/src/android/app/src/debug/web_hi_res_512.png b/yabause/src/android/app/src/debug/web_hi_res_512.png new file mode 100644 index 0000000000..11a1de3778 Binary files /dev/null and b/yabause/src/android/app/src/debug/web_hi_res_512.png differ diff --git a/yabause/src/android/app/src/main/AndroidManifest.xml b/yabause/src/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..e23f69072b --- /dev/null +++ b/yabause/src/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yabause/src/android/app/src/main/ic_launcher-playstore.png b/yabause/src/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000..c1e81c5a72 Binary files /dev/null and b/yabause/src/android/app/src/main/ic_launcher-playstore.png differ diff --git a/yabause/src/android/app/src/main/ic_launcher-web.png b/yabause/src/android/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000..c659843002 Binary files /dev/null and b/yabause/src/android/app/src/main/ic_launcher-web.png differ diff --git a/yabause/src/android/app/src/main/java/org/devmiyax/yabasanshiro/StartupActivity.kt b/yabause/src/android/app/src/main/java/org/devmiyax/yabasanshiro/StartupActivity.kt new file mode 100644 index 0000000000..47b12cdc58 --- /dev/null +++ b/yabause/src/android/app/src/main/java/org/devmiyax/yabasanshiro/StartupActivity.kt @@ -0,0 +1,190 @@ +/* Copyright 2019 devMiyax(smiyaxdev@gmail.com) + + This file is part of YabaSanshiro. + + YabaSanshiro is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + YabaSanshiro is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with YabaSanshiro; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +package org.devmiyax.yabasanshiro + +import android.app.ActivityManager +import android.app.UiModeManager +import android.content.Context +import android.content.Intent +import android.content.pm.ActivityInfo +import android.content.pm.PackageManager +import android.content.res.Configuration +import android.graphics.Point +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.method.LinkMovementMethod +import android.util.DisplayMetrics +import android.util.Log +import android.view.View +import android.widget.Button +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.preference.PreferenceManager +import androidx.window.layout.WindowMetricsCalculator +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.GoogleApiAvailability +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import org.uoyabause.android.SettingsActivity +import org.uoyabause.android.phone.GameSelectActivityPhone +import org.uoyabause.android.tv.GameSelectActivity + +class StartupActivity : AppCompatActivity() { + val TAG = "StartupActivity" + + private var mFirebaseRemoteConfig: FirebaseRemoteConfig? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_startup) + + val sharedPref = PreferenceManager.getDefaultSharedPreferences(this) + + val video = sharedPref.getString("pref_video", "-1") + if( video == "-1" ){ + + val editor = sharedPref.edit() + + var isPC = packageManager.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE") + // PC向けのデフォルト値 + if(isPC){ + editor.putString("pref_video", "1") // OpenGL + editor.putBoolean("pref_use_compute_shader", true) // ComputeShaderは使える + editor.putString("pref_polygon_generation", "0") // Tesselationがつかえない + }else{ + if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_LEVEL)) { + // Defulat is Vulkan! + editor.putString("pref_video", "4") + editor.putBoolean("pref_use_compute_shader", true) + editor.putString("pref_polygon_generation", "2") + } else { + val activityManager = + getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + val configurationInfo = activityManager.deviceConfigurationInfo + val supportsEs3 = configurationInfo.reqGlEsVersion >= 0x30000 + if (supportsEs3) { + editor.putString("pref_video", "1") + } else { + editor.putString("pref_video", "2") + } + editor.putBoolean("pref_use_compute_shader", false) + editor.putString("pref_polygon_generation", "0") + } + } + editor.apply() + + } + + + val aspectRateSetting = sharedPref.getString("pref_aspect_rate", "BAD") + if (aspectRateSetting == "BAD") { + val editor = sharedPref.edit() + val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this) + val currentBounds = windowMetrics.bounds + val width = currentBounds.width() + val height = currentBounds.height() + val arate = width.toDouble() / height.toDouble() + if (arate >= 1.21 && arate <= 1.34) { + editor.putString("pref_aspect_rate", "3") + } else { + editor.putString("pref_aspect_rate", "0") + } + editor.apply() + } + + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + val googleAPI = GoogleApiAvailability.getInstance() + val resultCode = googleAPI.isGooglePlayServicesAvailable(this) + if (resultCode != ConnectionResult.SUCCESS) { + Log.e(TAG, "This device is not supported.") + } + // Log.d(TAG, "InstanceID token: " + FirebaseInstanceId.getInstance().token) + val auth = FirebaseAuth.getInstance() + if (auth.currentUser != null) { + // already signed in + } else { + // not signed in + } + + val r = Runnable { + mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance() + mFirebaseRemoteConfig!!.setDefaultsAsync(R.xml.config) + val cacheExpiration: Long = 3600 // 1 hour in seconds. + mFirebaseRemoteConfig!!.fetch(cacheExpiration) + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + mFirebaseRemoteConfig!!.fetchAndActivate() + } + } + + val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager + val sharedPrefLocal = PreferenceManager.getDefaultSharedPreferences(this@StartupActivity) + val tvmode = sharedPrefLocal.getBoolean("pref_force_androidtv_mode", false) + val i: Intent + if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION || tvmode) { + i = Intent(this@StartupActivity, GameSelectActivity::class.java) + Log.d(TAG, "executing: GameSelectActivity") + } else { + i = Intent(this@StartupActivity, GameSelectActivityPhone::class.java) + Log.d(TAG, "executing: GameSelectActivityPhone") + } + + val sargs = intent.dataString + if (sargs != null) { + Log.d(TAG, "getDataString = $sargs") + if (sargs.contains("//login")) { + i.putExtra("showPin", true) + } + } + val args = intent.data + if (args != null && !args.pathSegments.isEmpty()) { + Log.d(TAG, "getData = $args") + i.data = args + } + startActivity(i) + return@Runnable + } + + val prefs = getSharedPreferences("private", Context.MODE_PRIVATE) + val agreed = prefs.getBoolean("agreed", false) + + val v = findViewById(R.id.agree) + if (agreed) { + v.visibility = View.GONE + Handler(Looper.getMainLooper()).postDelayed(r, 2000) + } else { + + val t2 = findViewById(R.id.agree_text) + t2.movementMethod = LinkMovementMethod.getInstance() + + val b = findViewById + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yabause/src/ios/uoyabause/uoyabause/DraggableCircleView.swift b/yabause/src/ios/uoyabause/uoyabause/DraggableCircleView.swift new file mode 100644 index 0000000000..ab45c821e0 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/DraggableCircleView.swift @@ -0,0 +1,137 @@ +import UIKit + +protocol DraggableCircleViewDelegate: AnyObject { + func onChangeTouchPos(x: UInt8, y:UInt8 ) +} + +func convertDoubleToUInt8(_ value: Double) -> UInt8 { + if value < Double(UInt8.min) { + return UInt8.min + } else if value > Double(UInt8.max) { + return UInt8.max + } else { + return UInt8(value) + } +} + +class DraggableCircleView: UIView { + private var circleCenter: CGPoint = .zero + private var initialCircleCenter: CGPoint = .zero + private var currentPos: CGPoint = .zero + private var isDragging = false + private var inMaxPoint = false + private let maxDistance: CGFloat = 55 // 中心点からの最大距離 + private let feedbackGenerator = UIImpactFeedbackGenerator(style: .medium) + + weak var delegate: DraggableCircleViewDelegate? + + override init(frame: CGRect) { + super.init(frame: frame) + setup() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setup() + } + + + private func setup() { + backgroundColor = .clear + circleCenter = CGPoint(x: bounds.midX, y: bounds.midY) + initialCircleCenter = circleCenter + let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:))) + addGestureRecognizer(panGesture) + } + + override func layoutSubviews() { + super.layoutSubviews() + // ビューのサイズや位置が変わったときにcircleCenterを更新 + circleCenter = CGPoint(x: bounds.midX, y: bounds.midY) + initialCircleCenter = circleCenter + setNeedsDisplay() + } + + override func draw(_ rect: CGRect) { + guard let context = UIGraphicsGetCurrentContext() else { return } + + // 半透明のグレー色を設定 (アルファ値を0.5に設定) + let semiTransparentGray = UIColor.gray.withAlphaComponent(0.5).cgColor + + context.setFillColor(semiTransparentGray) + context.addEllipse(in: CGRect(x: circleCenter.x - 50, y: circleCenter.y - 50, width: 100, height: 100)) + context.fillPath() + } + + @objc private func handlePan(_ gesture: UIPanGestureRecognizer) { + let translation = gesture.translation(in: self) + if gesture.state == .began { + let touchLocation = gesture.location(in: self) + let distance = hypot(touchLocation.x - circleCenter.x, touchLocation.y - circleCenter.y) + if distance <= 50 { + isDragging = true + let x:UInt8 = 128 + let y:UInt8 = 128 +// print("c: \(circleCenter.x-initialCircleCenter.x), \(circleCenter.y-initialCircleCenter.y) s: \(x), \(y)") + delegate?.onChangeTouchPos(x: x, y: y) + } + + } else if gesture.state == .changed && isDragging { + var newCenter = CGPoint(x: circleCenter.x + translation.x, y: circleCenter.y + translation.y) + let distanceFromCenter = hypot(newCenter.x - bounds.midX, newCenter.y - bounds.midY) + if distanceFromCenter > maxDistance { + let angle = atan2(newCenter.y - bounds.midY, newCenter.x - bounds.midX) + newCenter = CGPoint(x: bounds.midX + maxDistance * cos(angle), y: bounds.midY + maxDistance * sin(angle)) + + + if( inMaxPoint == false ){ + switch UIDevice.current.feedbackSupportLevel + { + case .feedbackGenerator: + self.feedbackGenerator.impactOccurred() + case .basic, .unsupported: + UIDevice.current.vibrate() + } + inMaxPoint = true + } + + }else{ + inMaxPoint = false + } + circleCenter = newCenter + + // 相対位置を計算 + let relativeX = circleCenter.x - initialCircleCenter.x + let relativeY = circleCenter.y - initialCircleCenter.y + + // 半径128の同心円にスケーリング + let scaledX = (relativeX / maxDistance) * 128.0 + let scaledY = (relativeY / maxDistance) * 128.0 + + // UInt8に変換 + let x = convertDoubleToUInt8(Double(scaledX) + 128.0) + let y = convertDoubleToUInt8(Double(scaledY) + 128.0) + + //print("c: \(relativeX), \(relativeY) s: \(x), \(y)") + delegate?.onChangeTouchPos(x: x, y: y) + + + gesture.setTranslation(.zero, in: self) + setNeedsDisplay() + } else if gesture.state == .ended || gesture.state == .cancelled { + isDragging = false + // アニメーションで中心点に戻す(イージングをcurveEaseOutに設定) + UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseOut, animations: { + self.circleCenter = CGPoint(x: self.bounds.midX, y: self.bounds.midY) + self.setNeedsDisplay() + }, completion: nil) + + let x:UInt8 = 128 + let y:UInt8 = 128 + //print("c: \(circleCenter.x-initialCircleCenter.x), \(circleCenter.y-initialCircleCenter.y) s: \(x), \(y)") + delegate?.onChangeTouchPos(x: x, y: y) + + + } + } +} diff --git a/yabause/src/ios/uoyabause/uoyabause/FileSelectController.swift b/yabause/src/ios/uoyabause/uoyabause/FileSelectController.swift new file mode 100644 index 0000000000..cbd2d25866 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/FileSelectController.swift @@ -0,0 +1,600 @@ +// +// FileSelectController.swift +// uoyabause +// +// Created by MiyamotoShinya on 2016/08/27. +// Copyright © 2016年 devMiyax. All rights reserved. +// + +import Foundation +import UIKit +import Kingfisher +#if FREE_VERSION +import GoogleMobileAds +#endif + +class GameItemCell: UICollectionViewCell { + let titleLabel = UILabel() + let imageView = UIImageView() + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var isSelected: Bool { + didSet { + contentView.backgroundColor = isSelected ? UIColor.lightGray : UIColor.white + } + } + + private func setupViews() { + // ImageViewの設定 + imageView.contentMode = .scaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview(imageView) + + // TitleLabelの設定 + titleLabel.textAlignment = .center + titleLabel.numberOfLines = 0 + titleLabel.lineBreakMode = .byWordWrapping + titleLabel.translatesAutoresizingMaskIntoConstraints = false + titleLabel.font = UIFont.systemFont(ofSize: 14) + contentView.addSubview(titleLabel) + } + + private func setupConstraints() { + // ImageViewの制約 + NSLayoutConstraint.activate([ + imageView.topAnchor.constraint(equalTo: contentView.topAnchor), + imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + imageView.heightAnchor.constraint(equalToConstant: 100) + ]) + + // TitleLabelの制約 + NSLayoutConstraint.activate([ + titleLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor), + titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) + + ]) + } +} + + +class FileSelectController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout, UISearchBarDelegate, UISearchResultsUpdating { + +#if FREE_VERSION + var bannerView: GADBannerView! +#endif + + var file_list: [GameInfo] = [] + var filteredFiles: [GameInfo] = [] + var selected_file_path: String = "" + var columns = 3.0 + var searchController: UISearchController! + var collectionView: UICollectionView! + + var completionHandler: ((String?) -> Void)? + + var activityIndicator: UIActivityIndicatorView! + var blurEffectView: UIVisualEffectView! + var isStandalone: Bool = false + +#if FREE_VERSION + func addBannerViewToView(_ bannerView: GADBannerView) { + bannerView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(bannerView) + view.addConstraints( + [NSLayoutConstraint(item: bannerView, + attribute: .bottom, + relatedBy: .equal, + toItem: view.safeAreaLayoutGuide, + attribute: .bottom, + multiplier: 1, + constant: 0), + NSLayoutConstraint(item: bannerView, + attribute: .centerX, + relatedBy: .equal, + toItem: view, + attribute: .centerX, + multiplier: 1, + constant: 0) + ]) + } + +#endif + + + func setupCollectionViewLayout(columns: CGFloat) { + self.columns = columns + let layout = UICollectionViewFlowLayout() + layout.sectionInset = UIEdgeInsets(top: 6, left: 0, bottom: 0, right: 0) // 上に6ptの余裕 + let spacing: CGFloat = 10 // アイテム間のスペース + let totalSpacing = spacing * (columns - 1) + 20 // 合計のスペース + let width = (view.frame.width - totalSpacing) / columns + layout.itemSize = CGSize(width: width, height: width) + layout.minimumLineSpacing = spacing + layout.minimumInteritemSpacing = spacing + collectionView.collectionViewLayout = layout + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + coordinator.animate(alongsideTransition: { _ in + // デバイスの向きに応じて列数を調整 + if UIDevice.current.orientation.isLandscape { + self.columns = 5 + // 横画面の時は4列 + self.setupCollectionViewLayout(columns: 5) + } else { + self.columns = 3 + // 縦画面の時は3列 + self.setupCollectionViewLayout(columns: 3) + } + self.collectionView.reloadData() + }, completion: nil) + } + + let searchBar = UISearchBar() + + override func viewDidAppear(_ animated: Bool) { + updateDoc() + } + + override func viewDidLoad(){ + super.viewDidLoad() + + // デリゲートとデータソースの設定 + let layout = UICollectionViewFlowLayout() + collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(GameItemCell.self, forCellWithReuseIdentifier: "GameItemCell") + collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "files") + + + searchBar.delegate = self + searchBar.placeholder = "Search" + + // UISearchBar と UICollectionView を UIStackView に追加 + let stackView = UIStackView(arrangedSubviews: [searchBar, collectionView]) + stackView.axis = .vertical + stackView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(stackView) + + // Auto Layout constraints + NSLayoutConstraint.activate([ + stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + + + // デバイスの向きに応じて列数を調整 + if UIDevice.current.orientation.isLandscape { + // 横画面の時は4列 + self.setupCollectionViewLayout(columns: 5) + } else { + // 縦画面の時は3列 + self.setupCollectionViewLayout(columns: 3) + } + + // Blur Effect Viewの設定 + let blurEffect = UIBlurEffect(style: .dark) + blurEffectView = UIVisualEffectView(effect: blurEffect) + blurEffectView.frame = self.view.bounds + blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + blurEffectView.isHidden = true + self.view.addSubview(blurEffectView) + + // Activity Indicatorの設定 + activityIndicator = UIActivityIndicatorView(style: .large) + activityIndicator.center = self.view.center + activityIndicator.hidesWhenStopped = true + self.view.addSubview(activityIndicator) + +#if FREE_VERSION + let viewWidth = view.frame.inset(by: view.safeAreaInsets).width + + // Here the current interface orientation is used. Use + // GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth or + // GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth if you prefer to load an ad of a + // particular orientation, + let adaptiveSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth) + bannerView = GADBannerView(adSize: adaptiveSize) + + + addBannerViewToView(bannerView) + + bannerView.adUnitID = "ca-app-pub-3940256099942544/2435281174" + + if let path = Bundle.main.path(forResource: "secrets", ofType: "plist"), + let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject], + let bunnerid = dict["bunnerid"] as? String { + bannerView.adUnitID = bunnerid + } + + + let bannerHeight = bannerView.frame.height + let safeAreaHeight = view.safeAreaLayoutGuide.layoutFrame.height + let newGameVCHeight = safeAreaHeight - bannerHeight + + // Adjust the height of gameVC + collectionView?.frame.size.height = newGameVCHeight + + bannerView.rootViewController = self + bannerView.delegate = self + + bannerView.load(GADRequest()) +#endif + + // Activity Indicatorをビュー階層の一番上に持ってくる + self.view.bringSubviewToFront(activityIndicator) + if( isStandalone ){ + setupNavigationBar() + } + } + + private func setupNavigationBar() { + let closeButton = UIBarButtonItem(title: NSLocalizedString("Close", comment: "Close Dialoig"), style: .plain, target: self, action: #selector(closeButtonTapped)) + self.view.backgroundColor = .systemBackground + navigationItem.leftBarButtonItem = closeButton + title = NSLocalizedString("Change Disk", comment: "Chnge the game disk") + } + + @objc private func closeButtonTapped() { + dismiss(animated: true) { + self.completionHandler?(nil) + } + } + + // UISearchBarDelegate methods + func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { + if searchText.isEmpty { + filteredFiles = file_list + } else { + filteredFiles = file_list.filter { ($0.displayName ?? "").localizedCaseInsensitiveContains(searchText) } + } + collectionView.reloadData() + } + + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { + // Search button clicked + searchBar.resignFirstResponder() + } + + + func updateSearchResults(for searchController: UISearchController) { + let searchText = searchController.searchBar.text ?? "" + if searchText.isEmpty { + filteredFiles = file_list + } else { + filteredFiles = file_list.filter { ($0.displayName ?? "").localizedCaseInsensitiveContains(searchText) } + } + collectionView.reloadData() + } + + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return filteredFiles.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GameItemCell", for: indexPath) as! GameItemCell + let gameInfo = filteredFiles[indexPath.row] + cell.titleLabel.text = gameInfo.displayName + // Kingfisherを使用して画像を設定 + if let imageUrl = gameInfo.imageUrl, let url = URL(string: imageUrl) { + cell.imageView.kf.setImage(with: url, placeholder: UIImage(named: "missing")) + } + return cell + } + + func calculateCellHeight(for indexPath: IndexPath) -> CGFloat { + let gameInfo = filteredFiles[indexPath.row] + if let text = gameInfo.displayName{ + let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14)] + + let spacing: CGFloat = 10 // アイテム間のスペース + let totalSpacing = spacing * (columns - 1) + 20 // 合計のスペース + let width = (view.frame.width - totalSpacing) / columns + + let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) + let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin) + let estimatedRect = NSString(string: text).boundingRect(with: size, options: options, attributes: attributes, context: nil) + return estimatedRect.height + 20 + 100// テキストの上下にマージンを追加 + }else{ + return 120 + } + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + // アイテムのサイズを設定 + let spacing: CGFloat = 10 // アイテム間のスペース + let totalSpacing = spacing * (columns - 1) + 20 // 合計のスペース + let width = (view.frame.width - totalSpacing) / columns + + let height = calculateCellHeight(for: indexPath) + return CGSize(width: width, height: height) + } + + func addSkipBackupAttributeToItemAtURL(url: URL) throws { + var url = url + var resourceValues = URLResourceValues() + resourceValues.isExcludedFromBackup = true + try url.setResourceValues(resourceValues) + } + + func excludeDirectoryFromBackup(directoryURL: URL) throws { + try addSkipBackupAttributeToItemAtURL(url: directoryURL) + + let fileManager = FileManager.default + let enumerator = fileManager.enumerator(at: directoryURL, includingPropertiesForKeys: nil) + + while let fileURL = enumerator?.nextObject() as? URL { + try addSkipBackupAttributeToItemAtURL(url: fileURL) + } + } + + func getAllFilesRecursively(atPath path: String, manager: FileManager) -> [String] { + var allFiles: [String] = [] + do { + let contents = try manager.contentsOfDirectory(atPath: path) + for item in contents { + let fullPath = (path as NSString).appendingPathComponent(item) + var isDir: ObjCBool = false + if manager.fileExists(atPath: fullPath, isDirectory: &isDir) { + if isDir.boolValue { + // If it's a directory, recurse into it + allFiles.append(contentsOf: getAllFilesRecursively(atPath: fullPath, manager: manager)) + } else { + // If it's a file, add it to the list + allFiles.append(fullPath) + } + } + } + } catch { + print("Error reading contents of directory: \(error)") + } + return allFiles + } + + func checkLimitation() -> Bool { +#if FREE_VERSION // For free + + var check = true + + if self.file_list.count >= 3 { + check = false + } + + if check == false { + // アラートを表示して有料版に誘導する + DispatchQueue.main.async { + let alert = UIAlertController( + title: NSLocalizedString("Upgrade Required", comment: "Title for the upgrade alert"), + message: NSLocalizedString("You have reached the maximum number of files for the free version. Please upgrade to the paid version to add more files.", comment: "Message indicating that the user needs to upgrade to the paid version to add more files."), + preferredStyle: .alert + ) + alert.addAction(UIAlertAction( + title: NSLocalizedString("Upgrade", comment: "Button title to upgrade to the paid version"), + style: .default, + handler: { _ in + if let url = URL(string: "https://apps.apple.com/app/id1549144351") { + UIApplication.shared.open(url) + } + } + )) + alert.addAction(UIAlertAction( + title: NSLocalizedString("Cancel", comment: "Button title to cancel the upgrade action"), + style: .cancel, + handler: nil + )) + self.present(alert, animated: true, completion: nil) + } + } + + return check +#else + return true +#endif + } + + func updateDoc(){ + + self.view.bringSubviewToFront(activityIndicator) + blurEffectView.isHidden = false + activityIndicator.startAnimating() + + // ドキュメントディレクトリをバックアップ対象外にする + do { + let documentsDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) + try self.excludeDirectoryFromBackup(directoryURL: documentsDirectory) + } catch { + print("Error excludiong directory") + } + + DispatchQueue.global(qos: .userInitiated).async { + + self.file_list.removeAll() + let manager = FileManager.default + let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String + + var count=0 + let all_file_list = self.getAllFilesRecursively(atPath: documentsPath, manager: manager) + for path in all_file_list { + print(path) + var isDir: ObjCBool = false + if manager.fileExists(atPath: path, isDirectory: &isDir) && !isDir.boolValue { + + do { + + // 拡張子がCHDの場合は、CHDからゲーム情報を取得 + if path.hasSuffix(".chd") { + if let buf = getGameinfoFromChd(path) { + let data = Data(bytes: buf, count: 256) + if let gi = getGameInfoFromBuf(filePath: path, header: data) { + self.file_list.append(gi) + } + } + } + + // in the case of cue file + if path.hasSuffix(".cue") { + if let gi = try genGameInfoFromCUE(filePath: path) { + self.file_list.append(gi) + } + } + + // in the case of ccd file + if path.hasSuffix(".ccd") { + if let gi = try genGameInfoFromCCD(filePath: path) { + self.file_list.append(gi) + } + } + + // in the case of ccd file + if path.hasSuffix(".mds") { + if let gi = try genGameInfoFromMDS(filePath: path) { + self.file_list.append(gi) + } + } + + if self.checkLimitation() == false { + break + } + + }catch GameInfoError.isoFileNotFound(let message) { + + print(message) + + DispatchQueue.main.async { + // アラートを表示 + let alert = UIAlertController( + title: NSLocalizedString("Error", comment: "Title for the error alert"), + message: message, + preferredStyle: .alert + ) + + alert.addAction(UIAlertAction( + title: NSLocalizedString("OK", comment: "Default action button title"), + style: .default, + handler: nil + )) + + self.present(alert, animated: true, completion: nil) + } + + } catch { + print("An unexpected error occurred: \(error).") + } + + + } + } + self.file_list.sort { $0.displayName ?? "" < $1.displayName ?? "" } + self.filteredFiles = self.file_list + + // UIの更新をメインスレッドで実行 + DispatchQueue.main.async { [weak self] in + self?.collectionView.reloadData() // collectionViewのデータをリロード + self?.blurEffectView.isHidden = true + self?.activityIndicator.stopAnimating() + } + + } + + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + if self.isBeingDismissed { + completionHandler?(nil) + } + } + + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + + selected_file_path = filteredFiles[(indexPath as NSIndexPath).row].filePath! + + if( completionHandler != nil ){ + completionHandler?(selected_file_path) + dismiss(animated: true, completion: nil) + return + } + + performSegue(withIdentifier: "toGameView",sender: self) + } + + + func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) { + let cell = collectionView.cellForItem(at: indexPath) + UIView.animate(withDuration: 0.2) { + cell?.transform = CGAffineTransform(scaleX: 1.3, y: 1.3) + } + } + + func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) { + let cell = collectionView.cellForItem(at: indexPath) + UIView.animate(withDuration: 0.2) { + cell?.transform = .identity + } + } + + + // Segue 準備 + override func prepare(for segue: UIStoryboardSegue, sender: Any!) { + if (segue.identifier == "toGameView") { + let subVCmain: GameMainViewController = (segue.destination as? GameMainViewController)! + subVCmain.selectedFile = selected_file_path + } + } + + deinit { + // 通知の登録解除 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + } + + +} + + +#if FREE_VERSION +extension FileSelectController: GADBannerViewDelegate { + + func adjustGameVCHeightForBanner() { + guard let bannerView = bannerView else { return } + let bannerHeight = bannerView.frame.height + let safeAreaHeight = view.safeAreaLayoutGuide.layoutFrame.height + let newGameVCHeight = safeAreaHeight - bannerHeight + + // Adjust the height of gameVC + collectionView?.frame.size.height = newGameVCHeight + } + + // GADBannerViewDelegate method + func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { + adjustGameVCHeightForBanner() + } + +} +#endif diff --git a/yabause/src/ios/uoyabause/uoyabause/GameInfo.swift b/yabause/src/ios/uoyabause/uoyabause/GameInfo.swift new file mode 100644 index 0000000000..a3319ab338 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/GameInfo.swift @@ -0,0 +1,202 @@ +// +// GameInfo.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/14. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation + +struct GameInfo { + var filePath: String? + var makerId: String? + var productNumber: String? + var version: String? + var releaseDate: String? + var area: String? + var inputDevice: String? + var deviceInformation: String? + var gameTitle: String? + var displayName: String? + var imageUrl: String? +} + +enum GameInfoError: Error { + case isoFileNotFound(message: String) +} + +func genGameInfoFromIso(_ filePath: String?) -> GameInfo? { + guard let filePath = filePath else { return nil } + + do { + let fileURL = URL(fileURLWithPath: filePath) + let data = try Data(contentsOf: fileURL) + let buff = data.prefix(0xFF) + + return getGameInfoFromBuf(filePath: filePath, header: buff) + } catch { + print(error) + return nil + } +} + +func genGameInfoFromMDS(filePath: String?) throws -> GameInfo? { + guard let filePath = filePath else { return nil } + let isoFileName = filePath.replacingOccurrences(of: ".mds", with: ".mdf") + + let fileManager = FileManager.default + if !fileManager.fileExists(atPath: isoFileName) { + // ISOファイルが存在しない場合に例外を発行 + throw GameInfoError.isoFileNotFound(message: "ISO file \(isoFileName) does not exist.") + } + + + guard var tmp = genGameInfoFromIso(isoFileName) else { return nil } + tmp.filePath = filePath + return tmp +} + + +func genGameInfoFromCCD(filePath: String?) throws -> GameInfo? { + guard let filePath = filePath else { return nil } + let isoFileName = filePath.replacingOccurrences(of: ".ccd", with: ".img") + + let fileManager = FileManager.default + if !fileManager.fileExists(atPath: isoFileName) { + // ISOファイルが存在しない場合に例外を発行 + throw GameInfoError.isoFileNotFound(message: "ISO file \(isoFileName) does not exist.") + } + + + guard var tmp = genGameInfoFromIso(isoFileName) else { return nil } + tmp.filePath = filePath + return tmp +} + + +func genGameInfoFromCUE(filePath: String?) throws -> GameInfo? { + guard let filePath = filePath else { return nil } + let file = URL(fileURLWithPath: filePath) + let dirName = file.deletingLastPathComponent().path + var isoFileName = "" + + do { + let fileContent = try String(contentsOf: file, encoding: .utf8) + let lines = fileContent.split(separator: "\n") + + for line in lines { + let pattern = "FILE \"(.*)\"" + if let range = line.range(of: pattern, options: .regularExpression) { + isoFileName = String(line[range]) + isoFileName = isoFileName.replacingOccurrences(of: "FILE \"", with: "").replacingOccurrences(of: "\"", with: "") + break + } + } + + if isoFileName.isEmpty { + throw GameInfoError.isoFileNotFound(message: "ISO file does not exist.") + } + } catch { + print(error) + return nil + } + + if !dirName.isEmpty { + isoFileName = (dirName as NSString).appendingPathComponent(isoFileName) + + let fileManager = FileManager.default + if !fileManager.fileExists(atPath: isoFileName) { + // ISOファイルが存在しない場合に例外を発行 + throw GameInfoError.isoFileNotFound(message: "ISO file \(isoFileName) does not exist.") + } + } + + guard var tmp = genGameInfoFromIso(isoFileName) else { return nil } + tmp.filePath = filePath + return tmp +} + + +func getGameInfoFromBuf(filePath: String?, header: Data) -> GameInfo? { + guard let filePath = filePath, !header.isEmpty else { return nil } + + let checkStr = "SEGA ".data(using: .utf8)! + guard let startIndex = header.range(of: checkStr)?.lowerBound else { return nil } + + var gameInfo = GameInfo() + gameInfo.filePath = filePath + + let charset = String.Encoding.shiftJIS // MS932に相当 + + if let makerIdData = header.subdata(in: startIndex+0x10..= 2 { + let japaneseTitle = titles[0].replacingOccurrences(of: "J:", with: "").trimmingCharacters(in: .whitespaces) + let englishTitle = titles[1].trimmingCharacters(in: .whitespaces) + + if Locale.current.language.languageCode?.identifier == "ja" { + //cell.titleLabel.text = japaneseTitle + gameInfo.displayName = japaneseTitle + } else { + //cell.titleLabel.text = englishTitle + gameInfo.displayName = englishTitle + } + } else { + gameInfo.displayName = gameInfo.gameTitle + } + + if( gameInfo.deviceInformation != "CD-1/1" ){ + gameInfo.displayName = (gameInfo.displayName ?? "") + " " + (gameInfo.deviceInformation ?? "") + } + + + + return gameInfo +} + +extension Data { + func string(using encoding: String.Encoding) -> String? { + return String(data: self, encoding: encoding) + } +} diff --git a/yabause/src/ios/uoyabause/uoyabause/GameMainViewController.swift b/yabause/src/ios/uoyabause/uoyabause/GameMainViewController.swift new file mode 100644 index 0000000000..ba673982ff --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/GameMainViewController.swift @@ -0,0 +1,199 @@ +// +// GameMainViewController.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/21. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation +import UIKit + + + +class GameMainViewController: UIViewController +{ + enum MenuState { + case opened + case closed + } + + private var menuState : MenuState = .closed + + var selectedFile = "" + private var gameVC: GameViewController? + let menuVC = MenuViewController() + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if let gameVC = segue.destination as? GameViewController { + self.gameVC = gameVC + gameVC.selectedFile = self.selectedFile + self.gameVC?.gdelegate = self + } + } + + + override func viewDidLoad() { + super.viewDidLoad() + menuVC.delegate = self + view.backgroundColor = .black + addChild(menuVC) + view.addSubview(menuVC.view) + menuVC.didMove(toParent: self) + view.sendSubviewToBack(menuVC.view) + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + // landscapeフラグに応じて画面の向きを設定 + let ud = UserDefaults.standard + let landscape = ud.bool(forKey: "landscape") + + if landscape { + return .landscape + } else { + return .all + } + } + + override var prefersHomeIndicatorAutoHidden: Bool { + return true + } + + //@available(iOS 11, *) + override var childForHomeIndicatorAutoHidden: UIViewController? { + return nil + } +} + +extension GameMainViewController: GameViewControllerDelegate { + + func didTapMenuButton() { + // Animate the menu + // print("tap the menu") + + if( menuState == .opened ){ + self.gameVC?.isPaused = false + } + toggleMenu( completion: nil ) + } + + func toggleMenu( completion: (() -> Void)? ){ + switch menuState { + case .closed: + + self.gameVC?.isPaused = true + + // open it + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut) { + + self.gameVC?.view.frame.origin.x = 240 //a(self.gameVC?.view.frame.size.width ?? 100) - 100 + + }completion:{ [weak self] done in + if done { + self?.menuState = .opened + completion?() + } + } + + case .opened: + + + // close it + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut) { + + self.gameVC?.view.frame.origin.x = 0 + + }completion:{ [weak self] done in + if done { + self?.menuState = .closed + DispatchQueue.main.async { + completion?() + } + } + } + } + } +} + + +extension GameMainViewController: MenuViewControllerDelegate { + func didSelect(menuItem: MenuViewController.MenuOptions) { + toggleMenu { [weak self] in + + var doNotPause = false + switch menuItem { + case .exit: + + // アラートコントローラの作成 + let alertController = UIAlertController( + title: NSLocalizedString("Exit Confirmation", comment: "Title for exit confirmation alert"), + message: NSLocalizedString("Are you sure you want to exit?", comment: "Message asking if the user is sure about exiting"), + preferredStyle: .alert + ) + + // "Yes"ボタンの追加 + let yesAction = UIAlertAction( + title: NSLocalizedString("Yes", comment: "Confirm action to exit the application"), + style: .default + ) { action in + + enterBackGround() + exit(0) + } + alertController.addAction(yesAction) + + // "No"ボタンの追加 + let noAction = UIAlertAction( + title: NSLocalizedString("No", comment: "Cancel the exit action"), + style: .default + ) { action in + self?.gameVC?.isPaused = false + } + alertController.addAction(noAction) + + + self?.present(alertController, animated: true, completion: nil) + doNotPause = true + break + case .reset: + self?.gameVC?.reset() + break + case .changeDisk: + self?.gameVC?.presentFileSelectViewController() + doNotPause = true + break + case .saveState: + self?.gameVC?.saveState() + break + case .loadState: + self?.gameVC?.loadState() + break + case .analogMode: + break + case .controllerSetting: + self?.gameVC?.toggleControllSetting() + break + case .backupManager: + self?.gameVC?.presentBackupFileListViewController() + doNotPause = true + break + } + + if doNotPause == false{ + self?.gameVC?.isPaused = false + } + } + } + + func didChangeAnalogMode(to: Bool){ + + toggleMenu { [weak self] in + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(to, forKey: "analog mode" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + self?.gameVC?.setAnalogMode(to: to) + self?.gameVC?.isPaused = false + } + } + +} diff --git a/yabause/src/ios/uoyabause/uoyabause/GameViewController.swift b/yabause/src/ios/uoyabause/uoyabause/GameViewController.swift new file mode 100644 index 0000000000..ba23f2f4bb --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/GameViewController.swift @@ -0,0 +1,1161 @@ +import UIKit +//import MetalANGLE +import GameController +import AVFoundation +import AudioToolbox + + +var scurrentGamePath: UnsafeMutablePointer? = nil + +protocol GameViewControllerDelegate : AnyObject { + func didTapMenuButton() +} + +@objcMembers +class GameViewController: MGLKViewController,MGLKViewControllerDelegate,DraggableCircleViewDelegate { + + + + weak var gdelegate: GameViewControllerDelegate? + private let feedbackGenerator = UIImpactFeedbackGenerator(style: .medium) + + // MARK: - Properties + var iPodIsPlaying: UInt32 = 0 + var selectedFile: String? + + var context: MGLContext! + var shareContext: MGLContext! + var controller: GCController? + var command: Int32 = 0 + var returnValue: Bool = false + var keyMapper: KeyMapper! + var isKeyRemappingMode: Bool = false + var remapAlertController: UIAlertController? + var currentlyMappingKey: SaturnKey = .none + var remapLabelViews: [UILabel] = [] + var isFirst: Bool = true + var padButtons: [PadButton] = [] + private var controller_edit_mode: Int = 0 + private var canRotateToAllOrientations: Bool = false + private var _landscape: Bool = false + private var isAnalogMode: Bool = false + private var isOnScreenControlHidden: Bool = false + private var isAnalogAsDpad: Bool = false + + // MARK: - IBOutlets + @IBOutlet weak var leftPanel: UIImageView! + @IBOutlet weak var rightPanel: UIImageView! + @IBOutlet weak var startView: UIView! + @IBOutlet weak var rightView: UIView! + @IBOutlet weak var leftView: UIView! + @IBOutlet weak var scaleSlider: UISlider! + + @IBOutlet weak var rightButton: UIView! + @IBOutlet weak var downButton: UIView! + @IBOutlet weak var upButton: UIView! + @IBOutlet weak var leftButton: UIView! + @IBOutlet weak var leftTrigger: UIView! + @IBOutlet weak var startButton: UIView! + @IBOutlet weak var rightTrigger: UIView! + @IBOutlet weak var aButton: UIView! + @IBOutlet weak var bButton: UIView! + @IBOutlet weak var cButton: UIView! + @IBOutlet weak var xButton: UIView! + @IBOutlet weak var yButton: UIView! + @IBOutlet weak var zButton: UIView! + @IBOutlet weak var menuButton: UIButton! + @IBOutlet weak var analogPad: DraggableCircleView! + + static let saturnKeyDescriptions: [SaturnKey: String] = [ + .a: "A", + .b: "B", + .c: "C", + .x: "X", + .y: "Y", + .z: "Z", + .leftTrigger: "LT", + .rightTrigger: "RT", + .start: "Start" + ] + + func setAnalogMode( to: Bool ){ + isAnalogMode = to + if(isAnalogMode){ + SetAnalogMode(1) + }else{ + SetAnalogMode(0) + } + + if( isOnScreenControlHidden ){ + analogPad.isHidden = true + }else{ + analogPad.isHidden = !isAnalogMode + } + } + + lazy var saturnKeyToViewMappings: [SaturnKey: UIView] = { + [ + .a: self.aButton, + .b: self.bButton, + .c: self.cButton, + .x: self.xButton, + .y: self.yButton, + .z: self.zButton, + .leftTrigger: self.leftTrigger, + .rightTrigger: self.rightTrigger, + .start: self.startButton + ] + }() + + + // MARK: - Lifecycle Methods + override func viewDidLoad() { + super.viewDidLoad() + + self.delegate = self + loadSettings() + + //sharedData = self + _objectForLock = NSObject() + isFirst = true + + glView?.drawableDepthFormat = MGLDrawableDepthFormat24 + glView?.drawableStencilFormat = MGLDrawableStencilFormat8 + + if( scurrentGamePath != nil ){ + scurrentGamePath?.deallocate() + scurrentGamePath = nil + } + let cString = (selectedFile! as NSString).utf8String! + let bufferSize = Int(strlen(cString)) + 1 + scurrentGamePath = UnsafeMutablePointer.allocate(capacity: bufferSize) + strncpy(scurrentGamePath, cString, bufferSize) + currentGamePath = UnsafePointer(scurrentGamePath) + + view.isMultipleTouchEnabled = true + command = 0 + + rightView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0) + leftView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0) + startView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0) + leftButton.alpha = 0 + rightButton.alpha = 0 + upButton.alpha = 0 + downButton.alpha = 0 + aButton.alpha = 0 + bButton.alpha = 0 + cButton.alpha = 0 + xButton.alpha = 0 + yButton.alpha = 0 + zButton.alpha = 0 + leftTrigger.alpha = 0 + rightTrigger.alpha = 0 + startButton.alpha = 0 + + // 空の配列を作成 + padButtons = [PadButton]() + + // PadButtons.lastまでの各ボタンに対して新しいPadButtonインスタンスを作成 + for _ in 0...PadButtons.last.rawValue { + padButtons.append(PadButton()) + } + + // Create and add PadButton objects to the padButtons array + padButtons[PadButtons.up.rawValue].target = upButton + padButtons[PadButtons.right.rawValue].target = rightButton + padButtons[PadButtons.down.rawValue].target = downButton + padButtons[PadButtons.left.rawValue].target = leftButton + padButtons[PadButtons.rightTrigger.rawValue].target = rightTrigger + padButtons[PadButtons.leftTrigger.rawValue].target = leftTrigger + padButtons[PadButtons.start.rawValue].target = startButton + padButtons[PadButtons.a.rawValue].target = aButton + padButtons[PadButtons.b.rawValue].target = bButton + padButtons[PadButtons.c.rawValue].target = cButton + padButtons[PadButtons.x.rawValue].target = xButton + padButtons[PadButtons.y.rawValue].target = yButton + padButtons[PadButtons.z.rawValue].target = zButton + + preferredFramesPerSecond = 60 + + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) + + context = MGLContext(api: kMGLRenderingAPIOpenGLES3) + shareContext = MGLContext(api: kMGLRenderingAPIOpenGLES3, sharegroup: context.sharegroup) + + guard let context = context else { + print("Failed to create ES context") + return + } + + g_share_context = shareContext + g_context = context + + glView!.context = context + MGLContext.setCurrent(context) + glLayer = glView?.glLayer + + setup() + + iOSCoreAudioInit() + + // ... (saturnKeyDescriptions and saturnKeyToViewMappings initialization) + + keyMapper = KeyMapper() + keyMapper.loadFromDefaults() + remapLabelViews = [] + + scaleSlider.isHidden = true + scaleSlider.minimumValue = 0.5 + scaleSlider.maximumValue = 1.0 + scaleSlider.value = _controller_scale + scaleSlider.addTarget(self, action: #selector(didValueChanged(_:)), for: .valueChanged) + controller_edit_mode = 0 + updateControllScale(_controller_scale) + + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) + analogPad.delegate = self + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + if hasControllerConnected() { + print("Discovery finished on first pass") + foundController() + } else { + print("Discovery happening patiently") + patientlyDiscoverController() + } + + becomeFirstResponder() + } + + // MARK: - Setup Methods + func setup() { + MGLContext.setCurrent(context) + let scale = UIScreen.main.scale + let newFrame = view.frame + let safeArea = view.safeAreaInsets + + if isFirst { + start_emulation(Int32(Float(safeArea.left * scale)), Int32(Float(safeArea.bottom * scale)), Int32(Float((newFrame.width - safeArea.right - safeArea.left) * scale)), Int32(Float((newFrame.height - safeArea.top - safeArea.bottom) * scale))) + isFirst = false + } else { + resize_screen(Int32(Float(safeArea.left * scale)), Int32(Float(safeArea.bottom * scale)), Int32(Float((newFrame.width - safeArea.right - safeArea.left) * scale)), Int32(Float((newFrame.height - safeArea.top - safeArea.bottom) * scale))) + } + returnValue = true + } + + // MARK: - State Management + func saveState() { + command = MSG_SAVE_STATE + } + + func loadState() { + command = MSG_LOAD_STATE + } + + func reset() { + command = MSG_RESET + } + + // MARK: - Controller Methods + func hasControllerConnected() -> Bool { +#if targetEnvironment(simulator) + return false +#else + return GCController.controllers().count > 0 +#endif + } + + func patientlyDiscoverController() { + GCController.startWirelessControllerDiscovery(completionHandler: nil) + NotificationCenter.default.addObserver(self, selector: #selector(foundController), name: .GCControllerDidConnect, object: nil) + } + + @objc func foundController() { + #if targetEnvironment(simulator) + + #else + print("Found Controller") + NotificationCenter.default.addObserver(self, selector: #selector(controllerDidDisconnect), name: .GCControllerDidDisconnect, object: nil) + refreshViewsWithKeyRemaps() + setControllerOverlayHidden(true) + completionWirelessControllerDiscovery() + updateSideMenu() + #endif + } + + + func mglkViewControllerUpdate(_ controller: MGLKViewController) { + emulateOneFrame() + } + + // MGLKViewDelegate メソッド + //override func mglkView(_ view: MGLKView, drawIn rect: CGRect) { + // 描画コード + // } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + let scale = UIScreen.main.scale + let newFrame = self.view.frame + let safeArea = self.view.safeAreaInsets + + /* + objc_sync_enter(_objectForLock) + defer { + objc_sync_exit(_objectForLock) + } + */ + + resize_screen( + Int32(Float(safeArea.left * scale)), + Int32(Float(safeArea.bottom * scale)), + Int32(Float((newFrame.width - safeArea.right - safeArea.left) * scale)), + Int32(Float((newFrame.height - safeArea.top - safeArea.bottom) * scale)) + ) + } + + // MARK: - Emulation Methods + func emulateOneFrame() { + if returnValue { + returnValue = false + } + emulation_step(Int32(command)) + command = 0 + } + + func updateControllScale(_ scale: Float) { + let lfv = leftView + var tf = CGAffineTransform(scaleX: 1.0, y: 1.0) + tf = tf.translatedBy(x: -(258.0/2.0), y: (340.0/2.0)) + tf = tf.scaledBy(x: CGFloat(scale), y: CGFloat(scale)) + tf = tf.translatedBy(x: (258.0/2.0), y: -(340.0/2.0)) + lfv!.transform = tf + + let rfv = rightView + tf = CGAffineTransform(scaleX: 1.0, y: 1.0) + tf = tf.translatedBy(x: (258.0/2.0), y: (340.0/2.0)) + tf = tf.scaledBy(x: CGFloat(scale), y: CGFloat(scale)) + tf = tf.translatedBy(x: -(258.0/2.0), y: -(340.0/2.0)) + rfv!.transform = tf + + let sfv = startView + tf = CGAffineTransform(scaleX: 1.0, y: 1.0) + //tf = tf.translatedBy(x: (258.0/2.0), y: (340.0/2.0)) + tf = tf.scaledBy(x: CGFloat(scale), y: CGFloat(scale)) + //tf = tf.translatedBy(x: -(258.0/2.0), y: -(340.0/2.0)) + sfv!.transform = tf + + let ud = UserDefaults.standard + ud.set(scale, forKey: "controller scale") + ud.synchronize() + } + + func didValueChanged(_ slider: UISlider) { + let scaleVal = slider.value + updateControllScale(scaleVal) + } + + var isControllerEditModeEnabled = false + + func toggleControllerEditMode() { + isControllerEditModeEnabled.toggle() + scaleSlider.isHidden = !isControllerEditModeEnabled + } + + + // MARK: - Pause Management + //func setPaused(_ pause: Bool) { + // Implement the logic for pausing the game + //} + + // MARK: - Key Remapping Methods + func startKeyRemapping() { + refreshViewsWithKeyRemaps() + isKeyRemappingMode.toggle() + setControllerOverlayHidden(!isKeyRemappingMode) + } + + func isCurrentlyRemappingControls() -> Bool { + return isKeyRemappingMode + } + + // MARK: - Helper Methods + func refreshViewsWithKeyRemaps() { + if !remapLabelViews.isEmpty { + remapLabelViews.forEach { $0.removeFromSuperview() } + } + remapLabelViews.removeAll() + + for (button, saturnButtonView) in saturnKeyToViewMappings { + let buttonNumber = button.rawValue + var buttonNames = "" + let mfiButtons = keyMapper.getControls(forMappedKey: SaturnKey(rawValue: Int(buttonNumber)) ?? SaturnKey.none ) + + for (index, mfiButton) in mfiButtons.enumerated() { + if index > 0 { + buttonNames += " / " + } + buttonNames += KeyMapper.controlToDisplayName(KeyMapMappableButton(rawValue: mfiButton.intValue) ?? KeyMapMappableButton.MFI_BUTTON_OPTION) + } + + if !mfiButtons.isEmpty { + let mappedLabel = UILabel() + mappedLabel.text = buttonNames + mappedLabel.alpha = 0.6 + mappedLabel.font = UIFont.boldSystemFont(ofSize: 16.0) + mappedLabel.textColor = .red + mappedLabel.translatesAutoresizingMaskIntoConstraints = false + + view.addSubview(mappedLabel) + NSLayoutConstraint.activate([ + mappedLabel.centerXAnchor.constraint(equalTo: (saturnButtonView ).centerXAnchor), + mappedLabel.centerYAnchor.constraint(equalTo: (saturnButtonView ).centerYAnchor) + ]) + + view.bringSubviewToFront(mappedLabel) + remapLabelViews.append(mappedLabel) + view.setNeedsLayout() + } + } + } + + func setControllerOverlayHidden(_ hidden: Bool) { + leftPanel.isHidden = hidden + rightPanel.isHidden = hidden + leftButton.isHidden = hidden + rightButton.isHidden = hidden + upButton.isHidden = hidden + downButton.isHidden = hidden + aButton.isHidden = hidden + bButton.isHidden = hidden + cButton.isHidden = hidden + xButton.isHidden = hidden + yButton.isHidden = hidden + zButton.isHidden = hidden + leftTrigger.isHidden = hidden + rightTrigger.isHidden = hidden + startButton.isHidden = hidden + startView.isHidden = hidden + + + remapLabelViews.forEach { label in + label.isHidden = hasControllerConnected() && !hidden ? false : hidden + } + + isOnScreenControlHidden = hidden + if( hidden ){ + analogPad.isHidden = true + }else{ + analogPad.isHidden = !isAnalogMode + } + } + + func completionWirelessControllerDiscovery() { + let mfiButtonHandler: (KeyMapMappableButton, Bool) -> Void = { [weak self] mfiButton, pressed in + guard let self = self else { return } + + if self.isKeyRemappingMode && self.currentlyMappingKey != SaturnKey.none { + self.keyMapper.mapKey(self.currentlyMappingKey, toControl: mfiButton) + if let remapAlertController = self.remapAlertController { + remapAlertController.dismiss(animated: true, completion: nil) + } + self.keyMapper.saveKeyMapping() + self.currentlyMappingKey = SaturnKey.none + self.refreshViewsWithKeyRemaps() + } else { + if let mappedKeyNumber = self.keyMapper.getMappedKey(forControl: mfiButton) { + let mappedKey = SaturnKey(rawValue: mappedKeyNumber.intValue) ?? .none + if pressed { + PerKeyDown(UInt32(mappedKey.rawValue)) + } else { + PerKeyUp(UInt32(mappedKey.rawValue)) + } + } + } + } + + if let controller = GCController.controllers().first { + self.controller = controller + if let gamepad = controller.extendedGamepad { + gamepad.buttonHome?.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_HOME, pressed) + } + + gamepad.buttonMenu.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_MENU, pressed) +// if let revealViewController = self?.revealViewController as? GameRevealViewController, pressed { +// revealViewController.revealToggle(0) + // } + } + + gamepad.buttonOptions?.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_OPTION, pressed) + } + + gamepad.buttonA.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_A, pressed) + } + + gamepad.rightShoulder.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_RS, pressed) + } + + gamepad.leftShoulder.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_LS, pressed) + } + + gamepad.leftTrigger.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_LT, pressed) + } + + gamepad.rightTrigger.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_RT, pressed) + } + + gamepad.buttonX.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_X, pressed) + } + + gamepad.buttonY.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_Y, pressed) + } + + gamepad.buttonB.valueChangedHandler = { _, _, pressed in + mfiButtonHandler(.MFI_BUTTON_B, pressed) + } + + gamepad.dpad.up.valueChangedHandler = { _, _, pressed in + if pressed { + PerKeyDown(UInt32(SaturnKey.up.rawValue)) + } else { + PerKeyUp(UInt32(SaturnKey.up.rawValue)) + } + } + + gamepad.dpad.down.valueChangedHandler = { _, _, pressed in + if pressed { + PerKeyDown(UInt32(SaturnKey.down.rawValue)) + } else { + PerKeyUp(UInt32(SaturnKey.down.rawValue)) + } + } + + gamepad.dpad.left.valueChangedHandler = { _, _, pressed in + if pressed { + PerKeyDown(UInt32(SaturnKey.left.rawValue)) + } else { + PerKeyUp(UInt32(SaturnKey.left.rawValue)) + } + } + + gamepad.dpad.right.valueChangedHandler = { _, _, pressed in + if pressed { + PerKeyDown(UInt32(SaturnKey.right.rawValue)) + } else { + PerKeyUp(UInt32(SaturnKey.right.rawValue)) + } + } + + + gamepad.leftThumbstick.valueChangedHandler = { _, xValue, yValue in + if( self.isAnalogMode ){ + + PerAxisValue(PERANALOG_AXIS_X, convertDoubleToUInt8((Double(xValue) * 128.0) + 128)); // from 0 to 255 + PerAxisValue(PERANALOG_AXIS_Y, convertDoubleToUInt8((Double(-yValue) * 128.0) + 128)); // from 0 to 255 + + }else if( self.isAnalogAsDpad ){ + + if( xValue < 0.1 && xValue > -0.1 ){ + PerKeyUp(UInt32(SaturnKey.left.rawValue)) + PerKeyUp(UInt32(SaturnKey.right.rawValue)) + }else if( xValue > 0.5 ){ + PerKeyUp(UInt32(SaturnKey.left.rawValue)) + PerKeyDown(UInt32(SaturnKey.right.rawValue)) + }else if( xValue < -0.5 ){ + PerKeyDown(UInt32(SaturnKey.left.rawValue)) + PerKeyUp(UInt32(SaturnKey.right.rawValue)) + } + + if( yValue < 0.1 && yValue > -0.1 ){ + PerKeyUp(UInt32(SaturnKey.up.rawValue)) + PerKeyUp(UInt32(SaturnKey.down.rawValue)) + }else if( yValue > 0.5 ){ + PerKeyDown(UInt32(SaturnKey.up.rawValue)) + PerKeyUp(UInt32(SaturnKey.down.rawValue)) + }else if( yValue < -0.5 ){ + PerKeyUp(UInt32(SaturnKey.up.rawValue)) + PerKeyDown(UInt32(SaturnKey.down.rawValue)) + } + + } + } + + gamepad.leftTrigger.valueChangedHandler = { _, Value, yValue in + if( self.isAnalogMode ){ + PerAxisValue(PERANALOG_AXIS_LTRIGGER, convertDoubleToUInt8(( (Double(Value)) * 255.0))); // from 0 to 255 + } + if Value > 0.5 { + mfiButtonHandler(.MFI_BUTTON_LT, true) + }else{ + mfiButtonHandler(.MFI_BUTTON_LT, false) + } + } + + gamepad.rightTrigger.valueChangedHandler = { _, Value, yValue in + if( self.isAnalogMode ){ + PerAxisValue(PERANALOG_AXIS_RTRIGGER, convertDoubleToUInt8(( (Double(Value)) * 255.0))); // from 0 to 255 + } + if Value > 0.5 { + mfiButtonHandler(.MFI_BUTTON_RT, true) + }else{ + mfiButtonHandler(.MFI_BUTTON_RT, false) + } + } + + + // Commented out in the original code + /* + gamepad.rightThumbstick.valueChangedHandler = { _, xValue, yValue in + if yValue >= 0.5 || yValue <= -0.5 { + PerKeyDown(.start) + } else { + PerKeyUp(.start) + } + } + */ + } + } + } + + @IBAction func onMenu(_ sender: Any) { + gdelegate?.didTapMenuButton() + } + + func updateSideMenu() { + // Implement the logic for updating side menu + } + + // MARK: - Notification Handlers + @objc func didEnterBackground() { + enterBackGround() + self.isPaused = true + } + + @objc func didBecomeActive() { + self.view.becomeFirstResponder() + self.isPaused = false + self.returnValue = true + } + + override var canBecomeFirstResponder: Bool { + return true + } + + @objc func controllerDidDisconnect() { + if GCController.controllers().count <= 0 { + setControllerOverlayHidden(false) + isKeyRemappingMode = false + if !remapLabelViews.isEmpty { + remapLabelViews.forEach { $0.removeFromSuperview() } + } + remapLabelViews.removeAll() + } + + } + + // MARK: settings + func loadSettings() { + let path = getSettingFilePath() + if let dic = NSDictionary(contentsOfFile: path) { + _bios = ObjCBool((dic["builtin bios"] as? Bool) ?? false) + _cart = Int32((dic["cartridge"] as? Int) ?? 0) + _fps = ObjCBool((dic["show fps"] as? Bool) ?? false) + _frame_skip = ObjCBool((dic["frame skip"] as? Bool) ?? false) + _aspect_rate = ObjCBool((dic["keep aspect rate"] as? Bool) ?? false) + _filter = Int32(0) + _sound_engine = Int32((dic["sound engine"] as? Int) ?? 0) + _rendering_resolution = Int32((dic["rendering resolution"] as? Int) ?? 0) + _rotate_screen = ObjCBool((dic["rotate screen"] as? Bool) ?? false) + isAnalogAsDpad = (dic["analog as dpad"] as? Bool) ?? false + setAnalogMode(to: (dic["analog mode"] as? Bool) ?? false ) + } + + let ud = UserDefaults.standard + let defaults: [String: Any] = [ + "controller scale": "0.8", + "landscape": true + ] + ud.register(defaults: defaults) + + _controller_scale = ud.float(forKey: "controller scale") + self._landscape = ud.bool(forKey: "landscape") + + + } + + func getSettingFilePath() -> String { + let fileManager = FileManager.default + let fileName = "settings.plist" + + let paths = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true) + let libraryDirectory = paths[0] + + let filePath = (libraryDirectory as NSString).appendingPathComponent(fileName) + print("full path name: \(filePath)") + + // check if file exists + if fileManager.fileExists(atPath: filePath) { + print("File exists") + } else { + let bundle = Bundle.main + if let path = bundle.path(forResource: "settings", ofType: "plist") { + do { + try fileManager.copyItem(atPath: path, toPath: filePath) + } catch { + print("Error copying file: \(error)") + } + } + } + + return filePath + } + + func onChangeTouchPos(x: UInt8, y: UInt8) { + if( isAnalogMode ){ + PerAxisValue(PERANALOG_AXIS_X, x); // from 0 to 255 + PerAxisValue(PERANALOG_AXIS_Y, y); // from 0 to 255 + } + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { +// super.touchesBegan(touches, with: event) + for touch in touches { + for btnindex in 0.. 0 ) { + switch UIDevice.current.feedbackSupportLevel + { + case .feedbackGenerator: + self.feedbackGenerator.impactOccurred() + case .basic, .unsupported: + UIDevice.current.vibrate() + } + } + + + } + + override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { + var handleEvent = 0 + + for press in presses { + guard let key = press.key else { continue } + + switch key.charactersIgnoringModifiers { + case UIKeyCommand.inputLeftArrow: + PerKeyDown(UInt32(PadButtons.left.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputRightArrow: + PerKeyDown(UInt32(PadButtons.right.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputUpArrow: + PerKeyDown(UInt32(PadButtons.up.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputDownArrow: + PerKeyDown(UInt32(PadButtons.down.rawValue)) + handleEvent += 1 + case "\r": + PerKeyDown(UInt32(PadButtons.start.rawValue)) + handleEvent += 1 + case "z": + PerKeyDown(UInt32(PadButtons.a.rawValue)) + handleEvent += 1 + case "x": + PerKeyDown(UInt32(PadButtons.b.rawValue)) + handleEvent += 1 + case "c": + PerKeyDown(UInt32(PadButtons.c.rawValue)) + handleEvent += 1 + case "a": + PerKeyDown(UInt32(PadButtons.x.rawValue)) + handleEvent += 1 + case "s": + PerKeyDown(UInt32(PadButtons.y.rawValue)) + handleEvent += 1 + case "d": + PerKeyDown(UInt32(PadButtons.z.rawValue)) + handleEvent += 1 + case "q": + PerKeyDown(UInt32(PadButtons.leftTrigger.rawValue)) + handleEvent += 1 + case "e": + PerKeyDown(UInt32(PadButtons.rightTrigger.rawValue)) + handleEvent += 1 + default: + break + } + } + + if handleEvent == 0 { + super.pressesBegan(presses, with: event) + } + } + + override func pressesEnded(_ presses: Set, with event: UIPressesEvent?) { + var handleEvent = 0 + + for press in presses { + guard let key = press.key else { continue } + + switch key.charactersIgnoringModifiers { + case UIKeyCommand.inputLeftArrow: + PerKeyUp(UInt32(PadButtons.left.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputRightArrow: + PerKeyUp(UInt32(PadButtons.right.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputUpArrow: + PerKeyUp(UInt32(PadButtons.up.rawValue)) + handleEvent += 1 + case UIKeyCommand.inputDownArrow: + PerKeyUp(UInt32(PadButtons.down.rawValue)) + handleEvent += 1 + case "\r": + PerKeyUp(UInt32(PadButtons.start.rawValue)) + handleEvent += 1 + case "z": + PerKeyUp(UInt32(PadButtons.a.rawValue)) + handleEvent += 1 + case "x": + PerKeyUp(UInt32(PadButtons.b.rawValue)) + handleEvent += 1 + case "c": + PerKeyUp(UInt32(PadButtons.c.rawValue)) + handleEvent += 1 + case "a": + PerKeyUp(UInt32(PadButtons.x.rawValue)) + handleEvent += 1 + case "s": + PerKeyUp(UInt32(PadButtons.y.rawValue)) + handleEvent += 1 + case "d": + PerKeyUp(UInt32(PadButtons.z.rawValue)) + handleEvent += 1 + case "q": + PerKeyUp(UInt32(PadButtons.leftTrigger.rawValue)) + handleEvent += 1 + case "e": + PerKeyUp(UInt32(PadButtons.rightTrigger.rawValue)) + handleEvent += 1 + default: + break + } + } + + if handleEvent == 0 { + super.pressesEnded(presses, with: event) + } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + + var eventCount = 0 + + for touch in touches { + if padButtons[Int(PadButtons.down.rawValue)].isOn() && padButtons[Int(PadButtons.down.rawValue)].getPointId() == touch { + if let target = padButtons[Int(PadButtons.down.rawValue)].target { + let point = touch.location(in: target) + if point.y < 0 { + padButtons[Int(PadButtons.down.rawValue)].off() + } + } + } + + if padButtons[Int(PadButtons.up.rawValue)].isOn() && padButtons[Int(PadButtons.up.rawValue)].getPointId() == touch { + if let target = padButtons[PadButtons.up.rawValue].target { + let point = touch.location(in: target) + if point.y > target.bounds.size.height { + padButtons[PadButtons.up.rawValue].off() + } + } + } + + if let target = padButtons[PadButtons.down.rawValue].target { + let point = touch.location(in: target) + if target.bounds.contains(point) { + + if( !isAnalogMode && padButtons[Int(PadButtons.down.rawValue)].isOn() == false ){ + eventCount += 1 + } + + padButtons[PadButtons.down.rawValue].on(touch) + } + } + + if let target = padButtons[PadButtons.up.rawValue].target { + let point = touch.location(in: target) + if target.bounds.contains(point) { + + if( !isAnalogMode && padButtons[Int(PadButtons.up.rawValue)].isOn() == false ){ + eventCount += 1 + } + + padButtons[PadButtons.up.rawValue].on(touch) + } + } + + if padButtons[PadButtons.right.rawValue].isOn() && padButtons[PadButtons.right.rawValue].getPointId() == touch { + if let target = padButtons[PadButtons.right.rawValue].target { + let point = touch.location(in: target) + if point.x < 0 { + padButtons[PadButtons.right.rawValue].off() + } + } + } + + if padButtons[PadButtons.left.rawValue].isOn() && padButtons[PadButtons.left.rawValue].getPointId() == touch { + if let target = padButtons[PadButtons.left.rawValue].target { + let point = touch.location(in: target) + if point.x > target.bounds.size.width { + padButtons[PadButtons.left.rawValue].off() + } + } + } + + if let target = padButtons[PadButtons.left.rawValue].target { + let point = touch.location(in: target) + if target.bounds.contains(point) { + + if( !isAnalogMode && padButtons[Int(PadButtons.left.rawValue)].isOn() == false ){ + eventCount += 1 + } + + + padButtons[PadButtons.left.rawValue].on(touch) + } + } + + if let target = padButtons[PadButtons.right.rawValue].target { + let point = touch.location(in: target) + if target.bounds.contains(point) { + + if( !isAnalogMode && padButtons[Int(PadButtons.right.rawValue)].isOn() == false ){ + eventCount += 1 + } + + + padButtons[PadButtons.right.rawValue].on(touch) + } + } + + for btnindex in PadButtons.rightTrigger.rawValue.. 0 ) { + switch UIDevice.current.feedbackSupportLevel + { + case .feedbackGenerator: + self.feedbackGenerator.impactOccurred() + case .basic, .unsupported: + UIDevice.current.vibrate() + } + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + for touch in touches { + for btnindex in 0...allocate(capacity: bufferSize) + strncpy(scurrentGamePath, cString, bufferSize) + currentGamePath = UnsafePointer(scurrentGamePath) + self.command = MSG_CLOSE_TRAY + } + + }else{ + self.isPaused = false + } + } + + let navController = UINavigationController(rootViewController: fsVC) + navController.modalPresentationStyle = .pageSheet + present(navController, animated: true, completion: nil) + + } + + func presentBackupFileListViewController() { + let bfVC = BackupFileListViewController() + bfVC.completionHandler = { data in + self.isPaused = false + } + + let navController = UINavigationController(rootViewController: bfVC) + navController.modalPresentationStyle = .pageSheet + present(navController, animated: true, completion: nil) + + } + +} diff --git a/yabause/src/ios/uoyabause/uoyabause/GoogleService-Info.plist b/yabause/src/ios/uoyabause/uoyabause/GoogleService-Info.plist new file mode 100644 index 0000000000..c5eb09cdb6 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/GoogleService-Info.plist @@ -0,0 +1,40 @@ + + + + + CLIENT_ID + 1 + REVERSED_CLIENT_ID + 1 + ANDROID_CLIENT_ID + 1 + API_KEY + 1 + GCM_SENDER_ID + 1 + PLIST_VERSION + 1 + BUNDLE_ID + org.devMiyax.yabasanshiro2 + PROJECT_ID + uoyabause + STORAGE_BUCKET + uoyabause.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:1 + DATABASE_URL + https://uoyabause.firebaseio.com + ADMOB_APP_ID + ca-app-pub-1 + + \ No newline at end of file diff --git a/yabause/src/ios/uoyabause/uoyabause/Info-lite.plist b/yabause/src/ios/uoyabause/uoyabause/Info-lite.plist new file mode 100644 index 0000000000..be3fe41027 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/Info-lite.plist @@ -0,0 +1,90 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Yaba Sanshiro 2 Lite + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + APPL + CFBundleVersion + 48 + GADApplicationIdentifier + ca-app-pub-2526043010907640~1516750003 + GCSupportedGameControllers + + + ProfileName + ExtendedGamepad + + + ProfileName + MicroGamepad + + + GCSupportsControllerUserInteraction + + GCSupportsGameMode + + ITSAppUsesNonExemptEncryption + + LSApplicationCategoryType + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIFileSharingEnabled + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + metal + arm64 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarStyle + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Light + + diff --git a/yabause/src/ios/uoyabause/uoyabause/Info.plist b/yabause/src/ios/uoyabause/uoyabause/Info.plist new file mode 100644 index 0000000000..51bf2240ae --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/Info.plist @@ -0,0 +1,90 @@ + + + + + AVGameBypassSystemSpatialAudio + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Yaba Sanshiro 2 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + APPL + CFBundleVersion + 48 + GCSupportedGameControllers + + + ProfileName + ExtendedGamepad + + + ProfileName + MicroGamepad + + + GCSupportsControllerUserInteraction + + GCSupportsGameMode + + ITSAppUsesNonExemptEncryption + + LSApplicationCategoryType + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIFileSharingEnabled + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + metal + arm64 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarStyle + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Light + + diff --git a/yabause/src/ios/uoyabause/uoyabause/KeyMapper.h b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.h new file mode 100644 index 0000000000..d0621d2d5f --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.h @@ -0,0 +1,40 @@ +// +// KeyMapper.h +// +// Created by Yoshi Sugawara on 4/9/16. +// +// + +#import +#import "SaturnControllerKeys.h" + +typedef NS_ENUM(NSInteger, KeyMapMappableButton) { + MFI_BUTTON_X, + MFI_BUTTON_A, + MFI_BUTTON_B, + MFI_BUTTON_Y, + MFI_BUTTON_LT, + MFI_BUTTON_RT, + MFI_BUTTON_LS, + MFI_BUTTON_RS, + MFI_DPAD_UP, + MFI_DPAD_DOWN, + MFI_DPAD_LEFT, + MFI_DPAD_RIGHT, + MFI_BUTTON_HOME, + MFI_BUTTON_MENU, + MFI_BUTTON_OPTION +}; + +@interface KeyMapper : NSObject + +-(void)loadFromDefaults; +-(void) resetToDefaults; +-(void) saveKeyMapping; +-(void) mapKey:(SaturnKeyXX)keyboardKey ToControl:(KeyMapMappableButton)button; +-(void) unmapKey:(SaturnKeyXX)keyboardKey; +-(SaturnKeyXX) getMappedKeyForControl:(KeyMapMappableButton)button; ++(NSString*) controlToDisplayName:(KeyMapMappableButton)button; +-(NSArray*) getControlsForMappedKey:(SaturnKeyXX) keyboardKey; + +@end diff --git a/yabause/src/ios/uoyabause/uoyabause/KeyMapper.m b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.m new file mode 100644 index 0000000000..3cb4bac2b3 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.m @@ -0,0 +1,143 @@ +// +// KeyMapper.m +// +// Created by Yoshi Sugawara on 4/9/16. +// +// + +#import "KeyMapper.h" +#import "SaturnControllerKeys.h" + +@interface KeyMapper() +@property (nonatomic, strong) NSMutableDictionary *keyMapping; +@end + +@implementation KeyMapper + +-(void)loadFromDefaults { + NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyMapping"]; + if ( data == nil || ![data isKindOfClass:[NSData class]] ) { + self.keyMapping = [self defaultMapping]; + } else { + NSDictionary *fetchedDict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + self.keyMapping = [fetchedDict mutableCopy]; + } +} + +- (id)copyWithZone:(NSZone *)zone { + KeyMapper *copy = [[[self class] alloc] init]; + copy.keyMapping = [self.keyMapping mutableCopy]; + return copy; +} + +-(NSMutableDictionary*) defaultMapping { + return [@{ [NSNumber numberWithInteger:MFI_BUTTON_A] : [NSNumber numberWithInteger:SaturnKeyA], + [NSNumber numberWithInteger:MFI_BUTTON_B] : [NSNumber numberWithInteger:SaturnKeyB], + [NSNumber numberWithInteger:MFI_BUTTON_RS] : [NSNumber numberWithInteger:SaturnKeyC], + [NSNumber numberWithInteger:MFI_BUTTON_X] : [NSNumber numberWithInteger:SaturnKeyX], + [NSNumber numberWithInteger:MFI_BUTTON_Y] : [NSNumber numberWithInteger:SaturnKeyY], + [NSNumber numberWithInteger:MFI_BUTTON_LS] : [NSNumber numberWithInteger:SaturnKeyZ], + [NSNumber numberWithInteger:MFI_BUTTON_LT] : [NSNumber numberWithInteger:SaturnKeyLeftTrigger], + [NSNumber numberWithInteger:MFI_BUTTON_RT] : [NSNumber numberWithInteger:SaturnKeyRightTrigger], + [NSNumber numberWithInteger:MFI_BUTTON_OPTION] : [NSNumber numberWithInteger:SaturnKeyStart], + + } mutableCopy]; +} + +-(void) resetToDefaults { + self.keyMapping = [self defaultMapping]; +} + +-(void) saveKeyMapping { + [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:self.keyMapping] forKey:@"keyMapping"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +-(void) mapKey:(SaturnKeyXX)keyboardKey ToControl:(KeyMapMappableButton)button { + NSNumber *buttonKey = [NSNumber numberWithInteger:button]; + [self.keyMapping setObject:[NSNumber numberWithInteger:keyboardKey] forKey:buttonKey]; +} + +-(void) unmapKey:(SaturnKeyXX)saturnKey { + NSArray *mappedButtons = [self getControlsForMappedKey:saturnKey]; + for (NSNumber *button in mappedButtons) { + [self.keyMapping removeObjectForKey:button]; + } +} + +-(SaturnKeyXX) getMappedKeyForControl:(KeyMapMappableButton)button { + NSNumber *buttonKey = [NSNumber numberWithInteger:button]; + NSNumber *mappedKey = [self.keyMapping objectForKey:buttonKey]; + if ( mappedKey != nil ) { + return [mappedKey intValue]; + } else { + return NSNotFound; + } +} + +-(NSArray*) getControlsForMappedKey:(SaturnKeyXX) saturnKey { + NSMutableArray *foundControls = [NSMutableArray array]; + for (NSNumber *buttonKey in self.keyMapping) { + NSNumber *mappedKey = [self.keyMapping objectForKey:buttonKey]; + if ( mappedKey != nil && [mappedKey integerValue] == saturnKey ) { + [foundControls addObject:buttonKey]; + } + } + return foundControls; +} + ++(NSString*) controlToDisplayName:(KeyMapMappableButton)button { + switch (button) { + case MFI_BUTTON_HOME: + return @"H"; + break; + case MFI_BUTTON_OPTION: + return @"H"; + break; + case MFI_BUTTON_MENU: + return @"M"; + break; + case MFI_BUTTON_A: + return @"A"; + break; + case MFI_BUTTON_B: + return @"B"; + break; + case MFI_BUTTON_X: + return @"X"; + break; + case MFI_BUTTON_Y: + return @"Y"; + break; + case MFI_BUTTON_LS: + return @"LS"; + break; + case MFI_BUTTON_LT: + return @"LT"; + break; + case MFI_BUTTON_RS: + return @"RS"; + break; + case MFI_BUTTON_RT: + return @"RT"; + break; + case MFI_DPAD_UP: + return @"⬆️"; + break; + case MFI_DPAD_DOWN: + return @"⬇️"; + break; + case MFI_DPAD_LEFT: + return @"⬅️"; + break; + case MFI_DPAD_RIGHT: + return @"➡️"; + break; + default: + return @"?"; + break; + } +} + + +@end diff --git a/yabause/src/ios/uoyabause/uoyabause/KeyMapper.swift b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.swift new file mode 100644 index 0000000000..321a9843d1 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/KeyMapper.swift @@ -0,0 +1,102 @@ +// +// KeyMapper.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/20. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation + +@objc enum KeyMapMappableButton: Int { + case MFI_BUTTON_X = 0, MFI_BUTTON_A, MFI_BUTTON_B, MFI_BUTTON_Y, MFI_BUTTON_LT, MFI_BUTTON_RT, MFI_BUTTON_LS, MFI_BUTTON_RS, MFI_DPAD_UP, MFI_DPAD_DOWN, MFI_DPAD_LEFT, MFI_DPAD_RIGHT, MFI_BUTTON_HOME, MFI_BUTTON_MENU, MFI_BUTTON_OPTION +} + +@objcMembers +class KeyMapper: NSObject, NSCopying { + private var keyMapping: [KeyMapMappableButton: SaturnKey] = [:] + + override init() { + super.init() + loadFromDefaults() + } + + func loadFromDefaults() { + guard let data = UserDefaults.standard.object(forKey: "keyMapping") as? Data, + let fetchedDict = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [KeyMapMappableButton: SaturnKey] else { + keyMapping = defaultMapping() + return + } + keyMapping = fetchedDict + } + + func copy(with zone: NSZone? = nil) -> Any { + let copy = KeyMapper() + copy.keyMapping = self.keyMapping + return copy + } + + private func defaultMapping() -> [KeyMapMappableButton: SaturnKey] { + return [.MFI_BUTTON_A: .a, .MFI_BUTTON_B: .b, .MFI_BUTTON_RS: .c, .MFI_BUTTON_X: .x, .MFI_BUTTON_Y: .y, .MFI_BUTTON_LS: .z, .MFI_BUTTON_LT: .leftTrigger, .MFI_BUTTON_RT: .rightTrigger, .MFI_BUTTON_MENU: .start] + } + + func resetToDefaults() { + keyMapping = defaultMapping() + } + + func saveKeyMapping() { + if let data = try? NSKeyedArchiver.archivedData(withRootObject: keyMapping, requiringSecureCoding: false) { + UserDefaults.standard.set(data, forKey: "keyMapping") + UserDefaults.standard.synchronize() + } + } + + func mapKey(_ keyboardKey: SaturnKey, toControl button: KeyMapMappableButton) { + keyMapping[button] = keyboardKey + print( "mapKey: \(button) to \(keyboardKey)" ) + } + + func unmapKey(_ saturnKey: SaturnKey) { + keyMapping = keyMapping.filter { $1 != saturnKey } + } + + //@objc func getMappedKey(forControl button: KeyMapMappableButton) -> SaturnKey? { + // return keyMapping[button] + //} + + @objc func getMappedKey(forControl button: KeyMapMappableButton) -> NSNumber? { + guard let key = keyMapping[button] else { return nil } + return NSNumber(value: key.rawValue) + } + + //;.@objc func getControls(forMappedKey keyboardKey: SaturnKey) -> [KeyMapMappableButton] { + // return keyMapping.filter { $1 == keyboardKey }.map { $0.key } + // } + + @objc func getControls(forMappedKey keyboardKey: SaturnKey) -> [NSNumber] { + return keyMapping.filter { $1 == keyboardKey }.map { NSNumber(value: $0.key.rawValue) } + } + + + static func controlToDisplayName(_ button: KeyMapMappableButton) -> String { + switch button { + case .MFI_BUTTON_HOME: return "H" + case .MFI_BUTTON_OPTION: return "O" + case .MFI_BUTTON_MENU: return "M" + case .MFI_BUTTON_A: return "A" + case .MFI_BUTTON_B: return "B" + case .MFI_BUTTON_X: return "X" + case .MFI_BUTTON_Y: return "Y" + case .MFI_BUTTON_LS: return "LS" + case .MFI_BUTTON_LT: return "LT" + case .MFI_BUTTON_RS: return "RS" + case .MFI_BUTTON_RT: return "RT" + case .MFI_DPAD_UP: return "⬆️" + case .MFI_DPAD_DOWN: return "⬇️" + case .MFI_DPAD_LEFT: return "⬅️" + case .MFI_DPAD_RIGHT: return "➡️" + default: return "?" + } + } +} + diff --git a/yabause/src/ios/uoyabause/uoyabause/Localizable.xcstrings b/yabause/src/ios/uoyabause/uoyabause/Localizable.xcstrings new file mode 100644 index 0000000000..7e2060c66b --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/Localizable.xcstrings @@ -0,0 +1,1587 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "%@ Byte used / %@ Byte total" : { + "comment" : "Format string for storage info", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ Byte used / %2$@ Byte total" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Bytes usados / %2$@ Bytes totales" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "全 %2$@ Byte 中 %1$@ Byte 使用" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Byte usados / %2$@ Byte total" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Байт использовано / %2$@ Байт всего" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已使用 %1$@ 字节 / 总共 %2$@ 字节" + } + } + } + }, + "2x" : { + "comment" : "Resolution option for 2 times the native resolution", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 veces" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "2倍" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 vezes" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 раза" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "2倍" + } + } + } + }, + "4Mbit BackupRam" : { + "comment" : "4 megabit backup RAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "4Mbit BackupRam" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "4Mbit BackupRam" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "4Mbit BackupRam" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "4Mbit BackupRam" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "4Mbit BackupRam" + } + } + } + }, + "4x" : { + "comment" : "Resolution option for 4 times the native resolution", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 veces" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "4倍" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 vezes" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 раза" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "4倍" + } + } + } + }, + "8Mbit BackupRam" : { + "comment" : "8 megabit backup RAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit BackupRam" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit BackupRam" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit BackupRam" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit BackupRam" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit BackupRam" + } + } + } + }, + "8Mbit DRAM" : { + "comment" : "8 megabit DRAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit DRAM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit DRAM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit DRAM" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit DRAM" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "8Mbit DRAM" + } + } + } + }, + "16Mbit BackupRam" : { + "comment" : "16 megabit backup RAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "16Mbit BackupRam" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "16Mbit BackupRam" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "16Mbit BackupRam" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "16Mbit BackupRam" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "16Mbit BackupRam" + } + } + } + }, + "32Mbit BackupRam" : { + "comment" : "32 megabit backup RAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit BackupRam" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit BackupRam" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit BackupRam" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit BackupRam" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit BackupRam" + } + } + } + }, + "32Mbit DRAM" : { + "comment" : "32 megabit DRAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit DRAM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit DRAM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit DRAM" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit DRAM" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "32Mbit DRAM" + } + } + } + }, + "Analog Mode" : { + "comment" : "Switch to analog mode", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modo analógico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アナログモード" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modo analógico" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Аналоговый режим" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模拟模式" + } + } + } + }, + "Are you sure you want to delete [%@]" : { + "comment" : "Confirm deletion message", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de que quieres eliminar [%@]?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "本当に %@ を削除しますか?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tem certeza de que deseja excluir [%@]?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите удалить [%@]?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定要删除 [%@] 吗?" + } + } + } + }, + "Are you sure you want to exit?" : { + "comment" : "Message asking if the user is sure about exiting", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de que quieres salir?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリを終了してよろしいですか?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tem certeza de que deseja sair?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите выйти?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定要退出吗?" + } + } + } + }, + "Backup Manager" : { + "comment" : "Backup Manager Settings\nBackup Manager settings", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrador de copias de seguridad" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存データ管理" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerenciador de Backup" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Менеджер резервного копирования" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "备份管理器" + } + } + } + }, + "Cancel" : { + "comment" : "Action to cancel the key remapping\nButton title to cancel the upgrade action\ncancel\n Cancel deletion", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャンセル" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отмена" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消" + } + } + } + }, + "Change Disk" : { + "comment" : "Change the game disk\nChnge the game disk", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambiar disco" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ディスク交換" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trocar disco" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сменить диск" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更换游戏光盘" + } + } + } + }, + "Close" : { + "comment" : "Close Dialoig", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cerrar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "閉じる" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fechar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Закрыть" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } + }, + "Confirm Deletion" : { + "comment" : "Confirm deletion alert title", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmación de eliminación" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "削除確認" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmação de exclusão" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подтверждение удаления" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确认删除" + } + } + } + }, + "Copy to [%@]" : { + "comment" : "copy a backup file to external device", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar a [%@]" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "[%@]にコピー" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar para [%@]" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скопировать в [%@]" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制到[%@]" + } + } + } + }, + "Copy to Internal memory" : { + "comment" : "copy a backup file to internal memory", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar a la memoria interna" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "内部メモリにコピー" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar para a memória interna" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скопировать во внутреннюю память" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "复制到内部存储" + } + } + } + }, + "Date: %@" : { + "comment" : "last update date time", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fecha: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日時:%@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дата: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日期:%@" + } + } + } + }, + "Delete" : { + "comment" : "Confirm deletion\n Delete file", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "削除" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Excluir" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除" + } + } + } + }, + "Error" : { + "comment" : "Title for the error alert", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "エラー" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "错误" + } + } + } + }, + "Exit" : { + "comment" : "Exit the application", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salir" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "終了" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sair" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Выход" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出" + } + } + } + }, + "Exit Confirmation" : { + "comment" : "Title for exit confirmation alert", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmación de salida" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "終了確認" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmação de saída" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подтверждение выхода" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出确认" + } + } + } + }, + "Fail to open" : { + "comment" : "Title for the alert when a file fails to open", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error al abrir" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ファイル読み込み失敗" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Falha ao abrir" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось открыть" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开失败" + } + } + } + }, + "Game Controller" : { + "comment" : "Game controller settings", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuración del controlador de juego" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "コントローラ設定" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurações do controle de jogo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Настройки геймпада" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "游戏控制器设置" + } + } + } + }, + "High Quality but slow" : { + "comment" : "Sound option for high quality but slower performance", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta calidad pero lento" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "高品質(遅い)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta qualidade, mas lento" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Высокое качество, но медленно" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "高质量但速度较慢" + } + } + } + }, + "Load State" : { + "comment" : "Load a previously saved game state", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cargar estado de juego guardado previamente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "状態復帰" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregar estado de jogo salvo anteriormente" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Загрузить ранее сохраненное состояние игры" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "加载先前保存的游戏状态" + } + } + } + }, + "Low Quality but fast" : { + "comment" : "Sound option for lower quality but faster performance", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baja calidad pero rápido" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "低品質(早い)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baixa qualidade, mas rápido" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Низкое качество, но быстро" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "低质量但速度较快" + } + } + } + }, + "Native" : { + "comment" : "Resolution option for native resolution", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolución nativa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "デバイスの解像度" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolução nativa" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Разрешение устройства" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设备的分辨率" + } + } + } + }, + "No" : { + "comment" : "Cancel the exit action", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "いいえ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нет" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不" + } + } + } + }, + "None" : { + "comment" : "No backup RAM", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ninguno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "なし" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nenhum" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нет" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无" + } + } + } + }, + "OK" : { + "comment" : "Default action button title", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceptar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "はい" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定" + } + } + } + }, + "Original" : { + "comment" : "Resolution option for original resolution", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolución original" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "セガサターンの解像度" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolução original" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оригинальное разрешение" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "原始分辨率" + } + } + } + }, + "Press a button to map the [%@] key" : { + "comment" : "Message prompting user to press a button to map a key", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Presiona un botón para asignar la tecla [%@]" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "[%@] に該当するボタンを教えてください" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pressione um botão para mapear a tecla [%@]" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нажмите кнопку, чтобы сопоставить клавишу [%@]" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按下一个按钮来映射 [%@] 键" + } + } + } + }, + "Remap Key" : { + "comment" : "Title for remapping a key", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reasignar tecla" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボタンの割り当て" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remapear tecla" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Переназначить клавишу" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新映射按键" + } + } + } + }, + "Reset" : { + "comment" : "Reset the game", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reiniciar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リセット" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сбросить" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置游戏" + } + } + } + }, + "Save State" : { + "comment" : "Save the current state of the game", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guardar estado" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "状態保存" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvar estado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сохранить состояние" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存游戏状态" + } + } + } + }, + "Size: %@" : { + "comment" : "File isze", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tamaño: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サイズ: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tamanho: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Размер: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大小: %@" + } + } + } + }, + "Unbind" : { + "comment" : "Action to unbind the current key", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desvincular" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定しない" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desvincular" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отменить привязку" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消绑定" + } + } + } + }, + "Upgrade" : { + "comment" : "Button title to upgrade to the paid version", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualizar" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップグレード" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualizar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Обновить" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "升级" + } + } + } + }, + "Upgrade Required" : { + "comment" : "Title for the upgrade alert", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualización requerida" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップグレードが必要です" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualização necessária" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Требуется обновление" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要升级" + } + } + } + }, + "Yes" : { + "comment" : "Confirm action to exit the application", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sí" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "はい" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sim" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Да" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "是" + } + } + } + }, + "You can select chd or bin or cue" : { + "comment" : "Message indicating the supported file formats", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Puedes seleccionar chd, bin o cue" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CHD, CUE, BIN を選択することができます" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você pode selecionar chd, bin ou cue" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы можете выбрать chd, bin или cue" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您可以选择 chd、bin 或 cue" + } + } + } + }, + "You have reached the maximum number of files for the free version. Please upgrade to the paid version to add more files." : { + "comment" : "Message indicating that the user needs to upgrade to the paid version to add more files.", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Has alcanzado el número máximo de archivos para la versión gratuita. Por favor, actualiza a la versión de pago para agregar más archivos." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "無料バージョンの最大インストール数に到達しました。これ以上追加したい場合は有料バージョンを入手してください" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você atingiu o número máximo de arquivos para a versão gratuita. Por favor, faça upgrade para a versão paga para adicionar mais arquivos." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы достигли максимального количества файлов для бесплатной версии. Пожалуйста, обновитесь до платной версии, чтобы добавить больше файлов." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您已达到免费版本的最大文件数。请升级到付费版本以添加更多文件。" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/yabause/src/ios/uoyabause/uoyabause/MainScreenController.swift b/yabause/src/ios/uoyabause/uoyabause/MainScreenController.swift new file mode 100644 index 0000000000..81886bc591 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/MainScreenController.swift @@ -0,0 +1,170 @@ +// +// MainScreenController.swift +// uoyabause +// +// Created by MiyamotoShinya on 2016/09/04. +// Copyright © 2016年 devMiyax. All rights reserved. +// + +import Foundation +import UIKit +import UniformTypeIdentifiers + +class MainScreenController :UIViewController, UIDocumentPickerDelegate { + + var activityIndicator: UIActivityIndicatorView! + var blurEffectView: UIVisualEffectView! + var selected_file_path: String = "" + @IBOutlet weak var settingButton: UIButton! + + + override func viewDidLoad() { + super.viewDidLoad() + + // Blur Effect Viewの設定 + let blurEffect = UIBlurEffect(style: .dark) + blurEffectView = UIVisualEffectView(effect: blurEffect) + blurEffectView.frame = self.view.bounds + blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + blurEffectView.isHidden = true + self.view.addSubview(blurEffectView) + + // Activity Indicatorの設定 + activityIndicator = UIActivityIndicatorView(style: .large) + activityIndicator.center = self.view.center + activityIndicator.hidesWhenStopped = true + self.view.addSubview(activityIndicator) + + // Activity Indicatorをビュー階層の一番上に持ってくる + self.view.bringSubviewToFront(activityIndicator) + #if FREE_VERSION + self.navigationItem.title = "Yaba Sanshiro 2 Lite" + #endif + + settingButton.accessibilityIdentifier = "settingButton" + + } + + + @IBAction func onAddFile(_ sender: Any) { + + for child in self.children { + if let fc = child as? FileSelectController { + if fc.checkLimitation() == false { + return + } + } + } + + var documentPicker: UIDocumentPickerViewController! + // iOS 14 & later + let supportedTypes: [UTType] = [ + UTType(filenameExtension: "bin")!, + UTType(filenameExtension: "cue")!, + UTType(filenameExtension: "chd")!, + UTType(filenameExtension: "ccd")!, + UTType(filenameExtension: "img")!, + UTType(filenameExtension: "mds")!, + UTType(filenameExtension: "mdf")!, + ] + + documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes) + documentPicker.delegate = self + documentPicker.allowsMultipleSelection = true + self.present(documentPicker, animated:true, completion: nil) + } + + func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]){ + + self.view.bringSubviewToFront(activityIndicator) + blurEffectView.isHidden = false + activityIndicator.startAnimating() + + DispatchQueue.global(qos: .userInitiated).async { + // 選択されたファイルのURLを処理 + for url in urls { + // ここで各ファイルのURLを処理します + print("Selected file URL: \(url)") + // 例: ファイルを解凍して処理する + self.processFile(at: url) + } + + DispatchQueue.main.async { + self.children.forEach{ + let fc = $0 as? FileSelectController + if fc != nil { + fc?.updateDoc() + } + } + self.blurEffectView.isHidden = true + self.activityIndicator.stopAnimating() + } + } + + } + + func processFile(at fileURL: URL) { + print(fileURL) + + guard fileURL.startAccessingSecurityScopedResource() else { + // エラー処理 + return + } + + var documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + + + let theFileName = fileURL.lastPathComponent + + if theFileName.lowercased().contains(".cue") || + theFileName.lowercased().contains(".bin") || + theFileName.lowercased().contains(".chd") || + theFileName.lowercased().contains(".ccd") || + theFileName.lowercased().contains(".img") || + theFileName.lowercased().contains(".mdf") || + theFileName.lowercased().contains(".mds") + { + documentsUrl.appendPathComponent(theFileName) + + if( documentsUrl != fileURL ){ + + let fileManager = FileManager.default + do { + if fileManager.fileExists(atPath: documentsUrl.path) { + try fileManager.removeItem(at: documentsUrl) + } + try fileManager.copyItem(at: fileURL, to: documentsUrl) + } catch let error as NSError { + print("Fail to copy \(error.localizedDescription)") + return + } + } + + } else{ + let alert: UIAlertController = UIAlertController( + title: NSLocalizedString("Fail to open", comment: "Title for the alert when a file fails to open"), + message: NSLocalizedString("You can select chd or bin or cue", comment: "Message indicating the supported file formats"), + preferredStyle: UIAlertController.Style.alert + ) + + let defaultAction: UIAlertAction = UIAlertAction( + title: NSLocalizedString("OK", comment: "Default action button title"), + style: UIAlertAction.Style.default, + handler: { (action: UIAlertAction!) -> Void in + print("OK") + } + ) + + alert.addAction(defaultAction) + present(alert, animated: true, completion: nil) + return + } + + fileURL.stopAccessingSecurityScopedResource() + + + } + + + +} diff --git a/yabause/src/ios/uoyabause/uoyabause/MenuViewController.swift b/yabause/src/ios/uoyabause/uoyabause/MenuViewController.swift new file mode 100644 index 0000000000..706c98efe6 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/MenuViewController.swift @@ -0,0 +1,164 @@ +// +// MenuViewController.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/20. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation + +protocol MenuViewControllerDelegate: AnyObject { + func didSelect(menuItem: MenuViewController.MenuOptions) + func didChangeAnalogMode(to: Bool) +} + +class SwitchTableViewCell: UITableViewCell { + + let toggleSwitch: UISwitch = { + let toggleSwitch = UISwitch() + toggleSwitch.translatesAutoresizingMaskIntoConstraints = false + return toggleSwitch + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupLayout() + } + + private func setupLayout() { + contentView.addSubview(toggleSwitch) + + // スイッチを左端に配置 + NSLayoutConstraint.activate([ + toggleSwitch.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16), + toggleSwitch.centerYAnchor.constraint(equalTo: contentView.centerYAnchor) + ]) + } +} + + +class MenuViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + + weak var delegate: MenuViewControllerDelegate? + + enum MenuOptions: String, CaseIterable { + case exit = "Exit" + case reset = "Reset" + case changeDisk = "Change Disk" + case backupManager = "Backup Manager" + case saveState = "Save State" + case loadState = "Load State" + case analogMode = "Analog Mode" + case controllerSetting = "Game Controller" + + var imageName: String { + switch self { + case .exit: + return "power" + case .reset: + return "gobackward" + case .changeDisk: + return "opticaldiscdrive" + case .saveState: + return "square.and.arrow.up" + case .loadState: + return "square.and.arrow.down" + case .analogMode: + return "switch.2" + case .controllerSetting: + return "gamecontroller" + case .backupManager: + return "lock.square" + + } + } + + var localizedTitle: String { + switch self { + case .exit: + return NSLocalizedString("Exit", comment: "Exit the application") + case .reset: + return NSLocalizedString("Reset", comment: "Reset the game") + case .changeDisk: + return NSLocalizedString("Change Disk", comment: "Change the game disk") + case .saveState: + return NSLocalizedString("Save State", comment: "Save the current state of the game") + case .loadState: + return NSLocalizedString("Load State", comment: "Load a previously saved game state") + case .analogMode: + return NSLocalizedString("Analog Mode", comment: "Switch to analog mode") + case .controllerSetting: + return NSLocalizedString("Game Controller", comment: "Game controller settings") + case .backupManager: + return NSLocalizedString("Backup Manager", comment: "Backup Manager settings") + + } + } + } + + private let tableView: UITableView = { + let table = UITableView() + table.register(UITableViewCell.self, forCellReuseIdentifier: "cell") + table.register(UITableViewCell.self, forCellReuseIdentifier: "switchCell") + return table + }() + + override func viewDidLoad() { + super.viewDidLoad() + view.addSubview(tableView) + tableView.delegate = self + tableView.dataSource = self + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + tableView.frame = CGRect(x: 0, y: view.safeAreaInsets.top, width: 240, height: view.bounds.size.height) + } + + // UITableViewDataSourceメソッド + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return MenuOptions.allCases.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let option = MenuOptions.allCases[indexPath.row] + + if option == .analogMode { + let cell = tableView.dequeueReusableCell(withIdentifier: "switchCell", for: indexPath) + cell.textLabel?.text = option.localizedTitle + let toggleSwitch = UISwitch() + cell.accessoryView = toggleSwitch + let path = SettingsViewController.getSettingFilname() + if let dic = NSDictionary(contentsOfFile: path) { + toggleSwitch.isOn = (dic["analog mode"] as? Bool) ?? false + } + toggleSwitch.addTarget(self, action: #selector(didChangeAnalogModeSwitch(_:)), for: .valueChanged) + return cell + } else { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + cell.textLabel?.text = option.localizedTitle + cell.imageView?.image = UIImage(systemName: option.imageName) + return cell + } + } + + // トグルスイッチが変更されたときに呼ばれるメソッド + @objc func didChangeAnalogModeSwitch(_ sender: UISwitch) { + // Analog Modeの状態が変更されたときの処理をここに記述します + let isAnalogModeOn = sender.isOn + delegate?.didChangeAnalogMode(to: isAnalogModeOn) + } + + // UITableViewDelegateメソッド + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + let item = MenuOptions.allCases[indexPath.row] + delegate?.didSelect(menuItem: item) + } +} diff --git a/yabause/src/ios/uoyabause/uoyabause/PadButton.h b/yabause/src/ios/uoyabause/uoyabause/PadButton.h new file mode 100644 index 0000000000..f375997dd9 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/PadButton.h @@ -0,0 +1,39 @@ +// +// PadButton.h +// uoyabause +// +// Created by Shinya Miyamoto on 2018/05/01. +// Copyright © 2018年 devMiyax. All rights reserved. +// + +#import +#import + +typedef NS_ENUM (NSUInteger, kPadButtons) { + BUTTON_UP = 0, + BUTTON_RIGHT = 1, + BUTTON_DOWN = 2, + BUTTON_LEFT = 3, + BUTTON_RIGHT_TRIGGER = 4, + BUTTON_LEFT_TRIGGER = 5, + BUTTON_START = 6, + BUTTON_A = 7, + BUTTON_B = 8, + BUTTON_C = 9, + BUTTON_X = 10, + BUTTON_Y = 11, + BUTTON_Z = 12, + BUTTON_LAST = 13 +}; + +@interface PadButton : NSObject { +} +@property UIView * target_; +@property UITouch * is_on_; +@property UITouch * pointid_; +- (void)On :(UITouch *)index; +- (void)Off; +- (Boolean)isOn; +- (Boolean)isOn :(UITouch *)index; +- (UITouch *)getPointId; +@end diff --git a/yabause/src/ios/uoyabause/uoyabause/PadButton.m b/yabause/src/ios/uoyabause/uoyabause/PadButton.m new file mode 100644 index 0000000000..291de2af8e --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/PadButton.m @@ -0,0 +1,49 @@ +// +// PadButton.m +// uoyabause +// +// Created by Shinya Miyamoto on 2018/05/01. +// Copyright © 2018年 devMiyax. All rights reserved. +// + +#import "PadButton.h" + +@implementation PadButton + +-(id) init +{ + if(self = [super init]){ + self.is_on_ = nil; + } + return self; +} + +- (void)On :(UITouch *)index { + self.is_on_ = index; + +} + +- (void)Off { + self.is_on_ = (UITouch *)nil; +} + +- (Boolean)isOn { + if( self.is_on_ != (UITouch *)nil ){ + return TRUE; + } + return FALSE; +} + +- (Boolean)isOn :(UITouch *)index { + if( self.is_on_ != index ){ + return TRUE; + } + return FALSE; +} + +- (UITouch *) getPointId { + return self.is_on_; +} + + +@end diff --git a/yabause/src/ios/uoyabause/uoyabause/PadButton.swift b/yabause/src/ios/uoyabause/uoyabause/PadButton.swift new file mode 100644 index 0000000000..62471cb163 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/PadButton.swift @@ -0,0 +1,62 @@ +// +// PadButton.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/20. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation + +import UIKit + +@objc enum PadButtons: Int { + case up = 0 + case right = 1 + case down = 2 + case left = 3 + case rightTrigger = 4 + case leftTrigger = 5 + case start = 6 + case a = 7 + case b = 8 + case c = 9 + case x = 10 + case y = 11 + case z = 12 + case last = 13 +} + +@objcMembers +class PadButton: NSObject { + var target: UIView? + var _isOn: UITouch? + var pointId: UITouch? + + override init() { + super.init() + self._isOn = nil + } + + func on(_ index: UITouch) { + self._isOn = index + } + + func off() { + self._isOn = nil + } + + func isOn() -> Bool { + return self._isOn != nil + } + + func isOn(_ index: UITouch) -> Bool { + return self._isOn != index + } + + func getPointId() -> UITouch? { + return self._isOn + } +} + + diff --git a/yabause/src/ios/uoyabause/uoyabause/SaturnControllerKeys.h b/yabause/src/ios/uoyabause/uoyabause/SaturnControllerKeys.h new file mode 100644 index 0000000000..883a300b02 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/SaturnControllerKeys.h @@ -0,0 +1,27 @@ +// +// SaturnControllerKeys.h +// uoyabause +// +// Created by Yoshi Sugawara on 12/25/16. +// Copyright © 2016 devMiyax. All rights reserved. +// + +#ifndef SaturnControllerKeys_h +#define SaturnControllerKeys_h +#endif /* SaturnControllerKeys_h */ + +typedef NS_ENUM(NSInteger, SaturnKeyXX) { + SaturnKeyUp = 0, + SaturnKeyRight = 1, + SaturnKeyDown = 2, + SaturnKeyLeft = 3, + SaturnKeyRightTrigger = 4, + SaturnKeyLeftTrigger = 5, + SaturnKeyStart = 6, + SaturnKeyA = 7, + SaturnKeyB = 8, + SaturnKeyC = 9, + SaturnKeyX = 10, + SaturnKeyY = 11, + SaturnKeyZ = 12 +}; diff --git a/yabause/src/ios/uoyabause/uoyabause/SaturnKey.swift b/yabause/src/ios/uoyabause/uoyabause/SaturnKey.swift new file mode 100644 index 0000000000..91e3b16e2e --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/SaturnKey.swift @@ -0,0 +1,26 @@ +// +// SaturnKey.swift +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/20. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation + +@objc enum SaturnKey: Int { + case up = 0 + case right = 1 + case down = 2 + case left = 3 + case rightTrigger = 4 + case leftTrigger = 5 + case start = 6 + case a = 7 + case b = 8 + case c = 9 + case x = 10 + case y = 11 + case z = 12 + case none = 0xFFFF +} diff --git a/yabause/src/ios/uoyabause/uoyabause/SettingsViewController.swift b/yabause/src/ios/uoyabause/uoyabause/SettingsViewController.swift new file mode 100644 index 0000000000..3d7633e8f8 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/SettingsViewController.swift @@ -0,0 +1,333 @@ +// +// SettingsViewController.swift +// uoyabause +// +// Created by MiyamotoShinya on 2016/09/25. +// Copyright © 2016年 devMiyax. All rights reserved. +// + +import Foundation +import UIKit + + +class SettingsViewController :UITableViewController,UIPickerViewDelegate, UIPickerViewDataSource { + + + + let _DATEPICKER_CELL_HEIGHT:CGFloat = 128.0 + + let _cart_group = 0 + let _cart_index = 0 + var _CartPickerIsShowing = false + fileprivate let cartArray: [String] = [ + NSLocalizedString("None", comment: "No backup RAM"), + NSLocalizedString("4Mbit BackupRam", comment: "4 megabit backup RAM"), + NSLocalizedString("8Mbit BackupRam", comment: "8 megabit backup RAM"), + NSLocalizedString("16Mbit BackupRam", comment: "16 megabit backup RAM"), + NSLocalizedString("32Mbit BackupRam", comment: "32 megabit backup RAM"), + NSLocalizedString("8Mbit DRAM", comment: "8 megabit DRAM"), + NSLocalizedString("32Mbit DRAM", comment: "32 megabit DRAM") + ] + fileprivate let cartValues: NSArray = [ 0,2,3,4,5,6,7] + @IBOutlet weak var _cart_sel_label: UILabel! + @IBOutlet weak var _picker: UIPickerView! + + + let _sound_group = 2 + let _sound_index = 0 + var _SoundPickerIsShowing = false + fileprivate let soundArray: [String] = [ + NSLocalizedString("High Quality but slow", comment: "Sound option for high quality but slower performance"), + NSLocalizedString("Low Quality but fast", comment: "Sound option for lower quality but faster performance") + ] + fileprivate let soundValues: NSArray = [ 1,0 ] + //@IBOutlet weak var _sound_picker_label: UILabel! + //@IBOutlet weak var _soundPicker: UIPickerView! + + let _resolution_group = 1 + let _resolution_index = 3 + var _ResolutionPickerIsShowing = false + fileprivate let resolutionArray: [String] = [ + NSLocalizedString("Native", comment: "Resolution option for native resolution"), + NSLocalizedString("4x", comment: "Resolution option for 4 times the native resolution"), + NSLocalizedString("2x", comment: "Resolution option for 2 times the native resolution"), + NSLocalizedString("Original", comment: "Resolution option for original resolution") + ] + fileprivate let resolutionValues: NSArray = [ 0,1,2,3] + @IBOutlet weak var _resolution_sel_label: UILabel! + @IBOutlet weak var _resolution_picker: UIPickerView! + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + @IBOutlet weak var _showFpsSwitch: UISwitch! + @IBOutlet weak var _showFrameSkip: UISwitch! + @IBOutlet weak var _keepAspectRate: UISwitch! + @IBOutlet weak var _rotate_screen: UISwitch! + @IBOutlet weak var _landscape: UISwitch! + @IBOutlet weak var _analog_as_dpad: UISwitch! + + @IBAction func onChangeLandscapeMode(_ sender: Any) { + let userDefaults = UserDefaults.standard + userDefaults.set(_landscape.isOn, forKey: "landscape") + userDefaults.synchronize() + } + + override func viewDidLoad() { + super.viewDidLoad() + _picker.isHidden = !_CartPickerIsShowing + _picker.delegate = self + _picker.dataSource = self + + + _resolution_picker.isHidden = !_SoundPickerIsShowing + _resolution_picker.delegate = self + _resolution_picker.dataSource = self + + let userDefaults = UserDefaults.standard + userDefaults.register(defaults: ["landscape": true]) + //userDefaults.set(true, forKey: "landscape") + _landscape.isOn = userDefaults.bool(forKey: "landscape") + + // + let plist = SettingsViewController.getSettingPlist() + + //_BultinBiosswitch.isOn = plist.value(forKey: "builtin bios") as! Bool + _showFpsSwitch.isOn = plist.value(forKey: "show fps") as! Bool + _showFrameSkip.isOn = plist.value(forKey: "frame skip") as! Bool + _keepAspectRate.isOn = plist.value(forKey: "keep aspect rate") as! Bool + _rotate_screen.isOn = plist.value(forKey: "rotate screen") as! Bool + + _analog_as_dpad.isOn = plist.value(forKey: "analog as dpad") as? Bool ?? false + + + let cart_index = plist.value(forKey: "cartridge") as! Int + + var index : Int = 0 + for i in cartValues { + if( cart_index == i as! Int){ + _cart_sel_label.text = cartArray[index] + } + index += 1; + } + + + + var resolution_index = plist.value(forKey: "rendering resolution") as? Int + if( resolution_index == nil ){ + resolution_index = 0 + } + + index = 0 + for i in resolutionValues { + if( resolution_index == i as? Int){ + _resolution_sel_label.text = resolutionArray[index] + } + index += 1; + } + } + + static func getSettingFilname() -> String { + let libraryPath = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0] + let filename = "settings.plist" + let filePath = libraryPath + "/" + filename + return filePath + } + + static func getSettingPlist() -> NSMutableDictionary { + let filePath = getSettingFilname() + let manager = FileManager() + if( !manager.fileExists(atPath: filePath) ){ + let bundelfilePath = Bundle.main.path(forResource: "settings", ofType: "plist") + do{ + + try + FileManager.default.copyItem(atPath: bundelfilePath!, toPath: filePath) + + } catch let error as NSError { + // Catch fires here, with an NSError being thrown + print("error occurred, here are the details:\n \(error)") + } + } + let plist = NSMutableDictionary(contentsOfFile:filePath) + return plist!; + } + + + + /* + pickerに表示する列数を返すデータソースメソッド. + (実装必須) + */ + func numberOfComponents(in pickerView: UIPickerView) -> Int { + return 1 + } + + /* + pickerに表示する行数を返すデータソースメソッド. + (実装必須) + */ + func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ + + if( pickerView == _picker){ + return cartArray.count + } + else if( pickerView == _resolution_picker){ + return resolutionArray.count + } + return 0; + + + } + + /* + pickerに表示する値を返すデリゲートメソッド. + */ + func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { + + if( pickerView == _picker){ + return cartArray[row] + } + else if( pickerView == _resolution_picker){ + return resolutionArray[row] + } + return soundArray[row] + } + + /* + pickerが選択された際に呼ばれるデリゲートメソッド. + */ + func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + + if( pickerView == _picker ){ + + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(cartValues[row], forKey: "cartridge" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + + _cart_sel_label.text = cartArray[row] + + _CartPickerIsShowing = false; + _picker.isHidden = !_CartPickerIsShowing; + self.tableView.beginUpdates() + self.tableView.endUpdates() + } + + + else if( pickerView == _resolution_picker ){ + + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(resolutionValues[row], forKey: "rendering resolution" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + + + _resolution_sel_label.text = resolutionArray[row] + + _ResolutionPickerIsShowing = false; + _resolution_picker.isHidden = !_ResolutionPickerIsShowing; + self.tableView.beginUpdates() + self.tableView.endUpdates() + } + + } + + @IBAction func RotateScreenChanged(_ sender: Any) { + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(_rotate_screen.isOn, forKey: "rotate screen" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + + } + + + @IBAction func ShowFPSChanged(_ sender: AnyObject) { + + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(_showFpsSwitch.isOn, forKey: "show fps" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + } + + @IBAction func FrameSkipChanged(_ sender: AnyObject) { + + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(_showFrameSkip.isOn, forKey: "frame skip" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + + + } + + @IBAction func AspectrateChnaged(_ sender: AnyObject) { + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(_keepAspectRate.isOn, forKey: "keep aspect rate" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + } + + @IBAction func AasDChanged(_ sender: AnyObject) { + let plist = SettingsViewController.getSettingPlist(); + plist.setObject(_analog_as_dpad.isOn, forKey: "analog as dpad" as NSCopying) + plist.write(toFile: SettingsViewController.getSettingFilname(), atomically: true) + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ + + if( (indexPath as NSIndexPath).section == _cart_group && (indexPath as NSIndexPath).row == _cart_index){ + _CartPickerIsShowing = !_CartPickerIsShowing; + _picker.isHidden = !_CartPickerIsShowing; + + self.tableView.beginUpdates() + self.tableView.endUpdates() + + if( _picker.isHidden == false ){ + + self._picker.alpha = 0 + UIView.animate(withDuration: 0.25, animations: { () -> Void in + self._picker.alpha = 1.0 + }, completion: {(Bool) -> Void in + + }) + } + } + + + + + if( (indexPath as NSIndexPath).section == _resolution_group && (indexPath as NSIndexPath).row == _resolution_index){ + _ResolutionPickerIsShowing = !_ResolutionPickerIsShowing; + _resolution_picker.isHidden = !_ResolutionPickerIsShowing; + + self.tableView.beginUpdates() + self.tableView.endUpdates() + + if( _resolution_picker.isHidden == false ){ + + self._resolution_picker.alpha = 0 + UIView.animate(withDuration: 0.25, animations: { () -> Void in + self._resolution_picker.alpha = 1.0 + }, completion: {(Bool) -> Void in + + }) + } + } + } + + + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + var height: CGFloat = self.tableView.rowHeight + + if ( (indexPath as NSIndexPath).section == _cart_group && (indexPath as NSIndexPath).row == _cart_index+1){ + height = self._CartPickerIsShowing ? self._DATEPICKER_CELL_HEIGHT : CGFloat(0) + } + + if ( (indexPath as NSIndexPath).section == _sound_group && (indexPath as NSIndexPath).row == _sound_index+1){ + height = self._SoundPickerIsShowing ? self._DATEPICKER_CELL_HEIGHT : CGFloat(0) + } + + if ( (indexPath as NSIndexPath).section == _resolution_group && (indexPath as NSIndexPath).row == _resolution_index+1){ + height = self._ResolutionPickerIsShowing ? self._DATEPICKER_CELL_HEIGHT : CGFloat(0) + } + + return height + } + + +} diff --git a/yabause/src/ios/uoyabause/uoyabause/UIDevice.swift b/yabause/src/ios/uoyabause/uoyabause/UIDevice.swift new file mode 100644 index 0000000000..2833ae34f8 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/UIDevice.swift @@ -0,0 +1,53 @@ +// +// UIDevice.swift +// YabaSnashiro +// +// Created by devMiyax on 2024/08/13. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation +import AudioToolbox + +public extension UIDevice +{ + enum FeedbackSupportLevel: Int + { + case unsupported // iPhone 6 or earlier, or non-iPhone (e.g. iPad) + case basic // iPhone 6s + case feedbackGenerator // iPhone 7 and later + } +} + +public extension UIDevice +{ + var feedbackSupportLevel: FeedbackSupportLevel + { + guard let rawValue = self.value(forKey: "_feedbackSupportLevel") as? Int else { return .unsupported } + + let feedbackSupportLevel = FeedbackSupportLevel(rawValue: rawValue) + return feedbackSupportLevel ?? .feedbackGenerator // We'll assume raw values greater than 2 still support UIFeedbackGenerator ¯\_(ツ)_/¯ + } + + var isVibrationSupported: Bool { + #if (arch(i386) || arch(x86_64)) + // Return false for iOS simulator + return false + #else + // All iPhones support some form of vibration, and potentially future non-iPhone devices will support taptic feedback + return (self.model.hasPrefix("iPhone")) || self.feedbackSupportLevel != .unsupported + #endif + } + + func vibrate() + { + guard self.isVibrationSupported else { return } + + switch self.feedbackSupportLevel + { + case .unsupported: break + case .basic, .feedbackGenerator: AudioServicesPlaySystemSound(1519) // "peek" vibration + } + } +} + diff --git a/yabause/src/ios/uoyabause/uoyabause/YabaInterface.h b/yabause/src/ios/uoyabause/uoyabause/YabaInterface.h new file mode 100644 index 0000000000..bbd58bf1f6 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/YabaInterface.h @@ -0,0 +1,67 @@ +// +// ChdWrapper.h +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/14. +// Copyright © 2024 devMiyax. All rights reserved. +// +#import +#import + +extern BOOL _bios; +extern int _cart; +extern BOOL _fps; +extern BOOL _frame_skip; +extern BOOL _aspect_rate; +extern int _filter; +extern int _sound_engine; +extern int _rendering_resolution; +extern BOOL _rotate_screen; +extern float _controller_scale; +extern const char * currentGamePath; + +extern MGLContext *g_context; +extern MGLContext *g_share_context; +extern MGLLayer *glLayer; +extern NSObject* _objectForLock; + + +extern const int MSG_SAVE_STATE; +extern const int MSG_LOAD_STATE; +extern const int MSG_RESET; +extern const int MSG_OPEN_TRAY; +extern const int MSG_CLOSE_TRAY; + +// MSG_RESUME, +// MSG_OPEN_TRAY, +// MSG_CLOSE_TRAY, +// MSG_RESET, + +const unsigned int PERANALOG_AXIS_X = 18; // left to right +const unsigned int PERANALOG_AXIS_Y = 19; // up to down +const unsigned int PERANALOG_AXIS_RTRIGGER = 20; // right trigger +const unsigned int PERANALOG_AXIS_LTRIGGER = 21; // left trigger + +void PerKeyDown(unsigned int key); +void PerKeyUp(unsigned int key); +int SetAnalogMode(int mode); +void PerAxisValue(unsigned int, unsigned char val); +int start_emulation( int originx, int originy, int width, int height ); +void resize_screen( int x, int y, int width, int height ); +int emulation_step( int command ); +int enterBackGround(); +int MuteSound(); +int UnMuteSound(); + + +char * getGameinfoFromChd( const char * path ); + + +NSString* YSGetBackupDevicelist(); +NSString* YSGetBackupFilelist( int deviceid ); +int YSDeleteBackupFile( int index ); +NSString* YSGetBackupFile( int index ); +int YSPutFile( NSString* jsonstr ); +int YSCopy( int target, int file ); + + diff --git a/yabause/src/ios/uoyabause/uoyabause/YabaInterface.mm b/yabause/src/ios/uoyabause/uoyabause/YabaInterface.mm new file mode 100644 index 0000000000..297bfee496 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/YabaInterface.mm @@ -0,0 +1,343 @@ +// +// YabaInterface.m +// YabaSnashiro +// +// Created by Shinya Miyamoto on 2024/07/20. +// Copyright © 2024 devMiyax. All rights reserved. +// + +#import +#include +#import +#include +#include "../../../BackupManager.h" + +extern "C" { + + +#define CART_NONE 0 +#define CART_PAR 1 +#define CART_BACKUPRAM4MBIT 2 +#define CART_BACKUPRAM8MBIT 3 +#define CART_BACKUPRAM16MBIT 4 +#define CART_BACKUPRAM32MBIT 5 +#define CART_DRAM8MBIT 6 +#define CART_DRAM32MBIT 7 +#define CART_NETLINK 8 +#define CART_ROM16MBIT 9 + + +MGLContext *g_context = nil; +MGLContext *g_share_context = nil; + + +// Settings +BOOL _bios =YES; +int _cart = 0; +BOOL _fps = NO; +BOOL _frame_skip = NO; +BOOL _aspect_rate = NO; +int _filter = 0; +int _sound_engine = 0; +int _rendering_resolution = 0; +BOOL _rotate_screen = NO; +float _controller_scale = 1.0; +char * currentGamePath = NULL; + +extern "C" const int MSG_SAVE_STATE = 1; +extern "C" const int MSG_LOAD_STATE = 2; +extern "C" const int MSG_RESET = 3; +extern "C" const int MSG_OPEN_TRAY = 4; +extern "C" const int MSG_CLOSE_TRAY = 5; + + +GLuint _renderBuffer = 0; +NSObject* _objectForLock; +MGLLayer *glLayer = nil; + + +int swapAglBuffer (void) +{ + if( glLayer == nil ) return 0; + + @synchronized (_objectForLock){ + MGLContext* context = [MGLContext currentContext]; + if (![context present:glLayer]) { + } + } + return 0; +} + +void RevokeOGLOnThisThread(void){ + [MGLContext setCurrentContext:g_share_context forLayer:glLayer]; +} + +void UseOGLOnThisThread(void){ + [MGLContext setCurrentContext:g_context forLayer:glLayer]; +} + +const char * GetBiosPath(void){ +#if 1 + return NULL; +#else + if( _bios == YES ){ + return NULL; + } + + NSFileManager *filemgr; + filemgr = [NSFileManager defaultManager]; + NSString * fileName = @"bios.bin"; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSString *filePath = [documentsDirectory stringByAppendingPathComponent: fileName]; + NSLog(@"full path name: %@", filePath); + + // check if file exists + if ([filemgr fileExistsAtPath: filePath] == YES){ + NSLog(@"File exists"); + + }else { + NSLog (@"File not found, file will be created"); + return NULL; + } + + return [filePath fileSystemRepresentation]; +#endif +} + +const char * GetGamePath(void){ + + //if( sharedData_ == nil ){ + // return nil; + // } + //NSString *path = sharedData_.selected_file; + //return [path cStringUsingEncoding:1]; + return currentGamePath;; +} + +const char * GetStateSavePath(void){ + BOOL isDir; + NSFileManager *filemgr; + filemgr = [NSFileManager defaultManager]; + NSString * fileName = @"state/"; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSString *filePath = [documentsDirectory stringByAppendingPathComponent: fileName]; + NSLog(@"full path name: %@", filePath); + + + NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dirName = [docDir stringByAppendingPathComponent:@"state"]; + + + NSFileManager *fm = [NSFileManager defaultManager]; + if(![fm fileExistsAtPath:dirName isDirectory:&isDir]) + { + if([fm createDirectoryAtPath:dirName withIntermediateDirectories:YES attributes:nil error:nil]) + NSLog(@"Directory Created"); + else + NSLog(@"Directory Creation Failed"); + } + else + NSLog(@"Directory Already Exist"); + + return [filePath fileSystemRepresentation]; +} + +const char * GetMemoryPath(void){ + BOOL isDir; + NSFileManager *filemgr; + filemgr = [NSFileManager defaultManager]; + NSString * fileName = @"backup/memory.bin"; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSString *filePath = [documentsDirectory stringByAppendingPathComponent: fileName]; + NSLog(@"full path name: %@", filePath); + + + NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dirName = [docDir stringByAppendingPathComponent:@"backup"]; + + + NSFileManager *fm = [NSFileManager defaultManager]; + if(![fm fileExistsAtPath:dirName isDirectory:&isDir]) + { + if([fm createDirectoryAtPath:dirName withIntermediateDirectories:YES attributes:nil error:nil]) + NSLog(@"Directory Created"); + else + NSLog(@"Directory Creation Failed"); + } + else + NSLog(@"Directory Already Exist"); + + // check if file exists + if ([filemgr fileExistsAtPath: filePath] == YES){ + NSLog(@"File exists"); + + }else { + NSLog (@"File not found, file will be created"); + } + + return [filePath fileSystemRepresentation]; +} + +int GetCartridgeType(void){ + return _cart; +} + +int GetVideoInterface(void){ + return 0; +} + +int GetEnableFPS(void){ + if( _fps == YES ) + return 1; + + return 0; +} + +int GetIsRotateScreen(void) { + if( _rotate_screen == YES ) + return 1; + + return 0; +} + +int GetEnableFrameSkip(void){ + if( _frame_skip == YES ){ + return 1; + } + return 0; +} + +int GetUseNewScsp(void){ + return 1; //_sound_engine; +} + +int GetVideFilterType(void){ + return _filter; +} + +int GetResolutionType(void){ + NSLog (@"GetResolutionType %d",_rendering_resolution); + return _rendering_resolution; +} + +const char * GetCartridgePath(void){ + BOOL isDir; + NSFileManager *filemgr; + filemgr = [NSFileManager defaultManager]; + NSString * fileName = @"cart/invalid.ram"; + + switch(_cart) { + case CART_NONE: + fileName = @"cart/none.ram"; + case CART_PAR: + fileName = @"cart/par.ram"; + case CART_BACKUPRAM4MBIT: + fileName = @"cart/backup4.ram"; + case CART_BACKUPRAM8MBIT: + fileName = @"cart/backup8.ram"; + case CART_BACKUPRAM16MBIT: + fileName = @"cart/backup16.ram"; + case CART_BACKUPRAM32MBIT: + fileName = @"cart/backup32.ram"; + case CART_DRAM8MBIT: + fileName = @"cart/dram8.ram"; + case CART_DRAM32MBIT: + fileName = @"cart/dram32.ram"; + case CART_NETLINK: + fileName = @"cart/netlink.ram"; + case CART_ROM16MBIT: + fileName = @"cart/om16.ram"; + default: + fileName = @"cart/invalid.ram"; + } + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSString *filePath = [documentsDirectory stringByAppendingPathComponent: fileName]; + NSLog(@"full path name: %@", filePath); + + + NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dirName = [docDir stringByAppendingPathComponent:@"cart"]; + + + NSFileManager *fm = [NSFileManager defaultManager]; + if(![fm fileExistsAtPath:dirName isDirectory:&isDir]) + { + if([fm createDirectoryAtPath:dirName withIntermediateDirectories:YES attributes:nil error:nil]) + NSLog(@"Directory Created"); + else + NSLog(@"Directory Creation Failed"); + } + else + NSLog(@"Directory Already Exist"); + + // check if file exists + if ([filemgr fileExistsAtPath: filePath] == YES){ + NSLog(@"File exists"); + + }else { + NSLog (@"File not found, file will be created"); + } + return [filePath fileSystemRepresentation]; +} + +int GetPlayer2Device(void){ + return -1; +} + +NSString* YSGetBackupDevicelist(){ + BackupManager * i = BackupManager::getInstance(); + string jsonstr; + i->getDevicelist(jsonstr); + NSString *objcString = [NSString stringWithUTF8String:jsonstr.c_str()]; + return objcString; +} + +NSString* YSGetBackupFilelist( int deviceid ){ + BackupManager * i = BackupManager::getInstance(); + string jsonstr; + i->getFilelist(deviceid,jsonstr); + NSString *objcString = [NSString stringWithUTF8String:jsonstr.c_str()]; + return objcString; +} + +int YSDeleteBackupFile( int index ){ + BackupManager * i = BackupManager::getInstance(); + string jsonstr; + return i->deletefile(index); +} + +NSString* YSGetBackupFile( int index ){ + BackupManager * i = BackupManager::getInstance(); + string jsonstr; + i->getFile(index,jsonstr); + NSString *objcString = [NSString stringWithUTF8String:jsonstr.c_str()]; + return objcString; +} + +int YSPutFile( NSString* jsonstr ){ + const char *cString = [jsonstr UTF8String]; + if (cString == NULL) return -1; + BackupManager * i = BackupManager::getInstance(); + int rtn = i->putFile(string(cString)); + return rtn; +} + +int YSCopy( int target, int file ){ + BackupManager * i = BackupManager::getInstance(); + return i->copy(target,file); +} + + +} // extern "C" diff --git a/yabause/src/ios/uoyabause/uoyabause/apikey.plist b/yabause/src/ios/uoyabause/uoyabause/apikey.plist new file mode 100644 index 0000000000..4ad42e9491 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/apikey.plist @@ -0,0 +1,10 @@ + + + + + ADMOB_KEY_FULLSCREEN + ca-app-pub-1 + ADMOB_KEY + ca-app-pub-1 + + diff --git a/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.h b/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.h new file mode 100644 index 0000000000..8ed9afb5a8 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.h @@ -0,0 +1,22 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +// This code implements the emulated audio using CoreAudio for iOS +// Originally written by jtraynham + +void iOSCoreAudioInit(); +void iOSCoreAudioShutdown(); diff --git a/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.m b/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.m new file mode 100644 index 0000000000..20ef87a998 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/iOSCoreAudio.m @@ -0,0 +1,167 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +// This code implements the emulated audio using CoreAudio for iOS +// Originally written by jtraynham + +#include "iOSCoreAudio.h" + +//#include "Common/Log.h" + +#include +#import + + +#define SAMPLE_RATE 44100 + +AudioComponentInstance audioInstance = nil; + +int NativeMix(short *audio, int num_samples); + +OSStatus iOSCoreAudioCallback(void *inRefCon, + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData) +{ + // see if we have any sound to play + short *output = (short *)ioData->mBuffers[0].mData; + UInt32 framesReady = NativeMix(output, inNumberFrames); + + if (framesReady == 0) { + // oops, we don't currently have any sound, so return silence + *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence; + } + + /* + * You'd think iOS would want to know how many frames were + * actually generated in case it was less than asked for, but + * apparently that causes micro-stuttering and everything just + * works better if we lie and say we successfully generated as + * many frames as it wanted... weird. We still get micro-stuttering + * but it's less noticeable this way. + */ + //UInt32 bytesReady = framesReady * sizeof(short) * 2; + UInt32 bytesReady = inNumberFrames * sizeof(short) * 2; + ioData->mBuffers[0].mDataByteSize = bytesReady; + + return noErr; +} + +void iOSCoreAudioInit() +{ + NSError *error = nil; + AVAudioSession *session = [AVAudioSession sharedInstance]; + if (![session setActive:YES error:&error]) { +// ERROR_LOG(SYSTEM, "Failed to activate AVFoundation audio session"); + if (error.localizedDescription) { + NSLog(@"%@", error.localizedDescription); + } + if (error.localizedFailureReason) { + NSLog(@"%@", error.localizedFailureReason); + } + } + + if (!audioInstance) { + OSErr err; + + // first, grab the default output + AudioComponentDescription defaultOutputDescription; + defaultOutputDescription.componentType = kAudioUnitType_Output; + defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO; + defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple; + defaultOutputDescription.componentFlags = 0; + defaultOutputDescription.componentFlagsMask = 0; + AudioComponent defaultOutput = AudioComponentFindNext(NULL, &defaultOutputDescription); + + // create our instance + err = AudioComponentInstanceNew(defaultOutput, &audioInstance); + if (err != noErr) { + audioInstance = nil; + return; + } + + // create our callback so we can give it the audio data + AURenderCallbackStruct input; + input.inputProc = iOSCoreAudioCallback; + input.inputProcRefCon = NULL; + err = AudioUnitSetProperty(audioInstance, + kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Input, + 0, + &input, + sizeof(input)); + if (err != noErr) { + AudioComponentInstanceDispose(audioInstance); + audioInstance = nil; + return; + } + + // setup the audio format we'll be using (stereo pcm) + AudioStreamBasicDescription streamFormat; + memset(&streamFormat, 0, sizeof(streamFormat)); + streamFormat.mSampleRate = SAMPLE_RATE; + streamFormat.mFormatID = kAudioFormatLinearPCM; + streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; + streamFormat.mBitsPerChannel = sizeof(short) * 8; + streamFormat.mChannelsPerFrame = 2; + streamFormat.mFramesPerPacket = 1; + streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel / 8) * streamFormat.mChannelsPerFrame; + streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame * streamFormat.mFramesPerPacket; + err = AudioUnitSetProperty(audioInstance, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + 0, + &streamFormat, + sizeof(AudioStreamBasicDescription)); + if (err != noErr) { + AudioComponentInstanceDispose(audioInstance); + audioInstance = nil; + return; + } + + // k, all setup, so init + err = AudioUnitInitialize(audioInstance); + if (err != noErr) { + AudioComponentInstanceDispose(audioInstance); + audioInstance = nil; + return; + } + + // finally start playback + err = AudioOutputUnitStart(audioInstance); + if (err != noErr) { + AudioUnitUninitialize(audioInstance); + AudioComponentInstanceDispose(audioInstance); + audioInstance = nil; + return; + } + + // we're good to go + } +} + +void iOSCoreAudioShutdown() +{ + if (audioInstance) { + AudioOutputUnitStop(audioInstance); + AudioUnitUninitialize(audioInstance); + AudioComponentInstanceDispose(audioInstance); + audioInstance = nil; + } +} diff --git a/yabause/src/ios/uoyabause/uoyabause/mul.lproj/LaunchScreen.xcstrings b/yabause/src/ios/uoyabause/uoyabause/mul.lproj/LaunchScreen.xcstrings new file mode 100644 index 0000000000..fa56d16199 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/mul.lproj/LaunchScreen.xcstrings @@ -0,0 +1,7 @@ +{ + "sourceLanguage" : "en", + "strings" : { + + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/yabause/src/ios/uoyabause/uoyabause/mul.lproj/Main.xcstrings b/yabause/src/ios/uoyabause/uoyabause/mul.lproj/Main.xcstrings new file mode 100644 index 0000000000..cafa8e12ad --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/mul.lproj/Main.xcstrings @@ -0,0 +1,972 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "0uv-hR-62t.text" : { + "comment" : "Class = \"UILabel\"; text = \"Show FPS\"; ObjectID = \"0uv-hR-62t\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Show FPS" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar FPS" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "FPSを表示する" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exibir FPS" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Показать FPS" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示帧率" + } + } + } + }, + "2kC-86-hOR.text" : { + "comment" : "Class = \"UILabel\"; text = \"Load State\"; ObjectID = \"2kC-86-hOR\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cargar estado" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "状態読み込み" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregar Estado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Загрузка состояния" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "加载状态" + } + } + } + }, + "5kh-BO-spI.text" : { + "comment" : "Class = \"UILabel\"; text = \"Label\"; ObjectID = \"5kh-BO-spI\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Label" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etiqueta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Label" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etiqueta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Маркер" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "标签" + } + } + } + }, + "05T-W3-45O.text" : { + "comment" : "Class = \"UILabel\"; text = \"Force Landscape Mode\"; ObjectID = \"05T-W3-45O\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Force Landscape Mode" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forzar modo horizontal" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "常に横画面モード" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modo Paisagem Forçado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Силовое Расположение" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "强制横向模式" + } + } + } + }, + "7a9-1I-qMs.text" : { + "comment" : "Class = \"UILabel\"; text = \"Keep original aspect rate\"; ObjectID = \"7a9-1I-qMs\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Keep original aspect rate" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mantener proporción original" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "縦横比を固定する" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manter taxa de aspecto original" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сохранение Изображения в первоначальной форме" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保持原始纵横比" + } + } + } + }, + "a6W-wy-CZs.text" : { + "comment" : "Class = \"UILabel\"; text = \"Rotate 90 degree\"; ObjectID = \"a6W-wy-CZs\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rotate 90 degree" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rotar 90 grados" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "画面を90度回転させる" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rotacionar 90 graus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Переключение на 90 градусов" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "旋转90度" + } + } + } + }, + "a8b-Pg-2IA.text" : { + "comment" : "Class = \"UILabel\"; text = \"Adjust Controller\"; ObjectID = \"a8b-Pg-2IA\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustar controlador" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "コントローラーの調整" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustar Controle" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Правка Контроллера" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "调整控制器" + } + } + } + }, + "Adw-oe-5dn.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Graphics\"; ObjectID = \"Adw-oe-5dn\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Graphics" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gráficos" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "グラフィック設定" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gráficos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Графика" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图形" + } + } + } + }, + "DjX-3S-nbY.text" : { + "comment" : "Class = \"UILabel\"; text = \"Rendering Resolution\"; ObjectID = \"DjX-3S-nbY\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rendering Resolution" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolución de renderizado" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "描画解像度" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolução de Rendering" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Резолюция Расчета" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "渲染分辨率" + } + } + } + }, + "dP5-m9-P5R.title" : { + "comment" : "Class = \"UINavigationItem\"; title = \"Setting\"; ObjectID = \"dP5-m9-P5R\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Setting" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuración" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurações" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Настройки" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置" + } + } + } + }, + "GDt-1B-FZj.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Controller\"; ObjectID = \"GDt-1B-FZj\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Controller" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "コントローラー設定" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlador" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlador" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Контроллер" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "控制器" + } + } + } + }, + "HEk-JT-gUF.text" : { + "comment" : "Class = \"UILabel\"; text = \"Frame Skip\"; ObjectID = \"HEk-JT-gUF\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Frame Skip" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omisión de fotogramas" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "フレームをスキップする" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pular Quadros" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Переключение кадров" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳帧" + } + } + } + }, + "Iwo-k1-gyt.text" : { + "comment" : "Class = \"UILabel\"; text = \"Show Remap Controls\"; ObjectID = \"Iwo-k1-gyt\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar controles de reasignación" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show Remap Controls" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Controles de Remapeamento" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Показать Управление Расмапа" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示重映射控制" + } + } + } + }, + "KCH-Zr-n0O.text" : { + "comment" : "Class = \"UILabel\"; text = \"Use Analog Pad as D-pad\"; ObjectID = \"KCH-Zr-n0O\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use Analog Pad as D-pad" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アナログパッドをDPadとして使用する" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar el pad analógico como D-pad" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar o pad analógico como D-pad" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Использовать аналоговый пад как D-pad" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将模拟方向盘用作D-pad" + } + } + } + }, + "kHL-Tt-8Bi.title" : { + "comment" : "Class = \"UISwitch\"; title = \"Use Analog pad as D-Pad\"; ObjectID = \"kHL-Tt-8Bi\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Use Analog pad as D-Pad" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アナログパッドをDPadとして使用する" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar el pad analógico como D-pad" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar o pad analógico como D-pad" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Использовать аналоговый пад как D-pad" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将模拟方向盘用作D-pad" + } + } + } + }, + "KND-t5-hSX.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"General\"; ObjectID = \"KND-t5-hSX\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "General" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "General" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "一般" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geral" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Общее" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通用" + } + } + } + }, + "N8h-Be-Hod.normalTitle" : { + "comment" : "Class = \"UIButton\"; normalTitle = \"Settings\"; ObjectID = \"N8h-Be-Hod\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Settings" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuración" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurações" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Настройки" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置" + } + } + } + }, + "NHI-fu-wtb.title" : { + "comment" : "Class = \"UINavigationItem\"; title = \"Yaba Sanshiro 2\"; ObjectID = \"NHI-fu-wtb\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Yaba Sanshiro 2" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaba Sanshiro 2" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaba Sanshiro 2" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaba Sanshiro 2" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaba Sanshiro 2" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yaba Sanshiro 2" + } + } + } + }, + "NIg-ct-7sX.text" : { + "comment" : "Class = \"UILabel\"; text = \"Resolution Picker label\"; ObjectID = \"NIg-ct-7sX\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Resolution Picker label" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etiqueta del selector de resolución" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolution Picker label" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seleção de Resolução" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Выбор Разрешения" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分辨率选择标签" + } + } + } + }, + "oik-51-mjH.text" : { + "comment" : "Class = \"UILabel\"; text = \"Change Disk\"; ObjectID = \"oik-51-mjH\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambiar disco" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ディスク交換" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alterar Disco" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Смена Диска" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更换光盘" + } + } + } + }, + "Tsw-hZ-S89.text" : { + "comment" : "Class = \"UILabel\"; text = \"Cartridge\"; ObjectID = \"Tsw-hZ-S89\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cartridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cartucho" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カードリッジ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregador" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Карtridge" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "卡带" + } + } + } + }, + "wEc-St-PPd.text" : { + "comment" : "Class = \"UILabel\"; text = \"Save State\"; ObjectID = \"wEc-St-PPd\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guardar estado" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "状態保存" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvar Estado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сохранение состояния" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存状态" + } + } + } + }, + "X1O-pp-oDF.text" : { + "comment" : "Class = \"UILabel\"; text = \"Exit\"; ObjectID = \"X1O-pp-oDF\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salir" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "終了" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sair" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Выход" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出" + } + } + } + }, + "XY2-Ni-Gbc.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Emulation menu\"; ObjectID = \"XY2-Ni-Gbc\";", + "extractionState" : "manual", + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menú de emulación" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emulation menu" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menu de Emulação" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Меню Эмуляции" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "模拟菜单" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/yabause/src/ios/uoyabause/uoyabause/settings.plist b/yabause/src/ios/uoyabause/uoyabause/settings.plist new file mode 100644 index 0000000000..2974a1253d --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/settings.plist @@ -0,0 +1,28 @@ + + + + + analog as dpad + + controller scale + 0.8 + rotate screen + + sound engine + 1 + frame skip + + keep aspect rate + + show fps + + cartridge + 0 + rendering resolution + 0 + analog mode + + builtin bios + + + diff --git a/yabause/src/ios/uoyabause/uoyabause/start_button.png b/yabause/src/ios/uoyabause/uoyabause/start_button.png new file mode 100644 index 0000000000..1959603baa Binary files /dev/null and b/yabause/src/ios/uoyabause/uoyabause/start_button.png differ diff --git a/yabause/src/ios/uoyabause/uoyabause/uoyabause-Bridging-Header.h b/yabause/src/ios/uoyabause/uoyabause/uoyabause-Bridging-Header.h new file mode 100644 index 0000000000..5f3e6bc284 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabause/uoyabause-Bridging-Header.h @@ -0,0 +1,9 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +//#import "GameViewController.h" +#import "YabaInterface.h" +#import +#import "iOSCoreAudio.h" +#import diff --git a/yabause/src/ios/uoyabause/uoyabauseTests/Info.plist b/yabause/src/ios/uoyabause/uoyabauseTests/Info.plist new file mode 100644 index 0000000000..8dd3f625e1 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabauseTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + UIFileSharingEnabled + + + diff --git a/yabause/src/ios/uoyabause/uoyabauseTests/uoyabauseTests.m b/yabause/src/ios/uoyabause/uoyabauseTests/uoyabauseTests.m new file mode 100644 index 0000000000..3349fa1296 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabauseTests/uoyabauseTests.m @@ -0,0 +1,39 @@ +// +// uoyabauseTests.m +// uoyabauseTests +// +// Created by MiyamotoShinya on 2016/02/06. +// Copyright © 2016年 devMiyax. All rights reserved. +// + +#import + +@interface uoyabauseTests : XCTestCase + +@end + +@implementation uoyabauseTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/yabause/src/ios/uoyabause/uoyabauseUITests/Info.plist b/yabause/src/ios/uoyabause/uoyabauseUITests/Info.plist new file mode 100644 index 0000000000..d4ca1b1977 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabauseUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/yabause/src/ios/uoyabause/uoyabauseUITests/MainScreenTest.swift b/yabause/src/ios/uoyabause/uoyabauseUITests/MainScreenTest.swift new file mode 100644 index 0000000000..e979373eab --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabauseUITests/MainScreenTest.swift @@ -0,0 +1,49 @@ +// +// MainScreenTest.swift +// YabaSnashiroUITests +// +// Created by devMiyax on 2024/08/04. +// Copyright © 2024 devMiyax. All rights reserved. +// + +import Foundation +import XCTest + +final class uoyabauseUITests: XCTestCase { + + var app:XCUIApplication? + + @MainActor override func setUp() { + super.setUp() + continueAfterFailure = false + self.app = XCUIApplication() + setupSnapshot(self.app!) + self.app!.launch() + } + + @MainActor + func testScreenShot1() { +/* + // Wait 5 seconds + let expectation = self.expectation(description: "Waiting for 5 seconds") + + // 5秒後に期待を満たす + DispatchQueue.main.asyncAfter(deadline: .now() + 5) { + expectation.fulfill() + } + + // 期待が満たされるまで5秒待機 + wait(for: [expectation], timeout: 5.1) +*/ + snapshot("01MainScreen") + + // Wait for the "Settings" button to appear (timeout after 10 seconds) + let settingsButton = app!.buttons["settingButton"] + XCTAssertTrue(settingsButton.waitForExistence(timeout: 10), "Settings button did not appear") + + // Tap the button + settingsButton.tap() + + snapshot("02NextScreen") + } +} diff --git a/yabause/src/ios/uoyabause/uoyabauseUITests/YabaSnashiroUITests-Bridging-Header.h b/yabause/src/ios/uoyabause/uoyabauseUITests/YabaSnashiroUITests-Bridging-Header.h new file mode 100644 index 0000000000..1b2cb5d6d0 --- /dev/null +++ b/yabause/src/ios/uoyabause/uoyabauseUITests/YabaSnashiroUITests-Bridging-Header.h @@ -0,0 +1,4 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + diff --git a/yabause/src/ios/yui.cpp b/yabause/src/ios/yui.cpp new file mode 100644 index 0000000000..4a7d81729e --- /dev/null +++ b/yabause/src/ios/yui.cpp @@ -0,0 +1,519 @@ + +extern "C"{ +#include "config.h" +#include "yabause.h" +#include "scsp.h" +#include "vidsoft.h" +#include "vidogl.h" +#include "peripheral.h" +#include "m68kcore.h" +#include "sh2core.h" +#include "sh2int.h" +#include "cdbase.h" +#include "cs2.h" +#include "debug.h" +#include "osdcore_ios.h" +#include "sndal.h" +#include "sndCoreAudio.h" +#include "ygl.h" +#include "chd.h" +} + +#include +#include +#include + +const int MSG_SAVE_STATE = 1; +const int MSG_LOAD_STATE = 2; +const int MSG_RESET = 3; +const int MSG_OPEN_TRAY = 4; +const int MSG_CLOSE_TRAY = 5; + +//#include +//#include + +#define YUI_LOG printf +#define MAKE_PAD(a,b) ((a<<24)|(b)) + +extern "C"{ + void RevokeOGLOnThisThread(); + void UseOGLOnThisThread(); +} + + +extern "C" { +int yprintf( const char * fmt, ... ) +{ + int result = 0; + va_list ap; + va_start(ap, fmt); + result = vprintf(fmt, ap); + va_end(ap); + return result; +} +} + +// Setting Infomation From +static char mpegpath[256] = "\0"; +static char cartpath[256] = "\0"; +static char screenShotFilename[256] = "\0"; +const char * s_biospath = NULL; +const char * s_cdpath = NULL; +char s_buppath[256] ="\0"; +char s_cartpath[256] ="\0"; +int s_carttype; +char s_savepath[256] ="\0"; +int s_vidcoretype = VIDCORE_OGL; +int s_player2Enable = -1; +int g_EnagleFPS = 1; +int g_CpuType = 2; +int g_VideoFilter = 0; +VideoInterface_struct *VIDCoreList[] = { + &VIDDummy, + &VIDSoft, + &VIDOGL, + NULL +}; + +M68K_struct * M68KCoreList[] = { + &M68KDummy, +#ifdef HAVE_C68K + &M68KC68K, +#endif +#ifdef HAVE_Q68 + &M68KQ68, +#endif +#ifdef HAVE_MUSASHI +&M68KMusashi, +#endif + NULL +}; + +SH2Interface_struct *SH2CoreList[] = { + &SH2Interpreter, + &SH2DebugInterpreter, +#ifdef SH2_DYNAREC + &SH2Dynarec, +#endif +#ifdef DYNAREC_DEVMIYAX + &SH2Dyn, +#endif + NULL +}; + +PerInterface_struct *PERCoreList[] = { + &PERDummy, + NULL +}; + +CDInterface *CDCoreList[] = { + &DummyCD, + &ISOCD, + NULL +}; + +SoundInterface_struct *SNDCoreList[] = { + &SNDDummy, + &SNDAL, + &SNDCoreAudio, + NULL +}; + + +extern "C" { + + const char * GetBiosPath(); + const char * GetGamePath(); + const char * GetMemoryPath(); + const char * GetStateSavePath(); + int GetCartridgeType(); + int GetVideoInterface(); + const char * GetCartridgePath(); + int GetPlayer2Device(); + int GetEnableFPS(); + int GetEnableFrameSkip(); + int GetUseNewScsp(); + int GetVideFilterType(); + int GetResolutionType(); + int GetIsRotateScreen(); + int SetAnalogMode(int mode); + + char * getGameinfoFromChd( const char * path ); + +int swapAglBuffer (); + +int g_pad_mode = 0; +int g_pad2_mode = 0; +void update_pad_mode(); + +int SetAnalogMode(int mode){ + g_pad_mode = mode; + update_pad_mode(); + return 0; +} + +void update_pad_mode() +{ + void *padbits; + + PerPortReset(); + + if (g_pad_mode == 0) + { + padbits = PerPadAdd(&PORTDATA1); + PerSetKey(MAKE_PAD(0, PERPAD_UP), PERPAD_UP, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_RIGHT), PERPAD_RIGHT, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_DOWN), PERPAD_DOWN, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_LEFT), PERPAD_LEFT, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_START), PERPAD_START, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_A), PERPAD_A, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_B), PERPAD_B, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_C), PERPAD_C, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_X), PERPAD_X, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_Y), PERPAD_Y, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_Z), PERPAD_Z, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_RIGHT_TRIGGER), PERPAD_RIGHT_TRIGGER, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_LEFT_TRIGGER), PERPAD_LEFT_TRIGGER, padbits); + } + else if (g_pad_mode == 1) + { + + padbits = Per3DPadAdd(&PORTDATA1); + + PerSetKey(MAKE_PAD(0, PERANALOG_AXIS1), PERANALOG_AXIS1, padbits); + PerSetKey(MAKE_PAD(0, PERANALOG_AXIS2), PERANALOG_AXIS2, padbits); + PerSetKey(MAKE_PAD(0, PERANALOG_AXIS3), PERANALOG_AXIS3, padbits); + PerSetKey(MAKE_PAD(0, PERANALOG_AXIS4), PERANALOG_AXIS4, padbits); + + PerSetKey(MAKE_PAD(0, PERPAD_UP), PERPAD_UP, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_RIGHT), PERPAD_RIGHT, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_DOWN), PERPAD_DOWN, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_LEFT), PERPAD_LEFT, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_START), PERPAD_START, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_A), PERPAD_A, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_B), PERPAD_B, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_C), PERPAD_C, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_X), PERPAD_X, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_Y), PERPAD_Y, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_Z), PERPAD_Z, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_RIGHT_TRIGGER), PERPAD_RIGHT_TRIGGER, padbits); + PerSetKey(MAKE_PAD(0, PERPAD_LEFT_TRIGGER), PERPAD_LEFT_TRIGGER, padbits); + } + + if (s_player2Enable != -1) + { + if (g_pad2_mode == 0) + { + padbits = PerPadAdd(&PORTDATA2); + PerSetKey(MAKE_PAD(1, PERPAD_UP), PERPAD_UP, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_RIGHT), PERPAD_RIGHT, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_DOWN), PERPAD_DOWN, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_LEFT), PERPAD_LEFT, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_START), PERPAD_START, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_A), PERPAD_A, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_B), PERPAD_B, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_C), PERPAD_C, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_X), PERPAD_X, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_Y), PERPAD_Y, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_Z), PERPAD_Z, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_RIGHT_TRIGGER), PERPAD_RIGHT_TRIGGER, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_LEFT_TRIGGER), PERPAD_LEFT_TRIGGER, padbits); + } + else + { + padbits = Per3DPadAdd(&PORTDATA2); + PerSetKey(MAKE_PAD(1, PERANALOG_AXIS1), PERANALOG_AXIS1, padbits); + PerSetKey(MAKE_PAD(1, PERANALOG_AXIS2), PERANALOG_AXIS2, padbits); + PerSetKey(MAKE_PAD(1, PERANALOG_AXIS3), PERANALOG_AXIS3, padbits); + PerSetKey(MAKE_PAD(1, PERANALOG_AXIS4), PERANALOG_AXIS4, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_UP), PERPAD_UP, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_RIGHT), PERPAD_RIGHT, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_DOWN), PERPAD_DOWN, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_LEFT), PERPAD_LEFT, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_START), PERPAD_START, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_A), PERPAD_A, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_B), PERPAD_B, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_C), PERPAD_C, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_X), PERPAD_X, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_Y), PERPAD_Y, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_Z), PERPAD_Z, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_RIGHT_TRIGGER), PERPAD_RIGHT_TRIGGER, padbits); + PerSetKey(MAKE_PAD(1, PERPAD_LEFT_TRIGGER), PERPAD_LEFT_TRIGGER, padbits); + } + } +} + + +int start_emulation( int originx, int originy, int width, int height ){ + int i; + int res; + yabauseinit_struct yinit ={}; + void * padbits; + + s_biospath = GetBiosPath(); + s_cdpath = GetGamePath(); + strcpy(s_buppath,GetMemoryPath()); + strcpy(s_cartpath,GetCartridgePath()); + strcpy(s_savepath,GetStateSavePath()); + s_vidcoretype = GetVideoInterface(); + s_carttype = GetCartridgeType(); + + //s_player2Enable = GetPlayer2Device(); + + YUI_LOG("%s",glGetString(GL_VENDOR)); + YUI_LOG("%s",glGetString(GL_RENDERER)); + YUI_LOG("%s",glGetString(GL_VERSION)); + YUI_LOG("%s",glGetString(GL_EXTENSIONS)); + //YUI_LOG("%s",eglQueryString(g_Display,EGL_EXTENSIONS)); + +#if !defined(YAB_ASYNC_RENDERING) + UseOGLOnThisThread(); +#endif + + g_EnagleFPS = GetEnableFPS(); + + glViewport(0,0,width,height); + + glClearColor( 0.0f, 0.0f,0.0f,1.0f); + glClear( GL_COLOR_BUFFER_BIT ); + + memset( &yinit,0,sizeof(yinit) ); + yinit.m68kcoretype = M68KCORE_MUSASHI; //M68KCORE_Q68; //M68KCORE_Q68; //M68KCORE_DUMMY; //M68KCORE_C68K; + yinit.percoretype = PERCORE_DUMMY; + yinit.sh2coretype = SH2CORE_DEFAULT; + yinit.vidcoretype = VIDCORE_OGL; + yinit.sndcoretype = SNDCORE_COREAUDIO; + yinit.cdcoretype = CDCORE_ISO; + yinit.regionid = 0; + + yinit.biospath = s_biospath; + yinit.cdpath = s_cdpath; + yinit.buppath = s_buppath; + printf("buppath = %s\n",yinit.buppath); + yinit.carttype = s_carttype; + yinit.cartpath = s_cartpath; + + printf("bios %s¥n",s_biospath); + LogStart(); + + yinit.mpegpath = mpegpath; + yinit.videoformattype = VIDEOFORMATTYPE_NTSC; + yinit.frameskip = GetEnableFrameSkip(); + yinit.usethreads = 0; + yinit.skip_load = 0; + yinit.video_filter_type = g_VideoFilter; + s_vidcoretype = VIDCORE_OGL; + yinit.use_new_scsp = GetUseNewScsp(); + yinit.video_filter_type = GetVideFilterType(); + yinit.resolution_mode = GetResolutionType(); + yinit.rotate_screen = GetIsRotateScreen(); + yinit.extend_backup = 1; + yinit.scsp_sync_count_per_frame = 4; + yinit.scsp_main_mode = 0; + yinit.use_cpu_affinity = 0; + yinit.use_sh2_cache = 1; + yinit.polygon_generation_mode = PERSPECTIVE_CORRECTION; + + res = YabauseInit(&yinit); + if (res != 0) { + YUI_LOG("Fail to YabauseInit %d", res); + return -1; + } + + update_pad_mode(); + + //ScspSetFrameAccurate(1); + ScspUnMuteAudio(SCSP_MUTE_SYSTEM); + ScspSetVolume(100); + + OSDInit(0); + OSDChangeCore(OSDCORE_NANOVG); + + + if( s_vidcoretype == VIDCORE_OGL ){ + + for (i = 0; VIDCoreList[i] != NULL; i++) + { + if (VIDCoreList[i]->id == s_vidcoretype) + { + VIDCoreList[i]->Resize(originx,originy,width,height,1,0); + break; + } + } + }else{ + //OSDChangeCore(OSDCORE_SOFT); + //if( YuiInitProgramForSoftwareRendering() != GL_TRUE ){ + // YUI_LOG("Fail to YuiInitProgramForSoftwareRendering"); + // return -1; + //} + } + + return 0; +} + void resize_screen( int x, int y, int width, int height ){ + int i=0; + for (i = 0; VIDCoreList[i] != NULL; i++) + { + if (VIDCoreList[i]->id == s_vidcoretype) + { + VIDCoreList[i]->Resize(x,y,width,height,1,0); + break; + } + } + } + + + void YuiErrorMsg(const char *string) + { + printf("%s",string); + } + void YuiSwapBuffers(void) + { + SetOSDToggle(g_EnagleFPS); + OSDDisplayMessages(NULL,0,0); + swapAglBuffer(); + + } + + + int YuiRevokeOGLOnThisThread(){ + RevokeOGLOnThisThread(); + } + int YuiUseOGLOnThisThread(){ + UseOGLOnThisThread(); + } + + int emulation_step( int command ){ + + int rtn; + + switch (command ) { + case MSG_SAVE_STATE: + YUI_LOG("MSG_SAVE_STATE %s\n",s_savepath); + if( (rtn = YabSaveStateSlot(s_savepath, 1)) != 0 ){ + YUI_LOG("StateSave is failed %d\n",rtn); + } + break; + case MSG_LOAD_STATE: + YUI_LOG("MSG_LOAD_STATE %s\n",s_savepath); + if( (rtn = YabLoadStateSlot(s_savepath, 1)) != 0 ){ + YUI_LOG("StateLoad is failed %d\n",rtn); + } + break; + case MSG_RESET: + YUI_LOG("MSG_RESET\n"); + YabauseReset(); + break; + case MSG_OPEN_TRAY: + YUI_LOG("MSG_OPEN_TRAY\n"); + Cs2ForceOpenTray(); + break; + case MSG_CLOSE_TRAY: + s_cdpath = GetGamePath(); + YUI_LOG("MSG_CLOSE_TRAY %s\n",s_cdpath); + Cs2ForceCloseTray(CDCORE_ISO, s_cdpath); + break; + } + + YabauseExec(); + } + + int MuteSound(){ + ScspMuteAudio(SCSP_MUTE_SYSTEM); + return 0; + } + + int UnMuteSound(){ + ScspUnMuteAudio(SCSP_MUTE_SYSTEM); + return 0; + } + + int enterBackGround(){ + YabFlushBackups(); + return 0; + } + + + + + +char * getGameinfoFromChd( const char * path ){ + + chd_file *chd; + char * hunk_buffer; + int current_hunk_id; + const int len = 256; + char * buf = (char*)malloc( sizeof(char)*len); + + chd_error error = chd_open(path, CHD_OPEN_READ, NULL, &chd); + if (error != CHDERR_NONE) { + return NULL; + } + const chd_header * header = chd_get_header(chd); + if( header == NULL ){ + return NULL; + } + + hunk_buffer = (char*)malloc(header->hunkbytes); + chd_read(chd, 0, hunk_buffer); + + memcpy(buf,&hunk_buffer[16],len); + buf[len-1] = 0; + //putc(buf[0], stdout); + //putc(buf[1], stdout); + //putc(buf[2], stdout); + //putc(buf[3], stdout); + free(hunk_buffer); + chd_close(chd); + return buf; +} + +} // extern "C" + +extern "C" { + + int YabauseThread_IsUseBios() { + return 0; + + } + + const char * YabauseThread_getBackupPath() { + return ""; + } + + void YabauseThread_setUseBios(int use) { + + } + + char tmpbakcup[256]; + void YabauseThread_setBackupPath( const char * buf) { + } + + void YabauseThread_resetPlaymode() { + } + + void YabauseThread_coldBoot() { + } + + //void glMemoryBarrier( int a ){ +// + //} + + void RBGGenerator_init(int width, int height) { + } + void RBGGenerator_resize(int width, int height) { + } + + void RBGGenerator_update(RBGDrawInfo * rbg ){ + + } + + GLuint RBGGenerator_getTexture( int id ) { + return 0; + } + void RBGGenerator_onFinish() { + } + +} + + \ No newline at end of file diff --git a/yabause/src/json/json-forwards.h b/yabause/src/json/json-forwards.h new file mode 100644 index 0000000000..60d3bd0bea --- /dev/null +++ b/yabause/src/json/json-forwards.h @@ -0,0 +1,333 @@ +/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json-forwards.h" +/// This header provides forward declaration for all JsonCpp types. + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED +# define JSON_FORWARD_AMALGATED_H_INCLUDED +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED +#include +#include //typedef String +#include //typedef int64_t, uint64_t + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) // MSVC +# if _MSC_VER <= 1200 // MSVC 6 + // Microsoft Visual Studio 6 only support conversion from __int64 to double + // (no conversion from unsigned __int64). +# define JSON_USE_INT64_DOUBLE_CONVERSION 1 + // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' + // characters in the debug information) + // All projects I've ever seen with VS6 were using this globally (not bothering + // with pragma push/pop). +# pragma warning(disable : 4786) +# endif // MSVC 6 + +# if _MSC_VER >= 1500 // MSVC 2008 + /// Indicates that the following function is deprecated. +# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +# endif + +#endif // defined(_MSC_VER) + +// In c++11 the override keyword allows you to explicity define that a function +// is intended to override the base-class version. This makes the code more +// managable and fixes a set of common hard-to-find bugs. +#if __cplusplus >= 201103L +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT noexcept +#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT throw() +#elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT noexcept +#else +# define JSONCPP_OVERRIDE +# define JSONCPP_NOEXCEPT throw() +#endif + +#ifndef JSON_HAS_RVALUE_REFERENCES + +#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // MSVC >= 2010 + +#ifdef __clang__ +#if __has_feature(cxx_rvalue_references) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // has_feature + +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // GXX_EXPERIMENTAL + +#endif // __clang__ || __GNUC__ + +#endif // not defined JSON_HAS_RVALUE_REFERENCES + +#ifndef JSON_HAS_RVALUE_REFERENCES +#define JSON_HAS_RVALUE_REFERENCES 0 +#endif + +#ifdef __clang__ +# if __has_extension(attribute_deprecated_with_message) +# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +# endif +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +# endif // GNUC version +#endif // __clang__ || __GNUC__ + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +#if __GNUC__ >= 6 +# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#endif + +#if !defined(JSON_IS_AMALGAMATION) + +# include "version.h" + +# if JSONCPP_USING_SECURE_MEMORY +# include "allocator.h" //typedef Allocator +# endif + +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef int64_t Int64; +typedef uint64_t UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) +#if JSONCPP_USING_SECURE_MEMORY +#define JSONCPP_STRING std::basic_string, Json::SecureAllocator > +#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream, Json::SecureAllocator > +#define JSONCPP_OSTREAM std::basic_ostream> +#define JSONCPP_ISTRINGSTREAM std::basic_istringstream, Json::SecureAllocator > +#define JSONCPP_ISTREAM std::istream +#else +#define JSONCPP_STRING std::string +#define JSONCPP_OSTRINGSTREAM std::ostringstream +#define JSONCPP_OSTREAM std::ostream +#define JSONCPP_ISTRINGSTREAM std::istringstream +#define JSONCPP_ISTREAM std::istream +#endif // if JSONCPP_USING_SECURE_MEMORY +} // end namespace Json + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED diff --git a/yabause/src/json/json.h b/yabause/src/json/json.h new file mode 100644 index 0000000000..77adfec0fc --- /dev/null +++ b/yabause/src/json/json.h @@ -0,0 +1,2186 @@ +/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_AMALGATED_H_INCLUDED +# define JSON_AMALGATED_H_INCLUDED +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +// DO NOT EDIT. This file (and "version") is generated by CMake. +// Run CMake configure step to update it. +#ifndef JSON_VERSION_H_INCLUDED +# define JSON_VERSION_H_INCLUDED + +# define JSONCPP_VERSION_STRING "1.8.1" +# define JSONCPP_VERSION_MAJOR 1 +# define JSONCPP_VERSION_MINOR 8 +# define JSONCPP_VERSION_PATCH 1 +# define JSONCPP_VERSION_QUALIFIER +# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) + +#ifdef JSONCPP_USING_SECURE_MEMORY +#undef JSONCPP_USING_SECURE_MEMORY +#endif +#define JSONCPP_USING_SECURE_MEMORY 0 +// If non-zero, the library zeroes any memory that it has allocated before +// it frees its memory. + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED +#include +#include //typedef String +#include //typedef int64_t, uint64_t + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) // MSVC +# if _MSC_VER <= 1200 // MSVC 6 + // Microsoft Visual Studio 6 only support conversion from __int64 to double + // (no conversion from unsigned __int64). +# define JSON_USE_INT64_DOUBLE_CONVERSION 1 + // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' + // characters in the debug information) + // All projects I've ever seen with VS6 were using this globally (not bothering + // with pragma push/pop). +# pragma warning(disable : 4786) +# endif // MSVC 6 + +# if _MSC_VER >= 1500 // MSVC 2008 + /// Indicates that the following function is deprecated. +# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +# endif + +#endif // defined(_MSC_VER) + +// In c++11 the override keyword allows you to explicity define that a function +// is intended to override the base-class version. This makes the code more +// managable and fixes a set of common hard-to-find bugs. +#if __cplusplus >= 201103L +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT noexcept +#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT throw() +#elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define JSONCPP_OVERRIDE override +# define JSONCPP_NOEXCEPT noexcept +#else +# define JSONCPP_OVERRIDE +# define JSONCPP_NOEXCEPT throw() +#endif + +#ifndef JSON_HAS_RVALUE_REFERENCES + +#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // MSVC >= 2010 + +#ifdef __clang__ +#if __has_feature(cxx_rvalue_references) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // has_feature + +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // GXX_EXPERIMENTAL + +#endif // __clang__ || __GNUC__ + +#endif // not defined JSON_HAS_RVALUE_REFERENCES + +#ifndef JSON_HAS_RVALUE_REFERENCES +#define JSON_HAS_RVALUE_REFERENCES 0 +#endif + +#ifdef __clang__ +# if __has_extension(attribute_deprecated_with_message) +# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +# endif +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +# endif // GNUC version +#endif // __clang__ || __GNUC__ + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +#if __GNUC__ >= 6 +# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#endif + +#if !defined(JSON_IS_AMALGAMATION) + +# include "version.h" + +# if JSONCPP_USING_SECURE_MEMORY +# include "allocator.h" //typedef Allocator +# endif + +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef int64_t Int64; +typedef uint64_t UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) +#if JSONCPP_USING_SECURE_MEMORY +#define JSONCPP_STRING std::basic_string, Json::SecureAllocator > +#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream, Json::SecureAllocator > +#define JSONCPP_OSTREAM std::basic_ostream> +#define JSONCPP_ISTRINGSTREAM std::basic_istringstream, Json::SecureAllocator > +#define JSONCPP_ISTREAM std::istream +#else +#define JSONCPP_STRING std::string +#define JSONCPP_OSTRINGSTREAM std::ostringstream +#define JSONCPP_OSTREAM std::ostream +#define JSONCPP_ISTRINGSTREAM std::istringstream +#define JSONCPP_ISTREAM std::istream +#endif // if JSONCPP_USING_SECURE_MEMORY +} // end namespace Json + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +#define CPPTL_JSON_FEATURES_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ +class JSON_API Features { +public: + /** \brief A configuration that allows all features and assumes all strings + * are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON + * specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_; + + /// \c true if root must be either an array or an object value. Default: \c + /// false. + bool strictRoot_; + + /// \c true if dropped null placeholders are allowed. Default: \c false. + bool allowDroppedNullPlaceholders_; + + /// \c true if numeric object key are allowed. Default: \c false. + bool allowNumericKeys_; +}; + +} // namespace Json + +#pragma pack(pop) + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_H_INCLUDED +#define CPPTL_JSON_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +#ifndef JSON_USE_CPPTL_SMALLMAP +#include +#else +#include +#endif +#ifdef JSON_USE_CPPTL +#include +#endif + +//Conditional NORETURN attribute on the throw functions would: +// a) suppress false positives from static code analysis +// b) possibly improve optimization opportunities. +#if !defined(JSONCPP_NORETURN) +# if defined(_MSC_VER) +# define JSONCPP_NORETURN __declspec(noreturn) +# elif defined(__GNUC__) +# define JSONCPP_NORETURN __attribute__ ((__noreturn__)) +# else +# define JSONCPP_NORETURN +# endif +#endif + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + +/** Base class for all exceptions we throw. + * + * We use nothing but these internally. Of course, STL can throw others. + */ +class JSON_API Exception : public std::exception { +public: + Exception(JSONCPP_STRING const& msg); + ~Exception() JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; + char const* what() const JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; +protected: + JSONCPP_STRING msg_; +}; + +/** Exceptions which the user cannot easily avoid. + * + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input + * + * \remark derived from Json::Exception + */ +class JSON_API RuntimeError : public Exception { +public: + RuntimeError(JSONCPP_STRING const& msg); +}; + +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. + * + * These are precondition-violations (user bugs) and internal errors (our bugs). + * + * \remark derived from Json::Exception + */ +class JSON_API LogicError : public Exception { +public: + LogicError(JSONCPP_STRING const& msg); +}; + +/// used internally +JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg); +/// used internally +JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg); + +/** \brief Type of the value held by a Value object. + */ +enum ValueType { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). +}; + +enum CommentPlacement { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for + /// root value) + numberOfCommentPlacement +}; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator EnumMemberNames; +// typedef CppTL::AnyEnumerator EnumValues; +//# endif + +/** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignement takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ +class JSON_API StaticString { +public: + explicit StaticString(const char* czstring) : c_str_(czstring) {} + + operator const char*() const { return c_str_; } + + const char* c_str() const { return c_str_; } + +private: + const char* c_str_; +}; + +/** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * Values of an #objectValue or #arrayValue can be accessed using operator[]() + * methods. + * Non-const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resized and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtain default value in the case the + * required element does not exist. + * + * It is possible to iterate over the list of a #objectValue values using + * the getMemberNames() method. + * + * \note #Value string-length fit in size_t, but keys must be < 2^30. + * (The reason is an implementation detail.) A #CharReader will raise an + * exception if a bound is exceeded to avoid security holes in your app, + * but the Value API does *not* check bounds. That is the responsibility + * of the caller. + */ +class JSON_API Value { + friend class ValueIteratorBase; +public: + typedef std::vector Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; +#if defined(JSON_HAS_INT64) + typedef Json::UInt64 UInt64; + typedef Json::Int64 Int64; +#endif // defined(JSON_HAS_INT64) + typedef Json::LargestInt LargestInt; + typedef Json::LargestUInt LargestUInt; + typedef Json::ArrayIndex ArrayIndex; + + static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value(). + static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null + static Value const& nullSingleton(); ///< Prefer this to null or nullRef. + + /// Minimum signed integer value that can be stored in a Json::Value. + static const LargestInt minLargestInt; + /// Maximum signed integer value that can be stored in a Json::Value. + static const LargestInt maxLargestInt; + /// Maximum unsigned integer value that can be stored in a Json::Value. + static const LargestUInt maxLargestUInt; + + /// Minimum signed int value that can be stored in a Json::Value. + static const Int minInt; + /// Maximum signed int value that can be stored in a Json::Value. + static const Int maxInt; + /// Maximum unsigned int value that can be stored in a Json::Value. + static const UInt maxUInt; + +#if defined(JSON_HAS_INT64) + /// Minimum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 minInt64; + /// Maximum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 maxInt64; + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. + static const UInt64 maxUInt64; +#endif // defined(JSON_HAS_INT64) + +private: +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + class CZString { + public: + enum DuplicationPolicy { + noDuplication = 0, + duplicate, + duplicateOnCopy + }; + CZString(ArrayIndex index); + CZString(char const* str, unsigned length, DuplicationPolicy allocate); + CZString(CZString const& other); +#if JSON_HAS_RVALUE_REFERENCES + CZString(CZString&& other); +#endif + ~CZString(); + CZString& operator=(const CZString& other); + +#if JSON_HAS_RVALUE_REFERENCES + CZString& operator=(CZString&& other); +#endif + + bool operator<(CZString const& other) const; + bool operator==(CZString const& other) const; + ArrayIndex index() const; + //const char* c_str() const; ///< \deprecated + char const* data() const; + unsigned length() const; + bool isStaticString() const; + + private: + void swap(CZString& other); + + struct StringStorage { + unsigned policy_: 2; + unsigned length_: 30; // 1GB max + }; + + char const* cstr_; // actually, a prefixed string, unless policy is noDup + union { + ArrayIndex index_; + StringStorage storage_; + }; + }; + +public: +#ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map ObjectValues; +#else + typedef CppTL::SmallMap ObjectValues; +#endif // ifndef JSON_USE_CPPTL_SMALLMAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. +This is useful since clear() and resize() will not alter types. + + Examples: +\code +Json::Value null_value; // null +Json::Value arr_value(Json::arrayValue); // [] +Json::Value obj_value(Json::objectValue); // {} +\endcode + */ + Value(ValueType type = nullValue); + Value(Int value); + Value(UInt value); +#if defined(JSON_HAS_INT64) + Value(Int64 value); + Value(UInt64 value); +#endif // if defined(JSON_HAS_INT64) + Value(double value); + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) + Value(const char* begin, const char* end); ///< Copy all, incl zeroes. + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * \note This works only for null-terminated strings. (We cannot change the + * size of this class, so we have nowhere to store the length, + * which might be computed later for various operations.) + * + * Example of usage: + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode + */ + Value(const StaticString& value); + Value(const JSONCPP_STRING& value); ///< Copy data() til size(). Embedded zeroes too. +#ifdef JSON_USE_CPPTL + Value(const CppTL::ConstString& value); +#endif + Value(bool value); + /// Deep copy. + Value(const Value& other); +#if JSON_HAS_RVALUE_REFERENCES + /// Move constructor + Value(Value&& other); +#endif + ~Value(); + + /// Deep copy, then swap(other). + /// \note Over-write existing comments. To preserve comments, use #swapPayload(). + Value& operator=(Value other); + + /// Swap everything. + void swap(Value& other); + /// Swap values but leave comments and source offsets in place. + void swapPayload(Value& other); + + /// copy everything. + void copy(const Value& other); + /// copy values but leave comments and source offsets in place. + void copyPayload(const Value& other); + + ValueType type() const; + + /// Compare payload only, not comments etc. + bool operator<(const Value& other) const; + bool operator<=(const Value& other) const; + bool operator>=(const Value& other) const; + bool operator>(const Value& other) const; + bool operator==(const Value& other) const; + bool operator!=(const Value& other) const; + int compare(const Value& other) const; + + const char* asCString() const; ///< Embedded zeroes could cause you trouble! +#if JSONCPP_USING_SECURE_MEMORY + unsigned getCStringLength() const; //Allows you to understand the length of the CString +#endif + JSONCPP_STRING asString() const; ///< Embedded zeroes are possible. + /** Get raw char* of string-value. + * \return false if !string. (Seg-fault if str or end are NULL.) + */ + bool getString( + char const** begin, char const** end) const; +#ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +#endif + Int asInt() const; + UInt asUInt() const; +#if defined(JSON_HAS_INT64) + Int64 asInt64() const; + UInt64 asUInt64() const; +#endif // if defined(JSON_HAS_INT64) + LargestInt asLargestInt() const; + LargestUInt asLargestUInt() const; + float asFloat() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isInt64() const; + bool isUInt() const; + bool isUInt64() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo(ValueType other) const; + + /// Number of values in array or object + ArrayIndex size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return isNull() + bool operator!() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to size elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize(ArrayIndex size); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](ArrayIndex index); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](int index); + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](ArrayIndex index) const; + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](int index) const; + + /// If the array contains at least index+1 elements, returns the element + /// value, + /// otherwise returns defaultValue. + Value get(ArrayIndex index, const Value& defaultValue) const; + /// Return true if index < size(). + bool isValidIndex(ArrayIndex index) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value& append(const Value& value); + +#if JSON_HAS_RVALUE_REFERENCES + Value& append(Value&& value); +#endif + + /// Access an object value by name, create a null member if it does not exist. + /// \note Because of our implementation, keys are limited to 2^30 -1 chars. + /// Exceeding that will cause an exception. + Value& operator[](const char* key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const char* key) const; + /// Access an object value by name, create a null member if it does not exist. + /// \param key may contain embedded nulls. + Value& operator[](const JSONCPP_STRING& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + /// \param key may contain embedded nulls. + const Value& operator[](const JSONCPP_STRING& key) const; + /** \brief Access an object value by name, create a null member if it does not + exist. + + * If the object has no entry for that name, then the member name used to store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value& operator[](const StaticString& key); +#ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value& operator[](const CppTL::ConstString& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const CppTL::ConstString& key) const; +#endif + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const char* key, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \note key may contain embedded nulls. + Value get(const char* begin, const char* end, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \param key may contain embedded nulls. + Value get(const JSONCPP_STRING& key, const Value& defaultValue) const; +#ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const CppTL::ConstString& key, const Value& defaultValue) const; +#endif + /// Most general and efficient version of isMember()const, get()const, + /// and operator[]const + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + Value const* find(char const* begin, char const* end) const; + /// Most general and efficient version of object-mutators. + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. + Value const* demand(char const* begin, char const* end); + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \return the removed Value, or null. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + /// \deprecated + JSONCPP_DEPRECATED("") + Value removeMember(const char* key); + /// Same as removeMember(const char*) + /// \param key may contain embedded nulls. + /// \deprecated + JSONCPP_DEPRECATED("") + Value removeMember(const JSONCPP_STRING& key); + /// Same as removeMember(const char* begin, const char* end, Value* removed), + /// but 'key' is null-terminated. + bool removeMember(const char* key, Value* removed); + /** \brief Remove the named map member. + + Update 'removed' iff removed. + \param key may contain embedded nulls. + \return true iff removed (no exceptions) + */ + bool removeMember(JSONCPP_STRING const& key, Value* removed); + /// Same as removeMember(JSONCPP_STRING const& key, Value* removed) + bool removeMember(const char* begin, const char* end, Value* removed); + /** \brief Remove the indexed array element. + + O(n) expensive operations. + Update 'removed' iff removed. + \return true iff removed (no exceptions) + */ + bool removeIndex(ArrayIndex i, Value* removed); + + /// Return true if the object has a member named key. + /// \note 'key' must be null-terminated. + bool isMember(const char* key) const; + /// Return true if the object has a member named key. + /// \param key may contain embedded nulls. + bool isMember(const JSONCPP_STRING& key) const; + /// Same as isMember(JSONCPP_STRING const& key)const + bool isMember(const char* begin, const char* end) const; +#ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember(const CppTL::ConstString& key) const; +#endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + + //# ifdef JSON_USE_CPPTL + // EnumMemberNames enumMemberNames() const; + // EnumValues enumValues() const; + //# endif + + /// \deprecated Always pass len. + JSONCPP_DEPRECATED("Use setComment(JSONCPP_STRING const&) instead.") + void setComment(const char* comment, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const JSONCPP_STRING& comment, CommentPlacement placement); + bool hasComment(CommentPlacement placement) const; + /// Include delimiters and embedded newlines. + JSONCPP_STRING getComment(CommentPlacement placement) const; + + JSONCPP_STRING toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + + // Accessors for the [start, limit) range of bytes within the JSON text from + // which this value was parsed, if any. + void setOffsetStart(ptrdiff_t start); + void setOffsetLimit(ptrdiff_t limit); + ptrdiff_t getOffsetStart() const; + ptrdiff_t getOffsetLimit() const; + +private: + void initBasic(ValueType type, bool allocated = false); + + Value& resolveReference(const char* key); + Value& resolveReference(const char* key, const char* end); + + struct CommentInfo { + CommentInfo(); + ~CommentInfo(); + + void setComment(const char* text, size_t len); + + char* comment_; + }; + + // struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder { + LargestInt int_; + LargestUInt uint_; + double real_; + bool bool_; + char* string_; // actually ptr to unsigned, followed by str, unless !allocated_ + ObjectValues* map_; + } value_; + ValueType type_ : 8; + unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. + // If not allocated_, string_ must be null-terminated. + CommentInfo* comments_; + + // [start, limit) byte offsets in the source JSON text from which this Value + // was extracted. + ptrdiff_t start_; + ptrdiff_t limit_; +}; + +/** \brief Experimental and untested: represents an element of the "path" to + * access a node. + */ +class JSON_API PathArgument { +public: + friend class Path; + + PathArgument(); + PathArgument(ArrayIndex index); + PathArgument(const char* key); + PathArgument(const JSONCPP_STRING& key); + +private: + enum Kind { + kindNone = 0, + kindIndex, + kindKey + }; + JSONCPP_STRING key_; + ArrayIndex index_; + Kind kind_; +}; + +/** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provied as parameter + */ +class JSON_API Path { +public: + Path(const JSONCPP_STRING& path, + const PathArgument& a1 = PathArgument(), + const PathArgument& a2 = PathArgument(), + const PathArgument& a3 = PathArgument(), + const PathArgument& a4 = PathArgument(), + const PathArgument& a5 = PathArgument()); + + const Value& resolve(const Value& root) const; + Value resolve(const Value& root, const Value& defaultValue) const; + /// Creates the "path" to access the specified node and returns a reference on + /// the node. + Value& make(Value& root) const; + +private: + typedef std::vector InArgs; + typedef std::vector Args; + + void makePath(const JSONCPP_STRING& path, const InArgs& in); + void addPathInArg(const JSONCPP_STRING& path, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind); + void invalidPath(const JSONCPP_STRING& path, int location); + + Args args_; +}; + +/** \brief base class for Value iterators. + * + */ +class JSON_API ValueIteratorBase { +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + bool operator==(const SelfType& other) const { return isEqual(other); } + + bool operator!=(const SelfType& other) const { return !isEqual(other); } + + difference_type operator-(const SelfType& other) const { + return other.computeDistance(*this); + } + + /// Return either the index or the member name of the referenced value as a + /// Value. + Value key() const; + + /// Return the index of the referenced Value, or -1 if it is not an arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value, or "" if it is not an + /// objectValue. + /// \note Avoid `c_str()` on result, as embedded zeroes are possible. + JSONCPP_STRING name() const; + + /// Return the member name of the referenced Value. "" if it is not an + /// objectValue. + /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls. + JSONCPP_DEPRECATED("Use `key = name();` instead.") + char const* memberName() const; + /// Return the member name of the referenced Value, or NULL if it is not an + /// objectValue. + /// \note Better version than memberName(). Allows embedded nulls. + char const* memberName(char const** end) const; + +protected: + Value& deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance(const SelfType& other) const; + + bool isEqual(const SelfType& other) const; + + void copy(const SelfType& other); + +private: + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_; + +public: + // For some reason, BORLAND needs these at the end, rather + // than earlier. No idea why. + ValueIteratorBase(); + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); +}; + +/** \brief const iterator for object and array value. + * + */ +class JSON_API ValueConstIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef const Value value_type; + //typedef unsigned int size_t; + //typedef int difference_type; + typedef const Value& reference; + typedef const Value* pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + ValueConstIterator(ValueIterator const& other); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueConstIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const ValueIteratorBase& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +/** \brief Iterator for object and array value. + */ +class JSON_API ValueIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef Value value_type; + typedef unsigned int size_t; + typedef int difference_type; + typedef Value& reference; + typedef Value* pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + explicit ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueIterator& other); + +private: +/*! \internal Use by Value to create an iterator. + */ + explicit ValueIterator(const Value::ObjectValues::iterator& current); +public: + SelfType& operator=(const SelfType& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +} // namespace Json + + +namespace std { +/// Specialize std::swap() for Json::Value. +template<> +inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } +} + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_READER_H_INCLUDED +#define CPPTL_JSON_READER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "features.h" +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Unserialize a JSON document into a + *Value. + * + * \deprecated Use CharReader and CharReaderBuilder. + */ +class JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") JSON_API Reader { +public: + typedef char Char; + typedef const Char* Location; + + /** \brief An error tagged with where in the JSON text it was encountered. + * + * The offsets give the [start, limit) range of bytes within the text. Note + * that this is bytes, not codepoints. + * + */ + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + JSONCPP_STRING message; + }; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader(const Features& features); + + /** \brief Read a Value from a JSON + * document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + * back during + * serialization, \c false to discard comments. + * This parameter is ignored if + * Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool + parse(const std::string& document, Value& root, bool collectComments = true); + + /** \brief Read a Value from a JSON + document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + back during + * serialization, \c false to discard comments. + * This parameter is ignored if + Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(JSONCPP_ISTREAM& is, Value& root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + * \deprecated Use getFormattedErrorMessages() instead (typo fix). + */ + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") + JSONCPP_STRING getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + */ + JSONCPP_STRING getFormattedErrorMessages() const; + + /** \brief Returns a vector of structured erros encounted while parsing. + * \return A (possibly empty) vector of StructuredError objects. Currently + * only one error can be returned, but the caller should tolerate + * multiple + * errors. This can occur if the parser recovers from a non-fatal + * parse error and then encounters additional errors. + */ + std::vector getStructuredErrors() const; + + /** \brief Add a semantic error message. + * \param value JSON Value location associated with the error + * \param message The error message. + * \return \c true if the error was successfully added, \c false if the + * Value offset exceeds the document size. + */ + bool pushError(const Value& value, const JSONCPP_STRING& message); + + /** \brief Add a semantic error message with extra context. + * \param value JSON Value location associated with the error + * \param message The error message. + * \param extra Additional JSON Value location to contextualize the error + * \return \c true if the error was successfully added, \c false if either + * Value offset exceeds the document size. + */ + bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); + + /** \brief Return whether there are any errors. + * \return \c true if there are no errors to report \c false if + * errors have occurred. + */ + bool good() const; + +private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + JSONCPP_STRING message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static bool containsNewLine(Location begin, Location end); + static JSONCPP_STRING normalizeEOL(Location begin, Location end); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + JSONCPP_STRING document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + JSONCPP_STRING commentsBefore_; + Features features_; + bool collectComments_; +}; // Reader + +/** Interface for reading JSON from a char array. + */ +class JSON_API CharReader { +public: + virtual ~CharReader() {} + /** \brief Read a Value from a JSON + document. + * The document must be a UTF-8 encoded string containing the document to read. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param errs [out] Formatted error messages (if not NULL) + * a user friendly string that lists errors in the parsed + * document. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + virtual bool parse( + char const* beginDoc, char const* endDoc, + Value* root, JSONCPP_STRING* errs) = 0; + + class JSON_API Factory { + public: + virtual ~Factory() {} + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual CharReader* newCharReader() const = 0; + }; // Factory +}; // CharReader + +/** \brief Build a CharReader implementation. + +Usage: +\code + using namespace Json; + CharReaderBuilder builder; + builder["collectComments"] = false; + Value value; + JSONCPP_STRING errs; + bool ok = parseFromStream(builder, std::cin, &value, &errs); +\endcode +*/ +class JSON_API CharReaderBuilder : public CharReader::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + These are case-sensitive. + Available settings (case-sensitive): + - `"collectComments": false or true` + - true to collect comment and allow writing them + back during serialization, false to discard comments. + This parameter is ignored if allowComments is false. + - `"allowComments": false or true` + - true if comments are allowed. + - `"strictRoot": false or true` + - true if root must be either an array or an object value + - `"allowDroppedNullPlaceholders": false or true` + - true if dropped null placeholders are allowed. (See StreamWriterBuilder.) + - `"allowNumericKeys": false or true` + - true if numeric object keys are allowed. + - `"allowSingleQuotes": false or true` + - true if '' are allowed for strings (both keys and values) + - `"stackLimit": integer` + - Exceeding stackLimit (recursive depth of `readValue()`) will + cause an exception. + - This is a security issue (seg-faults caused by deeply nested JSON), + so the default is low. + - `"failIfExtra": false or true` + - If true, `parse()` returns false when extra non-whitespace trails + the JSON value in the input string. + - `"rejectDupKeys": false or true` + - If true, `parse()` returns false when a key is duplicated within an object. + - `"allowSpecialFloats": false or true` + - If true, special float values (NaNs and infinities) are allowed + and their values are lossfree restorable. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + CharReaderBuilder(); + ~CharReaderBuilder() JSONCPP_OVERRIDE; + + CharReader* newCharReader() const JSONCPP_OVERRIDE; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + + /** A simple way to update a specific setting. + */ + Value& operator[](JSONCPP_STRING key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults + */ + static void setDefaults(Json::Value* settings); + /** Same as old Features::strictMode(). + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode + */ + static void strictMode(Json::Value* settings); +}; + +/** Consume entire stream and use its begin/end. + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream( + CharReader::Factory const&, + JSONCPP_ISTREAM&, + Value* root, std::string* errs); + +/** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() +*/ +JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_READER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_WRITER_H_INCLUDED +#define JSON_WRITER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +class Value; + +/** + +Usage: +\code + using namespace Json; + void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { + std::unique_ptr const writer( + factory.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush + } +\endcode +*/ +class JSON_API StreamWriter { +protected: + JSONCPP_OSTREAM* sout_; // not owned; will not delete +public: + StreamWriter(); + virtual ~StreamWriter(); + /** Write Value into document as configured in sub-class. + Do not take ownership of sout, but maintain a reference during function. + \pre sout != NULL + \return zero on success (For now, we always return zero, so check the stream instead.) + \throw std::exception possibly, depending on configuration + */ + virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0; + + /** \brief A simple abstract factory. + */ + class JSON_API Factory { + public: + virtual ~Factory(); + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const = 0; + }; // Factory +}; // StreamWriter + +/** \brief Write into stringstream, then return string, for convenience. + * A StreamWriter will be created from the factory, used, and then deleted. + */ +JSONCPP_STRING JSON_API writeString(StreamWriter::Factory const& factory, Value const& root); + + +/** \brief Build a StreamWriter implementation. + +Usage: +\code + using namespace Json; + Value value = ...; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer( + builder.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush +\endcode +*/ +class JSON_API StreamWriterBuilder : public StreamWriter::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + Available settings (case-sensitive): + - "commentStyle": "None" or "All" + - "indentation": "" + - "enableYAMLCompatibility": false or true + - slightly change the whitespace around colons + - "dropNullPlaceholders": false or true + - Drop the "null" string from the writer's output for nullValues. + Strictly speaking, this is not valid JSON. But when the output is being + fed to a browser's Javascript, it makes for smaller output and the + browser can handle the output just fine. + - "useSpecialFloats": false or true + - If true, outputs non-finite floating point values in the following way: + NaN values as "NaN", positive infinity as "Infinity", and negative infinity + as "-Infinity". + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + StreamWriterBuilder(); + ~StreamWriterBuilder() JSONCPP_OVERRIDE; + + /** + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + StreamWriter* newStreamWriter() const JSONCPP_OVERRIDE; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + /** A simple way to update a specific setting. + */ + Value& operator[](JSONCPP_STRING key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults + */ + static void setDefaults(Json::Value* settings); +}; + +/** \brief Abstract class for writers. + * \deprecated Use StreamWriter. (And really, this is an implementation detail.) + */ +class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer { +public: + virtual ~Writer(); + + virtual JSONCPP_STRING write(const Value& root) = 0; +}; + +/** \brief Outputs a Value in JSON format + *without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' + *consumption, + * but may be usefull to support feature such as RPC where bandwith is limited. + * \sa Reader, Value + * \deprecated Use StreamWriterBuilder. + */ +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter : public Writer { + +public: + FastWriter(); + ~FastWriter() JSONCPP_OVERRIDE {} + + void enableYAMLCompatibility(); + + /** \brief Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's Javascript, it makes for smaller output and the + * browser can handle the output just fine. + */ + void dropNullPlaceholders(); + + void omitEndingLineFeed(); + +public: // overridden from Writer + JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + +private: + void writeValue(const Value& value); + + JSONCPP_STRING document_; + bool yamlCompatiblityEnabled_; + bool dropNullPlaceholders_; + bool omitEndingLineFeed_; +}; + +/** \brief Writes a Value in JSON format in a + *human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + *line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + *types, + * and all the values fit on one lines, then print the array on a single + *line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + *#CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledWriter : public Writer { +public: + StyledWriter(); + ~StyledWriter() JSONCPP_OVERRIDE {} + +public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const JSONCPP_STRING& value); + void writeIndent(); + void writeWithIndent(const JSONCPP_STRING& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + JSONCPP_STRING document_; + JSONCPP_STRING indentString_; + unsigned int rightMargin_; + unsigned int indentSize_; + bool addChildValues_; +}; + +/** \brief Writes a Value in JSON format in a + human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + types, + * and all the values fit on one lines, then print the array on a single + line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + #CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledStreamWriter { +public: +/** + * \param indentation Each level will be indented by this amount extra. + */ + StyledStreamWriter(JSONCPP_STRING indentation = "\t"); + ~StyledStreamWriter() {} + +public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not + * return a value. + */ + void write(JSONCPP_OSTREAM& out, const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultineArray(const Value& value); + void pushValue(const JSONCPP_STRING& value); + void writeIndent(); + void writeWithIndent(const JSONCPP_STRING& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + bool hasCommentForValue(const Value& value); + static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + JSONCPP_OSTREAM* document_; + JSONCPP_STRING indentString_; + unsigned int rightMargin_; + JSONCPP_STRING indentation_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; + +#if defined(JSON_HAS_INT64) +JSONCPP_STRING JSON_API valueToString(Int value); +JSONCPP_STRING JSON_API valueToString(UInt value); +#endif // if defined(JSON_HAS_INT64) +JSONCPP_STRING JSON_API valueToString(LargestInt value); +JSONCPP_STRING JSON_API valueToString(LargestUInt value); +JSONCPP_STRING JSON_API valueToString(double value); +JSONCPP_STRING JSON_API valueToString(bool value); +JSONCPP_STRING JSON_API valueToQuotedString(const char* value); + +/// \brief Output using the StyledStreamWriter. +/// \see Json::operator>>() +JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_WRITER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED +#define CPPTL_JSON_ASSERTIONS_H_INCLUDED + +#include +#include + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +/** It should not be possible for a maliciously designed file to + * cause an abort() or seg-fault, so these macros are used only + * for pre-condition violations and internal logic errors. + */ +#if JSON_USE_EXCEPTION + +// @todo <= add detail about condition in exception +# define JSON_ASSERT(condition) \ + {if (!(condition)) {Json::throwLogicError( "assert json failed" );}} + +# define JSON_FAIL_MESSAGE(message) \ + { \ + JSONCPP_OSTRINGSTREAM oss; oss << message; \ + Json::throwLogicError(oss.str()); \ + abort(); \ + } + +#else // JSON_USE_EXCEPTION + +# define JSON_ASSERT(condition) assert(condition) + +// The call to assert() will show the failure message in debug builds. In +// release builds we abort, for a core-dump or debugger. +# define JSON_FAIL_MESSAGE(message) \ + { \ + JSONCPP_OSTRINGSTREAM oss; oss << message; \ + assert(false && oss.str().c_str()); \ + abort(); \ + } + + +#endif + +#define JSON_ASSERT_MESSAGE(condition, message) \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } + +#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_AMALGATED_H_INCLUDED diff --git a/yabause/src/jsoncpp.cpp b/yabause/src/jsoncpp.cpp new file mode 100644 index 0000000000..83677b1e5f --- /dev/null +++ b/yabause/src/jsoncpp.cpp @@ -0,0 +1,5385 @@ +/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + + +#include "json/json.h" + +#ifndef JSON_IS_AMALGAMATION +#error "Compile with -I PATH_TO_JSON_DIRECTORY" +#endif + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + + +// Also support old flag NO_LOCALE_SUPPORT +#ifdef NO_LOCALE_SUPPORT +#define JSONCPP_NO_LOCALE_SUPPORT +#endif + +#ifndef JSONCPP_NO_LOCALE_SUPPORT +#include +#endif + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { +static char getDecimalPoint() { +#ifdef JSONCPP_NO_LOCALE_SUPPORT + return '\0'; +#else + struct lconv* lc = localeconv(); + return lc ? *(lc->decimal_point) : '\0'; +#endif +} + +/// Converts a unicode code-point to UTF-8. +static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) { + JSONCPP_STRING result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +/// Returns true if ch is a control character (in range [1,31]). +static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +typedef char UIntToStringBuffer[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned interger to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast(value % 10U + static_cast('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +static inline void fixNumericLocale(char* begin, char* end) { + while (begin < end) { + if (*begin == ',') { + *begin = '.'; + } + ++begin; + } +} + +static inline void fixNumericLocaleInput(char* begin, char* end) { + char decimalPoint = getDecimalPoint(); + if (decimalPoint != '\0' && decimalPoint != '.') { + while (begin < end) { + if (*begin == '.') { + *begin = decimalPoint; + } + ++begin; + } + } +} + +} // namespace Json { + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors +// Copyright (C) 2016 InfoTeCS JSC. All rights reserved. +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) || defined(__QNXNTO__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#if !defined(__MINGW32__) && !defined(__CYGWIN__) +#define snprintf std::snprintf +#endif +#endif + +#if defined(__QNXNTO__) +#define sscanf std::sscanf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile time to change the stack limit +#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) +#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 +#endif + +static size_t const stackLimit_g = JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr CharReaderPtr; +#else +typedef std::auto_ptr CharReaderPtr; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_(true), strictRoot_(false), + allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {} + +Features Features::all() { return Features(); } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + features.allowDroppedNullPlaceholders_ = false; + features.allowNumericKeys_ = false; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(Features::all()), + collectComments_() {} + +Reader::Reader(const Features& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool +Reader::parse(const std::string& document, Value& root, bool collectComments) { + JSONCPP_STRING documentCopy(document.data(), document.data() + document.capacity()); + std::swap(documentCopy, document_); + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { + // std::istream_iterator begin(sin); + // std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since JSONCPP_STRING is reference-counted, this at least does not + // create an extra copy. + JSONCPP_STRING doc; + std::getline(sin, doc, (char)EOF); + return parse(doc.data(), doc.data() + doc.size(), root, collectComments); +} + +bool Reader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // readValue() may call itself only if it calls readObject() or ReadArray(). + // These methods execute nodes_.push() just before and nodes_.pop)() just after calling readValue(). + // parse() executes one nodes_.push(), so > instead of >=. + if (nodes_.size() > stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // Else, fall through... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { + JSONCPP_STRING normalized; + normalized.reserve(static_cast(end - begin)); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void +Reader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + const char *p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } +} + +bool Reader::readString() { + Char c = '\0'; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& tokenStart) { + Token tokenName; + JSONCPP_STRING name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = JSONCPP_STRING(numberName.asCString()); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool Reader::readArray(Token& tokenStart) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + skipSpaces(); + if (current_ != end_ && *current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative && value == maxIntegerValue) + decoded = Value::minLargestInt; + else if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + JSONCPP_STRING buffer(token.start_, token.end_); + JSONCPP_ISTRINGSTREAM is(buffer); + if (!(is >> value)) + return addError("'" + JSONCPP_STRING(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + JSONCPP_STRING decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool +Reader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + size_t const errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +// Deprecated. Preserved for backward compatibility +JSONCPP_STRING Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +JSONCPP_STRING Reader::getFormattedErrorMessages() const { + JSONCPP_STRING formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector Reader::getStructuredErrors() const { + std::vector allErrors; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + Reader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool Reader::pushError(const Value& value, const JSONCPP_STRING& message) { + ptrdiff_t const length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = 0; + errors_.push_back(info); + return true; +} + +bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { + ptrdiff_t const length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length + || extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool Reader::good() const { + return !errors_.size(); +} + +// exact copy of Features +class OurFeatures { +public: + static OurFeatures all(); + bool allowComments_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + bool allowSpecialFloats_; + int stackLimit_; +}; // OurFeatures + +// exact copy of Implementation of class Features +// //////////////////////////////// + +OurFeatures OurFeatures::all() { return OurFeatures(); } + +// Implementation of class Reader +// //////////////////////////////// + +// exact copy of Reader, renamed to OurReader +class OurReader { +public: + typedef char Char; + typedef const Char* Location; + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + JSONCPP_STRING message; + }; + + OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + JSONCPP_STRING getFormattedErrorMessages() const; + std::vector getStructuredErrors() const; + bool pushError(const Value& value, const JSONCPP_STRING& message); + bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); + bool good() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenNaN, + tokenPosInf, + tokenNegInf, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + JSONCPP_STRING message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + bool readNumber(bool checkInf); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static JSONCPP_STRING normalizeEOL(Location begin, Location end); + static bool containsNewLine(Location begin, Location end); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + JSONCPP_STRING document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + JSONCPP_STRING commentsBefore_; + + OurFeatures const features_; + bool collectComments_; +}; // OurReader + +// complete copy of Read impl, for OurReader + +bool OurReader::containsNewLine(OurReader::Location begin, OurReader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +OurReader::OurReader(OurFeatures const& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), + features_(features), collectComments_() { +} + +bool OurReader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_) { + if ((features_.strictRoot_ || token.type_ != tokenError) && token.type_ != tokenEndOfStream) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + // To preserve the old behaviour we cast size_t to int. + if (static_cast(nodes_.size()) > features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNaN: + { + Value v(std::numeric_limits::quiet_NaN()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenPosInf: + { + Value v(std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNegInf: + { + Value v(-std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // else, fall through ... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + break; + } // else continue + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + token.type_ = tokenNumber; + readNumber(false); + break; + case '-': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenNegInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case 'N': + if (features_.allowSpecialFloats_) { + token.type_ = tokenNaN; + ok = match("aN", 2); + } else { + ok = false; + } + break; + case 'I': + if (features_.allowSpecialFloats_) { + token.type_ = tokenPosInf; + ok = match("nfinity", 7); + } else { + ok = false; + } + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool OurReader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Location end) { + JSONCPP_STRING normalized; + normalized.reserve(static_cast(end - begin)); + OurReader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void +OurReader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment() { + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +bool OurReader::readNumber(bool checkInf) { + const char *p = current_; + if (checkInf && p != end_ && *p == 'I') { + current_ = ++p; + return false; + } + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + return true; +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& tokenStart) { + Token tokenName; + JSONCPP_STRING name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + JSONCPP_STRING msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover( + msg, tokenName, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool OurReader::readArray(Token& tokenStart) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + skipSpaces(); + if (current_ != end_ && *current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(-Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + const int bufferSize = 32; + int count; + ptrdiff_t const length = token.end_ - token.start_; + + // Sanity check to avoid buffer overflow exploits. + if (length < 0) { + return addError("Unable to parse token length", token); + } + size_t const ulength = static_cast(length); + + // Avoid using a string constant for the format control string given to + // sscanf, as this can cause hard to debug crashes on OS X. See here for more + // info: + // + // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html + char format[] = "%lf"; + + if (length <= bufferSize) { + Char buffer[bufferSize + 1]; + memcpy(buffer, token.start_, ulength); + buffer[length] = 0; + fixNumericLocaleInput(buffer, buffer + length); + count = sscanf(buffer, format, &value); + } else { + JSONCPP_STRING buffer(token.start_, token.end_); + count = sscanf(buffer.c_str(), format, &value); + } + + if (count != 1) + return addError("'" + JSONCPP_STRING(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + JSONCPP_STRING decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool +OurReader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + size_t errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +JSONCPP_STRING OurReader::getFormattedErrorMessages() const { + JSONCPP_STRING formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector OurReader::getStructuredErrors() const { + std::vector allErrors; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + OurReader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message) { + ptrdiff_t length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = 0; + errors_.push_back(info); + return true; +} + +bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { + ptrdiff_t length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length + || extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool OurReader::good() const { + return !errors_.size(); +} + + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; +public: + OurCharReader( + bool collectComments, + OurFeatures const& features) + : collectComments_(collectComments) + , reader_(features) + {} + bool parse( + char const* beginDoc, char const* endDoc, + Value* root, JSONCPP_STRING* errs) JSONCPP_OVERRIDE { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() +{ + setDefaults(&settings_); +} +CharReaderBuilder::~CharReaderBuilder() +{} +CharReader* CharReaderBuilder::newCharReader() const +{ + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); + features.stackLimit_ = settings_["stackLimit"].asInt(); + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + return new OurCharReader(collectComments, features); +} +static void getValidReaderKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("collectComments"); + valid_keys->insert("allowComments"); + valid_keys->insert("strictRoot"); + valid_keys->insert("allowDroppedNullPlaceholders"); + valid_keys->insert("allowNumericKeys"); + valid_keys->insert("allowSingleQuotes"); + valid_keys->insert("stackLimit"); + valid_keys->insert("failIfExtra"); + valid_keys->insert("rejectDupKeys"); + valid_keys->insert("allowSpecialFloats"); +} +bool CharReaderBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidReaderKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + JSONCPP_STRING const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& CharReaderBuilder::operator[](JSONCPP_STRING key) +{ + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) +{ +//! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) +{ +//! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream( + CharReader::Factory const& fact, JSONCPP_ISTREAM& sin, + Value* root, JSONCPP_STRING* errs) +{ + JSONCPP_OSTRINGSTREAM ssin; + ssin << sin.rdbuf(); + JSONCPP_STRING doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root) { + CharReaderBuilder b; + JSONCPP_STRING errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + fprintf(stderr, + "Error from reader: %s", + errs.c_str()); + + throwRuntimeError(errs); + } + return sin; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() + : current_(), isNull_(true) { +} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() const { + return current_->second; +} + +void ValueIteratorBase::increment() { + ++current_; +} + +void ValueIteratorBase::decrement() { + --current_; +} + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { +#ifdef JSON_USE_CPPTL_SMALLMAP + return other.current_ - current_; +#else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +#endif +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +JSONCPP_STRING ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) return JSONCPP_STRING(); + return JSONCPP_STRING(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = NULL; + return NULL; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() {} + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator::ValueConstIterator(ValueIterator const& other) + : ValueIteratorBase(other) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() {} + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) { + throwRuntimeError("ConstIterator to Iterator should never be allowed."); +} + +ValueIterator::ValueIterator(const ValueIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +#include +#endif +#include // size_t +#include // min() + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +#define ALIGNAS(byte_alignment) +#endif +//static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; +//const unsigned char& kNullRef = kNull[0]; +//const Value& Value::null = reinterpret_cast(kNullRef); +//const Value& Value::nullRef = null; + +// static +Value const& Value::nullSingleton() +{ + static Value const nullStatic; + return nullStatic; +} + +// for backwards compatibility, we'll leave these global references around, but DO NOT +// use them in JSONCPP library code any more! +Value const& Value::null = Value::nullSingleton(); +Value const& Value::nullRef = Value::nullSingleton(); + +const Int Value::minInt = Int(~(UInt(-1) / 2)); +const Int Value::maxInt = Int(UInt(-1) / 2); +const UInt Value::maxUInt = UInt(-1); +#if defined(JSON_HAS_INT64) +const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); +const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); +const UInt64 Value::maxUInt64 = UInt64(-1); +// The constant is hard-coded because some compiler have trouble +// converting Value::maxUInt64 to a double correctly (AIX/xlC). +// Assumes that UInt64 is a 64 bits integer. +static const double maxUInt64AsDouble = 18446744073709551615.0; +#endif // defined(JSON_HAS_INT64) +const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); +const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); +const LargestUInt Value::maxLargestUInt = LargestUInt(-1); + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template +static inline bool InRange(double d, T min, U max) { + // The casts can lose precision, but we are looking only for + // an approximate range. Might fail on edge cases though. ~cdunn + //return d >= static_cast(min) && d <= static_cast(max); + return d >= min && d <= max; +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast(Int64(value / 2)) * 2.0 + static_cast(Int64(value & 1)); +} + +template static inline double integerToDouble(T value) { + return static_cast(value); +} + +template +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, + size_t length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= static_cast(Value::maxInt)) + length = Value::maxInt - 1; + + char* newString = static_cast(malloc(length + 1)); + if (newString == NULL) { + throwRuntimeError( + "in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue( + const char* value, + unsigned int length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; + char* newString = static_cast(malloc(actualLength)); + if (newString == 0) { + throwRuntimeError( + "in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString( + bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) +{ + if (!isPrefixed) { + *length = static_cast(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +#if JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + unsigned length = 0; + char const* valueDecoded; + decodePrefixedString(true, value, &length, &valueDecoded); + size_t const size = sizeof(unsigned) + length + 1U; + memset(value, 0, size); + free(value); +} +static inline void releaseStringValue(char* value, unsigned length) { + // length==0 => we allocated the strings memory + size_t size = (length==0) ? strlen(value) : length; + memset(value, 0, size); + free(value); +} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + free(value); +} +static inline void releaseStringValue(char* value, unsigned) { + free(value); +} +#endif // JSONCPP_USING_SECURE_MEMORY + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +Exception::Exception(JSONCPP_STRING const& msg) + : msg_(msg) +{} +Exception::~Exception() JSONCPP_NOEXCEPT +{} +char const* Exception::what() const JSONCPP_NOEXCEPT +{ + return msg_.c_str(); +} +RuntimeError::RuntimeError(JSONCPP_STRING const& msg) + : Exception(msg) +{} +LogicError::LogicError(JSONCPP_STRING const& msg) + : Exception(msg) +{} +JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg) +{ + throw RuntimeError(msg); +} +JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg) +{ + throw LogicError(msg); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +Value::CommentInfo::CommentInfo() : comment_(0) +{} + +Value::CommentInfo::~CommentInfo() { + if (comment_) + releaseStringValue(comment_, 0u); +} + +void Value::CommentInfo::setComment(const char* text, size_t len) { + if (comment_) { + releaseStringValue(comment_, 0u); + comment_ = 0; + } + JSON_ASSERT(text != 0); + JSON_ASSERT_MESSAGE( + text[0] == '\0' || text[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = duplicateStringValue(text, len); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} + +Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) + : cstr_(str) { + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = ulength & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) { + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0 + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = static_cast(other.cstr_ + ? (static_cast(other.storage_.policy_) == noDuplication + ? noDuplication : duplicate) + : static_cast(other.storage_.policy_)) & 3U; + storage_.length_ = other.storage_.length_; +} + +#if JSON_HAS_RVALUE_REFERENCES +Value::CZString::CZString(CZString&& other) + : cstr_(other.cstr_), index_(other.index_) { + other.cstr_ = nullptr; +} +#endif + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) { + releaseStringValue(const_cast(cstr_), storage_.length_ + 1u); //+1 for null terminating character for sake of completeness but not actually necessary + } +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(const CZString& other) { + cstr_ = other.cstr_; + index_ = other.index_; + return *this; +} + +#if JSON_HAS_RVALUE_REFERENCES +Value::CZString& Value::CZString::operator=(CZString&& other) { + cstr_ = other.cstr_; + index_ = other.index_; + other.cstr_ = nullptr; + return *this; +} +#endif + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) return index_ < other.index_; + //return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) return index_ == other.index_; + //return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) return false; + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +//const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType vtype) { + static char const emptyString[] = ""; + initBasic(vtype); + switch (vtype) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + // allocated_ == false, so this is safe. + value_.string_ = const_cast(static_cast(emptyString)); + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + JSON_ASSERT_MESSAGE(value != NULL, "Null Value Passed to Value Constructor"); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(strlen(value))); +} + +Value::Value(const char* beginValue, const char* endValue) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(beginValue, static_cast(endValue - beginValue)); +} + +Value::Value(const JSONCPP_STRING& value) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(value.data(), static_cast(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast(value.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value::Value(const CppTL::ConstString& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(value.length())); +} +#endif + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(Value const& other) + : type_(other.type_), allocated_(false) + , + comments_(0), start_(other.start_), limit_(other.limit_) +{ + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.allocated_) { + unsigned len; + char const* str; + decodePrefixedString(other.allocated_, other.value_.string_, + &len, &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + allocated_ = true; + } else { + value_.string_ = other.value_.string_; + allocated_ = false; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } + if (other.comments_) { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { + const CommentInfo& otherComment = other.comments_[comment]; + if (otherComment.comment_) + comments_[comment].setComment( + otherComment.comment_, strlen(otherComment.comment_)); + } + } +} + +#if JSON_HAS_RVALUE_REFERENCES +// Move constructor +Value::Value(Value&& other) { + initBasic(nullValue); + swap(other); +} +#endif + +Value::~Value() { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (allocated_) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } + + delete[] comments_; + + value_.uint_ = 0; +} + +Value& Value::operator=(Value other) { + swap(other); + return *this; +} + +void Value::swapPayload(Value& other) { + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap(value_, other.value_); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2 & 0x1; +} + +void Value::copyPayload(const Value& other) { + type_ = other.type_; + value_ = other.value_; + allocated_ = other.allocated_; +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); + std::swap(start_, other.start_); + std::swap(limit_, other.limit_); +} + +void Value::copy(const Value& other) { + copyPayload(other); + comments_ = other.comments_; + start_ = other.start_; + limit_ = other.limit_; +} + +ValueType Value::type() const { return type_; } + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type_ - other.type_; + if (typeDelta) + return typeDelta < 0 ? true : false; + switch (type_) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + if (other.value_.string_) return true; + else return false; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + int delta = int(value_.map_->size() - other.value_.map_->size()); + if (delta) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + // if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if (type_ != temp) + return false; + switch (type_) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + if (this_len != other_len) return false; + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_str; +} + +#if JSONCPP_USING_SECURE_MEMORY +unsigned Value::getCStringLength() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_len; +} +#endif + +bool Value::getString(char const** str, char const** cend) const { + if (type_ != stringValue) return false; + if (value_.string_ == 0) return false; + unsigned length; + decodePrefixedString(this->allocated_, this->value_.string_, &length, str); + *cend = *str + length; + return true; +} + +JSONCPP_STRING Value::asString() const { + switch (type_) { + case nullValue: + return ""; + case stringValue: + { + if (value_.string_ == 0) return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return JSONCPP_STRING(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +#ifdef JSON_USE_CPPTL +CppTL::ConstString Value::asConstString() const { + unsigned len; + char const* str; + decodePrefixedString(allocated_, value_.string_, + &len, &str); + return CppTL::ConstString(str, len); +} +#endif + +Value::Int Value::asInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type_) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + // This can fail (silently?) if the value is bigger than MAX_FLOAT. + return static_cast(integerToDouble(value_.uint_)); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0f : 0.0f; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type_) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ ? true : false; + case uintValue: + return value_.uint_ ? true : false; + case realValue: + // This is kind of strange. Not recommended. + return (value_.real_ != 0.0) ? true : false; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type_ == booleanValue && value_.bool_ == false) || + (type_ == stringValue && asString().empty()) || + (type_ == arrayValue && value_.map_->size() == 0) || + (type_ == objectValue && value_.map_->size() == 0) || + type_ == nullValue; + case intValue: + return isInt() || + (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || + type_ == booleanValue || type_ == nullValue; + case uintValue: + return isUInt() || + (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || + type_ == booleanValue || type_ == nullValue; + case realValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case booleanValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case stringValue: + return isNumeric() || type_ == booleanValue || type_ == stringValue || + type_ == nullValue; + case arrayValue: + return type_ == arrayValue || type_ == nullValue; + case objectValue: + return type_ == objectValue || type_ == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0u; + else + return false; +} + +bool Value::operator!() const { return isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || + type_ == objectValue, + "in Json::Value::clear(): requires complex value"); + start_ = 0; + limit_ = 0; + switch (type_) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + (*this)[newSize - 1]; + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + JSON_ASSERT(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + CZString key(index); + ObjectValues::iterator it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type_ == nullValue) + return nullSingleton(); + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullSingleton(); + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType vtype, bool allocated) { + type_ = vtype; + allocated_ = allocated; + comments_ = 0; + start_ = 0; + limit_ = 0; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(strlen(key)), CZString::noDuplication); // NOTE! + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* cend) +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(cend-key), CZString::duplicateOnCopy); + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullSingleton() ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* key, char const* cend) const +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::find(key, end, found): requires objectValue or nullValue"); + if (type_ == nullValue) return NULL; + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) return NULL; + return &(*it).second; +} +const Value& Value::operator[](const char* key) const +{ + Value const* found = find(key, key + strlen(key)); + if (!found) return nullSingleton(); + return *found; +} +Value const& Value::operator[](JSONCPP_STRING const& key) const +{ + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) return nullSingleton(); + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const JSONCPP_STRING& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value& Value::operator[](const CppTL::ConstString& key) { + return resolveReference(key.c_str(), key.end_c_str()); +} +Value const& Value::operator[](CppTL::ConstString const& key) const +{ + Value const* found = find(key.c_str(), key.end_c_str()); + if (!found) return nullSingleton(); + return *found; +} +#endif + +Value& Value::append(const Value& value) { return (*this)[size()] = value; } + +#if JSON_HAS_RVALUE_REFERENCES + Value& Value::append(Value&& value) { return (*this)[size()] = value; } +#endif + +Value Value::get(char const* key, char const* cend, Value const& defaultValue) const +{ + Value const* found = find(key, cend); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const +{ + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(JSONCPP_STRING const& key, Value const& defaultValue) const +{ + return get(key.data(), key.data() + key.length(), defaultValue); +} + + +bool Value::removeMember(const char* key, const char* cend, Value* removed) +{ + if (type_ != objectValue) { + return false; + } + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + *removed = it->second; + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) +{ + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(JSONCPP_STRING const& key, Value* removed) +{ + return removeMember(key.data(), key.data() + key.length(), removed); +} +Value Value::removeMember(const char* key) +{ + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type_ == nullValue) + return nullSingleton(); + + Value removed; // null + removeMember(key, key + strlen(key), &removed); + return removed; // still null if removeMember() did nothing +} +Value Value::removeMember(const JSONCPP_STRING& key) +{ + return removeMember(key.c_str()); +} + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type_ != arrayValue) { + return false; + } + CZString key(index); + ObjectValues::iterator it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + ObjectValues::iterator itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +#ifdef JSON_USE_CPPTL +Value Value::get(const CppTL::ConstString& key, + const Value& defaultValue) const { + return get(key.c_str(), key.end_c_str(), defaultValue); +} +#endif + +bool Value::isMember(char const* key, char const* cend) const +{ + Value const* value = find(key, cend); + return NULL != value; +} +bool Value::isMember(char const* key) const +{ + return isMember(key, key + strlen(key)); +} +bool Value::isMember(JSONCPP_STRING const& key) const +{ + return isMember(key.data(), key.data() + key.length()); +} + +#ifdef JSON_USE_CPPTL +bool Value::isMember(const CppTL::ConstString& key) const { + return isMember(key.c_str(), key.end_c_str()); +} +#endif + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type_ == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(JSONCPP_STRING((*it).first.data(), + (*it).first.length())); + } + return members; +} +// +//# ifdef JSON_USE_CPPTL +// EnumMemberNames +// Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +// EnumValues +// Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type_ == nullValue; } + +bool Value::isBool() const { return type_ == booleanValue; } + +bool Value::isInt() const { + switch (type_) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= minInt && value_.int_ <= maxInt; +#else + return true; +#endif + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type_) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); +#else + return value_.int_ >= 0; +#endif + case uintValue: +#if defined(JSON_HAS_INT64) + return value_.uint_ <= maxUInt; +#else + return true; +#endif + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { + switch (type_) { + case intValue: + case uintValue: + return true; + case realValue: +#if defined(JSON_HAS_INT64) + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); +#else + return value_.real_ >= minInt && value_.real_ <= maxUInt && IsIntegral(value_.real_); +#endif // JSON_HAS_INT64 + default: + break; + } + return false; +} + +bool Value::isDouble() const { return type_ == intValue || type_ == uintValue || type_ == realValue; } + +bool Value::isNumeric() const { return isDouble(); } + +bool Value::isString() const { return type_ == stringValue; } + +bool Value::isArray() const { return type_ == arrayValue; } + +bool Value::isObject() const { return type_ == objectValue; } + +void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { + if (!comments_) + comments_ = new CommentInfo[numberOfCommentPlacement]; + if ((len > 0) && (comment[len-1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); +} + +void Value::setComment(const JSONCPP_STRING& comment, CommentPlacement placement) { + setComment(comment.c_str(), comment.length(), placement); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +JSONCPP_STRING Value::getComment(CommentPlacement placement) const { + if (hasComment(placement)) + return comments_[placement].comment_; + return ""; +} + +void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } + +void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } + +ptrdiff_t Value::getOffsetStart() const { return start_; } + +ptrdiff_t Value::getOffsetLimit() const { return limit_; } + +JSONCPP_STRING Value::toStyledString() const { + StreamWriterBuilder builder; + + JSONCPP_STRING out = this->hasComment(commentBefore) ? "\n" : ""; + out += Json::writeString(builder, *this); + out += "\n"; + + return out; +} + +Value::const_iterator Value::begin() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return const_iterator(); +} + +Value::const_iterator Value::end() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return const_iterator(); +} + +Value::iterator Value::begin() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} + +PathArgument::PathArgument(ArrayIndex index) + : key_(), index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) + : key_(key), index_(), kind_(kindKey) {} + +PathArgument::PathArgument(const JSONCPP_STRING& key) + : key_(key.c_str()), index_(), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const JSONCPP_STRING& path, + const PathArgument& a1, + const PathArgument& a2, + const PathArgument& a3, + const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.reserve(5); + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *++current != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.' || *current == ']') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(JSONCPP_STRING(beginName, current)); + } + } +} + +void Path::addPathInArg(const JSONCPP_STRING& /*path*/, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg++); + } +} + +void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... + return Value::null; + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + return Value::null; + } + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) { + // Error: unable to resolve path (object has no member named '' at + // position...) + return Value::null; + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#include +#define isfinite _finite +#elif defined(__sun) && defined(__SVR4) //Solaris +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#elif defined(_AIX) +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#elif defined(__hpux) +#if !defined(isfinite) +#if defined(__ia64) && !defined(finite) +#define isfinite(x) ((sizeof(x) == sizeof(float) ? \ + _Isfinitef(x) : _IsFinite(x))) +#else +#include +#define isfinite finite +#endif +#endif +#else +#include +#if !(defined(__QNXNTO__)) // QNX already defines isfinite +#define isfinite std::isfinite +#endif +#endif + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) || defined(__QNXNTO__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#if !defined(__MINGW32__) && !defined(__CYGWIN__) +#define snprintf std::snprintf +#endif +#endif + +#if defined(__BORLANDC__) +#include +#define isfinite _finite +#define snprintf _snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr StreamWriterPtr; +#else +typedef std::auto_ptr StreamWriterPtr; +#endif + +static bool containsControlCharacter(const char* str) { + while (*str) { + if (isControlCharacter(*(str++))) + return true; + } + return false; +} + +static bool containsControlCharacter0(const char* str, unsigned len) { + char const* end = str + len; + while (end != str) { + if (isControlCharacter(*str) || 0==*str) + return true; + ++str; + } + return false; +} + +JSONCPP_STRING valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + if (value == Value::minLargestInt) { + uintToString(LargestUInt(Value::maxLargestInt) + 1, current); + *--current = '-'; + } else if (value < 0) { + uintToString(LargestUInt(-value), current); + *--current = '-'; + } else { + uintToString(LargestUInt(value), current); + } + assert(current >= buffer); + return current; +} + +JSONCPP_STRING valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +JSONCPP_STRING valueToString(Int value) { + return valueToString(LargestInt(value)); +} + +JSONCPP_STRING valueToString(UInt value) { + return valueToString(LargestUInt(value)); +} + +#endif // # if defined(JSON_HAS_INT64) + +namespace { +JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) { + // Allocate a buffer that is more than large enough to store the 16 digits of + // precision requested below. + char buffer[36]; + int len = -1; + + char formatString[15]; + snprintf(formatString, sizeof(formatString), "%%.%dg", precision); + + // Print into the buffer. We need not request the alternative representation + // that always has a decimal point because JSON doesn't distingish the + // concepts of reals and integers. + if (isfinite(value)) { + len = snprintf(buffer, sizeof(buffer), formatString, value); + fixNumericLocale(buffer, buffer + len); + + // try to ensure we preserve the fact that this was given to us as a double on input + if (!strchr(buffer, '.') && !strchr(buffer, 'e')) { + strcat(buffer, ".0"); + } + + } else { + // IEEE standard states that NaN values will not compare to themselves + if (value != value) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); + } else if (value < 0) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); + } else { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999"); + } + } + assert(len >= 0); + return buffer; +} +} + +JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); } + +JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; } + +JSONCPP_STRING valueToQuotedString(const char* value) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && + !containsControlCharacter(value)) + return JSONCPP_STRING("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + JSONCPP_STRING::size_type maxsize = + strlen(value) * 2 + 3; // allescaped+quotes+NULL + JSONCPP_STRING result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c = value; *c != 0; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp +static char const* strnpbrk(char const* s, char const* accept, size_t n) { + assert((s || !n) && accept); + + char const* const end = s + n; + for (char const* cur = s; cur < end; ++cur) { + int const c = *cur; + for (char const* a = accept; *a; ++a) { + if (*a == c) { + return cur; + } + } + } + return NULL; +} +static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strnpbrk(value, "\"\\\b\f\n\r\t", length) == NULL && + !containsControlCharacter0(value, length)) + return JSONCPP_STRING("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + JSONCPP_STRING::size_type maxsize = + length * 2 + 3; // allescaped+quotes+NULL + JSONCPP_STRING result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() {} + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatiblityEnabled_(false), dropNullPlaceholders_(false), + omitEndingLineFeed_(false) {} + +void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; } + +void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } + +void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } + +JSONCPP_STRING FastWriter::write(const Value& root) { + document_.clear(); + writeValue(root); + if (!omitEndingLineFeed_) + document_ += "\n"; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + if (!dropNullPlaceholders_) + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: + { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) document_ += valueToQuotedStringN(str, static_cast(end-str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + ArrayIndex size = value.size(); + for (ArrayIndex index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (Value::Members::iterator it = members.begin(); it != members.end(); + ++it) { + const JSONCPP_STRING& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), static_cast(name.length())); + document_ += yamlCompatiblityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_(74), indentSize_(3), addChildValues_() {} + +JSONCPP_STRING StyledWriter::write(const Value& root) { + document_.clear(); + addChildValues_ = false; + indentString_.clear(); + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += "\n"; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const JSONCPP_STRING& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const JSONCPP_STRING& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(indentString_.size() >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += "\n"; + writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += "\n"; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += "\n"; + document_ += root.getComment(commentAfter); + document_ += "\n"; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation) + : document_(NULL), rightMargin_(74), indentation_(indentation), + addChildValues_() {} + +void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_.clear(); + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const JSONCPP_STRING& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) { + if (!indented_) writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter +{ + BuiltStyledStreamWriter( + JSONCPP_STRING const& indentation, + CommentStyle::Enum cs, + JSONCPP_STRING const& colonSymbol, + JSONCPP_STRING const& nullSymbol, + JSONCPP_STRING const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision); + int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE; +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultineArray(Value const& value); + void pushValue(JSONCPP_STRING const& value); + void writeIndent(); + void writeWithIndent(JSONCPP_STRING const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + typedef std::vector ChildValues; + + ChildValues childValues_; + JSONCPP_STRING indentString_; + unsigned int rightMargin_; + JSONCPP_STRING indentation_; + CommentStyle::Enum cs_; + JSONCPP_STRING colonSymbol_; + JSONCPP_STRING nullSymbol_; + JSONCPP_STRING endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; + bool useSpecialFloats_ : 1; + unsigned int precision_; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter( + JSONCPP_STRING const& indentation, + CommentStyle::Enum cs, + JSONCPP_STRING const& colonSymbol, + JSONCPP_STRING const& nullSymbol, + JSONCPP_STRING const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision) + : rightMargin_(74) + , indentation_(indentation) + , cs_(cs) + , colonSymbol_(colonSymbol) + , nullSymbol_(nullSymbol) + , endingLineFeedSymbol_(endingLineFeedSymbol) + , addChildValues_(false) + , indented_(false) + , useSpecialFloats_(useSpecialFloats) + , precision_(precision) +{ +} +int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout) +{ + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_.clear(); + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = NULL; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_)); + break; + case stringValue: + { + // Is NULL is possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + JSONCPP_STRING const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedStringN(name.data(), static_cast(name.length()))); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ((!indentation_.empty()) ? ", " : ","); + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultineArray(Value const& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) { + if (!indented_) writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() + : sout_(NULL) +{ +} +StreamWriter::~StreamWriter() +{ +} +StreamWriter::Factory::~Factory() +{} +StreamWriterBuilder::StreamWriterBuilder() +{ + setDefaults(&settings_); +} +StreamWriterBuilder::~StreamWriterBuilder() +{} +StreamWriter* StreamWriterBuilder::newStreamWriter() const +{ + JSONCPP_STRING indentation = settings_["indentation"].asString(); + JSONCPP_STRING cs_str = settings_["commentStyle"].asString(); + bool eyc = settings_["enableYAMLCompatibility"].asBool(); + bool dnp = settings_["dropNullPlaceholders"].asBool(); + bool usf = settings_["useSpecialFloats"].asBool(); + unsigned int pre = settings_["precision"].asUInt(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + JSONCPP_STRING colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + JSONCPP_STRING nullSymbol = "null"; + if (dnp) { + nullSymbol.clear(); + } + if (pre > 17) pre = 17; + JSONCPP_STRING endingLineFeedSymbol; + return new BuiltStyledStreamWriter( + indentation, cs, + colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre); +} +static void getValidWriterKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("indentation"); + valid_keys->insert("commentStyle"); + valid_keys->insert("enableYAMLCompatibility"); + valid_keys->insert("dropNullPlaceholders"); + valid_keys->insert("useSpecialFloats"); + valid_keys->insert("precision"); +} +bool StreamWriterBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidWriterKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + JSONCPP_STRING const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& StreamWriterBuilder::operator[](JSONCPP_STRING key) +{ + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) +{ + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + (*settings)["useSpecialFloats"] = false; + (*settings)["precision"] = 17; + //! [StreamWriterBuilderDefaults] +} + +JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) { + JSONCPP_OSTRINGSTREAM sout; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + diff --git a/yabause/src/libretro/Makefile b/yabause/src/libretro/Makefile new file mode 100644 index 0000000000..d8fef87741 --- /dev/null +++ b/yabause/src/libretro/Makefile @@ -0,0 +1,453 @@ +DEBUG = 0 +DEBUG_ASAN = 0 +DEBUG_UBSAN = 0 +DEBUG_TSAN = 0 +HAVE_SSE = 1 +__USE_OPENGL_DEBUG__ = 0 +HAVE_MUSASHI = 1 +FORCE_GLES = 0 +FASTMATH = 1 +# Tesselation is broken in yabasanshiro ? +ALLOW_POLYGON_MODE = 1 +LOW_END = 0 +DYNAREC_DEVMIYAX = 0 +USE_ARM_DRC = 0 +USE_AARCH64_DRC = 0 +USE_X86_DRC = 0 +USE_RTHREADS = 1 +ARCH_IS_LINUX = 0 +ARCH_IS_MACOSX = 0 +FORCE_GLEW = 0 + +ifeq ($(platform),) + platform = unix + ifeq ($(shell uname -a),) + platform = win + else ifneq ($(findstring Darwin,$(shell uname -a)),) + platform = osx + else ifneq ($(findstring MINGW,$(shell uname -a)),) + platform = win + endif +endif + +# system platform +ifeq ($(platform),) + platform = unix + ifeq ($(shell uname -a),) + platform = win + EXE_EXT=.exe + else ifneq ($(findstring Darwin,$(shell uname -a)),) + platform = osx + arch = intel + ifeq ($(shell uname -p),powerpc) + arch = ppc + endif + else ifneq ($(findstring MINGW,$(shell uname -a)),) + platform = win + EXE_EXT=.exe + endif +else ifneq (,$(findstring armv,$(platform))) + override platform += unix +endif + +CORE_DIR := . + +TARGET_NAME = yabasanshiro +CC_AS ?= $(CC) +GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)" +ifneq ($(GIT_VERSION)," unknown") + CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\" +endif + +# Unix +ifneq (,$(findstring unix,$(platform))) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread -lGL + ARCH_IS_LINUX = 1 + # ARM + ifneq (,$(findstring armv,$(platform))) + ifneq (,$(findstring cortexa8,$(platform))) + FLAGS += -marm -mcpu=cortex-a8 + else ifneq (,$(findstring cortexa9,$(platform))) + FLAGS += -marm -mcpu=cortex-a9 + endif + FLAGS += -marm + ifneq (,$(findstring neon,$(platform))) + FLAGS += -mfpu=neon + HAVE_NEON = 1 + endif + ifneq (,$(findstring softfloat,$(platform))) + FLAGS += -mfloat-abi=softfp + else ifneq (,$(findstring hardfloat,$(platform))) + FLAGS += -mfloat-abi=hard + endif + FORCE_GLES = 1 + HAVE_SSE = 0 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + FLAGS += -DARM + endif + +# Switch Lakka (arm64) +else ifeq ($(platform), arm64) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread -lGL + FLAGS += -DAARCH64 + ARCH_IS_LINUX = 1 + HAVE_SSE = 0 + USE_AARCH64_DRC = 1 + DYNAREC_DEVMIYAX = 1 + ALLOW_POLYGON_MODE = 0 + +# Amlogic S922X Odroid-N2 / A311D Khadas VIM3 (AMLG12B) - 32-bit userspace +else ifneq (,$(findstring AMLG12B,$(platform))) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread + ARCH_IS_LINUX = 1 + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + ALLOW_POLYGON_MODE = 0 + FLAGS += -march=armv8-a+crc -mtune=cortex-a73.cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mvectorize-with-neon-quad + +# Rockchip RK3288 / RK3399 - 32-bit userspace +else ifneq (,$(findstring RK,$(platform))) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread + ARCH_IS_LINUX = 1 + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + LOW_END = 1 + ALLOW_POLYGON_MODE = 0 + + ifneq (,$(findstring RK3399,$(platform))) + FLAGS += -march=armv8-a+crc -mtune=cortex-a72.cortex-a53 -mfpu=neon-fp-armv8 + else ifneq (,$(findstring RK3288,$(platform))) + FLAGS += -march=armv7ve -mtune=cortex-a17 -mfpu=neon-vfpv4 + endif + FLAGS += -mfloat-abi=hard -mvectorize-with-neon-quad + +# RockPro64 +else ifneq (,$(findstring rockpro64,$(platform))) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread -lGL + ARCH_IS_LINUX = 1 + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + LOW_END = 1 + ALLOW_POLYGON_MODE = 0 + FLAGS += -march=armv8-a+crc -mcpu=cortex-a72 -mtune=cortex-a72.cortex-a53 -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad + +# ODROIDs +else ifeq ($(platform), odroid-n2) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread -lGL + FLAGS += -DAARCH64 + ARCH_IS_LINUX = 1 + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_AARCH64_DRC = 1 + DYNAREC_DEVMIYAX = 1 + ALLOW_POLYGON_MODE = 0 + # ODROID-N2 + # clang-7 run at almost full speed, gcc is crashing + ifneq (, $(findstring clang,$(CC))) + FLAGS += -march=armv8-a+crc + else + FLAGS += -march=armv8-a+crc -mtune=cortex-a73.cortex-a53 + endif + +else ifneq (,$(findstring odroid,$(platform))) + override platform += unix + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -lpthread -lGL + ARCH_IS_LINUX = 1 + BOARD := $(shell cat /proc/cpuinfo | grep -i odroid | awk '{print $$3}') + + ifneq (,$(findstring ODROID-XU3,$(BOARD))) + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + LOW_END = 1 + ALLOW_POLYGON_MODE = 0 + # ODROID-XU3 & -XU3 Lite + ifeq "$(shell expr `gcc -dumpversion` \>= 4.9)" "1" + FLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a15 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4 -mvectorize-with-neon-quad + else + FLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a9 -mfpu=neon + endif + else ifneq (,$(findstring ODROID-XU4,$(BOARD))) + HAVE_SSE = 0 + FORCE_GLES = 1 + USE_ARM_DRC = 1 + DYNAREC_DEVMIYAX = 1 + LOW_END = 1 + ALLOW_POLYGON_MODE = 0 + # ODROID-XU4 on newer kernels now identify as ODROID-XU4 + ifeq "$(shell expr `gcc -dumpversion` \>= 4.9)" "1" + FLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a15 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4 -mvectorize-with-neon-quad + else + FLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a9 -mfpu=neon + endif + endif + +# OS X +else ifneq (,$(findstring osx,$(platform))) + TARGET := $(TARGET_NAME)_libretro.dylib + fpic := -fPIC + OSXVER = $(shell sw_vers -productVersion | cut -d. -f 2) + OSX_GT_MOJAVE = $(shell (( $(OSXVER) >= 14)) && echo "YES") + ifneq ($(OSX_GT_MOJAVE),YES) + #this breaks compiling on Mac OS Mojave + fpic += -mmacosx-version-min=10.1 + endif + ARCH_IS_MACOSX = 1 + SHARED := -dynamiclib + ifeq ($(arch),ppc) + ENDIANNESS_DEFINES := -DWORDS_BIGENDIAN -DMSB_FIRST -D__ppc__ + endif + LDFLAGS += -lpthread -framework OpenGL + +else ifneq (,$(findstring ios,$(platform))) + # iOS + TARGET := $(TARGET_NAME)_libretro_ios.dylib + fpic := -fPIC + SHARED := -dynamiclib + CC = clang -arch armv7 -isysroot $(IOSSDK) + CC_AS = perl ./libretro/gas-preprocessor.pl $(CC) + CXX = clang++ -arch armv7 -isysroot $(IOSSDK) + +# sncps3 +else ifneq (,$(findstring sncps3,$(platform))) + TARGET := $(TARGET_NAME)_libretro_ps3.a + CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + CXX = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe + ENDIANNESS_DEFINES = -DWORDS_BIGENDIAN -DMSB_FIRST -D__ppc__ + STATIC_LINKING = 1 + +# Lightweight PS3 Homebrew SDK +else ifneq (,$(findstring psl1ght,$(platform))) + TARGET := $(TARGET_NAME)_libretro_$(platform).a + CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT) + CC = $(PS3DEV)/ppu/bin/ppu-g++$(EXE_EXT) + AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT) + ENDIANNESS_DEFINES = -DWORDS_BIGENDIAN -DMSB_FIRST -D__ppc__ + STATIC_LINKING = 1 + +# Vita +else ifneq (,$(findstring vita,$(platform))) + TARGET := $(TARGET_NAME)_libretro_$(platform).a + CC = arm-vita-eabi-gcc$(EXE_EXT) + CCX = arm-vita-eabi-g++$(EXE_EXT) + CC_AS = arm-vita-eabi-gcc$(EXE_EXT) + AR = arm-vita-eabi-ar$(EXE_EXT) + ENDIANNESS_DEFINES += -DVITA + STATIC_LINKING = 1 + +else ifeq ($(platform), switch) + TARGET := $(TARGET_NAME)_libretro_$(platform).a + include $(LIBTRANSISTOR_HOME)/libtransistor.mk + STATIC_LINKING=1 + +# Emscripten +else ifeq ($(platform), emscripten) + TARGET := $(TARGET_NAME)_libretro_$(platform).bc + STATIC_LINKING = 1 + +# GCW0 +else ifeq ($(platform), gcw0) + TARGET := $(TARGET_NAME)_libretro.so + CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc + CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++ + AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += $(PTHREAD_FLAGS) -lrt + FLAGS += $(PTHREAD_FLAGS) -DHAVE_MKDIR + FLAGS += -ffast-math -march=mips32 -mtune=mips32r2 -mhard-float + fpic := -fPIC + CFLAGS += -DFAMEC_NO_GOTOS + +# Windows +else + TARGET := $(TARGET_NAME)_libretro.dll + CC = gcc + CXX = g++ + SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T + LDFLAGS += -static-libgcc -static-libstdc++ -lwinmm -lopengl32 + FLAGS += -DHAVE_WFOPEN -D_WINDOWS + +endif + +include Makefile.common + +ifeq ($(__USE_OPENGL_DEBUG__),1) + FLAGS += -D__USE_OPENGL_DEBUG__ +endif + +ifeq ($(HAVE_SSE),1) + FLAGS += -mfpmath=sse +endif + +#ifeq ($(shell expr `gcc -dumpversion | cut -f1` \>= 6.0), 1) +# FLAGS += -fno-PIE -no-pie +#endif + +ifeq ($(DEBUG_ASAN), 1) + DEBUG = 1 + DEBUG_UBSAN = 0 + FLAGS += -lasan -fsanitize=address + LDFLAGS += -lasan -fsanitize=address +endif + +ifeq ($(DEBUG_UBSAN), 1) + DEBUG = 1 + FLAGS += -lubsan -fsanitize=undefined + LDFLAGS += -lubsan -fsanitize=undefined +endif + +ifeq ($(DEBUG_TSAN), 1) + DEBUG = 1 + FLAGS += -ltsan -fsanitize=thread + LDFLAGS += -ltsan -fsanitize=thread +endif + +ifeq ($(DEBUG), 1) + FLAGS += -O0 -g +else + FLAGS += -O3 -DNDEBUG +endif + +ifeq ($(HAVE_MUSASHI), 1) + FLAGS += -DHAVE_MUSASHI=1 +else + OBJECTS += $(C68KEXEC_OBJECT) +endif + +ifeq ($(FORCE_GLES), 1) + FLAGS += -D_OGLES3_ + LDFLAGS += -lGLESv2 + ifeq ($(FORCE_GLEW), 0) + FLAGS += -DHAVE_OPENGLES -DHAVE_OPENGLES3 + endif +else + FLAGS += -D_OGL3_ +endif + +ifeq ($(LOW_END), 1) + FLAGS += -DLOW_END +endif + +ifeq ($(ALLOW_POLYGON_MODE), 1) + FLAGS += -DALLOW_POLYGON_MODE +endif + +ifeq ($(ARCH_IS_LINUX), 1) + FLAGS += -DARCH_IS_LINUX=1 +endif + +ifeq ($(ARCH_IS_MACOSX), 1) + FLAGS += -DARCH_IS_MACOSX=1 +endif + +ifeq ($(DYNAREC_DEVMIYAX), 1) + FLAGS += -DDYNAREC_DEVMIYAX=1 +endif + +ifeq ($(FASTMATH), 1) + ifeq (,$(findstring msvc,$(platform))) + FLAGS += -ffast-math + endif +endif + +ifeq ($(FORCE_GLEW), 1) + FLAGS += -DGLEW_STATIC -D_USEGLEW_ -DGLEW_NO_GLU +else + FLAGS += -DHAVE_GLSYM_PRIVATE +endif + +OBJECTS += $(OBJECTS_C) $(OBJECTS_CXX) $(OBJECTS_S) + +LDFLAGS += $(fpic) $(SHARED) +FLAGS += $(fpic) + +INCFLAGS := $(foreach dir,$(INCLUDE_DIRS),-I$(dir)) + +WARNINGS := +FLAGS += $(INCFLAGS) -D__LIBRETRO__ $(ENDIANNESS_DEFINES) $(WARNINGS) \ + -DNO_CLI -DHAVE_BUILTIN_BSWAP16=1 -DHAVE_BUILTIN_BSWAP32=1 -DHAVE_C99_VARIADIC_MACROS=1 \ + -DHAVE_FLOORF=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TIME_H=1 -DIMPROVED_SAVESTATES \ + -DHAVE_LIBGL -DVERSION=\"2.5.1\" + +CXXFLAGS += $(FLAGS) -std=gnu++11 +CFLAGS += $(FLAGS) -std=gnu99 + +all: $(TARGET) + +generate-files: +ifeq ($(HAVE_MUSASHI), 1) + $(CC) -o $(SOURCE_DIR)/musashi/$(M68KMAKE_EXE) $(SOURCE_DIR)/musashi/m68kmake.c;\ + $(SOURCE_DIR)/musashi/$(M68KMAKE_EXE) $(SOURCE_DIR)/musashi/ $(SOURCE_DIR)/musashi/m68k_in.c +else + $(CC) -DC68K_GEN -o $(SOURCE_DIR)/c68k/$(GEN68K_EXE) $(SOURCE_DIR)/c68k/c68kexec.c $(SOURCE_DIR)/c68k/c68k.c $(SOURCE_DIR)/c68k/gen68k.c;\ + cd $(SOURCE_DIR)/c68k/; ./$(GEN68K_EXE) +endif + +generate-files-clean: +ifeq ($(HAVE_MUSASHI), 1) + rm -f $(M68KMAKE_INC_SOURCES) $(SOURCE_DIR)/musashi/$(M68KMAKE_EXE) +else + rm -f $(GEN68K_INC_SOURCES) $(SOURCE_DIR)/c68k/$(GEN68K_EXE) +endif + +$(TARGET): $(OBJECTS) +ifeq ($(STATIC_LINKING), 1) + $(AR) rcs $@ $(OBJECTS) +else + $(CXX) -o $@ $^ $(LDFLAGS) +endif + +%.S.o: %.S + $(CC_AS) $(CFLAGS) -c $^ -o $@ + +%.s.o: %.s + $(CC_AS) $(CFLAGS) -c $^ -o $@ + +%.cpp.o: %.cpp + $(CXX) -c -o $@ $< $(CXXFLAGS) + +%.c.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(C68KEXEC_OBJECT): $(C68KEXEC_SOURCE) + $(CC) -c -o $@ $< $(CFLAGS) -O0 + +clean: + rm -f $(TARGET) $(OBJECTS) $(SOURCE_DIR)/musashi/$(M68KMAKE_EXE) $(SOURCE_DIR)/c68k/$(GEN68K_EXE) + +.PHONY: clean diff --git a/yabause/src/libretro/Makefile.common b/yabause/src/libretro/Makefile.common new file mode 100644 index 0000000000..bc8a3656a9 --- /dev/null +++ b/yabause/src/libretro/Makefile.common @@ -0,0 +1,145 @@ +SOURCE_DIR := $(CORE_DIR)/.. +LIBRETRO_COMM_DIR := $(CORE_DIR)/libretro-common + +INCLUDE_DIRS := $(CORE_DIR) \ + $(SOURCE_DIR) \ + $(LIBRETRO_COMM_DIR)/include \ + $(SOURCE_DIR)/musashi + +SOURCES_S := + +SOURCES_C := $(SOURCE_DIR)/osdcore.c \ + $(SOURCE_DIR)/bios.c \ + $(SOURCE_DIR)/cdbase.c \ + $(SOURCE_DIR)/cheat.c \ + $(SOURCE_DIR)/coffelf.c \ + $(SOURCE_DIR)/cs0.c \ + $(SOURCE_DIR)/cs1.c \ + $(SOURCE_DIR)/cs2.c \ + $(SOURCE_DIR)/debug.c \ + $(SOURCE_DIR)/error.c \ + $(SOURCE_DIR)/gameinfo.c \ + $(SOURCE_DIR)/japmodem.c \ + $(SOURCE_DIR)/memory.c \ + $(SOURCE_DIR)/movie.c \ + $(SOURCE_DIR)/netlink.c \ + $(SOURCE_DIR)/peripheral.c \ + $(SOURCE_DIR)/profile.c \ + $(SOURCE_DIR)/scspdsp.c \ + $(SOURCE_DIR)/scu.c \ + $(SOURCE_DIR)/scsp.c \ + $(SOURCE_DIR)/sh2cache.c \ + $(SOURCE_DIR)/sh2core.c \ + $(SOURCE_DIR)/sh2d.c \ + $(SOURCE_DIR)/sh2iasm.c \ + $(SOURCE_DIR)/sh2int.c \ + $(SOURCE_DIR)/smpc.c \ + $(SOURCE_DIR)/m68kcore.c \ + $(SOURCE_DIR)/m68kd.c \ + $(SOURCE_DIR)/vidogl.c \ + $(SOURCE_DIR)/yglcache.c \ + $(SOURCE_DIR)/ygles.c \ + $(SOURCE_DIR)/yglshaderes.c \ + $(SOURCE_DIR)/snddummy.c \ + $(SOURCE_DIR)/vdp1.c \ + $(SOURCE_DIR)/vdp2.c \ + $(SOURCE_DIR)/vidshared.c \ + $(SOURCE_DIR)/vidsoft.c \ + $(SOURCE_DIR)/titan/titan.c \ + $(SOURCE_DIR)/yabause.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_posix_string.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ + $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ + $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ + $(CORE_DIR)/libretro.c + +ifeq ($(FORCE_GLEW), 1) + SOURCES_C += $(SOURCE_DIR)/gllibs/glew/glew.c + INCLUDE_DIRS += $(SOURCE_DIR)/gllibs/include +else + SOURCES_C += $(LIBRETRO_COMM_DIR)/glsm/glsm.c \ + $(LIBRETRO_COMM_DIR)/glsym/rglgen.c \ + $(CORE_DIR)/glsym_private.c + ifeq ($(FORCE_GLES), 1) + SOURCES_C += $(LIBRETRO_COMM_DIR)/glsym/glsym_es3.c + else + SOURCES_C += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.c + endif +endif + +SOURCES_CXX := $(SOURCE_DIR)/Counter.cpp \ + $(SOURCE_DIR)/ygl_texture.cpp + +ifeq ($(HAVE_MUSASHI), 1) + SOURCES_C += $(SOURCE_DIR)/musashi/m68kcpu.c \ + $(SOURCE_DIR)/musashi/m68kops.c \ + $(SOURCE_DIR)/musashi/m68kopnz.c \ + $(SOURCE_DIR)/musashi/m68kopac.c \ + $(SOURCE_DIR)/musashi/m68kopdm.c \ + $(SOURCE_DIR)/m68kmusashi.c +else + SOURCES_C += $(SOURCE_DIR)/c68k/c68k.c \ + $(SOURCE_DIR)/m68kc68k.c +endif + +ifeq ($(DYNAREC_DEVMIYAX), 1) + ifeq ($(USE_ARM_DRC), 1) + SOURCES_S += $(SOURCE_DIR)/sh2_dynarec_devmiyax/dynalib_arm.s + else ifeq ($(USE_AARCH64_DRC), 1) + SOURCES_S += $(SOURCE_DIR)/sh2_dynarec_devmiyax/dynalib_arm64.s + else ifeq ($(USE_X86_DRC), 1) + $(OBJECTS_S) += $(SOURCE_DIR)/sh2_dynarec_devmiyax/dynalib.obj + endif + SOURCES_CXX += $(SOURCE_DIR)/sh2_dynarec_devmiyax/DynarecSh2CInterface.cpp \ + $(SOURCE_DIR)/sh2_dynarec_devmiyax/DynarecSh2.cpp +endif + +ifeq ($(USE_RTHREADS), 1) + SOURCES_C += $(SOURCE_DIR)/thr-rthreads.c \ + $(LIBRETRO_COMM_DIR)/rthreads/rthreads.c +else + ifeq ($(ARCH_IS_LINUX), 1) + SOURCES_C += $(SOURCE_DIR)/thr-linux.c + else ifeq ($(ARCH_IS_MACOSX), 1) + SOURCES_C += $(SOURCE_DIR)/thr-linux.c + else + SOURCES_C += $(SOURCE_DIR)/thr-windows.c + endif +endif + +M68KMAKE_EXE = m68kmake$(EXE_EXT) +GEN68K_EXE = gen68k$(EXE_EXT) +GEN68K_INC_SOURCES := $(SOURCE_DIR)/c68k/c68k_ini.inc \ + $(SOURCE_DIR)/c68k/c68k_op0.inc \ + $(SOURCE_DIR)/c68k/c68k_op1.inc \ + $(SOURCE_DIR)/c68k/c68k_op2.inc \ + $(SOURCE_DIR)/c68k/c68k_op3.inc \ + $(SOURCE_DIR)/c68k/c68k_op4.inc \ + $(SOURCE_DIR)/c68k/c68k_op5.inc \ + $(SOURCE_DIR)/c68k/c68k_op6.inc \ + $(SOURCE_DIR)/c68k/c68k_op7.inc \ + $(SOURCE_DIR)/c68k/c68k_op8.inc \ + $(SOURCE_DIR)/c68k/c68k_op9.inc \ + $(SOURCE_DIR)/c68k/c68k_opA.inc \ + $(SOURCE_DIR)/c68k/c68k_opB.inc \ + $(SOURCE_DIR)/c68k/c68k_opC.inc \ + $(SOURCE_DIR)/c68k/c68k_opD.inc \ + $(SOURCE_DIR)/c68k/c68k_opE.inc \ + $(SOURCE_DIR)/c68k/c68k_opF.inc + +M68KMAKE_INC_SOURCES := $(SOURCE_DIR)/musashi/m68kops.h \ + $(SOURCE_DIR)/musashi/m68kopac.c \ + $(SOURCE_DIR)/musashi/m68kopdm.c \ + $(SOURCE_DIR)/musashi/m68kopnz.c \ + $(SOURCE_DIR)/musashi/m68kops.c + +C68KEXEC_SOURCE := $(SOURCE_DIR)/c68k/c68kexec.c +C68KEXEC_OBJECT := $(C68KEXEC_SOURCE:.c=.c.o) + +OBJECTS_C += $(SOURCES_C:.c=.c.o) +OBJECTS_CXX += $(SOURCES_CXX:.cpp=.cpp.o) +OBJECTS_S += $(SOURCES_S:.s=.s.o) + diff --git a/yabause/src/libretro/README.md b/yabause/src/libretro/README.md new file mode 100644 index 0000000000..6221461680 --- /dev/null +++ b/yabause/src/libretro/README.md @@ -0,0 +1,20 @@ +# YabaSanshiro libretro + +## How to build (on odroid XU3/XU4) +From the root project directory, run `make -C yabause/src/libretro generate-files`, then `make -C yabause/src/libretro platform=odroid`. + +Library will be built at `yabause/src/libretro/yabasanshiro_libretro.so`. + +You'll need retroarch (or another libretro frontend) to run this library. + +## How to run games +Command line looks like this : + +`retroarch -L path/to/library path/to/iso/or/rom` + +## Where do you copy the bioses +Bioses go into the retroarch system directory, saturn bios is expected to be named `saturn_bios.bin`. + +## Currently known issues +- The core crashes when you switch from fullscreen to windowed on the fly. +- It's still a bit rough around the edge and i only tested it on ORA Retropie with a XU4 diff --git a/yabause/src/libretro/glsym_private.c b/yabause/src/libretro/glsym_private.c new file mode 100644 index 0000000000..a5f03ccb5c --- /dev/null +++ b/yabause/src/libretro/glsym_private.c @@ -0,0 +1,11 @@ +#include "glsym/glsym.h" + +#if defined(_OGLES3_) +RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +RGLSYMGLBINDFRAGDATALOCATIONPROC __rglgen_glBindFragDataLocation; +RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +#else +RGLSYMGLTEXTUREBARRIERNVPROC __rglgen_glTextureBarrierNV; +#endif diff --git a/yabause/src/libretro/glsym_private.h b/yabause/src/libretro/glsym_private.h new file mode 100644 index 0000000000..10c5ff07fa --- /dev/null +++ b/yabause/src/libretro/glsym_private.h @@ -0,0 +1,51 @@ +#ifndef RGLGEN_PRIV_DECL_H__ +#define RGLGEN_PRIV_DECL_H__ +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_OGLES3_) +typedef double GLclampd; +typedef double GLdouble; +typedef void (GL_APIENTRYP RGLSYMGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GL_APIENTRYP RGLSYMGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); + +#define glMemoryBarrier __rglgen_glMemoryBarrier +#define glBindFragDataLocation __rglgen_glBindFragDataLocation +#define glPatchParameteri __rglgen_glPatchParameteri +#define glDispatchCompute __rglgen_glDispatchCompute +#define glBindImageTexture __rglgen_glBindImageTexture + +#define GL_PATCHES 0x000E +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_PATCH_VERTICES 0x8E72 +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_WRITE_ONLY 0x88B9 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 + +extern RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +extern RGLSYMGLBINDFRAGDATALOCATIONPROC __rglgen_glBindFragDataLocation; +extern RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +extern RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +extern RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +#else +typedef void (APIENTRYP RGLSYMGLTEXTUREBARRIERNVPROC) (void); + +#define glTextureBarrierNV __rglgen_glTextureBarrierNV + +extern RGLSYMGLTEXTUREBARRIERNVPROC __rglgen_glTextureBarrierNV; +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/yabause/src/libretro/jni/Android.mk b/yabause/src/libretro/jni/Android.mk new file mode 100644 index 0000000000..b68aa5a285 --- /dev/null +++ b/yabause/src/libretro/jni/Android.mk @@ -0,0 +1,59 @@ +LOCAL_PATH := $(call my-dir) + +CORE_DIR := $(LOCAL_PATH)/.. + +HAVE_MUSASHI = 1 +DYNAREC_DEVMIYAX = 0 +USE_ARM_DRC = 0 +USE_AARCH64_DRC = 0 +USE_X86_DRC = 0 +ARCH_IS_LINUX = 1 +FORCE_GLEW = 0 +FORCE_GLES = 1 +USE_RTHREADS = 1 + +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + DYNAREC_DEVMIYAX = 1 + USE_ARM_DRC = 1 +else ifeq ($(TARGET_ARCH_ABI),arm64-v8a) + DYNAREC_DEVMIYAX = 1 + USE_AARCH64_DRC = 1 +endif + +include $(CORE_DIR)/Makefile.common + +COMMON_FLAGS := -ffast-math \ + -D__LIBRETRO__ -DHAVE_OPENGLES -DHAVE_OPENGLES3 -DHAVE_GLSYM_PRIVATE \ + -DNO_CLI -DHAVE_BUILTIN_BSWAP16=1 -DHAVE_BUILTIN_BSWAP32=1 -DHAVE_C99_VARIADIC_MACROS=1 -DHAVE_MUSASHI=1 \ + -DHAVE_FLOORF=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TIME_H=1 -DIMPROVED_SAVESTATES \ + -DHAVE_LIBGL -D_OGLES3_ -DVERSION=\"2.5.1\" -DANDROID -DARCH_IS_LINUX=1 + +GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)" +ifneq ($(GIT_VERSION)," unknown") + COMMON_FLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\" +endif + +ifeq ($(TARGET_ARCH_ABI),arm64-v8a) + COMMON_FLAGS += -DAARCH64 +endif + +ifeq ($(DYNAREC_DEVMIYAX),1) + COMMON_FLAGS += -DDYNAREC_DEVMIYAX=1 +endif + +include $(CLEAR_VARS) +LOCAL_MODULE := retro +LOCAL_SRC_FILES := $(SOURCES_CXX) $(SOURCES_C) $(SOURCES_S) +LOCAL_C_INCLUDES := $(INCLUDE_DIRS) +LOCAL_CFLAGS := -std=gnu99 $(COMMON_FLAGS) +LOCAL_CPPFLAGS := -std=gnu++11 $(COMMON_FLAGS) +LOCAL_LDFLAGS := -Wl,-version-script=$(CORE_DIR)/link.T +LOCAL_LDLIBS := -lGLESv3 +LOCAL_CPP_FEATURES := exceptions rtti +LOCAL_ARM_MODE := arm + +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + LOCAL_ARM_NEON := true +endif + +include $(BUILD_SHARED_LIBRARY) diff --git a/yabause/src/libretro/jni/Application.mk b/yabause/src/libretro/jni/Application.mk new file mode 100644 index 0000000000..4c03934a2c --- /dev/null +++ b/yabause/src/libretro/jni/Application.mk @@ -0,0 +1,3 @@ +APP_STL := c++_static +APP_ABI := all +APP_PLATFORM := android-21 diff --git a/yabause/src/libretro/libretro-common/.gitignore b/yabause/src/libretro/libretro-common/.gitignore new file mode 100644 index 0000000000..5761abcfdf --- /dev/null +++ b/yabause/src/libretro/libretro-common/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/yabause/src/libretro/libretro-common/audio/audio_mix.c b/yabause/src/libretro/libretro-common/audio/audio_mix.c new file mode 100644 index 0000000000..15879ab248 --- /dev/null +++ b/yabause/src/libretro/libretro-common/audio/audio_mix.c @@ -0,0 +1,318 @@ +/* Copyright (C) 2010-2018 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mix.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include