pax_global_header00006660000000000000000000000064140617704220014515gustar00rootroot0000000000000052 comment=8bc3741131db146ad08a5b83af9e6e48f0e94a03 openexr-2.5.7/000077500000000000000000000000001406177042200132105ustar00rootroot00000000000000openexr-2.5.7/.clang-format000066400000000000000000000067241406177042200155740ustar00rootroot00000000000000--- Language: Cpp # BasedOnStyle: LLVM AccessModifierOffset: -4 AlignAfterOpenBracket: AlwaysBreak AlignConsecutiveAssignments: true AlignConsecutiveDeclarations: true AlignEscapedNewlines: Right AlignOperands: true AlignTrailingComments: true # AllowAllArgumentsOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true # AllowAllConstructorInitializersOnNextLine: true AllowShortBlocksOnASingleLine: true AllowShortCaseLabelsOnASingleLine: true AllowShortFunctionsOnASingleLine: InlineOnly AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: false # AllowShortLambdasOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: TopLevel AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: MultiLine BinPackArguments: false BinPackParameters: false BraceWrapping: AfterClass: true AfterControlStatement: true AfterEnum: true AfterFunction: true AfterNamespace: true AfterObjCDeclaration: true AfterStruct: true AfterUnion: true AfterExternBlock: true BeforeCatch: true BeforeElse: true IndentBraces: false SplitEmptyFunction: false SplitEmptyRecord: false SplitEmptyNamespace: false BreakBeforeBinaryOperators: None BreakBeforeBraces: Custom BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: true BreakConstructorInitializers: BeforeComma BreakAfterJavaFieldAnnotations: false BreakStringLiterals: false ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: false DerivePointerAlignment: false DisableFormat: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 IncludeIsMainRegex: '(Test|_test)?$' IndentCaseLabels: true IndentPPDirectives: AfterHash IndentWidth: 4 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 4 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 8 PenaltyBreakBeforeFirstCallParameter: 8 PenaltyBreakComment: 1000 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 20 PointerAlignment: Left ReflowComments: false SortIncludes: true SortUsingDeclarations: true SpaceAfterCStyleCast: true SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: Always SpaceBeforeRangeBasedForLoopColon: false SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 8 #UseTab: ForIndentation UseTab: Never ... openexr-2.5.7/.github/000077500000000000000000000000001406177042200145505ustar00rootroot00000000000000openexr-2.5.7/.github/workflows/000077500000000000000000000000001406177042200166055ustar00rootroot00000000000000openexr-2.5.7/.github/workflows/analysis_workflow.yml000066400000000000000000000157571406177042200231240ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # # GitHub Actions workflow file # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions name: Analysis on: schedule: # Weekly Sunday build - cron: "0 0 * * 0" jobs: # --------------------------------------------------------------------------- # SonarCloud static analysis # --------------------------------------------------------------------------- linux_sonarcloud: name: 'SonarCloud Linux CentOS 7 VFX CY2020 ' # GH-hosted VM. The build runs in CentOS 7 'container' defined below. runs-on: ubuntu-latest container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker image: aswf/ci-openexr:2020 env: CXX: g++ CC: gcc steps: # TODO: Remove this workaround following resolution of: # https://github.com/AcademySoftwareFoundation/aswf-docker/issues/43 - name: Setup container run: sudo rm -rf /usr/local/lib64/cmake/glew - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 50 - name: Create build directories run: | mkdir _install mkdir _build - name: Configure run: | cmake ../. \ -DCMAKE_INSTALL_PREFIX=../_install \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_STANDARD=11 \ -DCMAKE_CXX_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage" \ -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ -DCMAKE_EXE_LINKER_FLAGS="-lgcov" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ -DOPENEXR_BUILD_UTILS='ON' \ -DOPENEXR_RUN_FUZZ_TESTS='OFF' \ -DPYTHON_EXECUTABLE=$(which python) working-directory: _build - name: Build OpenEXR with build-wrapper shell: bash run: | export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PWD}/IlmBase/Half:${PWD}/IlmBase/IlmThread:${PWD}/IlmBase/Iex:${PWD}/IlmBase/IexMath:${PWD}/IlmBase/Imath:${PWD}/OpenEXR/IlmImf:${PWD}/OpenEXR/IlmImfUtil echo ${PWD} echo ${LD_LIBRARY_PATH} build-wrapper-linux-x86-64 --out-dir bw_output make clean all working-directory: _build - name: Test run: | ctest -T Test \ -C Release \ -E PyIlmBase.*_Python2 \ --timeout 7200 \ --output-on-failure \ -VV working-directory: _build - name: Generate code coverage report run: share/ci/scripts/linux/run_gcov.sh shell: bash - name: Run sonar-scanner env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: sonar-scanner -X -Dsonar.login=$SONAR_TOKEN # ------------------------------------------------------------------------------ # Valgrind memcheck test # ------------------------------------------------------------------------------ linux_valgrind: name: 'Valgrind Linux CentOS 7 VFX CY2020 ' # GH-hosted VM. The build runs in CentOS 7 'container' defined below. runs-on: ubuntu-latest container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker image: aswf/ci-openexr:2020 env: CXX: g++ CC: gcc steps: # TODO: Remove this workaround following resolution of: # https://github.com/AcademySoftwareFoundation/aswf-docker/issues/43 - name: Setup container run: sudo rm -rf /usr/local/lib64/cmake/glew - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 50 - name: Create build directories run: | mkdir _install mkdir _build shell: bash - name: Install Dependencies run: | share/ci/scripts/linux/install_valgrind.sh shell: bash - name: Configure run: | cmake ../. \ -DCMAKE_INSTALL_PREFIX=../_install \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_STANDARD=14 \ -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ -DBUILD_SHARED_LIBS='ON' \ -DOPENEXR_BUILD_UTILS='ON' \ -DOPENEXR_RUN_FUZZ_TESTS='OFF' \ -DPYTHON_EXECUTABLE=$(which python) working-directory: _build - name: Build run: | cmake --build . \ --target install \ --config Release \ -- -j2 working-directory: _build - name: Valgrind memcheck tests run: | ctest -C Release \ -E PyIlmBase.*_Python2 \ --timeout 50000 \ --force-new-ctest-process \ --test-action memcheck \ --output-on-failure \ -VV working-directory: _build - name: Valgrind memcheck test results run: | share/ci/scripts/linux/log_valgrind.sh _build shell: bash # ------------------------------------------------------------------------------ # Fuzz test # ------------------------------------------------------------------------------ linux_fuzz: name: 'Fuzz Test Linux CentOS 7 VFX CY2020 ' # GH-hosted VM. The build runs in CentOS 7 'container' defined below. runs-on: ubuntu-latest container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker image: aswf/ci-openexr:2020 env: CXX: g++ CC: gcc steps: # TODO: Remove this workaround following resolution of: # https://github.com/AcademySoftwareFoundation/aswf-docker/issues/43 - name: Setup container run: sudo rm -rf /usr/local/lib64/cmake/glew - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 50 - name: Create build directories run: | mkdir _install mkdir _build shell: bash - name: Configure run: | cmake ../. \ -DCMAKE_INSTALL_PREFIX=../_install \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_STANDARD=14 \ -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ -DBUILD_SHARED_LIBS='ON' \ -DOPENEXR_BUILD_UTILS='ON' \ -DOPENEXR_RUN_FUZZ_TESTS='ON' \ -DPYTHON_EXECUTABLE=$(which python) working-directory: _build - name: Build run: | cmake --build . \ --target install \ --config Release \ -- -j2 working-directory: _build - name: Fuzz test run: | ls ls bin bin/IlmImfFuzzTest working-directory: _build openexr-2.5.7/.github/workflows/ci_workflow.yml000066400000000000000000000352111406177042200216570ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # # GitHub Actions workflow file # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions name: CI on: push: # Versioned branches and tags are ignored for OpenEXR <= 1.x.x branches-ignore: - RB-2.* tags-ignore: - v1.* - v2.* # Jobs are skipped when ONLY Markdown (*.md) files are changed paths-ignore: - '**.md' pull_request: branches-ignore: - RB-2.* tags-ignore: - v1.* - v2.* paths-ignore: - '**.md' jobs: # Linux jobs run in Docker containers, so the latest OS version is OK. macOS # and Windows jobs need to be locked to specific virtual environment # versions to mitigate issues from OS updates, and will require maintenance # as OS versions are retired. # # GH Actions (Free plan) supports 20 concurrent jobs, with 5 concurrent macOS # jobs. This workflow tries to utilize (but not exceed) that budget to # promote timely CI. # --------------------------------------------------------------------------- # Linux # --------------------------------------------------------------------------- # TODO: Add ARM build. Add sanitize build. linux: name: 'Linux CentOS 7 VFX CY${{ matrix.vfx-cy }} <${{ matrix.compiler-desc }} config=${{ matrix.build-type }}, shared=${{ matrix.build-shared }}, cxx=${{ matrix.cxx-standard }}>' # GH-hosted VM. The build runs in CentOS 7 'container' defined below. runs-on: ubuntu-latest container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker image: aswf/ci-openexr:${{ matrix.vfx-cy }} strategy: matrix: build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] include: # ------------------------------------------------------------------- # GCC, VFX CY2020 # ------------------------------------------------------------------- # C++11, Python 3.7 - build: 1 build-type: Release build-shared: 'ON' cxx-standard: 11 cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC 6.3.1 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # Debug - build: 2 build-type: Debug build-shared: 'ON' cxx-standard: 11 cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC 6.3.1 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # C++14 - build: 3 build-type: Release build-shared: 'ON' cxx-standard: 14 cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC 6.3.1 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # Static - build: 4 build-type: Release build-shared: 'OFF' cxx-standard: 11 cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC 6.3.1 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # ------------------------------------------------------------------- # GCC, VFX CY2019 # ------------------------------------------------------------------- # Python 2.7 - build: 5 build-type: Release build-shared: 'ON' cxx-standard: 11 cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC 6.3.1 vfx-cy: 2019 exclude-tests: # ------------------------------------------------------------------- # Clang, VFX CY2020 # ------------------------------------------------------------------- # C++11, Python 3.7 - build: 6 build-type: Release build-shared: 'ON' cxx-standard: 11 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang 7 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # Debug - build: 7 build-type: Debug build-shared: 'ON' cxx-standard: 11 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang 7 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # C++14 - build: 8 build-type: Release build-shared: 'ON' cxx-standard: 14 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang 7 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # Static - build: 9 build-type: Release build-shared: 'OFF' cxx-standard: 11 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang 7 vfx-cy: 2020 exclude-tests: -E PyIlmBase.*_Python2 # ------------------------------------------------------------------- # Clang, VFX CY2019 # ------------------------------------------------------------------- # Python 2.7 - build: 10 build-type: Release build-shared: 'ON' cxx-standard: 11 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang 7 vfx-cy: 2019 exclude-tests: env: CXX: ${{ matrix.cxx-compiler }} CC: ${{ matrix.cc-compiler }} steps: - name: Checkout uses: actions/checkout@v2 - name: Create build directories run: | mkdir _install mkdir _build - name: Configure run: | cmake ../. \ -DCMAKE_INSTALL_PREFIX=../_install \ -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ -DCMAKE_CXX_STANDARD=${{ matrix.cxx-standard }} \ -DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \ -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ -DOPENEXR_BUILD_UTILS='ON' \ -DOPENEXR_RUN_FUZZ_TESTS='OFF' \ -DPYTHON_EXECUTABLE=$(which python) working-directory: _build - name: Build run: | cmake --build . \ --target install \ --config ${{ matrix.build-type }} \ -- -j4 working-directory: _build - name: Test run: | ctest -T Test ${{ matrix.exclude-tests }} \ -C ${{ matrix.build-type }} \ --timeout 7200 \ --output-on-failure \ -VV working-directory: _build # --------------------------------------------------------------------------- # macOS # --------------------------------------------------------------------------- # TODO: Figure out why the excluded PyIlmBase tests are failing. macos: name: 'macOS 10.15 ' runs-on: macos-10.15 strategy: matrix: build: [1, 2, 3, 4, 5] include: # C++11, Python 3.7 - build: 1 build-type: Release build-shared: 'ON' build-docs: 'ON' cxx-standard: 11 python-version: 3.7 exclude-tests: -E PyIlmBase.*_Python3 # Debug - build: 2 build-type: Debug build-shared: 'ON' build-docs: 'OFF' cxx-standard: 11 python-version: 3.7 exclude-tests: -E PyIlmBase.*_Python3 # C++14 - build: 3 build-type: Release build-shared: 'ON' build-docs: 'OFF' cxx-standard: 14 python-version: 3.7 exclude-tests: -E PyIlmBase.*_Python3 # Static - build: 4 build-type: Release build-shared: 'OFF' build-docs: 'OFF' cxx-standard: 11 python-version: 3.7 exclude-tests: -E "PyIlmBase.*_Python3|PyIlmBase.PyImathTest_Python2" # Python 2.7 - build: 5 build-type: Release build-shared: 'ON' build-docs: 'ON' cxx-standard: 11 python-version: 2.7 exclude-tests: -E PyIlmBase.*_Python3 steps: - name: Setup Python uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Checkout uses: actions/checkout@v2 - name: Create build directories run: | mkdir _install mkdir _build - name: Install Dependences run: | share/ci/scripts/macos/install_boost.sh shell: bash - name: Configure run: | cmake ../. \ -DCMAKE_INSTALL_PREFIX=../_install \ -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ -DCMAKE_CXX_STANDARD=${{ matrix.cxx-standard }} \ -DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \ -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ -DOPENEXR_BUILD_UTILS='ON' \ -DOPENEXR_RUN_FUZZ_TESTS='OFF' \ -DPYTHON_EXECUTABLE=$(which python) \ -DBoost_NO_BOOST_CMAKE=ON working-directory: _build - name: Build run: | cmake --build . \ --target install \ --config ${{ matrix.build-type }} \ -- -j2 working-directory: _build - name: Test run: | ctest -T Test ${{matrix.exclude-tests }} \ -C ${{matrix.build-type}} \ --timeout 7200 \ --output-on-failure \ -VV working-directory: _build # --------------------------------------------------------------------------- # Windows # --------------------------------------------------------------------------- # TODO: Figure out how to get CMake to use Python 3.7.7. # Boost 1.70.0 will only make boost python for 3.7. # CMake finds Python 3.8 on the VM when configuring, then does not find # a corresponding boost python38 module. As a result PyIlmbase tests are not # built or run. # TODO: Determine why tests hang in Debug job. # TODO: Fix boost script to install from sourceforge. # windows: # name: 'Windows 2019 # ' # runs-on: windows-2019 # strategy: # matrix: # build: [1, 3, 4] # include: # # C++11, Python 3.7 # - build: 1 # build-type: Release # build-shared: 'ON' # build-docs: 'ON' # cxx-standard: 11 # python-version: 3.7.7 # boost-version: 1.70.0 # zlib-version: 1.2.11 # zlib-lib: zlib.lib # exclude-tests: '' # # Debug - # # - build: 2 # # build-type: Debug # # build-shared: 'ON' # # build-docs: 'OFF' # # cxx-standard: 11 # # python-version: 3.7.7 # # boost-version: 1.70.0 # # zlib-version: 1.2.11 # # zlib-lib: zlib.lib # # exclude-tests: '' # # C++14 # - build: 3 # build-type: Release # build-shared: 'ON' # build-docs: 'OFF' # cxx-standard: 14 # python-version: 3.7.7 # boost-version: 1.70.0 # zlib-version: 1.2.11 # zlib-lib: zlib.lib # exclude-tests: '' # # Static # - build: 4 # build-type: Release # build-shared: 'OFF' # build-docs: 'OFF' # cxx-standard: 11 # python-version: 3.7.7 # boost-version: 1.70.0 # zlib-version: 1.2.11 # zlib-lib: zlibstatic.lib # exclude-tests: '' # steps: # - name: Setup Python # uses: actions/setup-python@v1 # with: # python-version: ${{ matrix.python-version }} # - name: Checkout # uses: actions/checkout@v2 # - name: Create build directories # run: | # mkdir _install # mkdir _build # shell: bash # - name: Install Dependences # run: | # share/ci/scripts/windows/install_python.ps1 ${{ matrix.python-version }} $HOME # share/ci/scripts/windows/install_boost.ps1 ${{ matrix.boost-version }} $HOME 3.8 # share/ci/scripts/windows/install_zlib.ps1 ${{ matrix.zlib-version }} $HOME # shell: powershell # - name: Configure # run: | # cmake ../. \ # -DCMAKE_INSTALL_PREFIX=../_install \ # -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ # -DCMAKE_CXX_STANDARD=${{ matrix.cxx-standard }} \ # -DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \ # -DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \ # -DBOOST_ROOT:FILEPATH=$BOOST_ROOT \ # -DZLIB_ROOT:FILEPATH="$ZLIB_ROOT" \ # -DZLIB_LIBRARY:FILEPATH="$ZLIB_ROOT/lib/${{ matrix.zlib-lib }}" \ # -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ # -DOPENEXR_BUILD_UTILS='ON' \ # -DOPENEXR_RUN_FUZZ_TESTS='OFF' # # -DPython_EXECUTABLE:FILEPATH="$PYTHON_ROOT" \ # # -DPython_INCLUDE_DIR:FILEPATH="$PYTHON_ROOT/include" \ # # -DPython_LIBRARY:"$PYTHON_ROOT\libs" \ # shell: bash # working-directory: _build # - name: Build # run: | # cmake --build . \ # --target install \ # --config ${{ matrix.build-type }} # shell: bash # working-directory: _build # - name: Test # run: | # ctest -T Test ${{ matrix.exclude-tests }} \ # -C ${{ matrix.build-type }} \ # --timeout 7200 \ # --output-on-failure \ # -VV # shell: bash # working-directory: _build openexr-2.5.7/.gitignore000066400000000000000000000014461406177042200152050ustar00rootroot00000000000000Makefile Makefile.in autom4te.cache config.guess config.sub config.status configure depcomp install-sh ltmain.sh missing test-driver libtool compile stamp-h1 stamp-h2 IlmBase/config/IlmBaseConfigInternal.h IlmBase/HalfTest/HalfTest IlmBase/IexTest/IexTest IlmBase/ImathTest/ImathTest PyIlmBase/config/PyIlmBaseConfigInternal.h PyIlmBase/config/PyIlmBaseConfig.h PyIlmBase/PyIlmBase.pc PyIlmBase/PyIexTest/pyIexTest PyIlmBase/PyImathNumpyTest/pyImathNumpyTest PyIlmBase/PyImathTest/pyImathTest OpenEXR/config/OpenEXRConfigInternal.h OpenEXR/IlmImfTest/IlmImfTest OpenEXR/IlmImfUtilTest/IlmImfUtilTest OpenEXR/IlmImfFuzzTest/IlmImfFuzzTest Contrib/DtexToExr/DtexToExr .deps *.o *.lo *.deps *.libs *.Plo *.Po *.la *.so *.dylib *.m4 *.log *.trs *.project *.cproject .DS_Store build/ build-win/ build-nuget/ *~ openexr-2.5.7/ASWF/000077500000000000000000000000001406177042200137505ustar00rootroot00000000000000openexr-2.5.7/ASWF/charter/000077500000000000000000000000001406177042200154005ustar00rootroot00000000000000openexr-2.5.7/ASWF/charter/OpenEXR-Technical-Charter.md000066400000000000000000000322651406177042200224700ustar00rootroot00000000000000 # Technical Charter (the “Charter”) for OpenEXR a Series of LF Projects, LLC ### Adopted May 1, 2019 This charter (the “Charter”) sets forth the responsibilities and procedures for technical contribution to, and oversight of, the **OpenEXR Project**, which has been established as **OpenEXR a Series of LF Projects, LLC** (the “Project”). LF Projects, LLC (“LF Projects”) is a Delaware series limited liability company. All Contributors to the Project must comply with the terms of this Charter. ### 1. Mission and Scope of the Project * **a.** The mission of the Project is to continue maintenance and development of an open source project with the goals indicated in the “README” file within the Project’s code repository. * **b.** The scope of the Project includes using existing OpenEXR repositories to seed the Project, and software development under an OSI-approved open source license supporting the mission, including documentation, testing, integration and the creation of other artifacts that aid the development, deployment, operation or adoption of the open source software project. ### 2. Technical Steering Committee * **a.** The Technical Steering Committee (the “TSC”) will be responsible for all technical oversight of the open source Project. * **b.** The TSC voting members shall be as set forth within the “CONTRIBUTING” file within the Project’s code repository. A voting member of the TSC may nominate a successor in the event that such voting member decides to leave the TSC, and the TSC, including the departing member, shall confirm or reject such nomination by a vote. In the event that the departing member’s nomination for successor is rejected by vote of the TSC, the departing member shall be entitled to continue nominating successors until one such successor is confirmed by vote of the TSC. If the departing member fails or is unable to nominate a successor, the TSC may nominate one on the departing member’s behalf. The TSC may also determine if and how additional voting members of the TSC are chosen, and any such approach will be documented in the CONTRIBUTING file, provided that such approach does not conflict with this Charter. Any meetings of the TSC are intended to be open to the public, except where there is a reasonable need for privacy, and can be conducted electronically, via teleconference, or in person. * **c.** TSC projects generally will involve Contributors and Committers. The TSC may adopt or modify roles so long as the roles are documented in the CONTRIBUTING file. Unless otherwise documented: - **i.** Contributors include anyone in the technical community that contributes code, documentation, or other technical artifacts to the Project; - **ii.** Committers are Contributors who have earned the ability to modify (“commit”) source code, documentation or other technical artifacts in a project’s repository; and - **iii.** A Contributor may become a Committer by a majority approval of the existing Committers or at the discretion of the TSC. A Committer may be removed by a majority approval of the other existing Committers, or at the discretion of the TSC. * **d.** Participation in the Project through becoming a Contributor and Committer is open to anyone so long as they abide by the terms of this Charter. * **e.** The TSC may (1) establish workflow procedures for the submission, approval, and closure/archiving of projects, (2) set requirements for the promotion of Contributors to Committer status, as applicable, and (3) amend, adjust, refine and/or eliminate the roles of Contributors, and Committers, and create new roles, and publicly document any TSC roles, as it sees fit. * **f.** The TSC may elect a TSC Chair, who will preside over meetings of the TSC and will serve until his or her resignation or replacement by the TSC. The TSC Chair, or any other TSC member so designated by the TSC, will serve as the primary communication contact between the Project and the Academy Software Foundation Fund of The Linux Foundation. * **g.** Responsibilities: The TSC will be responsible for all aspects of oversight relating to the Project, which may include: - **i.** coordinating the technical direction of the Project; - **ii.** approving project or system proposals (including, but not limited to, incubation, deprecation, and changes to a sub-project’s scope); - **iii.** organizing sub-projects and removing projects; - **iv.** creating sub-committees or working groups to focus on cross-project technical issues and requirements; - **v.** appointing representatives to work with other open source or open standards communities; - **vi.** establishing community norms, workflows, issuing releases, and security issue reporting policies; - **vii.** approving and implementing policies and processes for contributing (to be published in the CONTRIBUTING file) and coordinating with the Series Manager to resolve matters or concerns that may arise as set forth in Section 7 of this Charter; - **viii.** discussions, seeking consensus, and where necessary, voting on technical matters relating to the code base that affect multiple projects; and - **ix.** coordinating any marketing, events, or communications regarding the Project with the LF Projects Manager or their designee. ### 3. TSC Voting * **a.** While the Project aims to operate as a consensus based community, if any TSC decision requires a vote to move the Project forward, the voting members of the TSC will vote on a one vote per voting member basis. * **b.** At least fifty percent of all voting members of the TSC must be present at a TSC meeting in order to establish a quorum. The TSC may continue to meet if a quorum is not met, but will be prevented from making any decisions at such meeting. * **c.** Except as provided in Section 7.c. and 8.a, decisions by vote at a meeting require a majority vote of those in attendance, provided quorum is met. Decisions made by electronic vote without a meeting require a majority vote of all voting members of the TSC. * **d.** In the event a vote cannot be resolved by the TSC, any voting member of the TSC may refer the matter to the Series Manager or its designee for assistance in reaching a resolution. ### 4. Compliance with Policies * **a.** This Charter is subject to the Series Agreement for the Project and the Operating Agreement of LF Projects. Contributors will comply with the policies of LF Projects as may be adopted and amended by LF Projects, including, without limitation the policies listed at https://lfprojects.org/policies/. * **b.** The TSC may adopt a code of conduct (“CoC”) for the Project, which is subject to approval by the Series Manager. Contributors to the Project will comply with the CoC or, in the event that a Project-specific CoC has not been approved, the LF Projects Code of Conduct listed at https://lfprojects.org/policies/. * **c.** When amending or adopting any policy applicable to the Project, LF Projects will publish such policy, as to be amended or adopted, on its web site at least 30 days prior to such policy taking effect; provided, however, that in the case of any amendment of the Trademark Policy or Terms of Use of LF Projects, any such amendment is effective upon publication on LF Project’s web site. * **d.** All participants must allow open participation from any individual or organization meeting the requirements for contributing under this Charter and any policies adopted for all participants by the TSC, regardless of competitive interests. Put another way, the Project community must not seek to exclude any participant based on any criteria, requirement, or reason other than those that are reasonable and applied on a non-discriminatory basis to all participants in the Project community. * **e.** The Project will operate in a transparent, open, collaborative, and ethical manner at all times. The output of all Project discussions, proposals, timelines, decisions, and status should be made open and easily visible to all. Any potential violations of this requirement should be reported immediately to the LF Projects Manager. ### 5. Community Assets * **a.** LF Projects will hold title to all trade or service marks used by the Project (“Project Trademarks”), whether based on common law or registered rights. Project Trademarks will be transferred and assigned to LF Projects to hold on behalf of the Project. Any use of any Project Trademarks by participants in the Project will be in accordance with the license from LF Projects and inure to the benefit of LF Projects. * **b.** The Project shall, as permitted and in accordance with such license from LF Projects, develop and own all Project GitHub and social media accounts, and domain name registrations created by the Project community. * **c.** Under no circumstances will LF Projects be expected or required to undertake any action on behalf of the Project that is inconsistent with the tax-exempt status or purpose, as applicable, of LFP, Inc. or LF Projects, LLC. ### 6. General Rules and Operations. * **a.** The Project will: - **i.** engage in the work of the project in a professional manner consistent with maintaining a cohesive community, while also maintaining the goodwill and esteem of LF Projects, LFP, Inc. and other partner organizations in the open source software community; and - **ii.** respect the rights of all trademark owners, including any branding and trademark usage guidelines. ### 7. Intellectual Property Policy * **a.** Participants acknowledge that the copyright in all new contributions shall be retained by the copyright holder as independent works of authorship and that no contributor or copyright holder will be required to assign copyrights to the Project. * **b.** Except as described in Section 7.c., all code contributions to the Project are subject to the following: - **i.** All new inbound code contributions to the Project must be made using an OSI-approved open source license specified for the Project within the “LICENSE” file within the Project’s code repository (the “Project License”). - **ii.** All new inbound code contributions must: o **1.** Be made pursuant to a binding Project Contribution License Agreement (the “CLA”) available on the Project’s web site; and o **2.** be accompanied by a Developer Certificate of Origin ([http://developercertificate.org](http://developercertificate.org)) sign-off in the source code system that is submitted through a TSC-approved contribution process which will bind the authorized contributor and, if not self-employed, their employer to the applicable license; - **iii.** All outbound code will be made available under the Project License. - **iv.** Documentation will be received and made available by the Project under the Creative Commons Attribution 4.0 International License (available at [http://creativecommons.org/licenses/by/4.0/](http://creativecommons.org/licenses/by/4.0/)). - **v.** The Project may seek to integrate and contribute back to other open source projects (“Upstream Projects”). In such cases, the Project will conform to all license requirements of the Upstream Projects, including dependencies, leveraged by the Project. Upstream Project code contributions not stored within the Project’s main code repository shall comply with the contribution process and license terms for the applicable Upstream Project. * **c.** If an alternative inbound or outbound license is required for compliance with the license for a leveraged open source project or is otherwise required to achieve the Project’s mission, the Governing Board of the Academy Software Foundation Fund of the Linux Foundation (“Governing Board”), or the Governing Board’s representatives designated for such purpose, may approve the use of an alternative license for specific inbound or outbound contributions on an exception basis. Any exceptions must be approved by a vote of the Governing Board and must be limited in scope to what is required for such a purpose. To request an exception, please describe the contribution, the alternative open source license(s), and the justification for using an alternative open source license for the Project. * **d.** Contributed files should contain license information, such as SPDX short form identifiers, indicating the open source license or licenses pertaining to the file. ### 8. Amendments * **a.** This charter may be amended by a two-thirds vote of the entire TSC, subject to reasonable approval by LF Projects. openexr-2.5.7/ASWF/images/000077500000000000000000000000001406177042200152155ustar00rootroot00000000000000openexr-2.5.7/ASWF/images/aswf.png000066400000000000000000000171531406177042200166720ustar00rootroot00000000000000PNG  IHDR2`EsRGBbKGD pHYs%%IR$IDATxw]UǿwRIЫT ]CE""A5w("5H MC@`ͣI%B $2n޹uf̽}^{U;GIP8̞ HRo`-O7---q"JV~ >6>i㛀O%ڷ={}fZ[[;zfIvk%-, 4ϲ״`fgG+q>0'^U 4 m3BRsI I%)7O$rf6@, |~!YG5[ZZhooIÀ}l ,, |!UIWx.4#0Q4ANNi87r%x-\*m۾Ʒ)%$| iD>_oIx69OХ%2?Ol#O <3@`åQ[3ss6p o_?XNf\_'+:uf6x8 4I7;uNN ,H=ooWw3fvyss3\6!%@3{l fGل軝}l74:QXeǮ 8mX*u϶5l|ynMdAkkkܾS 9_mfv 7\C3-\bf#ZZZBm `Bڒ\\`f&Izkkk[C켆ް%%iF2NJzΏO<?KZ-~UYΒ>D I:1&$.jIKڸ 9,w{K%]!iOl$iﱎk%،kHtVs$6:hHUzOT<~+3絶翼~jӒǿgnEm.3ӝ_kc}q b0s76*.T5$}377b^inn>3Y---1_paG|T9lX5` ]efHZ͡f6DޱCݮMĵjÁ fv~$ǝ_)477$ɇf6J[DH<4IںY%u\B_q^[af$gfsܑ7XDp_}?:mSRϏy7͎u$ ߢv~%+sy/$m8x(:-ߦ:}f .Y 03WǺ+ uK ˻̺; iVkfve*JL|0$DR9?WMݏǙً̬\ҮE^G*0Iu3&ܜJtގ&JZ8b֫$:R(ENMRE(oF*}wSVR&iLXq7+!D6,Tu_n`MCk/V0hIBs>Fy/C[ԝuWuW?tۇC8E}&G!Q1gfw~ if$]``Cw(^! Jp|b&B +]lO n]-!̐VF7uS-HB1}\ _n5;u .b ݣBK6Vuө;f?*iD7c$ yHE1xZtSaK wjM´]eI֧J`50kg3r[rUzh\ǫJErv6E>xnCX `ܩ5\j򕬶3{4\fvp1fvvtI]V2{H-kfٍY^"9G>%Iґ݆G2&l`B$ :^%iN#iN5$em_I3nJuTe73QʮRG#`KIw7&qF¤3̬WyMq /( ,CII.PQրwj7a 8lwtބIGm߀OTV岕H1tUv>+i33/ޟKx}6U>- bJ@DeU?*dMzJ\`II7[aZ>L?E62$mImQ`b_?IC~Ͼ5e=#^,%'iFWxq4ѡ)$Om 2ARs2BpIap_Iq?xc7϶Qr"_gќO7NVeQ|B$MWs%{Jr\Z5SHS8,>Zơ=PV{_@l +CW>E(L-+]HHکK=5!5:~DP;=KIZ9nkO.}d ~[:|G3辳f63z_u?W? f\w2Ϊ1[[[?WꬌϕԞۓ฾ $UL#`N~R{Th+ϓ'B_cme8PQXG4OU8Jw>/`B>9Hx=r O}c?fcÝ_J$Itk)~#f$hf3/q{_ŝifƣcT;& L.einmWU(9@|M7_7 {^lL;p#;Sg)ItoR'Njrx*{ xyn5У +bz7Lԗ-騨o!dvޟȅ&{NFNoq[ 3Cdh% %1>Qr;XSk"_ԃ^Oڔ:~+'䥒ooo>^+0spRL_'I23Ix͑t3*a86c48QIUŴȔ4 NwE`^;Lן+EF7 >631-kfoI DI Qc ٯ3E؉lfOp =r@vFTj23Ol:d[[uV$)gq\.WJ0]lUm|ŽgZa쐌'ڦ0X-pG9ν KݴȢM61\x?s$>Xgf$3-i!醌IS gUqd}w =F}.wI9T='<_sOR4Q) l-)oui_KHZ+_qSguah\^0UdvW;82ʘ2 ur]]  }̶"qQ =⎣.`jr9j{JUx.Kow^B@{͕t XWF:B6mmm%luGz^rܗ\+xq*!f>ل-3ZD̛*7'ѧamwAh@P[SwcH`;Z`Uy<>oA{Ϻ)8_sEn%rmL`zoU*5d<n<̲B B$zp஬vH)ߞ|Wt$)8ؼ!"zӁ3{w7HәLZ&^TuoúVguMc L~ͧ,D[ "@b~uLIG睙$9fh rz%I2|IIIṢlI/a(i!_I: ;xt>Ώ'IH+= 1F ^7ݕ9=e*pZt9걫C;=̆9#lr<^5.Xk1u sEHeFpąqD#3Hң/gF{A lX)-߷a?Bi%_5+L N^jyK [x S Q#J;ޖLIіi5Ak-ΧbϠvej~$؍^"Ġ{AtZXw_jQ,,;&\lr13bZD3gdh"OUzQzP(/Bs VI*{$77/4^g_#B1 >69Np~*{I]XJ. _J`khu>x/l{KtHU V "oY\_]45 8S}/ct?P̲`k3ۻӝ"D֭V&oo߯B938G pUsV>(rKX+ zO}Z x%-kfyF2މ݈G(垕}vٗU`nLPĿjHfI%U^J/x% mBS)&TUdzRyQ`;257 iգ;Ar u{Dnn <n' a"Km8'to D Zod&PhKY:v"#qG% .1H3Mw~{[!T&%TBFkՄ\8YHZ.ӆ{|5=3RcMKIFR$dfY(Ʉ\fv85^kr0O$ԓRk3{w2=S .|-ľ9fcԗ`tt6|5ٿoMl?#bf>\k%ŝIrxmmm˺: 3ks {J\#mzh]%lfW#mʬ;q5%~xW;Iٔ2?hB4OZtfޢDrz3n~YWB} C<ӵ9jaھDvt/'Իܙs!zL'I*Pz4>/P]{WkmwcI/p@* a$Vfv[vOO]Bdn*5c=,ދL mCS۵92[5hoځ>TMw=}ΏL뛢N^+hPur7@׍, Ulju#30_uYFE轀).pC%BKnf0>.ϻ@HMIFYJR*yl%qq!58w 煴8/%I2GyPvhVx&W&KڬuJRـZM.odQBn3b9}hh)I9r^azv]uBus%; u.xn*yy43$}~N6 1|PҁfֻV7bVB;֣V,>%maDZ'G}hf[~lff)tu`V"`Tݿfv#RWB˹q(ǒG V#?r3൑6p;ƺiM?wl@%_L6_V-|jxaf-vX)s;,lQ(WbeZ{90hW>ƅhqL)i@65-}/8S _{{uGXz]mJҘf~IOzenG`=%$ !VJfvwBWRǦ|9F V!BE+m82w!SLp~A@B`Q" M.DMs]_v31fv NS0}>4a>6s߈fJ'YS/ܯpg]GHH;_?EI+F'I^ u0<sX?$d;=p`M3]-M,Џcd<6In~.EoLQX!._/^Gt\gEcx6!9~װ‹}S~~Pvw?HCCQr=~RG(S'6)a'E?I1FmPf{jDs7}?hǘų!`i#tg*4IENDB`openexr-2.5.7/ASWF/images/openexr-logo.jpg000066400000000000000000000437121406177042200203440ustar00rootroot00000000000000JFIFHHC      C  , P !1"AQa 2BRSq#b $3Cr%4Ts&cfE !1AQ"2RaqB#3SbCr$c ?3>%3P3>%3P3>%~hӇ)mY'ACH4[I4%;䛍y&8g 71BthD6m8^Jt$ܾq7xܝpSqSM؍7] Z#hh$6ADi&@"4WFJ'|RY? a_)W_ocq{Aay[o=}~tLng7c(BD #Ks lcwO톸yXG َ΢v솪L_ff\rX}*ݶkr&Zt{?O|v%isI0~qsã#.@\}.Ѯי~Bv=OE>QkChhኑpakKw .YFHaeGSvsOq>}yƶW%=D2@HDZZAPVaŻɶƹw)ҧmS}++nDohn(oUvKO%dnYDB?4Wj"4WN46%f !tj  y( pX6CaUxGS_]VtOfI$=rzsIU_0DCxn傶I{YQ{ׯw=|.-jkz aA| k-wf#-ʥ6Ab?_-m?746Ա>^ ]k^r6s7^Vw4WAS+ YEvADi(Eth Ev#mFP[nO'"y( @@@@@@@@@@@@@@@@@@@@@@A+Ev".,Ѥ'AE;S"mNڳ[],V`gby$z-^uUË! :N4f|dDGN[#:R:g}PpnMgMbi&^ָ2 q(_9O)x8<]=6c#2H|;CaE?4WaCc= Tֺ) ps$ŮaaNfLzgb!|mlnɭ%wp99efg[rW(у&b~N#m96Vĥm[nQk3|Y#`m[F$~ ;/w^nr[ 5=9BWv4~x? q~TZnֹU%C4ȃGx#%N;l\J+P11h͍'YD+ۄK3dF4NF/:-(>Jط'Y[b4W.U55<-5u˯k5]A .!([ɑ'.ORyzx]?*N dwn[en*wRmwCm lpPc*jۙڒKZA#:)]iJڧꮉlV~$OZV$6Ӯ p|ndZ{c/>= y[}ߡomf޶WqG>1l=YO_n&l9H;bڽs۹d|5zc㛥]S*Z)02J+eAh͍2#E{H:y"|S;qπUڞ-Xw~Y?+5!a'oj=|M_om|fފ}fO!o\Zj^뭾; m+̗ #pQl?FZg&s% iX8Yc:W{OWg{n}7H3d3Vc/CtVk̵SwEجnB#ˉ%H8O=_U?q+aՠO 5 YZ}\,#p+[b_M{7[ ֶy.FZqfex!4{`R>;sXtLԟbp^oB9/8x}C1A9/8x}Bi1~i>z{V"ӇO(=C#SjXžՓ*x5e<[ۛٝv)\ ݿS10.KJtOg~Bڙz#Mg_.%5ӲFiˈ>u9-7{ӶՎ_ g(j@uYIOYOYZW?(fWE uOr2(LhȥEE#64f ȋSAEt"ڍXvR5(BhY[V5MVnFգ##(mZɪ|gĵrAYWD f}<ڑ>rp¶;L6fޢFb_JZjX٣8f@f VV{MZ9㷯h[lP!c= ]|, ۭ1bwC5ߡM~KrUYE(tcG|J:^tk/9nɶ'^4Jv]c.u%7(jyilŇj#׹tq{[i~fj{ h4+jע50pn2TG;dfNn!#뒾b{jM7\Xrp N̵Z8HN] / SKM}.rQ^٥'yWg%TَN;*"hZ ܌l* 5LF5Qz( 7њdF4bYK=f{UdkVEzt#JV[]2"uxjtg7C]&4Ssjlk?z鏩Os@.K~/[+zsLOd'}jq<̂_+ fPɁ'+{ۓ+^֟;ϟBap'{'yh;?l\sKsyjG0GQg1L|._8ѤÄUh IE-β*zxy#8\NAdjn՗vlSk6|>k“d{Y-zml;^Țڸ})wlm]sV[[R^_#h֌ ܻ)jWe{C&ǂ1oݶn=ʋK$9'Fr1q#xQoMSW/>C,<縜+gY_{gP\~+("?(zPAMV<xfa~adp?=FJU ȋD6 E F{ t"YY+jjUk[4[WMYI%WY_kY]ҍb5wL4dM7keoRvNg9xA5O1>\tOlk8!h "`v0ÔJ6}9=0 [bakWxK?h`qkzGJ>y ӑϨ+'Y553eh8fU < '3$䨾 xQٛ!~ڑ58j&7kZ,6K&cr#&Zwz ~>/29՞~YWSS<5IeK9I9WN5զ}ߡj\b*QkKUmypsj-'Svqs%ފ #p[ct~V|*p?~Ώ3{E-]\TT<,88$-kL/֗w}T)iU+E-d5ڕv$U*xB(ƌţ1 -QY :1fQ~H?+EX YA: /tjMFJei ft _+E\ctaZQ)[,َڽqfrMv˚1_E%|U 'Ñ(5xÝ&9[)8꣔p!t{r9ǂ[$s -щkӟߣ#E-35;#"6 c@F==8*fpss<1Zڙ8GdW:i 2%mҎ1SN$$ڞ-l)1ڗI(ڛ]McN7rVRgUWgm+"ј2:YB)e"@@@@@@@@@@@@@@@@Ahj=Ѝ(=fJ/iN[frQҬtct1#5xؚR~%χS sy?zst;3?Ʈ6W;QOʙS੦u=A9yr#Ez\։}%r1\Jy;z5 v^u>p[4q[L]Ϲ=iwOݎmcNDΞnc[V>9|zFfp];#up6y?]oxS28Ҝ|-ڥ矽-OnowabhZM$|U7+f]ؖ>Q_-%|6G>qO>OCU?OǣѸaq,eY]eJiIdkzV<;cN!M8J)!h>EB5of*=x,GJn^]UmZOvJֶ]Xi`1='X_:_Ys5: 8V##m(;m[==綣1(bu:GEML|PJH~F9#'3/dtcٓNDyľǪ;2a-{MltN}=;@k_ nHQr8e[hj^d Zdq=Ulڸ;cCQv=TO@i>;sl&?jY K0x)L-KXh֟/4t`nzt dUžnx:Ǜv[.Yoay.ec%md xe\k[[1ۧ7A[K8\-X[m7JK*%1<4n12;'0ޕ^7*oLDi^Au_|lI0p %jK_%6i^ݟ7r iMַ;\kY{gI[o.;mXlŠn6덳 yѹc$s*#-cCOle+/fkV<=+.~gmL 1C5e9 ֒51wg=9;+m/3kucI6'rmKx_h\`vZ*jx iډ$dec'ɏw:.P|9nq4ړۙ5'Dk_!fr>fY۷m6ynt_la U^)aamm$awDe-- _t=Y}<.6Epn0 >ii4fHbkc˳s*4Q~nY aM÷ /4T+iYk]-.\.3c^Gs7S>|#SRёt5gƷd|#v\7V1m;&kLkvG;V&-߉ꏄ)'|ꏄ~۬aI'9w?E+nelDqO7}tO$Sr5F@vi[25ږmuJ/}aWjuQTlk\eXr꫱sV]ozk\ݡcx=Wښuۙwn;?E_[Imⷋ+o~U|x~I}W?Km}:`ML28ye0ZN-~R7ߗ^-.~^q,Ƀ6kh׳'Q>L3Ӄmq}}t>߷x/Cq̍/Sot&ٔ[ 9G`8VډRػܖ}*e`]aVw4SJ)cߠ5ȜÞˬp5f?<vM5V_nXZevEm2[4BI48dS-x7w67T?lD681Ud,4+~s>pdne\ǹr^pwGl!Ymv{4v?EiT)mWksY({p`k ps0qreY[I=ZGfLލ1=`]8a*ilna1Bֈᥭ4i׵+e/eyts_D_-woڿr|c"O޴ w>B,ZM07KZ~(uƊǭWI+M,n :s ԯ+ oo),^Ziդs< .2gl5pE 5&4uBH!=ٝzxx{g|[xuӬ"G3$⭭~n)q4z8Vb(a{|iGgSb|1L~ΝKxv|\gX~4v K R[rU8rky9婎ik9r+/w}W=s;ba6rfJ1iOo~?ض^wU662q SDͫڷg,O)'67S/>S+W }~SUNhg+'f#;DpGϹv3D[|EE_G{ܯӱ.;m}sq5AN)Tdr!(xt ͉ k&5k*%u+Ux 5^&#\{ݒ;=sޑMl-Ua͏lҝZ:]Ys8B Z^'#s~M:k zGtq~ݟ <oƧwjJz &1\֝:d@(xQ>MsQ'i;ۻv{aokt-ÖPmy&|QΆ1-,a<[ [qf;/mT =Ț}Lzv5><63w#/i{>/,,q+Ӧӫm7v=}xGj}[U%IXbUr6  s|mn Apv#O84<zol#^6iǛRUÒa:Y3QTFI#yFI½kݎkl^g]{lst\6mw8m_0SZdn/{zFeݜX{׵fy2QIR&m^m'Mu5ga[:CvmvM5XŠc%t|I = =p<<[ʾ۽wwm]mkVh_WprQm˩J#E.YAԭt;_T[=,YCjb|H\gs;I`G>擁,|'JZfXsltM2amF1~a-9]4X;]Ѕm_жk%l?= WYWO/GH4 Ǽ|B1i|<(oŢme@c Z;LK }$:iwmM"ꏟr˜򯧺{i]NX[f[O\_mn!·[ ՍSsCHAwav2\)MtQN}(6a XQBO#N}(G]?U Qi\, IOGJ>}m=?b;TG>8>{1zT])>}p)?gߢNR?~6z9V׵[Zhg>USXQ&;"uYCYB @@@@@@@@@@@@A6)u\klלMwmK.::Y[$ DEΑuv}zR׶ں2l\$`Ƴ-I`T:F*CB$is93?eUy7e05=6|RM$/sI/'$wͅg~)FC)]t~_x8H H9vɾ<漬vO{gktw:seq$O2Jm^+=cj,N,|g6Mgu[`c E K|省vqWLZ 9^ӳ1:Z6'iOoAڪwC isOqͽpf8v iIѶ<\ovl+1SRY[9MENCZa`%rw&g1vauG7fVyW|w?<߇s/5;ČWKQfx Ay5z\LxĴk^= >i =vtu4SYN&m'AZd~_dVq0|;ƓbUĐ`5s.#.BK~^kr~>۞󵺇 ]ૹx”R{譺_5~Æpp߱v ᫙WI y \`K~+,\:G+wq\9'tX]0F2;vb\:։SG]=#A3ϙ_?;}wr:iT<mgdW0:l|oCzX{rsHiKu_+1Ŝj0>x'e 'TqFN݋ 7꥽7_rVܥl71*N]2S3*O-*ᒝN)^Ӓa,p :÷b2*UPPNV;WrasZ|oZ NJ:U|Z짅ڜg Yŭ+ͲǦ_o1g$9o IQ%K{=3[^kj~ܕ_'L]||g}q {b·7>,osv |!SZ;R8h$Z_.O[1?3jnDz&v@ϪC~Z)莨uMrz.zo[zo8&zo8 %rOn!aqDMd~fx'÷N>s;tƟ k66 EzwEOr=<5C:sZAs2VŜL8晝c߉vR istMX(QDQԬQ(1D*!ex~hjJ!'AD)џz-]ԳkZFoz4VnՑҫQ*jQv3U0'vJVioCn{ZN]acysf<)oB&/*{|Oj?/|Y|m}ߡ6飔 \[{K\V*kld##OWfݯÿ~RݞÈ|~Z5Cfc_\Z22F*f|4ieQTTidgM,ogM,oc5Ȝ#1G O5:K| .>վvF.m~6Ŕa]YGnQ\7dD 9ygݮZ֭?8}'"6,&4lwĶMLї?H$88qΠG%wƮ%oj_}=rw} ]=T1hƾڣkq uÐ3w%Bvz"g߉0%ҸӲf#ʏe:co~\Yp^p:`s:յ_ n{C4>{=sw{S(Gnd9J C"{`'V/eed4NDuZ(V'T4XnhU cՍ ycuC@ꭶ\ƪi=Tg8S>`k>-UmN, <4cE %6J:„UAhcFb Q:I J/YԳiZ"ՅH*[m+VVxtҬѴgg.VxLˮ+`k]Έ~oQqK+K]M!.4NȮla[G%gI=COcSfC̿cW7>06kqphϼwz?].,6~d'c}lO(=n'r.dyx8xbޘ{}: NXƴt;}j6Yi{b>V~r,4d{?Z~rуwZG"d>rcRxQ8>v|%'"32_S')<C쌗JOEG-Us>EJ:W@.$%~>/׭<W֝υDϟwحV# %"ԶL77nbQ jKf^&oǡ-yQH󣯣9iZ~S }$e._;l;Mq<KU/IӞ'3<;fCT_N$\i2ٳ;5NZ`-|. 4nxZK;_x<K= >avML@d%9Hr_E̶$-rħիAVl|K8Af kEhkhnXCtǚ< q|i o^8嫕I#A|SwOW|n_\]lJ̇je ;#Nl#Yx.dNhvF&&jчO_OWD{'WvÕv:KXCYz{X?vNd~g[s_ Oc}eslx^0Vq&U|iQ*uNk(k&k(k(D,w}hK"a%ԋVgzx,׎^.dTڷ⡑Fiu+b5_E>U(*ꦓ}E4sX?iwp5²S#ِt=,s,,jƬK<"v/#{R}]~{x`- m>( an9g<{eo[D+_^+ϳc[> *Xx5kJ6r.`ff5'OuQ <Jֹ|j>LޫiGVٴ,Ek\R7`=Oʱ▸JFSFC2A~}H/r9ljLkfȱ >sx>F<*_J23q_Aj<]s^J˽돻랷DmVdyC/V_Is>k-ƬuޓS0ɇkY7|렮嬷yogz˸7/XhY[yk.g7GT2G=Iv lZu @-֟?Z1GcV=.Xd?48A òk/o\9;VDyY.\{Tvۇvm:FG etW_+y`ay9Mgĸ_WrdIiYUСkVAJ)FFݚ̶[ nUgMp(ޯt%KUfklFB~^%WvGkvl5{2zRBrc.ŏƏR'MC/Hכ<'hg2ڙ(5+A_r_dɭӷz-gfgVG|ˣz^|rkрz^N9/붵p.:Xgͱy'+}fc$mX{;upIWu.3TLC7&yWMoh|g1lZ:;2IT.K[b<G˒%WI(Uf7v0KnbɋS!1,28qc{Ip+Hb4᣽^.p*N3NvJ4et"u V+omk˶x䩱mPϪ+o3U\W|J,3x}E>J8v^3~p+(S=ߜ)Y?hSX^>&%x:v2Gڞ+d}ދjXg_;SŬ>ݏxjF쥹W T#?*xg<ګ[e'Uuɇ[fVZc e_5=l[lVm)޹mc6*Mk(D'YAopenexr-2.5.7/ASWF/legal/000077500000000000000000000000001406177042200150345ustar00rootroot00000000000000openexr-2.5.7/ASWF/legal/OpenEXR Corporate Contributor License Agreement.md000066400000000000000000000047231406177042200263110ustar00rootroot00000000000000Corporate Contributor License Agreement ("Agreement") Thank you for your interest in the OpenEXR Project a Series of LF Projects, LLC (hereinafter "Project"). In order to clarify the intellectual property licenses granted with Contributions from any corporate entity to the Project, the Project is required to have a Corporate Contributor License Agreement (CCLA) on file that has been signed by each contributing corporation. Each contributing corporation ("You") must accept and agree that, for any Contribution (as defined below), You and all other individuals and entities that control You, are controlled by You, or are under common control with You, are bound by the licenses granted and representations made as though all such individuals and entities are a single contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" means any code, documentation or other original work of authorship that is submitted to the Project for inclusion in the Project by Your employee or by any individual or entity that controls You, or is under common control with You or is controlled by You and authorized to make the submission on Your behalf. You accept and agree that all of Your present and future Contributions to the Project shall be: Submitted under a Developer's Certificate of Origin v. 1.1 (DCO); and Licensed under the BSD-3-Clause License. You agree that You shall be bound by the terms of the BSD-3-Clause License for all contributions made by You and Your employees. Your designated employees are those listed by Your CLA Manager(s) on the system of record for the Project. You agree to identify Your initial CLA Manager below and thereafter maintain current CLA Manager records in the Project’s system of record. Initial CLA Manager (Name and Email): ______________________________________ Corporate Signature: Company Name: ________________________________________________________ Signature: _____________________________________________________________ Name: ________________________________________________________________ Title __________________________________________________________________ Date: _________________________________________________________________openexr-2.5.7/ASWF/legal/OpenEXR Individual Contributor License Agreement.md000066400000000000000000000024331406177042200264370ustar00rootroot00000000000000Individual Contributor License Agreement ("Agreement") Thank you for your interest in the OpenEXR Project a Series of LF Projects, LLC (hereinafter the "Project"). In order to clarify the intellectual property licenses granted with Contributions from any corporate entity, the Project is required to have an Individual Contributor License Agreement (ICLA) on file that has been signed by each contributing individual. (For legal entities, please use the Corporate Contributor License Agreement (CCLA).) Each contributing individual ("You") must accept and agree that, for any Contribution (as defined below), You are bound by the licenses granted and representations made herein. "Contribution" means any code, documentation or other original work of authorship that is submitted to the Project for inclusion in the Project by You or by another person authorized to make the submission on Your behalf. You accept and agree that all of Your present and future Contributions to the Project shall be: Submitted under a Developer's Certificate of Origin v. 1.1 (DCO); and Licensed under the BSD-3-Clause License. Signature: __________________________________________ Name: _____________________________________________ Date: ______________________________________________openexr-2.5.7/ASWF/proposal/000077500000000000000000000000001406177042200156075ustar00rootroot00000000000000openexr-2.5.7/ASWF/proposal/OpenEXR-Adoption-Proposal.md000066400000000000000000000216341406177042200227670ustar00rootroot00000000000000# OpenEXR Adoption Proposal ## ASWF TAC Meeting - April 10th, 2019 # Overview 1. Project Contribution Proposal 2. Incubation Stage Requirements 3. Adopted Stage Requirements 4. Additional Discussion Topics 1. Near-Term Development Roadmap 2. Community Discussion at SIGGRAPH 2018 3. Technical Steering Committee # Project Contribution Proposal The following is an overview of the Project Contribution Proposal for OpenEXR: * Name of the project: * OpenEXR * Requested project maturity level: * Incubation (initially proposed as Adopted) * Project description: * OpenEXR is a high dynamic-range image file format developed by Industrial Light & Magic (ILM) for use in computer imaging applications. OpenEXR was created by ILM in 1999 and released to the public in 2003 as an open-source library. * Please explain how this project is aligned with the mission of ASWF? * OpenEXR is one of the foundational technologies in computer imaging, and it remains a standard HDR image format in computer graphics for linear and interactive media. OpenEXR was honored with an Academy Award for Technical Achievement in 2007. * What is the project’s license for code contributions? * OpenEXR is shared under a modified BSD license (http://www.openexr.com/license.html), and its license agreements for individual and corporate code contributions may be found at [http://www.openexr.com/documentation.html](http://www.openexr.com/documentation.html). * What tool or platform is utilized for source control, and what is the location? * OpenEXR uses GitHub for source control, and its repository is currently located at [https://github.com/openexr/openexr](https://github.com/openexr/openexr). * What are the external dependencies of the project, and what are the licenses of those dependencies? * The mandatory dependency of OpenEXR and its license is: * Zlib ([http://zlib.net/zlib_license.html](http://zlib.net/zlib_license.html)) * The optional dependencies of OpenEXR and their licenses are: * Boost ([https://www.boost.org/users/license.html](https://www.boost.org/users/license.html)) * NumPy ([http://www.numpy.org/license.html](http://www.numpy.org/license.html)) * Fltk ([https://www.fltk.org/COPYING.php](https://www.fltk.org/COPYING.php)) * Cg ([http://developer.download.nvidia.com/cg/Cg_2.2/license.pdf](http://developer.download.nvidia.com/cg/Cg_2.2/license.pdf)) * What roles does the project have (e.g. maintainers, committers?) Who are the current core committers of the project, or where can a list of committers be found? * Recent contributors to the OpenEXR project include Cary Phillips, Nick Rasmussen, Kimball Thurston and Nick Porcino, and a complete list of current maintainers can be found at [https://github.com/orgs/openexr/people](https://github.com/orgs/openexr/people). * What mailing lists are currently used by the project? * OpenEXR has three mailing lists: openexr-announce, openexr-user, and openexr-devel. * [https://lists.nongnu.org/mailman/listinfo/openexr-announce](https://lists.nongnu.org/mailman/listinfo/openexr-announce) * [https://lists.nongnu.org/mailman/listinfo/openexr-user](https://lists.nongnu.org/mailman/listinfo/openexr-user) * [https://lists.nongnu.org/mailman/listinfo/openexr-devel](https://lists.nongnu.org/mailman/listinfo/openexr-devel) * What tool or platform is leveraged by the project for issue tracking? * Issue tracking for OpenEXR is handled through its GitHub repository: [https://github.com/openexr/openexr](https://github.com/openexr/openexr) * Does the project have a Core Infrastructure Initiative security best practices badge? Do you foresee any challenges obtaining one? * OpenEXR does not yet have a CII badge, but it should be straightforward for it to meet the criteria of this program in the future. * What is the project’s website? Is there a wiki? * The website for OpenEXR is [http://www.openexr.com](http://www.openexr.com), and there is no official wiki. * What social media accounts are used by the project? * OpenEXR does not have any official social media accounts. * What is the project’s release methodology and cadence? * New releases of OpenEXR are organized on an as-needed basis, and do not currently follow a regular cadence. * Are any trademarks, registered or unregistered, leveraged by the project? Have any trademark registrations been filed by the project or any third party anywhere in the world? * OpenEXR is an unregistered trademark of Lucasfilm Ltd. # Incubation Stage Requirements The following are the entry requirements for an Incubation stage project of the ASWF, which we believe are currently met by the OpenEXR project: * Submit a completed Project Contribution Proposal Template to the TAC, or the TAC’s designated recipient for contribution proposals. * Provide such additional information as the TAC may reasonably request. * Be available to present to the TAC with respect to the project’s proposal and inclusion in ASWF. Project teams should be prepared to present a detailed (20-30 minutes in length) overview on the project in addition to speaking to the information contained in the project contribution proposal. * Be deemed by the TAC to add value to the mission of ASWF. * Have a technical charter that provides for inbound and outbound licensing of code under an OSI-approved license approved by the Governing Board of ASWF for projects. The ASWF maintains a template for projects to use. * Agree to transfer any relevant trademarks to an LF entity to hold for the project. In the case of projects with established trademarks where a trademark transfer is commercially difficult, we generally recommend the project use a new name upon incubation. # Adopted Stage Requirements The following are the entry requirements for an Adopted stage project of the ASWF, along with the status of OpenEXR with respect to these goals: * Demonstrate having a healthy number of committers from a diverse contributor base. A committer is defined in the technical charter but is often used to describe the core contributors who can accept contributions to the project, or a portion thereof. * The OpenEXR project on GitHub currently has 39 contributors, including significant contributions from Lucasfilm, DreamWorks Animation, and Weta Digital, and we expect the number of contributing individuals and companies to increase under the ASWF. * Have achieved and maintained a Core Infrastructure Initiative Best Practices Badge. * Not yet * Demonstrate a substantial ongoing flow of commits and merged contributions. * The OpenEXR project on GitHub has 1,279 commits over its lifetime, and we expect the rate of new commits to increase once the project is under the ASWF. * Document current project owners and current and emeritus committers in a COMMITTER file or similarly visible system. A copy of the project’s charter (or other authorized governance document) will be included or linked to in visible location. * Not yet * Have a technical lead appointed for representation of the project to the TAC. * Not yet * Have a completed and presented to the TAC an initial license scan of the project’s codebase. * Not yet # Additional Discussion Topics ## Near-Term Development Roadmap * Robust builds, installation, and tests on all platforms, using the CMake build infrastructure. Builds should be warning-free on all modern compilers. * Automated building and testing of new pull requests using one or more CI solutions (e.g. CircleCI, Azure Pipelines, Travis, Appveyor, Jenkins). * Evaluating and merging existing pull requests from the community (23 open pull requests). * Evaluating and addressing existing issues from the community (122 open issues). * Establishing guidance for reporting new security issues (e.g. a private channel). * Discuss moving IlmBase into its own Git submodule. * Discuss creating a lightweight, shared library for vector/matrix functionality. ## Community Discussion at SIGGRAPH 2018 The following additional ideas were suggested by the OpenEXR community at the Birds of a Feather event at SIGGRAPH 2018: * Simple and fast write path (along the lines of TinyEXR) * Integer image support (reducing the need for TIFF) * Standalone LibHalf library (and reconciliation with CUDA half type) * GPU decompression for performance (potentially supporting only a subset of formats) * Metadata standardization ## Technical Steering Committee The initial members of the Technical Steering Committee for OpenEXR will be Larry Gritz (SPI), Rod Bogart (Epic), Peter Hillman (Weta), and Jonathan Stone (Lucasfilm). In addition, we believe it would be valuable to nominate a small set of core committers, including recent contributors to OpenEXR, who would have push access to the new repository. openexr-2.5.7/ASWF/tsc-meetings/000077500000000000000000000000001406177042200163525ustar00rootroot00000000000000openexr-2.5.7/ASWF/tsc-meetings/2019-05-02.md000066400000000000000000000037441406177042200177400ustar00rootroot00000000000000# 5/2/2019 ### Attending: * John Mertic * Cary Phillips * Rod Bogart * Peter Hillman * Larry Gritz * Daniel Heckenberg ### Personal introductions: * John Mertic: Linux Foundation - Director of Program Management. Help getting project up and going, helping with issues and concerns. * Peter Hillman: Weta, worked on OpenEXR deep stuff. * Cary Phillips: ILM R&D Supervisor, miscellaneous contributions to IlmBase. * Larry Gritz: Sony Pictures Imageworks, experience as a user of OpenEXR, lead for OpenImageIO (the major client of OpenEXR, sits between the library and most users). * Rod Bogart: One of the originators with Florian Kainz and Drew Hess. Involvement has been on and off, mostly off lately. Vice chair of the Academy’s ACES project. * Daniel Heckenberg: ASWF TAC chair. ### Discussion: * John: We are the Technical Steering Committee: * Set direction, features, roadmap. * Issues, questions, * Serves the community, not necessarily an overlord. * Has the help of the TAC * Need to set up a TSC subdirectory in the github repo, to hold meeting notes, etc. * There are three github repos: - Openexr - Openexr-website - Openexr-images (big test images, nice to not pollute the main repo with them) * Other contributors: - Kimball Thurston - Weta - Nick Rasmussen - ILM - Nick Porcino - Occulus, formerly ILM - Jonathan Stone - Lucasfilm/MaterialX * ASWF member organization have obligation to contribute to projects. * Larry: OCIO has a separate role for TSC chair. We can be creative with how we divide the roles. Few things come to formal votes. * Cary elected TSC chair * Action items: - Set up aswf.io mailing lists; send message asking recipients to sign up over there; this lets us know who the community is. - Set up private TSC alias. - Move github repo to ASWF (contents will be unchanged, address will not change) - John: contact Steve Winslow about code scanning, make sure license compliance in order. - Cary: Add permissions to github repos openexr-2.5.7/ASWF/tsc-meetings/2019-05-09.md000066400000000000000000000031201406177042200177330ustar00rootroot00000000000000 # 5/9/2019 ### Agenda: * How many mailing lists? What do to with old messages? * Jira for TSC task tracking? * CII badge form todo’s * TSC membership - who else? * Website management ### Attending: * Cary Phillips * Larry Gritz * Peter Hillman * John Mertic ### Discusion: We discussed mail aliases and settled on a single alias, [openexr-dev@lists.aswf.io](mailto:openexr-dev@lists.aswf.io). Cary will send a message to the old aliases requesting that people sign up for the new one. After a grace period, we’ll import the old list history into the new list and then disable the old lists altogether. That’s better than importing this history right away, which might fail to capture discussion that happens between now and the transitions. We can use hashtag to limit the discussion and help filter discussions by topic. We briefly discussed Jira - there is an OpenEXR Jira board at [https://jira.aswf.io/secure/Dashboard.jspa](https://jira.aswf.io/secure/Dashboard.jspa). But we decided to keep things informal for now and rely on GitHub Issues to track todo items, and adopt Jira only if a need emerges. We agreed to look at OpenColorIO as a template for processes, and the process documentation in particular, for code formatting style guide, code review process, etc. Beyond administrative issues like the web site and the CII Best Practices Badge checklist, we discussed diving straight into more substantive issues like the future of IlmBase - separate repo vs. keeping it as a subproject, as well as cleaning up and modernizing the code, adding proper use of consexpr, etc. openexr-2.5.7/ASWF/tsc-meetings/2019-06-13.md000066400000000000000000000100111406177042200177240ustar00rootroot00000000000000 # 6/13/2019 ### Attending: * Cary Phillips - ILM * Larry Gritz - SPI * Rod Bogart - Epic * Peter Hillman - Weta * Kimball Thurston - Weta * Nick Porcino - Oculus * Christina Tempelaar-Lietz - Epic * John Mertic - Linux Foundation ### Discussion: * Welcome new TSC members: * Nick Porcino - Oculus * Christina Tempelaar-Lietz - Epic * Kimball Thurston - Weta * Piotr was invited by hasn’t responded. * Project goals by SIGGRAPH: * Reach “adopted” status, seems attainable. * CII badge progress is at 68% * Need CI setup * Need static/dynamic analysis setup * Need to address security issues/policies * Put out a new release, version 2.4: * Address outstanding CVE’s * Document existing CVE’s * Compiler warnings * CMake fixes * Acknowledge most Issues and PRs; many can be closed as is. * Proposal/position on the future of Imath; go into the BOF prepared to discuss. * “Guide to the OpenEXR Project” * GOVERNANCE.md, CONTRIBUTING.md, etc. * Clarify project roles and clarify terminology: * Committer vs. TSC * Nick Rasmussen is an example of a committer not on the TSC. * Need to clarify terms of service, how long do TSC members serve. * OCIO meeting notes designate a PR Reviewer? * Ad-hoc for that project to ensure fast turn around due to large number of contributions * May want some form of this to ensure that PRs are reviewed * Legal: * Who keeps track of CLA’s on file? * Should just be part of the process (CLA, DCO checks) * Old PRs, what to do about obtaining CLAs prior to merge * Need to check w/ ILM legal just to clarify old copyright / CLA * Does OCIO have a policy of accepting small fixes without a CLA? No, that’s OIIO. All ASWF/Linux Foundation projects require CLA’s for every PR, no matter how small. * CII Badge requires “acknowledgment of bug reports”. What should our policy be? * Standard use of GitHub labels, documented in CONTRIBUTING. * Use of GitHub Milestones to indicate priority. * Status of the CII Best Practices Badge: * Must ensure timely response to posts on openexr-dev * What does it take to ensure that the website now uses https? * Security: * security@openexr.com, info@openexr.com * John to arrange setting up the forwards to private tsc * Outstanding CVE’s: * One has a PR that needs to be merged. * Other CVE issues have been resolved but the issues were never closed. * CVE’s should be documented in CHANGES.md. * OpenEXR needs a designated security expert * Cryptographic protocols are not applicable. * Ready to set up Azure? * Compiler Warning flags * -Wall with GCC 7/C++17 on Ubuntu gives a handful of warnings, straightforward to fix. * What about Windows? * Code coverage, static analysis, dynamic analysis: SonarCloud? * Just needs to have been done at least prior to release (as opposed to fully integrated to release schedule) * Test policy adherence? * Should we update source code copyright notices? * Cary will check with Lucasfilm Business Affairs. * What’s the status of moving the github repository? * TODO’s and action items: * Label issues and PR’s * Gives perception of response * Use milestones instead to mark issues for including in next release * Need to be more aggressive with closing issues that had a back and forth resulting in a consensus there’s nothing to do * Standard comment about a house-cleaning event in migration to ASWF * Merge/act on existing PR’s * Fix compiler warnings * SonarCloud: Static and dynamic analysis * Azure * Web site/documentation * JM: Can be moved independently, whenever ready * CP: wants to re-do web site to make it easier to maintain * Email addresses for info & security * Imath white paper * Christina - will work on SonarCloud * Kimball - will work on PRs, cmake, compile warnings * Nick - will review PRs as well openexr-2.5.7/ASWF/tsc-meetings/2019-06-20.md000066400000000000000000000026341406177042200177360ustar00rootroot00000000000000# 6/20/2019 ### Agenda: * Update on SonarCloud? * Document CVE’s * C++ 98? * Strategy on standalone Imath * Review outstanding PR’s, via Kimball’s [PR spreadsheet](https://docs.google.com/spreadsheets/d/1dwgWs5GWur-BJkYf4J3ChbjMfb5ZlVn7q1QHq9XmB2Y/edit?ts=5d0409a9#gid=0) ### Attending: * Cary Phillips * Larry Gritz * Peter Hillman * Nick Porcino * Rod Bogart * Don Dempsey (public) ### Discussion: * Christina has started investigating SonarCloud, nothing to report yet. * Documentation of CVE’s. The CII Best Practices badge says all publicly filed CVE’s must be noted in the release notes. Rod to investigate, including the process for updating information at cve.mitre.org. * C++ compatibility: is there a need to still maintain support for C++98? With the VFX reference platform at C++11, can any software reasonably claim to need new releases of OpenEXR to compile with pre-C++11? Probably not, but worth confirming with the community, and with the TAC. * TSC members should act on commenting on and closings PR's as noted in the spreadsheet. * Assigned #401 and #378 to Peter, to investigate. * Standalone Imath: Needs further discussion with the TAC, and a concrete proposal, potentially a straw/trial repo that folks can comment on. Needs to be unencumbered by dependencies like Iex, and by exceptions in general, or with the current on-the-fly code generation of eLut and toFloat. openexr-2.5.7/ASWF/tsc-meetings/2019-06-27.md000066400000000000000000000050041406177042200177370ustar00rootroot00000000000000# 6/27/2019 ### Agenda: * Clarify the process for approving and merging PR’s * Release plan: Code freeze Friday, July 12? * SIGGRAPH BOF agenda * Update on SonarCloud * Azure rollout * Standalone Imath * Review outstanding PR’s, via Kimball’s [PR spreadsheet](https://docs.google.com/spreadsheets/d/1dwgWs5GWur-BJkYf4J3ChbjMfb5ZlVn7q1QHq9XmB2Y/edit?ts=5d0409a9#gid=0) ### Attending: * Cary Phillips * Larry Gritz * Rod Bogart * Peter Hillman * Kimball Thurston * John Mertic * Nick Porcino * Christina Tempelaar-Lietz ### Discussion: * Siggraph BOF plan: should we release before? * July 13-14 should be deadline for release, if we do that (we will shoot for that) * Need to check tarball versus git clone/build * Documentation needs to be updated to ensure simple “I want OpenEXR” will just work * Windows has most of the issues from users trying * Various README files need to be clear to build lmBase separately from OpenEXR * Can we deprecate autoconf, and just confirm that cmake works? Needs effort on each platform to check cmake is working * Let’s delay the split of IlmBase * To proceed for release (release number TBD): * Get cmake in place * Get docs update * Deal with outstanding CVEs * Need to close out discussion/issue on any outstanding vulnerability * Need to close out discussion/issue on any outstanding vulnerability * * Kimball has been looking at CVEs: pointer math can overflow int32 * Pull request needs process to merge. Person who submitted can do the merge if they have permission. * Submit PR * Somewhen says it looks OK by “Approve” * Submitter should then perform the Merge * Issues have been tagged “Needs Info”, we will wait a week or so, then close them out if we hear nothing * Issues have been tagged “To Do”, those are ready to finish, and we should enlist others to help fix them * Suggestion: Jonathan Stone might be able to help with Windows cmake issues * Looking thru issues in spreadsheet * Issue238 appears to be fixed already * Issue232 is need work * Issue351 may be fixed, but Kimball will confirm * 344 - RGB will try to reach out to Karl Rasche (LinkInd msg sent) * 251 - Punt for now * 338 - will check if new release builds on FreeBSD * 334 - Windows can still have this problem * Christina testing (file gets generated empty somehow) * Need change to check the log header files into the repo. Should add unit test to rebuild and compare, but not do build of file during build. * Will remove issues that refer to old software (ie 281) openexr-2.5.7/ASWF/tsc-meetings/2019-07-11.md000066400000000000000000000036401406177042200177350ustar00rootroot00000000000000# 7/11/2019 ### Agenda: * Azure progress * SonarCloud progress * CMake refactor: * Does it addresses the open “CMake” Issues? OK to close? * Ready to document? * CVE/bug progress * Google OSS-Fuzz integration? * Release prognosis, how close are we? * Review issues needing attention ### Discussion: * Azure/Sonar Cloud * Underway, Christine is setting up account for her own github for testing. * Need to create accounts for openexr/awsf ultimately * ASWF has accounts to use * CMake progress * Kimball’s got a rewrite up for review * Simpler, removed some options, consolidated into a single file * IlmBase and OpenEXR are their own projects, using find_package as appropriate * Added a root “super project”, it overrides find_package using the current cmake idiom * Added config.cmake files for install automation * We will give it a spin, and Cary will write instructions * Issue backlog * Cary’s polling open issues where it’s unclear if an problem still exists. If the issue author doesn’t respond in a week or so, closing with an invitation to re-open * Out of memory bugs could be addressed by pre-emptively checking too-large image open requests, and capping the maximum image size. * Table allocations could be made on demand, rather than on object construction. See issue 245 * Release gate factors * CMake rewrite * Someone needs to vet the autoconf set up to make sure it’s all still functional * Security vulnerabilities are the top priority for the next release * We can announce an upcoming release at Siggraph, rather than rushing to get a release done * Google Autofuzz * Clang tidy - consensus: thumbs up * CMake option, OFF by default * Sonar - consensus: thumbs up * Autofuzz - consensus: decline on the grounds that we take security seriously and have invested in a fuzz test that we’d prefer to keep investing in. openexr-2.5.7/ASWF/tsc-meetings/2019-07-18.md000066400000000000000000000103261406177042200177430ustar00rootroot00000000000000# 7/17/2019 ### Attending: * Cary Phillips * Peter Hillman * Kimball Thurston * John Mertic * Christina Tempelaar-Lietz ### Agenda: * Repo move * License scan * Cmake/autoconf progress * Azure+Sonar rollout * SIGGRAPH BoF prep * Issues needing attention ### Discussion: * Why is GitHub repo name so long? * John has no idea, would prefer shorter as well * Is alias possible? * Repo move * John - issues to consider: * Ideal to have new CLA in place before repo move, in the works * Have all of your organization sign the CCLA * Make sure license scan, big critical issues are taking care of first. * Clean up any proprietary notices. * So perhaps we will wait * License scan * Cary has made progress on reviewing the full scan. * Some licenses from Pixar, shouldn’t be an issue to get Pixar to change license or board to buy off on it * Other things don’t have a license, can we add a license? * John - good to know how those contributions came in. * Most is from ILM. * Display driver renderman, ILM * Photoshop plugin Piotr * New git makefiles - question for Nick * Need more information about what these things are, whether we still need it, the history. * Should we replace with spdx identifier. * ONLY an ILM employee should do this, modify ILM related license text. * Patent on compressions code from Dreamworks? * By comparison, Apache license has a mechanism for handling issues with patent related issues . * There may be ambiguities downstream because license language is non-standard. * Autoconf scripts come with a GNU license, very permissive license. * How much longer do we want to support autoconf? Until we are certain CMake setup is robust. * Lots of CMake files with no license information in them. * “Copyright: OpenEXR project with its contributors” <- specific language is in the CONTRIBUTING.md with the instructions for the copyright line. * Cmake/autoconf progress * Kimball closed many build-related issues. * Kimball can’t test Windows - needs confirmation that the auto package config works. (some cmake projects have custom package configs for Windows but this may have come from before the auto config existed). * Xcode generator doesn’t work - bug in CMake * Are we going to continue using mkdist to make the tarballs? Cary wants to poll the community. * Cary tried to fix the PyIlmBase autoconf setup. Fails because can’t run test program, Cary has a potential fix. * Christina to read over the INSTALL instructions. * Should mention external dependencies and how to override them. e.g.Zlib, Boost, Python. * Verify in INSTALL instructions that each variable is annotated with descriptive text. * Target end of week. * Azure+Sonar rollout * Christina to look into whether we should make use of ctest options for publishing test results. There is a placeholder for publishing test results, but the test step doesn’t generate the requisite ctest xml output files yet.. * Christina will work on making Azure pipeline work with the new CMake setup. * Windows and mac jobs not working yet, in progress. * Christina also needs to add IlmFuzzTest as a scheduled job. * SIGGRAPH BoF prep * Present what we are thinking and solicit feedback. * Kimball can put together some slides based on recent and proposed code changes. * Cary has a google doc in progress to use at the BoF. * Warn people that next version will be a 3.x, change the ABI. * Warn about potentially changing the API as well (no API changes yet). * Imath changes. So people are aware they may have to change some code. * Other * Discussing remaining CVE, issues.. * Issue 232 - Kimball has pending PR but only a partial fix. Has a more complete fix planned for integer overflow issue. * PR 451 - Peter Hillman fixed but would be good to have another person review. * Issue 344 / PR 445 - Huffman encoding based on tile size - make it optional, off by default. CMake flag to enable better performance? Roll it out with OpenEXR 3 release. * PR 414 - assigned to Kimball, replaces PR 401. * Lots of older PRs related to CMake, Kimball has put comments to try new CMake. If no response, will close them. openexr-2.5.7/ASWF/tsc-meetings/2019-07-25.md000066400000000000000000000041751406177042200177460ustar00rootroot00000000000000# 7/25/2019 ### Attending: * Cary Phillips * Peter Hillman * Kimball Thurston * Larry Gritz * Christina Tempelaar-Lietz * Rod Bogart * Emily Olin ### Agenda * Prep for SIGGRAPH BoF. Draft of slides is here: https://docs.google.com/presentation/d/1mxzp6jn2zuHAyahzwhocwRTpoenNqO-LEvPUvS7gDww/edit?usp=sharing * Prep for 2.4 release. ### Discussion * When the repo moves to the ASWF organization, we'll make it "OpenEXR". Capitalization isn't consistent across ASWF projects, but we prefer it this over "openexr". * SIGGRAPH BoF prep: * Preable about the ASWF and recent progress should be brief; most time should be reserved for the discussion. And the topics should be presented as "community issues", raised by the community for discussion within the community, facilitated by the TSC. These are not plans to be executed by the TSC, the TSC is merely a gatekeeper. * Imath proposal: * Half should have #define/#ifdef so that when included with CUDA half.h, the first one wins. * Peter's part ordering standard/documentation should be a proposal to go into a 3.0 release. * The need for a "tiny" EXR implementation? Because there are numerous divergent ones out there; rumored examples at Apple, Intel, and a part of ffmpeg, instigated by several factors: 1. People building OpenEXR get to the b44 log table build stage and say, WTF?!? 2. There is no option to build the library without exceptions, a deal-breaker for platforms/compilers that don't support exceptions, and a turn-off for many others. 3. You need a PhD in CMake to get it to build. 4. For many people, the write-it-yourself threshold is quite low. * There are people who choose not to use the library. We should listen to them, even if they're not in the VFX industry. OpenEXR is widely used; we have an obligation to be stewards outside of just the film industry. * Release prep: * Windows build is not quite working. There are still problems with boost. * Windows tests are failing. * Issues: * #445 should not go into 2.4. It needs a more thorough analysis, and wider testing. openexr-2.5.7/ASWF/tsc-meetings/2019-08-08.md000066400000000000000000000064311406177042200177450ustar00rootroot00000000000000# 8/8/2019 ### Attending: * Cary Phillips * Kimball Thurston * Nick Porcino * Christina Tempelaar-Leitz * Joseph Goldstone * Arkell Rasiah * Robert Pancoast ### Agenda: * 2.3.1 release * Windows build? * Confirm the proper so version? * Mitre.org’s CVE posting * When to create a beta tag? * ASWF project adoption * CII badge progress is 95% * Security questions (-x option a solution for memory consumption?) * Dynamic analysis * Status of CLA signage * SIGGRAPH BoF followup * How to turn the discussion into a “roadmap” * Proposed new features/initiatives: * Stateless read * Part ordering * Published compression standards * Streaming performance * 32-bit compression * Integer images * Bfloat16 * In-place metadata edit * Next up: * Repo move * Imath repo * C++11 * pybind11 * Clang-tidy * SonarCloud “bugs” * Test coverage * Website refresh ### Discussion: * Looks like Arkell and Joseph have independently written a utility for reading exr headers into a stringstream for in-memory manipulation of metadata. They should work on resolving and submit it to include in the library. * Joseph: No order is imposed on metadata; metadata is stored as a map, it needs a lexical ordering. * The “image” metadata field is a MD5 checksum on the image. Kimball: I tend to strip out checksums because it’s almost immediately invalid. Joseph: should it be dropped entirely? Piz compression generates different byte streams when compression tables have multiple unique entries because the sort isn’t stable, which yields different checksums for identical images. Arkell has a fix, he’ll submit it. * SMPTE 2065-4 doesn’t standardize all of OpenEXR, it’s just a subset. ACES only took the minimum items that were necessary; it doesn’t include multi-part or deep. Does anyone care? The only reason you’d care is if you want the ACES logo on your project to certify that it handles EXR’s. But SMPTE doesn’t accept code as the definition of a standard, it would require explicit documentation, which would be a lot of work, and would then lock in that specification as the standard that the code would have to abide by. * Joseph: Is there a potential connection to the mention of a “tinyexr”? Should that be the ACES container file but that you’re free to use? Kimball: the “tiny” of the notion of “tinyexr” refers to the size and magnitude of the source code of the library, not the supported contents of the file. Conclusion: When/if there is consideration of a stream-lined exr library, we should at least discuss the SMPTE standards issue. * Conclusion: if this is a priority for someone, or someone puts forth a compelling argument for standardization, then someone would need to step up and pursue SMPTE standardization. * The 2.3.1 release is ABI-compatible, so won’t need to update so version. * Christina will leave some comments on Robert’s PR related to the Windows build in the Azure pipeline. * We should consider a target that runs valgrind on the unit tests. Can add a prefix command, then run w/valgrind in front of it. * Robert: MSbuild has a command-line switch to run “code analysis,” it should be built into Azure. openexr-2.5.7/ASWF/tsc-meetings/2019-08-16.md000066400000000000000000000023241406177042200177410ustar00rootroot00000000000000# 8/16/2019 ### Attendees: * Joseph Goldstone * Larry Gritz * Nick Porcino * Christina Tempelaar-Lietz * Kimball Thurston ### Agenda: * Release 2.4.0 * Other items ### Discussion * Release 2.4.0 * Waiting to branch until we have all 3 platforms (mostly) running in Azure. * Christina will be re-enabling the windows builds this weekend, others to help resolve issues * Nick also to separately test on local test setups to evaluate python2 and 3 under windows at the same time * Other items: * Brief discussion about whether we need to discuss any future things: * mostly focused on getting patch release out * What are the ideas? Joseph was wondering if there is already a list (we should publicize that) * mentioned the pending discussion of Imath * also mentioned ph's metadata group thing * this triggered jgoldstone to ask for reviewers for the ACES container, it is up for 5 year renewal, want to refresh metadata list * larger database of metadata vs definition * Can we refresh the test content? (i.e. get some scenes with more HDR than the existing set, etc.) * Nick wondering what about other exr viewers, and about CTL status in viewers openexr-2.5.7/ASWF/tsc-meetings/2019-08-22.md000066400000000000000000000036211406177042200177370ustar00rootroot00000000000000# 8/22/2019 ### Attendees: * Rod Bogart * Joseph Goldstone * Larry Gritz * Cary Phillips * Nick Porcino * Christina Tempelaar-Lietz * Kimball Thurston ### Agenda: * Release 2.4.0 * Other items ### Discussion * Windows builds are running, but tests are failing. * Windows test failure appears to be a “device timeout” in IlmImfTest, not sure how to proceed. Might be an Azure job setting? * Release version should be named v2.4.0-beta.1 * What to do with PR #502? Alignment issue, but it’s only in the test suite. Probably ok. * Need to update release notes with recent commits. Kimball suggests the GitHub project git-chglog. * Still need a security expert. Kimball suggests Dan Hutchinson at Foundry, who was a security expert in the past. * Florian is enthusiastic about contributing new test images. Need to decide what we need to show off. Florian suggests carefully calibrated images to show what a properly exposed image is. * Rod noted that ACES has reference images. * Another application for these images: calibration. Need reference for monitor calibration. * Joseph: an image that can help answer the question, “Does this look right?” image. Joseph described a past project that involved $100 at Safeway: Pepto Bismol pink, etc. Everyone knows what those colors are. * Also need images for a performance suite. * Also need relevant survey of metadata. * We need a document that says what stuff is called, conventions. * Outstanding issue: PR #531, the DreamWorks Lossy Compression license. Is the change sufficience? It's a dual license: pick which license the user wants to use. * Joseph: Half as a separate library? Support in GCC and Clang for 16-bit float? Would there be a performance gain to use standard? Yes. But Half does very specific rounding. With float16 you can do different rounding. Could use operators to make Half and float16 look the same. openexr-2.5.7/ASWF/tsc-meetings/2019-08-29.md000066400000000000000000000033531406177042200177500ustar00rootroot00000000000000# 8/29/2019 ### Attendees: * Cary Phillips * Christina Tempelaar-Lietz * John Mertic * Kimball Thurston * Peter Hillman ### Agenda: * Release 2.4.0 ### Discussion * Cary still has a problem building PyIlmBase on his mac, but it's most likely a local problem with the installation of boost::python. * The documentation should reference the Azure build scripts as a working example manifestation of the proper sequence of steps for installing and building. * The CHANGES.md file lists a summary of changed, followed by a listing of all commits, PR's, and Issues. Is this necessary? Only the summary will appear on the Releases page. Who cares if the CHANGES.md file is verbose; sure, you can query this information directly via the GitHub page, but it still seems convenient to list everything out, and at the very least, it's not hurting anyone. * Decision was made to turn off floating-point exception handling by default; it doesn't work at all under FreeBSD, because signals happen asynchronously. * All tests should pass on Azure now, although the Azure windows build does not yet include PyIlmBase because of boost issues. * No one on the board voiced concerns about the DWA Lossy Compression license changes. When Steve Winslow returns, he will re-run the license scan, and then John will put a new exception request to the board. * The release can proceed independently of the license issues. * CII Best Practices badge progress is at 95%. * Dan Hutchinson from Foundry responded with security/CVE guidance, need to schedule a follow-up discussion, when he's available. * Kimball will look into adding an option to run the test under valgrind. The CII badge suggests dynamic analysis; this should suffice for that. openexr-2.5.7/ASWF/tsc-meetings/2019-09-05.md000066400000000000000000000023221406177042200177360ustar00rootroot00000000000000# 9/5/2019 ### Attendees: * Cary Phillips * Christina Tempelaar-Lietz * Kimball Thurston * Peter Hillman * Joseph Goldstone ### Discussion * Ready to tag the 2.4 beta release, as soon as the current PR’s are approved and merged. * After the tag, it’s open season on merging in other changes. * Still waiting on Lucasfilm business affairs to set up easyCLA; can’t move the repo to the ASWF organization until that’s done. * After the repo move, split Imath into a separate repo. Should we split sooner or later? Nobody feels strongly. What’s the best way to preserve the history? Duplicate the repo entirely, which will carry the Imath history with it, then delete all OpenEXR from the new repo, and Imath from the OpenEXR repo. * Are there any issues with binary metadata? J Schulte wants to know. No, probably not. * Issue #548: will revisit this when attempting to rectify Half w/CUDA, although the ship has probably sailed with implicit/explicit conversion between Half and float/double, we’d rather not break existing application code. * Issue #452 - Peter fixed it, it was an alignment issue. * Issue #453 and #454, test failures: should ping again. * Issue #506 - Ask Robert to help. openexr-2.5.7/ASWF/tsc-meetings/2019-09-12.md000066400000000000000000000007271406177042200177430ustar00rootroot00000000000000# 9/12/2019 ### Attendees: * Cary Phillips * Christina Tempelaar-Lietz * Rod Bogart * Kimball Thurston * Peter Hillman * Arkell Rasiah * Joseph Goldstone ### Discussion * Release v2.4.0-beta.1 is out * Arkell asks about EasyCLA * SonarCloud bugs: - Random - Boost::python + Use python buffers, will need a numpy module for backwards compatibility - Constructors - Coverage * CVE’s * Openexr-images repo - move to ASWF * Arkell: abx 512, CUDA openexr-2.5.7/ASWF/tsc-meetings/2019-09-17.md000066400000000000000000000026451406177042200177510ustar00rootroot00000000000000# 9/17/2019 ### Attendees: * Cary Phillips * Christina Tempelaar-Lietz * Rod Bogart * Kimball Thurston * Peter Hillman * Joseph Goldstone ### Discussion * Beta v2.4.0-beta.1 is ready for official release. * Next up: * finish off the CII best practices badge. * fix sonar bugs * request updates to mitre.org CVE entries. * Still waiting on Lucasfilm Business Affairs to configure EasyCLA; repo move is blocked until that happens. * Start port of PyImath to pybind11, which is going to be a lot of work. * clang-format (not to be confused with clang-tidy, which is different) - Larry has a setup on OIIO that runs clang-format on PR, rejects if the formatting is off but also posts a diff, so the submitter can get the formatting right even if they don't have clang installed. * CVE's: * CVE-2016-4629 and CVE-2016-4629 were fixed by Apple in the OS. * CVE-2006-2277 - the link on the mitre.org page is broken, but the offending .exr is available on the internet archive wayback machine here: https://web.archive.org/web/20060520062054/http://w148.de/~cmertes/nachbarhaus1.exr * Christina gives an overview of SonarCloud set-up. Read the YAML documentation here: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema * Joseph: We should reach out to distro packagers and request/encourage/help them to update to the new release. openexr-2.5.7/ASWF/tsc-meetings/2019-09-19.md000066400000000000000000000026451406177042200177530ustar00rootroot00000000000000# 9/19/2019 ### Attendees: * Cary Phillips * Christina Tempelaar-Lietz * Rod Bogart * Kimball Thurston * Peter Hillman * Joseph Goldstone ### Discussion * Beta v2.4.0-beta.1 is ready for official release. * Next up: * finish off the CII best practices badge. * fix sonar bugs * request updates to mitre.org CVE entries. * Still waiting on Lucasfilm Business Affairs to configure EasyCLA; repo move is blocked until that happens. * Start port of PyImath to pybind11, which is going to be a lot of work. * clang-format (not to be confused with clang-tidy, which is different) - Larry has a setup on OIIO that runs clang-format on PR, rejects if the formatting is off but also posts a diff, so the submitter can get the formatting right even if they don't have clang installed. * CVE's: * CVE-2016-4629 and CVE-2016-4629 were fixed by Apple in the OS. * CVE-2006-2277 - the link on the mitre.org page is broken, but the offending .exr is available on the internet archive wayback machine here: https://web.archive.org/web/20060520062054/http://w148.de/~cmertes/nachbarhaus1.exr * Christina gives an overview of SonarCloud set-up. Read the YAML documentation here: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema * Joseph: We should reach out to distro packagers and request/encourage/help them to update to the new release. openexr-2.5.7/ASWF/tsc-meetings/2019-09-26.md000066400000000000000000000063301406177042200177440ustar00rootroot00000000000000# 9/26/2019 ### Agenda: * Dan Hutchinson (Foundry, security expert) - What should we know? We don’t know what we don’t know. - CVE’s on mitre.org - Allocating huge memory: -x option? * Tarball signing * VFX reference platform says 2.3.x ?!? * Distro packages * SonarCloud has failed on last 2 PRS’s * Mission Statement * Reference images ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Kimball Thurston * Joseph Goldstone * Peter Hillman * Doug Walker * Dan Hutchinson * Carol Payne * Daniel Heckenberg ### Discussion: * Dan Hutchinson joined from Foundry to discuss security. * There’s a healthy security research community, likes to look at popular libraries and does research to find vulnerabilities. They’re quite enthusiastic. * Projects need a security policy, and should announce a solicitation to the community to report vulnerabilities. Some projects post a PGP key with which to encrypt vulnerability reports. * Projects should have a Responsible Disclosure Policy - given 60 days to respond. * There’s a huge chasm between a bug and an exploit, a way of turning the bug into an actionable way of gaining access to a system. It’s legitimate for projects to ask, “Do you have an exploit available?” * Projects need static and dynamic analyzers. OpenEXR uses Sonar. SonarCube is a report aggregator. It can subsume valgrind reports. * How concerned should we be about security? Put yourself in the shoes of a hacker: file formats are a common attack vector. * Dan: OpenEXR is being proactive already;IlmImfFuzzTest is “awesome”. * Dan: Fewer than 10 CVE’s in 10 years is a pretty good record for a file format. * Dan: From what you’ve said, OpenEXR has ticked all the security boxes. * There are issues with how the library is used: the API says pass in a buffer of size X and application passes in buffer of size X-1, and we overwrite. Is that our problem? Not really. * Some of the complaints were that the library could allocate all the machine’s memory, then something else would crash, leading to a DoS. DoS attacks are common, but not the worst vulnerability. * An image can be large but compress well, so a small file can lead to large memory allocation. * Tiff has a comparable attribute structure: is there anything we can learn from them? * Is there a plan to provide binary packages hosted in nexus? Not yet. * Should use common hardening C++ flags. * Is it worth providing GPG signatures? It prevents against someone someone inserting something into the repo, and man-in-the-middle attacks.. * Should enable 2-factor authentication on GitHub accounts. * Would hope that package maintainers would be proactive, but many of them probably include OpenEXR only because it’s a dependency of something else which might not have changed.. * Reference images: it would be helpful to have a set of images for use with a performance test suite, and that exhibit a range of features of the library and format, such as multiple AOV’s, etc. https://github.com/openexr/openexr-images needs some curating. * TAC meeting yesterday - Michael Johnson mentioned that Apple is sitting on some security-related issues, will work on getting them approved. openexr-2.5.7/ASWF/tsc-meetings/2019-10-03.md000066400000000000000000000031701406177042200177260ustar00rootroot00000000000000# 10/03/2019 ### Attending: * Cary Phillips * Rod Bogart * Larry Gritz * Peter Hillman * Kimball Thurston * Nick Porcino * Joseph Goldstone * Carol Payne ### Discussion * Discussion of the project mission statement. * The mission statement should give some bar for how to proceed in the future. Our philosophy: “Keep it simple.” However, the library as it is is not simple. * Are we the keepers of best practices? * Keep format modern and relevant. An example issue: Should we support integer data? * “Provide a specification and reference implementation of the motion picture industry's preferred image file format for high dynamic range linear scene-referred image data.” * Should focus on “Content Creation” * Openexr-images repo, reference images. Used by OIIO as test images. * Rather than storing a bunch of 4k images, better to provide a program that generates the images on the fly. * Start with a reasonable image, then add noise to it, see how compression works. * Foundry just advertised increases in OpenEXR speed, they obviously take performance seriously. * Nick: whenever I export an image from photoshop, I wonder if the gamut has changed, etc. * How quantify is the image of the expect quality? * What is the quality of my image? Tests. * Should the library include utilities/operators/techniques that check the quality of an image? * We are now in a different eco system now from when OpenEXR was first written. We can refer to the existence of tools and techniques that didn’t exist. * Before submitting for project adoption, we need to address outstanding SonarCloud bugs. openexr-2.5.7/ASWF/tsc-meetings/2019-10-17.md000066400000000000000000000042201406177042200177300ustar00rootroot00000000000000# 10/17/2019 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Kimball Thurston * Joseph Goldstone * Peter Hillman * Larry Gritz * John Mertic ### Discussion: * The Azure build has been failing because Christina's macOS fixes haven't yet been merged. Done now. * Should we fix Sonar bugs before project adoption? Other projects haven't. SonarCloud reports "duplicate code blocks"; it's questionable whether it's actually better to eliminate these, especially in the test suite. And SonarCloud "smells" are REALLY picky, and of dubious validity. It sometimes seems like the SonarCloud C++ rules were written by someone who doesn't know C++ very well. * Could we just turn off SonarCloud altogether for the test suite, since it's not shipping code we really care about? Actually, we do care, since it needs to function properly, and it's needed for coverage analysis. * Larry: I've uncovered a problem in the deep data handling that appears to be offset integer math overflow with large images, i.e. 16k x 16k images. First noticed the problem in OIIO. Still investigating, will report findings later. * The web site REALLY needs a refresh, but who has the time? The content is OK, but the organization isn't great, and the visual style is outdated. John suggests that the team at the Linux Foundation may be able to help, as long as they have a general outline of content to work with. Kimball also said he has some friends who expressed interest in helping with the web site, will refer them on. * Issue [#583](https://github.com/openexr/openexr/issues/583): ask the poster to propose a fix. * Issue [#581](https://github.com/openexr/openexr/issues/581): Just need to remove ImfMisc.h * Issue [#579](https://github.com/openexr/openexr/issues/579): the TSC has made a decision to move to C++11 and drop support for C++98. * Issue [#573](https://github.com/openexr/openexr/issues/573): ask the poster to propose a fix. * Issue [#571](https://github.com/openexr/openexr/issues/571): Peter is investigating. * Issue [#568](https://github.com/openexr/openexr/issues/568): Kimball wants to do a bit more investigation. openexr-2.5.7/ASWF/tsc-meetings/2019-10-24.md000066400000000000000000000046721406177042200177410ustar00rootroot00000000000000# 10/24/2019 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Kimball Thurston * Joseph Goldstone * Peter Hillman * Nick Porcino * Larry Gritz * John Mertic ### Discussion: Discussion: * ASWF Project Adoption Proposal has been sent to the TAC. Next steps: wait a few days for comments, then solicit a vote by the TAC, the put the motion to the ASWF board, hopefully within a week. * Once adoption is complete, the next step is to move the repo to the ASWF GitHu organization. * Larry created RB-2.4 branch, in preparation for 2.4 patch releases. He uses this naming scheme for OIIO, etc, seems a reasonable convention to follow. The branch markers are where changes go; release tags (e.g. v2.4.1) are for actual releases, once they're cut. * We'll resolve to discuss at the first TSC meeting of every month whether enough fixes have gone into the patch branch to warrant a patch release. Using the GitHub process, the overhead is low. * We need to configure Azure to run on RB-2.4, upon merge. * Kimball noted that his distro, Arch Linux, has updated to v2.4.0. * Larry reports that he's been integrating 2.4.0 into other projects and it's been going well, build files are working as expected. * Adam Ferrall-Nunge at ILM had a problem with python2_7/imath.so not getting installed by “make install” Let sit for discussion on TAC, will pass it on the private list Should be #ifdef, not $if HAVE_FOO, not strong opinion. * Nick noted inconsistencies between #if HAVE_FOO v. #ifdef HAVE_FOO. By the current practice, we should probably prefer #ifdef over #if. * Discussion of specific issues is recorded in the GitHub Issues: * [#597](https://github.com/openexr/openexr/pull/597) solution is to check in the generated .h's to the repo, with make targets to generate them. * [#595](https://github.com/openexr/openexr/pull/595) [#593](https://github.com/openexr/openexr/pull/593) [#592](https://github.com/openexr/openexr/pull/592) seems to all be a problem with pkg-config files. Kimball to investigate. * [#591](https://github.com/openexr/openexr/pull/591) fix is to strip out C++98 copatibility code, rely solely on C++11 threads. * [#583](https://github.com/openexr/openexr/pull/583) CMake seems to be confused by something in the local boost installation, not sure what to do. * [#581](https://github.com/openexr/openexr/pull/581) Remove IlmMisc.h from distribution. openexr-2.5.7/ASWF/tsc-meetings/2019-11-15.md000066400000000000000000000025511406177042200177340ustar00rootroot00000000000000# 11/15/2019 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Kimball Thurston * Peter Hillman * Nick Porcino * Larry Gritz * Rod Bogart ### Discussion: * Ready to move the repo to https://github.com/AcademySoftwareFoundation * We prefer “OpenEXR” over “openexr”, even though it makes for confusing directory names, given the sub-module called OpenEXR. * But... should we consider doing the IlmBase/Imath repo reorg at the same time? Postpone the port to pybind11 to eliminate boost/boost-python? No consensus arrived at yet. * Cary will follow up with a written proposal to openexr-dev. * Discussed how the repo README.md and openexr.com refer to the ancillary repos, openexr-images in particular. The existence of the image repo should be made clear. * Rod will attempt an alternative layout of the README/website information. * Threading/thread pools: Larry will follow up with SideFX over whether the OpenEXR v2.3.0 threadpool changes adequately address their immediate concerns. * Longer term, Larry will follow up on the thread pool issue across all ASWF projects. * OpenEXR has simple needs, we shouldn’t complicate it. We would pefer not to make OpenEXR depend on TBB. * Larry submitted clang-format build target. No one has tried it out yet. A good time to run a massive reformatting is when the repo reorg happens. openexr-2.5.7/ASWF/tsc-meetings/2019-11-21.md000066400000000000000000000022241406177042200177260ustar00rootroot00000000000000# 11/21/2019 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Peter Hillman * Nick Porcino * Larry Gritz ### Discussion: * The repo has moved. All seems to have gone smoothly. * Looks like azure pipeline needs to be set up in the new org. PR’s are not currently triggering builds. * Larry asked about GitHub merge policy. “Allow squash merging” has now been turned on. * Imath repo: Let’s begin with a very simple example of pybind11, then add to it gradually. * Nick: We should remove ImathRandom from Imath, and rely on C++11 random. But this will require careful testing. * #484 - the “-x” option to limit memory usage: not worth the complexity. We considered this back when we were questioning how to deal with security vulnerabilities, but none of us feel that this is a necessary feature, or one that adequately addresses a security issue. * #591 - pthread support for mingw: PR needs serious cleanup, not acceptable in its current form. * #215 - uninstall target: good enough idea, but we’d like a “dry run” option. * #344 - new DwaCompressor setting. Should be a part of a performance metric suite. openexr-2.5.7/ASWF/tsc-meetings/2020-01-09.md000066400000000000000000000007601406177042200177260ustar00rootroot00000000000000# 01/09/2020 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Peter Hillman * Larry Gritz * Rod Bogart * Eskil Steenburg * John Mertic ### Discussion: * Christina will investigate Azure job failures. * Peter will confirm is CLA is on file. * Discussed #625, OPENEXR_DLL issue * Eskil raised the issue of conformance test and the need for standard example images; will investigate if openexr-images repo is sufficient. * We proposed moving the meeting time to 1:30pm PST. openexr-2.5.7/ASWF/tsc-meetings/2020-01-16.md000066400000000000000000000025221406177042200177220ustar00rootroot00000000000000# 01/16/2020 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Peter Hillman * Larry Gritz * Rod Bogart * Nick Porcino * Joseph Goldstone ### Discussion: * The time is now 1:30pm PST. * Everyone's been unusually busy with other work, with limited bandwidth. * Christina will follow up on the Azure build failures. * Peter will investigate the Weta CLA. * Regarding Cmake expertise, Joseph expects to learn more in the coming months, and Larry has a general understanding. Nick has a simplified IlmBase CMake setup, 100 lines total. The complication comes from two sources: the sub-projects, and shared settings with the Automake config files. When Imath/Ilmbase moves to another repo/project, this will simplify. But we should also eliminate the sharing of settings with the am files. Parallel settings will be less of a headache. * We need a list of projects to propose for the Google Summer of Code. Larry suggested simple stuff like modernizing the C++ code. * Larry also suggeste a project wiki page for "ideas", a place to maintain a "roadmap" of sorts. * Regarding the goal of developer engagement, we discussed how to recruit new people. It's not especially appealing for projects that require mostly maintenance. Possibly the ASWF Board can encourage Premier member companies to identify available people. openexr-2.5.7/ASWF/tsc-meetings/2020-02-06.md000066400000000000000000000024771406177042200177330ustar00rootroot00000000000000# 02/06/2020 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Peter Hillman * Larry Gritz * Joseph Goldstone * Kimball Thurston * Eskil Steenburg ### Discussion: * The 2.4.1 release should include only essential bug fixes. Defer everything else to the next minor release. * Peter will merge recent fixes into the RB-2.4 branch via cherry picking commits. Kimball will look into any cmake changes. Cary will prepare the release notes. * We'll shoot for making the release Monday or Tuesday of next week. * Cary proposes a new label/milestone scheme. Labels will indicate **what** an issue is (Feature Request, Enhancement, Question, Bug, etc), as well as its **status** (Needs Discussion, Awaiting Feedback, etc). Milestones will indicate **when** an issue is likely to be addressed (Next Patch Release, Next Minor Release, Next Major Release, Backlog, etc). * Briefly discussed #650, Arkell's fix for chromaticity conversion. Joseph agreed to investigate. * Christina will follow up on the Azure build failures and why the SonarCloud runs don't include coverage reports. * Christina reported from the ASWF TAC CI meeting that the ASWF intends to migrate from Azure to GitHub Actions. * Our Google Summer of Code projects ideas are in. Notification of accepted organizations is around Feb 20. openexr-2.5.7/ASWF/tsc-meetings/2020-02-20.md000066400000000000000000000014421406177042200177160ustar00rootroot00000000000000# 02/20/2020 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Peter Hillman * Larry Gritz * Joseph Goldstone * Kimball Thurston * Nick Porcino * Sarah Martin * Arkell Rasiah ### Discussion: * Sarah Martin is a TA at ILM interested in helping update the openexr.com website. Starting with a investigation of pelican as a static site generator. * Google Summer of Code: be prepared for students poking around the project inquiring about things to do. * #591 assigned to Nick to identify the 3-5 lines worth integrating. * #650 IlmAcesFile.cpp: Joseph will follow up with Arkell. * #646 request PR to add quotes in cmake files * #634 Kimball needs to get his CLA straighted out, then will merge PR. * #621 request more information * #639, #648 defer until 3.0 repo split openexr-2.5.7/ASWF/tsc-meetings/2020-02-27.md000066400000000000000000000020501406177042200177210ustar00rootroot00000000000000# 02/27/2020 ### Attending: * Cary Phillips * Peter Hillman * Larry Gritz * Joseph Goldstone * Kimball Thurston * Nick Porcino * Arkell Rasiah ### Discussion: * Google Summer of Code: we've gotten a few inquiries; be on the lookout for more. * Release schedule: 2.5 sometime in the spring; 3.0 around siggraph. * The VES Reference Platform will list OpenEXR 3.0 for 2021. * #673 see #591 * #672 looks good, merged. * #666 looks good, merged. Will go into 2.5 * #639 looks good, merged. * #634 Kimball needs to unwind what he did. * #591 @Lord-Kamina agreed to clean up the PR. * #674 the solution is to remove OpenEXR_Viewers from the cmake build process for the 2.5 release, and then remove it from the repo entirely for the 3.0 release. * 652 brew recipe for openexr may need to be updated? * 648 won't fix. * 646 should be fixed by #672 * 625 the intention was cut down number of Windows user errors, but there's no consensus the right thing to do. * 607 the answer is: don't do in-tree build.; clean up and try again. openexr-2.5.7/ASWF/tsc-meetings/2020-03-05.md000066400000000000000000000017001406177042200177170ustar00rootroot00000000000000# 03/05/2020 ### Attending: * Cary Phillips * Peter Hillman * Larry Gritz * Kimball Thurston * Christina Tempelaar-Lietz * Gary Mandle ### Discussion: * Gary Mandle discussed a research project at Baylor University that involves reducing metameric issues with laser projectors using a 6-color primary system, and he's wondering the best way to store 6-color primary image data in an exr file. The EXR format supports arbitrary channels, although better expert color advice on the project in general can be found at OCIO: https://opencolorio.org. * Per the discussion at this week's ASWF CI workgroup, Christina will start looking into converting from Azure to GitHub Actions. * #681 - Kimball will review. * #591 - Lord-Kamina says he'll follow up. * #215 - "make uninstall" is a feature we'd prefer not to support. * #679 - Larry and Peter will respond. * #677 - Cary will follow up. * #610 - Peter will follow up; can be closed out. openexr-2.5.7/ASWF/tsc-meetings/2020-04-02.md000066400000000000000000000013631406177042200177220ustar00rootroot00000000000000# 4/2/2020 ### Attending: * Cary Phillips * Peter Hillman * Larry Gritz * Kimball Thurston * Christina Tempelaar-Lietz * Rod Bogart * Joseph Goldstone * Nick Porcino * John Mertic * Sarah Martin ### Discussion: * Various pandemic stories. * Discussed Google Summer of Code project proposals. * Sarah Martin presented mockups of a new look for openexr.com website. We preferred the one with obviously high-dynamic range image, a relatively small banner across the top. We expressed a preference for a "dark" mode style. * Rod will look for information about the original OpenEXR logo design. * Cary will follow up with John Mertic about Linux Foundation graphic design services for a new logo. * #668 - Cary will respond with "won't fix." openexr-2.5.7/ASWF/tsc-meetings/2020-04-16.md000066400000000000000000000020471406177042200177270ustar00rootroot00000000000000# 4/16/2020 ### Attending: * Cary Phillips * Peter Hillman * Larry Gritz * Kimball Thurston * Christina Tempelaar-Lietz * Joseph Goldstone * John Mertic ### Discussion: * More pandemic stories. * TSC meeting cadence will change to bi-weekly, 1:30pm PST Thursdays, since the OSL TSC meeting is 2pm biweekly. * John will get the LF design team to draft some logo options. We like the idea that the logo should be simple enough to appear on a camera, as was the original intention, even if that's not likely to actually happen. It's still a good principle to follow. Also, the letters "EXR" would be appropriate because that's the file suffix. * Discussed Google Summer of Code project proposals. We'll request 2 slots. Cary communicated with one candidate by email. Peter will follow up with one of the candidates to assess interest and skills. * Christina will look into the Azure build failures this weekend. It's mysterious because it was working and nothing appears to have changed. It doesn't seem to involve any of the recent PR's. openexr-2.5.7/ASWF/tsc-meetings/2020-04-23.md000066400000000000000000000035531406177042200177300ustar00rootroot00000000000000# 4/23/2020 ### Attending: * Cary Phillips * Christina Tempelaar-Lietz * Eskil Steenburg * John Mertic * Kimball Thurston * Larry Gritz * Peter Hillman ### Discussion: * pgados has submitted a PR that patches the recent CVE fixes into the 2.2 release, in order to patch an older SuSE enterprise distro that uses 2.2.1. This is fine to merge, pending the CLA. * We will aim for a 2.5 release sometime next week. Cary will send an announcement to openexr-dev shortly. We will make the 2.2.2 and 2.5 releases at the same time, with 2.2.2 first quickly followed by 2.5, so that people don't misinterpret 2.2.2 is the most recent release. * Reviewed logo designed. We liked the one with the overlapping trapezoids (layered rectangles in perspective), but suggest that the text should emphasize "EXR" and de-emphasize "Open". Also, experiment with red, green, and blue rectangles, subject to what the transparency might look like. * Discussed Google Summer of Code project proposals. We've made our case for an OpenEXR project but will need to negotiate with the other ASWF projects. * Larry says the OIIO CI script pulls from the top of OpenEXR master branch, so that is at least one test for an external build, and that code version also goes through the OIIO test suite. * Emily Olin proposes that the ASWF Open Source Day and project BoF's go fully virtual this year regardless of whether SIGGRAPH is in-person or virtual. We agree that we an host a Zoom-like community gathering to provide a project update and solicit discussion topics. We should be able to manage an effective virtual exchange. * Christina will shift gears on the CI failure and port the setup to GitHub Actions first, then hopefully in the process determine why the macOS build is failing. The build is failing to find the iex.so module, presumably because of a pathing problem. openexr-2.5.7/ASWF/tsc-meetings/2020-05-14.md000066400000000000000000000012611406177042200177230ustar00rootroot00000000000000# 5/14/2020 ### Attending: * Aloys Baillet * Cary Phillips * Christina Tempelaar-Lietz * Joseph Goldstone * Kimball Thurston * Larry Gritz * Nick Porcino * Owen Thompson * Peter Hillman ### Discussion: * Introduce Owen Thompson, Google Summer of Code intern, from the Motion Picture Science program at Rochester Institute of Technology. Internship runs June-August. * Discussed the Imath project: * A new repo, https://github.com/AcademySoftwareFoundation/Imath * Retain the revision history, via git rewrite history, maybe? * Add performance metrics, and performance regression tests. * Modernize the C++, too: constexpr, noexcept, CUDA-compatibility for half, etc. openexr-2.5.7/ASWF/tsc-meetings/2020-05-21.md000066400000000000000000000053511406177042200177250ustar00rootroot00000000000000# 5/21/2020 ### Attending: * Arkell Rasiah * Cary Phillips * Christina Tempelaar-Lietz * Eskil Steenburg * Joseph Goldstone * Kimball Thurston * Larry Gritz * Nick Porcino * Owen Thompson * Peter Hillman * Rod Bogart * Phil Ames * Abishek Arya ### Discussion: * Arkell will investigate updating open-exr images over the summer. Will also reach out to Florian to see if he’s interested in providing some test images. * Arkell raised a concern about images in the openexr-images/Chromaticities folder. Should the Rec709.exr and XYY.exr appear the same? Aren’t the chromaticies the same? Rv inherently adapts with a bradford transformation. Was the XYX made with the wrong adaptation matrix? * Phil Ames and Abishek Arya from the Google AutoFuzz team joined to discuss the OSS-Fuzz service. * Phil is on the information security team. The team fuzzes a lot of open source projects, especially file formats. * Abishek leads the OSS-Fuzz development effort. * The goal is to make fuzzing really simple, simplifying workflow as much as possible. * Integrated with 300 projects (e.g. OpenSSL) * They used to manually reproduce and file bugs, but that doesn’t scale, so the process has been automated. * Lots of work has been done to de-duplicate bugs by comparing stackframes. * OSS-Fuzz focuses on making bugs reproducible. Otherwise they aren’t filed. * Most of the integration can be done in < 100 LOC. * Vendors can sign up to be notified when bugs are detected. * Security bugs are restricted for 90 days. * Bugs are closed automatically when a fix is checked in. * It’s using the existing IlmImfFuzzTest. Will need to break it up into smaller tests. * OSS-Fuzz instrument with many sanitizers, on many cores. * What happens if something is discovered that’s in code that doesn’t matter (documentation generation code)? We control that, since it’s our code that runs the fuzzers. * There’s a CI option: on every PR it does 5 minutes of fuzz. * OSS-Fuzz doesn’t file CVE’s. * Example integration setup PR, for the tinyexr project: https://github.com/google/oss-fuzz/pull/3801/files * Larry pointed out the recent Autodesk maya file security issue: https://www.autodesk.com/trust/security-advisories/adsk-sa-2020-0003 * We also want to run the sanitizer against the regular tests, as well as against the fuzz tests. * Owen shared the Imath project task spreadsheet: https://docs.google.com/spreadsheets/d/1rC_USR4lLXVUTyAG62gOG-uJlxzRguMNTlMYYf2rUrQ/edit?usp=sharing * Christina reports that Azure Pipelines is completely retired, all migrated to GitHub Actions. One remaining issue with the Windows build, but everything seems to be working properly. openexr-2.5.7/CHANGES.md000066400000000000000000011171501406177042200146100ustar00rootroot00000000000000# OpenEXR Release Notes * [Version 2.5.7](#version-257-june-16-2021) June 16, 2021 * [Version 2.5.6](#version-256-may-17-2021) May 17, 2021 * [Version 2.5.5](#version-255-february-12-2021) February 12, 2021 * [Version 2.5.4](#version-254-december-31-2020) December 31, 2020 * [Version 2.5.3](#version-253-august-12-2020) August 12, 2020 * [Version 2.5.2](#version-252-june-15-2020) June 15, 2020 * [Version 2.5.1](#version-251-may-11-2020) May 11, 2020 * [Version 2.5.0](#version-250-may-6-2020) May 6, 2020 * [Version 2.4.3](#version-243-may-17-2021) May 17, 2021 * [Version 2.4.2](#version-242-june-15-2020) June 15, 2020 * [Version 2.4.1](#version-241-february-11-2020) February 11, 2020 * [Version 2.4.0](#version-240-september-19-2019) September 19, 2019 * [Version 2.3.0](#version-230-august-13-2018) August 13, 2018 * [Version 2.2.2](#version-222-april-30-2020) April 30, 2020 * [Version 2.2.1](#version-221-november-30-2017) November 30, 2017 * [Version 2.2.0](#version-220-august-10-2014) August 10, 2014 * [Version 2.1.0](#version-210-november-25-2013) November 25, 2013 * [Version 2.0.1](#version-201-july-11-2013) July 11, 2013 * [Version 2.0.0](#version-200-april-9-2013) April 9, 2013 * [Version 1.7.1](#version-171-july-31-2012) July 31, 2012 * [Version 1.7.0](#version-170-july-23-2010) July 23, 2010 * [Version 1.6.1](#version-161-october-22-2007) October 22, 2007 * [Version 1.6.0](#version-160-august-3,2007) August 3, 2007 * [Version 1.5.0](#version-150-december-15-2006) December 15, 2006 * [Version 1.4.0a](#version-140a-august-9-2006) August 9, 2006 * [Version 1.4.0](#version-140-august-2,2006) August 2, 2006 * [Version 1.3.1](#version-131-june-14-2006) June 14, 2006 * [Version 1.3.0](#version-130-june-8,2006) June 8, 2006 * [Version 1.2.2](#version-122-march-15-2005) March 15, 2005 * [Version 1.2.1](#version-121-june-6,2004) June 6, 2004 * [Version 1.2.0](#version-120-may-11-2004) May 11, 2004 * [Version 1.1.1](#version-111-march-27-2004) March 27, 2004 * [Version 1.1.0](#version-110-february-6-2004) February 6, 2004 * [Version 1.0.7](#version-107-january-7-2004) January 7, 2004 * [Version 1.0.6](#version-106) * [Version 1.0.5](#version-105-april-3-2003) April 3, 2003 * [Version 1.0.4](#version-104) * [Version 1.0.3](#version-103) * [Version 1.0.2](#version-102) * [Version 1.0.1](#version-101) * [Version 1.0](#version-10) ## Version 2.5.7 (June 16, 2021) Patch release with security and build fixes: * OSS-fuzz [28051](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28051) Heap-buffer-overflow in Imf_2_5::copyIntoFrameBuffer * OSS-fuzz [28155](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28155) Crash in Imf_2_5::PtrIStream::read * Fix broken symlink and pkg-config lib suffix for cmake debug builds ### Merged Pull Requests * [1052](https://github.com/AcademySoftwareFoundation/openexr/pull/1052) Fix non-versioned library symlinks in debug build. * [1037](https://github.com/AcademySoftwareFoundation/openexr/pull/1037) verify data size in deepscanlines which are not compressed * [1036](https://github.com/AcademySoftwareFoundation/openexr/pull/1036) detect buffer overflows in RleUncompress * [1032](https://github.com/AcademySoftwareFoundation/openexr/pull/1032) Fix pkg-config lib suffix for cmake debug builds * [872](https://github.com/AcademySoftwareFoundation/openexr/pull/872) Handle xsampling and bad seekg() calls in exrcheck ## Version 2.5.6 (May 17, 2021) Patch release that fixes a regression in Imath::succf()/Imath::predf(): * [#1013](https://github.com/AcademySoftwareFoundation/openexr/pull/1013) Fixed regression in Imath::succf() and Imath::predf() when negative values are given ## Version 2.5.5 (February 12, 2021) Patch release with various bug/sanitizer/security fixes, primarily related to reading corrupted input files, but also a fix for universal build support on macOS. Specific OSS-fuzz issues include: * OSS-fuzz [30291](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=30291) Timeout in openexr_exrcheck_fuzzer * OSS-fuzz [29106](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=29106) Heap-buffer-overflow in Imf_2_5::FastHufDecoder::decode * OSS-fuzz [28971](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28971) Undefined-shift in Imf_2_5::cachePadding * OSS-fuzz [29829](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=29829) Integer-overflow in Imf_2_5::DwaCompressor::initializeBuffers * OSS-fuzz [30121](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=30121) Out-of-memory in openexr_exrcheck_fuzzer ### Merged Pull Requests * [914](https://github.com/AcademySoftwareFoundation/openexr/pull/914) additional verification of DWA data sizes * [910](https://github.com/AcademySoftwareFoundation/openexr/pull/910) update tileoffset sanitycheck to handle ripmaps * [903](https://github.com/AcademySoftwareFoundation/openexr/pull/903) prevent overflows by using Int64 for all vars in DWA initialize * [901](https://github.com/AcademySoftwareFoundation/openexr/pull/901) Use size_t for DWA buffersize calculation * [897](https://github.com/AcademySoftwareFoundation/openexr/pull/897) prevent overflow in RgbaFile cachePadding * [896](https://github.com/AcademySoftwareFoundation/openexr/pull/896) add buffer size validation to FastHuf decode * [893](https://github.com/AcademySoftwareFoundation/openexr/pull/893) Include where required by newer compilers * [889](https://github.com/AcademySoftwareFoundation/openexr/pull/889) Add explicit #include for numeric_limits * [854](https://github.com/AcademySoftwareFoundation/openexr/pull/854) Fix Apple Universal 2 (arm64/x86_64) builds ## Version 2.5.4 (December 31, 2020) Patch release with various bug/sanitizer/security fixes, primarily related to reading corrupted input files. Security vulnerabilities fixed: * [CVE-2021-20296](https://nvd.nist.gov/vuln/detail/CVE-2021-20296) Segv on unknown address in Imf_2_5::hufUncompress - Null Pointer dereference * [CVE-2021-3479](https://nvd.nist.gov/vuln/detail/CVE-2021-3479) Out-of-memory in openexr_exrenvmap_fuzzer * [CVE-2021-3478](https://nvd.nist.gov/vuln/detail/CVE-2021-3478) Out-of-memory in openexr_exrcheck_fuzzer * [CVE-2021-3477](https://nvd.nist.gov/vuln/detail/CVE-2021-3477) Heap-buffer-overflow in Imf_2_5::DeepTiledInputFile::readPixelSampleCounts * [CVE-2021-3476](https://nvd.nist.gov/vuln/detail/CVE-2021-3476) Undefined-shift in Imf_2_5::unpack14 * [CVE-2021-3475](https://nvd.nist.gov/vuln/detail/CVE-2021-3475) Integer-overflow in Imf_2_5::calculateNumTiles * [CVE-2021-3474](https://nvd.nist.gov/vuln/detail/CVE-2021-3474) Undefined-shift in Imf_2_5::FastHufDecoder::FastHufDecoder Specific OSS-fuzz issues include: * OSS-fuzz [24854](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24854) Segv on unknown address in Imf_2_5::hufUncompress * OSS-fuzz [24831](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24831) Undefined-shift in Imf_2_5::FastHufDecoder::FastHufDecoder * OSS-fuzz [24969](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24969) Invalid-enum-value in Imf_2_5::TypedAttribute::writeValueTo * OSS-fuzz [25297](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25297) Integer-overflow in Imf_2_5::calculateNumTiles * OSS-fuzz [24787](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24787) Undefined-shift in Imf_2_5::unpack14 * OSS-fuzz [25326](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25326) Out-of-memory in openexr_scanlines_fuzzer * OSS-fuzz [25399](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25399) Heap-buffer-overflow in Imf_2_5::FastHufDecoder::FastHufDecoder * OSS-fuzz [25415](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25415) Abrt in __cxxabiv1::failed_throw * OSS-fuzz [25370](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25370) Out-of-memory in openexr_exrenvmap_fuzzer * OSS-fuzz [25501](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25501) Out-of-memory in openexr_scanlines_fuzzer * OSS-fuzz [25505](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25505) Heap-buffer-overflow in Imf_2_5::copyIntoFrameBuffer * OSS-fuzz [25562](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25562) Integer-overflow in Imf_2_5::hufUncompress * OSS-fuzz [25740](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25740) Null-dereference READ in Imf_2_5::Header::operator * OSS-fuzz [25743](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25743) Null-dereference in Imf_2_5::MultiPartInputFile::header * OSS-fuzz [25913](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25913) Out-of-memory in openexr_exrenvmap_fuzzer * OSS-fuzz [26229](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26229) Undefined-shift in Imf_2_5::hufDecode * OSS-fuzz [26658](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26658) Out-of-memory in openexr_scanlines_fuzzer * OSS-fuzz [26956](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26956) Heap-buffer-overflow in Imf_2_5::DeepTiledInputFile::readPixelSampleCounts * OSS-fuzz [27409](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=27409) Out-of-memory in openexr_exrcheck_fuzzer * OSS-fuzz [25892](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25892) Divide-by-zero in Imf_2_5::calculateNumTiles * OSS-fuzz [25894](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25894) Floating-point-exception in Imf_2_5::precalculateTileInfo ### Merged Pull Requests * [817](https://github.com/AcademySoftwareFoundation/openexr/pull/817) double-check unpackedBuffer created in DWA uncompress (OSS-fuzz 24854) * [818](https://github.com/AcademySoftwareFoundation/openexr/pull/818) compute Huf codelengths using 64 bit to prevent shift overrflow (OSS-fuzz 24831) * [820](https://github.com/AcademySoftwareFoundation/openexr/pull/820) suppress sanitizer warnings when writing invalid enums (OSS-fuzz 24969) * [825](https://github.com/AcademySoftwareFoundation/openexr/pull/825) Avoid overflow in calculateNumTiles when size=MAX_INT (OSS-fuzz 25297) * [826](https://github.com/AcademySoftwareFoundation/openexr/pull/826) restrict maximum tile size to INT_MAX byte limit (OSS-fuzz 25297) * [832](https://github.com/AcademySoftwareFoundation/openexr/pull/832) ignore unused bits in B44 mode detection (OSS-fuzz 24787) * [827](https://github.com/AcademySoftwareFoundation/openexr/pull/827) lighter weight reading of Luma-only images via RgbaInputFile (OSS-fuzz 25326) * [829](https://github.com/AcademySoftwareFoundation/openexr/pull/829) fix buffer overflow check in PIZ decompression (OSS-fuzz 25399, OSS-fuzz 25415) * [830](https://github.com/AcademySoftwareFoundation/openexr/pull/830) refactor channel filling in InputFile API with tiled source (OSS-fuzz 25370 , OSS-fuzz 25501) * [831](https://github.com/AcademySoftwareFoundation/openexr/pull/831) Use Int64 in dataWindowForTile to prevent integer overflow (OSS-fuzz 25505) * [836](https://github.com/AcademySoftwareFoundation/openexr/pull/836) prevent overflow in hufUncompress if nBits is large (OSS-fuzz 25562) * [840](https://github.com/AcademySoftwareFoundation/openexr/pull/840) add sanity check for reading multipart files with no parts (OSS-fuzz 25740 , OSS-fuzz 25743) * [841](https://github.com/AcademySoftwareFoundation/openexr/pull/841) more elegant exception handling in exrmaketiled (ZhiWei Sun from Topsec Alpha Lab) * [843](https://github.com/AcademySoftwareFoundation/openexr/pull/843) reduce B44 _tmpBufferSize (was allocating two bytes per byte) (OSS-fuzz 25913) * [844](https://github.com/AcademySoftwareFoundation/openexr/pull/844) check EXRAllocAligned succeeded to allocate ScanlineInputFile lineBuffers (ZhiWei Sun from Topsec Alpha Lab) * [845](https://github.com/AcademySoftwareFoundation/openexr/pull/845) test channels are DCT compressed before DWA decompression (ZhiWei Sun from Topsec Alpha Lab) * [849](https://github.com/AcademySoftwareFoundation/openexr/pull/849) check for valid Huf code lengths (OSS-fuzz 26229) * [860](https://github.com/AcademySoftwareFoundation/openexr/pull/860) check 1 part files with 'nonimage' bit have type attribute (OSS-fuzz 26658) * [861](https://github.com/AcademySoftwareFoundation/openexr/pull/861) Fix overflow computing deeptile sample table size (OSS-fuzz 26956) * [863](https://github.com/AcademySoftwareFoundation/openexr/pull/863) re-order shift/compare in FastHuf to prevent undefined shift overflow (OSS-fuzz 27409) * Also, partial fixes from [842](https://github.com/AcademySoftwareFoundation/openexr/pull/842) which do not change the ABI: (OSS-fuzz 25892 , OSS-fuzz 25894) ### Commits \[ git log v2.5.3...v2.5.4\] * [0c2b46f6](https://github.com/AcademySoftwareFoundation/openexr/commit/0c2b46f630a3b5f2f561c2849d047ee39f899179) Cherry-pick PRs from master branch which fix issues reported by fuzz tests (#875) ([peterhillman](@peterh@wetafx.co.nz) 2020-12-31) ## Version 2.5.3 (August 12, 2020) Patch release with various bug/security fixes and build/install fixes, plus a performance optimization: ### Summary * Various sanitizer/fuzz-identified issues related to handling of invalid input * Fixes to misc compiler warnings * Cmake fix for building on arm64 macOS (#772) * Read performance optimization (#782) * Fix for building on non-glibc (#798) * Fixes to tests ### Merged Pull Requests * [812](https://github.com/AcademySoftwareFoundation/openexr/pull/812) free memory if precalculateTileInfo throws * [809](https://github.com/AcademySoftwareFoundation/openexr/pull/809) Avoid integer overflow in calculateNumTiles() * [806](https://github.com/AcademySoftwareFoundation/openexr/pull/806) suppress clang undefined behavior sanitizer in EnvmapAttribute::copyValuesFrom() * [805](https://github.com/AcademySoftwareFoundation/openexr/pull/805) remove extraneous vector allocation in getScanlineChunkOffsetTableSize * [804](https://github.com/AcademySoftwareFoundation/openexr/pull/804) prevent invalid tile description enums * [803](https://github.com/AcademySoftwareFoundation/openexr/pull/803) Fix stack corruption in Matrix tests * [801](https://github.com/AcademySoftwareFoundation/openexr/pull/801) prevent invalid Compression enum values being read from file * [798](https://github.com/AcademySoftwareFoundation/openexr/pull/798) IexMathFpu.cpp: Fix build on non-glibc (e.g. musl libc) * [795](https://github.com/AcademySoftwareFoundation/openexr/pull/795) prevent invalid values in LineOrder enum * [794](https://github.com/AcademySoftwareFoundation/openexr/pull/794) suppress clang undefined behavior sanitizer in DeepImageStateAttribute::copyValuesFrom() * [793](https://github.com/AcademySoftwareFoundation/openexr/pull/793) sanityCheckDisplayWindow() ensures that width and height don't cause integer overflow * [792](https://github.com/AcademySoftwareFoundation/openexr/pull/792) cast signed chars to unsigned longs before left shift in Xdr::read of signed long * [788](https://github.com/AcademySoftwareFoundation/openexr/pull/788) use 64 bit computation in chunk offset table reconstruction * [787](https://github.com/AcademySoftwareFoundation/openexr/pull/787) change sanity check in stringvectorattribute to prevent overflow * [785](https://github.com/AcademySoftwareFoundation/openexr/pull/785) prevent invalid values in Channel's PixelType enum * [784](https://github.com/AcademySoftwareFoundation/openexr/pull/784) sanity check preview attribute sizes * [783](https://github.com/AcademySoftwareFoundation/openexr/pull/783) explicitly cast signed chars to unsigned before bitwise left shift in Xdr::read() * [782](https://github.com/AcademySoftwareFoundation/openexr/pull/782) refactor: use local loop variable in copyFromFrameBuffer * [778](https://github.com/AcademySoftwareFoundation/openexr/pull/778) Sanity check stringvector size fields on read * [777](https://github.com/AcademySoftwareFoundation/openexr/pull/777) IlmImfFuzzTest reports incorrect test names and missing files as errors * [775](https://github.com/AcademySoftwareFoundation/openexr/pull/775) Removes overridden find_package in CMakeLists.txt * [772](https://github.com/AcademySoftwareFoundation/openexr/pull/772) Disable OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX when building on arm64 macOS * [770](https://github.com/AcademySoftwareFoundation/openexr/pull/770) IlmImf: Fix clang compiler warnings * [738](https://github.com/AcademySoftwareFoundation/openexr/pull/738) always ignore chunkCount attribute unless it cannot be computed #738 ### Commits \[ git log v2.5.2...v2.5.3\] * [``425c104f``](https://github.com/AcademySoftwareFoundation/openexr/commit/425c104f7ae9e8e17cc3d9d120d684b93195c402) free memory if precalculateTileInfo throws ([Peter Hillman](@peterh@wetafx.co.nz) 2020-08-10) * [``7212e337``](https://github.com/AcademySoftwareFoundation/openexr/commit/7212e33729e036d16fb5fd3494af815869771963) Set LIBTOOL_VERSION to 25:2:0 for 2.5.3 ([Cary Phillips](@cary@ilm.com) 2020-08-09) * [``0b6d5185``](https://github.com/AcademySoftwareFoundation/openexr/commit/0b6d5185d99bff1c4ab7b2fe00d297ef2fcd46e8) Release notes for 2.5.3 ([Cary Phillips](@cary@ilm.com) 2020-08-09) * [``6b55722b``](https://github.com/AcademySoftwareFoundation/openexr/commit/6b55722b4477e8d4aed04fbeb6b9f5b4226d2bbd) Bump version to 2.5.3 and LIBTOOL_CURRENT to 26 ([Cary Phillips](@cary@ilm.com) 2020-08-09) * [``40a7ed76``](https://github.com/AcademySoftwareFoundation/openexr/commit/40a7ed76cde1427aa6c935565de96f7ee10d9f76) Change >= to > in overflow calculation ([Cary Phillips](@cary@ilm.com) 2020-08-08) * [``b10412d5``](https://github.com/AcademySoftwareFoundation/openexr/commit/b10412d55964459e04ff95f982fd8ce2ded4ea43) Avoid integer overflow in calculateNumTiles() ([Cary Phillips](@cary@ilm.com) 2020-08-08) * [``ed469311``](https://github.com/AcademySoftwareFoundation/openexr/commit/ed469311ac17a8912e2c4cb14856aa2b7f228fac) reformatted references to CVEs in CHANGES.md ([Cary Phillips](@cary@ilm.com) 2020-07-07) * [``f7c8a7a1``](https://github.com/AcademySoftwareFoundation/openexr/commit/f7c8a7a11a69579d8618f31d0e4a1b7bcc20e939) Add references to CVE-2020-15304, CVE-2020-15305, CVE-2020-15306 to SECURITY.md and CHANGES.md ([Cary Phillips](@cary@ilm.com) 2020-07-07) * [``0d226001``](https://github.com/AcademySoftwareFoundation/openexr/commit/0d22600163f58c4e3ca20b9f67bd2fe7866e9201) Add #755 to 2.4.2 release notes ([Cary Phillips](@cary@ilm.com) 2020-06-13) * [``4a4a4f4a``](https://github.com/AcademySoftwareFoundation/openexr/commit/4a4a4f4a58a5d34a132655cc82116a383d787e5d) Improved formatting of commits in release notes ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``9c42766b``](https://github.com/AcademySoftwareFoundation/openexr/commit/9c42766bd0347dccb84a68977d11fab8cc83ae3c) added merged PR's to v2.4.2 release notes. ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``cc1809ed``](https://github.com/AcademySoftwareFoundation/openexr/commit/cc1809ed27aed48c54cfb730c90bdf570bb18551) Release notes for v2.4.2 ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``7fe8d40d``](https://github.com/AcademySoftwareFoundation/openexr/commit/7fe8d40db0c2c02da5f7d2a602fb87a630c3c70d) Remove non-code-related PR's and commits from v2.5.2 release notes. ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``bc0b229c``](https://github.com/AcademySoftwareFoundation/openexr/commit/bc0b229c5618ffdc6337817898e3d145b6854194) add commit history to release notes for v2.5.1 and v2.5.2 ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``ba76b8ca``](https://github.com/AcademySoftwareFoundation/openexr/commit/ba76b8ca62c2f1d4ccabd2887dc8d09c69102c2f) always ignore chunkCount attribute unless it cannot be computed (#738) ([peterhillman](@peterh@wetafx.co.nz) 2020-05-27) * [``81818f2a``](https://github.com/AcademySoftwareFoundation/openexr/commit/81818f2a9c9336d71b65b194aaecdef493e9122b) suppress clang undefined behavior sanitizer in EnvmapAttribute::copyValuesFrom() ([Peter Hillman](@peterh@wetafx.co.nz) 2020-08-07) * [``2f83442f``](https://github.com/AcademySoftwareFoundation/openexr/commit/2f83442f067788751ce857effa3472bf4f79f743) allow undefined EnvMap enum values for future proofing ([Peter Hillman](@peterh@wetafx.co.nz) 2020-08-07) * [``485b5fe4``](https://github.com/AcademySoftwareFoundation/openexr/commit/485b5fe4d6e575b4af389af98d7a3a2104ce828b) remove extraneous vector allocation in getScanlineChunkOffsetTableSize ([Peter Hillman](@peterh@wetafx.co.nz) 2020-08-06) * [``7da32d3c``](https://github.com/AcademySoftwareFoundation/openexr/commit/7da32d3ccf6d4eace88ffad093f692a4287b2fbf) refactor: use local loop variable in copyFromFrameBuffer ([Gyula Gubacsi](@gyula.gubacsi@foundry.com) 2020-07-14) * [``1ecaf4bd``](https://github.com/AcademySoftwareFoundation/openexr/commit/1ecaf4bdfa00204e17aa2a0f51d1ca7d672a9303) prevent invalid tile description enums ([Peter Hillman](@peterh@wetafx.co.nz) 2020-08-05) * [``88420f93``](https://github.com/AcademySoftwareFoundation/openexr/commit/88420f93857eb2a892683a8a212472883abc8476) prevent invalid Compression enum values being read from file ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-31) * [``90736089``](https://github.com/AcademySoftwareFoundation/openexr/commit/90736089eb2c51cfdc311de9b5acc337e4a4c49a) Fix out of bounds assignments ([Darby Johnston](@darbyjohnston@yahoo.com) 2020-08-01) * [``9752e70d``](https://github.com/AcademySoftwareFoundation/openexr/commit/9752e70d31193f649eb5286bb649916ecfcc51ea) IexMathFpu.cpp: Fix build on non-glibc (e.g. musl libc). ([Niklas Hambüchen](@mail@nh2.me) 2020-07-30) * [``37e16a88``](https://github.com/AcademySoftwareFoundation/openexr/commit/37e16a88db863da9feeadc721d8df86118c5aab5) cast signed chars to unsigned longs before left shift in read of signed long ([Cary Phillips](@cary@ilm.com) 2020-07-17) * [``02e1ac54``](https://github.com/AcademySoftwareFoundation/openexr/commit/02e1ac54368ef40e493a67d6804bc706e1bd52db) suppress clang undefined behavior sanitizer in DeepImageStateAttribute::copyValuesFrom() ([Cary Phillips](@cary@ilm.com) 2020-07-22) * [``bf3edf27``](https://github.com/AcademySoftwareFoundation/openexr/commit/bf3edf271a638e95120c83cbd794502b55f1c64e) fixed CI and Analysis badges in README.md ([Cary Phillips](@cary@ilm.com) 2020-07-16) * [``93e9f2ac``](https://github.com/AcademySoftwareFoundation/openexr/commit/93e9f2ac3212353414a4e65eb359bcd6dbe7fe6f) prevent invalid values in LineOrder enum ([Cary Phillips](@cary@ilm.com) 2020-07-22) * [``6bb6257f``](https://github.com/AcademySoftwareFoundation/openexr/commit/6bb6257ffb24f375dfcc40568bfd6357dd6028f8) fixed comment ([Cary Phillips](@cary@ilm.com) 2020-07-20) * [``1a1e13fd``](https://github.com/AcademySoftwareFoundation/openexr/commit/1a1e13fd8579900ee9f05c3c12bdf2b2aa994593) sanityCheckDisplayWindow() ensures that width and height don't cause integer overflow ([Cary Phillips](@cary@ilm.com) 2020-07-20) * [``45e14fdf``](https://github.com/AcademySoftwareFoundation/openexr/commit/45e14fdf0700b7afdb94ea7bb788ba9a162d04d7) IlmImfFuzzTest reports incorrect test names and missing files as errors rather than silently succeeding. ([Cary Phillips](@cary@ilm.com) 2020-07-09) * [``a6bc10f5``](https://github.com/AcademySoftwareFoundation/openexr/commit/a6bc10f5f28c19b8338eb2c6c7226bb6408554f7) use ll in chunk size computation ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-17) * [``c6058144``](https://github.com/AcademySoftwareFoundation/openexr/commit/c6058144b653c8ded2e8c0cf0709186486b2453d) use 64 bit computation in chunkoffsettable reconstruction ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-17) * [``b33b1187``](https://github.com/AcademySoftwareFoundation/openexr/commit/b33b1187342ff76da08fc7a3ef848b937d7374a3) prevent invalid values in Channel's PixelType enum ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-16) * [``b7b8a568``](https://github.com/AcademySoftwareFoundation/openexr/commit/b7b8a5685c0db270b4671ef78c388e3a89605e85) change sanity check in stringvectorattribute to prevent overflow (#787) ([peterhillman](@peterh@wetafx.co.nz) 2020-07-17) * [``09eadd12``](https://github.com/AcademySoftwareFoundation/openexr/commit/09eadd12d86763fda854b36524ae37680d8ff4c5) cast signed chars to unsigned before bitwise left shift in Xdr::read() ([Cary Phillips](@cary@ilm.com) 2020-07-14) * [``3cf874cb``](https://github.com/AcademySoftwareFoundation/openexr/commit/3cf874cbbd23d945a0057f10145bd5f3ce2be679) sanity check preview attribute sizes ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-15) * [``849c6776``](https://github.com/AcademySoftwareFoundation/openexr/commit/849c6776f6627a11710227c026dd4aa6de8f7738) Tidy whitespace in ImfStringVectorAttribute.cpp ([peterhillman](@peterh@wetafx.co.nz) 2020-07-10) * [``fcaa1691``](https://github.com/AcademySoftwareFoundation/openexr/commit/fcaa1691071f90df9202818315f4f9d1bc13c54e) sanity check string vectors on read ([Peter Hillman](@peterh@wetafx.co.nz) 2020-07-10) * [``0d13c74a``](https://github.com/AcademySoftwareFoundation/openexr/commit/0d13c74a3bfa497465c3e42847b9c62089f0454b) Removes overridden find_package in CMakeLists.txt in favor of reusing the generated config files and setting (IlmBase/OpenEXR)_DIR variables Overriding a cmake function is undocumented functionallity and only works one time. Better to avoid if possible. ([Peter Steneteg](@peter@steneteg.se) 2020-06-17) * [``1343c08a``](https://github.com/AcademySoftwareFoundation/openexr/commit/1343c08a7eb13764bbb6c21db22e5a78169754db) Cast to uintptr_t instead of size_t for mask ops on ptrs. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-06-25) * [``72de4c9e``](https://github.com/AcademySoftwareFoundation/openexr/commit/72de4c9ef32e2e9eb4e6d9499a0fadb96ae28796) Switching to current c++ casting style. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-06-24) * [``9534e36d``](https://github.com/AcademySoftwareFoundation/openexr/commit/9534e36d1d1993db7a7cc3ba4c58ec4d7a4a8dd5) IlmImf: Fix misc compiler warnings. ([Arkell Rasiah](@arkellrasiah@gmail.com) 2020-06-23) * [``8e53ab8d``](https://github.com/AcademySoftwareFoundation/openexr/commit/8e53ab8d13b1b6c14c716573e6f16d079e799ab4) Disable OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX when building on arm64 macOS ([Yining Karl Li](@betajippity@gmail.com) 2020-07-03) * [``67b1b88d``](https://github.com/AcademySoftwareFoundation/openexr/commit/67b1b88de6ad454a1b267ee9a4e19b4efbdbe19d) Addresses PR#767: Removal of legacy .cvsignore files. ([Arkell Rasiah](@arkellrasiah@gmail.com) 2020-06-19) * [``801e5d87``](https://github.com/AcademySoftwareFoundation/openexr/commit/801e5d8750dd8b8a6e25c131899136c575b20d07) Fix typo in README ([cia-rana](@kiwamura0314@gmail.com) 2020-06-15) ## Version 2.5.2 (June 15, 2020) Patch release with various bug/security fixes and build/install fixes. ### Summary * [CVE-2020-15305](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15305) Invalid input could cause a heap-use-after-free error in DeepScanLineInputFile::DeepScanLineInputFile() * [CVE-2020-15306](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15306) Invalid chunkCount attributes could cause heap buffer overflow in getChunkOffsetTableSize() * [CVE-2020-15304](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15304) Invalid tiled input file could cause invalid memory access TiledInputFile::TiledInputFile() * OpenEXRConfig.h now correctly sets OPENEXR_PACKAGE_STRING to "OpenEXR" (rather than "IlmBase") * Various Windows build fixes ### Merged Pull Requests * [755](https://github.com/AcademySoftwareFoundation/openexr/pull/755) Fix OPENEXR_PACKAGE_NAME * [747](https://github.com/AcademySoftwareFoundation/openexr/pull/747) Fix the PyIlmBase tests for the autotools build * [743](https://github.com/AcademySoftwareFoundation/openexr/pull/743) Applies OPENEXR_DLL only to shared libraries and no longer to static libraries * [742](https://github.com/AcademySoftwareFoundation/openexr/pull/742) Removes symlink creation under Windows * [738](https://github.com/AcademySoftwareFoundation/openexr/pull/738) always ignore chunkCount attribute unless it cannot be computed * [733](https://github.com/AcademySoftwareFoundation/openexr/pull/733) added missing PyImathMatrix22.cpp to Makefile.am, for the autotools build * [730](https://github.com/AcademySoftwareFoundation/openexr/pull/730) fix #728 - missing 'throw' in deepscanline error handling * [727](https://github.com/AcademySoftwareFoundation/openexr/pull/727) check null pointer in broken tiled file handling ### Commits \[ git log v2.5.1...v2.5.2\] * [``6f0d14d5``](https://github.com/AcademySoftwareFoundation/openexr/commit/6f0d14d576b6c2d3931f2c444b994207bc4bbc44) bump version to 2.5.2 ([Cary Phillips](@cary@ilm.com) 2020-06-11) * [``162fe820``](https://github.com/AcademySoftwareFoundation/openexr/commit/162fe82092188fd172cba26af0deec3b0a95a4fa) Fix OPENXR_PACKAGE_NAME ([Cary Phillips](@cary@ilm.com) 2020-06-10) * [``58e96f53``](https://github.com/AcademySoftwareFoundation/openexr/commit/58e96f534cd42bf9ee59725aadbf5d3b25d041fe) removed commented out lines in Makefile.am ([Cary Phillips](@cary@ilm.com) 2020-05-28) * [``6c82409e``](https://github.com/AcademySoftwareFoundation/openexr/commit/6c82409e14f415d460a3318dc9848f0c266f1215) Fix PyImathTest, PyImathNumpyTest, PyIexTest to work in the autotools build. ([Cary Phillips](@cary@ilm.com) 2020-05-28) * [``248abc23``](https://github.com/AcademySoftwareFoundation/openexr/commit/248abc23d134705bc41d167dcc04fafae231409c) Fix OPENEXR_DLL on test applications ([Transporter](@ogre.transporter@gmail.com) 2020-05-29) * [``ccf91b95``](https://github.com/AcademySoftwareFoundation/openexr/commit/ccf91b95b662d97b0cd8b9d87fd3eb4f5d70e880) Applies OPENEXR_DLL only to shared libraries and no longer to static libraries ([Transporter](@ogre.transporter@gmail.com) 2020-05-26) * [``c8f2463a``](https://github.com/AcademySoftwareFoundation/openexr/commit/c8f2463a910da90640d13d325ef689160d17ffe9) Removes symlink creation under Windows ([Transporter](@ogre.transporter@gmail.com) 2020-05-26) * [``78274436``](https://github.com/AcademySoftwareFoundation/openexr/commit/782744364aa92d02add62f38bc29ae2ce2c743e9) added missing PyImathMatrix22.cpp to Makefile.am, for the autotools build. ([Cary Phillips](@cary@ilm.com) 2020-05-19) * [``30349291``](https://github.com/AcademySoftwareFoundation/openexr/commit/303492919aa1cc39fb0c3d34d96b9f0090d3bdac) fix memory leak in deep scanline IlmImfFuzzTest ([Peter Hillman](@peterh@wetafx.co.nz) 2020-05-16) * [``21014549``](https://github.com/AcademySoftwareFoundation/openexr/commit/21014549c2728049abe273a719c3fca074234799) fix memory leak in deep scanline IlmImfFuzzTest ([Peter Hillman](@peterh@wetafx.co.nz) 2020-05-16) * [``07e93a3d``](https://github.com/AcademySoftwareFoundation/openexr/commit/07e93a3de1200355c1c32e2c4cc15ec87e312602) check null pointer in broken tiled file handling ([Peter Hillman](@peterh@wetafx.co.nz) 2020-05-16) * [``d8741bcc``](https://github.com/AcademySoftwareFoundation/openexr/commit/d8741bccbcc5e68cc4fac3cb11f08c655e6553fc) fix #728 - missing 'throw' in deepscanline error handling ([Peter Hillman](@peterh@wetafx.co.nz) 2020-05-19) ## Version 2.5.1 (May 11, 2020) A patch release that corrects the SO version for the v2.5 release, which missed getting bumped in v2.5.0. This release also fixes an improper failure in IlmImfTest when running on ARMv7 and AAarch64. ### Merged Pull Requests * [717](https://github.com/AcademySoftwareFoundation/openexr/pull/717) Fix #713: cast to unsigned in testHuf checksum * [714](https://github.com/AcademySoftwareFoundation/openexr/pull/714) Bump the SO version to 25 for the 2.5 release ### Commits \[ git log v2.5.0...v2.5.1\] * [``e823bf28``](https://github.com/AcademySoftwareFoundation/openexr/commit/e823bf282882d02e8ad1c7f6ca867807e1fd6044) Fix #713: cast to unsigned in testHuf checksum (#717) ([peterhillman](@peterh@wetafx.co.nz) 2020-05-10) * [``5670325e``](https://github.com/AcademySoftwareFoundation/openexr/commit/5670325ea2f44c2b4d4764b151b7570181bd280b) Bump the version to 2.5.1 on the RB-2.5 branch ([Cary Phillips](@cary@ilm.com) 2020-05-09) * [``d944ffac``](https://github.com/AcademySoftwareFoundation/openexr/commit/d944fface105c79fc4a34a4aa4bc1be39d5aabbc) set LIBTOOL_REVISION=0 for the 2.5 release. ([Cary Phillips](@cary@ilm.com) 2020-05-09) * [``3ec82975``](https://github.com/AcademySoftwareFoundation/openexr/commit/3ec82975243d83e2732da7b7cbdc08f87f30609c) Bump SO version to 25 for the 2.5 release. ([Cary Phillips](@cary@ilm.com) 2020-05-09) ## Version 2.5.0 (May 6, 2020) Minor release with miscellaneous bug fixes and small features ### Summary * No more build-time header generation: toFloat.h, eLut.h, b44ExpLogTable.h, and dwaLookups.h are now ordinary header files, no longer generated on the fly. * New StdISSTream class, an "input" stringstream version of StdOSStream * New Matrix22 class in Imath * Chromaticity comparison operator now includes white (formerly ignored) * Various cmake fixes * Bug fixes for various memory leaks * Bug fixes for various invalid memory accesses * New checks to detect damaged input files * OpenEXR_Viewers has been deprecated, removed from the top-level cmake build and documentation. ### Merged Pull Requests * [712](https://github.com/AcademySoftwareFoundation/openexr/pull/712) Removed #include PyIlmBaseConfigInternal.h from all public .h files. * [711](https://github.com/AcademySoftwareFoundation/openexr/pull/711) Rewrote testToFloat(). * [709](https://github.com/AcademySoftwareFoundation/openexr/pull/709) Fix clean pthreads strikes back * [708](https://github.com/AcademySoftwareFoundation/openexr/pull/708) Fix clean pthreads * [707](https://github.com/AcademySoftwareFoundation/openexr/pull/707) A clean version of #673: Allow the use of Pthreads with WIN32/64 * [705](https://github.com/AcademySoftwareFoundation/openexr/pull/705) added recent commits and PR's to 2.5.0 release notes * [704](https://github.com/AcademySoftwareFoundation/openexr/pull/704) fixed typos in README.md * [703](https://github.com/AcademySoftwareFoundation/openexr/pull/703) Release notes for 2.2.2 * [702](https://github.com/AcademySoftwareFoundation/openexr/pull/702) bump version on the 2.2 branch to 2.2.2 * [700](https://github.com/AcademySoftwareFoundation/openexr/pull/700) Patch fixes for CVE-2020-* from commit e79d229 into release/2.2 * [699](https://github.com/AcademySoftwareFoundation/openexr/pull/699) Bump version to 2.5.0 * [698](https://github.com/AcademySoftwareFoundation/openexr/pull/698) Fix to make Boost_NO_BOOST_CMAKE a cache variable * [697](https://github.com/AcademySoftwareFoundation/openexr/pull/697) Fix python module install on macOS * [696](https://github.com/AcademySoftwareFoundation/openexr/pull/696) TSC meeting notes 4-23-20 * [694](https://github.com/AcademySoftwareFoundation/openexr/pull/694) TSC meeting notes 4-16-20 * [693](https://github.com/AcademySoftwareFoundation/openexr/pull/693) Update the release notes and security notices with 2020 CVE's * [692](https://github.com/AcademySoftwareFoundation/openexr/pull/692) Meetings 4.2.20 * [690](https://github.com/AcademySoftwareFoundation/openexr/pull/690) Implementation of Matrix22 * [685](https://github.com/AcademySoftwareFoundation/openexr/pull/685) Fix libc++abi.dylib: Pure virtual function called! * [683](https://github.com/AcademySoftwareFoundation/openexr/pull/683) Typo in INSTALL.md: cmake now builds three modules, not four. * [682](https://github.com/AcademySoftwareFoundation/openexr/pull/682) TSC meeting notes 2020 03 05 * [680](https://github.com/AcademySoftwareFoundation/openexr/pull/680) fixed a/an use in Matrix33 and Matrix44 * [676](https://github.com/AcademySoftwareFoundation/openexr/pull/676) Remove OpenEXR_Viewers from the cmake build files and from INSTALL.md * [675](https://github.com/AcademySoftwareFoundation/openexr/pull/675) TSC meeting notes for 2/27/2020 * [672](https://github.com/AcademySoftwareFoundation/openexr/pull/672) Fix cmake install failing when install dir contains spaces, fix symlinks for shared libraries on DLL platforms * [669](https://github.com/AcademySoftwareFoundation/openexr/pull/669) CLA docs moved from "docs" to "contributors" * [667](https://github.com/AcademySoftwareFoundation/openexr/pull/667) TSC meeting notes 2/20/2020 * [666](https://github.com/AcademySoftwareFoundation/openexr/pull/666) ImfChromaticities.cpp: Add back white to equality ops. * [662](https://github.com/AcademySoftwareFoundation/openexr/pull/662) support reloading broken files with IlmImfFuzzTest * [661](https://github.com/AcademySoftwareFoundation/openexr/pull/661) fix unitialized pointer and double-delete bugs * [660](https://github.com/AcademySoftwareFoundation/openexr/pull/660) exrdisplay: limit maximum image size based on available screen res * [659](https://github.com/AcademySoftwareFoundation/openexr/pull/659) fix memory leaks and invalid memory accesses * [658](https://github.com/AcademySoftwareFoundation/openexr/pull/658) Fix yet more memory leaks from constructor exceptions * [657](https://github.com/AcademySoftwareFoundation/openexr/pull/657) Release notes for 2.4.1 patch release. * [656](https://github.com/AcademySoftwareFoundation/openexr/pull/656) fix crash with damaged EXR files * [655](https://github.com/AcademySoftwareFoundation/openexr/pull/655) Notes 2020 02 06 * [653](https://github.com/AcademySoftwareFoundation/openexr/pull/653) fix memory leak from constructor exceptions * [650](https://github.com/AcademySoftwareFoundation/openexr/pull/650) ImfAcesFile.cpp: Fix primary conversion edge case. * [649](https://github.com/AcademySoftwareFoundation/openexr/pull/649) ImfChromaticities.h/cpp: Typo and pass by ref change. * [647](https://github.com/AcademySoftwareFoundation/openexr/pull/647) fix typo and ref to theory document in InterpretingDeepPixels * [645](https://github.com/AcademySoftwareFoundation/openexr/pull/645) Various CI Updates: * [643](https://github.com/AcademySoftwareFoundation/openexr/pull/643) Various checks to improve handling of damaged input files * [642](https://github.com/AcademySoftwareFoundation/openexr/pull/642) Fixed security email address to security@openexr.org * [641](https://github.com/AcademySoftwareFoundation/openexr/pull/641) Updates to fix broken Windows build. * [640](https://github.com/AcademySoftwareFoundation/openexr/pull/640) notes from 1/9/20 and 1/16/20 * [639](https://github.com/AcademySoftwareFoundation/openexr/pull/639) Split Targets and Config and add find_package * [638](https://github.com/AcademySoftwareFoundation/openexr/pull/638) OpenEXR/ImfStdIO.[cpp h]: Added StdISStream. * [637](https://github.com/AcademySoftwareFoundation/openexr/pull/637) OpenEXR/IlmImf/ImfHuf.cpp: Fix OS dependent exr binary data for piz. * [635](https://github.com/AcademySoftwareFoundation/openexr/pull/635) Make docs install optional in CMake * [634](https://github.com/AcademySoftwareFoundation/openexr/pull/634) Add interface includes to IlmBase and OpenEXR * [631](https://github.com/AcademySoftwareFoundation/openexr/pull/631) add missing IMF_EXPORT to ImfOpenInputFile for dllexport * [629](https://github.com/AcademySoftwareFoundation/openexr/pull/629) Fixed some typos * [627](https://github.com/AcademySoftwareFoundation/openexr/pull/627) possible fix for #570: avoid writing NaNs into test images * [626](https://github.com/AcademySoftwareFoundation/openexr/pull/626) fix testB44ExpLogTable and testDwaLookups, and Makefile.am * [622](https://github.com/AcademySoftwareFoundation/openexr/pull/622) Azure and SonarCloud updates. * [620](https://github.com/AcademySoftwareFoundation/openexr/pull/620) Switch from int to size_t to prevent overflow with huge images in exrdisplay (Fix for #610) * [619](https://github.com/AcademySoftwareFoundation/openexr/pull/619) TSC meeting notes November 21, 2019 * [618](https://github.com/AcademySoftwareFoundation/openexr/pull/618) change URL to https://github.com/AcademySoftwareFoundation/openexr * [616](https://github.com/AcademySoftwareFoundation/openexr/pull/616) Fix issue 289, C++17 compatibility * [615](https://github.com/AcademySoftwareFoundation/openexr/pull/615) Add a missing break statement when determining compression in exr2aces * [613](https://github.com/AcademySoftwareFoundation/openexr/pull/613) Notes 2019 11 15 * [612](https://github.com/AcademySoftwareFoundation/openexr/pull/612) Add a 'clang-format' build target * [608](https://github.com/AcademySoftwareFoundation/openexr/pull/608) Fix #595 and others, issue with pkgconfig generation under cmake * [606](https://github.com/AcademySoftwareFoundation/openexr/pull/606) Remove all build-time header generation * [601](https://github.com/AcademySoftwareFoundation/openexr/pull/601) "Rule of 5" copy/assign/move declarations * [600](https://github.com/AcademySoftwareFoundation/openexr/pull/600) TSC Meeting Notes 2019/10/24 * [599](https://github.com/AcademySoftwareFoundation/openexr/pull/599) Prepare 2.4 release branch * [598](https://github.com/AcademySoftwareFoundation/openexr/pull/598) Fix for #571: keep all values word-aligned in IlmImfTest testLargeDataWindowOffsets * [590](https://github.com/AcademySoftwareFoundation/openexr/pull/590) TSC Meeting notes for 2019-10-17 * [588](https://github.com/AcademySoftwareFoundation/openexr/pull/588) Gitignore * [587](https://github.com/AcademySoftwareFoundation/openexr/pull/587) removed unnecessary .m4 files * [586](https://github.com/AcademySoftwareFoundation/openexr/pull/586) TSC Meeting Notes 2019-10-3 * [585](https://github.com/AcademySoftwareFoundation/openexr/pull/585) Added mission statement to README.md * [582](https://github.com/AcademySoftwareFoundation/openexr/pull/582) Azure macOS job fixes * [580](https://github.com/AcademySoftwareFoundation/openexr/pull/580) More SonarCloud "bug" fixes in Imath * [578](https://github.com/AcademySoftwareFoundation/openexr/pull/578) More fixes for SonarCloud bugs * [577](https://github.com/AcademySoftwareFoundation/openexr/pull/577) Sonar fixes in IlmImf and IlmImfTest * [576](https://github.com/AcademySoftwareFoundation/openexr/pull/576) TSC meeting notes * [575](https://github.com/AcademySoftwareFoundation/openexr/pull/575) Sonar fixes for Iex, IexTest, and ImathTest * [574](https://github.com/AcademySoftwareFoundation/openexr/pull/574) Change Azure SonarCloud job to run weekly. * [569](https://github.com/AcademySoftwareFoundation/openexr/pull/569) TSC meeting notes for the last 3 weeks * [562](https://github.com/AcademySoftwareFoundation/openexr/pull/562) CVE listing in SECURITY.md * [561](https://github.com/AcademySoftwareFoundation/openexr/pull/561) A few more NOSONAR suppressions in PyImath * [560](https://github.com/AcademySoftwareFoundation/openexr/pull/560) Clean up small number of sonarcloud bugs / warnings * [559](https://github.com/AcademySoftwareFoundation/openexr/pull/559) Change Azure SonarCloud job to run for every PR, rather than only for… * [558](https://github.com/AcademySoftwareFoundation/openexr/pull/558) Add NOSONAR comments to PyImath to suppress "self==self" bug reports. * [557](https://github.com/AcademySoftwareFoundation/openexr/pull/557) Fix warnings when _FORTIFY_SOURCE set * [556](https://github.com/AcademySoftwareFoundation/openexr/pull/556) Fix #555 * [554](https://github.com/AcademySoftwareFoundation/openexr/pull/554) Replace use of rand()/srand() with the C++11 * [553](https://github.com/AcademySoftwareFoundation/openexr/pull/553) Increase Azure timeout for SonarCloud, Linux and MacOS jobs. ### Closed Issues * [689](https://github.com/AcademySoftwareFoundation/openexr/issues/689) I was able to get OpenEXR to install by adding `-std=c++11` to the `extra_compile_flags` in setup.py, as lgritz and peterhillman suggested. Here's the file with it added: * [688](https://github.com/AcademySoftwareFoundation/openexr/issues/688) Invalid shift (141647077) * [687](https://github.com/AcademySoftwareFoundation/openexr/issues/687) ZLIB not found * [686](https://github.com/AcademySoftwareFoundation/openexr/issues/686) Using the example Chromacity files - issue with chromaticities * [679](https://github.com/AcademySoftwareFoundation/openexr/issues/679) mipmap / ripmap question * [674](https://github.com/AcademySoftwareFoundation/openexr/issues/674) OpenEXR_Viewers / libCg aliasing error * [671](https://github.com/AcademySoftwareFoundation/openexr/issues/671) Tiles/Ocean.exr core dumps on latest code built from git * [668](https://github.com/AcademySoftwareFoundation/openexr/issues/668) 2.4.1: test suite build is failing * [665](https://github.com/AcademySoftwareFoundation/openexr/issues/665) openexr/OpenEXR_Viewers/config/LocateCg.cmake issue on Linux * [663](https://github.com/AcademySoftwareFoundation/openexr/issues/663) 2.4.1: missing dist tar balls * [654](https://github.com/AcademySoftwareFoundation/openexr/issues/654) build breaks backwards compatibility * [651](https://github.com/AcademySoftwareFoundation/openexr/issues/651) ImfChromaticities.cpp: Revisiting the == and != operators * [648](https://github.com/AcademySoftwareFoundation/openexr/issues/648) find_package macro redefinition conflicts with vcpkg macro on Windows. * [633](https://github.com/AcademySoftwareFoundation/openexr/issues/633) ImfStdIO.[cpp h]: Missing StdISStream class * [632](https://github.com/AcademySoftwareFoundation/openexr/issues/632) Platform/OS dependent piz compressed binary data * [630](https://github.com/AcademySoftwareFoundation/openexr/issues/630) OpenEXR loading not making use of multiple threads * [628](https://github.com/AcademySoftwareFoundation/openexr/issues/628) Missing C++11 type traits for half * [625](https://github.com/AcademySoftwareFoundation/openexr/issues/625) OPENEXR_DLL issues * [623](https://github.com/AcademySoftwareFoundation/openexr/issues/623) Documentation : Typo in "Interpreting Deep Pixels" * [617](https://github.com/AcademySoftwareFoundation/openexr/issues/617) Move openexr repo to AcademySoftwareFoundation organization * [611](https://github.com/AcademySoftwareFoundation/openexr/issues/611) How to force Python3 build on Linux * [610](https://github.com/AcademySoftwareFoundation/openexr/issues/610) huge images cause bad_array_new_length exception in exrdisplay * [607](https://github.com/AcademySoftwareFoundation/openexr/issues/607) Getting started... build & hello world. * [604](https://github.com/AcademySoftwareFoundation/openexr/issues/604) PyIlmBaseConfig not in export set? * [595](https://github.com/AcademySoftwareFoundation/openexr/issues/595) Broken pkgconfig files when building with cmake * [594](https://github.com/AcademySoftwareFoundation/openexr/issues/594) Python modules are not linked to Boost::python * [593](https://github.com/AcademySoftwareFoundation/openexr/issues/593) Python modules are not installed with cmake * [584](https://github.com/AcademySoftwareFoundation/openexr/issues/584) OpenEXR CLAs * [581](https://github.com/AcademySoftwareFoundation/openexr/issues/581) ImfCompressor.h is not installed * [579](https://github.com/AcademySoftwareFoundation/openexr/issues/579) ImfFrameBuffer.h not compatible with C++98 code * [573](https://github.com/AcademySoftwareFoundation/openexr/issues/573) Linker cannot find "boost_python-vc140-mt-x64-1_66.lib" on Windows. * [572](https://github.com/AcademySoftwareFoundation/openexr/issues/572) "IlmImf-2_3.dll" shared library is not built anymore in 2.3.0. * [571](https://github.com/AcademySoftwareFoundation/openexr/issues/571) Test failure on ARMv7 * [570](https://github.com/AcademySoftwareFoundation/openexr/issues/570) Test failure on i686 * [567](https://github.com/AcademySoftwareFoundation/openexr/issues/567) CMake builds produce invalid pkg-config files * [566](https://github.com/AcademySoftwareFoundation/openexr/issues/566) throwErrno symbols missing when Iex is linked before other libraries statically * [565](https://github.com/AcademySoftwareFoundation/openexr/issues/565) 2.4.0 tarball signature missing * [564](https://github.com/AcademySoftwareFoundation/openexr/issues/564) CVE-2006-2277 * [563](https://github.com/AcademySoftwareFoundation/openexr/issues/563) CVE-2016-4629 and CVE-2016-4630 * [555](https://github.com/AcademySoftwareFoundation/openexr/issues/555) cmake errors when used as sub-project via add_subdirectory() ### Commits \[ git log v2.4.0...v2.5.0\] * [``b12ea7f3``](https://github.com/AcademySoftwareFoundation/openexr/commit/b12ea7f30d624d51f1b69a2ffa9159a4f07a7974) Pthreads: Some stuff @meshula overlooked. ([Gregorio Litenstein](@g.litenstein@gmail.com) 2020-05-04) * [``af8864d2``](https://github.com/AcademySoftwareFoundation/openexr/commit/af8864d259d3ef523fc75eaab4f9a74b0f3b092c) pthreads: Fix CMake/Autotools to check for them ([Gregorio Litenstein](@g.litenstein@gmail.com) 2020-05-04) * [``2ef3d626``](https://github.com/AcademySoftwareFoundation/openexr/commit/2ef3d6265a56cd1ca7c4112a616db6987f134c4a) Pthreads: Some stuff @meshula overlooked. ([Gregorio Litenstein](@g.litenstein@gmail.com) 2020-05-04) * [``3ab677bd``](https://github.com/AcademySoftwareFoundation/openexr/commit/3ab677bd375db896215459a49de77ac87fbbb19c) A clean version of #673: Allow the use of Pthreads with WIN32/64 builds under MinGW ([Cary Phillips](@cary@ilm.com) 2020-05-01) * [``4bb99704``](https://github.com/AcademySoftwareFoundation/openexr/commit/4bb99704799830f1be1fa8cde559e3f2f63068a1) added recent commits and PR's to 2.5.0 release notes ([Cary Phillips](@cary@ilm.com) 2020-04-30) * [``ac4fb158``](https://github.com/AcademySoftwareFoundation/openexr/commit/ac4fb15895447ce042528cc965ce2b242d130311) fixed wording of OpenEXR_Viewers in 2.5.0 release notes. ([Cary Phillips](@cary@ilm.com) 2020-04-29) * [``c0542060``](https://github.com/AcademySoftwareFoundation/openexr/commit/c0542060df75e5726e0b51ecc1de01aa29b3b448) fixed spacing in 2.5.0 release notes ([Cary Phillips](@cary@ilm.com) 2020-04-28) * [``c65d0d87``](https://github.com/AcademySoftwareFoundation/openexr/commit/c65d0d8708e99758a7f10fb1b4596d53298a52bb) Added summary of changes to 2.5.0 release notes. ([Cary Phillips](@cary@ilm.com) 2020-04-28) * [``275ab234``](https://github.com/AcademySoftwareFoundation/openexr/commit/275ab2341081d32160298b01ef903eb4befce8c9) added merged PR's and closed issues to 2.5.0 release notes ([Cary Phillips](@cary@ilm.com) 2020-04-27) * [``99bcaf5a``](https://github.com/AcademySoftwareFoundation/openexr/commit/99bcaf5aba87eb0c987f5e43e279d1f72ad8b953) added 2.5.0 commits to release notes ([Cary Phillips](@cary@ilm.com) 2020-04-27) * [``70202128``](https://github.com/AcademySoftwareFoundation/openexr/commit/70202128342b5daf0e97b227c923cb573edecff5) Update SECURITY.md to note that CVE-2020-* are not in v2.2.2 ([Cary Phillips](@cary@ilm.com) 2020-04-29) * [``8ab7adbc``](https://github.com/AcademySoftwareFoundation/openexr/commit/8ab7adbc2b4c0fca637a7115344f5f34c6f26139) Release notes for 2.2.2 ([Cary Phillips](@cary@ilm.com) 2020-04-29) * [``72e9ff25``](https://github.com/AcademySoftwareFoundation/openexr/commit/72e9ff25d8e843f6a475a2e81b8aae0df04d3a25) TSC meeting notes 4-23-20 ([Cary Phillips](@cary@ilm.com) 2020-04-23) * [``656a3a5c``](https://github.com/AcademySoftwareFoundation/openexr/commit/656a3a5c60394880b50081c95c4ca0ab2cf4143e) Add cmake option to install PyIlmBase pkg-config file ([Cary Phillips](@cary@ilm.com) 2020-03-05) * [``2a82f18c``](https://github.com/AcademySoftwareFoundation/openexr/commit/2a82f18c83a17cf1e98d6d9349779a150f5bdc3c) fixed typos in README.md ([Cary Phillips](@cary@ilm.com) 2020-04-29) * [``27f45978``](https://github.com/AcademySoftwareFoundation/openexr/commit/27f459781b6a3cb69727397bb989e8dc2aa8850c) Bump version to 2.5.0 ([Cary Phillips](@cary@ilm.com) 2020-04-28) * [``72cc6e02``](https://github.com/AcademySoftwareFoundation/openexr/commit/72cc6e02e991771db075d5c5e6a184325be47b0a) Fix to make Boost_NO_BOOST_CMAKE a cache variable ([Mark Sisson](@5761292+marksisson@users.noreply.github.com) 2020-04-26) * [``b9199b51``](https://github.com/AcademySoftwareFoundation/openexr/commit/b9199b5155ab8c1d245ddeb61006b1bf2de66d84) Fix python module install on macos ([Mark Sisson](@5761292+marksisson@users.noreply.github.com) 2020-04-26) * [``0b26caf6``](https://github.com/AcademySoftwareFoundation/openexr/commit/0b26caf6c33656d38cf10f7a090d3713ac4ee291) TSC meeting notes 4-16-20 ([Cary Phillips](@cary@ilm.com) 2020-04-16) * [``9d8bb109``](https://github.com/AcademySoftwareFoundation/openexr/commit/9d8bb109968cd169765f1da7b2022a6b6b3a93f0) Implemented all tests transferable to the 2x2 matrix case from 3x3. Added needed functionality to ensure boost::python worked for testing. ([Owen Thompson](@oxt3479@rit.edu) 2020-04-09) * [``713e6ce5``](https://github.com/AcademySoftwareFoundation/openexr/commit/713e6ce54babdd4181c23d7d0e6c8bb00164a953) Implemented additional C++ functionality needed to pass 2x2 testing parameters: extracting euler angles and overloaded vector multiplication. ([Owen Thompson](@oxt3479@rit.edu) 2020-04-09) * [``1b20f7bd``](https://github.com/AcademySoftwareFoundation/openexr/commit/1b20f7bd7dc1a8bf37200d46f84645c613513c4a) Wrote tests transferable to the 2x2 cases in C++ ([Owen Thompson](@oxt3479@rit.edu) 2020-04-09) * [``d404df49``](https://github.com/AcademySoftwareFoundation/openexr/commit/d404df499a32b63ab57f48177d275806ea8addd5) Matrix22 template constructor and make identity no longer use memset. ([Owen Thompson](@oxt3479@rit.edu) 2020-03-30) * [``f20e1602``](https://github.com/AcademySoftwareFoundation/openexr/commit/f20e1602d64b03397bc54425ff7f5be2e3214aff) Implementation of operator << on Matrix22 for stream output. ([Owen Thompson](@oxt3479@rit.edu) 2020-03-30) * [``c5a10a77``](https://github.com/AcademySoftwareFoundation/openexr/commit/c5a10a776c8655dbcbe241a3496952c4c3787071) Implementation of arbitrarily transferable functions from 3x3 to 2x2. Removed gaus-jordan and other problematic operations (doesn't work on 2x2) ([Owen Thompson](@oxt3479@rit.edu) 2020-03-24) * [``308f1076``](https://github.com/AcademySoftwareFoundation/openexr/commit/308f1076d001e573a9fbf240bb85995aaea1ce2c) fixed spacing ([Cary Phillips](@cary@ilm.com) 2020-04-16) * [``a2392101``](https://github.com/AcademySoftwareFoundation/openexr/commit/a2392101e8101bed90fc3370e8840d208dd88c02) update with new CVE's ([Cary Phillips](@cary@ilm.com) 2020-04-16) * [``d7da549e``](https://github.com/AcademySoftwareFoundation/openexr/commit/d7da549e1561002d9d278960fdc537f7c535376c) edited GSoC discussion ([Cary Phillips](@cary@ilm.com) 2020-04-03) * [``c4d27400``](https://github.com/AcademySoftwareFoundation/openexr/commit/c4d27400c51db899b35b4fb729815e17054391ea) typo ([Cary Phillips](@cary@ilm.com) 2020-04-02) * [``c76f4c8d``](https://github.com/AcademySoftwareFoundation/openexr/commit/c76f4c8d3feb670c14a4320f6c171deea4c750da) added John ([Cary Phillips](@cary@ilm.com) 2020-04-02) * [``e9ff88bb``](https://github.com/AcademySoftwareFoundation/openexr/commit/e9ff88bb1d3de0d19029d159ac9d1414b790b88c) typo. ([Cary Phillips](@cary@ilm.com) 2020-04-02) * [``b0f4dc48``](https://github.com/AcademySoftwareFoundation/openexr/commit/b0f4dc4849910819b4d54a895823591057e9d2a5) TSC meeting notes 4/2/2020 ([Cary Phillips](@cary@ilm.com) 2020-04-02) * [``fa435e2a``](https://github.com/AcademySoftwareFoundation/openexr/commit/fa435e2afe5fce3f5e26220bc46474b8775c6716) Fix libc++abi.dylib: Pure virtual function called! ([dgmzc](@dorian.gmz@hotmail.com) 2020-03-10) * [``e23fdf6e``](https://github.com/AcademySoftwareFoundation/openexr/commit/e23fdf6e02dbd8157b1d468143a82f6632781dee) Typo in INSTALL.md: cmake now builds three modules, not four. ([Cary Phillips](@cary@ilm.com) 2020-03-05) * [``0132627f``](https://github.com/AcademySoftwareFoundation/openexr/commit/0132627f3e46fd376c785e223abbc3f5e418ae5e) added some details. ([Cary Phillips](@cary@ilm.com) 2020-03-05) * [``23c7e72c``](https://github.com/AcademySoftwareFoundation/openexr/commit/23c7e72cb25daa3820d9745d9f49c86320316082) TSC Meeting notes 3/5/2020 ([Cary Phillips](@cary@ilm.com) 2020-03-05) * [``6780843d``](https://github.com/AcademySoftwareFoundation/openexr/commit/6780843d9da05e5f7bebab2bda9dd437cc4a1909) fixed a/an use in Matrix33 and Matrix44 ([Phyrexian](@jarko.paska@gmail.com) 2020-03-05) * [``560f7c2e``](https://github.com/AcademySoftwareFoundation/openexr/commit/560f7c2e0eb1e4adec40884eb6126585d08e70f5) Remove OpenEXR_Viewers from the cmake build files and from the INSTALL.md instructions. ([Cary Phillips](@cary@ilm.com) 2020-02-27) * [``01fa5a20``](https://github.com/AcademySoftwareFoundation/openexr/commit/01fa5a20dde82849203117bfe5de2b2cb21d84a4) TSC meeting notes for 2/27/2020 ([Cary Phillips](@cary@ilm.com) 2020-02-27) * [``d2639ab3``](https://github.com/AcademySoftwareFoundation/openexr/commit/d2639ab3bb60b7b316d6f7893446e38591bd9f3e) Add interface includes to IlmBase and OpenEXR ([Harry Mallon](@hjmallon@gmail.com) 2020-01-07) * [``6da250f6``](https://github.com/AcademySoftwareFoundation/openexr/commit/6da250f63d8460788a8b6bb2a642d9c981ab2bb8) Fix cmake install failing when install dir contains spaces, fix symlinks for shared libraries on DLL platforms ([Simon Boorer](@sboorer@ilm.com) 2020-02-26) * [``6d26cbfc``](https://github.com/AcademySoftwareFoundation/openexr/commit/6d26cbfc1c453c79513b0dad5704fed13e76feda) Split Targets and Config and add find_package ([Harry Mallon](@hjmallon@gmail.com) 2020-01-07) * [``2f92fcbb``](https://github.com/AcademySoftwareFoundation/openexr/commit/2f92fcbb4fb25caafe4358d1c4a4c7b940016af4) ImfChromaticities.cpp: Add back white to equality ops. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-02-20) * [``d2deb6d8``](https://github.com/AcademySoftwareFoundation/openexr/commit/d2deb6d8844814615fed247048d36898e7f4c407) IlmImfTest/testExistingStreams.cpp: Test for Imf::StdOSStream/StdISStream. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-02-26) * [``9a172a22``](https://github.com/AcademySoftwareFoundation/openexr/commit/9a172a220d59dd4363f4c07bac59facae9a1ae6f) OpenEXR/ImfStdIO.[cpp h]: Added StdISStream. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-01-10) * [``d9019d81``](https://github.com/AcademySoftwareFoundation/openexr/commit/d9019d81a74ac7cf8710bb72590200369686856d) CLA docs moved from "docs" to "contributors" ([Cary Phillips](@cary@ilm.com) 2020-02-24) * [``48c21063``](https://github.com/AcademySoftwareFoundation/openexr/commit/48c2106310c8edefc7c1387cffc466665e4f38d2) ImfAcesFile.cpp: Remove redundant equality check. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-02-07) * [``adc21e52``](https://github.com/AcademySoftwareFoundation/openexr/commit/adc21e5250cf938ecd6bf6fcbcfb4e7da7382671) ImfAcesFile.cpp: Fix primary conversion edge case. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-01-31) * [``3576a8bd``](https://github.com/AcademySoftwareFoundation/openexr/commit/3576a8bd16ba36ad20832b5727d3fe9ff210dd0d) TSC meeting notes 2/20/2020 ([Cary Phillips](@cary@ilm.com) 2020-02-20) * [``817faac5``](https://github.com/AcademySoftwareFoundation/openexr/commit/817faac5c18a7c9e66ae2adb9e3f312ff3e7f631) fix unitialised pointer and double-delete bugs (#661) ([peterhillman](@peterh@wetafx.co.nz) 2020-02-24) * [``a0e84f62``](https://github.com/AcademySoftwareFoundation/openexr/commit/a0e84f62def6276f38e518a2724d9f7ac4daa9ad) add help and options information IlmImfTest and IlmImfFuzzTest ([Peter Hillman](@peterh@wetafx.co.nz) 2020-02-13) * [``608b4938``](https://github.com/AcademySoftwareFoundation/openexr/commit/608b4938fb23861cf6e6792ecf8373e0c9a8ebb5) support reloading broken files with IlmImfFuzzTest ([Peter Hillman](@peterh@wetafx.co.nz) 2020-02-11) * [``d129fae9``](https://github.com/AcademySoftwareFoundation/openexr/commit/d129fae907a2928f675b1c654f9c8a32a84103b2) Added #659 and associated commit to 2.4.1 release notes. ([Cary Phillips](@cary@ilm.com) 2020-02-10) * [``b6bef538``](https://github.com/AcademySoftwareFoundation/openexr/commit/b6bef53821384c82ebd0912513be3e4579d1c176) Release notes for 2.4.1 patch release. ([Cary Phillips](@cary@ilm.com) 2020-02-06) * [``0ca9b6e8``](https://github.com/AcademySoftwareFoundation/openexr/commit/0ca9b6e855d32a794874b1624581d68fcc3f87c0) Added #659 and associated commit to 2.4.1 release notes. ([Cary Phillips](@cary@ilm.com) 2020-02-10) * [``a966db03``](https://github.com/AcademySoftwareFoundation/openexr/commit/a966db0341369108c6f85bdd92b44ef26265f43b) Release notes for 2.4.1 patch release. ([Cary Phillips](@cary@ilm.com) 2020-02-06) * [``d06c223f``](https://github.com/AcademySoftwareFoundation/openexr/commit/d06c223f2e9f36766ef7dbec89954393a3b0ba0b) exrdisplay: limit maximum image size based on available screen resolution ([Peter Hillman](@peterh@wetafx.co.nz) 2020-02-10) * [``e79d2296``](https://github.com/AcademySoftwareFoundation/openexr/commit/e79d2296496a50826a15c667bf92bdc5a05518b4) fix memory leaks and invalid memory accesses ([Peter Hillman](@peterh@wetafx.co.nz) 2020-02-08) * [``2c37c4bd``](https://github.com/AcademySoftwareFoundation/openexr/commit/2c37c4bd39d3b03248cca42c63d0adbc40827c58) Fix yet more memory leaks from constructor exceptions (#658) ([peterhillman](@peterh@wetafx.co.nz) 2020-02-09) * [``3422b344``](https://github.com/AcademySoftwareFoundation/openexr/commit/3422b344f6189e499fe4c00f11491843a23d24a4) fix crash with damaged EXR files (#656) ([peterhillman](@peterh@wetafx.co.nz) 2020-02-08) * [``5754217f``](https://github.com/AcademySoftwareFoundation/openexr/commit/5754217fc506efad20f0ccb509ac447c7c68b671) typo in date. ([Cary Phillips](@cary@ilm.com) 2020-02-06) * [``7f183953``](https://github.com/AcademySoftwareFoundation/openexr/commit/7f18395337d9a439246370245eb585e5c2efaa6c) TSC meeting notes for Feb 6, 2020 ([Cary Phillips](@cary@ilm.com) 2020-02-06) * [``cdc70f60``](https://github.com/AcademySoftwareFoundation/openexr/commit/cdc70f60c525c533aefa2b0663b9e0b723cad463) ImfChromaticities.h/cpp: Typo and pass by ref change. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-01-31) * [``51bd0ff5``](https://github.com/AcademySoftwareFoundation/openexr/commit/51bd0ff530fb20586c4bf95241d035f237792989) fix memory leak from constructor exceptions (#653) ([peterhillman](@peterh@wetafx.co.nz) 2020-02-07) * [``88246d99``](https://github.com/AcademySoftwareFoundation/openexr/commit/88246d991e0318c043e6f584f7493da08a31f9f8) OpenEXR/IlmImfTest/testHuf.cpp: Do the compressVerify() on deterministic data sets. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-01-17) * [``0042c451``](https://github.com/AcademySoftwareFoundation/openexr/commit/0042c45171aeff6ec2d165c4c2621514f055d380) OpenEXR/IlmImf/ImfHuf.cpp: Fix OS dependent exr binary data for piz. ([Arkell Rasiah](@arasiah@pixsystem.com) 2020-01-10) * [``89ce46f3``](https://github.com/AcademySoftwareFoundation/openexr/commit/89ce46f38c5e658d21df9179c1641c496cab7396) force x/y Sampling to 1 for Deep Scanline Images ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-28) * [``0a1aa55e``](https://github.com/AcademySoftwareFoundation/openexr/commit/0a1aa55ef108169c933ddaa631c1f6cb02b69050) minor tweaks and typo fixes ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-28) * [``acad98d6``](https://github.com/AcademySoftwareFoundation/openexr/commit/acad98d6d3e787f36012a3737c23c42c7f43a00f) missing header for ptrdiff_t ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-24) * [``c14af4bb``](https://github.com/AcademySoftwareFoundation/openexr/commit/c14af4bb58c8748cfe2f132147ba38abd0845812) fix test suite memory leak from testDeepTiledBasic ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-24) * [``a8508ab0``](https://github.com/AcademySoftwareFoundation/openexr/commit/a8508ab05ffeedba394e646506030f94769e0f15) test for multipart threading was leaking memory ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-24) * [``b673e6ad``](https://github.com/AcademySoftwareFoundation/openexr/commit/b673e6ad0ec6cef94d86b9586244d26088a3d792) Fix cleanup when DeepScanLineInputFile constructor throws ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-24) * [``53a06468``](https://github.com/AcademySoftwareFoundation/openexr/commit/53a06468ef5a08f4f2beb2d264a20547d7a78753) fixes to memory leak when constructors throw exceptions ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-23) * [``d4fbaad4``](https://github.com/AcademySoftwareFoundation/openexr/commit/d4fbaad4efe5d0ddf325da44ecbab105ebb2954e) fix memory leak in test suite ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-23) * [``dea0ef1e``](https://github.com/AcademySoftwareFoundation/openexr/commit/dea0ef1ee7b2f4d2aa42ffba7b442e5d8051222b) fix memory leak on DeepTiledInput files: compressor for sample count table wasn't deleted ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-23) * [``2ae5f837``](https://github.com/AcademySoftwareFoundation/openexr/commit/2ae5f8376b0a6c3e2bb100042f5de79503ba837a) fix check for valid ruleSize ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-23) * [``a6408c90``](https://github.com/AcademySoftwareFoundation/openexr/commit/a6408c90339bdf19f89476578d7f936b741be9b2) avoid creating compression object just to compute numLinesInBuffer ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-23) * [``e7c26f6e``](https://github.com/AcademySoftwareFoundation/openexr/commit/e7c26f6ef5bf7ae8ea21ecf19963186cd1391720) abort when file claims to have excessive scanline data requirements ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-22) * [``b1c34c49``](https://github.com/AcademySoftwareFoundation/openexr/commit/b1c34c496b62117115b1089b18a44e0031800a09) fix memory leak when reading damaged PIZ files ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-22) * [``ea334989``](https://github.com/AcademySoftwareFoundation/openexr/commit/ea3349896d4a8a3b523e8f3b830334a85240b1e6) sanity check data reads from PIZ data ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-21) * [``43cd3ad4``](https://github.com/AcademySoftwareFoundation/openexr/commit/43cd3ad47d53356da6ae2e983e47c8313aebf72e) improve bad count detection in huf decompress ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-21) * [``801272c9``](https://github.com/AcademySoftwareFoundation/openexr/commit/801272c9bf8b84a66c62f1e8a4490ece81da6a56) check for bad bit counts in Huff encoded data ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-21) * [``7a52d40a``](https://github.com/AcademySoftwareFoundation/openexr/commit/7a52d40ae23c148f27116cb1f6e897b9143b372c) bypass SSE optimization when skipping subsampled channels ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-21) * [``b9997d0c``](https://github.com/AcademySoftwareFoundation/openexr/commit/b9997d0c045fa01af3d2e46e1a74b07cc4519446) prevent int overflow when calculating buffer offsets ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``822e218c``](https://github.com/AcademySoftwareFoundation/openexr/commit/822e218c795e989abdf74112b924d0da8acc967b) exrmakepreview: switch preview-to-full scaling vars from floats to doubles to prevent rounding causing overflows ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``3eda5d70``](https://github.com/AcademySoftwareFoundation/openexr/commit/3eda5d70aba127bae9bd6bae9956fcf024b64031) fixes for DWA uncompress: sanity check unknown data reading, off-by-one error on max suffix string length ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``37750013``](https://github.com/AcademySoftwareFoundation/openexr/commit/37750013830def57f19f3c3b7faaa9fc1dae81b3) Sanity check for input buffer overruns in RLE uncompress ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``df987cab``](https://github.com/AcademySoftwareFoundation/openexr/commit/df987cabc20c90803692022fd232def837cb88cc) validate tiles have valid headers when raw reading tiles ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``6bad53af``](https://github.com/AcademySoftwareFoundation/openexr/commit/6bad53af7eebed507564dd5fc90320e4c6a6c0bc) Force tile sizes to be less than INT_MAX bytes, in line with the maximum dimensions of data windows ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-20) * [``1cbf6b9a``](https://github.com/AcademySoftwareFoundation/openexr/commit/1cbf6b9a4497f71586ac11dc60ed21cf0cc529bd) fix typo and ref to theory document in InterpretingDeepPixels ([Peter Hillman](@peterh@wetafx.co.nz) 2020-01-28) * [``6546ff20``](https://github.com/AcademySoftwareFoundation/openexr/commit/6546ff20961003825f86662efe16842ff6a64f32) Various CI Updates: - fix python warnings. - fix Cmake include(clang_format) error - added Linux VFX 2020 builds - removed MacOS 10.13 due to Azure ending support - temporarily disable gcov in Sonar, due to SC regression CPP-2395 ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2020-01-25) * [``f9229e98``](https://github.com/AcademySoftwareFoundation/openexr/commit/f9229e98c93b4bc0179bb12904d03071cc5a8718) Updates to fix broken Windows build. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2020-01-20) * [``fce8c17b``](https://github.com/AcademySoftwareFoundation/openexr/commit/fce8c17b3731fd3212c8fba52fecfea597eb98fa) possible fix for #570: avoid writing NaNs into test images ([Peter Hillman](@peterh@wetafx.co.nz) 2019-11-29) * [``9750a1db``](https://github.com/AcademySoftwareFoundation/openexr/commit/9750a1db7f92be3def678977eb741b6762316580) fix testB44ExpLogTable and testDwaLookups, and Makefile.am ([Peter Hillman](@peterh@wetafx.co.nz) 2019-11-29) * [``bd6ab91f``](https://github.com/AcademySoftwareFoundation/openexr/commit/bd6ab91f6002e90c17c385391e17c06c7ea1dfb8) use Int64 types for width*height calculations in exrdisplay ([Peter Hillman](@peterh@wetafx.co.nz) 2019-11-25) * [``5adac705``](https://github.com/AcademySoftwareFoundation/openexr/commit/5adac705e18de43008ec0ecb562969ede2a7a927) Switch from int to size_t to prevent overflow with huge images ([Peter Hillman](@peterh@wetafx.co.nz) 2019-11-25) * [``b1477e0e``](https://github.com/AcademySoftwareFoundation/openexr/commit/b1477e0eea3d9e901012795bed2f499c96e028dc) added Rod to TSC notes ([Cary Phillips](@cary@ilm.com) 2019-11-14) * [``220f9d4b``](https://github.com/AcademySoftwareFoundation/openexr/commit/220f9d4b2a36c994b9043aa785b1970ad652b8f1) TSC notes 2019-11-15 ([Cary Phillips](@cary@ilm.com) 2019-11-14) * [``93a4c794``](https://github.com/AcademySoftwareFoundation/openexr/commit/93a4c794950c042ee025f8c4250e1c5b34c18af8) Don't change CMAKE_MODULE_PATH ([Larry Gritz](@lg@larrygritz.com) 2019-11-24) * [``18d7b6a1``](https://github.com/AcademySoftwareFoundation/openexr/commit/18d7b6a184718a6bb7a0583ae072f507b83bab66) typo ([Larry Gritz](@lg@larrygritz.com) 2019-11-14) * [``66f48992``](https://github.com/AcademySoftwareFoundation/openexr/commit/66f48992ddd1401f8e9f4f876a737c2c62c209f8) Add a 'clang-format' build target ([Larry Gritz](@lg@larrygritz.com) 2019-11-12) * [``63fdd366``](https://github.com/AcademySoftwareFoundation/openexr/commit/63fdd36686baf1fd69990309ae43128fb2ab3f16) notes from 1/9/20 and 1/16/20 ([Cary Phillips](@cary@ilm.com) 2020-01-16) * [``56b248ec``](https://github.com/AcademySoftwareFoundation/openexr/commit/56b248ec86499992488b549863d4ef1bc6eb459f) fixed typo in CONTRIBUTING.md ([Cary Phillips](@cary@ilm.com) 2020-01-24) * [``7e6e6f0b``](https://github.com/AcademySoftwareFoundation/openexr/commit/7e6e6f0b1244450c5da2a4e8caed8febd19e1d95) Reference SECURITY.md in CONTRIBUTING.md ([John Mertic](@jmertic@linuxfoundation.org) 2020-01-21) * [``fbe08034``](https://github.com/AcademySoftwareFoundation/openexr/commit/fbe08034eebf9eff192d4068ffbdb807351a3c46) Fixed security email address to security@openexr.org ([John Mertic](@jmertic@linuxfoundation.org) 2020-01-21) * [``8f43dd55``](https://github.com/AcademySoftwareFoundation/openexr/commit/8f43dd559609a2b1f8787b922c1e5a87a8057838) TSC meeting notes November 21, 2019 ([Cary Phillips](@cary@ilm.com) 2019-11-21) * [``767d497c``](https://github.com/AcademySoftwareFoundation/openexr/commit/767d497c09d9a20dea4c510fc997b6393d52c33d) add missing IMF_EXPORT to ImfOpenInputFile in order to be able to use it from a windows dll ([Laurens Voerman](@l.voerman@rug.nl) 2019-12-12) * [``7bd899ac``](https://github.com/AcademySoftwareFoundation/openexr/commit/7bd899ac6f90efe5348518389d944856b5a73c7e) Make docs install optional in CMake ([Harry Mallon](@hjmallon@gmail.com) 2020-01-08) * [``afa84f87``](https://github.com/AcademySoftwareFoundation/openexr/commit/afa84f87ae24546f71a0e9ffac400e92a8da8b99) Fixed typos ([John Mertic](@jmertic@linuxfoundation.org) 2019-12-04) * [``b65a275f``](https://github.com/AcademySoftwareFoundation/openexr/commit/b65a275f189ee679c1e252c60085e8ceadce929f) Fixed some typos ([John Mertic](@jmertic@linuxfoundation.org) 2019-12-04) * [``824ed557``](https://github.com/AcademySoftwareFoundation/openexr/commit/824ed557b3c59288a685356c708e5806b1122fe1) Updated SonarCloud properties/token and README status widgets. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-11-26) * [``c02742f2``](https://github.com/AcademySoftwareFoundation/openexr/commit/c02742f28c23226352bd5d2050a282fbe9b868e1) change URL to https://github.com/AcademySoftwareFoundation/openexr ([Cary Phillips](@cary@ilm.com) 2019-11-21) * [``2ae3d476``](https://github.com/AcademySoftwareFoundation/openexr/commit/2ae3d476ac19f6aa9950bb7beffdb10dbd120308) change URL to https://github.com/AcademySoftwareFoundation/openexr ([Cary Phillips](@cary@ilm.com) 2019-11-21) * [``1296f73c``](https://github.com/AcademySoftwareFoundation/openexr/commit/1296f73cac143eaa50ee87ae1947129e4ce740cf) Add a missing break statement when determining compression in exr2aces ([karlhendrikse](@karlhendrikse@gmail.com) 2019-11-20) * [``780c2230``](https://github.com/AcademySoftwareFoundation/openexr/commit/780c22304e2b1419d5d5267183e4dfc39dcd7373) Fix issue 289, C++17 compatibility ([Nick Porcino](@nporcino@pixar.com) 2019-11-20) * [``d778a0b4``](https://github.com/AcademySoftwareFoundation/openexr/commit/d778a0b47b18fe1ede3824fe013cea9dd7404360) add toFloat.h and eLut.h to SOURCES ([Cary Phillips](@cary@ilm.com) 2019-11-02) * [``d80927be``](https://github.com/AcademySoftwareFoundation/openexr/commit/d80927bebec8c38147c3614f1d3c7df898beebbf) move dwaLookups.h declarations to the OPENEXR_IMF_INTERNAL_NAMESPACE ([Cary Phillips](@cary@ilm.com) 2019-11-02) * [``36edde92``](https://github.com/AcademySoftwareFoundation/openexr/commit/36edde927a831686040f6c97a8f080ff13aa4759) add b44ExpLogTable.h and dwaLookups.h as official headers ([Cary Phillips](@cary@ilm.com) 2019-11-02) * [``00bf05cd``](https://github.com/AcademySoftwareFoundation/openexr/commit/00bf05cd090e4ac4a79877962abf26869c6c1672) add toFloat.h and eLut.h as source files ([Cary Phillips](@cary@ilm.com) 2019-11-01) * [``861aad16``](https://github.com/AcademySoftwareFoundation/openexr/commit/861aad165e78c4281dae8306f108ede2ae15322c) typo from previous commit: operator= wasn't returning a value ([Cary Phillips](@cary@ilm.com) 2019-11-03) * [``03b464a0``](https://github.com/AcademySoftwareFoundation/openexr/commit/03b464a01aedbc6607f0f3ca0cb5a61cfac78e12) mvoe TestType and TestTypedAttribute to OPENEXR_IMF_INTERNAL_NAMESPACE ([Cary Phillips](@cary@ilm.com) 2019-11-03) * [``9a5c8d4f``](https://github.com/AcademySoftwareFoundation/openexr/commit/9a5c8d4f41dd6e972f9a03860b0a42d136609364) remove const from arg declaration in move-constructors/move-assignments ([Cary Phillips](@cary@ilm.com) 2019-11-03) * [``b7857b96``](https://github.com/AcademySoftwareFoundation/openexr/commit/b7857b96aed4f29ee1605caf1e56e60fa2dd4389) =default copy/move/assign for TypedAttribute ([Cary Phillips](@cary@ilm.com) 2019-11-03) * [``fa2e4585``](https://github.com/AcademySoftwareFoundation/openexr/commit/fa2e4585ea960d77ec220c5f13de00da7edbdcb6) SonarCloud-inspired fixes ([Cary Phillips](@cary@ilm.com) 2019-10-25) * [``19cd1014``](https://github.com/AcademySoftwareFoundation/openexr/commit/19cd10142a399fc9ddce863acc3dc46ec2b703b5) SonarCloud-inspired bug fixes: ([Cary Phillips](@cary@ilm.com) 2019-10-24) * [``64f145a0``](https://github.com/AcademySoftwareFoundation/openexr/commit/64f145a05135aefaac3e9e467be80869ffa276fe) More SonarCloud-inspired fixes: ([Cary Phillips](@cary@ilm.com) 2019-10-24) * [``5c985fcf``](https://github.com/AcademySoftwareFoundation/openexr/commit/5c985fcf79d38188caae4ccb75b2f77718a44298) SonarCloud-inspired fixes ([Cary Phillips](@cary@ilm.com) 2019-10-24) * [``8e7ba0fa``](https://github.com/AcademySoftwareFoundation/openexr/commit/8e7ba0fafa53ba91d9aa8382af4652c905d5cea0) sonar fixes ([Cary Phillips](@cary@ilm.com) 2019-10-21) * [``ba3d5efb``](https://github.com/AcademySoftwareFoundation/openexr/commit/ba3d5efb6bfdadb4d0c489dac89ef1d0aa3996b8) sonar fixes ([Cary Phillips](@cary@ilm.com) 2019-10-21) * [``031199cd``](https://github.com/AcademySoftwareFoundation/openexr/commit/031199cd4fc062dd7bfe902c6552cf22f6bfbbdb) Fix overzealous removal of if statements breaking all builds except win32 ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``8228578d``](https://github.com/AcademySoftwareFoundation/openexr/commit/8228578da6f86d17b9a2a3f8c6053f8b4ee3fb71) Handle python2 not being installed, but python3 being present ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``d10895ef``](https://github.com/AcademySoftwareFoundation/openexr/commit/d10895ef0ad25dd60e68a2ab00bab7c0592f8c5b) Fix issue with defines not being set correctly for win32 ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``b303f678``](https://github.com/AcademySoftwareFoundation/openexr/commit/b303f6788a434fd61e52c1bacb93a96c4c3440ea) Re-enable Boost_NO_BOOST_CMAKE by default, document, clean up status messages ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``8ec1440c``](https://github.com/AcademySoftwareFoundation/openexr/commit/8ec1440cbd999f17457be605150bc53395fbb334) Set CMP0074 such that people who set Boost_ROOT won't get warnings ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``28d1cb25``](https://github.com/AcademySoftwareFoundation/openexr/commit/28d1cb256f1b46f120adb131e606b2699acc72d7) ensure paths are canonicalized by get_filename_component prior to comparing ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``34ce16c2``](https://github.com/AcademySoftwareFoundation/openexr/commit/34ce16c2653d02fcef6a297a2a61112dbf693922) Fix issue with drive letter under windows ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [``650da0d6``](https://github.com/AcademySoftwareFoundation/openexr/commit/650da0d63410d863c4a0aed15a6bee1b46b559cb) Extract to function, protect against infinite loop ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [``df768ec8``](https://github.com/AcademySoftwareFoundation/openexr/commit/df768ec8a97adb82947fc4b92a199db9a38c044c) Fixes #593, others - issues with pyilmbase install ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-05) * [``ed4807b9``](https://github.com/AcademySoftwareFoundation/openexr/commit/ed4807b9e4dc8d94ce79d0b2ed36acc548bee57e) Take DESTDIR into account when creating library symlinks ([Antonio Rojas](@arojas@archlinux.org) 2019-10-19) * [``f1b017c8``](https://github.com/AcademySoftwareFoundation/openexr/commit/f1b017c8029b529c5c5ed01b6ad1b10a0e48036c) No longer install ImfMisc.h ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``a571bdfe``](https://github.com/AcademySoftwareFoundation/openexr/commit/a571bdfe42866a1f1c579114e2fcae8318172c21) add boost to python module link library ([Jens Lindgren](@lindgren_jens@hotmail.com) 2019-10-22) * [``cf8b35c9``](https://github.com/AcademySoftwareFoundation/openexr/commit/cf8b35c9bbde9ea78036af2fda04a7c6e9c9a399) Fix overzealous removal of if statements breaking all builds except win32 ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``44266538``](https://github.com/AcademySoftwareFoundation/openexr/commit/442665384d44e464c68381d560f08bea295b9e04) Handle python2 not being installed, but python3 being present ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``1eb2df5a``](https://github.com/AcademySoftwareFoundation/openexr/commit/1eb2df5aa219a819153bb891dc4488875259fb28) Fix issue with defines not being set correctly for win32 ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``8a05994a``](https://github.com/AcademySoftwareFoundation/openexr/commit/8a05994a86fabf39f18890928ee5cef1913fa85a) Re-enable Boost_NO_BOOST_CMAKE by default, document, clean up status messages ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``40e68bb9``](https://github.com/AcademySoftwareFoundation/openexr/commit/40e68bb9f38bf791594ccbaf1320ec520f58180b) Set CMP0074 such that people who set Boost_ROOT won't get warnings ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``b021db40``](https://github.com/AcademySoftwareFoundation/openexr/commit/b021db409cfe52a9f28ad432897552bee735aeee) ensure paths are canonicalized by get_filename_component prior to comparing ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [``7e0714f2``](https://github.com/AcademySoftwareFoundation/openexr/commit/7e0714f279fdb42956235bf4141c59f382b6c3a1) Fix issue with drive letter under windows ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [``89dceca8``](https://github.com/AcademySoftwareFoundation/openexr/commit/89dceca80dc28fbabf262e38c9e1acf4863d97f6) Extract to function, protect against infinite loop ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [``599e5211``](https://github.com/AcademySoftwareFoundation/openexr/commit/599e52119d01004d6c5252f1070073fbd1518bfa) Fixes #593, others - issues with pyilmbase install ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-05) * [``0b26a9de``](https://github.com/AcademySoftwareFoundation/openexr/commit/0b26a9dedda4924841323677f1ce0bce37bfbeb4) Fix #595 and others, issue with pkgconfig generation under cmake ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-05) * [``4e54bde7``](https://github.com/AcademySoftwareFoundation/openexr/commit/4e54bde78f65c0fef8a9f794aaacea07813fba09) Take DESTDIR into account when creating library symlinks ([Antonio Rojas](@arojas@archlinux.org) 2019-10-19) * [``a2c12ec3``](https://github.com/AcademySoftwareFoundation/openexr/commit/a2c12ec3619de1923de86436c134be458523e5fd) No longer install ImfMisc.h ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``04aa9d33``](https://github.com/AcademySoftwareFoundation/openexr/commit/04aa9d332718748da0afa30dbb66e03b9ea789ab) formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``29af8e8b``](https://github.com/AcademySoftwareFoundation/openexr/commit/29af8e8b50373d3bb8de38486ac3973f9758575d) formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``9c876646``](https://github.com/AcademySoftwareFoundation/openexr/commit/9c8766467bb738787dd2bdde527f3391d2da7058) formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``b79e44c6``](https://github.com/AcademySoftwareFoundation/openexr/commit/b79e44c6e2c41b2e7362f0d7b5517ea1ce4b56e8) formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``d31c84e3``](https://github.com/AcademySoftwareFoundation/openexr/commit/d31c84e3f2db70dd247578ea2cdbd3d3ae3c4157) formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``b459acdc``](https://github.com/AcademySoftwareFoundation/openexr/commit/b459acdc485e8f1cc280700157642a607637eb4d) README formatting tweaks ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``c5931e54``](https://github.com/AcademySoftwareFoundation/openexr/commit/c5931e548d354c45a9107f690bc81a9b8400ea76) image tweak ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``c0469c8c``](https://github.com/AcademySoftwareFoundation/openexr/commit/c0469c8c44e59eb33f51db4c1480415b5713fa40) tweak image ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``15d8706b``](https://github.com/AcademySoftwareFoundation/openexr/commit/15d8706bc2692b05a5818de142644dfa3dca26d9) tweak to image in README.md ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``e993b8f4``](https://github.com/AcademySoftwareFoundation/openexr/commit/e993b8f434c8f663a0b095ba819f9f77e9f7e888) tweaks to the mission statement ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [``df4315a4``](https://github.com/AcademySoftwareFoundation/openexr/commit/df4315a4ecafd2190387cdcc73e3ba9caaec296f) updated mission statement in README.md ([Cary Phillips](@cary@ilm.com) 2019-10-21) * [``5147f255``](https://github.com/AcademySoftwareFoundation/openexr/commit/5147f255c43049e2ff38dba903b8db4c350a6a35) Added mission statement to README.md ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``4527b6f3``](https://github.com/AcademySoftwareFoundation/openexr/commit/4527b6f351bca040a70470b93d67704e5b30d5f3) typo ([Cary Phillips](@cary@ilm.com) 2019-10-24) * [``ca31d92e``](https://github.com/AcademySoftwareFoundation/openexr/commit/ca31d92e5a8f0dbd19a1cbf428432adc4a67e63e) TSC Meeting notes 2019-10-24 ([Cary Phillips](@cary@ilm.com) 2019-10-24) * [``4273e84f``](https://github.com/AcademySoftwareFoundation/openexr/commit/4273e84f86fe27392dec53a5cef900caf6727154) Update Azure build to work with new branch. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-26) * [``e53ebd3e``](https://github.com/AcademySoftwareFoundation/openexr/commit/e53ebd3ef677ab983f83f927f6525efcb5dcb995) Fix int32 overflow bugs with deep images ([Larry Gritz](@lg@larrygritz.com) 2019-10-17) * [``486ff105``](https://github.com/AcademySoftwareFoundation/openexr/commit/486ff10547d034530c5190bbef6181324b42c209) Prepare 2.4 release branch ([Larry Gritz](@lg@larrygritz.com) 2019-10-24) * [``c1c82f7d``](https://github.com/AcademySoftwareFoundation/openexr/commit/c1c82f7d2582fb74ad53e5cd1b6525e8dcdfa492) add boost to python module link library ([Jens Lindgren](@lindgren_jens@hotmail.com) 2019-10-22) * [``a3c246b3``](https://github.com/AcademySoftwareFoundation/openexr/commit/a3c246b335d44fef35a66f6da36444d9f812bbf5) keep all values word-aligned in IlmImfTest testLargeDataWindowOffsets ([Peter Hillman](@peterh@wetafx.co.nz) 2019-10-24) * [``5db03642``](https://github.com/AcademySoftwareFoundation/openexr/commit/5db0364244d0e27a44dc245f8a0c686d76471e91) fix Contrib/DtexToExr/DtexToExr in .gitignore ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``a4b69af6``](https://github.com/AcademySoftwareFoundation/openexr/commit/a4b69af6a714f7a267da90d2cd934c2bb89dc56e) add PyIlmBaseConfigInternal.h and Contrib/DtexToExr to .gitignore ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``eadfbf82``](https://github.com/AcademySoftwareFoundation/openexr/commit/eadfbf82875cce8106047c933c0b053809a8ff74) Fix int32 overflow bugs with deep images ([Larry Gritz](@lg@larrygritz.com) 2019-10-17) * [``eef4c99d``](https://github.com/AcademySoftwareFoundation/openexr/commit/eef4c99d08f7b31a5d392024031a4e4b447df1b5) TSC Meeting notes for 2019-10-17 ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``046b2f75``](https://github.com/AcademySoftwareFoundation/openexr/commit/046b2f75700044e6b581cba437e0f86a6f9d625c) TSC Meeting Notes 2019-10-3 ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``e65b3890``](https://github.com/AcademySoftwareFoundation/openexr/commit/e65b38903bc4259295f042b4f3f442ba2aca7deb) removed unnecessary .m4 files ([Cary Phillips](@cary@ilm.com) 2019-10-17) * [``cb162323``](https://github.com/AcademySoftwareFoundation/openexr/commit/cb16232387a8dabf75797ff8d3015594a7a87abe) Fixed various MacOS Azure pipeline issues, all tests run now. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-09) * [``aef48d68``](https://github.com/AcademySoftwareFoundation/openexr/commit/aef48d6811df5d1ba1a446df0c4d039444d18b32) Fix links ([John Mertic](@jmertic@linuxfoundation.org) 2019-10-14) * [``7e7e0d47``](https://github.com/AcademySoftwareFoundation/openexr/commit/7e7e0d476e3ab0a38df50c387964ead1f8896433) Explicitly define destructors. Suppress SonarCloud bug reports for array index operators. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-07) * [``d8fc18e8``](https://github.com/AcademySoftwareFoundation/openexr/commit/d8fc18e8edd6d7db055975f6ad0a02d185c188eb) Removed unreachable return statement. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-07) * [``a2a133ad``](https://github.com/AcademySoftwareFoundation/openexr/commit/a2a133ad266a1d65ad5410f43f2949a43834a8f6) More NOSONAR suppressions in PyImath. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-07) * [``2b64316c``](https://github.com/AcademySoftwareFoundation/openexr/commit/2b64316c8272111120b628d1395200b4107c7d64) Change 'a!=a' to std::isnan() to fix Sonar "bug", added infinity checks ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-07) * [``bf1288de``](https://github.com/AcademySoftwareFoundation/openexr/commit/bf1288def9c09176cdf6658a58934ec018e33d24) Fix static analysis warning re: potential null pointer dereference. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-03) * [``247dbacd``](https://github.com/AcademySoftwareFoundation/openexr/commit/247dbacd5ddde6766f6362a3109ea721f378fc4a) Edit macro to use only a single instance of '#'. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-03) * [``e2860cec``](https://github.com/AcademySoftwareFoundation/openexr/commit/e2860cec59853ba5552f4dc39e55b341f362e54e) Remove unreached 'return'. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-03) * [``6337096e``](https://github.com/AcademySoftwareFoundation/openexr/commit/6337096e825036c2da04a3bca76c506610bfb21b) Remove unnecessary break statements. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-03) * [``e1ff97f1``](https://github.com/AcademySoftwareFoundation/openexr/commit/e1ff97f15755963b4dd19aba052d4321af0c58f1) TSC meeting notes for the last 3 weeks ([Cary Phillips](@cary@ilm.com) 2019-09-24) * [``2f4937ba``](https://github.com/AcademySoftwareFoundation/openexr/commit/2f4937baf455feabe1bb0c837c7aa776aaa60bd3) fixed date of last TSC meeting ([Cary Phillips](@cary@ilm.com) 2019-10-02) * [``9a4a0c56``](https://github.com/AcademySoftwareFoundation/openexr/commit/9a4a0c567be8dd9e8d237ea7e8409041070e0e2b) TSC meeting notes from 9/26/2019 ([Cary Phillips](@cary@ilm.com) 2019-10-02) * [``4dec0313``](https://github.com/AcademySoftwareFoundation/openexr/commit/4dec0313570f021661302ae776d25edb1950ba97) TSC meeting notes for the last 3 weeks ([Cary Phillips](@cary@ilm.com) 2019-09-24) * [``f82e1989``](https://github.com/AcademySoftwareFoundation/openexr/commit/f82e1989f462e535e571aca2bf3f78edf9dde28e) Added tests for all exception types derived from BaseExc. ([Cary Phillips](@cary@ilm.com) 2019-09-22) * [``a82c4c23``](https://github.com/AcademySoftwareFoundation/openexr/commit/a82c4c23d4b3db281db3bba109b3ec272dccb109) operator = (const BaseExc& be) throw () = delete; ([Cary Phillips](@cary@ilm.com) 2019-09-22) * [``09a14a9e``](https://github.com/AcademySoftwareFoundation/openexr/commit/09a14a9ee3ec9ee2d030e7da3d5b36c01c7cc303) change floating-point loop variables to iterate on a fixed-size array. ([Cary Phillips](@cary@ilm.com) 2019-09-22) * [``bd7a04f7``](https://github.com/AcademySoftwareFoundation/openexr/commit/bd7a04f7c75e6392595e00895c720524aae82ec3) Change Azure SonarCloud job to run weekly. ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-09-29) * [``8dd91127``](https://github.com/AcademySoftwareFoundation/openexr/commit/8dd9112733ae15f1c108b64124e6c77a11f3eb83) removed references to the CVE's that are not specific to OpenEXR ([Cary Phillips](@cary@ilm.com) 2019-09-20) * [``33d1ac61``](https://github.com/AcademySoftwareFoundation/openexr/commit/33d1ac61d46c075171cb37cccc21736ab4cf03d8) CVE listing in SECURITY.md ([Cary Phillips](@cary@ilm.com) 2019-09-19) ## Version 2.4.3 (May 17, 2021) Patch release that addresses the following security vulnerabilities: * [CVE-2021-20296](https://nvd.nist.gov/vuln/detail/CVE-2021-20296) Segv on unknown address in Imf_2_5::hufUncompress - Null Pointer dereference ([817](https://github.com/AcademySoftwareFoundation/openexr/pull/817)) * [CVE-2021-3479](https://nvd.nist.gov/vuln/detail/CVE-2021-3479) Out-of-memory in openexr_exrenvmap_fuzzer ([830](https://github.com/AcademySoftwareFoundation/openexr/pull/830)) * [CVE-2021-3478](https://nvd.nist.gov/vuln/detail/CVE-2021-3478) Out-of-memory in openexr_exrcheck_fuzzer ([863](https://github.com/AcademySoftwareFoundation/openexr/pull/863)) * [CVE-2021-3477](https://nvd.nist.gov/vuln/detail/CVE-2021-3477) Heap-buffer-overflow in Imf_2_5::DeepTiledInputFile::readPixelSampleCounts ([861](https://github.com/AcademySoftwareFoundation/openexr/pull/861)) * [CVE-2021-3476](https://nvd.nist.gov/vuln/detail/CVE-2021-3476) Undefined-shift in Imf_2_5::unpack14 ([832](https://github.com/AcademySoftwareFoundation/openexr/pull/832)) * [CVE-2021-3475](https://nvd.nist.gov/vuln/detail/CVE-2021-3475) Integer-overflow in Imf_2_5::calculateNumTiles ([825](https://github.com/AcademySoftwareFoundation/openexr/pull/825)) * [CVE-2021-3474](https://nvd.nist.gov/vuln/detail/CVE-2021-3474) Undefined-shift in Imf_2_5::FastHufDecoder::FastHufDecoder ([818](https://github.com/AcademySoftwareFoundation/openexr/pull/818)) Also: * [1013](https://github.com/AcademySoftwareFoundation/openexr/pull/1013) Fixed regression in Imath::succf() and Imath::predf() when negative values are given ## Version 2.4.2 (June 15, 2020) This is a patch release that includes fixes for the following security vulnerabilities: * [CVE-2020-15305](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15305) Invalid input could cause a heap-use-after-free error in DeepScanLineInputFile::DeepScanLineInputFile() * [CVE-2020-15306](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15306) Invalid chunkCount attributes could cause heap buffer overflow in getChunkOffsetTableSize() * [CVE-2020-15304](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15304) Invalid tiled input file could cause invalid memory access TiledInputFile::TiledInputFile() * OpenEXRConfig.h now correctly sets OPENEXR_PACKAGE_STRING to "OpenEXR" (rather than "IlmBase") ### Merged Pull Requests * [755](https://github.com/AcademySoftwareFoundation/openexr/pull/755) Fix OPENEXR_PACKAGE_NAME * [738](https://github.com/AcademySoftwareFoundation/openexr/pull/738) always ignore chunkCount attribute unless it cannot be computed * [730](https://github.com/AcademySoftwareFoundation/openexr/pull/730) fix #728 - missing 'throw' in deepscanline error handling * [727](https://github.com/AcademySoftwareFoundation/openexr/pull/727) check null pointer in broken tiled file handling ## Version 2.4.1 (February 11, 2020) Patch release with minor bug fixes. ### Summary * Various fixes for memory leaks and invalid memory accesses * Various fixes for integer overflow with large images. * Various cmake fixes for build/install of python modules. * ImfMisc.h is no longer installed, since it's a private header. ### Security Vulnerabilities This version fixes the following security vulnerabilities: * [CVE-2020-11765](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11765) There is an off-by-one error in use of the ImfXdr.h read function by DwaCompressor::Classifier::ClasGsifier, leading to an out-of-bounds read. * [CVE-2020-11764](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11764) There is an out-of-bounds write in copyIntoFrameBuffer in ImfMisc.cpp. * [CVE-2020-11763](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11763) There is an std::vector out-of-bounds read and write, as demonstrated by ImfTileOffsets.cpp. * [CVE-2020-11762](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11762) There is an out-of-bounds read and write in DwaCompressor::uncompress in ImfDwaCompressor.cpp when handling the UNKNOWN compression case. * [CVE-2020-11761](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11761) There is an out-of-bounds read during Huffman uncompression, as demonstrated by FastHufDecoder::refill in ImfFastHuf.cpp. * [CVE-2020-11760](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11760) There is an out-of-bounds read during RLE uncompression in rleUncompress in ImfRle.cpp. * [CVE-2020-11759](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11759) Because of integer overflows in CompositeDeepScanLine::Data::handleDeepFrameBuffer and readSampleCountForLineBlock, an attacker can write to an out-of-bounds pointer. * [CVE-2020-11758](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11758) There is an out-of-bounds read in ImfOptimizedPixelReading.h. ### Merged Pull Requests * [659](https://github.com/AcademySoftwareFoundation/openexr/pull/659) fix memory leaks and invalid memory accesses * [609](https://github.com/AcademySoftwareFoundation/openexr/pull/609) Fixes #593, others - issues with pyilmbase install * [605](https://github.com/AcademySoftwareFoundation/openexr/pull/605) No longer install ImfMisc.h * [603](https://github.com/AcademySoftwareFoundation/openexr/pull/603) Update Azure build to work with new RB-2.4 branch. * [596](https://github.com/AcademySoftwareFoundation/openexr/pull/596) Add Boost::Python to Python modules link libraries * [592](https://github.com/AcademySoftwareFoundation/openexr/pull/592) Take DESTDIR into account when creating library symlinks * [589](https://github.com/AcademySoftwareFoundation/openexr/pull/589) Fix int32 overflow bugs with deep images ### Commits \[ git log v2.4.0...v2.4.1\] * [fix memory leaks and invalid memory accesses](https://github.com/AcademySoftwareFoundation/openexr/commit/e79d2296496a50826a15c667bf92bdc5a05518b4) ([Peter Hillman](@peterh@wetafx.co.nz) 2020-02-08) * [Fix overzealous removal of if statements breaking all builds except win32](https://github.com/AcademySoftwareFoundation/openexr/commit/031199cd4fc062dd7bfe902c6552cf22f6bfbbdb) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [Handle python2 not being installed, but python3 being present](https://github.com/AcademySoftwareFoundation/openexr/commit/8228578da6f86d17b9a2a3f8c6053f8b4ee3fb71) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [Fix issue with defines not being set correctly for win32](https://github.com/AcademySoftwareFoundation/openexr/commit/d10895ef0ad25dd60e68a2ab00bab7c0592f8c5b) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [Re-enable Boost_NO_BOOST_CMAKE by default, document, clean up status messages](https://github.com/AcademySoftwareFoundation/openexr/commit/b303f6788a434fd61e52c1bacb93a96c4c3440ea) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [Set CMP0074 such that people who set Boost_ROOT won't get warnings](https://github.com/AcademySoftwareFoundation/openexr/commit/8ec1440cbd999f17457be605150bc53395fbb334) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [ensure paths are canonicalized by get_filename_component prior to comparing](https://github.com/AcademySoftwareFoundation/openexr/commit/28d1cb256f1b46f120adb131e606b2699acc72d7) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-07) * [Fix issue with drive letter under windows](https://github.com/AcademySoftwareFoundation/openexr/commit/34ce16c2653d02fcef6a297a2a61112dbf693922) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [Extract to function, protect against infinite loop](https://github.com/AcademySoftwareFoundation/openexr/commit/650da0d63410d863c4a0aed15a6bee1b46b559cb) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-06) * [Fixes #593, others - issues with pyilmbase install](https://github.com/AcademySoftwareFoundation/openexr/commit/df768ec8a97adb82947fc4b92a199db9a38c044c) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-11-05) * [Take DESTDIR into account when creating library symlinks](https://github.com/AcademySoftwareFoundation/openexr/commit/ed4807b9e4dc8d94ce79d0b2ed36acc548bee57e) ([Antonio Rojas](@arojas@archlinux.org) 2019-10-19) * [No longer install ImfMisc.h](https://github.com/AcademySoftwareFoundation/openexr/commit/f1b017c8029b529c5c5ed01b6ad1b10a0e48036c) ([Cary Phillips](@cary@ilm.com) 2019-10-31) * [add boost to python module link library](https://github.com/AcademySoftwareFoundation/openexr/commit/a571bdfe42866a1f1c579114e2fcae8318172c21) ([Jens Lindgren](@lindgren_jens@hotmail.com) 2019-10-22) * [Update Azure build to work with new branch.](https://github.com/AcademySoftwareFoundation/openexr/commit/4273e84f86fe27392dec53a5cef900caf6727154) ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-10-26) * [Fix int32 overflow bugs with deep images](https://github.com/AcademySoftwareFoundation/openexr/commit/e53ebd3ef677ab983f83f927f6525efcb5dcb995) ([Larry Gritz](@lg@larrygritz.com) 2019-10-17) * [Prepare 2.4 release branch](https://github.com/AcademySoftwareFoundation/openexr/commit/486ff10547d034530c5190bbef6181324b42c209) ([Larry Gritz](@lg@larrygritz.com) 2019-10-24) ## Version 2.4.0 (September 19, 2019) ### Summary * Completely re-written CMake configuration files * Improved support for building on Windows, via CMake * Improved support for building on macOS, via CMake * All code compiles without warnings on gcc, clang, msvc * Cleanup of license and copyright notices * floating-point exception handling is disabled by default * New Slice::Make method to reliably compute base pointer for a slice. * Miscellaneous bug fixes ### Security Vulnerabilities This version fixes the following security vulnerabilities: * [CVE-2020-16589](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-16589) A head-based buffer overflow exists in Academy Software Foundation OpenEXR 2.3.0 in writeTileData in ImfTiledOutputFile.cpp that can cause a denial of service via a crafted EXR file. * [CVE-2020-16588](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-16588) A Null Pointer Deference issue exists in Academy Software Foundation OpenEXR 2.3.0 in generatePreview in makePreview.cpp that can cause a denial of service via a crafted EXR file. * [CVE-2020-16587](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-16587) A heap-based buffer overflow vulnerability exists in Academy Software Foundation OpenEXR 2.3.0 in chunkOffsetReconstruction in ImfMultiPartInputFile.cpp that can cause a denial of service via a crafted EXR file. * [CVE-2018-18444](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-18444) makeMultiView.cpp in exrmultiview in OpenEXR 2.3.0 has an out-of-bounds write, leading to an assertion failure or possibly unspecified other impact. * [CVE-2018-18443](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-18443) OpenEXR 2.3.0 has a memory leak in ThreadPool in IlmBase/IlmThread/IlmThreadPool.cpp, as demonstrated by exrmultiview. ### Closed Issues * [529](https://github.com/AcademySoftwareFoundation/openexr/issues/529) The OpenEXR_viewer can't be installed successfully due to the Cg support * [511](https://github.com/AcademySoftwareFoundation/openexr/issues/511) A confused problem in the EXR to JPEG * [494](https://github.com/AcademySoftwareFoundation/openexr/issues/494) SEGV exrmakepreview in ImfTiledOutputFile.cpp:458 * [493](https://github.com/AcademySoftwareFoundation/openexr/issues/493) SEGV exrmakepreview in makePreview.cpp:132 * [491](https://github.com/AcademySoftwareFoundation/openexr/issues/491) SEGV exrheader in ImfMultiPartInputFile.cpp:579 * [488](https://github.com/AcademySoftwareFoundation/openexr/issues/488) Wiki has outdated info * [462](https://github.com/AcademySoftwareFoundation/openexr/issues/462) Inconsistent line terminators (CRLF) * [461](https://github.com/AcademySoftwareFoundation/openexr/issues/461) Wrong LC_RPATH after make install (cmake setup on macos) * [457](https://github.com/AcademySoftwareFoundation/openexr/issues/457) New CMake setup fails on cmake 3.12 * [455](https://github.com/AcademySoftwareFoundation/openexr/issues/455) Build for mac using cmake to Xcode fails to compile * [449](https://github.com/AcademySoftwareFoundation/openexr/issues/449) OpenEXR.cpp:36:10: fatal error: 'ImathBox.h' file not found * [424](https://github.com/AcademySoftwareFoundation/openexr/issues/424) Integrating with OSS-Fuzz * [421](https://github.com/AcademySoftwareFoundation/openexr/issues/421) How to normalize multi-channel exr image? * [400](https://github.com/AcademySoftwareFoundation/openexr/issues/400) Create security@openexr.com and info@openexr.com addresses * [398](https://github.com/AcademySoftwareFoundation/openexr/issues/398) Document CVE's in CHANGES.md release notes file * [396](https://github.com/AcademySoftwareFoundation/openexr/issues/396) Set up a CREDITS.md file * [395](https://github.com/AcademySoftwareFoundation/openexr/issues/395) Migrate CLA's from openexr.com to the GitHub repo * [394](https://github.com/AcademySoftwareFoundation/openexr/issues/394) Properly document the OpenEXR coding style * [393](https://github.com/AcademySoftwareFoundation/openexr/issues/393) Set up CODEOWNERS file * [389](https://github.com/AcademySoftwareFoundation/openexr/issues/389) fix -Wall compiler warnings * [388](https://github.com/AcademySoftwareFoundation/openexr/issues/388) OpenEXR build fails with multiple errors * [381](https://github.com/AcademySoftwareFoundation/openexr/issues/381) Replace deprecated FindPythonLibs in CMakeLists.txt * [380](https://github.com/AcademySoftwareFoundation/openexr/issues/380) undefined symbol: _ZTIN7Iex_2_27BaseExcE * [379](https://github.com/AcademySoftwareFoundation/openexr/issues/379) ZLIB_LIBRARY ZLIB_INCLUDE_DIR being ignored (LNK2019 errors) in OpenEXR\IlmImf\IlmImf.vcxproj * [377](https://github.com/AcademySoftwareFoundation/openexr/issues/377) 2.3.0: test suite is failing * [364](https://github.com/AcademySoftwareFoundation/openexr/issues/364) Standalone build of openexr on windows - (with already installed ilmbase) * [363](https://github.com/AcademySoftwareFoundation/openexr/issues/363) `OpenEXRSettings.cmake` is missing from the release tarball * [362](https://github.com/AcademySoftwareFoundation/openexr/issues/362) Cmake macro `SET_ILMBASE_INCLUDE_DIRS` assumes * [360](https://github.com/AcademySoftwareFoundation/openexr/issues/360) Specified Boost.Python not found on Boost versions < 1.67 * [359](https://github.com/AcademySoftwareFoundation/openexr/issues/359) [VS2015] Compile error C2782: 'ssize_t' in PyImathFixedMatrix * [357](https://github.com/AcademySoftwareFoundation/openexr/issues/357) Move ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT to a private header * [353](https://github.com/AcademySoftwareFoundation/openexr/issues/353) Add --with-cg-libdir option to support arch dependant Cg library paths * [352](https://github.com/AcademySoftwareFoundation/openexr/issues/352) buffer-overflow * [351](https://github.com/AcademySoftwareFoundation/openexr/issues/351) Out of Memory * [350](https://github.com/AcademySoftwareFoundation/openexr/issues/350) heap-buffer-overflow * [348](https://github.com/AcademySoftwareFoundation/openexr/issues/348) Possible compile/install issues in PyIlmBase with multiple jobs * [343](https://github.com/AcademySoftwareFoundation/openexr/issues/343) CMake issues on Windows * [342](https://github.com/AcademySoftwareFoundation/openexr/issues/342) IlmImf CMake dependency issue * [340](https://github.com/AcademySoftwareFoundation/openexr/issues/340) Cannot figure out how to build OpenEXR under mingw64 with v2.3.0 * [333](https://github.com/AcademySoftwareFoundation/openexr/issues/333) openexr 2.3.0 static cmake build broken. * [302](https://github.com/AcademySoftwareFoundation/openexr/issues/302) Error when linking Half project: unresolved external symbol "private: static union half::uif const * const half::_toFloat" (?_toFloat@half@@0QBTuif@1@B) * [301](https://github.com/AcademySoftwareFoundation/openexr/issues/301) How to link different IlmBase library names according to Debug/Release configuration, when building OpenEXR with CMake + VS2015? * [294](https://github.com/AcademySoftwareFoundation/openexr/issues/294) Problem building OpenEXR-2.2.1 in Visual Studio 2015 x64 * [290](https://github.com/AcademySoftwareFoundation/openexr/issues/290) Out Of Memory in Pxr24Compressor (79678745) * [288](https://github.com/AcademySoftwareFoundation/openexr/issues/288) Out of Memory in B44Compressor (79258415) * [282](https://github.com/AcademySoftwareFoundation/openexr/issues/282) IlmBase should link pthread * [281](https://github.com/AcademySoftwareFoundation/openexr/issues/281) Error in installing OpenEXR * [276](https://github.com/AcademySoftwareFoundation/openexr/issues/276) The savanah.nongnu.org tar.gz hosting * [274](https://github.com/AcademySoftwareFoundation/openexr/issues/274) Cmake installation of ilmbase places .dll files under `/lib` instead of `/bin` * [271](https://github.com/AcademySoftwareFoundation/openexr/issues/271) heap-buffer-overflow * [270](https://github.com/AcademySoftwareFoundation/openexr/issues/270) Out of Memory in TileOffsets (73566621) * [268](https://github.com/AcademySoftwareFoundation/openexr/issues/268) Invalid Shift at FastHufDecoder (72367575) * [267](https://github.com/AcademySoftwareFoundation/openexr/issues/267) Cast Overflow at FastHufDecoder (72375479) * [266](https://github.com/AcademySoftwareFoundation/openexr/issues/266) Divide by Zero at calculateNumTiles (72239767) * [265](https://github.com/AcademySoftwareFoundation/openexr/issues/265) Signed Integer Overflow in getTiledChunkOffsetTableSize (72377177) * [264](https://github.com/AcademySoftwareFoundation/openexr/issues/264) Signed Integer Overflow in calculateNumTiles (73181093) * [263](https://github.com/AcademySoftwareFoundation/openexr/issues/263) Signed Integer Overflow in chunkOffsetReconstruction (72873449, 73090589) * [262](https://github.com/AcademySoftwareFoundation/openexr/issues/262) Heap Out-of-Bounds write in Imf_2_2::copyIntoFrameBuffer (72940266) * [261](https://github.com/AcademySoftwareFoundation/openexr/issues/261) Heap Out of Bounds Read in TiledInputFile (72228841) * [259](https://github.com/AcademySoftwareFoundation/openexr/issues/259) Heap Out of Bounds Access (72839282) * [257](https://github.com/AcademySoftwareFoundation/openexr/issues/257) Out of Memory / Invalid allocation in lmfArray resizeErase (72828572, 72837441) * [255](https://github.com/AcademySoftwareFoundation/openexr/issues/255) Process for reporting security bugs * [254](https://github.com/AcademySoftwareFoundation/openexr/issues/254) [VS 2015] Can't run tests and OpenVDB compile errors * [253](https://github.com/AcademySoftwareFoundation/openexr/issues/253) C++11-style compile-time type information for `half`. * [252](https://github.com/AcademySoftwareFoundation/openexr/issues/252) `std::numeric_limits::digits10` value is wrong. * [250](https://github.com/AcademySoftwareFoundation/openexr/issues/250) SO version change in 2.2.1 * [246](https://github.com/AcademySoftwareFoundation/openexr/issues/246) half.h default user-provided constructor breaks c++ semantics (value/zero initialization vs default initialization) * [244](https://github.com/AcademySoftwareFoundation/openexr/issues/244) Cannot write to Z channel * [240](https://github.com/AcademySoftwareFoundation/openexr/issues/240) CpuId' was not declared in this scope * [239](https://github.com/AcademySoftwareFoundation/openexr/issues/239) pyilmbase error vs2015 with boost1.61 and python27 please help ,alse error * [238](https://github.com/AcademySoftwareFoundation/openexr/issues/238) heap-based buffer overflow in exrmaketiled * [237](https://github.com/AcademySoftwareFoundation/openexr/issues/237) Can RgbaOutputFile use 32-bit float? * [234](https://github.com/AcademySoftwareFoundation/openexr/issues/234) How to link compress2, uncompress and compress on 64 bit Windows 7 & Visual Studio 2015 when building openexr? * [232](https://github.com/AcademySoftwareFoundation/openexr/issues/232) Multiple segmentation faults CVE-2017-9110 to CVE-2017-9116 * [231](https://github.com/AcademySoftwareFoundation/openexr/issues/231) Half.h stops OpenEXR from compiling * [230](https://github.com/AcademySoftwareFoundation/openexr/issues/230) Imf::OutputFile Produce binary different files * [226](https://github.com/AcademySoftwareFoundation/openexr/issues/226) IMathExc - multiple definitions on linking. * [224](https://github.com/AcademySoftwareFoundation/openexr/issues/224) Make PyIlmBase compatible with Python 3.x * [217](https://github.com/AcademySoftwareFoundation/openexr/issues/217) Issue with optimized build compiled with Intel C/C++ compiler (ICC) * [213](https://github.com/AcademySoftwareFoundation/openexr/issues/213) AddressSanitizer CHECK failed in ImageMagick fuzz test. * [208](https://github.com/AcademySoftwareFoundation/openexr/issues/208) build issues on OSX: ImfDwaCompressorSimd.h:483:no such instruction: `vmovaps (%rsi), %ymm0' * [205](https://github.com/AcademySoftwareFoundation/openexr/issues/205) Building with VS 2015 * [202](https://github.com/AcademySoftwareFoundation/openexr/issues/202) Documentation error: File Layout "Verson Field" lists wrong bits * [199](https://github.com/AcademySoftwareFoundation/openexr/issues/199) Unexpected rpaths on macOS * [194](https://github.com/AcademySoftwareFoundation/openexr/issues/194) RLE Broken for 32-bit formats * [191](https://github.com/AcademySoftwareFoundation/openexr/issues/191) PyIlmBase Cmake unable to find Boost * [189](https://github.com/AcademySoftwareFoundation/openexr/issues/189) store to misaligned address / for type 'int64_t', which requires 8 byte alignment * [188](https://github.com/AcademySoftwareFoundation/openexr/issues/188) iex_debugTrap link error * [182](https://github.com/AcademySoftwareFoundation/openexr/issues/182) Many C4275 warning compiling on Windows * [176](https://github.com/AcademySoftwareFoundation/openexr/issues/176) Implement a canonical FindIlmbase.cmake * [166](https://github.com/AcademySoftwareFoundation/openexr/issues/166) CMake static build of OpenEXR 2.2 fails to link dwaLookups on Linux * [165](https://github.com/AcademySoftwareFoundation/openexr/issues/165) Clang compilation warnings * [164](https://github.com/AcademySoftwareFoundation/openexr/issues/164) OpenEXR.pc is not created during "configure" stage. * [163](https://github.com/AcademySoftwareFoundation/openexr/issues/163) Problems building the OpenEXR-2.2.0 * [160](https://github.com/AcademySoftwareFoundation/openexr/issues/160) Visual Studio 2013 not linking properly with IlmThread * [158](https://github.com/AcademySoftwareFoundation/openexr/issues/158) Python3 support * [150](https://github.com/AcademySoftwareFoundation/openexr/issues/150) build issue, debian 7.0 x64 * [139](https://github.com/AcademySoftwareFoundation/openexr/issues/139) configure scripts contain bashisms * [134](https://github.com/AcademySoftwareFoundation/openexr/issues/134) DWA compressor fails to compile on Win/Mac for some compiler versions * [132](https://github.com/AcademySoftwareFoundation/openexr/issues/132) Wrong namespaces used in DWA Compressor. * [125](https://github.com/AcademySoftwareFoundation/openexr/issues/125) cmake: cannot link against static ilmbase libraries * [123](https://github.com/AcademySoftwareFoundation/openexr/issues/123) cmake: allow building of static and dynamic libs at the same time * [105](https://github.com/AcademySoftwareFoundation/openexr/issues/105) Building pyilmbase 1.0.0 issues * [098](https://github.com/AcademySoftwareFoundation/openexr/issues/98) Race condition in creation of LockedTypeMap and registerAttributeTypes * [095](https://github.com/AcademySoftwareFoundation/openexr/issues/95) Compile fail with MinGW-w64 on Windows * [094](https://github.com/AcademySoftwareFoundation/openexr/issues/94) CMake does not generate "toFloat.h" with Ninja * [092](https://github.com/AcademySoftwareFoundation/openexr/issues/92) MultiPartOutputFile API fails when single part has no type * [089](https://github.com/AcademySoftwareFoundation/openexr/issues/89) gcc 4.8 compilation issues * [086](https://github.com/AcademySoftwareFoundation/openexr/issues/86) VS 2010 broken: exporting std::string subclass crashes * [079](https://github.com/AcademySoftwareFoundation/openexr/issues/79) compile openexr with mingw 64 bit * [067](https://github.com/AcademySoftwareFoundation/openexr/issues/67) testBox failure on i386 * [050](https://github.com/AcademySoftwareFoundation/openexr/issues/50) Recommended way of opening an EXR file in python? * [015](https://github.com/AcademySoftwareFoundation/openexr/issues/15) IlmImf Thread should report an 'optimal' number ofthreads to use. ### Merged Pull Requests * [541](https://github.com/AcademySoftwareFoundation/openexr/pull/541) TSC meeting notes Aug 22, 2019 * [540](https://github.com/AcademySoftwareFoundation/openexr/pull/540) Fix exports when compiling DLLs enabled with mingw * [539](https://github.com/AcademySoftwareFoundation/openexr/pull/539) Force exception handling / unwind disposition under msvc * [538](https://github.com/AcademySoftwareFoundation/openexr/pull/538) Add option to control whether pyimath uses the fp exception mechanism * [537](https://github.com/AcademySoftwareFoundation/openexr/pull/537) Set default value for buildSharedLibs * [536](https://github.com/AcademySoftwareFoundation/openexr/pull/536) Force the python binding libraries to shared * [535](https://github.com/AcademySoftwareFoundation/openexr/pull/535) Fix cmake warnings, fix check for numpy * [534](https://github.com/AcademySoftwareFoundation/openexr/pull/534) Create a "holder" object to fix stale reference to array * [533](https://github.com/AcademySoftwareFoundation/openexr/pull/533) Disable the debug postfix for the python modules * [532](https://github.com/AcademySoftwareFoundation/openexr/pull/532) explicitly add the boost includes to the target * [531](https://github.com/AcademySoftwareFoundation/openexr/pull/531) Update license for DreamWorks Lossy Compression * [530](https://github.com/AcademySoftwareFoundation/openexr/pull/530) Azure updates for MacOS/Windows/Linux * [528](https://github.com/AcademySoftwareFoundation/openexr/pull/528) brief notes of TSC meeting 2019-08-16 * [526](https://github.com/AcademySoftwareFoundation/openexr/pull/526) Fix compile warnings from the latest merges * [525](https://github.com/AcademySoftwareFoundation/openexr/pull/525) Rework boost python search logic to be simpler and more robust * [524](https://github.com/AcademySoftwareFoundation/openexr/pull/524) Fix #268, issue with right shift in fast huf decoder * [523](https://github.com/AcademySoftwareFoundation/openexr/pull/523) Address issues with mingw and win32 wide filenames * [522](https://github.com/AcademySoftwareFoundation/openexr/pull/522) 2.4.0 release notes * [520](https://github.com/AcademySoftwareFoundation/openexr/pull/520) Add missing symbol export to Slice::Make * [519](https://github.com/AcademySoftwareFoundation/openexr/pull/519) TSC meeting notes August 8, 2019 * [518](https://github.com/AcademySoftwareFoundation/openexr/pull/518) Makes building of fuzz test optional * [517](https://github.com/AcademySoftwareFoundation/openexr/pull/517) Added defines for DWAA and DWAB compression. * [516](https://github.com/AcademySoftwareFoundation/openexr/pull/516) changed AP_CPPFLAGS to AM_CPPFLAGS in PyImathNumpy/Makefile.am. * [515](https://github.com/AcademySoftwareFoundation/openexr/pull/515) add the files generated by bootstrap/configure to .gitignore. * [514](https://github.com/AcademySoftwareFoundation/openexr/pull/514) suppress SonarCloud warnings about unhandled exceptions * [512](https://github.com/AcademySoftwareFoundation/openexr/pull/512) Project documentation edits * [510](https://github.com/AcademySoftwareFoundation/openexr/pull/510) Added MacOS jobs to Azure pipeline * [509](https://github.com/AcademySoftwareFoundation/openexr/pull/509) Contrib cleanup * [503](https://github.com/AcademySoftwareFoundation/openexr/pull/503) TSC meeting notes from 7/25/2019 * [501](https://github.com/AcademySoftwareFoundation/openexr/pull/501) license and copyright fixes * [500](https://github.com/AcademySoftwareFoundation/openexr/pull/500) Fix another set of warnings that crept in during previous fix merges * [498](https://github.com/AcademySoftwareFoundation/openexr/pull/498) Fix #491, issue with part number range check reconstructing chunk off… * [497](https://github.com/AcademySoftwareFoundation/openexr/pull/497) Fix logic for 1 pixel high/wide preview images (Fixes #493) * [495](https://github.com/AcademySoftwareFoundation/openexr/pull/495) Fix for #494: validate tile coordinates when doing copyPixels * [490](https://github.com/AcademySoftwareFoundation/openexr/pull/490) Normalize library naming between cmake and autoconf * [489](https://github.com/AcademySoftwareFoundation/openexr/pull/489) Refresh of README's * [487](https://github.com/AcademySoftwareFoundation/openexr/pull/487) Azure: updated docker containers, added windows install scripts. * [486](https://github.com/AcademySoftwareFoundation/openexr/pull/486) Fix #246, add type traits check * [483](https://github.com/AcademySoftwareFoundation/openexr/pull/483) Large dataWindow Offset test: for discussion * [482](https://github.com/AcademySoftwareFoundation/openexr/pull/482) Update Azure Linux/SonarCloud jobs to work with new build * [481](https://github.com/AcademySoftwareFoundation/openexr/pull/481) rewrite of build and installation documentation in INSTALL.md * [480](https://github.com/AcademySoftwareFoundation/openexr/pull/480) Put all runtime artefacts in a single folder to help win32 find dlls * [479](https://github.com/AcademySoftwareFoundation/openexr/pull/479) Fix compile warnings * [478](https://github.com/AcademySoftwareFoundation/openexr/pull/478) Fixes #353, support for overriding Cg libdir * [477](https://github.com/AcademySoftwareFoundation/openexr/pull/477) Fix #224, imath python code such that tests pass under python3 * [476](https://github.com/AcademySoftwareFoundation/openexr/pull/476) Fix dos files to unix, part of #462 * [475](https://github.com/AcademySoftwareFoundation/openexr/pull/475) Fixes #252, incorrect math computing half digits * [474](https://github.com/AcademySoftwareFoundation/openexr/pull/474) Fixes #139 * [473](https://github.com/AcademySoftwareFoundation/openexr/pull/473) Fix missing #include for std::isnormal * [472](https://github.com/AcademySoftwareFoundation/openexr/pull/472) Add viewers library to default build * [471](https://github.com/AcademySoftwareFoundation/openexr/pull/471) Warn the user, but make PyIlmBase not fail a build by default * [470](https://github.com/AcademySoftwareFoundation/openexr/pull/470) Fix #352, issue with aspect ratio * [468](https://github.com/AcademySoftwareFoundation/openexr/pull/468) Fix #455 by not using object libraries under apple * [467](https://github.com/AcademySoftwareFoundation/openexr/pull/467) NumPy lookup logic is only in newer versions of cmake than our minimum * [466](https://github.com/AcademySoftwareFoundation/openexr/pull/466) Remove last vestiges of old ifdef for windows * [465](https://github.com/AcademySoftwareFoundation/openexr/pull/465) Fix #461, issue with macos rpath support * [463](https://github.com/AcademySoftwareFoundation/openexr/pull/463) Fix #457, (unused) policy tag only in 3.13+ of cmake, no longer needed * [460](https://github.com/AcademySoftwareFoundation/openexr/pull/460) TSC meeting notes 7/18/2019 * [459](https://github.com/AcademySoftwareFoundation/openexr/pull/459) added missing copyright notices * [458](https://github.com/AcademySoftwareFoundation/openexr/pull/458) fix for failing PyIlmBase/configure because it can't run the IlmBase test program. * [456](https://github.com/AcademySoftwareFoundation/openexr/pull/456) fix incorrect license identifier * [450](https://github.com/AcademySoftwareFoundation/openexr/pull/450) change INCLUDES to AM_CPPFLAGS, upon the recommendation of automake warnings * [448](https://github.com/AcademySoftwareFoundation/openexr/pull/448) Fixes #95, compilation issue with mingw * [447](https://github.com/AcademySoftwareFoundation/openexr/pull/447) Implements #15, request for hardware concurrency utility function * [446](https://github.com/AcademySoftwareFoundation/openexr/pull/446) Fixes #282, missing link against pthread * [444](https://github.com/AcademySoftwareFoundation/openexr/pull/444) added missing files in autoconf setup * [443](https://github.com/AcademySoftwareFoundation/openexr/pull/443) don't index empty array in testMultiPartSharedAttributes * [442](https://github.com/AcademySoftwareFoundation/openexr/pull/442) TiledInputFile only supports regular TILEDIMAGE types, not DEEPTILE... * [441](https://github.com/AcademySoftwareFoundation/openexr/pull/441) TSC meeting notes, July 7, 2019 * [440](https://github.com/AcademySoftwareFoundation/openexr/pull/440) security policy * [439](https://github.com/AcademySoftwareFoundation/openexr/pull/439) code of conduct * [438](https://github.com/AcademySoftwareFoundation/openexr/pull/438) Azure and SonarCloud setup * [437](https://github.com/AcademySoftwareFoundation/openexr/pull/437) address #271: catch scanlines with negative sizes * [436](https://github.com/AcademySoftwareFoundation/openexr/pull/436) specific check for bad size field in header attributes (related to #248) * [435](https://github.com/AcademySoftwareFoundation/openexr/pull/435) Refactor cmake * [434](https://github.com/AcademySoftwareFoundation/openexr/pull/434) Issue #262 * [433](https://github.com/AcademySoftwareFoundation/openexr/pull/433) Fix for #263: prevent overflow in multipart chunk offset reconstruction * [432](https://github.com/AcademySoftwareFoundation/openexr/pull/432) Fix for #378, bswap on read on big-endian architectures * [431](https://github.com/AcademySoftwareFoundation/openexr/pull/431) Fixed column labels in OpenEXRFileLayout document * [429](https://github.com/AcademySoftwareFoundation/openexr/pull/429) change OpaqueAttribute's _typeName field to be std::string * [428](https://github.com/AcademySoftwareFoundation/openexr/pull/428) Added Coding Style section on Type Casting. * [427](https://github.com/AcademySoftwareFoundation/openexr/pull/427) adding source .odt files for the .pdf's on the documentation page * [425](https://github.com/AcademySoftwareFoundation/openexr/pull/425) Handle exceptions, per SonarCloud rules * [423](https://github.com/AcademySoftwareFoundation/openexr/pull/423) Address #270: limit Tiled images to INT_MAX total number of tiles * [422](https://github.com/AcademySoftwareFoundation/openexr/pull/422) Add exr2aces to autoconf build script * [420](https://github.com/AcademySoftwareFoundation/openexr/pull/420) updated references to CVE's in release notes. * [417](https://github.com/AcademySoftwareFoundation/openexr/pull/417) TSC meeting notes June 27, 2019 * [416](https://github.com/AcademySoftwareFoundation/openexr/pull/416) Fix #342, copy paste bug with dependencies * [415](https://github.com/AcademySoftwareFoundation/openexr/pull/415) convert_index returns Py_ssize_t * [414](https://github.com/AcademySoftwareFoundation/openexr/pull/414) Fix part of #232, issue with pointer overflows * [413](https://github.com/AcademySoftwareFoundation/openexr/pull/413) Fix library suffix issue in cmake file for exr2aces * [412](https://github.com/AcademySoftwareFoundation/openexr/pull/412) Fix #350 - memory leak on exit * [411](https://github.com/AcademySoftwareFoundation/openexr/pull/411) Fixes the rpath setting to have the correct variable name * [410](https://github.com/AcademySoftwareFoundation/openexr/pull/410) Fixed the 2.3.0 release notes to mention that CVE-2017-12596 is fixed. * [409](https://github.com/AcademySoftwareFoundation/openexr/pull/409) Add initial rules for running clang-format on the code base * [408](https://github.com/AcademySoftwareFoundation/openexr/pull/408) Add ImfFloatVectorAttribute.h to the automake install * [406](https://github.com/AcademySoftwareFoundation/openexr/pull/406) New CI with aswfstaging/ci-base image * [405](https://github.com/AcademySoftwareFoundation/openexr/pull/405) June 20, 2019 TSC meeting notes * [404](https://github.com/AcademySoftwareFoundation/openexr/pull/404) Miscellaneous documentation improvements * [403](https://github.com/AcademySoftwareFoundation/openexr/pull/403) Added CLA forms * [402](https://github.com/AcademySoftwareFoundation/openexr/pull/402) TSC Meeting notes June 13, 2019 * [397](https://github.com/AcademySoftwareFoundation/openexr/pull/397) Updates to README.md, and initial CONTRIBUTING.md, GOVERNANCE.md, INSTALL.md * [383](https://github.com/AcademySoftwareFoundation/openexr/pull/383) Fixed formatting * [382](https://github.com/AcademySoftwareFoundation/openexr/pull/382) TSC meeting notes 2019-5-2 * [339](https://github.com/AcademySoftwareFoundation/openexr/pull/339) fix standalone and combined cmake ### Commits \[ git log v2.3.0...v2.4.0\] * [Add missing include](https://github.com/AcademySoftwareFoundation/openexr/commit/cd1b068ab1d2e2b40cb81c79e997fecfe31dfa11) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Add option to control whether pyimath uses the fp exception mechanism](https://github.com/AcademySoftwareFoundation/openexr/commit/be0df7b76106ba4b33efca289641fdeb59adb3a2) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Update license for DreamWorks Lossy Compression](https://github.com/AcademySoftwareFoundation/openexr/commit/5b64c63cef71f4542ef4e2452077f62755b66252) ([``jbradley``](@jbradley@dreamworks.com) 2019-08-19) * [Added defines for DWAA and DWAB compression.](https://github.com/AcademySoftwareFoundation/openexr/commit/1b88251b8d955124d7a5da9716ec287ef78440e5) ([Dirk Lemstra](@dirk@lemstra.org) 2019-08-08) * [TSC meeting notes Aug 22, 2019](https://github.com/AcademySoftwareFoundation/openexr/commit/9307279963b44d31152441bbe771de044329f356) ([Cary Phillips](@cary@ilm.com) 2019-08-26) * [2.4.0 release notes * Added commit history * Added table of contents Signed-off-by: Cary Phillips ](https://github.com/AcademySoftwareFoundation/openexr/commit/9fe66510bb5c353bb855b6a5bdbb6be8d3762778) ([Cary Phillips](@cary@ilm.com) 2019-08-10) * [Fix vtable insertion for win32, use new macro everywhere](https://github.com/AcademySoftwareFoundation/openexr/commit/54d46dacb88fbfa41608c7e347cffa5552742bc4) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-25) * [Use unique id, not typeid reference which may differ](https://github.com/AcademySoftwareFoundation/openexr/commit/728c26ccbd9f0700633c89c94b8328ee78f40cec) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-25) * [Force vtable into a translation unit](https://github.com/AcademySoftwareFoundation/openexr/commit/7678a9d09c45cc9ae2b9f591f3565d10a503aadd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-25) * [Fix exports when compiling DLLs enabled with mingw](https://github.com/AcademySoftwareFoundation/openexr/commit/3674dd27ce45c1f2cc11993957dccee4bdd840dd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-25) * [Force exception handling / unwind disposition under msvc](https://github.com/AcademySoftwareFoundation/openexr/commit/b4d5d867a49029e93b4b3aa6708d1fc0093613cc) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-25) * [Force the python binding libraries to shared](https://github.com/AcademySoftwareFoundation/openexr/commit/39c17b9ceef2ec05b1ebd25a9ee3f15e5fe17181) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Fix cmake warnings, fix check for numpy](https://github.com/AcademySoftwareFoundation/openexr/commit/85bde2ea9afbddffc6ffbfa597f8bb1d25b42859) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Remove unused typedef from previous failed attempt at boost python usage](https://github.com/AcademySoftwareFoundation/openexr/commit/6d5b23a258b562c29012953e13d67012a66322f0) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Create a "holder" object to fix stale reference to array](https://github.com/AcademySoftwareFoundation/openexr/commit/d2a9dec4d37143feb3b9daeb646b9e93632c5d8a) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Disable the debug postfix for the python modules](https://github.com/AcademySoftwareFoundation/openexr/commit/311ebb0485a253445c7324b3d42eaadd01ceb8b4) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [explicitly add the boost includes to the target as Boost::headers does not seem to](https://github.com/AcademySoftwareFoundation/openexr/commit/bdedcc6361da71e7512f978d4017a1fbb25ace92) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Set default value for buildSharedLibs](https://github.com/AcademySoftwareFoundation/openexr/commit/62427d2dc3d3ee147e01e6d0e3b2119f37dfa689) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-24) * [Azure updates for MacOS/Windows/Linux](https://github.com/AcademySoftwareFoundation/openexr/commit/3a49e9fe3f3d586a57d25265335752380cbe1b31) ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-08-18) * [brief notes of TSC meeting 2019-08-16](https://github.com/AcademySoftwareFoundation/openexr/commit/36fb144da1110232bf416d5e1c4abde263056d17) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-16) * [Fix compile warnings from the latest merges](https://github.com/AcademySoftwareFoundation/openexr/commit/181add33e9391372e76abb6bfc654f37d3788e4a) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-14) * [Fix boost checks when a versioned python is not found](https://github.com/AcademySoftwareFoundation/openexr/commit/d6c176718595415e7b17e7a6c77af0df75cc36de) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-14) * [Rework boost python search logic to be simpler and more robust](https://github.com/AcademySoftwareFoundation/openexr/commit/c21272230b30562d219d41d00cdcbc98be602c37) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-14) * [Fix spacing](https://github.com/AcademySoftwareFoundation/openexr/commit/4f8137070fa257557f7b474c41b9b9c260b7f3cd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-14) * [Fix #268, issue with right shift in fast huf decoder](https://github.com/AcademySoftwareFoundation/openexr/commit/2f33f0ff08cf66286fda5cf60ee6f995821bde0d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-14) * [Add mechanism for test programs to use win32 wide filename fix when manually creating std::fstreams](https://github.com/AcademySoftwareFoundation/openexr/commit/e0ac10e045b6d932c221c9223d88940b14e12b8b) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-12) * [Use temp directory for tests under win32, properly cleanup files from util tests](https://github.com/AcademySoftwareFoundation/openexr/commit/1d0b240557a230cf704c8797f97ce373a3ca5474) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-12) * [Fix issue with mingw gcc and wide / utf8 filenames](https://github.com/AcademySoftwareFoundation/openexr/commit/02fbde4e1942e2ffcf652eb99e32fb15530cc93d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-12) * [Remove unused using statements](https://github.com/AcademySoftwareFoundation/openexr/commit/ce09ee004050ec2c1c0fff72b28d1d69a98dfaea) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-12) * [Add missing exports for ImfAcesFile](https://github.com/AcademySoftwareFoundation/openexr/commit/631d5d49bab5ef0194983a0e15471102b5acacd9) ([Nick Porcino](@meshula@hotmail.com) 2019-08-10) * [Add missing symbol export to Slice::Make](https://github.com/AcademySoftwareFoundation/openexr/commit/efb5d10f6001e165149bf0dc17f96b4671d213c3) ([Nick Porcino](@meshula@hotmail.com) 2019-08-09) * [TSC meeting notes August 8, 2019](https://github.com/AcademySoftwareFoundation/openexr/commit/ee8830f108e7a930f6326175f444ed026e504f27) ([Cary Phillips](@cary@ilm.com) 2019-08-08) Signed-off-by: Cary Phillips * [changed AP_CPPFLAGS to AM_CPPFLAGS in PyImathNumpy/Makefile.am.](https://github.com/AcademySoftwareFoundation/openexr/commit/859017261d4401ebdb965f268d88b10455984719) ([Cary Phillips](@cary@ilm.com) 2019-08-07) What this a typo? The automake-generated Makefiles expect 'AM', which was leading to a failure to find PyImath.h. Signed-off-by: Cary Phillips * [Removed the d_exr Renderman plugin from Contrib. It was hopelessly outdated, not updated since 2003, and no longer of benefit.](https://github.com/AcademySoftwareFoundation/openexr/commit/6999eb39465d99d5fbb01eff9f1acfdb424d9f82) ([Cary Phillips](@cary@ilm.com) 2019-07-27) Signed-off-by: Cary Phillips * [Removed the Photoshop plugin from Contrib. It was hopelessly outdated and no longer of benefit.](https://github.com/AcademySoftwareFoundation/openexr/commit/e84040bde6259777035b3032337aee4a24f34548) ([Cary Phillips](@cary@ilm.com) 2019-07-27) Signed-off-by: Cary Phillips * [added SPDX license identifier.](https://github.com/AcademySoftwareFoundation/openexr/commit/e9e4f34616460b3a3c179a7bcc2be2e8f4e79ae8) ([Cary Phillips](@cary@ilm.com) 2019-07-27) Signed-off-by: Cary Phillips * [Upon the request of the ASWF Governing Board and the advice of Pixar/Lucasfilm attorney Richard Guo, changed the license on the DtexToExr source code to BSD-3-Clause, to bring in line with the standard OpenEXR license. Also, removed COPYING, as it only contained license info; remoted INSTALL because it was only a copy of the boilerplate bootstrap/config documentation; remove NEWS because we're not using that file any more.](https://github.com/AcademySoftwareFoundation/openexr/commit/a73956bfd4809769bcb8fe2229f7d888c7deccff) ([Cary Phillips](@cary@ilm.com) 2019-07-27) Signed-off-by: Cary Phillips * [TSC meeting notes from 7/25/2019](https://github.com/AcademySoftwareFoundation/openexr/commit/2ebd7ade2f392fc3da50c0227e3ff11a7a2f4d8e) ([Cary Phillips](@cary@ilm.com) 2019-07-26) Signed-off-by: Cary Phillips * [Match variable style syntax per Cary](https://github.com/AcademySoftwareFoundation/openexr/commit/f5ab8176637d8ea1decc83929950aa3864c87141) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-10) Signed-off-by: Kimball Thurston * [Add headers to build so programs that can parse and display that will do so](https://github.com/AcademySoftwareFoundation/openexr/commit/19557bfaf1b6b38a2407a6a261ee8f3b376c0bd6) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) Signed-off-by: Kimball Thurston * [First pass of describing versioning and naming of library names](https://github.com/AcademySoftwareFoundation/openexr/commit/eeae20a72f596589b6429ba43bff69281b801015) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) Signed-off-by: Kimball Thurston * [Normalize library naming between cmake and autoconf](https://github.com/AcademySoftwareFoundation/openexr/commit/c3ebd44bdb64c5bfe0065f3d0ac898387a0fbb63) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) installed libraries should follow the following basic pattern: (-> indicates a symlink) libFoo.so -> libFoo-LIB_SUFFIX.so libFoo-LIB_SUFFIX.so -> libFoo-LIB_SUFFIX.so.MAJ_SO_VERSION libFoo-LIB_SUFFIX.so.MAJ_SO_VERSION -> libFoo-LIB_SUFFIX.so.FULL_SO_VERSION so with a concrete example of 2.3 lib w/ so version of 24 libFoo.so -> libFoo-2_3.so libFoo-2_3.so -> libFoo-2_3.so.24 libFoo-2_3.so.24 -> libFoo-2_3.so.24.0.0 libFoo-2_3.so.24.0.0.0 <--- actual file (there may be slight variations in the link destinations based on differences in libtool and cmake, but the file names available should all be there) Signed-off-by: Kimball Thurston * [only perform check in c++14 to avoid old c++11 standards deficient compilers](https://github.com/AcademySoftwareFoundation/openexr/commit/1aeba79984bef35cead1da540550441f2b8244af) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) Signed-off-by: Kimball Thurston * [Fix #246, add type traits check](https://github.com/AcademySoftwareFoundation/openexr/commit/5323c345361dcf01d012fd8f40e8c6c975b9cb83) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) previous cleanup did most of the work, but add an explicit test that half is now trivial and default constructible. Signed-off-by: Kimball Thurston * [remove sanityCheck for 32 bit overflow. Add test for large offsets](https://github.com/AcademySoftwareFoundation/openexr/commit/b0acdd7bcbd006ff93972cc3c6d66c617280c557) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-23) * [Makes building of fuzz test optional](https://github.com/AcademySoftwareFoundation/openexr/commit/73d5676079d77b4241719f57d0219a3287503b8b) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-08-09) This further makes the fuzz test compilation dependent on whether you want to include the fuzz test in the ctest "make test" rule. This is mostly for sonar cloud such that it doesn't complain that the fuzz test code isn't being run as a false positive (because it isn't included in the test) Signed-off-by: Kimball Thurston * [Added MacOS jobs to Azure pipeline](https://github.com/AcademySoftwareFoundation/openexr/commit/29eab92cdee9130b7d1cc6adb801966d0bc87c94) ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-07-27) * [initial draft of release notes for 2.3.1](https://github.com/AcademySoftwareFoundation/openexr/commit/4fa4251dc1cce417a7832478f6d05421561e2fd2) ([Cary Phillips](@cary@ilm.com) 2019-08-06) Signed-off-by: Cary Phillips * [Add //NOSONAR to the "unhandled exception" catches that SonarCloud identifies as vulnerabilities, to suppress the warning. In each of these cases, a comment explains that no action is called for in the catch, so it should not, in fact, be regarded as a bug or vulnerability.](https://github.com/AcademySoftwareFoundation/openexr/commit/c46428acaca50e824403403ebdaec45b97d92bca) ([Cary Phillips](@cary@ilm.com) 2019-07-28) Signed-off-by: Cary Phillips * [explicitly name the path for the autoconf-generated files in .gitignore.](https://github.com/AcademySoftwareFoundation/openexr/commit/220cfcdd7e08d28098bf13c992d48df4b0ab191d) ([Cary Phillips](@cary@ilm.com) 2019-08-04) * [add the file generated by bootstrap/configure to .gitignore.](https://github.com/AcademySoftwareFoundation/openexr/commit/81af15fd5ea58c33cfa18c60797daaba55126c1b) ([Cary Phillips](@cary@ilm.com) 2019-08-04) Signed-off-by: Cary Phillips * [Fixes #353, support for overriding Cg libdir](https://github.com/AcademySoftwareFoundation/openexr/commit/63924fd0f47e428b63c82579e8b03a1eeb4e4ca1) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-22) to handle systems where it isn't lib, but lib64, as needed Signed-off-by: Kimball Thurston * [more documentation tweaks](https://github.com/AcademySoftwareFoundation/openexr/commit/b6c006aafc500816e42909491437bf9af79bb03c) ([Cary Phillips](@cary@ilm.com) 2019-07-28) Signed-off-by: Cary Phillips * [Updates to README, CONTRIBUTING, GOVERNANCE: better introduction, removed some of the TSC process descriptions that are redudant in the charter.](https://github.com/AcademySoftwareFoundation/openexr/commit/1cd03756bbf22a65f84eb42c9d83b78be2902c02) ([Cary Phillips](@cary@ilm.com) 2019-07-28) Signed-off-by: Cary Phillips * [update to the template copyright notice.](https://github.com/AcademySoftwareFoundation/openexr/commit/21c307aaf054f304f52bb488258f81d68e38385f) ([Cary Phillips](@cary@ilm.com) 2019-07-25) Signed-off-by: Cary Phillips * [Updates to LICENSE and CONTRIBUTORS.](https://github.com/AcademySoftwareFoundation/openexr/commit/559186e6c638190ec1db122ec5f1a0890c056a16) ([Cary Phillips](@cary@ilm.com) 2019-07-25) Signed-off-by: Cary Phillips * [Fix another set of warnings that crept in during previous fix merges](https://github.com/AcademySoftwareFoundation/openexr/commit/e07ef34af508b7ce9115ebc5454edeaacb35fb8c) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) Signed-off-by: Kimball Thurston * [Fix logic for 1 pixel high/wide preview images (Fixes #493)](https://github.com/AcademySoftwareFoundation/openexr/commit/74504503cff86e986bac441213c403b0ba28d58f) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-25) * [Fix for #494: validate tile coordinates when doing copyPixels](https://github.com/AcademySoftwareFoundation/openexr/commit/6bb36714528a9563dd3b92720c5063a1284b86f8) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-25) * [add test for filled channels in DeepScanlines](https://github.com/AcademySoftwareFoundation/openexr/commit/c04673810a86ba050d809da42339aeb7129fc910) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-18) * [add test for skipped and filled channels in DeepTiles](https://github.com/AcademySoftwareFoundation/openexr/commit/b1a5c8ca1921a3fc573952c8034fddd8fdac214b) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-18) * [slightly rearrange test for filled channels](https://github.com/AcademySoftwareFoundation/openexr/commit/3c9d0b244ec31ab5e5849e1b6020c55096707ab5) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-18) * [Make sure to skip over slices that will only be filled when computing the uncompressed pixel size. Otherwise chunks that compressed to larger sizes than the original will fail to load.](https://github.com/AcademySoftwareFoundation/openexr/commit/14905ee6d802b27752890d39880cd05338337e39) ([Halfdan Ingvarsson](@halfdan@sidefx.com) 2013-04-25) * [Fix #491, issue with part number range check reconstructing chunk offset table](https://github.com/AcademySoftwareFoundation/openexr/commit/8b5370c688a7362673c3a5256d93695617a4cd9a) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-25) The chunk offset was incorrectly testing for a part number that was the same size (i.e. an invalid index) Signed-off-by: Kimball Thurston * [removed logo, that didn't work.](https://github.com/AcademySoftwareFoundation/openexr/commit/d5800c14296527b3540da7aefd28b5937158d2cc) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [added logo](https://github.com/AcademySoftwareFoundation/openexr/commit/70435d286a0fe1a022ba26f00a1fd6eb37505a32) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [OpenEXR logo](https://github.com/AcademySoftwareFoundation/openexr/commit/d6eeb1432bc626709f934da7428561d4aeb8c5a5) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [smaller window image](https://github.com/AcademySoftwareFoundation/openexr/commit/fcedcad366988a24fb9c756510488f8fb83dc2ac) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [fixed image references in README.md](https://github.com/AcademySoftwareFoundation/openexr/commit/6def338579442d0fe1e3fbed0d458db3c5cf2a42) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [Revised the overview information in README.md, and condensed the information in the module README.md's, and removed the local AUTHORS, NEWS, ChangeLog files.](https://github.com/AcademySoftwareFoundation/openexr/commit/0c04c734d1a7ba3f3f85577ec56388238c9202c6) ([Cary Phillips](@cary@ilm.com) 2019-07-23) Signed-off-by: Cary Phillips * [Azure: updated docker containers, added windows install scripts.](https://github.com/AcademySoftwareFoundation/openexr/commit/941082379a49a1aecafe2b9e84f3403314d910a9) ([Christina Tempelaar-Lietz](@xlietz@gmail.com) 2019-07-22) * [rewrite of build and installation documentation in INSTALL.md](https://github.com/AcademySoftwareFoundation/openexr/commit/591b671ba549bccca1e41ad457f569107242565d) ([Cary Phillips](@cary@ilm.com) 2019-07-22) Signed-off-by: Cary Phillips * [Convert constructor casts to static_cast](https://github.com/AcademySoftwareFoundation/openexr/commit/625b95fa026c3b78e537e9bb6a39fcd51920ad13) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) Signed-off-by: Kimball Thurston * [Convert constructor casts to static_cast, remove dead code](https://github.com/AcademySoftwareFoundation/openexr/commit/5cbf3cb368cd7013a119c3f08555a69fe33a932b) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) Signed-off-by: Kimball Thurston * [Fix issues and warnings compiling in optimized using gcc -Wall](https://github.com/AcademySoftwareFoundation/openexr/commit/6d4e118cebbb7adf8ed29d846bb6f7fb0fb198eb) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) Signed-off-by: Kimball Thurston * [Ensure tests have assert when building in a release mode](https://github.com/AcademySoftwareFoundation/openexr/commit/fe93c2c1ade319a7bc9a733cbeaad3c625a31d0d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) Fixes warnings and makes sure tests are ... testing Signed-off-by: Kimball Thurston * [Cleanup warnings for clang -Wall](https://github.com/AcademySoftwareFoundation/openexr/commit/a5fbf7d669ca6b2b402f4fdf9022b43e5eea616f) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) Signed-off-by: Kimball Thurston * [First pass of warning cleanup](https://github.com/AcademySoftwareFoundation/openexr/commit/c1501ec2b29c95501c8fc324f4ec91bd93f0c1d3) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) This fixes g++ -Wall to compile warning free Signed-off-by: Kimball Thurston * [Update Azure Linux/SonarCloud jobs to work with new build](https://github.com/AcademySoftwareFoundation/openexr/commit/b19c8d221976bc6c0debc77431b0fe40dfeb8887) ([¨Christina Tempelaar-Lietz¨](@xlietz@gmail.com) 2019-07-21) Signed-off-by: Christina Tempelaar-Lietz * [Fix dos files to unix, part of #462](https://github.com/AcademySoftwareFoundation/openexr/commit/0f97a86349b377e0f380d2782326844bef652820) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-22) Signed-off-by: Kimball Thurston * [Put all runtime artefacts in a single folder to help win32 find dlls](https://github.com/AcademySoftwareFoundation/openexr/commit/e2e8b53e267c373971f3e6da700670679a46403d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-23) This will (hopefully) fix issues with compiling ilmbase as a dll and using that to generate and compile openexr Signed-off-by: Kimball Thurston * [Fix #224, imath python code such that tests pass under python3](https://github.com/AcademySoftwareFoundation/openexr/commit/ab50d774e91a6448443e6cdb303bd040105cfaf8) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-22) Previously had fixed print functions, this pass converts the following: - integer division changed in python3 3/2 -> 1.5, have to use 3//2 to get an int - xrange is no more, just use range - integer type coersion for division not working, force type constructor Signed-off-by: Kimball Thurston * [Fixes #252, incorrect math computing half digits](https://github.com/AcademySoftwareFoundation/openexr/commit/bca0bc002b222d64712b748a733d9c9a0701f834) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-22) Based on float / double math for base 10 digits, with 1 bit of rounding error, the equation should be floor( mantissa_digits - 1 ) * log10(2) ), which in the case of half becomes floor( 10 * log10(2) ) or 3 Signed-off-by: Kimball Thurston * [Fixes #139](https://github.com/AcademySoftwareFoundation/openexr/commit/ba329cba788d4f320e6fc455919233222c27a0dd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Removes bash-isms from the autoconf bootstrap / configure.ac files Signed-off-by: Kimball Thurston * [Add viewers library to default build](https://github.com/AcademySoftwareFoundation/openexr/commit/f52164dcc92c98775c3503aa9827fbd5d1e69b63) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) If libraries can't be found, will warn and not build Signed-off-by: Kimball Thurston * [Warn the user, but make PyIlmBase not fail a build by default](https://github.com/AcademySoftwareFoundation/openexr/commit/a0dcd35c51fc7811bc17b766ded17622f91e3fd0) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) By default, many people won't have the dependencies to build PyIlmBase. Make it such that the build will warn, but continue to build without the python extension Signed-off-by: Kimball Thurston * [Fix missing #include for std::isnormal](https://github.com/AcademySoftwareFoundation/openexr/commit/9aa10cfac3209ac398b12c14eec2611420f20985) ([Axel Waggershauser](@awagger@gmail.com) 2019-07-21) fixes compile regression on macos + clang-6 * [further cleanup and remove old mworks checks that had been copied around](https://github.com/AcademySoftwareFoundation/openexr/commit/351ad1897e3b84bd5b1e29835c7e68bb09f1f914) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Signed-off-by: Kimball Thurston * [Remove last vestiges of old ifdef for windows previously removed elsewhere](https://github.com/AcademySoftwareFoundation/openexr/commit/b3651854491afa8b6c98e9078a5f4a33178c1a66) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Previously PLATFORM_WINDOWS was used to conditionally include things, but that had been removed elsewhere, and a few spots missed. Signed-off-by: Kimball Thurston * [Fix #352, issue with aspect ratio](https://github.com/AcademySoftwareFoundation/openexr/commit/34e2e78f205c49eafb49b7589701746f748194ad) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) If a file is contructed with an abnormal aspect ratio, tools like make preview will fail. This adds an extra check to the creation / reading of ImfHeader to avoid this issue Signed-off-by: Kimball Thurston * [Fix #455 by not using object libraries under apple](https://github.com/AcademySoftwareFoundation/openexr/commit/0451df8f7986ff5ab37c26d2aa6a7aeb115c8948) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Per the docs, add_library calls with only object library dependencies are not yet handled properly by Xcode and similar. Disable the use of object libraries as a compilation speedup mechanism as a result. Similarly, disable under win32 when building both types of libs to avoid exported symbols in the static libs. Finally, use same mechanism to avoid extra layer of libs in generated exports when only building one config on all platforms Signed-off-by: Kimball Thurston * [NumPy lookup logic is only in newer versions of cmake than our minimum](https://github.com/AcademySoftwareFoundation/openexr/commit/5b4b23d1cf49ee89132251bc7987d65b7a11efe6) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) We are doing the numpy lookup manually for now Signed-off-by: Kimball Thurston * [Fix #461, issue with macos rpath support, remove half-baked framework support](https://github.com/AcademySoftwareFoundation/openexr/commit/9aa52c8c0c96b24c8d645d7850dae77f4bf64620) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Signed-off-by: Kimball Thurston * [Refactor origin function to a Slice factory and Rgba custom utility](https://github.com/AcademySoftwareFoundation/openexr/commit/119eb2d4672e5c77a79929758f7e4c566f47c794) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Instead of a general templated routine, have a Slice factory function and then a custom Rgba utility function to clarify and avoid missing strides, etc. when dealing with slices Signed-off-by: Kimball Thurston * [merges common fixes and move bounds check to central location](https://github.com/AcademySoftwareFoundation/openexr/commit/6a41400b47d574a5fc6133b9a7139bcd7b59d585) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-01) PR #401 had conflicts, and some of the checks were not in a central location. This incorporates those changes, moving the extra range checks to the central sanityCheck already in ImfHeader. Then adds a new utility function for computing the pointer offsets that can prevent simple overflow when there are large offsets from origin or widths with subsampling. Signed-off-by: Kimball Thurston Co-Authored-By: pgajdos * [Fix part of #232, issue with pointer overflows](https://github.com/AcademySoftwareFoundation/openexr/commit/4aa6a4e0fcd52b220c71807307b9139966c3644c) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) This addresses pointer overflow in exr2aces with large datawindow offsets. It also fixes similar issues in exrenvmap and exrmakepreview. This addresses the crashes in CVE-2017-9111, CVE-2017-9113, CVE-2017-9115 Signed-off-by: Kimball Thurston * [Fix portion of #462](https://github.com/AcademySoftwareFoundation/openexr/commit/2309b42be084939e8593e036b814049f98eb7888) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-21) Signed-off-by: Kimball Thurston * [Fix copyright notice, clarify version requirement comment](https://github.com/AcademySoftwareFoundation/openexr/commit/688b50d1982854b1a2be63160eae03472cf4820e) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-20) Signed-off-by: Kimball Thurston * [Fix copyright notice, clarify version requirement comment](https://github.com/AcademySoftwareFoundation/openexr/commit/bbf1f5ed9814f35f953c5b28349ca8dd59a3ed87) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-20) Signed-off-by: Kimball Thurston * [Fix #457, (unused) policy tag only in 3.13+ of cmake, no longer needed](https://github.com/AcademySoftwareFoundation/openexr/commit/e69dc2131791a42d5e0618506a4846ec7d53b997) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-20) Signed-off-by: Kimball Thurston * [TSC meeting notes 7/18/2019](https://github.com/AcademySoftwareFoundation/openexr/commit/04e21585d01c36790dad186a34c4c64c8e0a1dae) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [Typo in Makefile.am, AM_CPPFLAGS should append to the previous value.](https://github.com/AcademySoftwareFoundation/openexr/commit/97626390f86007fcff2d33c68919389e211983e1) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [changed INCLUDE to AM_CPPFLAGS, upon the recommendation of automake warnings.](https://github.com/AcademySoftwareFoundation/openexr/commit/f91edef414e319235959a537e0ef62c49dddcde3) ([Cary Phillips](@cary@ilm.com) 2019-07-17) Signed-off-by: Cary Phillips * [added missing copyright notices](https://github.com/AcademySoftwareFoundation/openexr/commit/76cb1ef869a23ab49f4313fee16a4d5750e91485) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [in PyIlmBase/configure.ac, set LD_LIBRARY_PATH explicitly for the ilmbase test program,so that it finds the libraries when it executes.](https://github.com/AcademySoftwareFoundation/openexr/commit/0bd322d424781f20750141ddc829fc9e16f7e305) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [remove the reference to the LICENSE file in the copyright notice template.](https://github.com/AcademySoftwareFoundation/openexr/commit/1aedb3ceec973e9bc0bad88fc151b2504884e84c) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [fix incorrect license identifier](https://github.com/AcademySoftwareFoundation/openexr/commit/02f1e3d876a784cfd0ab8d0581bafe1fd0d98df2) ([Cary Phillips](@cary@ilm.com) 2019-07-18) Signed-off-by: Cary Phillips * [Rename new function and clarify purpose](https://github.com/AcademySoftwareFoundation/openexr/commit/e8dc4326383540ef4a4e2a388cb176da72c120fb) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) After discussion with phillman, renamed to give this routine a purpose beyond some soon to be deleted legacy support, and clarified this in the comment documenting the function. Signed-off-by: Kimball Thurston * [Implements #15, request for hardware concurrency utility function](https://github.com/AcademySoftwareFoundation/openexr/commit/23eaf0f45ff531ba0ab3fb1540d5c7d31b4bfe94) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) new static member of ThreadPool, call as ThreadPool::hardwareConcurrency, so no abi breakage or api change Signed-off-by: Kimball Thurston * [use headers.data() instead of &headers[0]](https://github.com/AcademySoftwareFoundation/openexr/commit/42665b55f4062f1492156c7bc9482318c7b49cda) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-17) * [don't index empty array in testMultiPartSharedAttributes](https://github.com/AcademySoftwareFoundation/openexr/commit/bb5aad9b793b1113cae42d80fea8925503607de1) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-16) * [Added IlmThreadSemaphoreOSX to IlmBase/IlmThread/Makefile.am and added PyIlmBase/PyIlmBase.pc.in back in, looks like it got inadvertently removed by a previous commit.](https://github.com/AcademySoftwareFoundation/openexr/commit/c580d3531c36ed1de35fbfe359eed5f74c2de6dc) ([Cary Phillips](@cary@ilm.com) 2019-07-16) Signed-off-by: Cary Phillips * [Azure and SonarCloud setup](https://github.com/AcademySoftwareFoundation/openexr/commit/9d053e4871e721144ad25ac04437646cf4f16d66) ([¨Christina Tempelaar-Lietz¨](@xlietz@gmail.com) 2019-07-12) Signed-off-by: ¨Christina Tempelaar-Lietz¨ * [Fixes #95, compilation issue with mingw](https://github.com/AcademySoftwareFoundation/openexr/commit/2cf0560dd8eb469680d2281e6d80348dad9ad500) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) The tree now compiles using mingw to compile, tested by cross compiling for windows from linux Signed-off-by: Kimball Thurston * [Fixes #282, missing link against pthread](https://github.com/AcademySoftwareFoundation/openexr/commit/e90f1b0ed19cb05821c7351ce8d5d9a22fb094eb) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) Signed-off-by: Kimball Thurston * [Remove removed file, add CMakeLists.txt file](https://github.com/AcademySoftwareFoundation/openexr/commit/9683c48479ed2372d26eb51ed91d89b01c495dfd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) Signed-off-by: Kimball Thurston * [PyIlmBase finished refactor, misc cleanup](https://github.com/AcademySoftwareFoundation/openexr/commit/4d97270c6ce0916483c1aff5b1f77846cfff11a0) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) - add extra dist to automake for make dist - finish numpy lookup - add sample vfx 15 toolchain file for doc purposes - merge cxx standard, pay attention to global setting if set - merge clang tidy option - add default build type if not set Signed-off-by: Kimball Thurston * [Remove un-needed files now that cmake can provide correct values](https://github.com/AcademySoftwareFoundation/openexr/commit/08332041bb46b45e93855c9843a2aa916ec4ebef) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-18) Signed-off-by: Kimball Thurston * [Fix issues with rpath, message cleanup, checkpoint better python layer](https://github.com/AcademySoftwareFoundation/openexr/commit/0eff97241f495027021b54978028475f0b2459dd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-17) Signed-off-by: Kimball Thurston * [Start to integrate python module using FindPython and FindBoost from modern cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/c236ed81b7146947999b75fd93aedc5d54d78f64) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-16) Signed-off-by: Kimball Thurston * [Attempt to set rpath for more common scenarios when people are building custom versions](https://github.com/AcademySoftwareFoundation/openexr/commit/10adf360120898c6ad3a0be2838056948bf22233) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-16) Signed-off-by: Kimball Thurston * [Documentation pass](https://github.com/AcademySoftwareFoundation/openexr/commit/ba22a8e0a366c87677c53bab72af72dbc378b0dd) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-16) Signed-off-by: Kimball Thurston * [Enable custom install subfolder for headers](https://github.com/AcademySoftwareFoundation/openexr/commit/9067b792c6f178bd2ff1d15e7b4d898fc1677495) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-13) Signed-off-by: Kimball Thurston * [Generate version file to ensure proper version check](https://github.com/AcademySoftwareFoundation/openexr/commit/edb6938738462009990086fb7081a860412ec0d4) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-13) Signed-off-by: Kimball Thurston * [Properly include additional cmake files in "make dist" under autoconf](https://github.com/AcademySoftwareFoundation/openexr/commit/ae54f3d656f8c6336c22385ee5d5ab1f35324c37) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-13) Signed-off-by: Kimball Thurston * [First pass updating the documentation for cmake builds](https://github.com/AcademySoftwareFoundation/openexr/commit/120b93ecf33c45284dff68eaf0ee779fa1cb6747) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) * [Switch testing control to use standard ctest setting option](https://github.com/AcademySoftwareFoundation/openexr/commit/fe6bf4c585723ff8851dfe965343a2adb0f1c1f4) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) * [First pass making cross compile work, cross compiling windows using mingw on linux](https://github.com/AcademySoftwareFoundation/openexr/commit/f44721e0c504b0b400a71513600295fc5e00f014) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) This currently works for building using static libraries, but not yet tested with dlls. Signed-off-by: Kimball Thurston * [Fix new (WIP) cmake setup to work on OS/X](https://github.com/AcademySoftwareFoundation/openexr/commit/2fe5a26d7ef36276ba4aa354178b81fc6612868d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) This includes a fix for the semaphore configure check as well as a couple of compile warnings Signed-off-by: Kimball Thurston * [Add missing file, remove unused exrbuild tool cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/9a1ca7579b1ac793ae2d7bbee667e498d9bc8322) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) Signed-off-by: Kimball Thurston * [Refactor cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/df41027db50bd52a0b797444f02d5907b756652e) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-07-12) This refactors the cmake setup, modernizing it to a current flavor of cmake and cleaning up the definitions. This also makes the top level folder a "super project", meaning it is including what should be distinct / standalone sub-projects with their own finds that should work. Signed-off-by: Kimball Thurston * [TiledInputFile only supports regular TILEDIMAGE types, not DEEPTILE or unknown tiled types. Enforce for both InputFile and InputPart API. Fixes #266, Related to #70](https://github.com/AcademySoftwareFoundation/openexr/commit/ece555214a63aaf0917ad9df26be7e17451fefb9) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-15) * [address #271: catch scanlines with negative sizes](https://github.com/AcademySoftwareFoundation/openexr/commit/849c616e0c96665559341451a08fe730534d3cec) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-12) * [TSC meeting notes, July 7, 2019](https://github.com/AcademySoftwareFoundation/openexr/commit/960a56f58da13be6c97c59eae1f57bd8882c4588) ([Cary Phillips](@cary@ilm.com) 2019-07-12) Signed-off-by: Cary Phillips * [securty policy](https://github.com/AcademySoftwareFoundation/openexr/commit/8f483c2552070f3d9dd2df98f6500dfa1c051dcc) ([Cary Phillips](@cary@ilm.com) 2019-07-12) Signed-off-by: Cary Phillips * [code of conduct](https://github.com/AcademySoftwareFoundation/openexr/commit/f31407518aa361263c77eae13f1eef46999ca01f) ([Cary Phillips](@cary@ilm.com) 2019-07-12) Signed-off-by: Cary Phillips * [bswap_32 to correct endianness on read, to address #81.](https://github.com/AcademySoftwareFoundation/openexr/commit/225ddb8777e75978b88c2d6311bb0cf94c0b6f22) ([Cary Phillips](@cary@ilm.com) 2019-07-02) Signed-off-by: Cary Phillips * [fix reading files](https://github.com/AcademySoftwareFoundation/openexr/commit/5350d10ffc03c774e5cd574062297fc91001064d) ([Dan Horák](@dan@danny.cz) 2019-04-15) testFutureProofing and testMultiPartFileMixingBasic both use fread(&length,4,f) to get a 4 byte integer value from input file. The value read is not converted from the little endian format to the machine format causing problems (eg. test didn't finish after 24 hours). fixes issue #81 * [SonarCloud considers strcpy() a vulernability. It was used only in OpaqueAttribute, whose type name was stored as Array. I changed the type to std::string. I suspect this simply dates to a time before std::string was commonly used.](https://github.com/AcademySoftwareFoundation/openexr/commit/29d18b70bf542ef9ec6e8861c015d2e7b3d3ec58) ([Cary Phillips](@cary@ilm.com) 2019-07-09) Also, it appears that nothing in the test suite validated opaque attributes, which hold values read from a file when the attribute type is not known. I added a test to validate the behavior, which also validates that the typeName() works when implemented with std::string instead of Array. Signed-off-by: Cary Phillips * [Updated pdf with fixes for file version bits on page 7.](https://github.com/AcademySoftwareFoundation/openexr/commit/8da36708caaf0591f72538bfa414d8af20af90e9) ([Cary Phillips](@cary@ilm.com) 2019-07-11) Signed-off-by: Cary Phillips * [Fixed column labels in table on page 7; bit 11 is "deep", bit 12 is "multi-part". Bit 9 is long names, and is not in the table.](https://github.com/AcademySoftwareFoundation/openexr/commit/a3198419f7593564747337e763083492c0470f45) ([Cary Phillips](@cary@ilm.com) 2019-07-09) Signed-off-by: Cary Phillips * [New CI with aswfstaging/ci-base image](https://github.com/AcademySoftwareFoundation/openexr/commit/5e7cde5c082881009516aa57a711a19e3eb92f64) ([aloysb](@aloysb@al.com.au) 2019-06-17) Signed-off-by: Aloys Baillet Conflicts: azure-pipelines.yml * [use static_cast in error test](https://github.com/AcademySoftwareFoundation/openexr/commit/700e4996ce619743d5bebe07b4158ccc4547e9ad) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-11) * [throw better exceptions in multipart chunk reconstruction](https://github.com/AcademySoftwareFoundation/openexr/commit/001a852cca078c23d98c6a550c65268cc160042a) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-11) * [Fix for #263: prevent overflow in multipart chunk offset table reconstruction](https://github.com/AcademySoftwareFoundation/openexr/commit/6e4b6ac0b5223f6e813e025532b3f0fc4e02f541) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-09) * [protect against negative sized tiles](https://github.com/AcademySoftwareFoundation/openexr/commit/395aa4cbcaf91ce37aeb5e9876c44291bed4d1f9) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-11) * [apply suggested for for #262](https://github.com/AcademySoftwareFoundation/openexr/commit/9e9e4616f60891a8b27ee9cdeac930e5686dca4f) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-10) * [specific check for bad size field in header attributes (related to #248)](https://github.com/AcademySoftwareFoundation/openexr/commit/4c146c50e952655bc193567224c2a081c7da5e98) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-12) * [use static_cast and numeric_limits as suggested](https://github.com/AcademySoftwareFoundation/openexr/commit/eda733c5880e226873116ba66ce9069dbc844bdd) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-09) * [Address #270: limit to INT_MAX tiles total](https://github.com/AcademySoftwareFoundation/openexr/commit/7f438ffac4f6feb46383f66cb7e83ab41074943d) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-05) * [exr2aces wasn't built via the configure script](https://github.com/AcademySoftwareFoundation/openexr/commit/1959f74ee7f47948038a1ecb16c8ba8b84d4eb89) ([Peter Hillman](@peterh@wetafx.co.nz) 2019-07-05) * [added links for CVE's](https://github.com/AcademySoftwareFoundation/openexr/commit/afd9beac8b7e114def78793b6810cbad8764a477) ([Cary Phillips](@cary@ilm.com) 2019-07-02) Signed-off-by: Cary Phillips * [added "Test Policy" section to CONTRIBUTING.](https://github.com/AcademySoftwareFoundation/openexr/commit/695019e4b98b55ed583d1455a9219e55fc777d1a) ([Cary Phillips](@cary@ilm.com) 2019-07-02) Signed-off-by: Cary Phillips * [updated references to CVE's in release notes.](https://github.com/AcademySoftwareFoundation/openexr/commit/2a0226b4c99c057ab7f3b038dafd92543ade3e6f) ([Cary Phillips](@cary@ilm.com) 2019-07-02) Signed-off-by: Cary Phillips * [Fixed the 2.3.0 release notes to mention that CVE-2017-12596 is fixed.](https://github.com/AcademySoftwareFoundation/openexr/commit/9da28302194b413b57da757ab69eb33373407f51) ([Cary Phillips](@cary@ilm.com) 2019-06-26) Signed-off-by: Cary Phillips * [Added Coding Style section on Type Casting.](https://github.com/AcademySoftwareFoundation/openexr/commit/7790ad78bb4e2b6f4bf22a7c1703af1e352004a4) ([Cary Phillips](@cary@ilm.com) 2019-07-08) Signed-off-by: Cary Phillips * [adding source .odt files for the .pdf's on the documention page on openexr.com](https://github.com/AcademySoftwareFoundation/openexr/commit/2f7847e3faf7146f2be8c1c0c3053c50b7ee9d97) ([Cary Phillips](@cary@ilm.com) 2019-07-03) Signed-off-by: Cary Phillips * [fix readme typo](https://github.com/AcademySoftwareFoundation/openexr/commit/67c1d4d2fc62f1bbc94202e49e65bd92de2e580f) ([Nick Porcino](@meshula@hotmail.com) 2019-07-08) * [Handle exceptions, per SonarCloud rules; all catch blocks must do something to indicate the exception isn't ignored.](https://github.com/AcademySoftwareFoundation/openexr/commit/fbce9002eff631b3feeeb18d45419c1fba4204ea) ([Cary Phillips](@cary@ilm.com) 2019-07-07) Signed-off-by: Cary Phillips * [TSC meeting notes June 27, 2019](https://github.com/AcademySoftwareFoundation/openexr/commit/4093d0fbb16ad687779ec6cc7b44308596d5579f) ([Cary Phillips](@cary@ilm.com) 2019-06-28) Signed-off-by: Cary Phillips * [Implement semaphore for osx](https://github.com/AcademySoftwareFoundation/openexr/commit/fbb912c3c8b13a9581ffde445e390c1603bae35d) ([oleksii.vorobiov](@oleksii.vorobiov@globallogic.com) 2018-11-01) * [Various fixes to address compiler warnings: - removed unused variables and functions - added default cases to switch statements - member initialization order in class constructors - lots of signed/unsigned comparisons fixed either by changing a loop iterator from int to size_t, or by selective type casting.](https://github.com/AcademySoftwareFoundation/openexr/commit/c8a7f6a5ebce9a6d5bd9a3320bc746221789f407) ([Cary Phillips](@cary@ilm.com) 2019-06-24) Signed-off-by: Cary Phillips * [convert_index returns Py_ssize_t](https://github.com/AcademySoftwareFoundation/openexr/commit/ce886b87336ba04a12eb631ecfcc71da0c9b74bf) ([Cary Phillips](@cary@ilm.com) 2019-06-27) Signed-off-by: Cary Phillips * [Fix #342, copy paste bug with dependencies](https://github.com/AcademySoftwareFoundation/openexr/commit/2b28d90bc5e329c989dc44c1d5fdcdf715d225d7) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-28) Signed-off-by: Kimball Thurston * [Fixes the rpath setting to have the correct variable name](https://github.com/AcademySoftwareFoundation/openexr/commit/5093aaa05278030d07304588fa52466538794fe7) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) Signed-off-by: Kimball Thurston * [Add ImfFloatVectorAttribute.h to the automake install](https://github.com/AcademySoftwareFoundation/openexr/commit/d61c0967cb7cd8fa255de64e4e79894d59c0f82d) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-26) The CMake file was previously updated to include this file on install, but was missing from the automake side. Signed-off-by: Kimball Thurston * [Fix #350 - memory leak on exit](https://github.com/AcademySoftwareFoundation/openexr/commit/adbc1900cb9d25fcc4df008d4008b781cf2fa4f8) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) This fixes CVE-2018-18443, the last thread pool provider set into the pool was not being correctly cleaned up at shutdown of the thread pool. Signed-off-by: Kimball Thurston * [Fix library suffix issue in cmake file for exr2aces](https://github.com/AcademySoftwareFoundation/openexr/commit/e4099a673e3348d4836c79a760e07b28b1912083) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) Signed-off-by: Kimball Thurston * [Iterate on formatting, add script to run the formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/969305c5731aef054e170e776086e3747eb20ee0) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) Signed-off-by: Kimball Thurston * [Add initial rules for running clang-format on the code base](https://github.com/AcademySoftwareFoundation/openexr/commit/6513fcf2e25ebd92c8f80f18e8cd7718ba7c4a41) ([Kimball Thurston](@kdt3rd@gmail.com) 2019-06-27) Signed-off-by: Kimball Thurston * [find Boost.Python 3 on older Boost versions](https://github.com/AcademySoftwareFoundation/openexr/commit/9b58cf0fc197947dc5798854de639233bb35c6cb) ([Jens Lindgren](@lindgren_jens@hotmail.com) 2018-11-19) * [MSYS support](https://github.com/AcademySoftwareFoundation/openexr/commit/a19c806a7b52cdf74bfa6966b720efd8b24a2590) ([Harry Mallon](@hjmallon@gmail.com) 2019-01-30) * [Only find_package ZLIB when required](https://github.com/AcademySoftwareFoundation/openexr/commit/ab357b0a7a6d7e0ee761bf8ee5846688626d9236) ([Harry Mallon](@hjmallon@gmail.com) 2019-02-06) * [Remove unused headers](https://github.com/AcademySoftwareFoundation/openexr/commit/db9fcdc9c448a9f0d0da78010492398a394c87e7) ([Grant Kim](@6302240+enpinion@users.noreply.github.com) 2019-06-13) * [WIN32 to _WIN32 for Compiler portability](https://github.com/AcademySoftwareFoundation/openexr/commit/6e2a73ed8721da899a5bd844397444d5b15a5c71) ([Grant Kim](@6302240+enpinion@users.noreply.github.com) 2019-06-11) https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019 _WIN32 is the standard according to the official documentation from Microsoft and also this fixes MinGW compile error. * [Update README.md](https://github.com/AcademySoftwareFoundation/openexr/commit/45e9910be6009ac4ddf4db51c3c505daafc942a3) ([Huibean Luo](@huibean.luo@gmail.com) 2019-04-08) * [Added a few people to CREDITS.](https://github.com/AcademySoftwareFoundation/openexr/commit/db512f5de8f4cc0f6ff81a67bf1bb7e8e7f0cc53) ([Cary Phillips](@cary@ilm.com) 2019-06-20) Signed-off-by: Cary Phillips * [added release note summary information for all old releases from the "Announcements" section of openexr.com to CHANGES.md, so the repo's release notes are complete.](https://github.com/AcademySoftwareFoundation/openexr/commit/61bbd0df59494cc2fa0e508506f32526acf2bf51) ([Cary Phillips](@cary@ilm.com) 2019-06-20) Signed-off-by: Cary Phillips * [first real draft of coding style, and steps in the release process.](https://github.com/AcademySoftwareFoundation/openexr/commit/1d514e66313cac0440b80c290b35cfa6b8f89b51) ([Cary Phillips](@cary@ilm.com) 2019-06-20) Signed-off-by: Cary Phillips * [- added CREDITS.md (generated from "git log") - added CODEOWNERS (mostly a placeholder, everything is currently owned by TSC members) - the Release Process section of CONTRIBUTING gives the git log arguments to generate release notes. - remove stray meeting minutes file at the root level.](https://github.com/AcademySoftwareFoundation/openexr/commit/050048c72ef4c32119d21cdb499e23418429f529) ([Cary Phillips](@cary@ilm.com) 2019-06-19) Signed-off-by: Cary Phillips * [fixed references to renamed ASWF folder](https://github.com/AcademySoftwareFoundation/openexr/commit/bd4c36cf07db310bb8350a4e5f575d86f1c7f8cb) ([Cary Phillips](@cary@ilm.com) 2019-06-19) Signed-off-by: Cary Phillips * [June 20, 2019 TSC meeting notes](https://github.com/AcademySoftwareFoundation/openexr/commit/82134840a001c2692ee762b0a767ab1b43cb64db) ([Cary Phillips](@cary@ilm.com) 2019-06-20) Signed-off-by: Cary Phillips * [CLA's Renamed aswf-tsc to ASWF](https://github.com/AcademySoftwareFoundation/openexr/commit/7ebb766d7540ae9a2caea80b9f1c9799d7c8d8af) ([Cary Phillips](@cary@ilm.com) 2019-06-15) Signed-off-by: Cary Phillips * [2019-06-13.md](https://github.com/AcademySoftwareFoundation/openexr/commit/9b2719c68635879421805ed3b602ea19aae68a77) ([seabeepea](@seabeepea@gmail.com) 2019-06-14) Signed-off-by: seabeepea * [Missed John on the attendee list.](https://github.com/AcademySoftwareFoundation/openexr/commit/0035649cc6d7f4d86be8609758b927b01b8c110c) ([Cary Phillips](@cary@ilm.com) 2019-06-13) Signed-off-by: Cary Phillips * [TSC Meeting notes June 13, 2019](https://github.com/AcademySoftwareFoundation/openexr/commit/79857214aec3d81f73f2e9613a4b44caa21751c8) ([Cary Phillips](@cary@ilm.com) 2019-06-13) Signed-off-by: Cary Phillips * [- Formatting section is TBD - fixed references to license - removed references to CI - added section on GitHub labels](https://github.com/AcademySoftwareFoundation/openexr/commit/0045a12d20112b253895d88b4e2bce3ffcff0d90) ([Cary Phillips](@cary@ilm.com) 2019-06-14) Signed-off-by: Cary Phillips * [fixing minor typos](https://github.com/AcademySoftwareFoundation/openexr/commit/f62e9c0f9903e03c1d0d80e68e29ffba573c7f8d) ([xlietz](@31363633+xlietz@users.noreply.github.com) 2019-06-12) * [Edits to README.md and CONTRIBUTING.md](https://github.com/AcademySoftwareFoundation/openexr/commit/55a674bde7ee63c1badacbe061d3cb222927c68e) ([Cary Phillips](@cary@ilm.com) 2019-06-11) * [Add initial Azure pipeline setup file](https://github.com/AcademySoftwareFoundation/openexr/commit/9ed83bd964008c4ff19958b0e2824e08bdf6e610) ([seabeepea](@seabeepea@gmail.com) 2019-06-12) * [typos](https://github.com/AcademySoftwareFoundation/openexr/commit/10e33e334df9202cd8c8a940c7cd3ec36548d7d8) ([seabeepea](@seabeepea@gmail.com) 2019-06-09) * [Contributing and Goverance sections](https://github.com/AcademySoftwareFoundation/openexr/commit/ce9f05fbcc4c47330c43815cc40fc164e2ad53d3) ([seabeepea](@seabeepea@gmail.com) 2019-06-09) * [meeting notes](https://github.com/AcademySoftwareFoundation/openexr/commit/eed7c0aa972cf8b5f5641ca9946b27a3a054155f) ([Cary Phillips](@cary@ilm.com) 2019-05-09) * [Fixed formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/b10e1015e349313b589f4c0b5b4bddefd3da64f7) ([John Mertic](@jmertic@linuxfoundation.org) 2019-05-08) Signed-off-by: John Mertic * [moved charter to charter subfolder.](https://github.com/AcademySoftwareFoundation/openexr/commit/db49dcfdfcfaca5a60a84f65ced11df97d0df1ec) ([Cary Phillips](@cary@ilm.com) 2019-05-08) * [OpenEXR-Technical-Charter.md](https://github.com/AcademySoftwareFoundation/openexr/commit/2a33b9a4ca520490c5f368d6028decb9c76f8837) ([Cary Phillips](@cary@ilm.com) 2019-05-08) * [OpenEXR-Adoption-Proposal.md](https://github.com/AcademySoftwareFoundation/openexr/commit/3e22cab39663b5c97ba3fd20df02ae634e21fc84) ([Cary Phillips](@cary@ilm.com) 2019-05-08) * [Meeting notes 2019-5-2](https://github.com/AcademySoftwareFoundation/openexr/commit/c33d52f6c5a7d453d4b969224ab33852e47fe084) ([Cary Phillips](@cary@ilm.com) 2019-05-05) * [Remove unused cmake variable](https://github.com/AcademySoftwareFoundation/openexr/commit/c3a1da6f47279d34c23d29f6e2f264cf2126a4f8) ([Nick Porcino](@nick.porcino@oculus.com) 2019-03-29) * [add build-win/, build-nuget/, and *~ to .gitignore.](https://github.com/AcademySoftwareFoundation/openexr/commit/94ab55d8d4103881324ec15b8a41b3298ca7e467) ([Cary Phillips](@cary@ilm.com) 2018-09-22) * [Update the README files with instructions for building on Windows, specifically calling out the proper Visual Studio version.](https://github.com/AcademySoftwareFoundation/openexr/commit/ab742b86a37a7eb93f0312d98fc47f7526ddd65a) ([Cary Phillips](@cary@ilm.com) 2018-09-22) * [Removed OpenEXRViewers.pc.in and PyIlmBase.pc.in. Since these modules are binaries, not libraries, there is no need to support pkgconfig for them.](https://github.com/AcademySoftwareFoundation/openexr/commit/999a49d721604bb88178b596675deda4dc25cf1b) ([Cary Phillips](@cary@ilm.com) 2018-09-22) * [Rebuild OpenEXR NuGet with 2.3 source and enable exrviewer for testing purposes](https://github.com/AcademySoftwareFoundation/openexr/commit/c0d0a637a25e1741f528999a2556eda39102ddac) ([mancoast](@RobertPancoast77@gmail.com) 2018-09-15) * [fix standalone and combined cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/017d027cc27ac0a7b2af90196fe3e49c4afe1aab) ([Kimball Thurston](@kdt3rd@gmail.com) 2018-09-08) This puts the version numbers into one file, and the settings and variables for building into another, that is then replicated and conditionally included when building a standalone package. Signed-off-by: Kimball Thurston * [CONTRIBUTING.md, INSTALL.md, and changes README.md and INSTALL.md](https://github.com/AcademySoftwareFoundation/openexr/commit/d1d9f19475c858e66c1260fcc2be9e26dcddfc03) ([seabeepea](@seabeepea@gmail.com) 2019-06-09) * [added GOVERNANCE.md](https://github.com/AcademySoftwareFoundation/openexr/commit/09a11a92b149f0e7d51a62086572050ad4fdc4fe) ([seabeepea](@seabeepea@gmail.com) 2019-06-09) ## Version 2.3.0 (August 13, 2018) ### Features/Improvements: * ThreadPool overhead improvements, enable custom thread pool to be registered via ThreadPoolProvider class * Fixes to enable custom namespaces for Iex, Imf * Improve read performance for deep/zipped data, and SIMD-accelerated uncompress support * Added rawPixelDataToBuffer() function for access to compressed scanlines * Iex::BaseExc no longer derived from std::string. * Imath throw() specifiers removed * Initial Support for Python 3 ### Bugs: * 25+ various bug fixes (see detailed Release Notes for the full list) * This release addresses vulnerability [CVE-2017-12596](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12596). ### Build Fixes: * Various fixes to the cmake and autoconf build infrastructures * Various changes to support compiling for C++11 / C++14 / C++17 and GCC 6.3.1 * Various fixes to address Windows build issues * 60+ total build-related fixes (see detailed Release Notes for the full list) ### Diff Stats \[git diff --stat v2.2.1\] CHANGES.md | 1487 +++ CMakeLists.txt | 194 + Contrib/DtexToExr/bootstrap | 2 +- Contrib/DtexToExr/configure.ac | 2 +- IlmBase/CMakeLists.txt | 214 +- IlmBase/COPYING | 34 - IlmBase/Half/CMakeLists.txt | 107 +- IlmBase/Half/half.cpp | 6 +- IlmBase/Half/half.h | 8 +- IlmBase/Half/halfExport.h | 44 +- IlmBase/Half/halfLimits.h | 9 + IlmBase/HalfTest/CMakeLists.txt | 4 +- IlmBase/HalfTest/testLimits.cpp | 13 +- IlmBase/INSTALL | 2 - IlmBase/Iex/CMakeLists.txt | 81 +- IlmBase/Iex/IexBaseExc.cpp | 71 +- IlmBase/Iex/IexBaseExc.h | 87 +- IlmBase/Iex/IexMacros.h | 62 +- IlmBase/IexMath/CMakeLists.txt | 76 +- IlmBase/IexMath/IexMathFloatExc.cpp | 18 + IlmBase/IexMath/IexMathFloatExc.h | 36 +- IlmBase/IexTest/CMakeLists.txt | 4 +- IlmBase/IexTest/testBaseExc.cpp | 2 +- IlmBase/IlmThread/CMakeLists.txt | 78 +- IlmBase/IlmThread/IlmThread.cpp | 48 +- IlmBase/IlmThread/IlmThread.h | 48 +- IlmBase/IlmThread/IlmThreadForward.h | 8 + IlmBase/IlmThread/IlmThreadMutex.cpp | 7 +- IlmBase/IlmThread/IlmThreadMutex.h | 48 +- IlmBase/IlmThread/IlmThreadMutexPosix.cpp | 10 +- IlmBase/IlmThread/IlmThreadMutexWin32.cpp | 9 +- IlmBase/IlmThread/IlmThreadPool.cpp | 720 +- IlmBase/IlmThread/IlmThreadPool.h | 64 +- IlmBase/IlmThread/IlmThreadPosix.cpp | 2 + IlmBase/IlmThread/IlmThreadSemaphore.h | 49 +- .../IlmThread/IlmThreadSemaphorePosixCompat.cpp | 78 +- IlmBase/IlmThread/IlmThreadWin32.cpp | 6 + IlmBase/Imath/CMakeLists.txt | 130 +- IlmBase/Imath/ImathBox.cpp | 37 - IlmBase/Imath/ImathEuler.h | 7 +- IlmBase/Imath/ImathInt64.h | 3 + IlmBase/Imath/ImathMatrix.h | 56 +- IlmBase/Imath/ImathShear.cpp | 54 - IlmBase/Imath/ImathVec.cpp | 24 +- IlmBase/Imath/ImathVec.h | 48 +- IlmBase/Imath/Makefile.am | 4 +- IlmBase/ImathTest/CMakeLists.txt | 6 +- IlmBase/Makefile.am | 5 +- IlmBase/README | 70 - IlmBase/README.CVS | 16 - IlmBase/README.OSX | 101 - IlmBase/README.cmake.txt | 65 - IlmBase/README.git | 16 - IlmBase/README.md | 277 + IlmBase/README.namespacing | 83 - IlmBase/bootstrap | 4 +- IlmBase/config.windows/IlmBaseConfig.h | 1 + IlmBase/config/IlmBaseConfig.h.in | 7 + IlmBase/configure.ac | 50 +- IlmBase/m4/ax_cxx_compile_stdcxx.m4 | 982 ++ LICENSE | 34 + OpenEXR/AUTHORS | 2 + OpenEXR/CMakeLists.txt | 272 +- OpenEXR/COPYING | 34 - OpenEXR/INSTALL | 2 - OpenEXR/IlmImf/CMakeLists.txt | 396 +- OpenEXR/IlmImf/ImfAcesFile.h | 38 +- OpenEXR/IlmImf/ImfAttribute.cpp | 6 + OpenEXR/IlmImf/ImfAttribute.h | 8 +- OpenEXR/IlmImf/ImfB44Compressor.h | 10 +- OpenEXR/IlmImf/ImfCRgbaFile.h | 2 +- OpenEXR/IlmImf/ImfChannelList.h | 45 +- OpenEXR/IlmImf/ImfChromaticities.h | 5 +- OpenEXR/IlmImf/ImfCompositeDeepScanLine.h | 14 +- OpenEXR/IlmImf/ImfCompressionAttribute.h | 6 +- OpenEXR/IlmImf/ImfCompressor.h | 14 +- OpenEXR/IlmImf/ImfDeepCompositing.h | 6 +- OpenEXR/IlmImf/ImfDeepFrameBuffer.h | 38 +- OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp | 6 +- OpenEXR/IlmImf/ImfDeepScanLineInputFile.h | 20 +- OpenEXR/IlmImf/ImfDeepScanLineInputPart.h | 18 +- OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp | 14 +- OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h | 14 +- OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h | 12 +- OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp | 16 +- OpenEXR/IlmImf/ImfDeepTiledInputFile.h | 37 +- OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp | 2 +- OpenEXR/IlmImf/ImfDeepTiledInputPart.h | 34 +- OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp | 18 +- OpenEXR/IlmImf/ImfDeepTiledOutputFile.h | 33 +- OpenEXR/IlmImf/ImfDeepTiledOutputPart.h | 31 +- OpenEXR/IlmImf/ImfDwaCompressor.cpp | 232 +- OpenEXR/IlmImf/ImfDwaCompressor.h | 43 +- OpenEXR/IlmImf/ImfDwaCompressorSimd.h | 67 +- OpenEXR/IlmImf/ImfFastHuf.cpp | 62 +- OpenEXR/IlmImf/ImfFastHuf.h | 5 + OpenEXR/IlmImf/ImfFrameBuffer.h | 36 +- OpenEXR/IlmImf/ImfGenericInputFile.h | 5 +- OpenEXR/IlmImf/ImfGenericOutputFile.h | 6 +- OpenEXR/IlmImf/ImfHeader.h | 90 +- OpenEXR/IlmImf/ImfIO.h | 13 +- OpenEXR/IlmImf/ImfInputFile.cpp | 41 +- OpenEXR/IlmImf/ImfInputFile.h | 42 +- OpenEXR/IlmImf/ImfInputPart.cpp | 8 + OpenEXR/IlmImf/ImfInputPart.h | 22 +- OpenEXR/IlmImf/ImfInputPartData.h | 1 + OpenEXR/IlmImf/ImfInt64.h | 1 + OpenEXR/IlmImf/ImfKeyCode.h | 19 +- OpenEXR/IlmImf/ImfLut.h | 8 +- OpenEXR/IlmImf/ImfMisc.cpp | 55 +- OpenEXR/IlmImf/ImfMisc.h | 20 +- OpenEXR/IlmImf/ImfMultiPartInputFile.cpp | 4 +- OpenEXR/IlmImf/ImfMultiPartInputFile.h | 10 +- OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp | 4 +- OpenEXR/IlmImf/ImfMultiPartOutputFile.h | 10 +- OpenEXR/IlmImf/ImfName.h | 9 + OpenEXR/IlmImf/ImfOpaqueAttribute.h | 10 +- OpenEXR/IlmImf/ImfOptimizedPixelReading.h | 4 +- OpenEXR/IlmImf/ImfOutputFile.cpp | 95 +- OpenEXR/IlmImf/ImfOutputFile.h | 15 +- OpenEXR/IlmImf/ImfOutputPart.h | 13 +- OpenEXR/IlmImf/ImfOutputPartData.h | 23 +- OpenEXR/IlmImf/ImfPizCompressor.h | 10 +- OpenEXR/IlmImf/ImfPreviewImage.h | 14 +- OpenEXR/IlmImf/ImfPxr24Compressor.h | 10 +- OpenEXR/IlmImf/ImfRational.h | 3 +- OpenEXR/IlmImf/ImfRgbaFile.h | 47 +- OpenEXR/IlmImf/ImfRleCompressor.h | 7 +- OpenEXR/IlmImf/ImfScanLineInputFile.cpp | 42 +- OpenEXR/IlmImf/ImfScanLineInputFile.h | 37 +- OpenEXR/IlmImf/ImfSimd.h | 11 +- OpenEXR/IlmImf/ImfStdIO.cpp | 36 +- OpenEXR/IlmImf/ImfStdIO.h | 24 +- OpenEXR/IlmImf/ImfSystemSpecific.h | 15 +- OpenEXR/IlmImf/ImfTileOffsets.h | 16 +- OpenEXR/IlmImf/ImfTiledInputFile.cpp | 16 +- OpenEXR/IlmImf/ImfTiledInputFile.h | 32 +- OpenEXR/IlmImf/ImfTiledInputPart.h | 30 +- OpenEXR/IlmImf/ImfTiledOutputFile.cpp | 66 +- OpenEXR/IlmImf/ImfTiledOutputFile.h | 39 +- OpenEXR/IlmImf/ImfTiledOutputPart.h | 33 +- OpenEXR/IlmImf/ImfTiledRgbaFile.h | 83 +- OpenEXR/IlmImf/ImfTimeCode.h | 35 +- OpenEXR/IlmImf/ImfVersion.h | 4 +- OpenEXR/IlmImf/ImfZip.cpp | 191 +- OpenEXR/IlmImf/ImfZip.h | 8 + OpenEXR/IlmImf/ImfZipCompressor.h | 5 + OpenEXR/IlmImf/Makefile.am | 12 +- OpenEXR/IlmImf/dwaLookups.cpp | 10 +- OpenEXR/IlmImfExamples/CMakeLists.txt | 18 +- OpenEXR/IlmImfExamples/Makefile.am | 8 +- OpenEXR/IlmImfExamples/previewImageExamples.cpp | 6 +- OpenEXR/IlmImfFuzzTest/CMakeLists.txt | 27 +- OpenEXR/IlmImfFuzzTest/Makefile.am | 6 +- OpenEXR/IlmImfTest/CMakeLists.txt | 18 +- OpenEXR/IlmImfTest/Makefile.am | 6 +- OpenEXR/IlmImfTest/compareDwa.h | 4 +- OpenEXR/IlmImfTest/testDwaCompressorSimd.cpp | 47 +- OpenEXR/IlmImfUtil/CMakeLists.txt | 113 +- OpenEXR/IlmImfUtil/ImfDeepImage.h | 33 +- OpenEXR/IlmImfUtil/ImfDeepImageChannel.h | 35 +- OpenEXR/IlmImfUtil/ImfDeepImageIO.h | 26 +- OpenEXR/IlmImfUtil/ImfDeepImageLevel.cpp | 2 +- OpenEXR/IlmImfUtil/ImfDeepImageLevel.h | 44 +- OpenEXR/IlmImfUtil/ImfFlatImage.h | 29 +- OpenEXR/IlmImfUtil/ImfFlatImageChannel.h | 10 +- OpenEXR/IlmImfUtil/ImfFlatImageIO.h | 26 +- OpenEXR/IlmImfUtil/ImfFlatImageLevel.cpp | 2 +- OpenEXR/IlmImfUtil/ImfFlatImageLevel.h | 31 +- OpenEXR/IlmImfUtil/ImfImage.cpp | 4 +- OpenEXR/IlmImfUtil/ImfImage.h | 31 +- OpenEXR/IlmImfUtil/ImfImageChannel.h | 10 +- OpenEXR/IlmImfUtil/ImfImageDataWindow.cpp | 3 +- OpenEXR/IlmImfUtil/ImfImageDataWindow.h | 2 + OpenEXR/IlmImfUtil/ImfImageIO.h | 10 +- OpenEXR/IlmImfUtil/ImfImageLevel.cpp | 2 +- OpenEXR/IlmImfUtil/ImfImageLevel.h | 20 +- OpenEXR/IlmImfUtil/ImfSampleCountChannel.h | 23 +- OpenEXR/IlmImfUtil/ImfUtilExport.h | 46 + OpenEXR/IlmImfUtil/Makefile.am | 16 +- OpenEXR/IlmImfUtilTest/CMakeLists.txt | 20 +- OpenEXR/IlmImfUtilTest/Makefile.am | 6 +- OpenEXR/Makefile.am | 5 +- OpenEXR/README | 77 - OpenEXR/README.CVS | 16 - OpenEXR/README.OSX | 57 - OpenEXR/README.cmake.txt | 54 - OpenEXR/README.git | 16 - OpenEXR/README.md | 132 + OpenEXR/README.namespacing | 83 - OpenEXR/bootstrap | 4 +- OpenEXR/build.log | 11993 ------------------- OpenEXR/configure.ac | 284 +- OpenEXR/doc/Makefile.am | 1 - OpenEXR/doc/TheoryDeepPixels.pdf | Bin 331719 -> 334777 bytes OpenEXR/exr2aces/CMakeLists.txt | 10 +- OpenEXR/exrbuild/CMakeLists.txt | 13 +- OpenEXR/exrenvmap/CMakeLists.txt | 10 +- OpenEXR/exrenvmap/Makefile.am | 6 +- OpenEXR/exrheader/CMakeLists.txt | 15 +- OpenEXR/exrheader/Makefile.am | 6 +- OpenEXR/exrmakepreview/CMakeLists.txt | 10 +- OpenEXR/exrmakepreview/Makefile.am | 6 +- OpenEXR/exrmakepreview/makePreview.cpp | 6 +- OpenEXR/exrmaketiled/CMakeLists.txt | 9 +- OpenEXR/exrmaketiled/Makefile.am | 6 +- OpenEXR/exrmaketiled/makeTiled.cpp | 8 +- OpenEXR/exrmultipart/CMakeLists.txt | 13 +- OpenEXR/exrmultipart/Makefile.am | 8 +- OpenEXR/exrmultiview/CMakeLists.txt | 12 +- OpenEXR/exrmultiview/Makefile.am | 6 +- OpenEXR/exrstdattr/CMakeLists.txt | 13 +- OpenEXR/exrstdattr/Makefile.am | 6 +- OpenEXR/m4/ax_cxx_compile_stdcxx.m4 | 982 ++ OpenEXR/m4/path.pkgconfig.m4 | 63 +- OpenEXR_Viewers/AUTHORS | 12 - OpenEXR_Viewers/CMakeLists.txt | 71 +- OpenEXR_Viewers/COPYING | 34 - OpenEXR_Viewers/INSTALL | 2 - OpenEXR_Viewers/Makefile.am | 6 +- OpenEXR_Viewers/NEWS | 2 - OpenEXR_Viewers/README | 95 - OpenEXR_Viewers/README.CVS | 16 - OpenEXR_Viewers/README.OSX | 18 - OpenEXR_Viewers/README.md | 278 + OpenEXR_Viewers/README.win32 | 196 - OpenEXR_Viewers/bootstrap | 4 +- OpenEXR_Viewers/configure.ac | 47 +- OpenEXR_Viewers/exrdisplay/CMakeLists.txt | 15 +- OpenEXR_Viewers/exrdisplay/GlWindow3d.h | 5 + OpenEXR_Viewers/m4/ax_cxx_compile_stdcxx.m4 | 982 ++ OpenEXR_Viewers/playexr/CMakeLists.txt | 8 +- PyIlmBase/AUTHORS | 10 - PyIlmBase/CMakeLists.txt | 128 +- PyIlmBase/COPYING | 34 - PyIlmBase/INSTALL | 2 - PyIlmBase/Makefile.am | 7 +- PyIlmBase/NEWS | 2 - PyIlmBase/PyIex/CMakeLists.txt | 52 +- PyIlmBase/PyIex/PyIex.cpp | 4 +- PyIlmBase/PyIex/PyIex.h | 4 +- PyIlmBase/PyIex/PyIexExport.h | 45 +- PyIlmBase/PyIex/iexmodule.cpp | 5 +- PyIlmBase/PyIexTest/CMakeLists.txt | 4 +- PyIlmBase/PyImath/CMakeLists.txt | 53 +- PyIlmBase/PyImath/PyImath.cpp | 5 +- PyIlmBase/PyImath/PyImath.h | 8 +- PyIlmBase/PyImath/PyImathAutovectorize.cpp | 2 +- PyIlmBase/PyImath/PyImathAutovectorize.h | 6 +- PyIlmBase/PyImath/PyImathBasicTypes.cpp | 9 +- PyIlmBase/PyImath/PyImathBasicTypes.h | 4 +- PyIlmBase/PyImath/PyImathBox.cpp | 18 +- PyIlmBase/PyImath/PyImathBox.h | 4 +- PyIlmBase/PyImath/PyImathBox2Array.cpp | 4 +- PyIlmBase/PyImath/PyImathBox3Array.cpp | 4 +- PyIlmBase/PyImath/PyImathBoxArrayImpl.h | 10 +- PyIlmBase/PyImath/PyImathColor.h | 3 +- PyIlmBase/PyImath/PyImathColor3.cpp | 8 +- PyIlmBase/PyImath/PyImathColor3ArrayImpl.h | 4 +- PyIlmBase/PyImath/PyImathColor4.cpp | 6 +- PyIlmBase/PyImath/PyImathColor4Array2DImpl.h | 7 +- PyIlmBase/PyImath/PyImathColor4ArrayImpl.h | 4 +- PyIlmBase/PyImath/PyImathEuler.cpp | 8 +- PyIlmBase/PyImath/PyImathEuler.h | 3 +- PyIlmBase/PyImath/PyImathExport.h | 52 +- PyIlmBase/PyImath/PyImathFixedArray.cpp | 2 +- PyIlmBase/PyImath/PyImathFixedArray.h | 11 +- PyIlmBase/PyImath/PyImathFixedArray2D.h | 9 + PyIlmBase/PyImath/PyImathFixedMatrix.h | 9 + PyIlmBase/PyImath/PyImathFixedVArray.cpp | 14 +- PyIlmBase/PyImath/PyImathFixedVArray.h | 2 +- PyIlmBase/PyImath/PyImathFrustum.cpp | 8 +- PyIlmBase/PyImath/PyImathFrustum.h | 3 +- PyIlmBase/PyImath/PyImathFun.cpp | 8 +- PyIlmBase/PyImath/PyImathFun.h | 2 +- PyIlmBase/PyImath/PyImathLine.cpp | 16 +- PyIlmBase/PyImath/PyImathLine.h | 2 +- PyIlmBase/PyImath/PyImathM44Array.cpp | 6 +- PyIlmBase/PyImath/PyImathM44Array.h | 2 +- PyIlmBase/PyImath/PyImathMatrix.h | 3 +- PyIlmBase/PyImath/PyImathMatrix33.cpp | 8 +- PyIlmBase/PyImath/PyImathMatrix44.cpp | 10 +- PyIlmBase/PyImath/PyImathOperators.h | 4 +- PyIlmBase/PyImath/PyImathPlane.cpp | 20 +- PyIlmBase/PyImath/PyImathPlane.h | 2 +- PyIlmBase/PyImath/PyImathQuat.cpp | 10 +- PyIlmBase/PyImath/PyImathQuat.h | 3 +- PyIlmBase/PyImath/PyImathRandom.cpp | 10 +- PyIlmBase/PyImath/PyImathShear.cpp | 8 +- PyIlmBase/PyImath/PyImathStringArray.cpp | 6 +- PyIlmBase/PyImath/PyImathStringArray.h | 4 +- PyIlmBase/PyImath/PyImathStringArrayRegister.h | 2 +- PyIlmBase/PyImath/PyImathStringTable.cpp | 4 +- PyIlmBase/PyImath/PyImathTask.cpp | 10 +- PyIlmBase/PyImath/PyImathTask.h | 34 +- PyIlmBase/PyImath/PyImathUtil.cpp | 6 +- PyIlmBase/PyImath/PyImathUtil.h | 14 +- PyIlmBase/PyImath/PyImathVec.h | 4 +- PyIlmBase/PyImath/PyImathVec2Impl.h | 12 +- PyIlmBase/PyImath/PyImathVec3ArrayImpl.h | 12 +- PyIlmBase/PyImath/PyImathVec3Impl.h | 6 +- PyIlmBase/PyImath/PyImathVec4ArrayImpl.h | 10 +- PyIlmBase/PyImath/PyImathVec4Impl.h | 6 +- PyIlmBase/PyImath/imathmodule.cpp | 38 +- PyIlmBase/PyImathNumpy/CMakeLists.txt | 25 +- PyIlmBase/PyImathNumpy/imathnumpymodule.cpp | 14 +- PyIlmBase/PyImathNumpyTest/CMakeLists.txt | 6 +- PyIlmBase/PyImathNumpyTest/pyImathNumpyTest.in | 81 +- PyIlmBase/PyImathTest/CMakeLists.txt | 2 + PyIlmBase/PyImathTest/pyImathTest.in | 1090 +- PyIlmBase/README | 51 - PyIlmBase/README.OSX | 21 - PyIlmBase/README.md | 99 + PyIlmBase/bootstrap | 4 +- PyIlmBase/configure.ac | 64 +- PyIlmBase/m4/ax_cxx_compile_stdcxx.m4 | 982 ++ README | 68 - README.md | 202 + cmake/FindIlmBase.cmake | 192 + cmake/FindNumPy.cmake | 51 + cmake/FindOpenEXR.cmake | 198 + 321 files changed, 12796 insertions(+), 16398 deletions(-) ### Commits \[ git log v2.2.1...v.2.3.0\] * [Reverted python library -l line logic to go back to the old PYTHON_VERSION based logic.](https://github.com/AcademySoftwareFoundation/openexr/commit/02310c624547fd765cd6e08abe459755d4ecebcc) ([Nick Rasmussen](@nick@ilm.com), 2018-08-09) * [Updated build system to use local copies of the ax_cxx_copmile_stdcxx.m4 macro.](https://github.com/AcademySoftwareFoundation/openexr/commit/3d6c9302b3d7f394a90ac3c95d12b1db1c183812) ([Nick Rasmussen](@nick@ilm.com), 2018-08-09) * [accidentally commited Makefile instead of Makefile.am](https://github.com/AcademySoftwareFoundation/openexr/commit/46dda162ef2b3defceaa25e6bdd2b71b98844685) ([Cary Phillips](@cary@ilm.com), 2018-08-09) * [update CHANGES.md](https://github.com/AcademySoftwareFoundation/openexr/commit/ea46c15be9572f81549eaa76a1bdf8dbe364f780) ([Cary Phillips](@cary@ilm.com), 2018-08-08) * [Added FindNumPy.cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/63870bb10415ca7ea76ecfdafdfe70f5894f66f2) ([Nick Porcino](@meshula@hotmail.com), 2018-08-08) * [Add PyImathNumpyTest to Makefile and configure.ac](https://github.com/AcademySoftwareFoundation/openexr/commit/36abd2b728e8759b010ceffe94363d5f473fe6dc) ([Cary Phillips](@cary@ilm.com), 2018-08-08) * [Add ImfExportUtil.h to Makefile.am](https://github.com/AcademySoftwareFoundation/openexr/commit/82f78f4a895e29b42d2ccc0d66be08948203f507) ([Cary Phillips](@cary@ilm.com), 2018-08-08) * [fix pyilmbase tests, static compilation](https://github.com/AcademySoftwareFoundation/openexr/commit/75c918b65c2394c7f7a9f769fee87572d06e81b5) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-09) - python extensions must be shared, so can not follow the overall lib type for the library. - the code should be compiled fPIC when building a static library such that it can be linked into a .so - remove the dependency on the particle python extension in the numpy test - add environment variables such that the python tests will work in the build tree without a "make install" (win32 doesn't neede ld_library_path, but it doesn't hurt, but may need path?) Signed-off-by: Kimball Thurston * [fix OPENEXR_VERSION and OPENEXR_SOVERSION](https://github.com/AcademySoftwareFoundation/openexr/commit/4481442b467e492a3a515b0992391dc160282786) ([Cary Phillips](@cary@ilm.com), 2018-08-08) * [update readme documentation for new cmake option](https://github.com/AcademySoftwareFoundation/openexr/commit/081c9f9f9f26afc6943f1b2e63d171802895bee5) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) Signed-off-by: Kimball Thurston * [fix compile errors under c++17](https://github.com/AcademySoftwareFoundation/openexr/commit/6d9e3f6e2a9545e9d060f599967868d228d9a56a) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) Fixes errors with collisions due to the addition of clamp to the std namespace Signed-off-by: Kimball Thurston * [add last ditch effort for numpy](https://github.com/AcademySoftwareFoundation/openexr/commit/af5fa2d84acf74e411d6592201890b1e489978c4) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) Apparently not all distributions include a FindNumPy.cmake or similar, even if numpy is indeed installed. This makes a second effort to find using python itself Signed-off-by: Kimball Thurston * [make pyilmbase tests conditional](https://github.com/AcademySoftwareFoundation/openexr/commit/07951c8bdf6164e34f37c3d88799e4e98e46d1ee) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) This makes the PyIlmBase tests conditional in the same manner as OpenEXR and IlmBase Signed-off-by: Kimball Thurston * [optimize regeneration of config files](https://github.com/AcademySoftwareFoundation/openexr/commit/b610ff33e827c38ac3693d3e43ad973c891d808c) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) This makes the config files write to a temporary file, then use cmake's configure_file command with copyonly to compare the contents and not copy if they are the same. Incremental builds are much faster as a result when working on new features and adding files to the cmakelists.txt Signed-off-by: Kimball Thurston * [make fuzz test optional like autoconf](https://github.com/AcademySoftwareFoundation/openexr/commit/79a50ea7eb869a94bb226841aebad9d46ecc3836) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) This makes running the fuzz tests as part of the "make test" rule optional. Even with this off by default, if building tests is enabled, the fuzz test will still be compiled, and is available to run via "make fuzz". This should enable a weekly jenkins build config to run the fuzz tests, given that it takes a long time to run. Signed-off-by: Kimball Thurston * [Fix SO version](https://github.com/AcademySoftwareFoundation/openexr/commit/f4055c33bb128bd4544d265b167337c584364716) ([Nick Porcino](@meshula@hotmail.com), 2018-08-07) * [CHANGES.md formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/8cd1b9210855fa4f6923c1b94df8a86166be19b1) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [format old release notes](https://github.com/AcademySoftwareFoundation/openexr/commit/3c5b5f894def68cf5240e8f427147c867f745912) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [release notes upates](https://github.com/AcademySoftwareFoundation/openexr/commit/534e4bcde71ce34b9f8fa9fc39e9df1a58aa3f80) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [CHANGES.md](https://github.com/AcademySoftwareFoundation/openexr/commit/471d7bd1c558c54ecc3cbbb2a65932f1e448a370) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [OpenEXR_Viewers/README.md formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/806db743cf0bcb7710d08f56ee6f2ece10e31367) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [more README fixes.](https://github.com/AcademySoftwareFoundation/openexr/commit/82bc701e605e092ae5f31d142450d921c293ded1) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [README.md cleanup](https://github.com/AcademySoftwareFoundation/openexr/commit/d1d9760b084f460cf21de2b8e273e8d6adcfb4f6) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [fix dependencies when building static](https://github.com/AcademySoftwareFoundation/openexr/commit/03329c8d34c93ecafb4a35a8cc645cd3bea14217) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-08) Signed-off-by: Kimball Thurston * [fix exrdisplay compile under cmake](https://github.com/AcademySoftwareFoundation/openexr/commit/a617dc1a9cc8c7b85df040f5587f1727dec31caf) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-07) Signed-off-by: Kimball Thurston * [PyIlmBase README.md cleanup](https://github.com/AcademySoftwareFoundation/openexr/commit/a385fd4f09ab5dd1163fab6870393f1b71e163eb) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [Updates to README's](https://github.com/AcademySoftwareFoundation/openexr/commit/0690e762bb45afadd89e94838270080447998a48) ([Cary Phillips](@cary@ilm.com), 2018-08-07) * [added --foreign to automake in bootstrap](https://github.com/AcademySoftwareFoundation/openexr/commit/4a74696f2066dd4bb58433bbcb706fdf526a7770) ([Cary Phillips](@cary@ilm.com), 2018-08-06) * [Remove obsolete README files from Makefile.am](https://github.com/AcademySoftwareFoundation/openexr/commit/57259b7811f3adce23a1e4c99411d686c55fefed) ([Cary Phillips](@cary@ilm.com), 2018-08-06) * [Removed COPYING, INSTALL, README.cmake.txt](https://github.com/AcademySoftwareFoundation/openexr/commit/54d3bbcfef10a367591cced99f759b89e8478b07) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [cleaned up README files for root and IlmBase](https://github.com/AcademySoftwareFoundation/openexr/commit/54e6ae149addd5b9673d1ee0f2954759b5ed073d) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [LIBTOOL_CURRENT=24](https://github.com/AcademySoftwareFoundation/openexr/commit/7b7ea9c86bbf8744cb41df6fa7e5f7dd270294a5) ([Cary Phillips](@cary@ilm.com), 2018-08-06) * [bump version to 2.3](https://github.com/AcademySoftwareFoundation/openexr/commit/8a7b4ad263103e725fda4e624962cc0f559c4faa) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [folding in internal ILM changes - conditional delete in exception catch block.](https://github.com/AcademySoftwareFoundation/openexr/commit/656f898dff3ab7d06c4d35219385251f7948437b) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [Removed COPYING, INSTALL, README.cmake.txt](https://github.com/AcademySoftwareFoundation/openexr/commit/94ece7ca86ffccb3ec2bf4138f4ad47e3f496167) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [edits to READMEs](https://github.com/AcademySoftwareFoundation/openexr/commit/405fa911ad974eeaf3c3769820b7c4a0c59f0099) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [README fixes.](https://github.com/AcademySoftwareFoundation/openexr/commit/c612d8276a5d9e28ae6bdc39b770cbc083e21cf4) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [cleaned up README files for root and IlmBase](https://github.com/AcademySoftwareFoundation/openexr/commit/cda04c6451b0b196c887b03e68d8a80863f58832) ([Cary Phillips](@cary@ilm.com), 2018-08-05) * [Fallback default system provided Boost Python](https://github.com/AcademySoftwareFoundation/openexr/commit/a174497d1fd84378423f733053f1a058608d81f0) ([Thanh Ha](@thanh.ha@linuxfoundation.org), 2018-08-03) User provided Python version via OPENEXR_PYTHON_MAJOR and OPENEXR_PYTHON_MINOR parameters, failing that fallback onto the system's default "python" whichever that may be. Signed-off-by: Thanh Ha * [fix double delete in multipart files, check logic in others](https://github.com/AcademySoftwareFoundation/openexr/commit/da96e3759758c1fcac5963e07eab8e1f58a674e7) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) Multipart files have a Data object that automatically cleans up it's stream if appropriate, the other file objects have the destructor of the file object perform the delete (instead of Data). This causes a double delete to happen in MultiPart objects when unable to open a stream. Additionally, fix tabs / spaces to just be spaces Signed-off-by: Kimball Thurston * [fix scenario where ilmimf is being compiled from parent directory](https://github.com/AcademySoftwareFoundation/openexr/commit/c246315fe392815399aee224f38bafd01585594b) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) need to use current source dir so test images can be found Signed-off-by: Kimball Thurston * [Fix logic errors with BUILD_DWALOOKUPS](https://github.com/AcademySoftwareFoundation/openexr/commit/dc7cb41c4e8a3abd60dec46d0bcb6a1c9ef31452) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) Signed-off-by: Kimball Thurston * [remove debug print](https://github.com/AcademySoftwareFoundation/openexr/commit/8e16aa8930a85f1ef3f1f6ba454af275aabc205d) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) Signed-off-by: Kimball Thurston * [fully set variables as pkg config does not seem to by default](https://github.com/AcademySoftwareFoundation/openexr/commit/f478511f796e5d05dada28f9841dcf9ebd9730ac) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) * [add check with error message for zlib, fix defaults, restore old thread check](https://github.com/AcademySoftwareFoundation/openexr/commit/788956537282cfcca712c1e9690d72cd19978ce0) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-04) * [PR #187 CMake enhancements to speed up dependency builds of OpenEXR.](https://github.com/AcademySoftwareFoundation/openexr/commit/17e10ab10ddf937bc2809bda858bf17af6fb3448) ([Nick Porcino](@meshula@hotmail.com), 2018-08-02) * [restore prefix, update to use PKG_CHECK_MODULES](https://github.com/AcademySoftwareFoundation/openexr/commit/fb9d1be5c07779c90e7744ccbf27201fcafcdfdb) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-03) previous commit from dracwyrm had made it such that pkg-config must be used and ilmbase must be installed in the default pkg-config path by default. restore the original behaviour by which a prefix could be provided, yet still retain use of PKG_CHECK_MODULES to find IlmBase if the prefix is not specified, and continue to use pkg-config to find zlib instead of assuming -lz Signed-off-by: Kimball Thurston * [restore original API for Lock since we can't use typedef to unique_lock](https://github.com/AcademySoftwareFoundation/openexr/commit/e7fc2258a16ab7fe17d24855d16d4e56b80c172e) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-02) * [fixes #292, issue with utf-8 filenames](https://github.com/AcademySoftwareFoundation/openexr/commit/846fe64c584ebb89434aaa02f5d431fbd3ca6165) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-01) windows needs to widen the string to properly open files, this implements a solution for compiling with MSVC anyway using the extension for fstream to take a wchar Signed-off-by: Kimball Thurston * [fix maintainer mode issue, extra line in paste](https://github.com/AcademySoftwareFoundation/openexr/commit/772ff9ad045032fc338af1b684cb50983191bc0d) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-08-02) * [Default the python bindings to on](https://github.com/AcademySoftwareFoundation/openexr/commit/dc5e26136b1c5edce911ff0eccc17cda40388b54) ([Nick Porcino](@meshula@hotmail.com), 2018-08-01) * [Add Find scripts, and ability to build OpenEXR with pre-existing IlmBase](https://github.com/AcademySoftwareFoundation/openexr/commit/34ee51e9118097f784653f08c9482c886f83d2ef) ([Nick Porcino](@meshula@hotmail.com), 2018-08-01) * [fix names, disable rules when not building shared](https://github.com/AcademySoftwareFoundation/openexr/commit/dbd3b34baf4104e844c273b682e7b133304294f2) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-31) * [add suffix variable for target names to enable static-only build](https://github.com/AcademySoftwareFoundation/openexr/commit/7b1ed10e241e793db9d8933df30dd305a93835dd) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-31) * [The string field is now called _message.](https://github.com/AcademySoftwareFoundation/openexr/commit/bd32e84632da4754cfe6db47f2e72c29f4d7df27) ([Cary Phillips](@cary@ilm.com), 2018-08-01) * [C++11 support for numeric_limits::max_digits10() and lowest()](https://github.com/AcademySoftwareFoundation/openexr/commit/2d931bab38840ab3cdf9c6322767a862aae4037d) ([Cary Phillips](@cary@ilm.com), 2018-07-31) * [fixes for GCC 6.3.1 (courtesy of Will Harrower): - renamed local variables in THROW macros to avoid warnings - cast to bool](https://github.com/AcademySoftwareFoundation/openexr/commit/7fda69a377ee41979284137795cb338bb3c6d147) ([Cary Phillips](@cary@rnd-build7-sf-38.lucasfilm.com), 2018-07-31) * [renames name to message and removes implicit cast](https://github.com/AcademySoftwareFoundation/openexr/commit/54105e3c292c6884e7870ecfddb561deda7a3458) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-31) This removes the implicit cast, which is arguably more "standard", and also less surprising. Further, renames the name function to message to match internal ILM changes, and message makes more sense as a function name than ... name. * [Remove IEX_THROW_SPEC](https://github.com/AcademySoftwareFoundation/openexr/commit/02c896501da244ec6345d7ee5ef825d71ba1f0a2) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-31) This removes the macro and uses therein. We changed the API with removing the subclass from std::string of Iex::BaseExc, so there is no reason to retain this compatibility as well, especially since it isn't really meaningful anyway in (modern) C++ * [CMake3 port. Various Windows fixes](https://github.com/AcademySoftwareFoundation/openexr/commit/b2d37be8b874b300be1907f10339cac47e39170b) ([Nick Porcino](@meshula@hotmail.com), 2018-07-29) * [changes to enable custom namespace defines to be used](https://github.com/AcademySoftwareFoundation/openexr/commit/acd76e16276b54186096b04b06bd118eb32a1bcf) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-29) * [fix extraneous unsigned compare accidentally merged](https://github.com/AcademySoftwareFoundation/openexr/commit/a56773bd7a1f9a8bb10afe5fb36c4e03f622eff6) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-29) * [Use proper definition of namespaces instead of default values.](https://github.com/AcademySoftwareFoundation/openexr/commit/c6978f9fd998df32b2c56a7b25bbbd52005bbf9e) ([Juri Abramov](@gabramov@nvidia.com), 2014-08-18) * [fixes #260, out of bounds vector access](https://github.com/AcademySoftwareFoundation/openexr/commit/efc360fc17935453e95f62939dd5d7caacce4bf7) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-29) noticed by Google Autofuzz Signed-off-by: Kimball Thurston * [fix potential io streams leak in case of exceptions during 'initialize' function](https://github.com/AcademySoftwareFoundation/openexr/commit/19bac86f27bab8649858ef79658224e9a54cb4cf) ([CAHEK7](@ghosts.in.a.box@gmail.com), 2016-02-12) * [OpenEXR: Fix build system and change doc install](https://github.com/AcademySoftwareFoundation/openexr/commit/60cc8b711ab402c5526ca1f872de5209ad15ec7d) ([dracwyrm](@j.scruggs@gmail.com), 2017-08-11) The build sysem for the OpenEXR sub-module is has issues. This patch is being used on Gentoo Linux with great success. It also adresses the issue of linking to previously installed versions. Signed-off by: Jonathan Scruggs (j.scruggs@gmail.com) Signed-off by: David Seifert (soap@gentoo.org) * [Note that numpy is required to build PyIlmBase](https://github.com/AcademySoftwareFoundation/openexr/commit/76935a912a8e365ed4fe8c7a54b60561790dafd5) ([Thanh Ha](@thanh.ha@linuxfoundation.org), 2018-07-20) Signed-off-by: Thanh Ha * [Fixed exports on DeepImageChannel and FlatImageChannel. If the whole class isn't exported, the typeinfo doesn't get exported, and so dynamic casting into those classes will not work.](https://github.com/AcademySoftwareFoundation/openexr/commit/942ff971d30cba1b237c91e9f448376d279dc5ee) ([Halfdan Ingvarsson](@halfdan@sidefx.com), 2014-10-06) Also fixed angle-bracket include to a quoted include. * [Fixed angle bracket vs quote includes.](https://github.com/AcademySoftwareFoundation/openexr/commit/fd8570927a7124ff2990f5f38556b2ec03d77a44) ([Halfdan Ingvarsson](@halfdan@sidefx.com), 2014-03-18) * [Change IexBaseExc to no longer derive from std::string, but instead include it as a member variable. This resolves a problem with MSVC 2012 and dllexport-ing template classes.](https://github.com/AcademySoftwareFoundation/openexr/commit/fa59776fd83a8f35ed5418b83bbc9975ba0ef3bc) ([Halfdan Ingvarsson](@halfdan@sidefx.com), 2014-03-03) * [make code more amenable to compiling with mingw for cross-compiling](https://github.com/AcademySoftwareFoundation/openexr/commit/dd867668c4c63d23c034cc2ea8f2352451e8554d) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-07-29) Signed-off-by: Kimball Thurston * [Fix shebang line to bash](https://github.com/AcademySoftwareFoundation/openexr/commit/d3512e07a5af5053397ed62bd0d306b10357358c) ([Thanh Ha](@thanh.ha@linuxfoundation.org), 2018-07-19) Depending on the distro running the script the following error might appear: ./bootstrap: 4: [: Linux: unexpected operator This is because #!/bin/sh is not the same on every distro and this script is actually expecting bash. So update the shebang line to be bash. Signed-off-by: Thanh Ha * [Visual Studio and Windows fixes](https://github.com/AcademySoftwareFoundation/openexr/commit/4cfefeab4be94b8c46d604075367b6496d29dcb5) ([Liam Fernandez](@liam@utexas.edu), 2018-06-20) IlmBase: Fix IF/ELSEIF clause (WIN32 only) PyImath: Install *.h in 'include' dir PyImathNumpy: Change python library filename to 'imathnumpy.pyd' (WIN32 only) * [Fix probable typo for static builds.](https://github.com/AcademySoftwareFoundation/openexr/commit/31e1ae8acad3126a63044dfb8518d70390131c7b) ([Simon Otter](@skurmedel@gmail.com), 2018-06-18) * [Must also export protected methods](https://github.com/AcademySoftwareFoundation/openexr/commit/17384ee01e5fa842f282c833ab2bc2aa33e07125) ([Nick Porcino](@meshula@hotmail.com), 2018-06-10) * [IlmImfUtilTest compiles successfully](https://github.com/AcademySoftwareFoundation/openexr/commit/6093789bc7b7c543f128ab2b055987808ec15167) ([Nick Porcino](@meshula@hotmail.com), 2018-06-09) * [IlmImfUtil now builds on Windows](https://github.com/AcademySoftwareFoundation/openexr/commit/d7328287d1ea363ab7839201e90d7d7f4deb635f) ([Nick Porcino](@meshula@hotmail.com), 2018-06-09) * [Set python module suffix per platform](https://github.com/AcademySoftwareFoundation/openexr/commit/39b9edfdfcad5e77601d4462a6f9ba93bef83835) ([Nick Porcino](@meshula@hotmail.com), 2018-06-05) * [fix include ifdef](https://github.com/AcademySoftwareFoundation/openexr/commit/32723d8112d1addf0064e8295b824faab60f0162) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-05-26) * [switch from shared pointer to a manually counted object as gcc 4.8 and 4.9 do not provide proper shared_ptr atomic functions](https://github.com/AcademySoftwareFoundation/openexr/commit/3f532a7ab81c33f61dc6786a8c7ce6e0c09acc07) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-05-26) * [Fix typos to TheoryDeepPixels document](https://github.com/AcademySoftwareFoundation/openexr/commit/655f96032e0eddd868a122fee80bd558e0cbf17d) ([peterhillman](@peter@peterhillman.org.uk), 2018-05-17) Equations 6 and 7 were incorrect. * [initial port of PyIlmBase to python 3](https://github.com/AcademySoftwareFoundation/openexr/commit/84dbf637c5c3ac4296181dd93de4fb5ffdc4b582) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-05-04) * [replicate configure / cmake changes from ilmbase](https://github.com/AcademySoftwareFoundation/openexr/commit/00df2c72ca1b7cb148e19a9bdc44651a6c74c9e4) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-05-04) This propagates the same chnages to configure.ac and cmakelists.txt to enable compiling with c++11/14. Additionally, adds some minor changes to configure to enable python 3 to be configured (source code changes tbd) * [add move constructor and assignment operator](https://github.com/AcademySoftwareFoundation/openexr/commit/cfebcc24e1a1cc307678ea757ec38bff02a5dc51) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-05-03) * [Fix Windows Python binding builds. Does not address PyImath runtime issues, but does allow build to succeed](https://github.com/AcademySoftwareFoundation/openexr/commit/15ce54ca02fdfa16c4a99f45a30c7a54826c6ac3) ([Nick Porcino](@meshula@hotmail.com), 2018-04-30) * [Fix c++11 detection issue on windows. Fix ilmbase DLL export warnings](https://github.com/AcademySoftwareFoundation/openexr/commit/7376f9b736f9503a9d34b67c99bc48ce826a6334) ([Nick Porcino](@meshula@hotmail.com), 2018-04-27) * [enable different c++ standards to be selected instead of just c++14](https://github.com/AcademySoftwareFoundation/openexr/commit/99ecfcabbc2b95acb40283f04ab358b3db9cc0f9) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-15) * [Incorporate review feedback](https://github.com/AcademySoftwareFoundation/openexr/commit/99b367d963ba0892e7ab830458b6a990aa3033ce) ([Nick Porcino](@meshula@hotmail.com), 2018-04-04) * [add compatibility std::condition_variable semaphore when posix semaphores not available](https://github.com/AcademySoftwareFoundation/openexr/commit/b6dc2a6b71f9373640d988979f9ae1929640397a) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [fix error overwriting beginning of config file](https://github.com/AcademySoftwareFoundation/openexr/commit/01680dc4d90c9f7fd64e498e57588f630a52a214) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [remove the dynamic exception for all versions of c++ unless FORCE_CXX03 is on](https://github.com/AcademySoftwareFoundation/openexr/commit/45cb2c8fb2418afaa3900c553e26ad3886cd5acf) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [ThreadPool improvements](https://github.com/AcademySoftwareFoundation/openexr/commit/bf0cb8cdce32fce36017107c9982e1e5db2fb3fa) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) - switch to use c++11 features - Add API to enable replacement of the thread pool - Add custom, low-latency handling when threads is 0 - Lower lock boundary when adding tasks (or eliminate in c++11 mode) * [switch mutex to be based on std::mutex when available](https://github.com/AcademySoftwareFoundation/openexr/commit/848c8c329b16aeee0d3773e827d506a2a53d4840) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [switch IlmThread to use c++11 threads when enabled](https://github.com/AcademySoftwareFoundation/openexr/commit/eea1e607177e339e05daa1a2ec969a9dd12f2497) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [use dynamic exception macro to avoid warnings in c++14 mode](https://github.com/AcademySoftwareFoundation/openexr/commit/610179cbe3ffc2db206252343e75a16221d162b4) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [add #define to manage dynamic exception deprecation in c++11/14](https://github.com/AcademySoftwareFoundation/openexr/commit/b133b769aaee98566e695191476f59f32eece591) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [configuration changes to enable c++14](https://github.com/AcademySoftwareFoundation/openexr/commit/5f58c94aea83d44e27afd1f65e4defc0f523f6be) ([Kimball Thurston](@kdt3rd@gmail.com), 2018-04-04) * [Cmake now building OpenEXR successfully for Windows](https://github.com/AcademySoftwareFoundation/openexr/commit/ac055a9e50c974f4cd58c28a5a0bb96011812072) ([Nick Porcino](@meshula@hotmail.com), 2018-03-28) * [Missing symbols on Windows due to missing IMF_EXPORT](https://github.com/AcademySoftwareFoundation/openexr/commit/965c1eb6513ad80c71b425c8a1b04a70b3bae291) ([Ibraheem Alhashim](@ibraheem.alhashim@gmail.com), 2018-03-05) * [Implement SIMD-accelerated ImfZip::uncompress](https://github.com/AcademySoftwareFoundation/openexr/commit/32f2aa58fe4f6f6691eef322fdfbbc9aa8363f80) ([John Loy](@jloy@pixar.com), 2017-04-12) The main bottleneck in ImfZip::uncompress appears not to be zlib but the predictor & interleaving loops that run after zlib's decompression. Fortunately, throughput in both of these loops can be improved with SIMD operations. Even though each trip of the predictor loop has data dependencies on all previous values, the usual SIMD prefix-sum construction is able to provide a significant speedup. While the uses of SSSE3 and SSE4.1 are minor in this change and could maybe be replaced with some slightly more complicated SSE2, SSE4.1 was released in 2007, so it doesn't seem unreasonable to require it in 2017. * [Compute sample locations directly in Imf::readPerDeepLineTable.](https://github.com/AcademySoftwareFoundation/openexr/commit/e64095257a29f9bc423298ee8dbc09a317f22046) ([John Loy](@jloy@pixar.com), 2017-04-06) By changing the function to iterate over sample locations directly instead of discarding unsampled pixel positions, we can avoid computing a lot of modulos (more than one per pixel.) Even on modern x86 processors, idiv is a relatively expensive instruction. Though it may appear like this optimization could be performed by a sufficiently sophisticated compiler, gcc 4.8 does not get there (even at -O3.) * [Manually hoist loop invariants in Imf::bytesPerDeepLineTable.](https://github.com/AcademySoftwareFoundation/openexr/commit/71b8109a4ad123ef0d5783f01922463a16d2ca59) ([John Loy](@jloy@pixar.com), 2017-04-05) This is primarily done to avoid a call to pixelTypeSize within the inner loop. In particular, gcc makes the call to pixelTypeSize via PLT indirection so it may have arbitrary side-effects (i.e. ELF symbol interposition strikes again) and may not be moved out of the loop by the compiler. * [Inline Imf::sampleCount; this is an ABI-breaking change.](https://github.com/AcademySoftwareFoundation/openexr/commit/5aa0afd5a4f8df9e09d6461f115e6e0cec5cbe46) ([John Loy](@jloy@pixar.com), 2017-03-29) gcc generates calls to sampleCount via PLT indirection even within libIlmImf. As such, they are not inlined and must be treated as having arbitrary side effects (because of ELF symbol interposition.) Making addressing computations visible at call sites allows a much wider range of optimizations by the compiler beyond simply eliminating the function call overhead. * [Delete build.log](https://github.com/AcademySoftwareFoundation/openexr/commit/148f1c230b5ecd94d795ca172a8246785c7caca7) ([Arkady Shapkin](@arkady.shapkin@gmail.com), 2017-02-18) * [fix defect in semaphore implementation which caused application hang at exit time, because not all worker threads get woken up when task semaphore is repeatedly posted (to wake them up) after setting the stopping flag in the thread pool](https://github.com/AcademySoftwareFoundation/openexr/commit/4706d615e942462a532381a8a86bc5fe820c6816) ([Richard Goedeken](@Richard@fascinationsoftware.com), 2016-11-22) * [fix comparison of unsigned expression < 0 (Issue #165)](https://github.com/AcademySoftwareFoundation/openexr/commit/9e3913c94c55549640c732f549d2912fbd85c336) ([CAHEK7](@ghosts.in.a.box@gmail.com), 2016-02-15) * [Added Iex library once more for linker dependency](https://github.com/AcademySoftwareFoundation/openexr/commit/b0b50791b5b36fddb010b5ad630dd429f947a080) ([Eric Sommerlade](@es0m@users.noreply.github.com), 2015-02-20) * [windows/cmake: Commands depend on Half.dll which needs to be in path. Running commands in Half.dll's directory addresses this and the commands run on first invocation](https://github.com/AcademySoftwareFoundation/openexr/commit/1a23716fd7e9ae167f53c7f2099651ede1279fbb) ([E Sommerlade](@es0m@users.noreply.github.com), 2015-02-10) * [Fixed memory corruption / actual crashes on Window](https://github.com/AcademySoftwareFoundation/openexr/commit/c330c40e1962257b0e59328fdceaa9cdcde3041b) ([JuriAbramov](@openexr@dr-abramov.de), 2015-01-19) Fixed memory corruption caused by missing assignment operator with non-trivial copy constructor logic. FIxes crashes on Windows when "dwaa" or "dwab" codecs are used for saving files. * [std namespace should be specified for transform](https://github.com/AcademySoftwareFoundation/openexr/commit/4a00a9bc6c92b20443c61f5e9877123e7fef16e6) ([JuriAbramov](@openexr@dr-abramov.de), 2014-08-20) Fixes build with some VS and clang version. * [m4/path.pkgconfig.m4: use PKG_PROG_PKG_CONFIG to find correct pkg-config](https://github.com/AcademySoftwareFoundation/openexr/commit/056cb9f09efa9116c7f5fb8bc0717a260ad23744) ([Michael Thomas (malinka)](@malinka@entropy-development.com), 2016-05-24) pkg-config supplies this macro and prefers it to be used to allow for cross-compilation scenarios where target-prefixed binaries are prefered to pkg-config * [Updated list of EXTRA_DIST files to reflect the updated test images and prior removal of README.win32](https://github.com/AcademySoftwareFoundation/openexr/commit/165dceaeee86e0f8ce1ed1db3e3030c609a49f17) ([Nick Rasmussen](@nick@ilm.com), 2017-11-17) * [Updated list of EXTRA_DIST files to reflect the updated test images and prior removal of README.win32](https://github.com/AcademySoftwareFoundation/openexr/commit/dcaf5fdb4d1244d8e60a58832cfe9c54734a2257) ([Nick Rasmussen](@nick@ilm.com), 2017-11-17) * [Updated openexr version to 2.2.1, resynced the .so version number to 23 across all projects.](https://github.com/AcademySoftwareFoundation/openexr/commit/e69de40ddbb6bd58341618a506b2e913e5ac1797) ([Nick Rasmussen](@nick@ilm.com), 2017-11-17) * [Add additional input validation in an attempt to resolve issue #232](https://github.com/AcademySoftwareFoundation/openexr/commit/49db4a4192482eec9c27669f75db144cf5434804) ([Shawn Walker-Salas](@shawn.walker@oracle.com), 2017-05-30) * [Add additional input validation in an attempt to resolve issue #232](https://github.com/AcademySoftwareFoundation/openexr/commit/f09f5f26c1924c4f7e183428ca79c9881afaf53c) ([Shawn Walker-Salas](@shawn.walker@oracle.com), 2017-05-30) * [root level LICENSE](https://github.com/AcademySoftwareFoundation/openexr/commit/a774d643b566d56314f26695f2bf9b75f88e64f6) ([cary-ilm](@cary@ilm.com), 2017-10-23) * [Fix copyright/license notice in halfExport.h](https://github.com/AcademySoftwareFoundation/openexr/commit/20d043d017d4b752356bb76946ffdffaa9c15c72) ([Ed Hanway](@ehanway@ilm.com), 2017-01-09) * [Merge branch 'jkingsman-cleanup-readme' into develop](https://github.com/AcademySoftwareFoundation/openexr/commit/6f6d9cea513ea409d4b65da40ac096eab9a549b0) ([Ed Hanway](@ehanway@ilm.com), 2016-10-28) * [README edits.](https://github.com/AcademySoftwareFoundation/openexr/commit/098a4893910d522b867082ed38d7388e6265bee0) ([Ed Hanway](@ehanway@ilm.com), 2016-10-28) * [Merge branch 'cleanup-readme' of https://github.com/jkingsman/openexr into jkingsman-cleanup-readme](https://github.com/AcademySoftwareFoundation/openexr/commit/43e50ed5dca1ddfb3ca2cb4c38c7752497db6e50) ([Ed Hanway](@ehanway@ilm.com), 2016-10-28) * [Install ImfStdIO.h](https://github.com/AcademySoftwareFoundation/openexr/commit/2872d3b230a7920696510f80a50d9ce36b6cc94e) ([Ed Hanway](@ehanway@ilm.com), 2016-10-28) This was originally intended to be an internal class only, but its use has become the de facto way to handle UTF-8 filenames on Windows. * [Merge pull request #204 from dlemstra/IMF_HAVE_SSE2](https://github.com/AcademySoftwareFoundation/openexr/commit/cbb01bf286a2e04df95fb51458d1c2cbdc08935b) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-10-19) Consistent check for IMF_HAVE_SSE2. * [Remove fixed-length line breaks](https://github.com/AcademySoftwareFoundation/openexr/commit/0ea6b8c7d077a18fb849c2b2ff532cd952d06a38) ([Jack Kingsman](@jack.kingsman@gmail.com), 2016-10-19) * [Update README to markdown](https://github.com/AcademySoftwareFoundation/openexr/commit/9c6d22e23a25d761f5456e08623b8d77c0f8930a) ([Jack Kingsman](@jack.kingsman@gmail.com), 2016-10-18) * [Merge pull request #206 from lgritz/lg-register](https://github.com/AcademySoftwareFoundation/openexr/commit/6788745398594d479e8cf91a6c301fea0537108b) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-09-30) Remove 'register' keyword. * [Remove 'register' keyword.](https://github.com/AcademySoftwareFoundation/openexr/commit/6d297f35c5dbfacc8a5e94f33b986db7ab468db9) ([Larry Gritz](@lg@larrygritz.com), 2016-09-30) 'register' is a relic of K&R-era C, it's utterly useless in modern compilers. It's been deprecated in C++11, and therefore will generate warnings when encountered -- and many packages that use OpenEXR's public headers use -Werr to turn warnings into errors. Starting in C++17, the keyword is removed entirely, and thus will certainly be a build break for that version of the standard. So it's time for it to go. * [Consistent check for IMF_HAVE_SSE2.](https://github.com/AcademySoftwareFoundation/openexr/commit/7403524c8fed971383c724d85913b2d52672caf3) ([dirk](@dirk@git.imagemagick.org), 2016-09-17) * [Merge pull request #141 from lucywilkes/develop](https://github.com/AcademySoftwareFoundation/openexr/commit/c23f5345a6cc89627cc416b3e0e6b182cd427479) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-09-16) Adding rawPixelDataToBuffer() function for access to compressed scanlines * [Merge pull request #198 from ZeroCrunch/develop](https://github.com/AcademySoftwareFoundation/openexr/commit/891437f74805f6c8ebc897932091cbe0bb7e1163) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-08-02) Windows compile fix * [Windows compile fix](https://github.com/AcademySoftwareFoundation/openexr/commit/77faf005b50e8f77a8080676738ef9b9c807bf53) ([Jamie Kenyon](@jamie.kenyon@thefoundry.co.uk), 2016-07-29) std::min wasn't found due to not being included. * [Merge pull request #179 from CAHEK7/NullptrBug](https://github.com/AcademySoftwareFoundation/openexr/commit/a0a68393a4d3b622251fb7c490ee9d59e080b776) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-07-26) fix potential memory leak * [Merge branch 'develop' of https://github.com/r-potter/openexr into r-potter-develop](https://github.com/AcademySoftwareFoundation/openexr/commit/b206a243a03724650b04efcdf863c7761d5d5d5b) ([Ed Hanway](@ehanway@ilm.com), 2016-07-26) * [Merge pull request #154 into develop](https://github.com/AcademySoftwareFoundation/openexr/commit/bc372d47186db31d104e84e4eb9e84850819db8d) ([Ed Hanway](@ehanway@ilm.com), 2016-07-25) * [Merge pull request #168 into develop](https://github.com/AcademySoftwareFoundation/openexr/commit/44d077672f558bc63d907891bb88d741b334d807) ([Ed Hanway](@ehanway@ilm.com), 2016-07-25) * [Merge pull request #175 into develop](https://github.com/AcademySoftwareFoundation/openexr/commit/7513fd847cf38af89572cc209b03e5b548e6bfc8) ([Ed Hanway](@ehanway@ilm.com), 2016-07-25) * [Merge pull request #174 into develop](https://github.com/AcademySoftwareFoundation/openexr/commit/b16664a2ee4627c235b9ce798f4fc911e9c5694f) ([Ed Hanway](@ehanway@ilm.com), 2016-07-25) * [Merge branch pull request 172 into develop: fix copy and paste bug in ImfDeepTiledInputPart.cpp](https://github.com/AcademySoftwareFoundation/openexr/commit/ef7b78d5988d37dbbc74c21ad245ed5c80927223) ([Ed Hanway](@ehanway@ilm.com), 2016-07-25) * [Merge pull request #195 from openexr/master](https://github.com/AcademySoftwareFoundation/openexr/commit/bc234de193bd9cd32d94648e2936270aa4406e91) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2016-07-25) Catch develop branch up with commits in master. * [fix potential memory leak](https://github.com/AcademySoftwareFoundation/openexr/commit/d2f10c784d52f841b85e382620100cdbf0d3b1e5) ([CAHEK7](@ghosts.in.a.box@gmail.com), 2016-02-05) * [Fix warnings when compiled with MSVC 2013.](https://github.com/AcademySoftwareFoundation/openexr/commit/3aabef263083024db9e563007d0d76609ac8d585) ([Xo Wang](@xow@google.com), 2016-01-06) Similar fix to that from a27e048451ba3084559634e5e045a92a613b1455. * [Fix typo in C bindings (Close #140)](https://github.com/AcademySoftwareFoundation/openexr/commit/c229dfe63380f41dfae1e977b10dfc7c49c7efc7) ([Edward Kmett](@ekmett@gmail.com), 2015-12-09) IMF_RAMDOM_Y should be IMF_RANDOM_Y * [Fix copy and paste bug](https://github.com/AcademySoftwareFoundation/openexr/commit/501b654d851e2da1d9e5ca010a1e13fe34ae24ab) ([Christopher Kulla](@fpsunflower@users.noreply.github.com), 2015-11-19) The implementation of DeepTiledInputPart::tileXSize was copy and pasted from the function above but not changed. This causes it tor return incorrect values. * [Switch AVX detection asm to not use an empty clobber list for use with older gcc versions](https://github.com/AcademySoftwareFoundation/openexr/commit/51073d1aa8f96963fc6a3ecad8f844ce70c90991) ([Kevin Wheatley](@kevin.wheatley@framestore.com), 2015-10-14) * [Merge pull request #145 from karlrasche/DWAx_clamp_float32](https://github.com/AcademySoftwareFoundation/openexr/commit/521b25df787b460e57d5c1e831b232152b93a6ee) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2015-10-23) Clamp, don't cast, float inputs with DWAx compression * [Merge pull request #143 from karlrasche/DWAx_bad_zigzag_order](https://github.com/AcademySoftwareFoundation/openexr/commit/9547d38199f5db2712c06ccdda9195badbecccaa) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2015-10-23) Wrong zig-zag ordering used for DWAx decode optimization * [Merge pull request #157 from karlrasche/DWAx_compress_bound](https://github.com/AcademySoftwareFoundation/openexr/commit/de27156b77896aeef5b1c99edbca2bc4fa784b51) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2015-10-23) Switch over to use compressBound() instead of manually computing headroom for compress() * [Switch over to use compressBound() instead of manually computing headroom for compress()](https://github.com/AcademySoftwareFoundation/openexr/commit/c9a2e193ce243c66177ddec6be43bc6f655ff78a) ([Karl Rasche](@karl.rasche@dreamworks.com), 2015-02-18) * [Fix a linker error when compiling OpenEXR statically on Linux](https://github.com/AcademySoftwareFoundation/openexr/commit/caa09c1b361e2b152786d9e8b2b90261c9d9a3aa) ([Wenzel Jakob](@wenzel@inf.ethz.ch), 2015-02-02) Linking OpenEXR and IlmBase statically on Linux failed due to interdependencies between Iex and IlmThread. Simply reversing their order in CMakeLists.txt fixes the issue (which only arises on Linux since the GNU linker is particularly sensitive to the order of static libraries) * [Clamp incoming float values to half, instead of simply casting, on encode.](https://github.com/AcademySoftwareFoundation/openexr/commit/cb172eea58b8be078b88eca35f246e12df2de620) ([Karl Rasche](@karl.rasche@dreamworks.com), 2014-11-24) Casting can introduce Infs, which are zero'ed later on, prior to the forward DCT step. This can have the nasty side effect of forcing bright values to zero, instead of clamping them to 65k. * [Remove errant whitespace](https://github.com/AcademySoftwareFoundation/openexr/commit/fc67c8245dbff48e546abae027cc9c80c98b3db1) ([Karl Rasche](@karl.rasche@dreamworks.com), 2014-11-20) * [Use the correct zig-zag ordering when finding choosing between fast-path inverse DCT versions (computing which rows are all zero)](https://github.com/AcademySoftwareFoundation/openexr/commit/b0d0d47b65c5ebcb8c6493aa2238b9f890c4d7fe) ([Karl Rasche](@karl.rasche@dreamworks.com), 2014-11-19) * [Resolve dependency issue building eLut.h/toFloat.h with CMake/Ninja.](https://github.com/AcademySoftwareFoundation/openexr/commit/8eed7012c10f1a835385d750fd55f228d1d35df9) ([Ralph Potter](@r.potter@bath.ac.uk), 2014-11-05) * [Adding rawPixelDataToBuffer() function for access to compressed data read from scanline input files.](https://github.com/AcademySoftwareFoundation/openexr/commit/1f6eddeea176ce773dacd5cdee0cbad0ab549bae) ([Lucy Wilkes](@lucywilkes@users.noreply.github.com), 2014-10-22) Changes from The Foundry to add rawPixelDataToBuffer(...) function to the OpenEXR library. This allows you to read raw scan lines into an external buffer. It's similar to the existing function rawPixelData, but unlike this existing function it allows the user to control where the data will be stored instead of reading it into a local buffer. This means you can store multiple raw scan lines at once and enables the decompression of these scan lines to be done in parallel using an application's own threads. (cherry picked from commit ca76ebb40a3c5a5c8e055f0c8d8be03ca52e91c8) * [Merge pull request #137 from karlrasche/interleaveByte2_sse_bug](https://github.com/AcademySoftwareFoundation/openexr/commit/f4a6d3b9fabd82a11b63abf938e9e32f42d2d6d7) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2014-10-15) Fixing SSE2 byte interleaving path to work with short runs * [Fixing SSE2 byte interleaving path to work with short runs](https://github.com/AcademySoftwareFoundation/openexr/commit/da28ad8cd54dfa3becfdac33872c5b1401a9cc3c) ([Karl Rasche](@karl.rasche@dreamworks.com), 2014-09-08) * [Merge pull request #126 from fnordware/LL_literal](https://github.com/AcademySoftwareFoundation/openexr/commit/91015147e5a6a1914bcb16b12886aede9e1ed065) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2014-08-14) Use LL for 64-bit literals * [Change suffixes to ULL because Int64 is unsigned](https://github.com/AcademySoftwareFoundation/openexr/commit/353cbc2e89c582e07796f01bce8f203e84c8ae46) ([Brendan Bolles](@brendan@fnordware.com), 2014-08-14) As discusses in pull request #126 * [Merge pull request #127 from openexr/tarball_contents_fix](https://github.com/AcademySoftwareFoundation/openexr/commit/699b4a62d5de9592d26f581a9cade89fdada7e6a) ([Ed Hanway](@ehanway-ilm@users.noreply.github.com), 2014-08-14) Tarball contents fix * [Add dwa test images to dist (tarball) manifest. Also drop README.win32 from tarball. (Already removed from repo.)](https://github.com/AcademySoftwareFoundation/openexr/commit/cbac202a84b0b0bac0fcd92e5b5c8d634085329e) ([Ed Hanway](@ehanway@ilm.com), 2014-08-14) [New Cmake-centric instructions covering builds for Windows and other platforms to follow.] * [Use LL for 64-bit literals](https://github.com/AcademySoftwareFoundation/openexr/commit/57ecf581d053f5cacf2e8fc3c024490e0bbe536f) ([Brendan Bolles](@brendan@fnordware.com), 2014-08-13) On a 32-bit architecture, these literals are too big for just a long, they need to be long long, otherwise I get an error in GCC. ## Version 2.2.2 (April 30, 2020) This is a patch release that includes fixes for the following security vulnerabilities: * [CVE-2020-11765](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11765) There is an off-by-one error in use of the ImfXdr.h read function by DwaCompressor::Classifier::ClasGsifier, leading to an out-of-bounds read. * [CVE-2020-11764](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11764) There is an out-of-bounds write in copyIntoFrameBuffer in ImfMisc.cpp. * [CVE-2020-11763](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11763) There is an std::vector out-of-bounds read and write, as demonstrated by ImfTileOffsets.cpp. * [CVE-2020-11762](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11762) There is an out-of-bounds read and write in DwaCompressor::uncompress in ImfDwaCompressor.cpp when handling the UNKNOWN compression case. * [CVE-2020-11761](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11761) There is an out-of-bounds read during Huffman uncompression, as demonstrated by FastHufDecoder::refill in ImfFastHuf.cpp. * [CVE-2020-11760](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11760) There is an out-of-bounds read during RLE uncompression in rleUncompress in ImfRle.cpp. * [CVE-2020-11759](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11759) Because of integer overflows in CompositeDeepScanLine::Data::handleDeepFrameBuffer and readSampleCountForLineBlock, an attacker can write to an out-of-bounds pointer. * [CVE-2020-11758](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11758) There is an out-of-bounds read in ImfOptimizedPixelReading.h. ## Version 2.2.1 (November 30, 2017) This maintenance release addresses the reported OpenEXR security vulnerabilities, specifically: * [CVE-2017-9110](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9110) * [CVE-2017-9111](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9111) * [CVE-2017-9112](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9112) * [CVE-2017-9113](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9113) * [CVE-2017-9114](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9114) * [CVE-2017-9115](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9115) * [CVE-2017-9116](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9116) ## Version 2.2.0 (August 10, 2014) This release includes the following components: * OpenEXR: v2.2.0 * IlmBase: v2.2.0 * PyIlmBase: v2.2.0 * OpenEXR_Viewers: v2.2.0 This significant new features of this release include: * **DreamWorks Lossy Compression** A new high quality, high performance lossy compression codec contributed by DreamWorks Animation. This codec allows control over variable lossiness to balance visual quality and file size. This contribution also includes performance improvements that speed up the PIZ codec. * **IlmImfUtil** A new library intended to aid in development of image file manipulation utilities that support the many types of OpenEXR images. This release also includes improvements to cross-platform build support using CMake. ## Version 2.1.0 (November 25, 2013) This release includes the following components (version locked): * OpenEXR: v2.1.0 * IlmBase: v2.1.0 * PyIlmBase: v2.1.0 * OpenEXR_Viewers: v2.1.0 This release includes a refactoring of the optimised read paths for RGBA data, optimisations for some of the python bindings to Imath, improvements to the cmake build environment as well as additional documentation describing deep data in more detail. ## Version 2.0.1 (July 11, 2013) ### Detailed Changes: * Temporarily turning off optimisation code path (Piotr Stanczyk) * Added additional tests for future optimisation refactoring (Piotr Stanczyk / Peter Hillman) * Fixes for StringVectors (Peter Hillman) * Additional checks for type mismatches (Peter Hillman) * Fix for Composite Deep Scanline (Brendan Bolles) ## Version 2.0 (April 9, 2013) Industrial Light & Magic (ILM) and Weta Digital announce the release of OpenEXR 2.0, the major version update of the open source high dynamic range file format first introduced by ILM and maintained and expanded by a number of key industry leaders including Weta Digital, Pixar Animation Studios, Autodesk and others. The release includes a number of new features that align with the major version number increase. Amongst the major improvements are: * **Deep Data support** - Pixels can now store a variable-length list of samples. The main rationale behind deep images is to enable the storage of multiple values at different depths for each pixel. OpenEXR 2.0 supports both hard-surface and volumetric representations for Deep Compositing workflows. * **Multi-part Image Files** - With OpenEXR 2.0, files can now contain a number of separate, but related, data parts in one file. Access to any part is independent of the others, pixels from parts that are not required in the current operation don't need to be accessed, resulting in quicker read times when accessing only a subset of channels. The multipart interface also incorporates support for Stereo images where views are stored in separate parts. This makes stereo OpenEXR 2.0 files significantly faster to work with than the previous multiview support in OpenEXR. * **Optimized pixel reading** - decoding RGB(A) scanline images has been accelerated on SSE processors providing a significant speedup when reading both old and new format images, including multipart and multiview files. * **Namespacing** - The library introduces versioned namespaces to avoid conflicts between packages compiled with different versions of the library. Although OpenEXR 2.0 is a major version update, files created by the new library that don't exercise the new feature set are completely backwards compatible with previous versions of the library. By using the OpenEXR 2.0 library, performance improvements, namespace versions and basic multi-part/deep reading support should be available to applications without code modifications. This code is designed to support Deep Compositing - a revolutionary compositing workflow developed at Weta Digital that detached the rendering of different elements in scene. In particular, changes in one layer could be rendered separately without the need to re-render other layers that would be required to handle holdouts in a traditional comp workflow or sorting of layers in complex scenes with elements moving in depth. Deep Compositing became the primary compositing workflow on Avatar and has seen wide industry adoption. The technique allows depth and color value to be stored for every pixel in a scene allowing for much more efficient handling of large complex scenes and greater freedom for artists to iterate. True to the open source ethos, a number of companies contributed to support the format and encourage adoption. Amongst others, Pixar Animation Studios has contributed its DtexToExr converter to the OpenEXR repository under a Microsoft Public License, which clears any concerns about existing patents in the area, and Autodesk provided performance optimizations geared towards real-time post-production workflows. Extensive effort has been put in ensuring all requirements were met to help a wide adoption, staying true to the wide success of OpenEXR. Many software companies were involved in the beta cycle to insure support amongst a number of industry leading applications. Numerous packages like SideFX's Houdini, Autodesk's Maya, Solid Angle's Arnold renderer, Sony Pictures Imageworks' Open Image IO have already announced their support of the format. Open EXR 2.0 is an important step in the adoption of deep compositing as it provides a consistent file format for deep data that is easy to read and work with throughout a visual effects pipeline. The Foundry has build OpenEXR 2.0 support into its Nuke Compositing application as the base for the Deep Compositing workflows. OpenEXR 2.0 is already in use at both Weta Digital and Industrial Light & Magic. ILM took advantage of the new format on Marvel's The Avengers and two highly anticipated summer 2013 releases, Pacific Rim and The Lone Ranger. Recent examples of Weta Digital's use of the format also include Marvel's Avengers as well as Prometheus and The Hobbit. In addition, a large number of visual effects studios have already integrated a deep workflow into their compositing pipelines or are in the process of doing so including:, Sony Pictures Imageworks, Pixar Animation Studios, Rhythm & Hues, Fuel and MPC. In addition to visual effects, the new additions to the format, means that depth data can also be assigned to two-dimensional data for a use in many design fields including, architecture, graphic design, automotive and product prototyping. ### Detailed Changes: * Updated Documentation (Peter Hillman) * Updated Namespacing mechanism (Piotr Stanczyk) * Fixes for succd & predd (Peter Hillman) * Fixes for FPE control registers (Piotr Stanczyk) * Additional checks and tests on DeepImages, scanlines and tiles (Peter Hillman) * Folded in Autodesk read optimisations for RGB(A) files (Pascal Jette, Peter Hillman) * Updated the bootstrap scripts to use libtoolize if glibtoolize isn't available on darwin. (Nick Rasmussen) * Numerous minor fixes, missing includes etc ## Version 2.0.0.beta.1 (June 15, 2012) Development of OpenEXR v2 has been undertaken in a collaborative environment (cf. previous github announcement) comprised of Industrial Light & Magic, Weta Digital as well as a number of other contributors. Some of the new features included in the Beta.1 release of OpenEXR v2 are: * **Deep Data** Pixels can now store a variable length list of samples. The main rationale behind deep-images is to have multiple values at different depths for each pixel. OpenEXR v2 supports both hard surface and volumetric representation requirements for deep compositing workflows. * **Multi-part image files** With OpenEXR v2, files can now contain a number of separate, but related, images in one file. Access to any part is independent of the others; in particular, no access of data need take place for unrequested parts. In addition, OpenEXR v2 also contains platform independent mechanisms for handling co-existing library version conflicts in the same process space. (Currently implemented in IlmImf) Finally, a reminder that this is a Beta release and potentially incompatible changes may be introduced in future releases prior to the v2.0.0 production version. Please read the separate file for v2 additions and changes. ### Detailed Changes: * Added git specific files (Piotr Stanczyk) * Updated the so verison to 20 (Piotr Stanczyk) * Initial use of the CMake build system (Nicholas Yue) ## Version 1.7.1 (July 31, 2012) This release includes the following components: * OpenEXR: v1.7.1 * IlmBase: v1.0.3 * PyIlmBase: v1.0.0 (introduces a Boost dependency) * OpenEXR_Viewers: v1.0.2 Of particular note is the introduction of PyIlmBase. This module forms a comprehensive set of python bindings to the IlmBase module. In addition, contained in this release is a number of additions to Imath as well as a minor tweak to Imath::Frustrum (for better support for Windows platforms) as well as other minor fixes, including correction for soname version of IlmImf. ## Version 1.7.0 (July 23, 2010) This release includes support for stereoscopic images, please see the adjoining documentation in the ``MultiViewOpenEXR.pdf``. (Many thanks to Weta Digital for their contribution.) In addition, we added support for targeting 64 bit Windows, fixes for buffer overruns and a number of other minor fixes, additions and optimisations. Please see the Changelog files for more detailed information. ### Bugs This release addresses the following security vulnerabilities: * [CVE-2009-1720](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1720) * [CVE-2009-1721](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1721) * [CVE-2009-1722](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1722) ### Detailed Changes: * Added support for targetting builds on 64bit Windows and minimising number of compiler warnings on Windows. Thanks to Ger Hobbelt for his contributions to CreateDLL. (Ji Hun Yu) * Added new atttribute types (Florian Kainz): * **M33dAttribute** 3x3 double-precision matrix * **M44dAttribute** 4x4 double-precision matrix * **V2d** 2D double-precision vector * **V3d** 3D double-precision vector * Bug fix: crash when reading a damaged image file (found by Apple). An exception thrown inside the PIZ Huffman decoder bypasses initialization of an array of pointers. The uninitialized pointers are later passed to operator delete. (Florian Kainz) * Bug fix: crash when reading a damaged image file (found by Apple). Computing the size of input certain buffers may overflow and wrap around to a small number, later causing writes beyond the end of the buffer. (Florian Kainz) * In the "Technical Introduction" document, added Premultiplied vs. Un-Premulitiplied Color section: states explicitly that pixels with zero alpha and non-zero RGB are allowed, points out that preserving such a pixel can be a problem in application programs with un-premultiplied internal image representations. (Florian Kainz) * exrenvmap improvements: - New command line flags set the type of the input image to latitude-longitude map or cube-face map, overriding the envmap attribute in the input file header. - Cube-face maps can now be assembled from or split into six square sub-images. - Converting a cube-face map into a new cube-face map with the same face size copies the image instead of resampling it. This avoids blurring when a cube-face map is assembled from or split into sub-images. (Florian Kainz) * Updated standard chromaticities in ImfAcesFile.cpp to match final ACES (Academy Color Encoding Specification) document. (Florian Kainz) * Added worldToCamera and worldToNDC matrices to ImfStandardAttributes.h (Florian Kainz) * Increased the maximum length of attribute and channel names from 31 to 255 characters. For files that do contain names longer than 31 characters, a new LONG_NAMES_FLAG in the fil version number is set. This flag causes older versions of the IlmImf library (1.6.1 and earlier) to reject files with long names. Without the flag, older library versions would mis-interpret files with long names as broken. (Florian Kainz) * Reading luminance/chroma-encoded files via the RGBA interface is faster: buffer padding avoids cache thrashing for certain image sizes, redundant calls to saturation() have been eliminated. (Mike Wall) * Added "hemispherical blur" option to exrenvmap. (Florian Kainz) * Added experimental version of I/O classes for ACES file format (restricted OpenEXR format with special primaries and white point); added exr2aces file converter. (Florian Kainz) * Added new constructors to classes Imf::RgbaInputFile and Imf::TiledRgbaInputFile. The new constructors have a layerName parameter, which allows the caller to specify which layer of a multi-layer or multi-view image will be read. (Florian Kainz) * A number of member functions in classes Imf::Header, Imf::ChannelList and Imf::FrameBuffer have parameters of type "const char *". Added equivalent functions that take "const std::string &" parameters. (Florian Kainz) * Added library support for Weta Digital multi-view images: StringVector attribute type, multiView standard attribute of type StringVector, utility functions related to grouping channels into separate views. (Peter Hillman, Florian Kainz) ## Version 1.6.1 (October 22, 2007) This release fixes a buffer overrun in OpenEXR and a Windows build problem in CTL, and it removes a few unnecessary files from the .tar.gz packages. ### Detailed Changes: * Removed Windows .suo files from distribution. (Eric Wimmer) * Bug fix: crashes, memory leaks and file descriptor leaks when reading damaged image files (some reported by Apple, others found by running IlmImfFuzzTest). (Florian Kainz) * Added new IlmImfFuzzTest program to test how resilient the IlmImf library is with respect broken input files: the program first damages OpenEXR files by partially overwriting them with random data; then it tries to read the damaged files. If all goes well, the program doesn't crash. (Florian Kainz) ## Version 1.6.0 (August 3, 2007) OpenEXR 1.6.0: * Reduced generational loss in B44- and B44A-compressed images. * Added B44A compression. This is a variation of B44, but with a better compression ratio for images with large uniform areas, such as in an alpha channel. * Bug fixes. CTL 1.4.0: * Added new functions to the CTL standard library: 3x3 matrix support, 1D lookup tables with cubic interpolation. * Added new "ctlversion" statement to the language. * Bug fixes. OpenEXR_CTL 1.0.0: * Applying CTL transforms to a frame buffer is multi-threaded. Bug fixes. OpenEXR_Viewers 1.0.0: * Implemented new naming conventions for CTL parameters. IlmBase 1.0.0: * Half now implements "round to nearest even" mode. ### Detailed Changes: * Bumped DSO version number to 6.0 (Florian Kainz) * Added new standard attributes related to color rendering with CTL (Color Transformation Language): renderingTransform, lookModTransform and adoptedNeutral. (Florian Kainz) * Bug fix: for pixels with luminance near HALF_MIN, conversion from RGB to luminance/chroma produces NaNs and infinities (Florian Kainz) * Bug fix: excessive desaturation of small details with certain colors after repeatedly loading and saving luminance/chroma encoded images with B44 compression. (Florian Kainz) * Added B44A compression, a minor variation of B44: in most cases, the compression ratio is 2.28:1, the same as with B44, but in uniform image areas where all pixels have the same value, the compression ratio increases to 10.66:1. Uniform areas occur, for example, in an image's alpha channel, which typically contains large patches that are solid black or white, or in computer- generated images with a black background. (Florian Kainz) * Added flag to configure.ac to enable or disable use of large auto arrays in the IlmImf library. Default is "enable" for Linux, "disable" for everything else. (Darby Johnston, Florian Kainz) * corrected version number on dso's (libtool) - now 5.0 * Separated ILMBASE_LDFLAGS and ILMBASE_LIBS so that test programs can link with static libraries properly * eliminated some warning messages during install (Andrew Kunz) ## Version 1.5.0 (December 15, 2006) The new version includes several significant changes: * OpenEXR supports a new image compression method, called B44. It has a fixed compression rate of 2.28:1, or 4.57:1 if used in combination with luminance/chroma encoding. B44-compressed images can be uncompressed fast enough to support real-time playback of image sequences. * The new playexr program plays back moving image sequences. Playexr is multi-threaded and utilizes the threading capabilities of the IlmImf library that were introduced in OpenEXR 1.3.0. The program plays back B44-compressed images with fairly high-resolution in real time on commodity hardware. * The playexr program and a new version of the existing exrdisplay image viewer both support color rendering via color transforms written in the new Color Transformation Language or CTL. CTL is not part of OpenEXR; it will be released separately. CTL support in playexr and exrdisplay is optional; the programs can be built and will run without CTL. * In preparation for the release of CTL, OpenEXR has been split into three separate packages: * IlmBase 0.9.0 includes the Half, Iex, Imath and IlmThread libraries * OpenEXR 1.5.0 includes the IlmImf library, programming examples and utility programs such as exrheader or exrenvmap * OpenEXRViewers 0.9.0 includes the playexr and exrdisplay programs * The "Technical Introduction to OpenEXR" document now includes a recommendation for storing CIE XYZ pixel data in OpenEXR files. * A new "OpenEXR Image Viewing Software" document describes the playexr and exrdisplay programs. It briefly explains real-time playback and color rendering, and includes recommendations for testing if other image viewing software displays OpenEXR images correctly. * The OpenEXR sample image set now includes B44-compressed files and files with CIE XYZ pixel data. ### Detailed Changes: * reorganized packaging of OpenEXR libraries to facilitate integration with CTL. Now this library depends on the library IlmBase. Some functionality has been moved into OpenEXR_Viewers, which depends on two other libraries, CTL and OpenEXR_CTL. Note: previously there were separate releases of OpenEXR-related plugins for Renderman, Shake and Photoshop. OpenEXR is supported natively by Rendermand and Photoshop, so these plugins will not be supported for this or future versions of OpenEXR. (Andrew Kunz) * New build scripts for Linux/Unix (Andrew Kunz) * New Windows project files and build scripts (Kimball Thurston) * float-to-half conversion now preserves the sign of float zeroes and of floats that are so small that they become half zeroes. (Florian Kainz) * Bug fix: Imath::Frustum::planes() returns incorrect planes if the frustum is orthogonal. (Philip Hubbard) * added new framesPerSecond optional standard attribute (Florian Kainz) * Imath cleanup: - Rewrote function Imath::Quat::setRotation() to make it numerically more accurate, added confidence tests - Rewrote function Imath::Quat::slerp() using Don Hatch's method, which is numerically more accurate, added confidence tests. - Rewrote functions Imath::closestPoints(), Imath::intersect(), added confidence tests. - Removed broken function Imath::nearestPointOnTriangle(). - Rewrote Imath::drand48(), Imath::lrand48(), etc. to make them functionally identical with the Unix/Linux versions of drand48(), lrand48() and friends. - Replaced redundant definitions of Int64 in Imath and IlmImf with a single definition in ImathInt64.h. (Florian Kainz) * exrdisplay: if the file's and the display's RGB chromaticities differ, the pixels RGB values are transformed from the file's to the display's RGB space. (Florian Kainz) * Added new lossy B44 compression method. HALF channels are compressed with a fixed ratio of 2.28:1. UINT and FLOAT channels are stored verbatim, without compression. (Florian Kainz) ## Version 1.4.0a (August 9, 2006) * Fixed the ReleaseDLL targets for Visual Studio 2003. (Barnaby Robson) ## Version 1.4.0 (August 2, 2006) This is the next major production-ready release of OpenEXR and offers full compatibility with our last production release, which was 1.2.2. This version obsoletes versions 1.3.x, which were test versions for 1.4.0. If you have been using 1.3.x, please upgrade to 1.4.0. * Production release. * Bug Fix: calling setFrameBuffer() for every scan line while reading a tiled file through the scan line API returns bad pixel data. (Paul Schneider, Florian Kainz) ## Version 1.3.1 (June 14, 2006) * Fixed the ReleaseDLL targets for Visual Studio 2005. (Nick Porcino, Drew Hess) * Fixes/enhancements for createDLL. (Nick Porcino) ## Version 1.3.0 (June 8, 2006) This is a test release. The major new feature in this version is support for multithreaded file I/O. We've been testing the threaded code internally at ILM for a few months, and we have not encountered any bugs, but we'd like to get some feedback from others before we release the production version. Here's a summary of the changes since version 1.2.2: * Support for multithreaded file reading and writing. * Support for Intel-based OS X systems. * Support for Visual Studio 2005. * Better handling of **PLATFORM_** and **HAVE_** macros. * Updated documentation. * Bug fixes related to handling of incomplete and damaged files. * Numerous bug fixes and cleanups to the autoconf-based build system. * Removed support for the following configurations that were previously supported. Some of these configurations may happen to continue to function, but we can't help you if they don't, largely because we don't have any way to test them: * IRIX * OSF1 * SunOS * OS X versions prior to 10.3. * gcc on any platform prior to version 3.3 ### Detailed Changes: * Removed openexr.spec file, it's out of date and broken to boot. (Drew Hess) * Support for Visual Studio 2005. (Drew Hess, Nick Porcino) * When compiling against OpenEXR headers on Windows, you no longer need to define any **HAVE_** or **PLATFORM_** macros in your projects. If you are using any OpenEXR DLLs, however, you must define OPENEXR_DLL in your project's preprocessor directives. (Drew Hess) * Many fixes to the Windows VC7 build system. (Drew Hess, Nick Porcino) * Support for building universal binaries on OS X 10.4. (Drew Hess, Paul Schneider) * Minor configure.ac fix to accomodate OS X's automake. (Drew Hess) * Removed CPU-specific optimizations from configure.ac, autoconf's guess at the CPU type isn't very useful, anyway. Closes #13429. (Drew Hess) * Fixed quoting for tests in configure.ac. Closes #13428. (Drew Hess) * Use host specification instead of target in configure.ac. Closes #13427. (Drew Hess) * Fix use of AC_ARG_ENABLE in configure.ac. Closes #13426. (Drew Hess) * Removed workaround for OS X istream::read bug. (Drew Hess) * Added pthread support to OpenEXR pkg-config file. (Drew Hess) * Added -no-undefined to LDFLAGS and required libs to LIBADD for library projects with other library dependencies, per Rex Dieter's patch. (Drew Hess) * **HAVE_** macros are now defined in the OpenEXRConfig.h header file instead of via compiler flags. There are a handful of public headers which rely on the value of these macros, and projects including these headers have previously needed to define the same macros and values as used by OpenEXR's 'configure', which is bad form. Now 'configure' writes these values to the OpenEXRConfig.h header file, which is included by any OpenEXR source files that need these macros. This method of specifying **HAVE_** macros guarantees that projects will get the proper settings without needing to add compile- time flags to accomodate OpenEXR. Note that this isn't implemented properly for Windows yet. (Drew Hess) * Platform cleanups: - No more support for IRIX or OSF1. - No more explicit support for SunOS, because we have no way to verify that it's working. I suspect that newish versions of SunOS will just work out of the box, but let me know if not. - No more **PLATFORM_** macros (vestiges of the ILM internal build system). PLATFORM_DARWIN_PPC is replaced by HAVE_DARWIN. PLATFORM_REDHAT_IA32 (which was only used in IlmImfTest) is replaced by HAVE_LINUX_PROCFS. - OS X 10.4, which is the minimum version we're going to support with this version, appears to have support for nrand48 and friends, so no need to use the Imath-supplied version of them anymore. (Drew Hess) * No more PLATFORM_WINDOWS or PLATFORM_WIN32, replace with proper standard Windows macros. (Drew Hess) * Remove support for gcc 2.95, no longer supported. (Drew Hess) * Eliminate HAVE_IOS_BASE macro, OpenEXR now requires support for ios_base. (Drew Hess) * Eliminate HAVE_STL_LIMITS macro, OpenEXR now requires the ISO C++ header. (Drew Hess) * Use double quote-style include dirctives for OpenEXR includes. (Drew Hess) * Added a document that gives an overview of the on-disk layout of OpenEXR files (Florian Kainz) * Added sections on layers and on memory-mapped file input to the documentation. (Florian Kainz) * Bug fix: reading an incomplete file causes a deadlock while waiting on a semaphore. (Florian Kainz) * Updated documentation (ReadingAndWritingImageFiles.sxw) and sample code (IlmImfExamples): Added a section about multi-threading, updated section on thread-safety, changed documentation and sample code to use readTiles()/writeTiles() instead of readTile()/writeTile() where possible, mentioned that environment maps contain redundant pixels, updated section on testing if a file is an OpenEXR file. (Florian Kainz) * Multi-threading bug fixes (exceptions could be thrown multiple times, some operations were not thread safe), updated some comments, added comments, more multithreaded testing. (Florian Kainz) * Added multi-threading support: multiple threads cooperate to read or write a single OpenEXR file. (Wojciech Jarosz) * Added operator== and operator!= to Imath::Frustum. (Andre Mazzone) * Bug fix: Reading a PIZ-compressed file with an invalid Huffman code table caused crashes by indexing off the end of an array. (Florian Kainz) ## Version 1.2.2 (March 15, 2005) This is a relatively minor update to the project, with the following changes: * New build system for Windows; support for DLLs. * Switched documentation from HTML to PDF format. * IlmImf: support for image layers in ChannelList. * IlmImf: added isComplete() method to file classes to check whether a file is complete. * IlmImf: exposed staticInitialize() in ImfHeader.h in order to allow thread-safe library initialization in multithreaded applications. * IlmImf: New "time code" standard attribute. * exrdisplay: support for displaying wrap-around texture map images. * exrmaketiled: can now specify wrap mode. * IlmImf: New "wrapmodes" standard attribute to indicate extrapolation mode for mipmaps and ripmaps. * IlmImf: New "key code" standard attribute to identify motion picture film frames. * Imath: Removed TMatrix classes; these classes are still under development and are too difficult to keep in sync with OpenEXR CVS. ### Detailed Changes: * Updated README to remove option for building with Visual C++ 6.0. (Drew Hess) * Some older versions of gcc don't support a full iomanip implemenation; check for this during configuration. (Drew Hess) * Install PDF versions of documentation, remove old/out-of-date HTML documentation. (Florian Kainz) * Removed vc/vc6 directory; Visual C++ 6.0 is no longer supported. (Drew Hess) * Updated README.win32 with details of new build system. (Florian Kainz, Drew Hess) * New build system for Windows / Visual C++ 7 builds both static libraries and DLLs. (Nick Porcino) * Removed Imath::TMatrix and related classes, which are not used anywhere in OpenEXR. (Florian Kainz) * Added minimal support for "image layers" to class Imf::ChannelList (Florian Kainz) * Added new isComplete() method to InputFile, TiledInputFile etc., that checks if a file is complete or if any pixels are missing (for example, because writing the file was aborted prematurely). (Florian Kainz) * Exposed staticInitialize() function in ImfHeader.h in order to allow thread-safe library initialization in multithreaded programs. (Florian Kainz) * Added a new "time code" attribute (Florian Kainz) * exrmaketiled: when a MIPMAP_LEVELS or RIPMAP_LEVELS image is produced, low-pass filtering takes samples outside the image's data window. This requires extrapolating the image. The user can now specify how the image is extrapolated horizontally and vertically (image is surrounded by black / outermost row of pixels repeats / entire image repeats / entire image repeats, every other copy is a mirror image). exrdisplay: added option to swap the top and botton half, and the left and right half of an image, so that the image's four corners end up in the center. This is useful for checking the seams of wrap-around texture map images. IlmImf library: Added new "wrapmodes" standard attribute to indicate the extrapolation mode for MIPMAP_LEVELS and RIPMAP_LEVELS images. (Florian Kainz) * Added a new "key code" attribute to identify motion picture film frames. (Florian Kainz) * Removed #include from ImfAttribute.h, ImfHeader.h and ImfXdr.h so that including header files such as ImfInputFile.h no longer defines ASSERT and THROW macros, which may conflict with similar macros defined by application programs. (Florian Kainz) * Converted HTML documentation to OpenOffice format to make maintaining the documents easier: api.html -> ReadingAndWritingImageFiles.sxw details.html -> TechnicalIntroduction.sxw (Florian Kainz) ## Version 1.2.1 (June 6, 2004) This is a fairly minor release, mostly just a few tweaks, a few bug fixes, and some new documentation. Here are the most important changes: * reduced memory footprint of exrenvmap and exrmaketiled utilities. * IlmImf: new helper functions to determine whether a file is an OpenEXR file, and whether it's scanline- or tile-based. * IlmImf: bug fix for PXR24 compression with ySampling != 1. * Better support for gcc 3.4. * Warning cleanups in Visual C++. ### Detailed Changes: * exrenvmap and exrmaketiled use slightly less memory (Florian Kainz) * Added functions to IlmImf for quickly testing if a file is an OpenEXR file, and whether the file is scan-line based or tiled. (Florian Kainz) * Added preview image examples to IlmImfExamples. Added description of preview images and environment maps to docs/api.html (Florian Kainz) * Bug fix: PXR24 compression did not work properly for channels with ySampling != 1. (Florian Kainz) * Made ``template `` become ``template `` for the ``transform(ObjectS, ObjectT)`` methods. This was done to allow for differing templated objects to be passed in e.g. say a ``Box>`` and a ``Matrix44``, where S=float and T=double. (Jeff Yost, Arkell Rasiah) * New method Matrix44::setTheMatrix(). Used for assigning a M44f to a M44d. (Jeff Yost, Arkell Rasiah) * Added convenience Color typedefs for half versions of Color3 and Color4. Note the Makefile.am for both Imath and ImathTest have been updated with -I and/or -L pathing to Half. (Max Chen, Arkell Rasiah) * Methods equalWithAbsError() and equalWithRelError() are now declared as const. (Colette Mullenhoff, Arkell Rasiah) * Fixes for gcc34. Mainly typename/template/using/this syntax correctness changes. (Nick Ramussen, Arkell Rasiah) * Added Custom low-level file I/O examples to IlmImfExamples and to the docs/api.html document. (Florian Kainz) * Eliminated most warnings messages when OpenEXR is compiled with Visual C++. The OpenEXR code uses lots of (intentional and unintended) implicit type conversions. By default, Visual C++ warns about almost all of them. Most implicit conversions have been removed from the .h files, so that including them should not generate warnings even at warning level 3. Most .cpp files are now compiled with warning level 1. (Florian Kainz) ## Version 1.2.0 (May 11, 2004) OpenEXR 1.2.0 is now available. This is the first official, production-ready release since OpenEXR 1.0.7. If you have been using the development 1.1 series, please switch to 1.2.0 as soon as possible. We believe that OpenEXR 1.2.0 is ready for use in shipping applications. We have been using it in production at ILM for several months now with no problems. There are quite a few major new features in the 1.2 series as compared to the original 1.0 series: * Support for tiled images, including mipmaps and ripmaps. Note that software based on the 1.0 series cannot read or write tiled images. However, simply by recompiling your software against the 1.2 release, any code that reads scanline images can read tiled images, too. * A new Pxr24 compressor, contributed by Pixar Animation Studios. Values produced by the Pxr24 compressor provide the same range as 32-bit floating-point numbers with slightly less precision, and compress quite a bit better. The Pxr24 compressor stores UINT and HALF channels losslessly, and for these data types performs similarly to the ZIP compressor. * OpenEXR now supports high dynamic-range YCA (luminance/chroma/alpha) images with subsampled chroma channels. These files are supported via the RGBA convenience interface, so that data is presented to the application as RGB(A) but stored in the file as YC(A). OpenEXR also supports Y and YA (black-and-white/black-and-white with alpha) images. * An abstracted file I/O interface, so that you can use OpenEXR with interfaces other than C++'s iostreams. * Several new utilities for manipulating tiled image files. ### Detailed Changes: * Production-ready release. * Disable long double warnings on OS X. (Drew Hess) * Add new source files to VC7 IlmImfDll target. (Drew Hess) * Iex: change the way that APPEND_EXC and REPLACE_EXC modify their what() string to work around an issue with Visual C++ 7.1. (Florian Kainz, Nick Porcino) * Bumped OpenEXR version to 1.2 and .so versions to 2.0.0 in preparation for the release. (Drew Hess) * Imath: fixed ImathTMatrix.h to work with gcc 3.4. (Drew Hess) * Another quoting fix in openexr.m4. (Drew Hess) * Quoting fix in acinclude.m4 for automake 1.8. (Brad Hards) * Imath: put inline at beginning of declaration in ImathMatrix.h to fix a warning. (Ken McGaugh) * Imath: made Vec equalWithError () methods const. * Cleaned up compile-time Win32 support. (Florian Kainz) * Bug fix: Reading a particular broken PIZ-compressed file caused crashes by indexing off the end of an array. (Florian Kainz) ## Version 1.1.1 (March 27, 2004) OpenEXR 1.1.1 is now available. This another development release. We expect to release a stable version, 1.2, around the end of April. Version 1.1.1 includes support for PXR24 compression, and for high-dynamic-range luminance/chroma images with subsampled chroma channels. Version 1.1.1 also fixes a bug in the 1.1.0 tiled file format. ### Detailed Changes: * Half: operator= and variants now return by reference rather than by value. This brings half into conformance with built-in types. (Drew Hess) * Half: remove copy constructor, let compiler supply its own. This improves performance up to 25% on some expressions using half. (Drew Hess) * configure: don't try to be fancy with CXXFLAGS, just use what the user supplies or let configure choose a sensible default if CXXFLAGS is not defined. * IlmImf: fixed a bug in reading scanline files on big-endian architectures. (Drew Hess) * exrmaketiled: Added an option to select compression type. (Florian Kainz) * exrenvmap: Added an option to select compression type. (Florian Kainz) * exrdisplay: Added some new command-line options. (Florian Kainz) * IlmImf: Added Pixar's new "slightly lossy" image compression method. The new method, named PXR24, preserves HALF and UINT data without loss, but FLOAT pixels are converted to a 24-bit representation. PXR24 appears to compress FLOAT depth buffers very well without losing much accuracy. (Loren Carpenter, Florian Kainz) * Changed top-level LICENSE file to allow for other copyright holders for individual files. * IlmImf: TILED FILE FORMAT CHANGE. TiledOutputFile was incorrectly interleaving channels and scanlines before passing pixel data to a compressor. The lossless compressors still work, but lossy compressors do not. Fix the bug by interleaving channels and scanlines in tiled files in the same way as ScanLineOutputFile does. Programs compiled with the new version of IlmImf cannot read tiled images produced with version 1.1.0. (Florian Kainz) * IlmImf: ImfXdr.h fix for 64-bit architectures. (Florian Kainz) * IlmImf: OpenEXR now supports YCA (luminance/chroma/alpha) images with subsampled chroma channels. When an image is written with the RGBA convenience interface, selecting WRITE_YCA instead of WRITE_RGBA causes the library to convert the pixels to YCA format. If WRITE_Y is selected, only luminance is stored in the file (for black and white images). When an image file is read with the RGBA convenience interface, YCA data are automatically converted back to RGBA. (Florian Kainz) * IlmImf: speed up reading tiled files as scan lines. (Florian Kainz) * Half: Fixed subtle bug in Half where signaling float NaNs were being converted to inf in half. (Florian Kainz) * gcc 3.3 compiler warning cleanups. (various) * Imath: ImathEuler.h fixes for gcc 3.4. (Garrick Meeker) ## Version 1.1.0 (February 6, 2004) OpenEXR 1.1.0 is now available. This is a major new release with support for tiled images, multi-resolution files (mip/ripmaps), environment maps, and abstracted file I/O. We've also released a new set of images that demonstrate these features, and updated the CodeWarrior project and Photoshop plugins for this release. See the downloads section for the source code and the new images. ### Detailed Changes: * Added new targets to Visual C++ .NET 2003 project for exrmaketiled, exrenvmap, exrmakepreview, and exrstdattr. (Drew Hess) * A few assorted Win32 fixes for Imath. (Drew Hess) * GNU autoconf builds now produce versioned libraries. This release is 1:0:0. (Drew Hess) * Fixes for Visual C++ .NET 2003. (Paul Schneider) * Updated Visual C++ zlib project file to zlib 1.2.1. (Drew Hess) * exrdisplay: Fixed fragment shader version. (Drew Hess) * *Test: Fixed some compiler issues. (Drew Hess) * Imath: Handle "restrict" keyword properly. (Drew Hess) * IlmImfExamples: Updated to latest versions of example source code, includes tiling and multi-res images. (Florian Kainz) * exrmakepreview: A new utility to create preview images. (Florian Kainz) * exrenvmap: A new utility to create OpenEXR environment maps. (Florian Kainz) * exrstdattr: A new utility to modify standard attributes. (Florian Kainz) * Updated exrheader to print level rounding mode and preview image size. (Florian Kainz) * Updated exrmaketiled to use level rounding mode. (Florian Kainz) * IlmImf: Changed the orientation of lat-long envmaps to match typical panoramic camera setups. (Florian Kainz) * IlmImf: Fixed a bug where partially-completed files with DECREASING_Y could not be read. (Florian Kainz) * IlmImf: Added support for selectable rounding mode (up/down) when generating multiresolution files. (Florian Kainz) * exrdisplay: Support for tiled images, mip/ripmaps, preview images, and display windows. (Florian Kainz, Drew Hess) * exrmaketiled: A new utility which generates tiled versions of OpenEXR images. (Florian Kainz) * IlmImf: Changed Imf::VERSION to Imf::EXR_VERSION to work around problems with autoconf VERSION macro conflict. (Drew Hess) * exrheader: Support for tiles, mipmaps, environment maps. (Florian Kainz) * IlmImf: Environment map support. (Florian Kainz) * IlmImf: Abstracted stream I/O support. (Florian Kainz) * IlmImf: Support for tiled and mip/ripmapped files; requires new file format. (Wojciech Jarosz, Florian Kainz) * Imath: **TMatrix**, generic 2D matricies and algorithms. (Francesco Callari) * Imath: major quaternions cleanup. (Cary Phillips) * Imath: added GLBegin, GLPushAttrib, GLPushMatrix objects for automatic cleanup on exceptions. (Cary Phillips) * Imath: removed implicit scalar->vector promotions and vector comparisons. (Nick Rasmussen) ## Version 1.0.7 (January 7, 2004) OpenEXR 1.0.7 is now available. In addition to some bug fixes, this version adds support for some new standard attributes, such as primary and white point chromaticities, lens aperture, film speed, image acquisition time and place, and more. If you want to use these new attributes in your applications, see the ImfStandardAttributes.h header file for documentation. Our project hosting site, Savannah, is still recovering from a compromise last month, so in the meantime, we're hosting file downloads here. Some of the files are not currently available, but we're working to restore them. ### Detailed Changes: * Fixed a typo in one of the IlmImfTest tests. (Paul Schneider) * Fixed a bug in exrdisplay that causes the image to display as all black if there's a NaN or infinity in an OpenEXR image. (Florian Kainz) * Updated exrheader per recent changes to IlmImf library. (Florian Kainz) * Changed an errant float to a T in ImathFrame.h nextFrame(). (Cary Phillips) * Support for new "optional standard" attributes (chromaticities, luminance, comments, etc.). (Florian Kainz, Greg Ward, Joseph Goldstone) * Fixed a buffer overrun in ImfOpaqueAttribute. (Paul Schneider) * Added new function, isImfMagic (). (Florian Kainz) ## Version 1.0.6: * Added README.win32 to disted files. * Fixed OpenEXR.pc.in pkg-config file, OpenEXR now works with pkg-config. * Random fixes to readme files for new release. * Fixed openexr.m4, now looks in /usr by default. * Added Visual Studio .NET 2003 "solution." * Fixes for Visual Studio .NET 2003 w/ Microsoft C++ compiler. (Various) * Random Imath fixes and enhancements. Note that extractSHRT now takes an additional optional argument, see ImathMatrixAlgo.h for details. (Various) * Added Wojciech Jarosz to AUTHORS file. * Added test cases for uncompressed case, preview images, frame buffer type conversion. (Wojciech Jarosz, Florian Kainz) * Fix a bug in IlmImf where uncompressed data doesn't get read/written correctly. (Wojciech Jarosz) * Added support for preview images and preview image attributes (thumbnail images) in IlmImf. (Florian Kainz) * Added support for automatic frame buffer type conversion in IlmImf. (Florian Kainz) * Cleaned up some compile-time checks. * Added HalfTest unit tests. * [exrdisplay] Download half framebuffer to texture memory instead of converting to float first. Requires latest Nvidia drivers. ## Version 1.0.5 (April 3, 2003) Industrial Light & Magic has released the source code for an OpenEXR display driver for Pixar's Renderman. This display driver is covered under the OpenEXR free software license. See the downloads section for the source code. ### Detailed Changes: * Fixed IlmImf.dll to use static runtime libs (Andreas). * Added exrheader project to Visual Studio 6.0 workspace. * Added some example code showing how to use the IlmImf library. (Florian) * Use DLL runtime libs for Win32 libraries rather than static runtime libs. * Add an exrdisplay_fragshader project to the Visual Studio 6.0 workspace to enable fragment shaders in Win32. * Add an IlmImfDll project to the Visual Studio 6.0 workspace. * In Win32, export the ImfCRgbaFile C interface via a DLL so that Visual C++ 6.0 users can link against an Intel-compiled IlmImf. (Andreas Kahler) * Use auto_ptr in ImfAutoArray on Win32, it doesn't like large automatic stacks. * Performance improvements in PIZ decoding, between 20 and 60% speedup on Athlon and Pentium 4 systems. (Florian) * Updated the README with various information, made some cosmetic changes for readability. * Added fragment shader support to exrdisplay. * Bumped the version to 1.0.5 in prep for release. * Updated README and README.OSX to talk about CodeWarrior project files. * Incorporated Rodrigo Damazio's patch for an openexr.m4 macro file and an openexr.spec file for building RPMs. * Small change in ImfAttribute.h to make IlmImf compile with gcc 2.95. * Updated ImfDoubleAttribute.h for Codewarrior on MacOS. * Added exrheader utility. * Update to AUTHORS file. * Added a README.win32 file. * Added project files for Visual Studio 6.0. * Initial Win32 port. Requires Visual Studio 6.0 and Intel C++ compiler version 7.0. * Added new intersectT method in ImathSphere.h * Fixed some bugs in ImathQuat.h * Proper use of fltk-config to get platform-specific FLTK compile- and link-time flags. * exrdisplay uses Imath::Math::pow instead of powf now. powf is not availble on all platforms. * Roll OS X "hack" into the source until Apple fixes their istream implementation. ## Version 1.0.4 ### Detailed Changes: * OpenEXR is now covered by a modified BSD license. See LICENSE for the new terms. ## Version 1.0.3: ### Detailed Changes: * OpenEXR is now in sf.net CVS. * Imf::Xdr namespace cleanups. * Some IlmImfTest cleanups for OS X. * Use .cpp extension in exrdisplay sources. * Iex cleanups. * Make IlmImf compile with Metrowerks Codewarrior. * Change large automatic stacks in ImfHuf.C to auto_ptrs allocated off the heap. MacOS X default stack size isn't large enough. * std::ios fix for MacOS X in ImfInputFile.C. * Added new FP predecessor/successor functions to Imath, added tests to ImathTest * Fixed a bug in Imath::extractSHRT for 3x3 matricies when exactly one of the original scaling factors is negative, updated ImathTest to check this case. * Install include files when 'make install' is run. * exrdisplay requires fltk 1.1+ now in an effort to support a MacOS X display program (fltk 1.1 runs on OS X), though this is untested. * renamed configure.in to configure.ac * Removed some tests from IexTest that are no longer used. * Removed ImfHalfXdr.h, it's not used anymore. * Revamped the autoconf system, added some compile-time optimizations, a pkgconfig target, and some maintainer-specific stuff. ## Version 1.0.2 ### Detailed Changes: * More OS X fixes in Imath, IlmImf and IlmImfTest. * Imath updates. * Fixed a rotation bug in Imath ## Version 1.0.1 ### Detailed Changes: * Used autoconf 2.53 and automake 1.6 to generate build environment. * Makefile.am cleanups. * OS X fixes. * removed images directory (now distributed separately). ## Version 1.0 ### Detailed Changes: * first official release. * added some high-level documentation, removed the old OpenEXR.html documentation. * fixed a few nagging build problems. * bumped IMV_VERSION_NUMBER to 2 ## Version 0.9 ### Detailed Changes: * added exrdisplay viewer application. * cleanup _data in Imf::InputFile and Imf::OutputFile constructors. * removed old ILM copyright notices. ## Version 0.8 ### Detailed Changes: * Initial release. openexr-2.5.7/CMakeLists.txt000066400000000000000000000062631406177042200157570ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # We require this to get object library link library support and # combined python 2 + 3 support if(OPENEXR_BUILD_BOTH_STATIC_SHARED OR ILMBASE_BUILD_BOTH_STATIC_SHARED) if (${CMAKE_VERSION} VERSION_LESS "3.12.0") message(FATAL_ERROR "CMake 3.12 or newer is required for object library support when building both static and shared libraries") endif() cmake_minimum_required(VERSION 3.12) else() cmake_minimum_required(VERSION 3.10) endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() # Hint: This can be set to enable custom find_package # search paths, probably best to set it when configuring # on the command line to cmake instead of setting it # here. ###set(CMAKE_PREFIX_PATH "/prefix") project(OpenEXRMetaProject) # If you want to use ctest to configure, build and # upload the results, cmake has builtin support for # submitting to CDash, or any server who speaks the # same protocol # # These settings will need to be set for your environment, # and then a script such as the example in # # cmake/SampleCTestScript.cmake # # edited and placed into the CI system, then run: # # cmake -S cmake/SampleCTestScript.cmake # # [or whatever you name the file you edit] # #set(CTEST_PROJECT_NAME "OpenEXR") #set(CTEST_NIGHTLY_START_TIME "01:01:01 UTC") #set(CTEST_DROP_METHOD "http") # there are others... #set(CTEST_DROP_SITE "open.cdash.org") #set(CTEST_DROP_LOCATION "/submit.php?project=MyProject") #set(CTEST_DROP_SITE_CDASH TRUE) include(CTest) if(BUILD_TESTING) enable_testing() endif() ####################################### # Include these two modules without enable/disable options add_subdirectory(IlmBase) # Tell CMake where to find the IlmBaseConfig.cmake file. Makes it posible to call # find_package(IlmBase) in downstream projects set(IlmBase_DIR "${CMAKE_CURRENT_BINARY_DIR}/IlmBase/config" CACHE PATH "" FORCE) # Add an empty IlmBaseTargets.cmake file for the config to use. # Can be empty since we already defined the targets in add_subdirectory file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/IlmBase/config/IlmBaseTargets.cmake" "# Dummy file") add_subdirectory(OpenEXR) # Tell CMake where to find the OpenEXRConfig.cmake file. Makes it posible to call # find_package(OpenEXR) in downstream projects set(OpenEXR_DIR "${CMAKE_CURRENT_BINARY_DIR}/OpenEXR/config" CACHE PATH "" FORCE) # Add an empty OpenEXRTargets.cmake file for the config to use. # Can be empty since we already defined the targets in add_subdirectory file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OpenEXR/config/OpenEXRTargets.cmake" "# Dummy file") # should this just be always on and we conditionally compile what # is found and warn otherwise? or error out? option(PYILMBASE_ENABLE "Enables configuration of the PyIlmBase module" ON) if(PYILMBASE_ENABLE) if (${CMAKE_VERSION} VERSION_LESS "3.12.0") message(WARNING ": CMake version ${CMAKE_VERSION} detected, PyIlmBase uses newer features of cmake (>= 3.12), disabling") else() add_subdirectory(PyIlmBase) endif() endif() # Including this module will add a `clang-format` target to the build if # the clang-format executable can be found. include(cmake/clang-format.cmake) openexr-2.5.7/CODEOWNERS000066400000000000000000000006051406177042200146040ustar00rootroot00000000000000# See https://help.github.com/articles/about-codeowners/ # for more info about CODEOWNERS file # It uses the same pattern rule for gitignore file # https://git-scm.com/docs/gitignore#_pattern_format # Admin /openexr/ASWF/ @cary-ilm @kdt3rd @lgritz @meshula @peterhillman @xlietz /openexr/*.md @cary-ilm @kdt3rd @lgritz @meshula @peterhillman @xlietz openexr-2.5.7/CODE_OF_CONDUCT.md000066400000000000000000000040331406177042200160070ustar00rootroot00000000000000# Code of Conduct The OpenEXR project abides by Linux Foundation's code of conduct, which you can read in full [here](https://lfprojects.org/policies/code-of-conduct). Our covenant includes: * Treat each other with respect, professionalism, fairness, and sensitivity to our many differences and strengths, including in situations of high pressure and urgency. * Never harass or bully anyone verbally, physically or sexually. * Never discriminate on the basis of personal characteristics or group membership. * Communicate constructively and avoid demeaning or insulting behavior or language. * Seek, accept, and offer objective work criticism, and acknowledge properly the contributions of others. * Be honest about your own qualifications, and about any circumstances that might lead to conflicts of interest. * Respect the privacy of others and the confidentiality of data you access. * With respect to cultural differences, be conservative in what you do and liberal in what you accept from others, but not to the point of accepting disrespectful, unprofessional or unfair or unwelcome behavior or advances. * Promote the rules of this Code and take action (especially if you are in a leadership position) to bring the discussion back to a more civil level whenever inappropriate behaviors are observed. * Stay on topic: Make sure that you are posting to the correct channel and avoid off-topic discussions. Remember when you update an issue or respond to an email you are potentially sending to a large number of people. * Step down considerately: participants in every project come and go, and LF Projects is no different. When you leave or disengage from the project, in whole or in part, we ask that you do so in a way that minimizes disruption to the project. This means you should tell people you are leaving and take the proper steps to ensure that others can pick up where you left off. To report incidents or to appeal reports of incidents, send email to the Manager of LF Projects at manager@lfprojects.org. openexr-2.5.7/CONTRIBUTING.md000066400000000000000000000451761406177042200154560ustar00rootroot00000000000000# Contributing to OpenEXR Thank you for your interest in contributing to OpenEXR. This document explains our contribution process and procedures: * [Getting Information](#Getting-Information) * [Legal Requirements](#Legal-Requirements) * [Development Workflow](#Development-Workflow) * [Coding Style](#Coding-Style) * [Versioning Policy](#Versioning-Policy) * [Creating a Release](#Creating-a-Release) For a description of the roles and responsibilities of the various members of the OpenEXR community, see [GOVERNANCE](GOVERNANCE.md), and for further details, see the project's [Technical Charter](ASWF/charter/OpenEXR-Technical-Charter.md). Briefly, Contributors are anyone who submits content to the project, Committers review and approve such submissions, and the Technical Steering Committee provides general project oversight. ## Getting Information There are two primary ways to connect with the OpenEXR project: * The [openexr-dev](https://lists.aswf.io/g/openexr-dev) mail list: This is a development focused mail list with a deep history of technical conversations and decisions that have shaped the project. * [GitHub Issues](https://github.com/AcademySoftwareFoundation/openexr/issues): GitHub Issues are used both to track bugs and to discuss feature requests. ### How to Ask for Help If you have trouble installing, building, or using the library, but there's not yet reason to suspect you've encountered a genuine bug, start by posting a question to the [openexr-dev](http://lists.aswf.io/openexr-dev) mailing list. This is the place for question such has "How do I...". ### How to Report a Bug OpenEXR use GitHub's issue tracking system for bugs and enhancements: https://github.com/AcademySoftwareFoundation/openexr/issues If you are submitting a bug report, please be sure to note which version of OpenEXR you are using, on what platform (OS/version, which compiler you used, and any special build flags or other unusual environmental issues). Please give a specific account of * what you tried * what happened * what you expected to happen instead with enough detail that others can reproduce the problem. ### How to Request a Change Open a GitHub issue: https://github.com/AcademySoftwareFoundation/openexr/issues. Describe the situation and the objective in as much detail as possible. Feature requests will almost certainly spawn a discussion among the project community. ### How to Report a Security Vulnerability If you think you've found a potential vulnerability in OpenEXR, please refer to [SECURITY.md] to responsibly disclose it. ### How to Contribute a Bug Fix or Change To contribute code to the project, first read over the [GOVERNANCE](GOVERNANCE.md) page to understand the roles involved. You'll need: * A good knowledge of git. * A fork of the GitHub repo. * An understanding of the project's development workflow. * Legal authorization, that is, you need to have signed a Contributor License Agreement. See below for details. ## Legal Requirements OpenEXR is a project of the Academy Software Foundation and follows the open source software best practice policies of the Linux Foundation. ### License OpenEXR is licensed under the [BSD-3-Clause](LICENSE.md) license. Contributions to the library should abide by that standard license. ### Contributor License Agreements Developers who wish to contribute code to be considered for inclusion in the OpenEXR distribution must first complete a **Contributor License Agreement**. OpenEXR uses EasyCLA for managing CLAs, which automatically checks to ensure CLAs are signed by a contributor before a commit can be merged. * If you are an individual writing the code on your own time and you're SURE you are the sole owner of any intellectual property you contribute, you can [sign the CLA as an individual contributor](https://github.com/communitybridge/easycla/blob/master/contributors/sign-a-cla-as-an-individual-contributor-to-github.md). * If you are writing the code as part of your job, or if there is any possibility that your employers might think they own any intellectual property you create, then you should use the [Corporate Contributor Licence Agreement](https://github.com/communitybridge/easycla/blob/master/contributors/contribute-to-a-github-company-project.md). The OpenEXR CLAs are the standard forms used by Linux Foundation projects and [recommended by the ASWF TAC](https://github.com/AcademySoftwareFoundation/tac/blob/master/process/contributing.md#contributor-license-agreement-cla). ### Commit Sign-Off Every commit must be signed off. That is, every commit log message must include a “`Signed-off-by`” line (generated, for example, with “`git commit --signoff`”), indicating that the committer wrote the code and has the right to release it under the [BSD-3-Clause](LICENSE.md) license. See https://github.com/AcademySoftwareFoundation/tac/blob/master/process/contributing.md#contribution-sign-off for more information on this requirement. ## Development Workflow ### Git Basics Working with OpenEXR requires understanding a significant amount of Git and GitHub based terminology. If you’re unfamiliar with these tools or their lingo, please look at the [GitHub Glossary](https://help.github.com/articles/github-glossary/) or browse [GitHub Help](https://help.github.com/). To contribute, you need a GitHub account. This is needed in order to push changes to the upstream repository, via a pull request. You will also need Git installed on your local development machine. If you need setup assistance, please see the official [Git Documentation](https://git-scm.com/doc). ### Repository Structure and Commit Policy The OpenEXR repository uses a simple branching and merging strategy. All development work is done directly on the master branch. The master branch represents the bleeding-edge of the project and most contributions should be done on top of it. After sufficient work is done on the master branch and the OpenEXR leadership determines that a release is due, we will bump the relevant internal versioning and tag a commit with the corresponding version number, e.g. v2.0.1. Each Minor version also has its own “Release Branch”, e.g. RB-1.1. This marks a branch of code dedicated to that Major.Minor version, which allows upstream bug fixes to be cherry-picked to a given version while still allowing the master branch to continue forward onto higher versions. This basic repository structure keeps maintenance low, while remaining simple to understand. To reiterate, the master branch represents the latest development version, so beware that it may include untested features and is not generally stable enough for release. To retrieve a stable version of the source code, use one of the release branches. ### The Git Workflow This development workflow is sometimes referred to as [OneFlow](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow). It leads to a simple, clean, linear edit history in the repo. The OpenEXR GitHub repo allows rebase merging and disallows merge commits and squash merging. This ensures that the repo edit history remains linear, avoiding the "bubbles" characteristic of the [GitFlow](https://www.endoflineblog.com/gitflow-considered-harmful) workflow. ### Use the Fork, Luke. In a typical workflow, you should **fork** the OpenEXR repository to your account. This creates a copy of the repository under your user namespace and serves as the “home base” for your development branches, from which you will submit **pull requests** to the upstream repository to be merged. Once your Git environment is operational, the next step is to locally **clone** your forked OpenEXR repository, and add a **remote** pointing to the upstream OpenEXR repository. These topics are covered in the GitHub documentation [Cloning a repository](https://help.github.com/articles/cloning-a-repository/) and [Configuring a remote for a fork](https://help.github.com/articles/configuring-a-remote-for-a-fork/), but again, if you need assistance feel free to reach out on the openexr-dev@lists.aswf.io mail list. ### Pull Requests Contributions should be submitted as Github pull requests. See [Creating a pull request](https://help.github.com/articles/creating-a-pull-request/) if you're unfamiliar with this concept. The development cycle for a code change should follow this protocol: 1. Create a topic branch in your local repository, following the naming format "feature/" or "bugfix/". 2. Make changes, compile, and test thoroughly. Code style should match existing style and conventions, and changes should be focused on the topic the pull request will be addressing. Make unrelated changes in a separate topic branch with a separate pull request. 3. Push commits to your fork. 4. Create a Github pull request from your topic branch. 5. Pull requests will be reviewed by project Committers and Contributors, who may discuss, offer constructive feedback, request changes, or approve the work. 6. Upon receiving the required number of Committer approvals (as outlined in [Required Approvals](#required-approvals)), a Committer other than the PR contributor may merge changes into the master branch. ### Code Review and Required Approvals Modifications of the contents of the OpenEXR repository are made on a collaborative basis. Anyone with a GitHub account may propose a modification via pull request and it will be considered by the project Committers. Pull requests must meet a minimum number of Committer approvals prior to being merged. Rather than having a hard rule for all PRs, the requirement is based on the complexity and risk of the proposed changes, factoring in the length of time the PR has been open to discussion. The following guidelines outline the project's established approval rules for merging: * Core design decisions, large new features, or anything that might be perceived as changing the overall direction of the project should be discussed at length in the mail list before any PR is submitted, in order to: solicit feedback, try to get as much consensus as possible, and alert all the stakeholders to be on the lookout for the eventual PR when it appears. * Small changes (bug fixes, docs, tests, cleanups) can be approved and merged by a single Committer. * Big changes that can alter behavior, add major features, or present a high degree of risk should be signed off by TWO Committers, ideally one of whom should be the "owner" for that section of the codebase (if a specific owner has been designated). If the person submitting the PR is him/herself the "owner" of that section of the codebase, then only one additional Committer approval is sufficient. But in either case, a 48 hour minimum is helpful to give everybody a chance to see it, unless it's a critical emergency fix (which would probably put it in the previous "small fix" category, rather than a "big feature"). * Escape valve: big changes can nonetheless be merged by a single Committer if the PR has been open for over two weeks without any unaddressed objections from other Committers. At some point, we have to assume that the people who know and care are monitoring the PRs and that an extended period without objections is really assent. Approval must be from Committers who are not authors of the change. If one or more Committers oppose a proposed change, then the change cannot be accepted unless: * Discussions and/or additional changes result in no Committers objecting to the change. Previously-objecting Committers do not necessarily have to sign-off on the change, but they should not be opposed to it. * The change is escalated to the TSC and the TSC votes to approve the change. This should only happen if disagreements between Committers cannot be resolved through discussion. Committers may opt to elevate significant or controversial modifications to the TSC by assigning the `tsc-review` label to a pull request or issue. The TSC should serve as the final arbiter where required. ### Test Policy All functionality in the library must be covered by an automated test. Each library has a companion ``Test`` project - ``ImathTest``, ``HalfTest``, ``IlmImfTest`, etc. This test suite is collectively expected to validate the behavior of very part of the library. * Any new functionality should be accompanied by a test that validates its behavior. * Any change to existing functionality should have tests added if they don't already exist. The test should should be run, via ``make check``, before submitting a pull request. In addition, the ``IlmImfFuzzTest`` project validates the library by feeding it corrupted input data. This test is time-consuming (possible over 24 hours), so it will only be run occasionally, but it must succeed before a release is made. ### Project Issue Handling Process Incoming new issues are labeled promptly by the TSC using GitHub labels. The labels include: * **Autotools** - A problem with the autoconf configuration setup. * **Bug** - A bug in the source code. Something appears to be functioning improperly: a compile error, a crash, unexpected behavior, etc. * **Build/Install Issue** - A problem with building or installing the library: configuration file, external dependency, a compile error with a release version that prevents installation. * **C++** - A C++ compilation issue: a compiler warning, syntax issue, or language usage or suggested upgrade. * **CMake** - A build issue with the CMake configuration files. * **CVE** - A security vulnerability bug. * **Documentation** - The project documentation: developer or user guide, web site, project policies, etc. * **Feature Request** - A suggested change or addition of functionality to the library. * **Mac OS** - A build issue specific to Mac OS. * **MinGW** - An issue specific to MinGW * **Modification** - A modification to the code, refactoring or optimization without significant additional behavior * **Needs Info** - Issue is waiting for more information from the submitter. * **Question/Problem/Help** - A request for help or further investigation, possibly just user error or misunderstanding. * **Test Failure** - One of the automated tests is failing, or an analysis tool is reporting problematic behavior. * **TSC** - To be discussed in the technical steering committee. * **Windows** - A build issue specific to Windows * **Won't Fix** - No further action will taken. ## Coding Style #### Formatting When modifying existing code, follow the surrounding formatting conventions so that new or modified code blends in with the current code. * Indent with spaces, never tabs. Each indent level should be 4 spaces. * Function return types go on a separate line: const float & Header::pixelAspectRatio () const { ... } * Use a space between function names and the following parentheses (although you can eliminate the space for functions with no arguments): void Header::insert (const string& name, const Attribute& attribute) { insert (name.c_str(), attribute); } * Place curly braces on their own lines: void RgbaOutputFile::ToYca::padTmpBuf () { for (int i = 0; i < N2; ++i) { _tmpBuf[i] = _tmpBuf[N2]; _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; } } #### Naming Conventions * In general, classes and template type names should start with upper case and capitalize new words: `class CustomerList;` * In general, local variables should use camelCase. Macros and constants should use `ALL_CAPS`. * Member fields in a class should start with an underscore. No other variables should begin with underscore. #### File conventions C++ implementation should be named `*.cpp`. Headers should be named `.h`. All headers should contain: #pragma once #### Type Conventions Because OpenEXR must deal properly with large images, whose width and/or height approach the maximum allowable in 32-bit signed integers, take special care that integer arithmatic doesn't overlow, and make it as clear as possible exactly what the code is doing, especially in the edge cases. To clarify the intention, prefer to cast between types using ``static_cast<>()`` rather than the basic C-style ``()`` notation: // good: size_t x = static_cast (y); // bad: x = (size_t) y; x = size_t (y); Prefer to use ``std::numeric_limits<>`` instead of preprocesser define's such as ``INT_MAX``: // good: if (x > std::numeric_limits::max()) std::cout << "That's too freakin' high.\n"; // bad: if (x > INT_MAX) #### Copyright Notices All new source files should begin with a copyright and license stating: // Copyright (c) Contributors to the OpenEXR Project. All rights reserved. // SPDX-License-Identifier: BSD-3-Clause #### Third-party libraries Prefer C++11 `std` over boost where possible. Use boost classes you already see in the code base, but check with the project leadership before adding new boost usage. #### Comments and Doxygen Comment philosophy: try to be clear, try to help teach the reader what's going on in your code. Prefer C++ comments (starting line with `//`) rather than C comments (`/* ... */`). For public APIs, use Doxygen-style comments (start with `///`), such as: /// Explanation of a class. Note THREE slashes! /// Also, you need at least two lines like this. If you don't have enough /// for two lines, make one line blank like this: /// class myclass { .... float foo; ///< Doxygen comments on same line look like this } ## Versioning Policy OpenEXR uses [semantic versioning](https://semver.org), which labels each version with three numbers: Major.Minor.Patch, where: * **MAJOR** indicates incompatible API changes * **MINOR** indicates functionality added in a backwards-compatible manner * **PATCH** indicates backwards-compatible bug fixes ## Creating a Release To create a new release from the master branch: 1. Update the release notes in ``CHANGES.md``. Write a high-level summary of the features and improvements. Include the summary in ``CHANGES.md`` and also in the Release comments. Include the log of all changes since the last release, via: git log v2.2.1...v2.3.0 --date=short --pretty=format:"[%s](https://github.com/AcademySoftwareFoundation/openexr/commit/%H) ([%an](@%ae) %ad)" Include diff status via: git diff --stat v2.2.1 2. Create a new release on the GitHub Releases page. 3. Tag the release with name beginning with '``v``', e.g. '``v2.3.0``'. 4. Download and sign the release tarball, as described [here](https://wiki.debian.org/Creating%20signed%20GitHub%20releases), 5. Attach the detached ``.asc`` signature file to the GitHub release as a binary file. openexr-2.5.7/CONTRIBUTORS.md000066400000000000000000000017261406177042200154750ustar00rootroot00000000000000This is a list of contributors to the OpenEXR project, sorted alphabetically by first name. If you know of missing, please email: info@openexr.com. * Andre Mazzone * Andrew Kunz * Arkady Shapkin * Arkell Rasiah * Brendan Bolles * Cary Phillips * Christina Tempelaar-Lietz * Christopher Horvath * Christopher Kulla * Daniel Kaneider * Drew Hess * Ed Hanway * Edward Kmett * Eric Sommerlade * Eric Wimmer * E Sommerlade * Florian Kainz * Halfdan Ingvarsson * Ibraheem Alhashim * Jack Kingsman * Jamie Kenyon * Ji Hun Yu * John Loy * John Mertic * Jonathan Stone * Juri Abramov * Karl Rasche * Kevin Wheatley * Kimball Thurston * Larry Gritz * Liam Fernandez * Lucy Wilkes * Michael Thomas * Nicholas Yue * Nick Porcino * Nick Rasmussen * Nicolas Chauvet * Paul Schneider * Peter Hillman * Piotr Stanczyk * Ralph Potter * Richard Goedeken * Shawn Walker-Salas * Simon Otter * Srinath Ravichandran * Thanh Ha * Thorsten Kaufmann * Wenzel Jakob * Wojciech Jarosz * Xo Wang * Yujie Shu openexr-2.5.7/Contrib/000077500000000000000000000000001406177042200146105ustar00rootroot00000000000000openexr-2.5.7/Contrib/DtexToExr/000077500000000000000000000000001406177042200164765ustar00rootroot00000000000000openexr-2.5.7/Contrib/DtexToExr/AUTHORS000066400000000000000000000001031406177042200175400ustar00rootroot00000000000000Developers: ----------- Christopher Horvath openexr-2.5.7/Contrib/DtexToExr/ChangeLog000066400000000000000000000007061406177042200202530ustar00rootroot00000000000000Version 1.0.0: * Initial release of this code. Version 1.0.1: * Fixed misinterpretation of values read from "deepopacity" dtex files. The data stored is actually transmission, or 1.0-opacity, which means that "deepopacity" dtex values actually monotonically decrease from 1 to 0. We have updated the comments and documentation to reflect this and have fixed the PxOneChanDeepOpacity file to convert the data as it is read out of the file. openexr-2.5.7/Contrib/DtexToExr/DtexToExr.cpp000066400000000000000000000431421406177042200210740ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #include "PxDeepUtils.h" #include "PxDeepOutPixel.h" #include "PxDeepOutRow.h" #include "PxBaseDeepHelper.h" #include "PxOneChanDeepOpacity.h" #include "PxOneChanDeepAlpha.h" #include "PxFourChanDeepRgba.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //-***************************************************************************** // DTEX CONVERTER EXPLANATION! //-***************************************************************************** // There are six possible code paths through converting the dtex data. They are: // DeepOpacity, Continuous // DeepOpacity, Discrete // DeepAlpha, Continuous // DeepAlpha, Discrete // DeepRGBA, Continuous // DeepRGBA, Discrete // The newer dtex usages allow for other combinations of channels, but we // are temporarily just supporting these six paths for sake of simplicity. // We will eventually support arbitrary outputs and multiple views. // // We had an earlier version of this code which condensed these six code // pathways into a single function, with templated functors to provide // specific differing behavior for each of the different possibilities, and // while it may have been slightly less code, the resulting loops were very hard // to read and understand. Because each of the different pathways // has some specific kernel of knowledge necessary to make it work, we // chose instead to break each one out separately, to clearly expose the // behavior in each case. // // The terminology for Density, Visibility, DeepOpacity, DepthRanges, // along with explanations of the constants are provided in // PxDeepUtils.h // // Our DeepOutPixel helper class is in PxDeepOutPixel.h // // Our DeepOutRow helper class is in PxDeepOutRow.h // // The Base Helper class, which loops over rows, and then pixels of those // rows, is in PxBaseDeepHelper.h // // The DeepOpacity subclasses (discrete/continuous) of BaseDeepHelper are in // PxOneChanDeepOpacity.h // // The DeepAlpha subclasses (discrete/continuous) of BaseDeepHelper are in // PxOneChanDeepAlpha.h // // The DeepRgba subclasses (discrete/continuous) of BaseDeepHelper are in // PxFourChanDeepAlpha.h // //-***************************************************************************** namespace PxDeep { //-***************************************************************************** template void ConvertDtexFile( const std::string& i_fileName, const std::string& i_outFileName, const Parameters& i_params ) { int dtexOpenError = DTEX_NOERR; DtexFile* dtexFile = NULL; DtexCache* dtexCache = NULL; if ( i_fileName.length() ) { // We probably don't need 10000 tiles in the cache, but it's // fine for now. dtexCache = DtexCreateCache( 10000, NULL ); dtexOpenError = DtexOpenFile( i_fileName.c_str(), "rb", dtexCache, &dtexFile ); } if ( !dtexFile ) { if ( i_fileName.length() == 0 ) { PXDU_THROW( "no filename specified" ); } else if ( dtexOpenError != DTEX_NOERR ) { PXDU_THROW( "error (" << dtexOpenError << " opening file: " << i_fileName ); } else { PXDU_THROW( "missing file: " << i_fileName ); } } // Just handling the first image in the Dtex file for now. DtexImage* image; DtexGetImageByIndex( dtexFile, 0, &image ); float NP[16]; DtexNP( image, NP ); float Nl[16]; DtexNl( image, Nl ); int numDtexChans = DtexNumChan( image ); if ( numDtexChans != 1 && numDtexChans != 3 && numDtexChans != 4 ) { DtexClose( dtexFile ); PXDU_THROW( "ERROR: only 1, 3 or 4 channel dtex files are supported.\n" << "Dtex file " << i_fileName << " contains " << numDtexChans << " channels.\n" << "In the case of 3 channels, the data is assumed to be\n" << "3-channel opacity, and for now, at least, only the\n" << "first channel is used, rather than all three.\n" ); } int w = DtexWidth( image ); int h = DtexHeight( image ); // Extract the parameters so we can conditionally modify them. Parameters params = i_params; // If we're reading anything more than 1 channel, // we can't (for now) assume it's a deepOpacity signal, // so we turn off the deepOpacity flag. // We also make sure RGB is turned on when RGB data is present. if ( numDtexChans == 4 ) { params.deepOpacity = false; params.doRGB = true; } // If we're discrete, we don't necessarily need to output deepBack. // However, from a pipeline point of view it is often preferable to have // all the channels actually in existence, even if they're redundant. // Nonetheless, if if ( !params.discrete ) { params.doDeepBack = true; } // Determine the output size int outWidth = w; int outHeight = h; if ( params.sideways ) { outWidth = h; outHeight = w; } // Create the windows. Imath::Box2i dataWindow( Imath::V2i( 0, 0 ), Imath::V2i( outWidth-1, outHeight-1 ) ); Imath::Box2i displayWindow = dataWindow; // Create the header. Imf::Header header( displayWindow, dataWindow, 1, Imath::V2f( 0.0f, 0.0f ), 1, Imf::INCREASING_Y, Imf::ZIPS_COMPRESSION ); // Add Np/Nl to the header. Imath::M44f NPm( NP[0], NP[1], NP[2], NP[3], NP[4], NP[5], NP[6], NP[7], NP[8], NP[9], NP[10], NP[11], NP[12], NP[13], NP[14], NP[15] ); addWorldToNDC( header, NPm ); Imath::M44f Nlm( Nl[0], Nl[1], Nl[2], Nl[3], Nl[4], Nl[5], Nl[6], Nl[7], Nl[8], Nl[9], Nl[10], Nl[11], Nl[12], Nl[13], Nl[14], Nl[15] ); addWorldToCamera( header, Nlm ); // Add channels to the header. // RGB if ( params.doRGB ) { header.channels().insert( "R", Imf::Channel( ImfPixelType() ) ); header.channels().insert( "G", Imf::Channel( ImfPixelType() ) ); header.channels().insert( "B", Imf::Channel( ImfPixelType() ) ); } // A header.channels().insert( "A", Imf::Channel( ImfPixelType() ) ); // Deep Front (z) header.channels().insert( "Z", Imf::Channel( Imf::FLOAT ) ); // Deep Back if ( params.doDeepBack ) { header.channels().insert( "ZBack", Imf::Channel( Imf::FLOAT ) ); } // Tell header to be deep! header.setType( Imf::DEEPSCANLINE ); // Create output file, and fill it up! { Imf::DeepScanLineOutputFile outputFile( i_outFileName.c_str(), header ); // Process deep pixels. if ( numDtexChans < 4 ) { if ( params.discrete ) { if ( params.deepOpacity ) { OneChanDeepOpacityDiscrete op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } else { OneChanDeepAlphaDiscrete op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } } else { if ( params.deepOpacity ) { OneChanDeepOpacityContinuous op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } else { OneChanDeepAlphaContinuous op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } } } else { if ( params.discrete ) { FourChanDeepRgbaDiscrete op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } else { FourChanDeepRgbaContinuous op( dtexFile, numDtexChans, params ); op.processDeepBox( outputFile, dataWindow ); } } } // Output file has gone out of scope, and should be closed! std::cout << "Wrote file: " << i_outFileName << std::endl; // Close it up! if ( dtexFile ) { DtexClose( dtexFile ); } if ( dtexCache ) { DtexDestroyCache( dtexCache ); } } } // End namespace PxDeep //-***************************************************************************** // Print Usage. void PrintUsage( const std::string& i_cmd, std::ostream& ostr ) { ostr << "DtexToExr: USAGE: " << i_cmd << std::endl << std::endl << "\t " << std::endl << std::endl << "\t " << std::endl << std::endl << "\t --deepOpacity (DEFAULT) " << "\n\t\t (corresponds to output channels \'deepopacity\')" << std::endl << std::endl << "\t --deepAlpha " << "\n\t\t (corresponds to output channels \'a\' or \'rgba\')" << std::endl << std::endl << "\t --discrete (DEFAULT) " << "\n\t\t (corresponds to \'volumeinterpretation discrete\')" << std::endl << std::endl << "\t --continuous " << "\n\t\t (corresponds to \'volumeinterpretation continuous\')" << std::endl << std::endl << "\t --full " << "\n\t\t (use full 32-bit precision for non-depth (RGBA) data)" << std::endl << std::endl << "\t --half (DEFAULT) " << "\n\t\t (use half 16-bit precision for non-depth (RGBA) data)" << std::endl << std::endl << "\t --multRgb " << "\n\t\t (multiply RGB data by Alpha, " << "implying that source data is unpremultiplied)" << std::endl << std::endl << "\t --sideways [true|false]" << "\n\t\t (rotate image 90 deg clockwise)" << std::endl << std::endl << "\t --compressionError (DEFAULT: 0.0f) " << "\n\t\t (compress dtex data before converting to deep exr)" << std::endl << std::endl << "\t --keepZeroAlpha " << "\n\t\t (don\'t discard samples with zero alpha)" << std::endl << std::endl << "\t --discardZeroAlpha (DEFAULT) " << "\n\t\t (discard samples with zero alpha)" << std::endl << std::endl << "\t -h,--h,--help " << "\n\t\t (print this message and exit)" << std::endl << std::endl; } //-***************************************************************************** inline bool GoodFileName( const std::string& i_fileName ) { return !( ( i_fileName.length() == 0 || i_fileName == "" || i_fileName[0] == '-' ) ); } //-***************************************************************************** // Argument parsing. So inelegant, but libarg is not widely supported, and // boost::program_options is, well, boost. Also - not particularly awesome. void ParseArguments( int argc, char* argv[], bool& o_full, std::string& o_dtexFileName, std::string& o_exrFileName, PxDeep::Parameters& o_params ) { if ( argc < 3 ) { PrintUsage( argv[0], std::cerr ); exit( -1 ); } // Make our params match what the usage string says by default. o_full = false; o_dtexFileName = ""; o_exrFileName = ""; o_params.deepOpacity = true; o_params.discrete = true; o_params.multiplyColorByAlpha = false; o_params.sideways = false; o_params.discardZeroAlphaSamples = true; o_params.doDeepBack = true; o_params.doRGB = false; o_params.compressionError = 0.0f; // Eat up the args! for ( int argi = 1; argi < argc; ++argi ) { std::string arg = argv[argi]; if ( arg == "-h" || arg == "-help" || arg == "--help" ) { PrintUsage( argv[0], std::cerr ); exit( -1 ); } else if ( argi == 1 ) { if ( !GoodFileName( arg ) ) { PrintUsage( argv[0], std::cerr ); PXDU_THROW( "Bad file name: " << arg ); } o_dtexFileName = arg; } else if ( argi == 2 ) { if ( !GoodFileName( arg ) ) { PrintUsage( argv[0], std::cerr ); PXDU_THROW( "Bad file name: " << arg ); } o_exrFileName = arg; } else if ( arg == "--deepOpacity" ) { o_params.deepOpacity = true; } else if ( arg == "--deepAlpha" ) { o_params.deepOpacity = false; } else if ( arg == "--discrete" ) { o_params.discrete = true; } else if ( arg == "--continuous" ) { o_params.discrete = false; } else if ( arg == "--full" ) { o_full = true; } else if ( arg == "--half" ) { o_full = false; } else if ( arg == "--multRgb" ) { o_params.multiplyColorByAlpha = true; } else if ( arg == "--sideways" ) { if ( argi <= argc-1 ) { std::cout << argv[argi+1] << std::endl; if ( strcmp(argv[argi+1], "true") == 0 ) { o_params.sideways = true; ++argi; } else if ( strcmp(argv[argi+1], "false") == 0 ) { o_params.sideways = false; ++argi; } else if ( argv[argi+1][0] == '-' ) { // found another arg. sideways has no parameter, which means sideways is on. o_params.sideways = true; } else { // sideways must be followed by "true", "false", another arg, or nothing. PXDU_THROW( "Invalid parameter for --sideways: " << argv[argi+1] ); } } else { o_params.sideways = true; } } else if ( arg == "--compressionError" ) { if ( argi >= argc-1 ) { PrintUsage( argv[0], std::cerr ); PXDU_THROW( "Unspecified compression error." ); } o_params.compressionError = atof( argv[argi+1] ); ++argi; } else if ( arg == "--keepZeroAlpha" ) { o_params.discardZeroAlphaSamples = false; } else if ( arg == "--discardZeroAlpha" ) { o_params.discardZeroAlphaSamples = true; } else { PrintUsage( argv[0], std::cerr ); PXDU_THROW( "Unknown command line argument: " << arg ); } } } //-***************************************************************************** // MAIN FUNCTION //-***************************************************************************** int main( int argc, char *argv[] ) { try { PxDeep::Parameters params; std::string dtexFileName; std::string exrFileName; bool full; ParseArguments( argc, argv, full, dtexFileName, exrFileName, params ); if ( full ) { PxDeep::ConvertDtexFile( dtexFileName, exrFileName, params ); } else { PxDeep::ConvertDtexFile( dtexFileName, exrFileName, params ); } } catch ( std::exception& exc ) { std::cerr << "ERROR EXCEPTION: " << exc.what() << std::endl; exit( -1 ); } catch ( ... ) { std::cerr << "UNKNOWN EXCEPTION." << std::endl; exit( -1 ); } return 0; } openexr-2.5.7/Contrib/DtexToExr/Makefile.am000066400000000000000000000007731406177042200205410ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in # tell autoconf to include the m4 macros in the /m4 directory # (an alternative to the acinclude.m4 mechanism) ACLOCAL_AMFLAGS = -I m4 bin_PROGRAMS = DtexToExr INCLUDES = @OPENEXR_CXXFLAGS@ @PRMANSDK_CXXFLAGS@ LDADD = @OPENEXR_LDFLAGS@ @OPENEXR_LIBS@ @PRMANSDK_LDFLAGS@ @PRMANSDK_LIBS@ -lz DtexToExr_SOURCES = PxDeepUtils.cpp DtexToExr.cpp openexr-2.5.7/Contrib/DtexToExr/Makefile.test000066400000000000000000000026551406177042200211240ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## BUILDTMP = obj IPATH = -I${DTEXTOEXR_PREFIX}/include/OpenEXR \ -I${DTEXTOEXR_RMANROOT}/include/prmansdk-160 \ -I${DTEXTOEXR_RMANROOT}/include LPATH = -L${DTEXTOEXR_PREFIX}/lib \ -L${DTEXTOEXR_RMANROOT}/lib/prmansdk-160 \ -L${DTEXTOEXR_RMANROOT}/lib \ -Wl,-rpath ${DTEXTOEXR_PREFIX}/lib \ -Wl,-rpath ${DTEXTOEXR_RMANROOT}/lib/prmansdk-160 \ -Wl,-rpath ${DTEXTOEXR_RMANROOT}/lib LIBS = -lIlmImf -lImath -lIlmThread -lIex -lHalf \ -lprman \ -lpthread -lm CXX = /usr/bin/g++ LN = /usr/bin/g++ CFLAGS = -g HFILES = PxBaseDeepHelper.h \ PxDeepOutPixel.h \ PxDeepOutRow.h \ PxDeepUtils.h \ PxFourChanDeepRgba.h \ PxOneChanDeepAlpha.h \ PxOneChanDeepOpacity.h OFILES = ${BUILDTMP}/PxDeepUtils.o \ ${BUILDTMP}/DtexToExr.o all: ${BUILDTMP}/DtexToExr ${BUILDTMP}/PxDeepUtils.o: PxDeepUtils.h PxDeepUtils.cpp mkdir -p ${BUILDTMP} ${CXX} PxDeepUtils.cpp -c -o ${BUILDTMP}/PxDeepUtils.o ${CFLAGS} ${IPATH} ${BUILDTMP}/DtexToExr.o: DtexToExr.cpp ${HFILES} mkdir -p ${BUILDTMP} ${CXX} DtexToExr.cpp -c -o ${BUILDTMP}/DtexToExr.o ${CFLAGS} ${IPATH} ${BUILDTMP}/DtexToExr: ${OFILES} mkdir -p ${BUILDTMP} ${LN} ${OFILES} -o ${BUILDTMP}/DtexToExr ${CFLAGS} ${IPATH} ${LPATH} ${LIBS} install: ${BUILDTMP}/DtexToExr /bin/cp -f ${BUILDTMP}/DtexToExr ${DTEXTOEXR_PREFIX}/bin/DtexToExr clean: /bin/rm ${OFILES} /bin/rm ${BUILDTMP}/DtexToExr openexr-2.5.7/Contrib/DtexToExr/PxBaseDeepHelper.h000066400000000000000000000173341406177042200217770ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxDeepBaseHelper_h_ #define _PxDeepBaseHelper_h_ #include "PxDeepUtils.h" #include "PxDeepOutPixel.h" #include "PxDeepOutRow.h" #include #include #include #include #include #include namespace PxDeep { //-***************************************************************************** // PARAMETERS STRUCT //-***************************************************************************** // This allows us to keep function signatures from changing around too much // as the parameter set grows & changes, which it always does. struct Parameters { Parameters() : deepOpacity( true ) , discrete( true ) , multiplyColorByAlpha( false ) , sideways( false ) , discardZeroAlphaSamples( true ) , doDeepBack( true ) , doRGB( true ) , compressionError( 0.0f ) {} bool deepOpacity; bool discrete; bool multiplyColorByAlpha; bool sideways; bool discardZeroAlphaSamples; bool doDeepBack; bool doRGB; float compressionError; }; //-***************************************************************************** // BASE DEEP HELPER CLASS //-***************************************************************************** // The intention of this templated base class is to provide consistent // storage vectors for spans and deep pixels across multiple pixel reads, // so we don't slow down constantly creating and destroying std::vectors. // This class has a "processDeepBox" function which does the work. template class BaseDeepHelper { public: typedef DERIVED sub_type; typedef SPAN span_type; BaseDeepHelper( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : m_dtexFile( i_dtexFile ) , m_numDtexChans( i_numDtexChans ) , m_params( i_params ) { m_image = NULL; DtexGetImageByIndex( m_dtexFile, 0, &m_image ); m_fileWidth = DtexWidth( m_image ); m_fileHeight = DtexHeight( m_image ); m_pixel = DtexMakePixel( m_numDtexChans ); m_rawPixel = DtexMakePixel( m_numDtexChans ); } ~BaseDeepHelper() { DtexDestroyPixel( m_pixel ); DtexDestroyPixel( m_rawPixel ); } void processDeepBox( Imf::DeepScanLineOutputFile& o_file, const Imath::Box2i& i_box ); protected: DtexFile* m_dtexFile; int m_numDtexChans; Parameters m_params; DtexImage* m_image; int m_fileWidth; int m_fileHeight; DtexPixel* m_pixel; DtexPixel* m_rawPixel; std::vector m_spans; DeepOutPixel m_deepOutPixel; }; //-***************************************************************************** //-***************************************************************************** // SPAN CLASSES //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** // These span objects are used by the helper classes below to keep track // of the information read out of the DTEX file, so it can be processed. // They have an ordering operator which sorts them by depth and then index. // We use double precision for 'viz', for reasons described in the 'VIZ' // section of the explanatory comments in the PxDeepUtils library. struct Span { Span() : in( 0.0f ), out( 0.0f ), viz( 0.0 ), index( 0 ) {} float in; float out; double viz; int index; void clear() { in = 0.0f; out = 0.0f; viz = 0.0; index = 0; } bool operator<( const Span& i_other ) const { if ( in < i_other.in ) { return true; } else if ( in == i_other.in ) { return index < i_other.index; } else { return false; } } }; //-***************************************************************************** // Because the RGB values here are unpremultiplied, we use double precision // to avoid precision loss when going (RGB/A)*A. struct SpanRgba : public Span { SpanRgba() : Span() { rgb[0] = 0.0; rgb[1] = 0.0; rgb[2] = 0.0; } double rgb[3]; void clear() { Span::clear(); rgb[0] = 0.0; rgb[1] = 0.0; rgb[2] = 0.0; } }; //-***************************************************************************** // As above, we use double precision for viz. struct SpanOpac : public Span { SpanOpac() : Span(), deepViz( 0.0 ) {} double deepViz; void clear() { Span::clear(); deepViz = 0.0; } }; //-***************************************************************************** // The box processing simply loops over the rows, compresses each pixel, then // converts from dtex representation to deep exr representation, and finally // writes the rows to the file. template void BaseDeepHelper::processDeepBox ( Imf::DeepScanLineOutputFile& o_file, const Imath::Box2i& i_box ) { int width = ( i_box.max.x - i_box.min.x ) + 1; DeepOutRow outRow( width, m_params.doDeepBack, m_params.doRGB ); for ( int y = i_box.max.y; y >= i_box.min.y; --y ) { outRow.clear(); for ( int x = i_box.min.x; x <= i_box.max.x; ++x ) { if ( m_params.sideways ) { DtexGetPixel( m_image, m_fileWidth - 1 - y, m_fileHeight - 1 - x, m_rawPixel ); } else { DtexGetPixel( m_image, x, m_fileHeight - 1 - y, m_rawPixel ); } // Get the number of input points. int numPointsIn = DtexPixelGetNumPoints( m_rawPixel ); if ( numPointsIn < 0 ) { PXDU_THROW( "Negative num points returned at dtex pixel: " << x << ", " << y ); } // Compress the pixel. if ( numPointsIn > 1 && m_params.compressionError > 0.0f ) { DtexCompressPixel( m_rawPixel, m_pixel, m_params.compressionError ); DtexFinishPixel( m_pixel ); } else { DtexCopyPixel( m_pixel, m_rawPixel ); DtexFinishPixel( m_pixel ); } // Get num points of compressed pixel. int numPts = DtexPixelGetNumPoints( m_pixel ); // If no samples here, continue on. if ( numPts < 1 ) { outRow.addHole( x - i_box.min.x ); continue; } m_deepOutPixel.clear(); m_deepOutPixel.reserve( numPts * m_numDtexChans ); // Process the deep pixels. DERIVED* derivedThis = static_cast( this ); derivedThis->processDeepPixel( numPts ); // Add the pixel to the row. outRow.addPixel( x - i_box.min.x, m_deepOutPixel ); } // Create the frame buffer. // I'm not sure if this can be reused from row to row. Imf::DeepFrameBuffer frameBuffer; // Set the deep out row into the framebuffer. outRow.setFrameBuffer( frameBuffer ); // Write row. o_file.setFrameBuffer( frameBuffer ); o_file.writePixels( 1 ); } } } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/PxDeepOutPixel.h000066400000000000000000000054521406177042200215340ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxDeepOutPixel_h_ #define _PxDeepOutPixel_h_ #include "PxDeepUtils.h" namespace PxDeep { //-***************************************************************************** //-***************************************************************************** // DEEP OUT PIXEL //-***************************************************************************** //-***************************************************************************** // While constructing a deep out pixel from a dtex pixel, we reuse some // temporary storage. template struct DeepOutPixel { size_t size() const { return deepFront.size(); } void clear() { deepFront.clear(); deepBack.clear(); red.clear(); green.clear(); blue.clear(); alpha.clear(); } void reserve( size_t N ) { deepFront.reserve( N ); deepBack.reserve( N ); red.reserve( N ); green.reserve( N ); blue.reserve( N ); alpha.reserve( N ); } void push_back( float i_depth, RGBA_T i_alpha ) { deepFront.push_back( i_depth ); deepBack.push_back( i_depth ); red.push_back( 0.0f ); green.push_back( 0.0f ); blue.push_back( 0.0f ); alpha.push_back( i_alpha ); } void push_back( float i_deepFront, float i_deepBack, RGBA_T i_alpha ) { deepFront.push_back( i_deepFront ); deepBack.push_back( i_deepBack ); red.push_back( 0.0f ); green.push_back( 0.0f ); blue.push_back( 0.0f ); alpha.push_back( i_alpha ); } void push_back( float i_depth, RGBA_T i_red, RGBA_T i_green, RGBA_T i_blue, RGBA_T i_alpha ) { deepFront.push_back( i_depth ); deepBack.push_back( i_depth ); red.push_back( i_red ); green.push_back( i_green ); blue.push_back( i_blue ); alpha.push_back( i_alpha ); } void push_back( float i_deepFront, float i_deepBack, RGBA_T i_red, RGBA_T i_green, RGBA_T i_blue, RGBA_T i_alpha ) { deepFront.push_back( i_deepFront ); deepBack.push_back( i_deepBack ); red.push_back( i_red ); green.push_back( i_green ); blue.push_back( i_blue ); alpha.push_back( i_alpha ); } std::vector deepFront; std::vector deepBack; std::vector red; std::vector green; std::vector blue; std::vector alpha; }; } #endif openexr-2.5.7/Contrib/DtexToExr/PxDeepOutRow.h000066400000000000000000000165561406177042200212310ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxDeepOutRow_h_ #define _PxDeepOutRow_h_ #include "PxDeepUtils.h" #include "PxDeepOutPixel.h" #include #include #include #include namespace PxDeep { //-***************************************************************************** //-***************************************************************************** // DEEP OUT ROW //-***************************************************************************** //-***************************************************************************** template class DeepOutRow { public: DeepOutRow( int i_width, bool i_doDeepBack, bool i_doRGB ); void clear(); void addHole( int i_x ) { m_sampleCounts[i_x] = 0; } void addPixel( int i_x, const DeepOutPixel& i_pixel ); void setFrameBuffer( Imf::DeepFrameBuffer& o_frameBuffer ); protected: // Width of the row. int m_width; // Whether or not to bother with deep back bool m_doDeepBack; // Whether or not to bother with RGB bool m_doRGB; // Scanline sample buffers. std::vector m_sampleCounts; // The pointers to data at each pixel std::vector m_deepFrontPtrs; std::vector m_deepBackPtrs; std::vector m_redPtrs; std::vector m_greenPtrs; std::vector m_bluePtrs; std::vector m_alphaPtrs; // The data itself. std::vector m_deepFrontSamples; std::vector m_deepBackSamples; std::vector m_redSamples; std::vector m_greenSamples; std::vector m_blueSamples; std::vector m_alphaSamples; }; //-***************************************************************************** template inline void VecAppend( T& i_dst, const T& i_src ) { i_dst.insert( i_dst.end(), i_src.begin(), i_src.end() ); } //-***************************************************************************** template DeepOutRow::DeepOutRow( int i_width, bool i_doDeepBack, bool i_doRGB ) : m_width( i_width ) , m_doDeepBack( i_doDeepBack ) , m_doRGB( i_doRGB ) { m_sampleCounts.resize( ( size_t )m_width ); m_deepFrontPtrs.resize( ( size_t )m_width ); if ( m_doDeepBack ) { m_deepBackPtrs.resize( ( size_t )m_width ); } if ( m_doRGB ) { m_redPtrs.resize( ( size_t )m_width ); m_greenPtrs.resize( ( size_t )m_width ); m_bluePtrs.resize( ( size_t )m_width ); } m_alphaPtrs.resize( ( size_t )m_width ); } //-***************************************************************************** template void DeepOutRow::clear() { std::fill( m_sampleCounts.begin(), m_sampleCounts.end(), ( uint )0 ); m_deepFrontSamples.clear(); m_deepBackSamples.clear(); m_redSamples.clear(); m_greenSamples.clear(); m_blueSamples.clear(); m_alphaSamples.clear(); } //-***************************************************************************** template void DeepOutRow::addPixel( int i_x, const DeepOutPixel& i_pixel ) { int npoints = i_pixel.size(); m_sampleCounts[i_x] = npoints; if ( npoints > 0 ) { VecAppend( m_deepFrontSamples, i_pixel.deepFront ); if ( m_doDeepBack ) { VecAppend( m_deepBackSamples, i_pixel.deepBack ); } if ( m_doRGB ) { VecAppend( m_redSamples, i_pixel.red ); VecAppend( m_greenSamples, i_pixel.green ); VecAppend( m_blueSamples, i_pixel.blue ); } VecAppend( m_alphaSamples, i_pixel.alpha ); } } //-***************************************************************************** template void DeepOutRow::setFrameBuffer( Imf::DeepFrameBuffer& o_frameBuffer ) { // Set up the pointers. float *deepFrontLastPtr = m_deepFrontSamples.data(); float *deepBackLastPtr = m_deepBackSamples.data(); RGBA_T *redLastPtr = m_redSamples.data(); RGBA_T *greenLastPtr = m_greenSamples.data(); RGBA_T *blueLastPtr = m_blueSamples.data(); RGBA_T *alphaLastPtr = m_alphaSamples.data(); for ( int x = 0; x < m_width; ++x ) { m_deepFrontPtrs[x] = deepFrontLastPtr; if ( m_doDeepBack ) { m_deepBackPtrs[x] = deepBackLastPtr; } if ( m_doRGB ) { m_redPtrs[x] = redLastPtr; m_greenPtrs[x] = greenLastPtr; m_bluePtrs[x] = blueLastPtr; } m_alphaPtrs[x] = alphaLastPtr; int c = m_sampleCounts[x]; deepFrontLastPtr += c; deepBackLastPtr += c; redLastPtr += c; greenLastPtr += c; blueLastPtr += c; alphaLastPtr += c; } // Sample counts o_frameBuffer.insertSampleCountSlice( Imf::Slice( Imf::UINT, ( char * )m_sampleCounts.data(), sizeof( uint ), // x stride 0 ) ); // y stride // RGB if ( m_doRGB ) { o_frameBuffer.insert( "R", Imf::DeepSlice( ImfPixelType(), ( char * )m_redPtrs.data(), sizeof( RGBA_T* ), // xstride 0, // ystride sizeof( RGBA_T ) ) ); // sample stride o_frameBuffer.insert( "G", Imf::DeepSlice( ImfPixelType(), ( char * )m_greenPtrs.data(), sizeof( RGBA_T* ), // xstride 0, // ystride sizeof( RGBA_T ) ) ); // sample stride o_frameBuffer.insert( "B", Imf::DeepSlice( ImfPixelType(), ( char * )m_bluePtrs.data(), sizeof( RGBA_T* ), // xstride 0, // ystride sizeof( RGBA_T ) ) ); // sample stride } // ALPHA o_frameBuffer.insert( "A", Imf::DeepSlice( ImfPixelType(), ( char * )m_alphaPtrs.data(), sizeof( RGBA_T* ), // xstride 0, // ystride sizeof( RGBA_T ) ) ); // sample stride // DEEP FRONT o_frameBuffer.insert( "Z", Imf::DeepSlice( Imf::FLOAT, ( char * )m_deepFrontPtrs.data(), sizeof( float* ), // xstride 0, // ystride sizeof( float ) ) ); // sample stride // DEEP BACK if ( m_doDeepBack ) { o_frameBuffer.insert( "ZBack", Imf::DeepSlice( Imf::FLOAT, ( char * )m_deepBackPtrs.data(), sizeof( float* ), // xstride 0, // ystride sizeof( float ) ) ); // sample stride } } } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/PxDeepUtils.cpp000066400000000000000000000072341406177042200214160ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #include "PxDeepUtils.h" namespace PxDeep { //-***************************************************************************** // Density/Viz/DZ calculations are always performed in double precision. // We try to leave them alone as much as possible, but the logarithm can get // weird for very very small numbers. The "isfinite" call basically rules // out NaN and Infinity results, though it doesn't bother with subnormal // numbers, since the error case we're worried about is log being too big. // viz = exp( -dz * density ) // log( viz ) = -dz * density // density = -log( viz ) / dz double DensityFromVizDz( double i_viz, double i_dz ) { assert( i_viz >= 0.0 ); assert( i_viz <= 1.0 ); assert( i_dz >= 0.0 ); if ( i_viz >= 1.0 ) { // There's no attenuation at all, so there's no density! return 0.0; } else if ( i_viz <= 0.0 ) { // There's total attenuation, so we use our max density. return PXDU_DENSITY_OF_VIZ_0; } else if ( i_dz <= 0.0 ) { // There's no depth, and viz is greater than zero, // so we assume the density is as high as possible return PXDU_DENSITY_OF_VIZ_0; } else { double d = -log( i_viz ) / i_dz; if ( !isfinite( d ) ) { return PXDU_DENSITY_OF_VIZ_0; } else { return d; } } } //-***************************************************************************** // We can often treat "density times dz" as a single quantity without // separating it. // viz = exp( -densityTimesDz ) // log( viz ) = -densityTimesDz // densityTimesDz = -log( viz ) double DensityTimesDzFromViz( double i_viz ) { assert( i_viz >= 0.0 ); assert( i_viz <= 1.0 ); if ( i_viz >= 1.0 ) { // There's no attenuation at all, so there's no density! return 0.0; } else if ( i_viz <= 0.0 ) { // There's total attenuation, so we use our max density. return PXDU_DENSITY_OF_VIZ_0 * PXDU_DZ_OF_VIZ_0; } else { double d = -log( i_viz ); if ( !isfinite( d ) ) { return PXDU_DENSITY_OF_VIZ_0 * PXDU_DZ_OF_VIZ_0; } else { return d; } } } //-***************************************************************************** // viz = exp( -dz * density ) // log( viz ) = -dz * density // dz = -log( viz ) / density // Note that this is basically the same as the computation above. double DzFromVizDensity( double i_viz, double i_density ) { assert( i_viz >= 0.0 ); assert( i_viz <= 1.0 ); assert( i_density >= 0.0 ); if ( i_viz >= 1.0 ) { // There's no attenuation, so there's no depth. return 0.0; } else if ( i_viz <= 0.0 ) { // There's total attenuation, so we use the smallest depth // for our max density. return PXDU_DZ_OF_VIZ_0; } else if ( i_density <= 0.0 ) { // Hmmm. There's no density, but there is some attenuation, // which basically implies an infinite depth. // We'll use the minimum density. // This whole part is hacky at best. double dz = -log( i_viz ) / PXDU_MIN_NON_ZERO_DENSITY; if ( !isfinite( dz ) ) { return PXDU_MAX_DZ; } else { return dz; } } else { double dz = -log( i_viz ) / i_density; if ( !isfinite( dz ) ) { return PXDU_MAX_DZ; } else { return dz; } } } } // End namespace PxDeep openexr-2.5.7/Contrib/DtexToExr/PxDeepUtils.h000066400000000000000000000436201406177042200210620ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxDeepUtils_h_ #define _PxDeepUtils_h_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::isfinite; namespace PxDeep { //-***************************************************************************** // The large block of comments below explains our working terminology and // the justification of our limits & magic numbers. In a few places, the // use of centimeters as a spatial unit does affect the absolute position of // various minima and maxima, but in normal usage those should be well outside // working ranges. //-***************************************************************************** //-***************************************************************************** // DENSITY //-***************************************************************************** // "Density" refers to the the optical density which, when integrated // through a line, produces an alpha. The relationship between alpha, density, // and line segment of a given length "dz" is as follows: // // alpha = 1.0 - exp( -dz * density ) // // We use a minimum non-zero density in some places in our code, which // represents the density of dry air at atmospheric pressure. Though // different wavelengths of light are attenuated differently, the average // attenuation is 10^-5 per meter. To make it very minimal, // we'll work with 1/10th that density (tiny tiny). Since our facility // works in centimeters, this works out to (using & rearranging the // equation above) // // 10^-6 = 1.0 - exp( -100.0 * MIN_NON_ZERO_DENSITY ) // exp( -100.0 * MIN_NON_ZERO_DENSITY ) = 1.0 - 10^-6 // -100.0 * MIN_NON_ZERO_DENSITY = log( 1.0 - 10^-6 ) // MIN_NON_ZERO_DENSITY = log( 1.0 - 10^-6 ) / -100.0 // MIN_NON_ZERO_DENSITY = 1.0000050000290891e-08 // // We use double precision for density and dz calculations. // //-***************************************************************************** // VISIBILITY (or 'VIZ', or 'TRANSMISSION') //-***************************************************************************** // Throughout the code below, we transform "alpha" into its inverse, which is // transmissivity, or visibility, or for short, 'viz'. The relationship between // alpha and viz is simple: // // alpha = 1.0 - viz, or viz = 1.0 - alpha. // // Similarly, the relationship between viz and density & dz is simple: // // viz = exp( -dz * density ) // log( viz ) = -dz * density // // Viz is easier to work with than alpha, because to accumulate a total // visibility of many adjacent samples, the relationship is just, for the // set of sample viz's: {viz0, viz1, viz2, ..., vizN-1} // // totalViz = viz0 * viz1 * viz2 * ... * vizN-1 // // It's interesting to note that for any given set of spans, their accumulated // visibility is the same regardless of what order they're accumulated in, // since A*B == B*A. // // When using viz, we use double precision because the operation // 1.0f - ( 1.0f - a ) loses precision, and we want as little of that as // possible! // //-***************************************************************************** // DEPTH RANGES //-***************************************************************************** // Because we need to be able to arithmetically manipulate depths, we place // a range on the valid depth values. Positive Infinity is a valid depth value // to be stored in a DTEX file, but in order to make everything else work, we // set the maximum depth to near (but not at) FLT_MAX, 10^30. Similarly, we // set the minimum depth to just slightly greater than zero, 10^-4. This // could potentially clip effects being deep composited with very small // distances and units of meters. // //-***************************************************************************** // DEEP OPACITY //-***************************************************************************** // "Deep Opacity" refers to a depth function in which the sample at each point // represents the total accumulated opacity at that depth. This represents // the way that deep shadows would have been produced by renderman with the // Display Driver Line: "deepshad" "deepopacity", except that the files actually // store the inverse (1.0-opacity) at each point. It is important to note // that for any given Dtex deepopacity sample, the value represents the // accumulation of visibility on the NEAR side of the sample - up to and // including the sample's depth, but no further in depth. Deep Opacity // functions are monotonically decreasing in depth, and are always // between 0 and 1. // // A complication arises when the 0'th continuous deep opacity sample has a // non-zero deep opacity, because we don't have enough information to infer // where the continuous span that ends at the 0th sample begins in depth. We // solve the problem by interrogating the entire deep pixel for the maximum // density of all its spans (see above), and then solving for what dz // would produce the given accumulated alpha for that max density. The // near point of the initial span is then 'dz' units in front of the 0th // sample depth. // // We sometimes use 'deepViz' to in the code below to refer to 1.0 - deepOpacity // //-***************************************************************************** // DEEP ALPHA //-***************************************************************************** // "Deep Alpha" refers to a depth function in which the sample at each point // represents the non-accumulated alpha of that single sample. When interpreting // the depth function as continuous instead of discrete, Deep Alpha represents // the alpha of the FAR side of the sample - from the depth of the sample // up to, but not including, the depth of the next sample. // // A complication arises when the last continuous deep alpha sample has a // non-zero deep alpha, because we don't have enough information to infer // where the continuous span that begins at the last sample ends in depth. We // solve this problem analagously to how we solve the DeepOpacity problem. // We get the maximum density along the entire deep pixel and extrapolate to // determine an end depth. // //-***************************************************************************** // DEEP RGBA //-***************************************************************************** // Deep RGBA is exactly the same as Deep Alpha, for both discrete and // continuous cases, with the additional R,G, and B channels carried along. // The RGB can be read as premultiplied by alpha, or not. The output deep // pixel expects RGB to be premultiplied by alpha. // The use of premultiplied alpha makes it possible to entangle emitted and // reflected light - basically "glows", when premultiplied R,G,B are non-zero // but alpha is zero. However, in order for us to collapse coindicent samples, // we need to temporarily store RGB unpremultiplied. We simply don't affect // the samples that have zero alpha, and don't remultiply samples that have // zero alpha. There's no way for uncombined samples that had non-zero alpha // to produce a combined sample with zero alpha, so any sample that has // zero alpha at the end of all the combining was entirely composed of zero // alpha samples to begin with. SO, if the alpha is zero, we don't // multiply by it! //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** // UTILITY CONSTANTS AND FUNCTIONS //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** // Explained above in the "Density" section of the comments. // We set this value to one tenth the attenuation of light in dry air // at atmospheric pressure. // 10^-6 = 1.0 - exp( -100.0 * MIN_NON_ZERO_DENSITY ) // exp( -100.0 * MIN_NON_ZERO_DENSITY ) = 1.0 - 10^-6 // -100.0 * MIN_NON_ZERO_DENSITY = log( 1.0 - 10^-6 ) // MIN_NON_ZERO_DENSITY = log( 1.0 - 10^-6 ) / -100.0 // MIN_NON_ZERO_DENSITY = 1.0000050000290891e-08 // static const double MIN_NON_ZERO_DENSITY = log( 1.0 - 1.0e-6 ) / -100.0; #define PXDU_MIN_NON_ZERO_DENSITY 1.0000050000290891e-08L //-***************************************************************************** // The change in depth which produces maximum alpha for maximum density. // We want this to be small without risking subnormality. // static const double DZ_OF_ALPHA_1 = 0.001; // static const double DZ_OF_VIZ_0 = 0.001; #define PXDU_DZ_OF_ALPHA_1 0.001 #define PXDU_DZ_OF_VIZ_0 0.001 //-***************************************************************************** // We set the max density of alpha 1 to the density which would produce // an alpha of 0.99999 in a distance of 0.001 centimeters (DZ_OF_ALPHA_1) // // 0.99999 = 1.0 - exp( -0.001 * MAX_DENSITY ) // exp( -0.001 * MAX_DENSITY ) = 1.0 - 0.99999 // -0.001 * MAX_DENSITY = log( 1.0 - 0.99999 ) // MAX_DENSITY = log( 1.0 - 0.99999 ) / -0.001 // MAX_DENSITY = 11512.925464974779 // static const double DENSITY_OF_ALPHA_1 = log( 1.0 - 0.99999 ) / -0.001; // static const double DENSITY_OF_VIZ_0 = DENSITY_OF_ALPHA_1; #define PXDU_DENSITY_OF_ALPHA_1 11512.92546497478 #define PXDU_DENSITY_OF_VIZ_0 11512.92546497478 //-***************************************************************************** // Just in case we need it. These are the constants used above. #define PXDU_MAX_NON_OPAQUE_ALPHA 0.99999 #define PXDU_MIN_NON_OPAQUE_VIZ 0.00001 #define PXDU_MIN_NON_TRANSPARENT_ALPHA 0.00001 #define PXDU_MAX_NON_TRANSPARENT_VIZ 0.99999 //-***************************************************************************** // Explained above in the "Depth" section of the comments. // static const double MIN_DEEP_DEPTH = 1.0e-4; // static const double MAX_DEEP_DEPTH = 1.0e30; #define PXDU_MIN_DEEP_DEPTH 1.0e-4 #define PXDU_MAX_DEEP_DEPTH 1.0e30 //-***************************************************************************** // A maximum depth change (dz) // static const double MAX_DZ = double( MAX_DEEP_DEPTH ) - // double( MIN_DEEP_DEPTH ); #define PXDU_MAX_DZ 1.0e30 //-***************************************************************************** // IEEE 754 floats can be incremented to the "next" positive float // in this manner, for positive float inputs. inline float IncrementPositiveFloat( float i_a, int32_t i_inc=1 ) { typedef union { int32_t i; float f; } intfloat; intfloat a; a.f = i_a; a.i += i_inc; return a.f; } //-***************************************************************************** // IEEE 754 floats can be decremented to the "previous" positive float // in this manner, for positive float inputs. inline float DecrementPositiveFloat( float i_a, int32_t i_inc=1 ) { typedef union { int32_t i; float f; } intfloat; intfloat a; a.f = i_a; a.i -= i_inc; return a.f; } //-***************************************************************************** // From: man isinf // isinf(x) returns 1 if x is positive infinity, and -1 if x is nega- // tive infinity. template inline bool IsInfinity( T i_f ) { return ( isinf( i_f ) == 1 ); } //-***************************************************************************** // A zero-nan functon, which actually zeros inf as well. template inline T ZeroNAN( T i_f ) { if ( !isfinite( i_f ) ) { return ( T )0; } else { return i_f; } } //-***************************************************************************** template inline T ClampDepth( T i_depth ) { if ( IsInfinity( i_depth ) ) { return PXDU_MAX_DEEP_DEPTH; } else { return Imath::clamp( i_depth, ( T )PXDU_MIN_DEEP_DEPTH, ( T )PXDU_MAX_DEEP_DEPTH ); } } //-***************************************************************************** template inline T ClampDz( T i_dz ) { return Imath::clamp( ZeroNAN( i_dz ), ( T )0, ( T )PXDU_MAX_DZ ); } //-***************************************************************************** template inline T ClampNonZeroDz( T i_dz ) { return Imath::clamp( ZeroNAN( i_dz ), ( T )PXDU_DZ_OF_ALPHA_1, ( T )PXDU_MAX_DZ ); } //-***************************************************************************** template inline T ClampAlpha( T i_alpha ) { return Imath::clamp( ZeroNAN( i_alpha ), ( T )0, ( T )1 ); } //-***************************************************************************** // "plausible" in this case means not completely transparent, nor // completely opaque. template inline T ClampPlausibleAlpha( T i_alpha ) { return Imath::clamp( ZeroNAN( i_alpha ), ( T )PXDU_MIN_NON_TRANSPARENT_ALPHA, ( T )PXDU_MAX_NON_OPAQUE_ALPHA ); } //-***************************************************************************** template inline double ClampViz( T i_viz ) { return Imath::clamp( ZeroNAN( i_viz ), ( T )0, ( T )1 ); } //-***************************************************************************** // "plausible" in this case means not completely transparent, nor // completely opaque. template inline T ClampPlausibleViz( T i_viz ) { return Imath::clamp( ZeroNAN( i_viz ), ( T )PXDU_MIN_NON_OPAQUE_VIZ, ( T )PXDU_MAX_NON_TRANSPARENT_VIZ ); } //-***************************************************************************** // Plausible density is clamped between min non-zero density // and density of alpha 1. template inline T ClampPlausibleDensity( T i_density ) { return Imath::clamp( ZeroNAN( i_density ), ( T )PXDU_MIN_NON_ZERO_DENSITY, ( T )PXDU_DENSITY_OF_ALPHA_1 ); } //-***************************************************************************** // Density/Viz/DZ calculations are always performed in double precision. // We try to leave them alone as much as possible, but the logarithm can get // weird for very very small numbers. The "isfinite" call basically rules // out NaN and Infinity results, though it doesn't bother with subnormal // numbers, since the error case we're worried about is log being too big. // viz = exp( -dz * density ) // log( viz ) = -dz * density // density = -log( viz ) / dz double DensityFromVizDz( double i_viz, double i_dz ); //-***************************************************************************** // We can often treat "density times dz" as a single quantity without // separating it. // viz = exp( -densityTimesDz ) // log( viz ) = -densityTimesDz // densityTimesDz = -log( viz ) double DensityTimesDzFromViz( double i_viz ); //-***************************************************************************** // Plausible density defined above. inline double PlausibleDensityFromVizDz( double i_viz, double i_dz ) { return ClampPlausibleDensity( DensityFromVizDz( i_viz, i_dz ) ); } //-***************************************************************************** // viz = exp( -dz * density ) // log( viz ) = -dz * density // dz = -log( viz ) / density // Note that this is basically the same as the computation above. double DzFromVizDensity( double i_viz, double i_density ); //-***************************************************************************** // viz = exp( -dz * density ) // valid for all finite numbers. // negative densities or dz's will give greater than 1 viz's, which will // get clamped! inline double VizFromDensityDz( double i_density, double i_dz ) { return ClampViz( exp( -ZeroNAN( i_density * i_dz ) ) ); } //-***************************************************************************** // same as above. inline double VizFromDensityTimesDz( double i_densityTimesDz ) { return ClampViz( exp( -ZeroNAN( i_densityTimesDz ) ) ); } //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** // IMF SPECIFIC STUFF //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** //-***************************************************************************** template Imf::PixelType ImfPixelType(); template <> inline Imf::PixelType ImfPixelType() { return Imf::HALF; } template <> inline Imf::PixelType ImfPixelType() { return Imf::FLOAT; } template <> inline Imf::PixelType ImfPixelType() { return Imf::UINT; } //-***************************************************************************** // Handy exception macro. #define PXDU_THROW( TEXT ) \ do \ { \ std::stringstream sstr; \ sstr << TEXT; \ std::runtime_error exc( sstr.str() ); \ throw( exc ); \ } \ while( 0 ) } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/PxFourChanDeepRgba.h000066400000000000000000000362171406177042200222670ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxFourChanDeepRgba_h_ #define _PxFourChanDeepRgba_h_ #include "PxDeepUtils.h" #include "PxBaseDeepHelper.h" namespace PxDeep { //-***************************************************************************** // FOUR CHANNEL DEEP RGBA CONTINUOUS //-***************************************************************************** template class FourChanDeepRgbaContinuous : public BaseDeepHelper,SpanRgba> { public: typedef BaseDeepHelper,SpanRgba> super_type; typedef FourChanDeepRgbaContinuous this_type; typedef typename super_type::span_type span_type; FourChanDeepRgbaContinuous( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,SpanRgba> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** // FOUR CHANNEL DEEP RGBA DISCRETE //-***************************************************************************** template class FourChanDeepRgbaDiscrete : public BaseDeepHelper,SpanRgba> { public: typedef BaseDeepHelper,SpanRgba> super_type; typedef FourChanDeepRgbaDiscrete this_type; typedef typename super_type::span_type span_type; FourChanDeepRgbaDiscrete( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,SpanRgba> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** template void FourChanDeepRgbaContinuous::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepAlphas // and their depths. Enforce the case that deepAlpha // is always between 0 and 1. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); double red = ZeroNAN( pts[0] ); double green = ZeroNAN( pts[1] ); double blue = ZeroNAN( pts[2] ); double alpha = ClampAlpha( pts[3] ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.out = z; spanJ.viz = ClampViz( 1.0 - alpha ); spanJ.index = j; // Only unpremult if the data is assumed to be premultiplied, // which is when the params say DON'T multiply color by alpha. if ( alpha > 0.0 && !(this->m_params).multiplyColorByAlpha ) { spanJ.rgb[0] = red / alpha; spanJ.rgb[1] = green / alpha; spanJ.rgb[2] = blue / alpha; } else { spanJ.rgb[0] = red; spanJ.rgb[1] = green; spanJ.rgb[2] = blue; } } // Sort the spans. std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths. double maxDensity = PXDU_MIN_NON_ZERO_DENSITY; { int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we must combine their // alphas and eliminate the depth. // We simply add their unpremultiplied color. spanActiveBegin.viz *= spanNext.viz; spanActiveBegin.rgb[0] += spanNext.rgb[0]; spanActiveBegin.rgb[1] += spanNext.rgb[1]; spanActiveBegin.rgb[2] += spanNext.rgb[2]; spanNext.in = FLT_MAX; spanNext.out = FLT_MAX; ++numRemoved; } } spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); // Accumulate density from here to the next point. if ( activeEnd < i_numPts ) { span_type& spanNext = (this->m_spans)[activeEnd]; double dz = spanNext.in - spanActiveBegin.in; assert( spanNext.in > spanActiveBegin.in ); assert( dz > 0.0 ); double density = DensityFromVizDz( spanActiveBegin.viz, dz ); maxDensity = std::max( maxDensity, density ); } activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Handle the single point case. if ( i_numPts == 1 ) { span_type& span0 = (this->m_spans)[0]; if ( (this->m_params).discardZeroAlphaSamples && span0.viz >= 1.0 ) { // Nothing! return; } span0.out = ClampDepth( IncrementPositiveFloat( span0.in ) ); double alpha = ClampAlpha( 1.0 - span0.viz ); // If the alpha is zero, and we're still here, it means // that the spans are either completely transparent and // the user has elected to keep them anyway, in which case // no multiplication by alpha is needed, or alternatively, // they're "glow" spans which have zero alpha but non-zero // color. Those glow spans were not unpremultiplied above, // and therefore do not need to be premultiplied here. // SO! If alpha is zero, we don't premultiply. if ( alpha > 0.0 ) { span0.rgb[0] *= alpha; span0.rgb[1] *= alpha; span0.rgb[2] *= alpha; } (this->m_deepOutPixel).push_back( span0.in, span0.out, span0.rgb[0], span0.rgb[1], span0.rgb[2], alpha ); return; } // Put the spans back out. // If the last point has a non-zero alpha, extrapolate the // maximum density to create an end point. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params).discardZeroAlphaSamples && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } if ( j < i_numPts-1 ) { spanJ.out = (this->m_spans)[j+1].in; } else { // This is the last point. // If it has non-zero alpha, it needs depth, // which we use the max density for. if ( spanJ.viz >= 1.0 ) { // Don't need to worry about this last span! // It is at the end of the continuous span, and // is completely transparent. continue; } double dz = DzFromVizDensity( spanJ.viz, maxDensity ); spanJ.out = ClampDepth( spanJ.in + dz ); if ( spanJ.out <= spanJ.in ) { spanJ.out = ClampDepth( IncrementPositiveFloat( spanJ.in ) ); } } double alpha = ClampAlpha( 1.0 - spanJ.viz ); // If the alpha is zero, and we're still here, it means // that the spans are either completely transparent and // the user has elected to keep them anyway, in which case // no multiplication by alpha is needed, or alternatively, // they're "glow" spans which have zero alpha but non-zero // color. Those glow spans were not unpremultiplied above, // and therefore do not need to be premultiplied here. // SO! If alpha is zero, we don't premultiply. if ( alpha > 0.0 ) { spanJ.rgb[0] *= alpha; spanJ.rgb[1] *= alpha; spanJ.rgb[2] *= alpha; } // Set the channels! (this->m_deepOutPixel).push_back( spanJ.in, spanJ.out, spanJ.rgb[0], spanJ.rgb[1], spanJ.rgb[2], alpha ); } } //-***************************************************************************** template void FourChanDeepRgbaDiscrete::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepAlphas // and their depths. Enforce the case that deepAlpha // is always between 0 and 1. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); double red = ZeroNAN( pts[0] ); double green = ZeroNAN( pts[1] ); double blue = ZeroNAN( pts[2] ); double alpha = ClampAlpha( pts[3] ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.out = z; spanJ.viz = ClampViz( 1.0 - alpha ); spanJ.index = j; // Only unpremult if the data is assumed to be premultiplied, // which is when the params say DON'T multiply color by alpha. if ( alpha > 0.0 && !(this->m_params).multiplyColorByAlpha ) { spanJ.rgb[0] = red / alpha; spanJ.rgb[1] = green / alpha; spanJ.rgb[2] = blue / alpha; } else { spanJ.rgb[0] = red; spanJ.rgb[1] = green; spanJ.rgb[2] = blue; } } // Sort the spans. std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths. { int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we must combine their // alphas and eliminate the depth. // We simply add their unpremultiplied color. spanActiveBegin.viz *= spanNext.viz; spanActiveBegin.rgb[0] += spanNext.rgb[0]; spanActiveBegin.rgb[1] += spanNext.rgb[1]; spanActiveBegin.rgb[2] += spanNext.rgb[2]; spanNext.in = FLT_MAX; spanNext.out = FLT_MAX; ++numRemoved; } } spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Put the spans back out. // If the last point has a non-zero alpha, extrapolate the // maximum density to create an end point. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params).discardZeroAlphaSamples && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } double alpha = ClampAlpha( 1.0 - spanJ.viz ); // If the alpha is zero, and we're still here, it means // that the spans are either completely transparent and // the user has elected to keep them anyway, in which case // no multiplication by alpha is needed, or alternatively, // they're "glow" spans which have zero alpha but non-zero // color. Those glow spans were not unpremultiplied above, // and therefore do not need to be premultiplied here. // SO! If alpha is zero, we don't premultiply. if ( alpha > 0.0 ) { spanJ.rgb[0] *= alpha; spanJ.rgb[1] *= alpha; spanJ.rgb[2] *= alpha; } // Set the channels! (this->m_deepOutPixel).push_back( spanJ.in, spanJ.rgb[0], spanJ.rgb[1], spanJ.rgb[2], alpha ); } } } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/PxOneChanDeepAlpha.h000066400000000000000000000256531406177042200222510ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxOneChanDeepAlpha_h_ #define _PxOneChanDeepAlpha_h_ #include "PxDeepUtils.h" #include "PxBaseDeepHelper.h" namespace PxDeep { //-***************************************************************************** // ONE CHANNEL DEEP ALPHA CONTINUOUS //-***************************************************************************** template class OneChanDeepAlphaContinuous : public BaseDeepHelper,Span> { public: typedef BaseDeepHelper,Span> super_type; typedef OneChanDeepAlphaContinuous this_type; typedef typename super_type::span_type span_type; OneChanDeepAlphaContinuous( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,Span> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** // ONE CHANNEL DEEP ALPHA DISCRETE //-***************************************************************************** template class OneChanDeepAlphaDiscrete : public BaseDeepHelper,Span> { public: typedef BaseDeepHelper,Span> super_type; typedef OneChanDeepAlphaDiscrete this_type; typedef typename super_type::span_type span_type; OneChanDeepAlphaDiscrete( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,Span> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** template void OneChanDeepAlphaContinuous::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepAlphas // and their depths. Enforce the case that deepAlpha // is always between 0 and 1. // Also, find a good "best slope" for extraplolation. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); double alpha = ClampAlpha( pts[0] ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.out = z; spanJ.viz = ClampViz( 1.0 - alpha ); spanJ.index = j; } // Sort the spans. std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths, gathering max density along // the way. double maxDensity = PXDU_MIN_NON_ZERO_DENSITY; { int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we must combine their // vizs and eliminate the depth. spanActiveBegin.viz *= spanNext.viz; spanNext.in = FLT_MAX; spanNext.out = FLT_MAX; ++numRemoved; } } spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); // Accumulate density from here to the next point. if ( activeEnd < i_numPts ) { span_type& spanNext = (this->m_spans)[activeEnd]; double dz = spanNext.in - spanActiveBegin.in; assert( spanNext.in > spanActiveBegin.in ); assert( dz > 0.0 ); double density = DensityFromVizDz( spanActiveBegin.viz, dz ); maxDensity = std::max( maxDensity, density ); } activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Handle the single point case. if ( i_numPts == 1 ) { span_type& span0 = (this->m_spans)[0]; if ( (this->m_params).discardZeroAlphaSamples && span0.viz >= 1.0 ) { // Nothing! return; } span0.out = ClampDepth( IncrementPositiveFloat( span0.in ) ); float alphaF = ClampAlpha( 1.0 - span0.viz ); (this->m_deepOutPixel).push_back( span0.in, span0.out, alphaF ); return; } // Put the spans back out. // If the last point has a non-zero alpha, extrapolate the // maximum density to create an end point. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params).discardZeroAlphaSamples && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } // Set the out points. if ( j < i_numPts-1 ) { spanJ.out = (this->m_spans)[j+1].in; } else { // This is the last point. // If it has non-zero alpha, it needs depth, // which we use the max density for. if ( spanJ.viz >= 1.0 ) { // Don't need to worry about this last span! // It is at the end of the continuous span, and // is completely transparent. continue; } double dz = DzFromVizDensity( spanJ.viz, maxDensity ); spanJ.out = ClampDepth( spanJ.in + dz ); if ( spanJ.out <= spanJ.in ) { spanJ.out = ClampDepth( IncrementPositiveFloat( spanJ.in ) ); } } float alphaF = ClampAlpha( 1.0 - spanJ.viz ); (this->m_deepOutPixel).push_back( spanJ.in, spanJ.out, alphaF ); } } //-***************************************************************************** template void OneChanDeepAlphaDiscrete::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepAlphas // and their depths. Enforce the case that deepAlpha // is always between 0 and 1. // Also, find a good "best slope" for extraplolation. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); double alpha = ClampAlpha( pts[0] ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.viz = ClampViz( 1.0 - alpha ); spanJ.index = j; } // Sort the spans. std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths. { int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we must combine their // alphas and eliminate the depth. spanActiveBegin.viz *= spanNext.viz; spanNext.in = FLT_MAX; ++numRemoved; } } spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Put the spans back out. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params).discardZeroAlphaSamples && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } float alphaF = ClampAlpha( 1.0 - spanJ.viz ); // Set the channels! (this->m_deepOutPixel).push_back( spanJ.in, alphaF ); } } } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/PxOneChanDeepOpacity.h000066400000000000000000000356561406177042200226400ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifndef _PxOneChanDeepOpacity_h_ #define _PxOneChanDeepOpacity_h_ #include "PxDeepUtils.h" #include "PxBaseDeepHelper.h" namespace PxDeep { //-***************************************************************************** // ONE CHANNEL DEEP OPACITY CONTINUOUS //-***************************************************************************** template class OneChanDeepOpacityContinuous : public BaseDeepHelper,SpanOpac> { public: typedef BaseDeepHelper,SpanOpac> super_type; typedef OneChanDeepOpacityContinuous this_type; typedef typename super_type::span_type span_type; OneChanDeepOpacityContinuous( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,SpanOpac> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** // ONE CHANNEL DEEP OPACITY DISCRETE //-***************************************************************************** template class OneChanDeepOpacityDiscrete : public BaseDeepHelper,SpanOpac> { public: typedef BaseDeepHelper,SpanOpac> super_type; typedef OneChanDeepOpacityDiscrete this_type; typedef typename super_type::span_type span_type; OneChanDeepOpacityDiscrete( DtexFile* i_dtexFile, int i_numDtexChans, const Parameters& i_params ) : BaseDeepHelper,SpanOpac> ( i_dtexFile, i_numDtexChans, i_params ) {} void processDeepPixel( int i_numPts ); }; //-***************************************************************************** template void OneChanDeepOpacityContinuous::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepOpacities and // depths. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.out = z; // Data stored in dtex files for "deepopacity" is actually // "deeptransmission", monotonically decreasing from an initial // value of 1.0. We just convert it to viz directly. // (viz == transmissivity) spanJ.deepViz = ClampViz( pts[0] ); spanJ.index = j; } // Sort the spans by depth (and then index) std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths, accumulating maximum density // along the way. Because we have deep opacity, // coincident samples use the maximum deepOpacity value. double maxDensity = PXDU_MIN_NON_ZERO_DENSITY; { int prevSpanIndex = 0; int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); // This loop combines all the coincident samples // into a single sample, invalidates the other coincident // samples, and sets activeEnd to point to the next // sample with a larger depth. activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we use whichever one has the // largest deep opacity, which equates to the // smallest deep viz. spanActiveBegin.deepViz = std::min( spanActiveBegin.deepViz, spanNext.deepViz ); spanNext.in = FLT_MAX; spanNext.out = FLT_MAX; ++numRemoved; } } // Okay, the deep vizibility at our in point // is equal to the total vizibility before us, // which is the deep vizibility at the previous point, // times the vizibility of this point. // deepViz = deepVizPrev * viz // viz = deepViz / deepVizPrev; if ( activeBegin == 0 ) { spanActiveBegin.viz = spanActiveBegin.deepViz; } else { span_type& spanPrev = (this->m_spans)[prevSpanIndex]; // Make sure the deep visibilities are // monotonically decreasing with depth. spanActiveBegin.deepViz = std::min( spanActiveBegin.deepViz, spanPrev.deepViz ); if ( spanPrev.deepViz > 0.0 ) { // If we have non-zero accumulated visibility, // we can compute the span visibility. spanActiveBegin.viz = spanActiveBegin.deepViz / spanPrev.deepViz; } else { // If we have zero accumulated visibility, // then the span visibility is also zero. spanActiveBegin.viz = 0.0; } // Use the viz of this span to update the // max density. spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); spanActiveBegin.in = spanPrev.out; double dz = spanActiveBegin.out - spanActiveBegin.in; assert( dz > 0.0 ); assert( spanActiveBegin.out > spanActiveBegin.in ); double density = DensityFromVizDz( spanActiveBegin.viz, dz ); maxDensity = std::max( maxDensity, density ); } prevSpanIndex = activeBegin; activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Handle the single point case. if ( i_numPts == 1 ) { span_type& span0 = (this->m_spans)[0]; if ( (this->m_params).discardZeroAlphaSamples && span0.viz >= 1.0 ) { // Nothing! return; } span0.in = ClampDepth( DecrementPositiveFloat( span0.out ) ); float alphaF = ClampAlpha( 1.0 - span0.viz ); (this->m_deepOutPixel).push_back( span0.in, span0.out, alphaF ); return; } // Put the spans back out. // If the first point has a non-zero alpha, extrapolate the // maximum density to create a begin point. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params.discardZeroAlphaSamples) && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } if ( j == 0 ) { // This is first point. // If it has non-zero alpha, it needs depth, // which we use the max density for. if ( spanJ.viz >= 1.0 ) { // Don't need to worry about this last span! // It is at the end of the continuous span, and // is completely transparent. continue; } double dz = DzFromVizDensity( spanJ.viz, maxDensity ); spanJ.in = ClampDepth( spanJ.out - dz ); if ( spanJ.out <= spanJ.in ) { spanJ.in = ClampDepth( DecrementPositiveFloat( spanJ.out ) ); } } float alphaF = ClampAlpha( 1.0 - spanJ.viz ); // Set the channels! (this->m_deepOutPixel).push_back( spanJ.in, spanJ.out, alphaF ); } } //-***************************************************************************** template void OneChanDeepOpacityDiscrete::processDeepPixel( int i_numPts ) { assert( i_numPts > 0 ); // Loop over all the dtex points and get their deepOpacities and // depths. (this->m_spans).resize( ( size_t )i_numPts ); for ( int j = 0; j < i_numPts; ++j ) { float z; float pts[4]; DtexPixelGetPoint( (this->m_pixel), j, &z, ( float * )pts ); z = ClampDepth( z ); span_type& spanJ = (this->m_spans)[j]; spanJ.clear(); spanJ.in = z; spanJ.out = z; // Data stored in dtex files for "deepopacity" is actually // "deeptransmission", monotonically decreasing from an initial // value of 1.0. We just convert it to viz directly. // (viz == transmissivity) spanJ.deepViz = ClampViz( pts[0] ); spanJ.index = j; } // Sort the spans. std::sort( (this->m_spans).begin(), (this->m_spans).end() ); // Combine identical depths. Because we have deep opacity, // coincident samples use the maximum deepOpacity value. { int prevSpanIndex = 0; int activeBegin = 0; int activeEnd = 0; float interestingDepth = 0.0f; int numRemoved = 0; while ( activeBegin < i_numPts ) { span_type& spanActiveBegin = (this->m_spans)[activeBegin]; float nextInterestingDepth = spanActiveBegin.in; assert( nextInterestingDepth > interestingDepth ); // This loop combines all the coincident samples // into a single sample, invalidates the other coincident // samples, and sets activeEnd to point to the next // sample with a larger depth. activeEnd = i_numPts; for ( int a = activeBegin + 1; a < i_numPts; ++a ) { span_type& spanNext = (this->m_spans)[a]; assert( spanNext.in > interestingDepth ); assert( spanNext.in >= nextInterestingDepth ); if ( spanNext.in > nextInterestingDepth ) { // This span is not active in this round, // set activeEnd and get out. activeEnd = a; break; } else { // This span has an identical depth to // the previous one, so we use whichever one has the // largest deep opacity, which equates to the // smallest deep viz. spanActiveBegin.deepViz = std::min( spanActiveBegin.deepViz, spanNext.deepViz ); spanNext.in = FLT_MAX; spanNext.out = FLT_MAX; ++numRemoved; } } // Okay, the deep vizibility at our in point // is equal to the total vizibility before us, // which is the deep vizibility at the previous point, // times the vizibility of this point. // deepViz = deepVizPrev * viz // viz = deepViz / deepVizPrev; if ( activeBegin == 0 ) { spanActiveBegin.viz = spanActiveBegin.deepViz; } else { span_type& spanPrev = (this->m_spans)[prevSpanIndex]; // Make sure the deep visibilities are // monotonically decreasing with depth. spanActiveBegin.deepViz = std::min( spanActiveBegin.deepViz, spanPrev.deepViz ); if ( spanPrev.deepViz > 0.0 ) { // If we have non-zero accumulated visibility, // we can compute the span visibility. spanActiveBegin.viz = spanActiveBegin.deepViz / spanPrev.deepViz; } else { // If we have zero accumulated visibility, // then the span visibility is also zero. spanActiveBegin.viz = 0.0; } // Clean up the viz! spanActiveBegin.viz = ClampViz( spanActiveBegin.viz ); } prevSpanIndex = activeBegin; activeBegin = activeEnd; interestingDepth = nextInterestingDepth; } // If any removed, re-sort the list and remove the end // points. if ( numRemoved > 0 ) { assert( numRemoved < i_numPts ); std::sort( (this->m_spans).begin(), (this->m_spans).end() ); i_numPts -= numRemoved; (this->m_spans).resize( i_numPts ); } } // Put the spans back out. for ( int j = 0; j < i_numPts; ++j ) { span_type& spanJ = (this->m_spans)[j]; if ( (this->m_params).discardZeroAlphaSamples && spanJ.viz >= 1.0 ) { // This span is transparent, ignore it. continue; } float alphaF = ClampAlpha( 1.0 - spanJ.viz ); (this->m_deepOutPixel).push_back( spanJ.in, alphaF ); } } } // End namespace PxDeep #endif openexr-2.5.7/Contrib/DtexToExr/README000066400000000000000000000102021406177042200173510ustar00rootroot00000000000000//-***************************************************************************** Pixar's Dtex to Exr conversion utility Aug 1, 2012 - first checkin to OpenEXR 2.0 branch of OpenEXR git repository. This utility converts a DTEX deep shadow file to an OpenEXR 2.0 deep exr file, formerly, ".odz" (or .dexr, or whatever extension your facility may use). As of the first checkin, the utility only supports 1, 3, or 4-channel dtex files, corresponding to deep alpha or deep RGBA only. The Nuke DTEX reader, which uses basically the same code, will support a more complete arbitrary channel set, and this utility may be upgraded as well. We also only support a single view for the time being. DTEX has a complicated set of interpretations, which represent six separate code paths for conversion to the deep representation in OpenEXR 2.0. They represent the permutations of these exemplary Display Driver config strings to prman: Display "+filename.dtex" "deepshad" "deepopacity" "string volumeinterpretation" "continuous" Display "+filename.dtex" "deepshad" "deepopacity" "string volumeinterpretation" "discrete" Display "+filename.dtex" "deepshad" "a" "string volumeinterpretation" "continuous" Display "+filename.dtex" "deepshad" "a" "string volumeinterpretation" "discrete" Display "+filename.dtex" "deepshad" "rgba" "string volumeinterpretation" "continuous" Display "+filename.dtex" "deepshad" "rgba" "string volumeinterpretation" "discrete" In our terminology, these six options are called: OneChanDeepOpacityContinuous OneChanDeepOpacityDiscrete OneChanDeepAlphaContinuous OneChanDeepAlphaDiscrete FourChanDeepRgbaContinuous FourChanDeepRgbaDiscrete Renderman will write out both 1-channel and 3-channel opacity in the "deepopacity" case, which we currently only use the first channel of, as we are only targeting a single opacity curve in space. This may evolve in the future. There are weird gotchas for each of these 6 cases, and they are documented in the PxDeepUtils.h file, along with specific comments in each of the six header files that correspond to each case: PxOneChanDeepOpacityContinuous.h PxOneChanDeepOpacityDiscrete.h PxOneChanDeepAlphaContinuous.h PxOneChanDeepAlphaDiscrete.h PxFourChanDeepRgbaContinuous.h PxFourChanDeepRgbaDiscrete.h The gotchas relate to several issues, mostly to do with coincident or out-of-order samples, precision issues, compression artifacts, and the differences between the "deepopacity" vs "deepalpha" interpretations. With "deepopacity" (the pre-prman 16 usage), opacity values stored in dtex files were accumulated, so they were bounded between 0 and 1. The values stored are actually not opacities, but rather transmissivities (1-opacity), and monotonically decreased from fully transparent (1) to fully opaque (0). This representation is ideal for meaningful error minimization during compression, and also for usage as a shadow map by a renderer, because the extinction at a particular depth, at a particular pixel, can be evaluated with a single look-up. However, this representation is poor for deep compositing, because each of the samples includes data from smaller depth samples, and recombination is difficult. With these types of files, when using volumetric (continuous) interpretation, the samples represent the accumulated transmissivity at the NEAR SIDE of a depth span, and our code paths take this into account. With all other usages - "a" and "rgba", the values represent filtered samples of the given field at that point in space. The alpha values will be between 0 and 1, but are not guaranteed to be increasing or decreasing. This presents a strange problem for volumetric interpretation, as what does it mean to describe the alpha of an infintesimally small region of space (point sample). The best interpretation of the data in this case uses the alpha to represent the accumulated opacity of the region of space nearer than the sample, and thus each sample represents the FAR SIDE of a depth span. Our code paths take this into account as well. Please see the files for additional comments, and the command "dtexToExr" may be run with -h, --h, --help, or no arguments to print its usage. -Christopher Horvath, Aug 2012, Pixar openexr-2.5.7/Contrib/DtexToExr/bootstrap000077500000000000000000000027411406177042200204450ustar00rootroot00000000000000#! /bin/sh # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # If we're on OS X, use glibtoolize instead of toolize HOSTTYPE=`uname` if [ "$HOSTTYPE" == "Darwin" ]; then LIBTOOLIZE=glibtoolize else LIBTOOLIZE=libtoolize fi # Check Autoconf version if [ -x `which autoconf` ]; then AC_VER=`autoconf --version | head -n 1 | sed 's/^[^0-9]*//'` AC_VER_MAJOR=`echo $AC_VER | cut -f1 -d'.'` AC_VER_MINOR=`echo $AC_VER | cut -f2 -d'.' | sed 's/[^0-9]*$//'` if [ "$AC_VER_MAJOR" -lt "2" ]; then echo "Autoconf 2.13 or greater needed to build configure." exit 1 fi if [ "$AC_VER_MINOR" -lt "13" ]; then echo "Autoconf 2.13 or greater needed to build configure." exit 1 fi if [ "$AC_VER_MINOR" -lt "50" ]; then if [ ! -e configure.in ]; then ln -s configure.ac configure.in fi echo "If you see some warnings about cross-compiling, don't worry; this is normal." else rm -f configure.in fi else echo autoconf not found. DtexToExr requires autoconf to bootstrap itself. exit 1 fi run_cmd() { echo running $* ... if ! $*; then echo failed! exit 1 fi } # Check if /usr/local/share/aclocal exists if [ -d /usr/local/share/aclocal ]; then ACLOCAL_INCLUDE="$ACLOCAL_INCLUDE -I /usr/local/share/aclocal" fi run_cmd aclocal -I m4 $ACLOCAL_INCLUDE run_cmd $LIBTOOLIZE --automake --copy run_cmd automake --add-missing --copy --foreign run_cmd autoconf echo echo "Now type './configure' to configure DtexToExr." echo openexr-2.5.7/Contrib/DtexToExr/configure.ac000066400000000000000000000123331406177042200207660ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl dnl Process this file with autoconf to produce a configure script. AC_INIT(DtexToExr, 1.0.0) AC_SUBST(DTEXTOEXR_VERSION, 1.0.0) AC_CANONICAL_HOST AC_CONFIG_SRCDIR(DtexToExr.cpp) AM_INIT_AUTOMAKE(1.6.3) dnl Require automake 1.6.3 or better AM_MAINTAINER_MODE LIBTOOL_CURRENT=6 LIBTOOL_REVISION=0 LIBTOOL_AGE=0 LIBTOOL_VERSION=$LIBTOOL_CURRENT:$LIBTOOL_REVISION:$LIBTOOL_AGE AC_SUBST(LIBTOOL_VERSION) dnl Checks for programs. AC_PROG_CXX AC_PROG_INSTALL AC_PROG_CC AC_PROG_LN_S AC_PROG_LIBTOOL AC_PROG_MAKE_SET dnl dnl PKGCONFIG preparations dnl if test -z "${PKG_CONFIG_PATH}"; then PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig fi export PKG_CONFIG_PATH LIB64_IF_EXISTS="" if [[ -e /usr/lib64 ]]; then LIB64_IF_EXISTS="-L/usr/lib64" fi dnl dnl get ccflags and libs from openexr and prmansdk packages dnl dnl dnl get ccflags and libs from other packages in use and check dnl whether test programs compile. dnl OpenEXR is required. IlmBase is required. dnl dnl dnl check openexr dnl AM_PATH_PKGCONFIG( [OPENEXR_CXXFLAGS], [OPENEXR_LDFLAGS], [OPENEXR_LIBS], [OpenEXR], [OpenEXR], [$LIB64_IF_EXISTS -L/usr/local/lib], [-lIlmImf -lImath -lIex -lHalf -lz -lpthread], [openexr-prefix]) PRMANSDK_CXXFLAGS="" PRMANSDK_LDFLAGS="" PRMANSDK_LIBS="" PRMANSDK_LIBNAME="prman" AC_ARG_WITH( [prmansdk-include-dir], [AS_HELP_STRING([--with-prmansdk-include-dir], [prman sdk include directory])], [PRMANSDK_CXXFLAGS="-I$withval"]) AC_ARG_WITH( [prmansdk-lib-dir], [AS_HELP_STRING([--with-prmansdk-lib-dir], [prman sdk library directory])], [PRMANSDK_LDFLAGS="-L$withval -Wl,-rpath $withval"]) AC_ARG_WITH( [prmansdk-libname], [AS_HELP_STRING([--with-prmansdk-libname], [prman sdk library name (default:prman)])], [PRMANSDK_LIBNAME="$withval"]) PRMANSDK_LIBS="-l$PRMANSDK_LIBNAME" export PRMANSDK_CXXFLAGS export PRMANSDK_LDFLAGS export PRMANSDK_LIBS export PRMANSDK_LIBNAME AC_SUBST([PRMANSDK_CXXFLAGS]) AC_SUBST([PRMANSDK_LDFLAGS]) AC_SUBST([PRMANSDK_LIBS]) AC_SUBST([PRMANSDK_LIBNAME]) CXXFLAGS="$CXXFLAGS $PRMANSDK_CXXFLAGS $OPENEXR_CXXFLAGS" LDFLAGS="$LDFLAGS $PRMANSDK_LDFLAGS $OPENEXR_LDFLAGS" dnl dnl OpenEXR test program dnl AM_COMPILELINKRUN( [OpenEXR], [openexrtest], [$OPENEXR_CXXFLAGS], [$OPENEXR_LDFLAGS], [$OPENEXR_LIBS],[[ #include #include #include ]], [[OPENEXR_IMF_NAMESPACE::isOpenExrFile("notExist");]], AC_MSG_RESULT([Compiled and ran OpenEXR test program.]), AC_MSG_ERROR([Could not compile OpenEXR test program.])) dnl dnl Dtex test program dnl AM_COMPILELINKRUN( [PrmanSDK], [prmansdktest], [$PRMANSDK_CXXFLAGS], [$PRMANSDK_LDFLAGS], [$PRMANSDK_LIBS], [[ #include #include #include ]], [[ DtexCache* dtexCache = DtexCreateCache( 10000, NULL ); if ( dtexCache ) { DtexDestroyCache( dtexCache ); } ]], AC_MSG_RESULT([Compiled and ran PrmanSDK test program.]), AC_MSG_ERROR([Could not compile PrmanSDK test program.])) dnl dnl if some autoconf expert knows how to get the actual prefix used, please dnl tell us. Until then... dnl if test "x$prefix" != "xNONE"; then ACTUAL_PREFIX=$prefix else ACTUAL_PREFIX=/usr/local fi dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(limits.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T dnl gcc optimization AC_MSG_CHECKING(for gcc optimization flags) old_cflags=$CFLAGS CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE([#include ], [ printf ("hello, world"); ], [ EXTRA_OPT_CFLAGS="-pipe"],[ EXTRA_OPT_CFLAGS=""]) CFLAGS=$old_cflags AC_MSG_RESULT([$EXTRA_OPT_CFLAGS]) dnl Platform-specific stuff case "$host" in *darwin*) AC_DEFINE(HAVE_DARWIN) dnl OS X universal binary support, requires --disable-dependency-tracking AC_ARG_ENABLE(osx-universal-binaries, AC_HELP_STRING([--enable-osx-universal-binaries], [build universal binaries on OS X [[default=no]]]), [build_osxuniversal="${enableval}"], [build_osxuniversal=no]) if test "${build_osxuniversal}" != no ; then if test "$enable_dependency_tracking" != no ; then AC_MSG_ERROR([--enable-osx-universal-binary requires --disable-dependency-tracking. Please re-run configure with these options: --disable-dependency-tracking --enable-osx-universal-binary ]) fi CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" dnl LDFLAGS="$LDFLAGS -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" fi CXXFLAGS="$CXXFLAGS" ;; esac AM_CFLAGS="$EXTRA_OPT_CFLAGS" AM_CXXFLAGS="$EXTRA_OPT_CFLAGS" AC_SUBST(AM_CFLAGS) AC_SUBST(AM_CXXFLAGS) AC_OUTPUT([ Makefile ]) if test "x$build_osxuniversal" = xyes; then AC_MSG_RESULT([ --------------------------------------------- Summary for DtexToExr features: build OS X universal binaries $build_osxuniversal --------------------------------------------- ]) else AC_MSG_RESULT([ --------------------------------------------- Summary for DtexToExr features: --------------------------------------------- ]) fi openexr-2.5.7/Contrib/DtexToExr/m4/000077500000000000000000000000001406177042200170165ustar00rootroot00000000000000openexr-2.5.7/Contrib/DtexToExr/m4/compilelinkrun.m4000066400000000000000000000135421406177042200223200ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl dnl dnl dnl compilelinkrun.m4 - used to check whether a required package is properly dnl installed. Compiles, links and runs a c++ test program that uses the dnl package to verify that the package is properly installed dnl dnl Expected arguments: dnl $1: the name of the package we are testing, e.g. "OpenEXR" dnl used for informational messages, warnings & errors dnl dnl $2: the argument passed to configure specifying how to disable this test dnl for example: dnl $3 = "openexrtest" and dnl "configure --disable-openexrtest" will skip the test dnl dnl $3: CXXFLAGS used by the test dnl dnl $4: LDFLAGS used by the test dnl dnl $5: include section of sourcecode for a c++ test program dnl $6: body section of sourcecode for a c++ test program dnl The test program should make use of a library that is supposed to dnl be tested. dnl dnl $7: the action to be perfomed if the test succeeds dnl (e.g. AC_MSG_RESULT("OpenEXR test program succeeded")) dnl dnl $8 the action to be perfomed if the test fails dnl (e.g. AC_MSG_ERROR("OpenEXR test program failed")) dnl AC_DEFUN([AM_COMPILELINKRUN], [ dnl create some local m4 "variables" so that we don't have to use numbers define([arg_pkg_name],$1) define([arg_disable],$2) define([arg_cxxflags],$3) define([arg_ldflags],$4) define([arg_libs],$5) define([arg_include_source],$6) define([arg_body_source],$7) define([arg_do_yes],$8) define([arg_do_no],$9) dnl check arguments AC_ARG_ENABLE(arg_disable, [ --disable-arg_disable Do not try to compile and run a test arg_pkg_name program],, enable_programtest=yes) dnl dnl if the test hasn't been disabled, then compile, link and run test program dnl if test "x$enable_programtest" = "xyes" ; then dnl basic preliminary checks AC_MSG_CHECKING(for arg_pkg_name) test_runs="yes" dnl save settings and setup c++ before we start ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LDFLAGS="$LDFLAGS" ac_save_LIBS="$LIBS" CXXFLAGS="$CXXFLAGS arg_cxxflags" LDFLAGS="$LDFLAGS arg_ldflags" LIBS="$LIBS arg_libs" AC_REQUIRE_CPP() AC_LANG_PUSH([C++]) rm -f conf.testprogram dnl dnl first try a complete test - compile, link run dnl AC_RUN_IFELSE([AC_LANG_PROGRAM(arg_include_source, arg_body_source; [[system("touch conf.testprogram"); ]])], test_runs=yes, test_runs=no, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) if test "x$test_runs" = "xyes" || test -f conf.testprogram ; then AC_MSG_RESULT(yes) ifelse([arg_do_yes], , :, [arg_do_yes]) else AC_MSG_RESULT(no) echo "*** Could not run the arg_pkg_name test program, checking why..." test_compiles="yes" test_links="yes" dnl dnl if the program did not run, attempt to compile only dnl AC_COMPILE_IFELSE([AC_LANG_PROGRAM(arg_include_source, arg_body_source ; )], test_compiles=yes, test_compiles=no) if test "x$test_compiles" = "xno" ; then echo "*** The test program could not be compiled. Is arg_pkg_name installed?" echo "*** Check that the cflags (below) includes the arg_pkg_name include directory" else dnl dnl if the program did compile, try linking dnl AC_LINK_IFELSE([AC_LANG_PROGRAM(arg_include_source, arg_body_source ; )], test_links=yes, test_links=no) if test "x$test_links" = "xyes"; then echo "*** The test program compiled and staticly linked, but did not run. This " echo "*** usually means that the run-time linker is not finding arg_pkg_name or finding" echo "*** the wrong version of arg_pkg_name." echo "***" echo "*** If the linker is not finding arg_pkg_name, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system." else echo "*** The arg_pkg_name test program could be compiled, but could not be dynamically." echo "*** or statically linked." echo "***" echo "*** Make sure the LDFLAGS points to the location of the arg_pkg_name library." echo "*** (e.g. -L/usr/local/lib)." echo "*** If the run-time linker is not finding arg_pkg_name, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system." fi fi dnl dnl The test failed for some reason. Print out more info, dnl unset flags and signal an error. dnl echo "***" echo "*** Flags used by the test:" echo "*** cflags: $CXXFLAGS " echo "*** ldflags: $LDFLAGS" echo "***" echo "*** You can also run configure with --disable-arg_disable to skip this test." ifelse([arg_do_no], , :, [arg_do_no]) fi AC_LANG_POP([C++]) CXXFLAGS="$ac_save_CXXFLAGS" LDFLAGS="$ac_save_LDFLAGS" LIBS="$ac_save_LIBS" dnl dnl clean up dnl rm -f conf.testprogram fi dnl clean up local "variables" undefine([arg_pkg_name]) undefine([arg_disable]) undefine([arg_cxxflags]) undefine([arg_ldflags]) undefine([arg_libs]) undefine([arg_include_source]) undefine([arg_body_source]) undefine([arg_do_yes]) undefine([arg_do_no]) ]) openexr-2.5.7/Contrib/DtexToExr/m4/path.pkgconfig.m4000066400000000000000000000103771406177042200221720ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl AC_DEFUN([AM_PATH_PKGCONFIG], [ dnl sets cflags and ldflags dnl TEST_CXXFLAGS and TEST_LDFLAGS, by trying thes following dnl until something works: dnl dnl 1 - try the test_prefix dnl 2 - check whether pkgconfig can find values (unless --with-pkg-config=no) dnl 3 - use the prefix, if it is not the default dnl 4 - use defaults, /usr/local/include/OpenEXR and /usr/local/lib dnl dnl dnl Expected arguments dnl $1: arg_cxxflags - CXXFLAGS variable to set dnl dnl $2: arg-ldflags - LDFLAGS variable to set dnl dnl $3: package name (the package being checked), as requried by pkg-config dnl dnl $4: arg_include_subdir dnl the name of the subdirectory name that is tacked on to dnl the end of the include path e.g. "OpenEXR" in dnl /usr/local/include/OpenEXR dnl dnl $5: arg_default_libs - default libraries, used if pkgconfig doesnt work dnl dnl $6: arg_test_prefix dnl the argument passed to configure specifying a directory to dnl be used in the CXX and LD flags for example: dnl $2 = "openexr-prefix" and dnl "configure --openexr-prefix=/usr/lib" dnl leads to CXX including "-I/usr/lib/OpenEXR" dnl dnl create some local m4 "variables" so that we don't have to use numbers define([arg_cxxflags],$1) define([arg_ldflags],$2) define([arg_libs],$3) define([arg_pkg_name],$4) define([arg_include_subdir],$5) define([arg_default_ldflags],$6) define([arg_default_libs],$7) define([arg_test_prefix],$8) TEST_CXXFLAGS="" TEST_LDFLAGS="" TEST_LIBS="" AC_ARG_WITH(arg_test_prefix,[ --with-arg_test_prefix=PFX Prefix where tested libraries are supposed to be installed (optional)], test_prefix="$withval", test_prefix="NONE") echo "test_prefix = $test_prefix" AC_ARG_VAR(PKG_CONFIG, Path to pkg-config command) AC_PATH_PROG(PKG_CONFIG, pkg-config, no) AC_ARG_WITH(pkg-config,[ --with-pkg-config=PATH Specify which pkg-config to use (optional)], PKG_CONFIG="$withval",) if test "x$test_prefix" != "xNONE" ; then echo "using arg_test_prefix to set arg_cxxflags, arg_ldflags and arg_libs:" for inc_dir in arg_include_subdir do TEST_CXXFLAGS="$TEST_CXXFLAGS -I$test_prefix/include/$inc_dir" done TEST_LDFLAGS="-L$test_prefix/lib" TEST_LDFLAGS="$TEST_LDFLAGS arg_default_ldflags" TEST_LIBS="arg_default_libs" else dnl dnl Get the cflags and libraries from the arg_pkg_name package using dnl pkg-config dnl dnl Note: the TEST_LIBS contains both the -L and the -l flags. This means dnl the -L flags will appear twice on the command line, but we can not dnl limit it to --libs-only-l because it may include the "-pthread" flag. dnl if test x$PKG_CONFIG != xno ; then echo "using pkg-config to set arg_cxxflags and arg_ldflags:" TEST_CXXFLAGS="`$PKG_CONFIG --cflags arg_pkg_name`" TEST_LDFLAGS="`$PKG_CONFIG --libs-only-L arg_pkg_name`" TEST_LIBS="`$PKG_CONFIG --libs arg_pkg_name`" else echo "Not using pkg-config." TEST_CXXFLAGS="" TEST_LDFLAGS="" TEST_LIBS="" fi dnl dnl if the flags are still not set, try a prefix and finally a default dnl if test -z "${TEST_CXXFLAGS}"; then TEST_CXXFLAGS="" if test "x$prefix" != "xNONE"; then echo "using prefix to set arg_cxxflags and arg_ldflags:" for inc_dir in arg_include_subdir do TEST_CXXFLAGS="$TEST_CXXFLAGS -I$prefix/include/$inc_dir" done TEST_LDFLAGS="-L$prefix/lib" else echo "using default as guess for arg_cxxflags and arg_ldflags:" for inc_dir in arg_include_subdir do TEST_CXXFLAGS="$TEST_CXXFLAGS -I/usr/local/include/$inc_dir" done TEST_LDFLAGS="arg_default_ldflags" fi TEST_LIBS="arg_default_libs" fi fi echo " arg_cxxflags = $TEST_CXXFLAGS" echo " arg_ldflags = $TEST_LDFLAGS" echo " arg_libs = $TEST_LIBS" AC_SUBST(arg_cxxflags, $TEST_CXXFLAGS) AC_SUBST(arg_ldflags, $TEST_LDFLAGS) AC_SUBST(arg_libs, $TEST_LIBS) dnl clean up local "variables" undefine([arg_cxxflags]) undefine([arg_ldflags]) undefine([arg_libs]) undefine([arg_pkg_name]) undefine([arg_include_subdir]) undefine([arg_default_ldflags]) undefine([arg_default_libs]) undefine([arg_test_prefix]) ]) openexr-2.5.7/Contrib/DtexToExr/m4/threads.m4000066400000000000000000000245521406177042200207220ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl Modified by Wojciech Jarosz (2005) to include check for POSIX dnl semaphore usability. Defines HAVE_POSIX_SEMAPHORES if found. dnl dnl This macro figures out how to build C programs using POSIX threads. dnl It sets the PTHREAD_LIBS output variable to the threads library and dnl linker flags, and the PTHREAD_CFLAGS output variable to any special dnl C compiler flags that are needed. (The user can also force certain dnl compiler flags/libs to be tested by setting these environment dnl variables.) dnl dnl Also sets PTHREAD_CC to any special C compiler that is needed for dnl multi-threaded programs (defaults to the value of CC otherwise). dnl (This is necessary on AIX to use the special cc_r compiler alias.) dnl dnl NOTE: You are assumed to not only compile your program with these dnl flags, but also link it with them as well. e.g. you should link dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS dnl $LIBS dnl dnl If you are only building threads programs, you may wish to use dnl these variables in your default LIBS, CFLAGS, and CC: dnl dnl LIBS="$PTHREAD_LIBS $LIBS" dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl CC="$PTHREAD_CC" dnl dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a threads dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the dnl default action will define HAVE_PTHREAD. dnl dnl Please let the authors know if this macro fails on any platform, or dnl if you have any other suggestions or comments. This macro was based dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. dnl We are also grateful for the helpful feedback of numerous users. dnl dnl @category InstalledPackages dnl @author Steven G. Johnson dnl @version 2005-01-14 dnl @license GPLWithACException AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthread or # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" PTHREAD_LIBS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD dnl dnl Posix Semaphore support dnl AC_DEFUN([AM_POSIX_SEM], [ AC_ARG_ENABLE([posix-sem], AC_HELP_STRING([--disable-posix-sem], [do not attempt to use POSIX unnamed semaphores])) am_posix_sem_ok=no if test "${enable_posix_sem:-yes}" != "no"; then AC_CHECK_HEADERS([semaphore.h], [ AC_SEARCH_LIBS(sem_init, [posix4 pthread], [ AC_MSG_CHECKING([whether to use POSIX unnamed semaphores]) AC_RUN_IFELSE([ AC_LANG_PROGRAM([#include ], [ sem_t mysem; if (sem_init (&mysem, 1, 1) == 0) { if (sem_wait (&mysem) == 0) { sem_post (&mysem); sem_destroy (&mysem); return 0; } } return 1; ]) ], [ AC_MSG_RESULT([yes]) am_posix_sem_ok=yes], [ AC_MSG_RESULT([no (pshared not usable)])], [ AC_MSG_RESULT([no (cannot check usability when cross compiling)])]) ]) ]) fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$am_posix_sem_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_POSIX_SEMAPHORES),[$1]) : else am_posix_sem_ok=no $2 fi ]) openexr-2.5.7/Contrib/NuGet/000077500000000000000000000000001406177042200156325ustar00rootroot00000000000000openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x64-build.nuget.bat000066400000000000000000000110421406177042200234030ustar00rootroot00000000000000REM @echo off Echo LIB Windows Build NuGet REM # Build Vars # set _SCRIPT_DRIVE=%~d0 set _SCRIPT_FOLDER=%~dp0 set INITDIR=%_SCRIPT_FOLDER% set SRC=%INITDIR%\..\..\ set BUILDTREE=%SRC%\build-win\ SET tbs_arch=x64 SET vcvar_arg=x86_amd64 SET cmake_platform="Visual Studio 15 2017 Win64" REM # VC Vars # SET VCVAR="%programfiles(x86)%\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat" if exist %VCVAR% call %VCVAR% %vcvar_arg% SET VCVAR="%programfiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" if exist %VCVAR% call %VCVAR% %vcvar_arg% REM # Clean Build Tree # rd /s /q %BUILDTREE% mkdir %BUILDTREE% mkdir %BUILDTREE%\deps REM # Change to Build Tree drive # %_SCRIPT_DRIVE% REM # Change to Build Tree directory # cd %BUILDTREE% :nuget_Dep REM # packages from nuget # mkdir %BUILDTREE%\deps cd %BUILDTREE%\deps SET VER=1.2.11.8899 set ZLIBDIR=%BUILDTREE%\deps\zlib-msvc-%tbs_arch%.%VER%\build\native nuget install zlib-msvc-%tbs_arch% -Version %VER% SET VER=1.3.4.8788 set FLTKDIR=%BUILDTREE%\deps\FLTK-msvc-%tbs_arch%.%VER%\build\native nuget install FLTK-msvc-%tbs_arch% -Version %VER% :copy_files set BINDIR=%SRC%\build-nuget\ rd /s /q %BINDIR% mkdir %BINDIR% mkdir %BINDIR%\lib set PATH=%BINDIR%\lib;%PATH% echo %BINDIR% :static_LIB REM # LIB STATIC # ECHO %cmake_platform% STATIC rd /s /q %BUILDTREE%\OpenEXR mkdir %BUILDTREE%\OpenEXR cd %BUILDTREE%\OpenEXR cmake -G %cmake_platform% ^ -DBUILD_ILMBASE_STATIC:BOOL=ON ^ -DOPENEXR_BUILD_ILMBASE:BOOL=ON ^ -DOPENEXR_BUILD_OPENEXR:BOOL=ON ^ -DOPENEXR_BUILD_PYTHON_LIBS:BOOL=OFF ^ -DOPENEXR_BUILD_VIEWERS:BOOL=ON ^ -DOPENEXR_BUILD_TESTS:BOOL=ON ^ -DOPENEXR_RUN_FUZZ_TESTS:BOOL=OFF ^ -DOPENEXR_BUILD_UTILS:BOOL=ON ^ -DOPENEXR_BUILD_SHARED:BOOL=OFF ^ -DOPENEXR_BUILD_STATIC:BOOL=ON ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD" ^ -DCMAKE_CXX_FLAGS_DEBUG="/MDd" ^ -DCMAKE_C_FLAGS_RELEASE="/MD" ^ -DCMAKE_C_FLAGS_DEBUG="/MDd" ^ -DZLIB_LIBRARY=%ZLIBDIR%\lib_release\zlibstatic.lib ^ -DZLIB_INCLUDE_DIR=%ZLIBDIR%\include ^ -DFLTK_BASE_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk.lib ^ -DFLTK_GL_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_gl.lib ^ -DFLTK_FORMS_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_forms.lib ^ -DFLTK_IMAGES_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_images.lib ^ -DFLTK_BASE_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltkd.lib ^ -DFLTK_GL_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_gld.lib ^ -DFLTK_FORMS_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_formsd.lib ^ -DFLTK_IMAGES_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_imagesd.lib ^ -DFLTK_INCLUDE_DIR=%FLTKDIR%\include ^ -DCMAKE_INSTALL_PREFIX=%BINDIR% ^ -DCMAKE_BUILD_TYPE="Release" %SRC% cmake --build . --config Release --target install move %BINDIR%lib %BINDIR%lib_release move %BINDIR%bin %BINDIR%bin_release REM # DEBUG # REM # Clean Build Tree # rd /s /q %BUILDTREE%\OpenEXR mkdir %BUILDTREE%\OpenEXR cd %BUILDTREE%\OpenEXR cmake -G %cmake_platform% ^ -DBUILD_ILMBASE_STATIC:BOOL=ON ^ -DOPENEXR_BUILD_ILMBASE:BOOL=ON ^ -DOPENEXR_BUILD_OPENEXR:BOOL=ON ^ -DOPENEXR_BUILD_PYTHON_LIBS:BOOL=OFF ^ -DOPENEXR_BUILD_VIEWERS:BOOL=ON ^ -DOPENEXR_BUILD_TESTS:BOOL=ON ^ -DOPENEXR_RUN_FUZZ_TESTS:BOOL=OFF ^ -DOPENEXR_BUILD_UTILS:BOOL=ON ^ -DOPENEXR_BUILD_SHARED:BOOL=OFF ^ -DOPENEXR_BUILD_STATIC:BOOL=ON ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD" ^ -DCMAKE_CXX_FLAGS_DEBUG="/MDd" ^ -DCMAKE_C_FLAGS_RELEASE="/MD" ^ -DCMAKE_C_FLAGS_DEBUG="/MDd" ^ -DZLIB_LIBRARY=%ZLIBDIR%\lib_debug\zlibstaticd.lib ^ -DZLIB_INCLUDE_DIR=%ZLIBDIR%\include ^ -DFLTK_BASE_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk.lib ^ -DFLTK_GL_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_gl.lib ^ -DFLTK_FORMS_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_forms.lib ^ -DFLTK_IMAGES_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_images.lib ^ -DFLTK_BASE_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltkd.lib ^ -DFLTK_GL_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_gld.lib ^ -DFLTK_FORMS_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_formsd.lib ^ -DFLTK_IMAGES_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_imagesd.lib ^ -DFLTK_INCLUDE_DIR=%FLTKDIR%\include ^ -DCMAKE_INSTALL_PREFIX=%BINDIR% ^ -DCMAKE_BUILD_TYPE="DEBUG" %SRC% cmake --build . --config DEBUG --target install move %BINDIR%lib %BINDIR%lib_debug move %BINDIR%bin %BINDIR%bin_debug REM # TODO: ENABLE SHARED Build GOTO:nuget_req mkdir %BINDIR%\static\ move /Y %BINDIR%\lib %BINDIR%\static\ :shared_LIB REM # LIB SHARED # ECHO %cmake_platform% SHARED :nuget_req cd %BINDIR% REM # make nuget packages from binaries # copy %INITDIR%\OpenEXR-msvc-%tbs_arch%.targets %BINDIR%\OpenEXR-msvc-%tbs_arch%.targets cd %BUILDTREE% nuget pack %INITDIR%\OpenEXR-msvc-%tbs_arch%.nuspec cd %INITDIR% REM --- exit ---- GOTO:eof openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x64.nuspec000066400000000000000000000011641406177042200217200ustar00rootroot00000000000000 openexr-msvc-x64 2.3.0.8788 administrator false Visual Studio 2017 Release OpenEXR as NuGet package. openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x64.targets000066400000000000000000000035121406177042200220730ustar00rootroot00000000000000 HAS_OpenEXR;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/lib_release/*.lib;%(AdditionalDependencies) HAS_OpenEXR;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/lib_debug/*.lib;%(AdditionalDependencies) openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x86-build.nuget.bat000066400000000000000000000110261406177042200234110ustar00rootroot00000000000000REM @echo off Echo LIB Windows Build NuGet REM # Build Vars # set _SCRIPT_DRIVE=%~d0 set _SCRIPT_FOLDER=%~dp0 set INITDIR=%_SCRIPT_FOLDER% set SRC=%INITDIR%\..\..\ set BUILDTREE=%SRC%\build-win\ SET tbs_arch=x86 SET vcvar_arg=x86 SET cmake_platform="Visual Studio 15 2017" REM # VC Vars # SET VCVAR="%programfiles(x86)%\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat" if exist %VCVAR% call %VCVAR% %vcvar_arg% SET VCVAR="%programfiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" if exist %VCVAR% call %VCVAR% %vcvar_arg% REM # Clean Build Tree # rd /s /q %BUILDTREE% mkdir %BUILDTREE% mkdir %BUILDTREE%\deps REM # Change to Build Tree drive # %_SCRIPT_DRIVE% REM # Change to Build Tree directory # cd %BUILDTREE% :nuget_Dep REM # packages from nuget # mkdir %BUILDTREE%\deps cd %BUILDTREE%\deps SET VER=1.2.11.8899 set ZLIBDIR=%BUILDTREE%\deps\zlib-msvc-%tbs_arch%.%VER%\build\native nuget install zlib-msvc-%tbs_arch% -Version %VER% SET VER=1.3.4.8788 set FLTKDIR=%BUILDTREE%\deps\FLTK-msvc-%tbs_arch%.%VER%\build\native nuget install FLTK-msvc-%tbs_arch% -Version %VER% :copy_files set BINDIR=%SRC%\build-nuget\ rd /s /q %BINDIR% mkdir %BINDIR% mkdir %BINDIR%\lib set PATH=%BINDIR%\lib;%PATH% echo %BINDIR% :static_LIB REM # LIB STATIC # ECHO %cmake_platform% STATIC rd /s /q %BUILDTREE%\OpenEXR mkdir %BUILDTREE%\OpenEXR cd %BUILDTREE%\OpenEXR cmake -G %cmake_platform% ^ -DBUILD_ILMBASE_STATIC:BOOL=ON ^ -DOPENEXR_BUILD_ILMBASE:BOOL=ON ^ -DOPENEXR_BUILD_OPENEXR:BOOL=ON ^ -DOPENEXR_BUILD_PYTHON_LIBS:BOOL=OFF ^ -DOPENEXR_BUILD_VIEWERS:BOOL=ON ^ -DOPENEXR_BUILD_TESTS:BOOL=ON ^ -DOPENEXR_RUN_FUZZ_TESTS:BOOL=OFF ^ -DOPENEXR_BUILD_UTILS:BOOL=ON ^ -DOPENEXR_BUILD_SHARED:BOOL=OFF ^ -DOPENEXR_BUILD_STATIC:BOOL=ON ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD" ^ -DCMAKE_CXX_FLAGS_DEBUG="/MDd" ^ -DCMAKE_C_FLAGS_RELEASE="/MD" ^ -DCMAKE_C_FLAGS_DEBUG="/MDd" ^ -DZLIB_LIBRARY=%ZLIBDIR%\lib_release\zlibstatic.lib ^ -DZLIB_INCLUDE_DIR=%ZLIBDIR%\include ^ -DFLTK_BASE_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk.lib ^ -DFLTK_GL_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_gl.lib ^ -DFLTK_FORMS_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_forms.lib ^ -DFLTK_IMAGES_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_images.lib ^ -DFLTK_BASE_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltkd.lib ^ -DFLTK_GL_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_gld.lib ^ -DFLTK_FORMS_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_formsd.lib ^ -DFLTK_IMAGES_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_imagesd.lib ^ -DFLTK_INCLUDE_DIR=%FLTKDIR%\include ^ -DCMAKE_INSTALL_PREFIX=%BINDIR% ^ -DCMAKE_BUILD_TYPE="Release" %SRC% cmake --build . --config Release --target install move %BINDIR%lib %BINDIR%lib_release move %BINDIR%bin %BINDIR%bin_release REM # DEBUG # REM # Clean Build Tree # rd /s /q %BUILDTREE%\OpenEXR mkdir %BUILDTREE%\OpenEXR cd %BUILDTREE%\OpenEXR cmake -G %cmake_platform% ^ -DBUILD_ILMBASE_STATIC:BOOL=ON ^ -DOPENEXR_BUILD_ILMBASE:BOOL=ON ^ -DOPENEXR_BUILD_OPENEXR:BOOL=ON ^ -DOPENEXR_BUILD_PYTHON_LIBS:BOOL=OFF ^ -DOPENEXR_BUILD_VIEWERS:BOOL=ON ^ -DOPENEXR_BUILD_TESTS:BOOL=ON ^ -DOPENEXR_RUN_FUZZ_TESTS:BOOL=OFF ^ -DOPENEXR_BUILD_UTILS:BOOL=ON ^ -DOPENEXR_BUILD_SHARED:BOOL=OFF ^ -DOPENEXR_BUILD_STATIC:BOOL=ON ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD" ^ -DCMAKE_CXX_FLAGS_DEBUG="/MDd" ^ -DCMAKE_C_FLAGS_RELEASE="/MD" ^ -DCMAKE_C_FLAGS_DEBUG="/MDd" ^ -DZLIB_LIBRARY=%ZLIBDIR%\lib_debug\zlibstaticd.lib ^ -DZLIB_INCLUDE_DIR=%ZLIBDIR%\include ^ -DFLTK_BASE_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk.lib ^ -DFLTK_GL_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_gl.lib ^ -DFLTK_FORMS_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_forms.lib ^ -DFLTK_IMAGES_LIBRARY_RELEASE=%FLTKDIR%\lib_release\fltk_images.lib ^ -DFLTK_BASE_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltkd.lib ^ -DFLTK_GL_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_gld.lib ^ -DFLTK_FORMS_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_formsd.lib ^ -DFLTK_IMAGES_LIBRARY_DEBUG=%FLTKDIR%\lib_debug\fltk_imagesd.lib ^ -DFLTK_INCLUDE_DIR=%FLTKDIR%\include ^ -DCMAKE_INSTALL_PREFIX=%BINDIR% ^ -DCMAKE_BUILD_TYPE="DEBUG" %SRC% cmake --build . --config DEBUG --target install move %BINDIR%lib %BINDIR%lib_debug move %BINDIR%bin %BINDIR%bin_debug REM # TODO: ENABLE SHARED Build GOTO:nuget_req mkdir %BINDIR%\static\ move /Y %BINDIR%\lib %BINDIR%\static\ :shared_LIB REM # LIB SHARED # ECHO %cmake_platform% SHARED :nuget_req cd %BINDIR% REM # make nuget packages from binaries # copy %INITDIR%\OpenEXR-msvc-%tbs_arch%.targets %BINDIR%\OpenEXR-msvc-%tbs_arch%.targets cd %BUILDTREE% nuget pack %INITDIR%\OpenEXR-msvc-%tbs_arch%.nuspec cd %INITDIR% REM --- exit ---- GOTO:eof openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x86.nuspec000066400000000000000000000011641406177042200217240ustar00rootroot00000000000000 openexr-msvc-x86 2.3.0.8788 administrator false Visual Studio 2017 Release OpenEXR as NuGet package. openexr-2.5.7/Contrib/NuGet/OpenEXR-msvc-x86.targets000066400000000000000000000035221406177042200221000ustar00rootroot00000000000000 HAS_OpenEXR;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/lib_release/*.lib;%(AdditionalDependencies) HAS_OpenEXR;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/include/OpenEXR;%(AdditionalIncludeDirectories) $(MSBuildThisFileDirectory)../..//build/native/lib_debug/*.lib;%(AdditionalDependencies) openexr-2.5.7/GOVERNANCE.md000066400000000000000000000125701406177042200151660ustar00rootroot00000000000000# OpenEXR Project Roles and Responsibilities OpenEXR is a project of the Academy Software Foundation and relies on the ASWF governance policies, supported by the Linux Foundation. There are three primary project roles: Contributors submit code to the project; Committers approve code to be included into the project; and the Technical Steering Committee (TSC) provides overall high-level project guidance. * [Contributors](#Contributors) * [Committers](#Committers) * [Technical Steering Committee](#Technical-Steering-Committee) ## Contributors The OpenEXR project grows and thrives from assistance from Contributors. Contributors include anyone in the community that submits code, documentation, or other technical artifacts to the project. However, such contributions must be approved by a project Committer before they become a part of the project. Anyone can be a Contributor. You need no formal approval from the project, beyond the legal forms. ### How to Become a Contributor * Review the coding standards to ensure your contribution is in line with the project's coding and styling guidelines. * Sign the Individual CLA, or have your organization sign the Corporate CLA. * Submit your code as a PR with the appropriate DCO sign-off. ## Committers Project Committers have merge access on the OpenEXR GitHub repository and are responsible for approving submissions by Contributors. ### Committer Responsibilities Typical activities of a Committer include: * Helping users and novice contributors. * Ensuring a response to questions posted to the openexr-dev@lists.aswf.io mailing list. * Contributing code and documentation changes that improve the project. * Reviewing and commenting on issues and pull requests. * Ensuring that changes and new code meet acceptable standards and are in the long-term interest of the project. * Participation in working groups. * Merging pull requests. ### How to Become a Committer Any existing Committer can nominate an individual making significant and valuable contributions to the OpenEXR project to become a new Committer. New committers are approved by vote of the TSC. If you are interested in becomming a Committer, contact the TSC at info@openexr.com. ## Technical Steering Committee The Technical Steering Committee (TSC) oversees the overall technical direction of OpenEXR, as defined in the project [charter](ASWF/charter/OpenEXR-Technical-Charter.md). This charter defines the TSC member terms and succession policies. The responsibilities of the TSC include: * Coordinating technical direction of the project. * Project governance and contribution policy. * GitHub repository administration. * Maintaining the list of additional Committers. * Appointing representatives to work with other open source or open standards communities. * Discussions, seeking consensus, and where necessary, voting on technical matters relating to the code base that affect multiple projects. * Coordinating any marketing, events, or communications regarding the project. The TSC elects a Chair person, who acts as the project manager, organizing meetings and providing oversight to project administration. The Chair is elected by the TSC. The Chair also serves as the OpenEXR representative on the Academy Software Foundation (ASWF) Technical Advisory Council (TAC). The chair represents the project at ASWF TAC meetings. ### Current TSC Members * Cary Phillips (chair) - Industrial Light & Magic * Rod Bogart - Epic Games * Larry Gritz - Sony Pictures ImageWorks * Peter Hillman - Weta Digital, Ltd. * Kimball Thurston - Weta Digital, Ltd. * Nick Porcino - Pixar Animation Studios * Christina Tempelaar-Lietz - Epic Games * Joseph Goldstone - ARRI * John Mertic - The Linux Foundation ### TSC Meetings All meetings of the TSC are open to participation by any member of the OpenEXR community. Meeting times are listed in the [ASWF technical community calendar](https://lists.aswf.io/g/tac/calendar), currently each Thursday at 1pm Pacific Time via Zoom video conference. The TSC Chair moderates the meeting, or appoints another TSC member to moderate in his or her absence. Items are added to the TSC agenda which are considered contentious or are modifications of governance, contribution policy, TSC membership, or release process, in addition to topics involving the high-level technical direction of the project. The intention of the agenda is not to approve or review all patches. That should happen continuously on GitHub and be handled by the larger group of Committers. Any community member or Contributor can ask that something be reviewed by the TSC at the meeting by logging a GitHub issue. Any Committer, TSC member, or the meeting chair can bring the issue to the TSC's attention by applying the `TSC` label. Prior to each TSC meeting, the meeting chair will share the agenda with members of the TSC. TSC members can also add items to the agenda at the beginning of each meeting. The meeting chair and the TSC cannot veto or remove items. The TSC may invite additional persons to participate in a non-voting capacity. The meeting chair is responsible for archiving the minutes, stored at https://github.com/AcademySoftwareFoundation/openexr/tree/master/ASWF/tsc-meetings. Due to the challenges of scheduling a global meeting with participants in several time zones, the TSC will seek to resolve as many agenda items as possible outside of meetings on the public mailing list. openexr-2.5.7/INSTALL.md000066400000000000000000000333201406177042200146410ustar00rootroot00000000000000# Building and Installation ## Download To build the latest release of OpenEXR, begin by downloading the source from the Releases page https://github.com/AcademySoftwareFoundation/openexr/tarball/v2.5.1. To build from the latest development version, which may not be stable, download the master branch via https://github.com/AcademySoftwareFoundation/openexr/tarball/master, and extract the contents via ``tar``. You can download the repository tarball file either via a browser, or on the Linux/macOS via the command line using ``wget`` or ``curl``: % curl -L https://github.com/AcademySoftwareFoundation/openexr/tarball/master | tar xv This will produce a source directory named ``openexr-openexr-``. Alternatively, clone the GitHub repo directly via: % git clone https://github.com/AcademySoftwareFoundation/openexr.git In the instructions that follow, we will refer to the top-level directory of the source code tree as ``$source_directory``. ## Prerequisites Make sure these are installed on your system before building OpenEXR: * OpenEXR requires CMake version 3.10 or newer (or autoconf on Linux systems). - NB: CMake 3.12 is required for current PyIlmBase support * C++ compiler that supports C++11 * Zlib * Python and boost-python if building the PyIlmBase module. - NB: If you have a custom install of boost and have issues, you may need to set Boost_ROOT and/or manually disable Boost_NO_BOOST_CMAKE in the PyIlmBase cmake file when you run cmake. See the FindBoost documentation that is part of cmake for more information. The instructions that follow describe building OpenEXR with CMake, but you can also build and install OpenEXR via the autoconf bootstrap/configure utilities, described below. ## Linux/macOS Quick Start To build via CMake, first choose a location for the build directory, which we will refer to as ``$build_directory``. % mkdir $build_directory % cd $build_directory % cmake $source_directory % make % make install Note that the CMake configuration prefers to apply an out-of-tree build process, since there may be multiple build configurations (i.e. debug and release), one per folder, all pointing at once source tree, hence the ``$build_directory`` noted above, referred to in CMake parlance as the *build directory*. You can place this directory wherever you like. See the CMake Configuration Options section below for the most common configuration options especially the install directory. Note that with no arguments, as above, ``make install`` installs the header files in ``/usr/local/include``, the object libraries in ``/usr/local/lib``, and the executable programs in ``/usr/local/bin``. ## Windows Quick Start Under Windows, if you are using a command line-based setup, such as cygwin, you can of course follow the above. For Visual Studio, cmake generators are "multiple configuration", so you don't even have to set the build type, although you will most likely need to specify the install location. Install Directory By default, ``make install`` installs the headers, libraries, and programs into ``/usr/local``, but you can specify a local install directory to cmake via the ``CMAKE_INSTALL_PREFIX`` variable: % cmake .. -DCMAKE_INSTALL_PREFIX=$install_directory ## Library Names Using either cmake or autoconf based configuration mechanisms described in this document, by default the installed libraries follow a pattern for how they are named. This is done to enable multiple versions of the library to be installed and targeted by different builds depending on the needs of the project. A simple example of this would be to have different versions of the library installed to allow for applications targeting different VFX Platform years to co-exist. If you are building dynamic libraries, once you have configured, built, and installed the libraries, you should see the following pattern of symlinks and files in the install lib folder: libHalf.so -> libHalf-$LIB_SUFFIX.so libHalf-$LIB_SUFFIX.so -> libHalf-$LIB_SUFFIX.so.$SO_MAJOR_VERSION libHalf-$LIB_SUFFIX.so.$SO_MAJOR_VERSION -> libHalf-$LIB_SUFFIX.so.$SO_FULL_VERSION libHalf-$LIB_SUFFIX.so.$SO_FULL_VERSION (actual file) You can configure the LIB_SUFFIX, although it defaults to the library major and minor version, so in the case of a 2.3 library, it would default to 2_3. You would then link your programs against this versioned library to have maximum safety (i.e. `-lHalf-2_3`), and the pkg-config and cmake configuration files included with find_package should set this up. ## Sub-Modules OpenEXR consists of three separate sub-modules - IlmBase, PyIlmBase, and OpenEXR - which can be built independently. The repository’s top-level CMakeLists.txt defines a *super-project* that builds all three modules, and the steps above for running cmake at the top level of the repo build each of the sub-modules, in parallel. However you can build each submodule individually. To build and install individual sub-modules, build and install the IlmBase module first: % mkdir $build_directory % cd $build_directory % cmake -DCMAKE_INSTALL_PREFIX=$install_directory \ $source_directory/Ilmbase % cmake --build . --target install --config Release Once IlmBase is installed, then build and install the OpenEXR module, taking care to set the ``CMAKE_SYSTEM_PREFIX`` to the directory in which you installed IlmBase and ``CMAKE_INSTALL_PREFIX`` to the directory in which to install OpenEXR: % mkdir $build_directory % cd $build_directory % cmake -DCMAKE_SYSTEM_PREFIX=$install_directory \ -DCMAKE_INSTALL_PREFIX=$install_directory \ $source_directory/OpenEXR % cmake --build . --target install --config Release Optionally, then build and install PyIlmBase The libraries in IlmBase and OpenEXR follow the standard cmake setting of ``BUILD_SHARED_LIBS`` to control whether to build static or shared libraries. However, they each have separate controls over whether to build both shared and static libraries as part of one configuration, as well as other customization options. ## Custom Namespaces If you are interested in controlling custom namespace declarations or similar options, you are encouraged to look at the ``CMakeLists.txt`` infrastructure. In particular, there has been an attempt to centralize the settings into a common place to more easily see all of them in a text editor. For IlmBase, this is config/IlmBaseSetup.cmake inside the IlmBase tree. For OpenEXR, the settings will similarly be found in ``config/OpenEXRSetup.cmake``. As per usual, these settings can also be seen and/or edited using any of the various gui editors for working with cmake such as ``ccmake``, ``cmake-gui``, as well as some of the IDEs in common use. ## Cross Compiling / Specifying Specific Compilers When trying to either cross-compile for a different platform, or for tasks such as specifying a compiler set to match the VFX reference platform (https://vfxplatform.com/), cmake provides the idea of a toolchain which may be useful instead of having to remember a chain of configuration options. It also means that platform-specific compiler names and options are out of the main cmake file, providing better isolation. A toolchain file is simply just a cmake script that sets all the compiler and related flags and is run very early in the configuration step to be able to set all the compiler options and such for the discovery that cmake performs automatically. These options can be set on the command line still if that is clearer, but a theoretical toolchain file for compiling for VFX Platform 2015 is provided in the source tree at cmake/Toolchain-Linux-VFX_Platform15.cmake which will hopefully provide a guide how this might work. For cross-compiling for additional platforms, there is also an included sample script in cmake/Toolchain-mingw.cmake which shows how cross compiling from Linux for Windows may work. The compiler names and paths may need to be changed for your environment. More documentation: * Toolchains: https://cmake.org/cmake/help/v3.12/manual/cmake-toolchains.7.html * Cross compiling: https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/ ## CMake Configuration Options The default CMake configuration options are stored in ``IlmBase/config/IlmBaseSetup.cmake`` and in ``OpenEXR/config/OpenEXRSetup.cmake``. To see a complete set of option variables, run: % cmake -LAH $source_directory You can customize these options three ways: 1. Modify the ``.cmake`` files in place. 2. Use the UI ``cmake-gui`` or ``ccmake``. 2. Specify them as command-line arguments when you invoke cmake. ### Verbose Output Options: * **CMAKE\_EXPORT\_COMPILE\_COMMANDS** Enable/Disable output of compile commands during generation. Default is OFF. * **CMAKE\_VERBOSE\_MAKEFILE** Echo all compile commands during make. Default is OFF. ### Compiler Options: * **OPENEXR\_CXX\_STANDARD** C++ standard to compile against. This obeys the global ``CMAKE_CXX_STANDARD`` but doesn’t force the global setting to enable sub-project inclusion. Default is ``14``. ### Library Naming Options: * **ILMBASE\_LIB\_SUFFIX** Append the given string to the end of all the IlmBase libraries. Default is ``-_`` version string. Please see the section on library names * **OPENEXR\_LIB\_SUFFIX** Append the given string to the end of all the OpenEXR libraries. Default is ``-_`` version string. Please see the section on library names ### Namespace Options: * **ILMBASE\_IEX\_NAMESPACE** Public namespace alias for Iex. Default is ``Iex``. * **ILMBASE\_ILMTHREAD\_NAMESPACE** Public namespace alias for IlmThread. Default is ``IlmThread``. * **ILMBASE\_IMATH\_NAMESPACE** Public namespace alias for Imath. Default is ``Imath``. * **ILMBASE\_INTERNAL\_IEX\_NAMESPACE** Real namespace for Iex that will end up in compiled symbols. Default is ``Iex\_\_``. * **ILMBASE\_INTERNAL\_ILMTHREAD\_NAMESPACE** Real namespace for IlmThread that will end up in compiled symbols. Default is ``IlmThread\_\_``. * **ILMBASE\_INTERNAL\_IMATH\_NAMESPACE** Real namespace for Imath that will end up in compiled symbols. Default is ``Imath\_\_``. * **ILMBASE\_NAMESPACE\_CUSTOM** Whether the namespace has been customized (so external users know) * **OPENEXR\_IMF\_NAMESPACE** Public namespace alias for Imath. Default is ``Imf``. * **OPENEXR\_INTERNAL\_IMF\_NAMESPACE** Real namespace for Imath that will end up in compiled symbols. Default is ``Imf\_\_``. * **OPENEXR\_NAMESPACE\_CUSTOM** Whether the namespace has been customized (so external users know) ### Python Options: * **PyIlmBase\_Python2\_SITEARCH\_REL** This will normally be computed based on where the python2 binary and site-packages live and then be a relative path based on the root of those. For example, if site-packages is in ``/usr/lib/python2.7/site-packages`` and the python binary is ``/usr/bin/python2.7``, this will result in the default install path being ``${CMAKE\_INSTALL\_PREFIX}/lib/python2.7/site-packages`` * **PyIlmBase\_Python3\_SITEARCH\_REL** Identical logic to PyIlmBase\_Python2\_SITEARCH\_REL path above, but for python 3.x ### Linting Options: These linting options are experimental, and primarily for developer-only use at this time. * **ILMBASE\_USE\_CLANG\_TIDY** Enable clang-tidy for IlmBase libraries, if it is available. Default is OFF. * **OPENEXR\_USE\_CLANG\_TIDY** Enable clang-tidy for OpenEXR libraries, if it is available. Default is OFF. ### Testing Options: * **BUILD\_TESTING** Build the testing tree. Default is ON. Note that this causes the test suite to be compiled, but it is not executed. * **OPENEXR\_RUN\_FUZZ\_TESTS** Controls whether to include the fuzz tests (very slow). Default is OFF. ### Additional CMake Options: See the cmake documentation for more information (https://cmake.org/cmake/help/v3.12/) * **CMAKE\_BUILD\_TYPE** For builds when not using a multi-configuration generator. Available values: ``Debug``, ``Release``, ``RelWithDebInfo``, ``MinSizeRel`` * **BUILD\_SHARED\_LIBS** This is the primary control whether to build static libraries or shared libraries / dlls (side note: technically a convention, hence not an official ``CMAKE\_`` variable, it is defined within cmake and used everywhere to control this static / shared behavior) * For forcing particular compilers to match VFX platform requirements ** CMAKE\_CXX\_COMPILER** ** CMAKE\_C\_COMPILER** ** CMAKE\_LINKER** All the related cmake compiler flags (i.e. CMAKE\_CXX_FLAGS, CMAKE_CXX_FLAGS_DEBUG) ** CMAKE\_INSTALL\_RPATH** For non-standard install locations where you don’t want to have to set ``LD_LIBRARY_PATH`` to use them ## Cmake Tips and Tricks: If you have ninja (https://ninja-build.org/) installed, it is faster than make. You can generate ninja files using cmake when doing the initial generation: % cmake -G “Ninja” .. If you would like to confirm compile flags, you don’t have to specify the verbose configuration up front, you can instead run % make VERBOSE=1 ## Configuring via Autoconf As an alternative to CMake on Linux systems, the OpenEXR build can be configured via the provided bootstrap/configure scripts: % cd $source_directory/IlmBase % ./bootstrap % ./configure --prefix=$install_directory % make % make install % cd $source_directory/OpenEXR % ./bootstrap % ./configure --prefix=$install_directory \ --with-ilmbase-prefix=$install_directory % make % make install % cd $source_directory/PyIlmBase % ./bootstrap % ./configure --prefix=$install_directory \ --with-ilmbase-prefix=$install_directory % make % make install Run ``./configure --help`` for a complete set of configuration options. openexr-2.5.7/IlmBase/000077500000000000000000000000001406177042200145245ustar00rootroot00000000000000openexr-2.5.7/IlmBase/.gitignore000066400000000000000000000002661406177042200165200ustar00rootroot00000000000000IlmBase.pc autom4te.cache/ config.guess config.log config.status config.sub config/IlmBaseConfig.h config/stamp-h1 configure depcomp install-sh libtool ltmain.sh missing .metadata/ openexr-2.5.7/IlmBase/CMakeLists.txt000066400000000000000000000033661406177042200172740ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # We require this to get object library link library support and # combined python 2 + 3 support if(ILMBASE_BUILD_BOTH_STATIC_SHARED) if (${CMAKE_VERSION} VERSION_LESS "3.12.0") message(FATAL_ERROR "CMake 3.12 or newer is required for object library support when building both static and shared libraries") endif() cmake_minimum_required(VERSION 3.12) else() cmake_minimum_required(VERSION 3.10) endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() # we include this first to parse configure.ac and extract the version # numbers include(config/ParseConfigure.cmake) #set up our project project(IlmBase VERSION ${ILMBASE_VERSION} LANGUAGES C CXX) ####################################### ####################################### # This declares all the configuration variables visible # in cmake-gui or similar and the rest of the global # project setup # # Please look at this file to see what is configurable ####################################### ####################################### include(config/IlmBaseSetup.cmake) # generates config headers, package config files add_subdirectory(config) # utility function for the repeated boilerplate of defining # the libraries include(config/LibraryDefine.cmake) add_subdirectory( Half ) add_subdirectory( Iex ) add_subdirectory( IexMath ) add_subdirectory( Imath ) add_subdirectory( IlmThread ) # Can't seem to do EXCLUDE_FROM_ALL on the test executables # since you can't then create a dependency on the internal # "test" target such that it is auto built include(CTest) if(BUILD_TESTING) enable_testing() add_subdirectory( HalfTest ) add_subdirectory( IexTest ) add_subdirectory( ImathTest ) endif() openexr-2.5.7/IlmBase/Half/000077500000000000000000000000001406177042200153765ustar00rootroot00000000000000openexr-2.5.7/IlmBase/Half/CMakeLists.txt000066400000000000000000000004621406177042200201400ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. ilmbase_define_library(Half PRIV_EXPORT HALF_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES toFloat.h eLut.h half.cpp HEADERS half.h halfFunction.h halfExport.h halfLimits.h ) openexr-2.5.7/IlmBase/Half/Makefile.am000066400000000000000000000016021406177042200174310ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in AM_CPPFLAGS = -I$(top_srcdir)/config lib_LTLIBRARIES = libHalf.la libHalf_la_SOURCES = half.cpp half.h halfFunction.h halfLimits.h libHalf_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined if LIB_SUFFIX_EXISTS libHalf_la_LDFLAGS += -release @LIB_SUFFIX@ endif libHalfincludedir = $(includedir)/OpenEXR libHalfinclude_HEADERS = half.h halfFunction.h halfLimits.h halfExport.h # these are used to build eLut.h and toFloat.h dynamically EXTRA_DIST = eLut.cpp toFloat.cpp CMakeLists.txt CLEANFILES = eLut eLut.h toFloat toFloat.h eLut_SOURCES = eLut.cpp toFloat_SOURCES = toFloat.cpp eLut.h: eLut ./eLut > eLut.h toFloat.h: toFloat ./toFloat > toFloat.h BUILT_SOURCES = eLut.h toFloat.h noinst_PROGRAMS = eLut toFloat openexr-2.5.7/IlmBase/Half/eLut.cpp000066400000000000000000000064331406177042200170210ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include #include using namespace std; //----------------------------------------------------- // Compute a lookup table for float-to-half conversion. // // When indexed with the combined sign and exponent of // a float, the table either returns the combined sign // and exponent of the corresponding half, or zero if // the corresponding half may not be normalized (zero, // denormalized, overflow). //----------------------------------------------------- void initELut (unsigned short eLut[]) { for (int i = 0; i < 0x100; i++) { int e = (i & 0x0ff) - (127 - 15); if (e <= 0 || e >= 30) { // // Special case // eLut[i] = 0; eLut[i | 0x100] = 0; } else { // // Common case - normalized half, no exponent overflow possible // eLut[i] = (e << 10); eLut[i | 0x100] = ((e << 10) | 0x8000); } } } //------------------------------------------------------------ // Main - prints the sign-and-exponent conversion lookup table //------------------------------------------------------------ int main () { const int tableSize = 1 << 9; unsigned short eLut[tableSize]; initELut (eLut); cout << "//\n" "// This is an automatically generated file.\n" "// Do not edit.\n" "//\n\n"; cout << "{\n "; for (int i = 0; i < tableSize; i++) { cout << setw (5) << eLut[i] << ", "; if (i % 8 == 7) { cout << "\n"; if (i < tableSize - 1) cout << " "; } } cout << "};\n"; return 0; } openexr-2.5.7/IlmBase/Half/eLut.h000066400000000000000000000076101406177042200164640ustar00rootroot00000000000000// // This is an automatically generated file. // Do not edit. // { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33792, 34816, 35840, 36864, 37888, 38912, 39936, 40960, 41984, 43008, 44032, 45056, 46080, 47104, 48128, 49152, 50176, 51200, 52224, 53248, 54272, 55296, 56320, 57344, 58368, 59392, 60416, 61440, 62464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; openexr-2.5.7/IlmBase/Half/half.cpp000066400000000000000000000165761406177042200170330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// // Primary authors: // Florian Kainz // Rod Bogart //--------------------------------------------------------------------------- // // class half -- // implementation of non-inline members // //--------------------------------------------------------------------------- #include #include "half.h" using namespace std; //------------------------------------------------------------- // Lookup tables for half-to-float and float-to-half conversion //------------------------------------------------------------- HALF_EXPORT const half::uif half::_toFloat[1 << 16] = #include "toFloat.h" HALF_EXPORT const unsigned short half::_eLut[1 << 9] = #include "eLut.h" //----------------------------------------------- // Overflow handler for float-to-half conversion; // generates a hardware floating-point overflow, // which may be trapped by the operating system. //----------------------------------------------- HALF_EXPORT float half::overflow () { volatile float f = 1e10; for (int i = 0; i < 10; i++) f *= f; // this will overflow before // the forloop terminates return f; } //----------------------------------------------------- // Float-to-half conversion -- general case, including // zeroes, denormalized numbers and exponent overflows. //----------------------------------------------------- HALF_EXPORT short half::convert (int i) { // // Our floating point number, f, is represented by the bit // pattern in integer i. Disassemble that bit pattern into // the sign, s, the exponent, e, and the significand, m. // Shift s into the position where it will go in in the // resulting half number. // Adjust e, accounting for the different exponent bias // of float and half (127 versus 15). // int s = (i >> 16) & 0x00008000; int e = ((i >> 23) & 0x000000ff) - (127 - 15); int m = i & 0x007fffff; // // Now reassemble s, e and m into a half: // if (e <= 0) { if (e < -10) { // // E is less than -10. The absolute value of f is // less than HALF_MIN (f may be a small normalized // float, a denormalized float or a zero). // // We convert f to a half zero with the same sign as f. // return s; } // // E is between -10 and 0. F is a normalized float // whose magnitude is less than HALF_NRM_MIN. // // We convert f to a denormalized half. // // // Add an explicit leading 1 to the significand. // m = m | 0x00800000; // // Round to m to the nearest (10+e)-bit value (with e between // -10 and 0); in case of a tie, round to the nearest even value. // // Rounding may cause the significand to overflow and make // our number normalized. Because of the way a half's bits // are laid out, we don't have to treat this case separately; // the code below will handle it correctly. // int t = 14 - e; int a = (1 << (t - 1)) - 1; int b = (m >> t) & 1; m = (m + a + b) >> t; // // Assemble the half from s, e (zero) and m. // return s | m; } else if (e == 0xff - (127 - 15)) { if (m == 0) { // // F is an infinity; convert f to a half // infinity with the same sign as f. // return s | 0x7c00; } else { // // F is a NAN; we produce a half NAN that preserves // the sign bit and the 10 leftmost bits of the // significand of f, with one exception: If the 10 // leftmost bits are all zero, the NAN would turn // into an infinity, so we have to set at least one // bit in the significand. // m >>= 13; return s | 0x7c00 | m | (m == 0); } } else { // // E is greater than zero. F is a normalized float. // We try to convert f to a normalized half. // // // Round to m to the nearest 10-bit value. In case of // a tie, round to the nearest even value. // m = m + 0x00000fff + ((m >> 13) & 1); if (m & 0x00800000) { m = 0; // overflow in significand, e += 1; // adjust exponent } // // Handle exponent overflow // if (e > 30) { overflow (); // Cause a hardware floating point overflow; return s | 0x7c00; // if this returns, the half becomes an } // infinity with the same sign as f. // // Assemble the half from s, e and m. // return s | (e << 10) | (m >> 13); } } //--------------------- // Stream I/O operators //--------------------- HALF_EXPORT ostream & operator << (ostream &os, half h) { os << float (h); return os; } HALF_EXPORT istream & operator >> (istream &is, half &h) { float f; is >> f; h = half (f); return is; } //--------------------------------------- // Functions to print the bit-layout of // floats and halfs, mostly for debugging //--------------------------------------- HALF_EXPORT void printBits (ostream &os, half h) { unsigned short b = h.bits(); for (int i = 15; i >= 0; i--) { os << (((b >> i) & 1)? '1': '0'); if (i == 15 || i == 10) os << ' '; } } HALF_EXPORT void printBits (ostream &os, float f) { half::uif x; x.f = f; for (int i = 31; i >= 0; i--) { os << (((x.i >> i) & 1)? '1': '0'); if (i == 31 || i == 23) os << ' '; } } HALF_EXPORT void printBits (char c[19], half h) { unsigned short b = h.bits(); for (int i = 15, j = 0; i >= 0; i--, j++) { c[j] = (((b >> i) & 1)? '1': '0'); if (i == 15 || i == 10) c[++j] = ' '; } c[18] = 0; } HALF_EXPORT void printBits (char c[35], float f) { half::uif x; x.f = f; for (int i = 31, j = 0; i >= 0; i--, j++) { c[j] = (((x.i >> i) & 1)? '1': '0'); if (i == 31 || i == 23) c[++j] = ' '; } c[34] = 0; } openexr-2.5.7/IlmBase/Half/half.h000066400000000000000000000427011406177042200164650ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// // Primary authors: // Florian Kainz // Rod Bogart //--------------------------------------------------------------------------- // // half -- a 16-bit floating point number class: // // Type half can represent positive and negative numbers whose // magnitude is between roughly 6.1e-5 and 6.5e+4 with a relative // error of 9.8e-4; numbers smaller than 6.1e-5 can be represented // with an absolute error of 6.0e-8. All integers from -2048 to // +2048 can be represented exactly. // // Type half behaves (almost) like the built-in C++ floating point // types. In arithmetic expressions, half, float and double can be // mixed freely. Here are a few examples: // // half a (3.5); // float b (a + sqrt (a)); // a += b; // b += a; // b = a + 7; // // Conversions from half to float are lossless; all half numbers // are exactly representable as floats. // // Conversions from float to half may not preserve a float's value // exactly. If a float is not representable as a half, then the // float value is rounded to the nearest representable half. If a // float value is exactly in the middle between the two closest // representable half values, then the float value is rounded to // the closest half whose least significant bit is zero. // // Overflows during float-to-half conversions cause arithmetic // exceptions. An overflow occurs when the float value to be // converted is too large to be represented as a half, or if the // float value is an infinity or a NAN. // // The implementation of type half makes the following assumptions // about the implementation of the built-in C++ types: // // float is an IEEE 754 single-precision number // sizeof (float) == 4 // sizeof (unsigned int) == sizeof (float) // alignof (unsigned int) == alignof (float) // sizeof (unsigned short) == 2 // //--------------------------------------------------------------------------- #ifndef _HALF_H_ #define _HALF_H_ #include "halfExport.h" // for definition of HALF_EXPORT #include class half { public: //------------- // Constructors //------------- half () = default; // no initialization half (float f); // rule of 5 ~half () = default; half (const half &) = default; half (half &&) noexcept = default; //-------------------- // Conversion to float //-------------------- operator float () const; //------------ // Unary minus //------------ half operator - () const; //----------- // Assignment //----------- half & operator = (const half &h) = default; half & operator = (half &&h) noexcept = default; half & operator = (float f); half & operator += (half h); half & operator += (float f); half & operator -= (half h); half & operator -= (float f); half & operator *= (half h); half & operator *= (float f); half & operator /= (half h); half & operator /= (float f); //--------------------------------------------------------- // Round to n-bit precision (n should be between 0 and 10). // After rounding, the significand's 10-n least significant // bits will be zero. //--------------------------------------------------------- half round (unsigned int n) const; //-------------------------------------------------------------------- // Classification: // // h.isFinite() returns true if h is a normalized number, // a denormalized number or zero // // h.isNormalized() returns true if h is a normalized number // // h.isDenormalized() returns true if h is a denormalized number // // h.isZero() returns true if h is zero // // h.isNan() returns true if h is a NAN // // h.isInfinity() returns true if h is a positive // or a negative infinity // // h.isNegative() returns true if the sign bit of h // is set (negative) //-------------------------------------------------------------------- bool isFinite () const; bool isNormalized () const; bool isDenormalized () const; bool isZero () const; bool isNan () const; bool isInfinity () const; bool isNegative () const; //-------------------------------------------- // Special values // // posInf() returns +infinity // // negInf() returns -infinity // // qNan() returns a NAN with the bit // pattern 0111111111111111 // // sNan() returns a NAN with the bit // pattern 0111110111111111 //-------------------------------------------- static half posInf (); static half negInf (); static half qNan (); static half sNan (); //-------------------------------------- // Access to the internal representation //-------------------------------------- HALF_EXPORT unsigned short bits () const; HALF_EXPORT void setBits (unsigned short bits); public: union uif { unsigned int i; float f; }; private: HALF_EXPORT static short convert (int i); HALF_EXPORT static float overflow (); unsigned short _h; HALF_EXPORT static const uif _toFloat[1 << 16]; HALF_EXPORT static const unsigned short _eLut[1 << 9]; }; //----------- // Stream I/O //----------- HALF_EXPORT std::ostream & operator << (std::ostream &os, half h); HALF_EXPORT std::istream & operator >> (std::istream &is, half &h); //---------- // Debugging //---------- HALF_EXPORT void printBits (std::ostream &os, half h); HALF_EXPORT void printBits (std::ostream &os, float f); HALF_EXPORT void printBits (char c[19], half h); HALF_EXPORT void printBits (char c[35], float f); //------------------------------------------------------------------------- // Limits // // Visual C++ will complain if HALF_MIN, HALF_NRM_MIN etc. are not float // constants, but at least one other compiler (gcc 2.96) produces incorrect // results if they are. //------------------------------------------------------------------------- #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER #define HALF_MIN 5.96046448e-08f // Smallest positive half #define HALF_NRM_MIN 6.10351562e-05f // Smallest positive normalized half #define HALF_MAX 65504.0f // Largest positive half #define HALF_EPSILON 0.00097656f // Smallest positive e for which // half (1.0 + e) != half (1.0) #else #define HALF_MIN 5.96046448e-08 // Smallest positive half #define HALF_NRM_MIN 6.10351562e-05 // Smallest positive normalized half #define HALF_MAX 65504.0 // Largest positive half #define HALF_EPSILON 0.00097656 // Smallest positive e for which // half (1.0 + e) != half (1.0) #endif #define HALF_MANT_DIG 11 // Number of digits in mantissa // (significand + hidden leading 1) // // floor( (HALF_MANT_DIG - 1) * log10(2) ) => 3.01... -> 3 #define HALF_DIG 3 // Number of base 10 digits that // can be represented without change // ceil(HALF_MANT_DIG * log10(2) + 1) => 4.31... -> 5 #define HALF_DECIMAL_DIG 5 // Number of base-10 digits that are // necessary to uniquely represent all // distinct values #define HALF_RADIX 2 // Base of the exponent #define HALF_MIN_EXP -13 // Minimum negative integer such that // HALF_RADIX raised to the power of // one less than that integer is a // normalized half #define HALF_MAX_EXP 16 // Maximum positive integer such that // HALF_RADIX raised to the power of // one less than that integer is a // normalized half #define HALF_MIN_10_EXP -4 // Minimum positive integer such // that 10 raised to that power is // a normalized half #define HALF_MAX_10_EXP 4 // Maximum positive integer such // that 10 raised to that power is // a normalized half //--------------------------------------------------------------------------- // // Implementation -- // // Representation of a float: // // We assume that a float, f, is an IEEE 754 single-precision // floating point number, whose bits are arranged as follows: // // 31 (msb) // | // | 30 23 // | | | // | | | 22 0 (lsb) // | | | | | // X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX // // s e m // // S is the sign-bit, e is the exponent and m is the significand. // // If e is between 1 and 254, f is a normalized number: // // s e-127 // f = (-1) * 2 * 1.m // // If e is 0, and m is not zero, f is a denormalized number: // // s -126 // f = (-1) * 2 * 0.m // // If e and m are both zero, f is zero: // // f = 0.0 // // If e is 255, f is an "infinity" or "not a number" (NAN), // depending on whether m is zero or not. // // Examples: // // 0 00000000 00000000000000000000000 = 0.0 // 0 01111110 00000000000000000000000 = 0.5 // 0 01111111 00000000000000000000000 = 1.0 // 0 10000000 00000000000000000000000 = 2.0 // 0 10000000 10000000000000000000000 = 3.0 // 1 10000101 11110000010000000000000 = -124.0625 // 0 11111111 00000000000000000000000 = +infinity // 1 11111111 00000000000000000000000 = -infinity // 0 11111111 10000000000000000000000 = NAN // 1 11111111 11111111111111111111111 = NAN // // Representation of a half: // // Here is the bit-layout for a half number, h: // // 15 (msb) // | // | 14 10 // | | | // | | | 9 0 (lsb) // | | | | | // X XXXXX XXXXXXXXXX // // s e m // // S is the sign-bit, e is the exponent and m is the significand. // // If e is between 1 and 30, h is a normalized number: // // s e-15 // h = (-1) * 2 * 1.m // // If e is 0, and m is not zero, h is a denormalized number: // // S -14 // h = (-1) * 2 * 0.m // // If e and m are both zero, h is zero: // // h = 0.0 // // If e is 31, h is an "infinity" or "not a number" (NAN), // depending on whether m is zero or not. // // Examples: // // 0 00000 0000000000 = 0.0 // 0 01110 0000000000 = 0.5 // 0 01111 0000000000 = 1.0 // 0 10000 0000000000 = 2.0 // 0 10000 1000000000 = 3.0 // 1 10101 1111000001 = -124.0625 // 0 11111 0000000000 = +infinity // 1 11111 0000000000 = -infinity // 0 11111 1000000000 = NAN // 1 11111 1111111111 = NAN // // Conversion: // // Converting from a float to a half requires some non-trivial bit // manipulations. In some cases, this makes conversion relatively // slow, but the most common case is accelerated via table lookups. // // Converting back from a half to a float is easier because we don't // have to do any rounding. In addition, there are only 65536 // different half numbers; we can convert each of those numbers once // and store the results in a table. Later, all conversions can be // done using only simple table lookups. // //--------------------------------------------------------------------------- //---------------------------- // Half-from-float constructor //---------------------------- inline half::half (float f) { uif x; x.f = f; if (f == 0) { // // Common special case - zero. // Preserve the zero's sign bit. // _h = (x.i >> 16); } else { // // We extract the combined sign and exponent, e, from our // floating-point number, f. Then we convert e to the sign // and exponent of the half number via a table lookup. // // For the most common case, where a normalized half is produced, // the table lookup returns a non-zero value; in this case, all // we have to do is round f's significand to 10 bits and combine // the result with e. // // For all other cases (overflow, zeroes, denormalized numbers // resulting from underflow, infinities and NANs), the table // lookup returns zero, and we call a longer, non-inline function // to do the float-to-half conversion. // int e = (x.i >> 23) & 0x000001ff; e = _eLut[e]; if (e) { // // Simple case - round the significand, m, to 10 // bits and combine it with the sign and exponent. // int m = x.i & 0x007fffff; _h = e + ((m + 0x00000fff + ((m >> 13) & 1)) >> 13); } else { // // Difficult case - call a function. // _h = convert (x.i); } } } //------------------------------------------ // Half-to-float conversion via table lookup //------------------------------------------ inline half::operator float () const { return _toFloat[_h].f; } //------------------------- // Round to n-bit precision //------------------------- inline half half::round (unsigned int n) const { // // Parameter check. // if (n >= 10) return *this; // // Disassemble h into the sign, s, // and the combined exponent and significand, e. // unsigned short s = _h & 0x8000; unsigned short e = _h & 0x7fff; // // Round the exponent and significand to the nearest value // where ones occur only in the (10-n) most significant bits. // Note that the exponent adjusts automatically if rounding // up causes the significand to overflow. // e >>= 9 - n; e += e & 1; e <<= 9 - n; // // Check for exponent overflow. // if (e >= 0x7c00) { // // Overflow occurred -- truncate instead of rounding. // e = _h; e >>= 10 - n; e <<= 10 - n; } // // Put the original sign bit back. // half h; h._h = s | e; return h; } //----------------------- // Other inline functions //----------------------- inline half half::operator - () const { half h; h._h = _h ^ 0x8000; return h; } inline half & half::operator = (float f) { *this = half (f); return *this; } inline half & half::operator += (half h) { *this = half (float (*this) + float (h)); return *this; } inline half & half::operator += (float f) { *this = half (float (*this) + f); return *this; } inline half & half::operator -= (half h) { *this = half (float (*this) - float (h)); return *this; } inline half & half::operator -= (float f) { *this = half (float (*this) - f); return *this; } inline half & half::operator *= (half h) { *this = half (float (*this) * float (h)); return *this; } inline half & half::operator *= (float f) { *this = half (float (*this) * f); return *this; } inline half & half::operator /= (half h) { *this = half (float (*this) / float (h)); return *this; } inline half & half::operator /= (float f) { *this = half (float (*this) / f); return *this; } inline bool half::isFinite () const { unsigned short e = (_h >> 10) & 0x001f; return e < 31; } inline bool half::isNormalized () const { unsigned short e = (_h >> 10) & 0x001f; return e > 0 && e < 31; } inline bool half::isDenormalized () const { unsigned short e = (_h >> 10) & 0x001f; unsigned short m = _h & 0x3ff; return e == 0 && m != 0; } inline bool half::isZero () const { return (_h & 0x7fff) == 0; } inline bool half::isNan () const { unsigned short e = (_h >> 10) & 0x001f; unsigned short m = _h & 0x3ff; return e == 31 && m != 0; } inline bool half::isInfinity () const { unsigned short e = (_h >> 10) & 0x001f; unsigned short m = _h & 0x3ff; return e == 31 && m == 0; } inline bool half::isNegative () const { return (_h & 0x8000) != 0; } inline half half::posInf () { half h; h._h = 0x7c00; return h; } inline half half::negInf () { half h; h._h = 0xfc00; return h; } inline half half::qNan () { half h; h._h = 0x7fff; return h; } inline half half::sNan () { half h; h._h = 0x7dff; return h; } inline unsigned short half::bits () const { return _h; } inline void half::setBits (unsigned short bits) { _h = bits; } #endif openexr-2.5.7/IlmBase/Half/halfExport.h000066400000000000000000000041331406177042200176640ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2008, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef HALFEXPORT_H #define HALFEXPORT_H #if defined(OPENEXR_DLL) #if defined(HALF_EXPORTS) #define HALF_EXPORT __declspec(dllexport) #else #define HALF_EXPORT __declspec(dllimport) #endif #define HALF_EXPORT_CONST #else #define HALF_EXPORT #define HALF_EXPORT_CONST const #endif #endif // #ifndef HALFEXPORT_H openexr-2.5.7/IlmBase/Half/halfFunction.h000066400000000000000000000117601406177042200201740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// // Primary authors: // Florian Kainz // Rod Bogart //--------------------------------------------------------------------------- // // halfFunction -- a class for fast evaluation // of half --> T functions // // The constructor for a halfFunction object, // // halfFunction (function, // domainMin, domainMax, // defaultValue, // posInfValue, negInfValue, // nanValue); // // evaluates the function for all finite half values in the interval // [domainMin, domainMax], and stores the results in a lookup table. // For finite half values that are not in [domainMin, domainMax], the // constructor stores defaultValue in the table. For positive infinity, // negative infinity and NANs, posInfValue, negInfValue and nanValue // are stored in the table. // // The tabulated function can then be evaluated quickly for arbitrary // half values by calling the the halfFunction object's operator() // method. // // Example: // // #include // #include // // halfFunction hsin (sin); // // halfFunction hsqrt (sqrt, // function // 0, HALF_MAX, // domain // half::qNan(), // sqrt(x) for x < 0 // half::posInf(), // sqrt(+inf) // half::qNan(), // sqrt(-inf) // half::qNan()); // sqrt(nan) // // half x = hsin (1); // half y = hsqrt (3.5); // //--------------------------------------------------------------------------- #ifndef _HALF_FUNCTION_H_ #define _HALF_FUNCTION_H_ #include "half.h" #include "IlmBaseConfig.h" #ifndef ILMBASE_HAVE_LARGE_STACK #include // need this for memset #else #endif #include template class halfFunction { public: //------------ // Constructor //------------ template halfFunction (Function f, half domainMin = -HALF_MAX, half domainMax = HALF_MAX, T defaultValue = 0, T posInfValue = 0, T negInfValue = 0, T nanValue = 0); #ifndef ILMBASE_HAVE_LARGE_STACK ~halfFunction () { delete [] _lut; } halfFunction (const halfFunction &) = delete; halfFunction& operator= (const halfFunction &) = delete; halfFunction (halfFunction &&) = delete; halfFunction& operator= (halfFunction &&) = delete; #endif //----------- // Evaluation //----------- T operator () (half x) const; private: #ifdef ILMBASE_HAVE_LARGE_STACK T _lut[1 << 16]; #else T * _lut; #endif }; //--------------- // Implementation //--------------- template template halfFunction::halfFunction (Function f, half domainMin, half domainMax, T defaultValue, T posInfValue, T negInfValue, T nanValue) { #ifndef ILMBASE_HAVE_LARGE_STACK _lut = new T[1<<16]; #endif for (int i = 0; i < (1 << 16); i++) { half x; x.setBits (i); if (x.isNan()) _lut[i] = nanValue; else if (x.isInfinity()) _lut[i] = x.isNegative()? negInfValue: posInfValue; else if (x < domainMin || x > domainMax) _lut[i] = defaultValue; else _lut[i] = f (x); } } template inline T halfFunction::operator () (half x) const { return _lut[x.bits()]; } #endif openexr-2.5.7/IlmBase/Half/halfLimits.h000066400000000000000000000076201406177042200176500ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// // Primary authors: // Florian Kainz // Rod Bogart #ifndef INCLUDED_HALF_LIMITS_H #define INCLUDED_HALF_LIMITS_H //------------------------------------------------------------------------ // // C++ standard library-style numeric_limits for class half // //------------------------------------------------------------------------ #include #include "half.h" namespace std { template <> class numeric_limits { public: static const bool is_specialized = true; static half min () throw () {return HALF_NRM_MIN;} static half max () throw () {return HALF_MAX;} static const int digits = HALF_MANT_DIG; static const int digits10 = HALF_DIG; static const bool is_signed = true; static const bool is_integer = false; static const bool is_exact = false; static const int radix = HALF_RADIX; static half epsilon () throw () {return HALF_EPSILON;} static half round_error () throw () {return HALF_EPSILON / 2;} static const int min_exponent = HALF_MIN_EXP; static const int min_exponent10 = HALF_MIN_10_EXP; static const int max_exponent = HALF_MAX_EXP; static const int max_exponent10 = HALF_MAX_10_EXP; static const bool has_infinity = true; static const bool has_quiet_NaN = true; static const bool has_signaling_NaN = true; static const float_denorm_style has_denorm = denorm_present; static const bool has_denorm_loss = false; static half infinity () throw () {return half::posInf();} static half quiet_NaN () throw () {return half::qNan();} static half signaling_NaN () throw () {return half::sNan();} static half denorm_min () throw () {return HALF_MIN;} static const bool is_iec559 = false; static const bool is_bounded = false; static const bool is_modulo = false; static const bool traps = true; static const bool tinyness_before = false; static const float_round_style round_style = round_to_nearest; #if __cplusplus >= 201103L // C++11 additions. static constexpr int max_digits10 = HALF_DECIMAL_DIG; static half lowest () {return -HALF_MAX;} #endif }; } // namespace std #endif openexr-2.5.7/IlmBase/Half/toFloat.cpp000066400000000000000000000076651406177042200175300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // // toFloat // // A program to generate the lookup table for half-to-float // conversion needed by class half. // The program loops over all 65536 possible half numbers, // converts each of them to a float, and prints the result. // //--------------------------------------------------------------------------- #include #include using namespace std; //--------------------------------------------------- // Interpret an unsigned short bit pattern as a half, // and convert that half to the corresponding float's // bit pattern. //--------------------------------------------------- unsigned int halfToFloat (unsigned short y) { int s = (y >> 15) & 0x00000001; int e = (y >> 10) & 0x0000001f; int m = y & 0x000003ff; if (e == 0) { if (m == 0) { // // Plus or minus zero // return s << 31; } else { // // Denormalized number -- renormalize it // while (!(m & 0x00000400)) { m <<= 1; e -= 1; } e += 1; m &= ~0x00000400; } } else if (e == 31) { if (m == 0) { // // Positive or negative infinity // return (s << 31) | 0x7f800000; } else { // // Nan -- preserve sign and significand bits // return (s << 31) | 0x7f800000 | (m << 13); } } // // Normalized number // e = e + (127 - 15); m = m << 13; // // Assemble s, e and m. // return (s << 31) | (e << 23) | m; } //--------------------------------------------- // Main - prints the half-to-float lookup table //--------------------------------------------- int main () { cout.precision (9); cout.setf (ios_base::hex, ios_base::basefield); cout << "//\n" "// This is an automatically generated file.\n" "// Do not edit.\n" "//\n\n"; cout << "{\n "; const int iMax = (1 << 16); for (int i = 0; i < iMax; i++) { cout << "{0x" << setfill ('0') << setw (8) << halfToFloat (i) << "}, "; if (i % 4 == 3) { cout << "\n"; if (i < iMax - 1) cout << " "; } } cout << "};\n"; return 0; } openexr-2.5.7/IlmBase/Half/toFloat.h000066400000000000000000036401101406177042200171640ustar00rootroot00000000000000// // This is an automatically generated file. // Do not edit. // { {0x00000000}, {0x33800000}, {0x34000000}, {0x34400000}, {0x34800000}, {0x34a00000}, {0x34c00000}, {0x34e00000}, {0x35000000}, {0x35100000}, {0x35200000}, {0x35300000}, {0x35400000}, {0x35500000}, {0x35600000}, {0x35700000}, {0x35800000}, {0x35880000}, {0x35900000}, {0x35980000}, {0x35a00000}, {0x35a80000}, {0x35b00000}, {0x35b80000}, {0x35c00000}, {0x35c80000}, {0x35d00000}, {0x35d80000}, {0x35e00000}, {0x35e80000}, {0x35f00000}, {0x35f80000}, {0x36000000}, {0x36040000}, {0x36080000}, {0x360c0000}, {0x36100000}, {0x36140000}, {0x36180000}, {0x361c0000}, {0x36200000}, {0x36240000}, {0x36280000}, {0x362c0000}, {0x36300000}, {0x36340000}, {0x36380000}, {0x363c0000}, {0x36400000}, {0x36440000}, {0x36480000}, {0x364c0000}, {0x36500000}, {0x36540000}, {0x36580000}, {0x365c0000}, {0x36600000}, {0x36640000}, {0x36680000}, {0x366c0000}, {0x36700000}, {0x36740000}, {0x36780000}, {0x367c0000}, {0x36800000}, {0x36820000}, {0x36840000}, {0x36860000}, {0x36880000}, {0x368a0000}, {0x368c0000}, {0x368e0000}, {0x36900000}, {0x36920000}, {0x36940000}, {0x36960000}, {0x36980000}, {0x369a0000}, {0x369c0000}, {0x369e0000}, {0x36a00000}, {0x36a20000}, {0x36a40000}, {0x36a60000}, {0x36a80000}, {0x36aa0000}, {0x36ac0000}, {0x36ae0000}, {0x36b00000}, {0x36b20000}, {0x36b40000}, {0x36b60000}, {0x36b80000}, {0x36ba0000}, {0x36bc0000}, {0x36be0000}, {0x36c00000}, {0x36c20000}, {0x36c40000}, {0x36c60000}, {0x36c80000}, {0x36ca0000}, {0x36cc0000}, {0x36ce0000}, {0x36d00000}, {0x36d20000}, {0x36d40000}, {0x36d60000}, {0x36d80000}, {0x36da0000}, {0x36dc0000}, {0x36de0000}, {0x36e00000}, {0x36e20000}, {0x36e40000}, {0x36e60000}, {0x36e80000}, {0x36ea0000}, {0x36ec0000}, {0x36ee0000}, {0x36f00000}, {0x36f20000}, {0x36f40000}, {0x36f60000}, {0x36f80000}, {0x36fa0000}, {0x36fc0000}, {0x36fe0000}, {0x37000000}, {0x37010000}, {0x37020000}, {0x37030000}, {0x37040000}, {0x37050000}, {0x37060000}, {0x37070000}, {0x37080000}, {0x37090000}, {0x370a0000}, {0x370b0000}, {0x370c0000}, {0x370d0000}, {0x370e0000}, {0x370f0000}, {0x37100000}, {0x37110000}, {0x37120000}, {0x37130000}, {0x37140000}, {0x37150000}, {0x37160000}, {0x37170000}, {0x37180000}, {0x37190000}, {0x371a0000}, {0x371b0000}, {0x371c0000}, {0x371d0000}, {0x371e0000}, {0x371f0000}, {0x37200000}, {0x37210000}, {0x37220000}, {0x37230000}, {0x37240000}, {0x37250000}, {0x37260000}, {0x37270000}, {0x37280000}, {0x37290000}, {0x372a0000}, {0x372b0000}, {0x372c0000}, {0x372d0000}, {0x372e0000}, {0x372f0000}, {0x37300000}, {0x37310000}, {0x37320000}, {0x37330000}, {0x37340000}, {0x37350000}, {0x37360000}, {0x37370000}, {0x37380000}, {0x37390000}, {0x373a0000}, {0x373b0000}, {0x373c0000}, {0x373d0000}, {0x373e0000}, {0x373f0000}, {0x37400000}, {0x37410000}, {0x37420000}, {0x37430000}, {0x37440000}, {0x37450000}, {0x37460000}, {0x37470000}, {0x37480000}, {0x37490000}, {0x374a0000}, {0x374b0000}, {0x374c0000}, {0x374d0000}, {0x374e0000}, {0x374f0000}, {0x37500000}, {0x37510000}, {0x37520000}, {0x37530000}, {0x37540000}, {0x37550000}, {0x37560000}, {0x37570000}, {0x37580000}, {0x37590000}, {0x375a0000}, {0x375b0000}, {0x375c0000}, {0x375d0000}, {0x375e0000}, {0x375f0000}, {0x37600000}, {0x37610000}, {0x37620000}, {0x37630000}, {0x37640000}, {0x37650000}, {0x37660000}, {0x37670000}, {0x37680000}, {0x37690000}, {0x376a0000}, {0x376b0000}, {0x376c0000}, {0x376d0000}, {0x376e0000}, {0x376f0000}, {0x37700000}, {0x37710000}, {0x37720000}, {0x37730000}, {0x37740000}, {0x37750000}, {0x37760000}, {0x37770000}, {0x37780000}, {0x37790000}, {0x377a0000}, {0x377b0000}, {0x377c0000}, {0x377d0000}, {0x377e0000}, {0x377f0000}, {0x37800000}, {0x37808000}, {0x37810000}, {0x37818000}, {0x37820000}, {0x37828000}, {0x37830000}, {0x37838000}, {0x37840000}, {0x37848000}, {0x37850000}, {0x37858000}, {0x37860000}, {0x37868000}, {0x37870000}, {0x37878000}, {0x37880000}, {0x37888000}, {0x37890000}, {0x37898000}, {0x378a0000}, {0x378a8000}, {0x378b0000}, {0x378b8000}, {0x378c0000}, {0x378c8000}, {0x378d0000}, {0x378d8000}, {0x378e0000}, {0x378e8000}, {0x378f0000}, {0x378f8000}, {0x37900000}, {0x37908000}, {0x37910000}, {0x37918000}, {0x37920000}, {0x37928000}, {0x37930000}, {0x37938000}, {0x37940000}, {0x37948000}, {0x37950000}, {0x37958000}, {0x37960000}, {0x37968000}, {0x37970000}, {0x37978000}, {0x37980000}, {0x37988000}, {0x37990000}, {0x37998000}, {0x379a0000}, {0x379a8000}, {0x379b0000}, {0x379b8000}, {0x379c0000}, {0x379c8000}, {0x379d0000}, {0x379d8000}, {0x379e0000}, {0x379e8000}, {0x379f0000}, {0x379f8000}, {0x37a00000}, {0x37a08000}, {0x37a10000}, {0x37a18000}, {0x37a20000}, {0x37a28000}, {0x37a30000}, {0x37a38000}, {0x37a40000}, {0x37a48000}, {0x37a50000}, {0x37a58000}, {0x37a60000}, {0x37a68000}, {0x37a70000}, {0x37a78000}, {0x37a80000}, {0x37a88000}, {0x37a90000}, {0x37a98000}, {0x37aa0000}, {0x37aa8000}, {0x37ab0000}, {0x37ab8000}, {0x37ac0000}, {0x37ac8000}, {0x37ad0000}, {0x37ad8000}, {0x37ae0000}, {0x37ae8000}, {0x37af0000}, {0x37af8000}, {0x37b00000}, {0x37b08000}, {0x37b10000}, {0x37b18000}, {0x37b20000}, {0x37b28000}, {0x37b30000}, {0x37b38000}, {0x37b40000}, {0x37b48000}, {0x37b50000}, {0x37b58000}, {0x37b60000}, {0x37b68000}, {0x37b70000}, {0x37b78000}, {0x37b80000}, {0x37b88000}, {0x37b90000}, {0x37b98000}, {0x37ba0000}, {0x37ba8000}, {0x37bb0000}, {0x37bb8000}, {0x37bc0000}, {0x37bc8000}, {0x37bd0000}, {0x37bd8000}, {0x37be0000}, {0x37be8000}, {0x37bf0000}, {0x37bf8000}, {0x37c00000}, {0x37c08000}, {0x37c10000}, {0x37c18000}, {0x37c20000}, {0x37c28000}, {0x37c30000}, {0x37c38000}, {0x37c40000}, {0x37c48000}, {0x37c50000}, {0x37c58000}, {0x37c60000}, {0x37c68000}, {0x37c70000}, {0x37c78000}, {0x37c80000}, {0x37c88000}, {0x37c90000}, {0x37c98000}, {0x37ca0000}, {0x37ca8000}, {0x37cb0000}, {0x37cb8000}, {0x37cc0000}, {0x37cc8000}, {0x37cd0000}, {0x37cd8000}, {0x37ce0000}, {0x37ce8000}, {0x37cf0000}, {0x37cf8000}, {0x37d00000}, {0x37d08000}, {0x37d10000}, {0x37d18000}, {0x37d20000}, {0x37d28000}, {0x37d30000}, {0x37d38000}, {0x37d40000}, {0x37d48000}, {0x37d50000}, {0x37d58000}, {0x37d60000}, {0x37d68000}, {0x37d70000}, {0x37d78000}, {0x37d80000}, {0x37d88000}, {0x37d90000}, {0x37d98000}, {0x37da0000}, {0x37da8000}, {0x37db0000}, {0x37db8000}, {0x37dc0000}, {0x37dc8000}, {0x37dd0000}, {0x37dd8000}, {0x37de0000}, {0x37de8000}, {0x37df0000}, {0x37df8000}, {0x37e00000}, {0x37e08000}, {0x37e10000}, {0x37e18000}, {0x37e20000}, {0x37e28000}, {0x37e30000}, {0x37e38000}, {0x37e40000}, {0x37e48000}, {0x37e50000}, {0x37e58000}, {0x37e60000}, {0x37e68000}, {0x37e70000}, {0x37e78000}, {0x37e80000}, {0x37e88000}, {0x37e90000}, {0x37e98000}, {0x37ea0000}, {0x37ea8000}, {0x37eb0000}, {0x37eb8000}, {0x37ec0000}, {0x37ec8000}, {0x37ed0000}, {0x37ed8000}, {0x37ee0000}, {0x37ee8000}, {0x37ef0000}, {0x37ef8000}, {0x37f00000}, {0x37f08000}, {0x37f10000}, {0x37f18000}, {0x37f20000}, {0x37f28000}, {0x37f30000}, {0x37f38000}, {0x37f40000}, {0x37f48000}, {0x37f50000}, {0x37f58000}, {0x37f60000}, {0x37f68000}, {0x37f70000}, {0x37f78000}, {0x37f80000}, {0x37f88000}, {0x37f90000}, {0x37f98000}, {0x37fa0000}, {0x37fa8000}, {0x37fb0000}, {0x37fb8000}, {0x37fc0000}, {0x37fc8000}, {0x37fd0000}, {0x37fd8000}, {0x37fe0000}, {0x37fe8000}, {0x37ff0000}, {0x37ff8000}, {0x38000000}, {0x38004000}, {0x38008000}, {0x3800c000}, {0x38010000}, {0x38014000}, {0x38018000}, {0x3801c000}, {0x38020000}, {0x38024000}, {0x38028000}, {0x3802c000}, {0x38030000}, {0x38034000}, {0x38038000}, {0x3803c000}, {0x38040000}, {0x38044000}, {0x38048000}, {0x3804c000}, {0x38050000}, {0x38054000}, {0x38058000}, {0x3805c000}, {0x38060000}, {0x38064000}, {0x38068000}, {0x3806c000}, {0x38070000}, {0x38074000}, {0x38078000}, {0x3807c000}, {0x38080000}, {0x38084000}, {0x38088000}, {0x3808c000}, {0x38090000}, {0x38094000}, {0x38098000}, {0x3809c000}, {0x380a0000}, {0x380a4000}, {0x380a8000}, {0x380ac000}, {0x380b0000}, {0x380b4000}, {0x380b8000}, {0x380bc000}, {0x380c0000}, {0x380c4000}, {0x380c8000}, {0x380cc000}, {0x380d0000}, {0x380d4000}, {0x380d8000}, {0x380dc000}, {0x380e0000}, {0x380e4000}, {0x380e8000}, {0x380ec000}, {0x380f0000}, {0x380f4000}, {0x380f8000}, {0x380fc000}, {0x38100000}, {0x38104000}, {0x38108000}, {0x3810c000}, {0x38110000}, {0x38114000}, {0x38118000}, {0x3811c000}, {0x38120000}, {0x38124000}, {0x38128000}, {0x3812c000}, {0x38130000}, {0x38134000}, {0x38138000}, {0x3813c000}, {0x38140000}, {0x38144000}, {0x38148000}, {0x3814c000}, {0x38150000}, {0x38154000}, {0x38158000}, {0x3815c000}, {0x38160000}, {0x38164000}, {0x38168000}, {0x3816c000}, {0x38170000}, {0x38174000}, {0x38178000}, {0x3817c000}, {0x38180000}, {0x38184000}, {0x38188000}, {0x3818c000}, {0x38190000}, {0x38194000}, {0x38198000}, {0x3819c000}, {0x381a0000}, {0x381a4000}, {0x381a8000}, {0x381ac000}, {0x381b0000}, {0x381b4000}, {0x381b8000}, {0x381bc000}, {0x381c0000}, {0x381c4000}, {0x381c8000}, {0x381cc000}, {0x381d0000}, {0x381d4000}, {0x381d8000}, {0x381dc000}, {0x381e0000}, {0x381e4000}, {0x381e8000}, {0x381ec000}, {0x381f0000}, {0x381f4000}, {0x381f8000}, {0x381fc000}, {0x38200000}, {0x38204000}, {0x38208000}, {0x3820c000}, {0x38210000}, {0x38214000}, {0x38218000}, {0x3821c000}, {0x38220000}, {0x38224000}, {0x38228000}, {0x3822c000}, {0x38230000}, {0x38234000}, {0x38238000}, {0x3823c000}, {0x38240000}, {0x38244000}, {0x38248000}, {0x3824c000}, {0x38250000}, {0x38254000}, {0x38258000}, {0x3825c000}, {0x38260000}, {0x38264000}, {0x38268000}, {0x3826c000}, {0x38270000}, {0x38274000}, {0x38278000}, {0x3827c000}, {0x38280000}, {0x38284000}, {0x38288000}, {0x3828c000}, {0x38290000}, {0x38294000}, {0x38298000}, {0x3829c000}, {0x382a0000}, {0x382a4000}, {0x382a8000}, {0x382ac000}, {0x382b0000}, {0x382b4000}, {0x382b8000}, {0x382bc000}, {0x382c0000}, {0x382c4000}, {0x382c8000}, {0x382cc000}, {0x382d0000}, {0x382d4000}, {0x382d8000}, {0x382dc000}, {0x382e0000}, {0x382e4000}, {0x382e8000}, {0x382ec000}, {0x382f0000}, {0x382f4000}, {0x382f8000}, {0x382fc000}, {0x38300000}, {0x38304000}, {0x38308000}, {0x3830c000}, {0x38310000}, {0x38314000}, {0x38318000}, {0x3831c000}, {0x38320000}, {0x38324000}, {0x38328000}, {0x3832c000}, {0x38330000}, {0x38334000}, {0x38338000}, {0x3833c000}, {0x38340000}, {0x38344000}, {0x38348000}, {0x3834c000}, {0x38350000}, {0x38354000}, {0x38358000}, {0x3835c000}, {0x38360000}, {0x38364000}, {0x38368000}, {0x3836c000}, {0x38370000}, {0x38374000}, {0x38378000}, {0x3837c000}, {0x38380000}, {0x38384000}, {0x38388000}, {0x3838c000}, {0x38390000}, {0x38394000}, {0x38398000}, {0x3839c000}, {0x383a0000}, {0x383a4000}, {0x383a8000}, {0x383ac000}, {0x383b0000}, {0x383b4000}, {0x383b8000}, {0x383bc000}, {0x383c0000}, {0x383c4000}, {0x383c8000}, {0x383cc000}, {0x383d0000}, {0x383d4000}, {0x383d8000}, {0x383dc000}, {0x383e0000}, {0x383e4000}, {0x383e8000}, {0x383ec000}, {0x383f0000}, {0x383f4000}, {0x383f8000}, {0x383fc000}, {0x38400000}, {0x38404000}, {0x38408000}, {0x3840c000}, {0x38410000}, {0x38414000}, {0x38418000}, {0x3841c000}, {0x38420000}, {0x38424000}, {0x38428000}, {0x3842c000}, {0x38430000}, {0x38434000}, {0x38438000}, {0x3843c000}, {0x38440000}, {0x38444000}, {0x38448000}, {0x3844c000}, {0x38450000}, {0x38454000}, {0x38458000}, {0x3845c000}, {0x38460000}, {0x38464000}, {0x38468000}, {0x3846c000}, {0x38470000}, {0x38474000}, {0x38478000}, {0x3847c000}, {0x38480000}, {0x38484000}, {0x38488000}, {0x3848c000}, {0x38490000}, {0x38494000}, {0x38498000}, {0x3849c000}, {0x384a0000}, {0x384a4000}, {0x384a8000}, {0x384ac000}, {0x384b0000}, {0x384b4000}, {0x384b8000}, {0x384bc000}, {0x384c0000}, {0x384c4000}, {0x384c8000}, {0x384cc000}, {0x384d0000}, {0x384d4000}, {0x384d8000}, {0x384dc000}, {0x384e0000}, {0x384e4000}, {0x384e8000}, {0x384ec000}, {0x384f0000}, {0x384f4000}, {0x384f8000}, {0x384fc000}, {0x38500000}, {0x38504000}, {0x38508000}, {0x3850c000}, {0x38510000}, {0x38514000}, {0x38518000}, {0x3851c000}, {0x38520000}, {0x38524000}, {0x38528000}, {0x3852c000}, {0x38530000}, {0x38534000}, {0x38538000}, {0x3853c000}, {0x38540000}, {0x38544000}, {0x38548000}, {0x3854c000}, {0x38550000}, {0x38554000}, {0x38558000}, {0x3855c000}, {0x38560000}, {0x38564000}, {0x38568000}, {0x3856c000}, {0x38570000}, {0x38574000}, {0x38578000}, {0x3857c000}, {0x38580000}, {0x38584000}, {0x38588000}, {0x3858c000}, {0x38590000}, {0x38594000}, {0x38598000}, {0x3859c000}, {0x385a0000}, {0x385a4000}, {0x385a8000}, {0x385ac000}, {0x385b0000}, {0x385b4000}, {0x385b8000}, {0x385bc000}, {0x385c0000}, {0x385c4000}, {0x385c8000}, {0x385cc000}, {0x385d0000}, {0x385d4000}, {0x385d8000}, {0x385dc000}, {0x385e0000}, {0x385e4000}, {0x385e8000}, {0x385ec000}, {0x385f0000}, {0x385f4000}, {0x385f8000}, {0x385fc000}, {0x38600000}, {0x38604000}, {0x38608000}, {0x3860c000}, {0x38610000}, {0x38614000}, {0x38618000}, {0x3861c000}, {0x38620000}, {0x38624000}, {0x38628000}, {0x3862c000}, {0x38630000}, {0x38634000}, {0x38638000}, {0x3863c000}, {0x38640000}, {0x38644000}, {0x38648000}, {0x3864c000}, {0x38650000}, {0x38654000}, {0x38658000}, {0x3865c000}, {0x38660000}, {0x38664000}, {0x38668000}, {0x3866c000}, {0x38670000}, {0x38674000}, {0x38678000}, {0x3867c000}, {0x38680000}, {0x38684000}, {0x38688000}, {0x3868c000}, {0x38690000}, {0x38694000}, {0x38698000}, {0x3869c000}, {0x386a0000}, {0x386a4000}, {0x386a8000}, {0x386ac000}, {0x386b0000}, {0x386b4000}, {0x386b8000}, {0x386bc000}, {0x386c0000}, {0x386c4000}, {0x386c8000}, {0x386cc000}, {0x386d0000}, {0x386d4000}, {0x386d8000}, {0x386dc000}, {0x386e0000}, {0x386e4000}, {0x386e8000}, {0x386ec000}, {0x386f0000}, {0x386f4000}, {0x386f8000}, {0x386fc000}, {0x38700000}, {0x38704000}, {0x38708000}, {0x3870c000}, {0x38710000}, {0x38714000}, {0x38718000}, {0x3871c000}, {0x38720000}, {0x38724000}, {0x38728000}, {0x3872c000}, {0x38730000}, {0x38734000}, {0x38738000}, {0x3873c000}, {0x38740000}, {0x38744000}, {0x38748000}, {0x3874c000}, {0x38750000}, {0x38754000}, {0x38758000}, {0x3875c000}, {0x38760000}, {0x38764000}, {0x38768000}, {0x3876c000}, {0x38770000}, {0x38774000}, {0x38778000}, {0x3877c000}, {0x38780000}, {0x38784000}, {0x38788000}, {0x3878c000}, {0x38790000}, {0x38794000}, {0x38798000}, {0x3879c000}, {0x387a0000}, {0x387a4000}, {0x387a8000}, {0x387ac000}, {0x387b0000}, {0x387b4000}, {0x387b8000}, {0x387bc000}, {0x387c0000}, {0x387c4000}, {0x387c8000}, {0x387cc000}, {0x387d0000}, {0x387d4000}, {0x387d8000}, {0x387dc000}, {0x387e0000}, {0x387e4000}, {0x387e8000}, {0x387ec000}, {0x387f0000}, {0x387f4000}, {0x387f8000}, {0x387fc000}, {0x38800000}, {0x38802000}, {0x38804000}, {0x38806000}, {0x38808000}, {0x3880a000}, {0x3880c000}, {0x3880e000}, {0x38810000}, {0x38812000}, {0x38814000}, {0x38816000}, {0x38818000}, {0x3881a000}, {0x3881c000}, {0x3881e000}, {0x38820000}, {0x38822000}, {0x38824000}, {0x38826000}, {0x38828000}, {0x3882a000}, {0x3882c000}, {0x3882e000}, {0x38830000}, {0x38832000}, {0x38834000}, {0x38836000}, {0x38838000}, {0x3883a000}, {0x3883c000}, {0x3883e000}, {0x38840000}, {0x38842000}, {0x38844000}, {0x38846000}, {0x38848000}, {0x3884a000}, {0x3884c000}, {0x3884e000}, {0x38850000}, {0x38852000}, {0x38854000}, {0x38856000}, {0x38858000}, {0x3885a000}, {0x3885c000}, {0x3885e000}, {0x38860000}, {0x38862000}, {0x38864000}, {0x38866000}, {0x38868000}, {0x3886a000}, {0x3886c000}, {0x3886e000}, {0x38870000}, {0x38872000}, {0x38874000}, {0x38876000}, {0x38878000}, {0x3887a000}, {0x3887c000}, {0x3887e000}, {0x38880000}, {0x38882000}, {0x38884000}, {0x38886000}, {0x38888000}, {0x3888a000}, {0x3888c000}, {0x3888e000}, {0x38890000}, {0x38892000}, {0x38894000}, {0x38896000}, {0x38898000}, {0x3889a000}, {0x3889c000}, {0x3889e000}, {0x388a0000}, {0x388a2000}, {0x388a4000}, {0x388a6000}, {0x388a8000}, {0x388aa000}, {0x388ac000}, {0x388ae000}, {0x388b0000}, {0x388b2000}, {0x388b4000}, {0x388b6000}, {0x388b8000}, {0x388ba000}, {0x388bc000}, {0x388be000}, {0x388c0000}, {0x388c2000}, {0x388c4000}, {0x388c6000}, {0x388c8000}, {0x388ca000}, {0x388cc000}, {0x388ce000}, {0x388d0000}, {0x388d2000}, {0x388d4000}, {0x388d6000}, {0x388d8000}, {0x388da000}, {0x388dc000}, {0x388de000}, {0x388e0000}, {0x388e2000}, {0x388e4000}, {0x388e6000}, {0x388e8000}, {0x388ea000}, {0x388ec000}, {0x388ee000}, {0x388f0000}, {0x388f2000}, {0x388f4000}, {0x388f6000}, {0x388f8000}, {0x388fa000}, {0x388fc000}, {0x388fe000}, {0x38900000}, {0x38902000}, {0x38904000}, {0x38906000}, {0x38908000}, {0x3890a000}, {0x3890c000}, {0x3890e000}, {0x38910000}, {0x38912000}, {0x38914000}, {0x38916000}, {0x38918000}, {0x3891a000}, {0x3891c000}, {0x3891e000}, {0x38920000}, {0x38922000}, {0x38924000}, {0x38926000}, {0x38928000}, {0x3892a000}, {0x3892c000}, {0x3892e000}, {0x38930000}, {0x38932000}, {0x38934000}, {0x38936000}, {0x38938000}, {0x3893a000}, {0x3893c000}, {0x3893e000}, {0x38940000}, {0x38942000}, {0x38944000}, {0x38946000}, {0x38948000}, {0x3894a000}, {0x3894c000}, {0x3894e000}, {0x38950000}, {0x38952000}, {0x38954000}, {0x38956000}, {0x38958000}, {0x3895a000}, {0x3895c000}, {0x3895e000}, {0x38960000}, {0x38962000}, {0x38964000}, {0x38966000}, {0x38968000}, {0x3896a000}, {0x3896c000}, {0x3896e000}, {0x38970000}, {0x38972000}, {0x38974000}, {0x38976000}, {0x38978000}, {0x3897a000}, {0x3897c000}, {0x3897e000}, {0x38980000}, {0x38982000}, {0x38984000}, {0x38986000}, {0x38988000}, {0x3898a000}, {0x3898c000}, {0x3898e000}, {0x38990000}, {0x38992000}, {0x38994000}, {0x38996000}, {0x38998000}, {0x3899a000}, {0x3899c000}, {0x3899e000}, {0x389a0000}, {0x389a2000}, {0x389a4000}, {0x389a6000}, {0x389a8000}, {0x389aa000}, {0x389ac000}, {0x389ae000}, {0x389b0000}, {0x389b2000}, {0x389b4000}, {0x389b6000}, {0x389b8000}, {0x389ba000}, {0x389bc000}, {0x389be000}, {0x389c0000}, {0x389c2000}, {0x389c4000}, {0x389c6000}, {0x389c8000}, {0x389ca000}, {0x389cc000}, {0x389ce000}, {0x389d0000}, {0x389d2000}, {0x389d4000}, {0x389d6000}, {0x389d8000}, {0x389da000}, {0x389dc000}, {0x389de000}, {0x389e0000}, {0x389e2000}, {0x389e4000}, {0x389e6000}, {0x389e8000}, {0x389ea000}, {0x389ec000}, {0x389ee000}, {0x389f0000}, {0x389f2000}, {0x389f4000}, {0x389f6000}, {0x389f8000}, {0x389fa000}, {0x389fc000}, {0x389fe000}, {0x38a00000}, {0x38a02000}, {0x38a04000}, {0x38a06000}, {0x38a08000}, {0x38a0a000}, {0x38a0c000}, {0x38a0e000}, {0x38a10000}, {0x38a12000}, {0x38a14000}, {0x38a16000}, {0x38a18000}, {0x38a1a000}, {0x38a1c000}, {0x38a1e000}, {0x38a20000}, {0x38a22000}, {0x38a24000}, {0x38a26000}, {0x38a28000}, {0x38a2a000}, {0x38a2c000}, {0x38a2e000}, {0x38a30000}, {0x38a32000}, {0x38a34000}, {0x38a36000}, {0x38a38000}, {0x38a3a000}, {0x38a3c000}, {0x38a3e000}, {0x38a40000}, {0x38a42000}, {0x38a44000}, {0x38a46000}, {0x38a48000}, {0x38a4a000}, {0x38a4c000}, {0x38a4e000}, {0x38a50000}, {0x38a52000}, {0x38a54000}, {0x38a56000}, {0x38a58000}, {0x38a5a000}, {0x38a5c000}, {0x38a5e000}, {0x38a60000}, {0x38a62000}, {0x38a64000}, {0x38a66000}, {0x38a68000}, {0x38a6a000}, {0x38a6c000}, {0x38a6e000}, {0x38a70000}, {0x38a72000}, {0x38a74000}, {0x38a76000}, {0x38a78000}, {0x38a7a000}, {0x38a7c000}, {0x38a7e000}, {0x38a80000}, {0x38a82000}, {0x38a84000}, {0x38a86000}, {0x38a88000}, {0x38a8a000}, {0x38a8c000}, {0x38a8e000}, {0x38a90000}, {0x38a92000}, {0x38a94000}, {0x38a96000}, {0x38a98000}, {0x38a9a000}, {0x38a9c000}, {0x38a9e000}, {0x38aa0000}, {0x38aa2000}, {0x38aa4000}, {0x38aa6000}, {0x38aa8000}, {0x38aaa000}, {0x38aac000}, {0x38aae000}, {0x38ab0000}, {0x38ab2000}, {0x38ab4000}, {0x38ab6000}, {0x38ab8000}, {0x38aba000}, {0x38abc000}, {0x38abe000}, {0x38ac0000}, {0x38ac2000}, {0x38ac4000}, {0x38ac6000}, {0x38ac8000}, {0x38aca000}, {0x38acc000}, {0x38ace000}, {0x38ad0000}, {0x38ad2000}, {0x38ad4000}, {0x38ad6000}, {0x38ad8000}, {0x38ada000}, {0x38adc000}, {0x38ade000}, {0x38ae0000}, {0x38ae2000}, {0x38ae4000}, {0x38ae6000}, {0x38ae8000}, {0x38aea000}, {0x38aec000}, {0x38aee000}, {0x38af0000}, {0x38af2000}, {0x38af4000}, {0x38af6000}, {0x38af8000}, {0x38afa000}, {0x38afc000}, {0x38afe000}, {0x38b00000}, {0x38b02000}, {0x38b04000}, {0x38b06000}, {0x38b08000}, {0x38b0a000}, {0x38b0c000}, {0x38b0e000}, {0x38b10000}, {0x38b12000}, {0x38b14000}, {0x38b16000}, {0x38b18000}, {0x38b1a000}, {0x38b1c000}, {0x38b1e000}, {0x38b20000}, {0x38b22000}, {0x38b24000}, {0x38b26000}, {0x38b28000}, {0x38b2a000}, {0x38b2c000}, {0x38b2e000}, {0x38b30000}, {0x38b32000}, {0x38b34000}, {0x38b36000}, {0x38b38000}, {0x38b3a000}, {0x38b3c000}, {0x38b3e000}, {0x38b40000}, {0x38b42000}, {0x38b44000}, {0x38b46000}, {0x38b48000}, {0x38b4a000}, {0x38b4c000}, {0x38b4e000}, {0x38b50000}, {0x38b52000}, {0x38b54000}, {0x38b56000}, {0x38b58000}, {0x38b5a000}, {0x38b5c000}, {0x38b5e000}, {0x38b60000}, {0x38b62000}, {0x38b64000}, {0x38b66000}, {0x38b68000}, {0x38b6a000}, {0x38b6c000}, {0x38b6e000}, {0x38b70000}, {0x38b72000}, {0x38b74000}, {0x38b76000}, {0x38b78000}, {0x38b7a000}, {0x38b7c000}, {0x38b7e000}, {0x38b80000}, {0x38b82000}, {0x38b84000}, {0x38b86000}, {0x38b88000}, {0x38b8a000}, {0x38b8c000}, {0x38b8e000}, {0x38b90000}, {0x38b92000}, {0x38b94000}, {0x38b96000}, {0x38b98000}, {0x38b9a000}, {0x38b9c000}, {0x38b9e000}, {0x38ba0000}, {0x38ba2000}, {0x38ba4000}, {0x38ba6000}, {0x38ba8000}, {0x38baa000}, {0x38bac000}, {0x38bae000}, {0x38bb0000}, {0x38bb2000}, {0x38bb4000}, {0x38bb6000}, {0x38bb8000}, {0x38bba000}, {0x38bbc000}, {0x38bbe000}, {0x38bc0000}, {0x38bc2000}, {0x38bc4000}, {0x38bc6000}, {0x38bc8000}, {0x38bca000}, {0x38bcc000}, {0x38bce000}, {0x38bd0000}, {0x38bd2000}, {0x38bd4000}, {0x38bd6000}, {0x38bd8000}, {0x38bda000}, {0x38bdc000}, {0x38bde000}, {0x38be0000}, {0x38be2000}, {0x38be4000}, {0x38be6000}, {0x38be8000}, {0x38bea000}, {0x38bec000}, {0x38bee000}, {0x38bf0000}, {0x38bf2000}, {0x38bf4000}, {0x38bf6000}, {0x38bf8000}, {0x38bfa000}, {0x38bfc000}, {0x38bfe000}, {0x38c00000}, {0x38c02000}, {0x38c04000}, {0x38c06000}, {0x38c08000}, {0x38c0a000}, {0x38c0c000}, {0x38c0e000}, {0x38c10000}, {0x38c12000}, {0x38c14000}, {0x38c16000}, {0x38c18000}, {0x38c1a000}, {0x38c1c000}, {0x38c1e000}, {0x38c20000}, {0x38c22000}, {0x38c24000}, {0x38c26000}, {0x38c28000}, {0x38c2a000}, {0x38c2c000}, {0x38c2e000}, {0x38c30000}, {0x38c32000}, {0x38c34000}, {0x38c36000}, {0x38c38000}, {0x38c3a000}, {0x38c3c000}, {0x38c3e000}, {0x38c40000}, {0x38c42000}, {0x38c44000}, {0x38c46000}, {0x38c48000}, {0x38c4a000}, {0x38c4c000}, {0x38c4e000}, {0x38c50000}, {0x38c52000}, {0x38c54000}, {0x38c56000}, {0x38c58000}, {0x38c5a000}, {0x38c5c000}, {0x38c5e000}, {0x38c60000}, {0x38c62000}, {0x38c64000}, {0x38c66000}, {0x38c68000}, {0x38c6a000}, {0x38c6c000}, {0x38c6e000}, {0x38c70000}, {0x38c72000}, {0x38c74000}, {0x38c76000}, {0x38c78000}, {0x38c7a000}, {0x38c7c000}, {0x38c7e000}, {0x38c80000}, {0x38c82000}, {0x38c84000}, {0x38c86000}, {0x38c88000}, {0x38c8a000}, {0x38c8c000}, {0x38c8e000}, {0x38c90000}, {0x38c92000}, {0x38c94000}, {0x38c96000}, {0x38c98000}, {0x38c9a000}, {0x38c9c000}, {0x38c9e000}, {0x38ca0000}, {0x38ca2000}, {0x38ca4000}, {0x38ca6000}, {0x38ca8000}, {0x38caa000}, {0x38cac000}, {0x38cae000}, {0x38cb0000}, {0x38cb2000}, {0x38cb4000}, {0x38cb6000}, {0x38cb8000}, {0x38cba000}, {0x38cbc000}, {0x38cbe000}, {0x38cc0000}, {0x38cc2000}, {0x38cc4000}, {0x38cc6000}, {0x38cc8000}, {0x38cca000}, {0x38ccc000}, {0x38cce000}, {0x38cd0000}, {0x38cd2000}, {0x38cd4000}, {0x38cd6000}, {0x38cd8000}, {0x38cda000}, {0x38cdc000}, {0x38cde000}, {0x38ce0000}, {0x38ce2000}, {0x38ce4000}, {0x38ce6000}, {0x38ce8000}, {0x38cea000}, {0x38cec000}, {0x38cee000}, {0x38cf0000}, {0x38cf2000}, {0x38cf4000}, {0x38cf6000}, {0x38cf8000}, {0x38cfa000}, {0x38cfc000}, {0x38cfe000}, {0x38d00000}, {0x38d02000}, {0x38d04000}, {0x38d06000}, {0x38d08000}, {0x38d0a000}, {0x38d0c000}, {0x38d0e000}, {0x38d10000}, {0x38d12000}, {0x38d14000}, {0x38d16000}, {0x38d18000}, {0x38d1a000}, {0x38d1c000}, {0x38d1e000}, {0x38d20000}, {0x38d22000}, {0x38d24000}, {0x38d26000}, {0x38d28000}, {0x38d2a000}, {0x38d2c000}, {0x38d2e000}, {0x38d30000}, {0x38d32000}, {0x38d34000}, {0x38d36000}, {0x38d38000}, {0x38d3a000}, {0x38d3c000}, {0x38d3e000}, {0x38d40000}, {0x38d42000}, {0x38d44000}, {0x38d46000}, {0x38d48000}, {0x38d4a000}, {0x38d4c000}, {0x38d4e000}, {0x38d50000}, {0x38d52000}, {0x38d54000}, {0x38d56000}, {0x38d58000}, {0x38d5a000}, {0x38d5c000}, {0x38d5e000}, {0x38d60000}, {0x38d62000}, {0x38d64000}, {0x38d66000}, {0x38d68000}, {0x38d6a000}, {0x38d6c000}, {0x38d6e000}, {0x38d70000}, {0x38d72000}, {0x38d74000}, {0x38d76000}, {0x38d78000}, {0x38d7a000}, {0x38d7c000}, {0x38d7e000}, {0x38d80000}, {0x38d82000}, {0x38d84000}, {0x38d86000}, {0x38d88000}, {0x38d8a000}, {0x38d8c000}, {0x38d8e000}, {0x38d90000}, {0x38d92000}, {0x38d94000}, {0x38d96000}, {0x38d98000}, {0x38d9a000}, {0x38d9c000}, {0x38d9e000}, {0x38da0000}, {0x38da2000}, {0x38da4000}, {0x38da6000}, {0x38da8000}, {0x38daa000}, {0x38dac000}, {0x38dae000}, {0x38db0000}, {0x38db2000}, {0x38db4000}, {0x38db6000}, {0x38db8000}, {0x38dba000}, {0x38dbc000}, {0x38dbe000}, {0x38dc0000}, {0x38dc2000}, {0x38dc4000}, {0x38dc6000}, {0x38dc8000}, {0x38dca000}, {0x38dcc000}, {0x38dce000}, {0x38dd0000}, {0x38dd2000}, {0x38dd4000}, {0x38dd6000}, {0x38dd8000}, {0x38dda000}, {0x38ddc000}, {0x38dde000}, {0x38de0000}, {0x38de2000}, {0x38de4000}, {0x38de6000}, {0x38de8000}, {0x38dea000}, {0x38dec000}, {0x38dee000}, {0x38df0000}, {0x38df2000}, {0x38df4000}, {0x38df6000}, {0x38df8000}, {0x38dfa000}, {0x38dfc000}, {0x38dfe000}, {0x38e00000}, {0x38e02000}, {0x38e04000}, {0x38e06000}, {0x38e08000}, {0x38e0a000}, {0x38e0c000}, {0x38e0e000}, {0x38e10000}, {0x38e12000}, {0x38e14000}, {0x38e16000}, {0x38e18000}, {0x38e1a000}, {0x38e1c000}, {0x38e1e000}, {0x38e20000}, {0x38e22000}, {0x38e24000}, {0x38e26000}, {0x38e28000}, {0x38e2a000}, {0x38e2c000}, {0x38e2e000}, {0x38e30000}, {0x38e32000}, {0x38e34000}, {0x38e36000}, {0x38e38000}, {0x38e3a000}, {0x38e3c000}, {0x38e3e000}, {0x38e40000}, {0x38e42000}, {0x38e44000}, {0x38e46000}, {0x38e48000}, {0x38e4a000}, {0x38e4c000}, {0x38e4e000}, {0x38e50000}, {0x38e52000}, {0x38e54000}, {0x38e56000}, {0x38e58000}, {0x38e5a000}, {0x38e5c000}, {0x38e5e000}, {0x38e60000}, {0x38e62000}, {0x38e64000}, {0x38e66000}, {0x38e68000}, {0x38e6a000}, {0x38e6c000}, {0x38e6e000}, {0x38e70000}, {0x38e72000}, {0x38e74000}, {0x38e76000}, {0x38e78000}, {0x38e7a000}, {0x38e7c000}, {0x38e7e000}, {0x38e80000}, {0x38e82000}, {0x38e84000}, {0x38e86000}, {0x38e88000}, {0x38e8a000}, {0x38e8c000}, {0x38e8e000}, {0x38e90000}, {0x38e92000}, {0x38e94000}, {0x38e96000}, {0x38e98000}, {0x38e9a000}, {0x38e9c000}, {0x38e9e000}, {0x38ea0000}, {0x38ea2000}, {0x38ea4000}, {0x38ea6000}, {0x38ea8000}, {0x38eaa000}, {0x38eac000}, {0x38eae000}, {0x38eb0000}, {0x38eb2000}, {0x38eb4000}, {0x38eb6000}, {0x38eb8000}, {0x38eba000}, {0x38ebc000}, {0x38ebe000}, {0x38ec0000}, {0x38ec2000}, {0x38ec4000}, {0x38ec6000}, {0x38ec8000}, {0x38eca000}, {0x38ecc000}, {0x38ece000}, {0x38ed0000}, {0x38ed2000}, {0x38ed4000}, {0x38ed6000}, {0x38ed8000}, {0x38eda000}, {0x38edc000}, {0x38ede000}, {0x38ee0000}, {0x38ee2000}, {0x38ee4000}, {0x38ee6000}, {0x38ee8000}, {0x38eea000}, {0x38eec000}, {0x38eee000}, {0x38ef0000}, {0x38ef2000}, {0x38ef4000}, {0x38ef6000}, {0x38ef8000}, {0x38efa000}, {0x38efc000}, {0x38efe000}, {0x38f00000}, {0x38f02000}, {0x38f04000}, {0x38f06000}, {0x38f08000}, {0x38f0a000}, {0x38f0c000}, {0x38f0e000}, {0x38f10000}, {0x38f12000}, {0x38f14000}, {0x38f16000}, {0x38f18000}, {0x38f1a000}, {0x38f1c000}, {0x38f1e000}, {0x38f20000}, {0x38f22000}, {0x38f24000}, {0x38f26000}, {0x38f28000}, {0x38f2a000}, {0x38f2c000}, {0x38f2e000}, {0x38f30000}, {0x38f32000}, {0x38f34000}, {0x38f36000}, {0x38f38000}, {0x38f3a000}, {0x38f3c000}, {0x38f3e000}, {0x38f40000}, {0x38f42000}, {0x38f44000}, {0x38f46000}, {0x38f48000}, {0x38f4a000}, {0x38f4c000}, {0x38f4e000}, {0x38f50000}, {0x38f52000}, {0x38f54000}, {0x38f56000}, {0x38f58000}, {0x38f5a000}, {0x38f5c000}, {0x38f5e000}, {0x38f60000}, {0x38f62000}, {0x38f64000}, {0x38f66000}, {0x38f68000}, {0x38f6a000}, {0x38f6c000}, {0x38f6e000}, {0x38f70000}, {0x38f72000}, {0x38f74000}, {0x38f76000}, {0x38f78000}, {0x38f7a000}, {0x38f7c000}, {0x38f7e000}, {0x38f80000}, {0x38f82000}, {0x38f84000}, {0x38f86000}, {0x38f88000}, {0x38f8a000}, {0x38f8c000}, {0x38f8e000}, {0x38f90000}, {0x38f92000}, {0x38f94000}, {0x38f96000}, {0x38f98000}, {0x38f9a000}, {0x38f9c000}, {0x38f9e000}, {0x38fa0000}, {0x38fa2000}, {0x38fa4000}, {0x38fa6000}, {0x38fa8000}, {0x38faa000}, {0x38fac000}, {0x38fae000}, {0x38fb0000}, {0x38fb2000}, {0x38fb4000}, {0x38fb6000}, {0x38fb8000}, {0x38fba000}, {0x38fbc000}, {0x38fbe000}, {0x38fc0000}, {0x38fc2000}, {0x38fc4000}, {0x38fc6000}, {0x38fc8000}, {0x38fca000}, {0x38fcc000}, {0x38fce000}, {0x38fd0000}, {0x38fd2000}, {0x38fd4000}, {0x38fd6000}, {0x38fd8000}, {0x38fda000}, {0x38fdc000}, {0x38fde000}, {0x38fe0000}, {0x38fe2000}, {0x38fe4000}, {0x38fe6000}, {0x38fe8000}, {0x38fea000}, {0x38fec000}, {0x38fee000}, {0x38ff0000}, {0x38ff2000}, {0x38ff4000}, {0x38ff6000}, {0x38ff8000}, {0x38ffa000}, {0x38ffc000}, {0x38ffe000}, {0x39000000}, {0x39002000}, {0x39004000}, {0x39006000}, {0x39008000}, {0x3900a000}, {0x3900c000}, {0x3900e000}, {0x39010000}, {0x39012000}, {0x39014000}, {0x39016000}, {0x39018000}, {0x3901a000}, {0x3901c000}, {0x3901e000}, {0x39020000}, {0x39022000}, {0x39024000}, {0x39026000}, {0x39028000}, {0x3902a000}, {0x3902c000}, {0x3902e000}, {0x39030000}, {0x39032000}, {0x39034000}, {0x39036000}, {0x39038000}, {0x3903a000}, {0x3903c000}, {0x3903e000}, {0x39040000}, {0x39042000}, {0x39044000}, {0x39046000}, {0x39048000}, {0x3904a000}, {0x3904c000}, {0x3904e000}, {0x39050000}, {0x39052000}, {0x39054000}, {0x39056000}, {0x39058000}, {0x3905a000}, {0x3905c000}, {0x3905e000}, {0x39060000}, {0x39062000}, {0x39064000}, {0x39066000}, {0x39068000}, {0x3906a000}, {0x3906c000}, {0x3906e000}, {0x39070000}, {0x39072000}, {0x39074000}, {0x39076000}, {0x39078000}, {0x3907a000}, {0x3907c000}, {0x3907e000}, {0x39080000}, {0x39082000}, {0x39084000}, {0x39086000}, {0x39088000}, {0x3908a000}, {0x3908c000}, {0x3908e000}, {0x39090000}, {0x39092000}, {0x39094000}, {0x39096000}, {0x39098000}, {0x3909a000}, {0x3909c000}, {0x3909e000}, {0x390a0000}, {0x390a2000}, {0x390a4000}, {0x390a6000}, {0x390a8000}, {0x390aa000}, {0x390ac000}, {0x390ae000}, {0x390b0000}, {0x390b2000}, {0x390b4000}, {0x390b6000}, {0x390b8000}, {0x390ba000}, {0x390bc000}, {0x390be000}, {0x390c0000}, {0x390c2000}, {0x390c4000}, {0x390c6000}, {0x390c8000}, {0x390ca000}, {0x390cc000}, {0x390ce000}, {0x390d0000}, {0x390d2000}, {0x390d4000}, {0x390d6000}, {0x390d8000}, {0x390da000}, {0x390dc000}, {0x390de000}, {0x390e0000}, {0x390e2000}, {0x390e4000}, {0x390e6000}, {0x390e8000}, {0x390ea000}, {0x390ec000}, {0x390ee000}, {0x390f0000}, {0x390f2000}, {0x390f4000}, {0x390f6000}, {0x390f8000}, {0x390fa000}, {0x390fc000}, {0x390fe000}, {0x39100000}, {0x39102000}, {0x39104000}, {0x39106000}, {0x39108000}, {0x3910a000}, {0x3910c000}, {0x3910e000}, {0x39110000}, {0x39112000}, {0x39114000}, {0x39116000}, {0x39118000}, {0x3911a000}, {0x3911c000}, {0x3911e000}, {0x39120000}, {0x39122000}, {0x39124000}, {0x39126000}, {0x39128000}, {0x3912a000}, {0x3912c000}, {0x3912e000}, {0x39130000}, {0x39132000}, {0x39134000}, {0x39136000}, {0x39138000}, {0x3913a000}, {0x3913c000}, {0x3913e000}, {0x39140000}, {0x39142000}, {0x39144000}, {0x39146000}, {0x39148000}, {0x3914a000}, {0x3914c000}, {0x3914e000}, {0x39150000}, {0x39152000}, {0x39154000}, {0x39156000}, {0x39158000}, {0x3915a000}, {0x3915c000}, {0x3915e000}, {0x39160000}, {0x39162000}, {0x39164000}, {0x39166000}, {0x39168000}, {0x3916a000}, {0x3916c000}, {0x3916e000}, {0x39170000}, {0x39172000}, {0x39174000}, {0x39176000}, {0x39178000}, {0x3917a000}, {0x3917c000}, {0x3917e000}, {0x39180000}, {0x39182000}, {0x39184000}, {0x39186000}, {0x39188000}, {0x3918a000}, {0x3918c000}, {0x3918e000}, {0x39190000}, {0x39192000}, {0x39194000}, {0x39196000}, {0x39198000}, {0x3919a000}, {0x3919c000}, {0x3919e000}, {0x391a0000}, {0x391a2000}, {0x391a4000}, {0x391a6000}, {0x391a8000}, {0x391aa000}, {0x391ac000}, {0x391ae000}, {0x391b0000}, {0x391b2000}, {0x391b4000}, {0x391b6000}, {0x391b8000}, {0x391ba000}, {0x391bc000}, {0x391be000}, {0x391c0000}, {0x391c2000}, {0x391c4000}, {0x391c6000}, {0x391c8000}, {0x391ca000}, {0x391cc000}, {0x391ce000}, {0x391d0000}, {0x391d2000}, {0x391d4000}, {0x391d6000}, {0x391d8000}, {0x391da000}, {0x391dc000}, {0x391de000}, {0x391e0000}, {0x391e2000}, {0x391e4000}, {0x391e6000}, {0x391e8000}, {0x391ea000}, {0x391ec000}, {0x391ee000}, {0x391f0000}, {0x391f2000}, {0x391f4000}, {0x391f6000}, {0x391f8000}, {0x391fa000}, {0x391fc000}, {0x391fe000}, {0x39200000}, {0x39202000}, {0x39204000}, {0x39206000}, {0x39208000}, {0x3920a000}, {0x3920c000}, {0x3920e000}, {0x39210000}, {0x39212000}, {0x39214000}, {0x39216000}, {0x39218000}, {0x3921a000}, {0x3921c000}, {0x3921e000}, {0x39220000}, {0x39222000}, {0x39224000}, {0x39226000}, {0x39228000}, {0x3922a000}, {0x3922c000}, {0x3922e000}, {0x39230000}, {0x39232000}, {0x39234000}, {0x39236000}, {0x39238000}, {0x3923a000}, {0x3923c000}, {0x3923e000}, {0x39240000}, {0x39242000}, {0x39244000}, {0x39246000}, {0x39248000}, {0x3924a000}, {0x3924c000}, {0x3924e000}, {0x39250000}, {0x39252000}, {0x39254000}, {0x39256000}, {0x39258000}, {0x3925a000}, {0x3925c000}, {0x3925e000}, {0x39260000}, {0x39262000}, {0x39264000}, {0x39266000}, {0x39268000}, {0x3926a000}, {0x3926c000}, {0x3926e000}, {0x39270000}, {0x39272000}, {0x39274000}, {0x39276000}, {0x39278000}, {0x3927a000}, {0x3927c000}, {0x3927e000}, {0x39280000}, {0x39282000}, {0x39284000}, {0x39286000}, {0x39288000}, {0x3928a000}, {0x3928c000}, {0x3928e000}, {0x39290000}, {0x39292000}, {0x39294000}, {0x39296000}, {0x39298000}, {0x3929a000}, {0x3929c000}, {0x3929e000}, {0x392a0000}, {0x392a2000}, {0x392a4000}, {0x392a6000}, {0x392a8000}, {0x392aa000}, {0x392ac000}, {0x392ae000}, {0x392b0000}, {0x392b2000}, {0x392b4000}, {0x392b6000}, {0x392b8000}, {0x392ba000}, {0x392bc000}, {0x392be000}, {0x392c0000}, {0x392c2000}, {0x392c4000}, {0x392c6000}, {0x392c8000}, {0x392ca000}, {0x392cc000}, {0x392ce000}, {0x392d0000}, {0x392d2000}, {0x392d4000}, {0x392d6000}, {0x392d8000}, {0x392da000}, {0x392dc000}, {0x392de000}, {0x392e0000}, {0x392e2000}, {0x392e4000}, {0x392e6000}, {0x392e8000}, {0x392ea000}, {0x392ec000}, {0x392ee000}, {0x392f0000}, {0x392f2000}, {0x392f4000}, {0x392f6000}, {0x392f8000}, {0x392fa000}, {0x392fc000}, {0x392fe000}, {0x39300000}, {0x39302000}, {0x39304000}, {0x39306000}, {0x39308000}, {0x3930a000}, {0x3930c000}, {0x3930e000}, {0x39310000}, {0x39312000}, {0x39314000}, {0x39316000}, {0x39318000}, {0x3931a000}, {0x3931c000}, {0x3931e000}, {0x39320000}, {0x39322000}, {0x39324000}, {0x39326000}, {0x39328000}, {0x3932a000}, {0x3932c000}, {0x3932e000}, {0x39330000}, {0x39332000}, {0x39334000}, {0x39336000}, {0x39338000}, {0x3933a000}, {0x3933c000}, {0x3933e000}, {0x39340000}, {0x39342000}, {0x39344000}, {0x39346000}, {0x39348000}, {0x3934a000}, {0x3934c000}, {0x3934e000}, {0x39350000}, {0x39352000}, {0x39354000}, {0x39356000}, {0x39358000}, {0x3935a000}, {0x3935c000}, {0x3935e000}, {0x39360000}, {0x39362000}, {0x39364000}, {0x39366000}, {0x39368000}, {0x3936a000}, {0x3936c000}, {0x3936e000}, {0x39370000}, {0x39372000}, {0x39374000}, {0x39376000}, {0x39378000}, {0x3937a000}, {0x3937c000}, {0x3937e000}, {0x39380000}, {0x39382000}, {0x39384000}, {0x39386000}, {0x39388000}, {0x3938a000}, {0x3938c000}, {0x3938e000}, {0x39390000}, {0x39392000}, {0x39394000}, {0x39396000}, {0x39398000}, {0x3939a000}, {0x3939c000}, {0x3939e000}, {0x393a0000}, {0x393a2000}, {0x393a4000}, {0x393a6000}, {0x393a8000}, {0x393aa000}, {0x393ac000}, {0x393ae000}, {0x393b0000}, {0x393b2000}, {0x393b4000}, {0x393b6000}, {0x393b8000}, {0x393ba000}, {0x393bc000}, {0x393be000}, {0x393c0000}, {0x393c2000}, {0x393c4000}, {0x393c6000}, {0x393c8000}, {0x393ca000}, {0x393cc000}, {0x393ce000}, {0x393d0000}, {0x393d2000}, {0x393d4000}, {0x393d6000}, {0x393d8000}, {0x393da000}, {0x393dc000}, {0x393de000}, {0x393e0000}, {0x393e2000}, {0x393e4000}, {0x393e6000}, {0x393e8000}, {0x393ea000}, {0x393ec000}, {0x393ee000}, {0x393f0000}, {0x393f2000}, {0x393f4000}, {0x393f6000}, {0x393f8000}, {0x393fa000}, {0x393fc000}, {0x393fe000}, {0x39400000}, {0x39402000}, {0x39404000}, {0x39406000}, {0x39408000}, {0x3940a000}, {0x3940c000}, {0x3940e000}, {0x39410000}, {0x39412000}, {0x39414000}, {0x39416000}, {0x39418000}, {0x3941a000}, {0x3941c000}, {0x3941e000}, {0x39420000}, {0x39422000}, {0x39424000}, {0x39426000}, {0x39428000}, {0x3942a000}, {0x3942c000}, {0x3942e000}, {0x39430000}, {0x39432000}, {0x39434000}, {0x39436000}, {0x39438000}, {0x3943a000}, {0x3943c000}, {0x3943e000}, {0x39440000}, {0x39442000}, {0x39444000}, {0x39446000}, {0x39448000}, {0x3944a000}, {0x3944c000}, {0x3944e000}, {0x39450000}, {0x39452000}, {0x39454000}, {0x39456000}, {0x39458000}, {0x3945a000}, {0x3945c000}, {0x3945e000}, {0x39460000}, {0x39462000}, {0x39464000}, {0x39466000}, {0x39468000}, {0x3946a000}, {0x3946c000}, {0x3946e000}, {0x39470000}, {0x39472000}, {0x39474000}, {0x39476000}, {0x39478000}, {0x3947a000}, {0x3947c000}, {0x3947e000}, {0x39480000}, {0x39482000}, {0x39484000}, {0x39486000}, {0x39488000}, {0x3948a000}, {0x3948c000}, {0x3948e000}, {0x39490000}, {0x39492000}, {0x39494000}, {0x39496000}, {0x39498000}, {0x3949a000}, {0x3949c000}, {0x3949e000}, {0x394a0000}, {0x394a2000}, {0x394a4000}, {0x394a6000}, {0x394a8000}, {0x394aa000}, {0x394ac000}, {0x394ae000}, {0x394b0000}, {0x394b2000}, {0x394b4000}, {0x394b6000}, {0x394b8000}, {0x394ba000}, {0x394bc000}, {0x394be000}, {0x394c0000}, {0x394c2000}, {0x394c4000}, {0x394c6000}, {0x394c8000}, {0x394ca000}, {0x394cc000}, {0x394ce000}, {0x394d0000}, {0x394d2000}, {0x394d4000}, {0x394d6000}, {0x394d8000}, {0x394da000}, {0x394dc000}, {0x394de000}, {0x394e0000}, {0x394e2000}, {0x394e4000}, {0x394e6000}, {0x394e8000}, {0x394ea000}, {0x394ec000}, {0x394ee000}, {0x394f0000}, {0x394f2000}, {0x394f4000}, {0x394f6000}, {0x394f8000}, {0x394fa000}, {0x394fc000}, {0x394fe000}, {0x39500000}, {0x39502000}, {0x39504000}, {0x39506000}, {0x39508000}, {0x3950a000}, {0x3950c000}, {0x3950e000}, {0x39510000}, {0x39512000}, {0x39514000}, {0x39516000}, {0x39518000}, {0x3951a000}, {0x3951c000}, {0x3951e000}, {0x39520000}, {0x39522000}, {0x39524000}, {0x39526000}, {0x39528000}, {0x3952a000}, {0x3952c000}, {0x3952e000}, {0x39530000}, {0x39532000}, {0x39534000}, {0x39536000}, {0x39538000}, {0x3953a000}, {0x3953c000}, {0x3953e000}, {0x39540000}, {0x39542000}, {0x39544000}, {0x39546000}, {0x39548000}, {0x3954a000}, {0x3954c000}, {0x3954e000}, {0x39550000}, {0x39552000}, {0x39554000}, {0x39556000}, {0x39558000}, {0x3955a000}, {0x3955c000}, {0x3955e000}, {0x39560000}, {0x39562000}, {0x39564000}, {0x39566000}, {0x39568000}, {0x3956a000}, {0x3956c000}, {0x3956e000}, {0x39570000}, {0x39572000}, {0x39574000}, {0x39576000}, {0x39578000}, {0x3957a000}, {0x3957c000}, {0x3957e000}, {0x39580000}, {0x39582000}, {0x39584000}, {0x39586000}, {0x39588000}, {0x3958a000}, {0x3958c000}, {0x3958e000}, {0x39590000}, {0x39592000}, {0x39594000}, {0x39596000}, {0x39598000}, {0x3959a000}, {0x3959c000}, {0x3959e000}, {0x395a0000}, {0x395a2000}, {0x395a4000}, {0x395a6000}, {0x395a8000}, {0x395aa000}, {0x395ac000}, {0x395ae000}, {0x395b0000}, {0x395b2000}, {0x395b4000}, {0x395b6000}, {0x395b8000}, {0x395ba000}, {0x395bc000}, {0x395be000}, {0x395c0000}, {0x395c2000}, {0x395c4000}, {0x395c6000}, {0x395c8000}, {0x395ca000}, {0x395cc000}, {0x395ce000}, {0x395d0000}, {0x395d2000}, {0x395d4000}, {0x395d6000}, {0x395d8000}, {0x395da000}, {0x395dc000}, {0x395de000}, {0x395e0000}, {0x395e2000}, {0x395e4000}, {0x395e6000}, {0x395e8000}, {0x395ea000}, {0x395ec000}, {0x395ee000}, {0x395f0000}, {0x395f2000}, {0x395f4000}, {0x395f6000}, {0x395f8000}, {0x395fa000}, {0x395fc000}, {0x395fe000}, {0x39600000}, {0x39602000}, {0x39604000}, {0x39606000}, {0x39608000}, {0x3960a000}, {0x3960c000}, {0x3960e000}, {0x39610000}, {0x39612000}, {0x39614000}, {0x39616000}, {0x39618000}, {0x3961a000}, {0x3961c000}, {0x3961e000}, {0x39620000}, {0x39622000}, {0x39624000}, {0x39626000}, {0x39628000}, {0x3962a000}, {0x3962c000}, {0x3962e000}, {0x39630000}, {0x39632000}, {0x39634000}, {0x39636000}, {0x39638000}, {0x3963a000}, {0x3963c000}, {0x3963e000}, {0x39640000}, {0x39642000}, {0x39644000}, {0x39646000}, {0x39648000}, {0x3964a000}, {0x3964c000}, {0x3964e000}, {0x39650000}, {0x39652000}, {0x39654000}, {0x39656000}, {0x39658000}, {0x3965a000}, {0x3965c000}, {0x3965e000}, {0x39660000}, {0x39662000}, {0x39664000}, {0x39666000}, {0x39668000}, {0x3966a000}, {0x3966c000}, {0x3966e000}, {0x39670000}, {0x39672000}, {0x39674000}, {0x39676000}, {0x39678000}, {0x3967a000}, {0x3967c000}, {0x3967e000}, {0x39680000}, {0x39682000}, {0x39684000}, {0x39686000}, {0x39688000}, {0x3968a000}, {0x3968c000}, {0x3968e000}, {0x39690000}, {0x39692000}, {0x39694000}, {0x39696000}, {0x39698000}, {0x3969a000}, {0x3969c000}, {0x3969e000}, {0x396a0000}, {0x396a2000}, {0x396a4000}, {0x396a6000}, {0x396a8000}, {0x396aa000}, {0x396ac000}, {0x396ae000}, {0x396b0000}, {0x396b2000}, {0x396b4000}, {0x396b6000}, {0x396b8000}, {0x396ba000}, {0x396bc000}, {0x396be000}, {0x396c0000}, {0x396c2000}, {0x396c4000}, {0x396c6000}, {0x396c8000}, {0x396ca000}, {0x396cc000}, {0x396ce000}, {0x396d0000}, {0x396d2000}, {0x396d4000}, {0x396d6000}, {0x396d8000}, {0x396da000}, {0x396dc000}, {0x396de000}, {0x396e0000}, {0x396e2000}, {0x396e4000}, {0x396e6000}, {0x396e8000}, {0x396ea000}, {0x396ec000}, {0x396ee000}, {0x396f0000}, {0x396f2000}, {0x396f4000}, {0x396f6000}, {0x396f8000}, {0x396fa000}, {0x396fc000}, {0x396fe000}, {0x39700000}, {0x39702000}, {0x39704000}, {0x39706000}, {0x39708000}, {0x3970a000}, {0x3970c000}, {0x3970e000}, {0x39710000}, {0x39712000}, {0x39714000}, {0x39716000}, {0x39718000}, {0x3971a000}, {0x3971c000}, {0x3971e000}, {0x39720000}, {0x39722000}, {0x39724000}, {0x39726000}, {0x39728000}, {0x3972a000}, {0x3972c000}, {0x3972e000}, {0x39730000}, {0x39732000}, {0x39734000}, {0x39736000}, {0x39738000}, {0x3973a000}, {0x3973c000}, {0x3973e000}, {0x39740000}, {0x39742000}, {0x39744000}, {0x39746000}, {0x39748000}, {0x3974a000}, {0x3974c000}, {0x3974e000}, {0x39750000}, {0x39752000}, {0x39754000}, {0x39756000}, {0x39758000}, {0x3975a000}, {0x3975c000}, {0x3975e000}, {0x39760000}, {0x39762000}, {0x39764000}, {0x39766000}, {0x39768000}, {0x3976a000}, {0x3976c000}, {0x3976e000}, {0x39770000}, {0x39772000}, {0x39774000}, {0x39776000}, {0x39778000}, {0x3977a000}, {0x3977c000}, {0x3977e000}, {0x39780000}, {0x39782000}, {0x39784000}, {0x39786000}, {0x39788000}, {0x3978a000}, {0x3978c000}, {0x3978e000}, {0x39790000}, {0x39792000}, {0x39794000}, {0x39796000}, {0x39798000}, {0x3979a000}, {0x3979c000}, {0x3979e000}, {0x397a0000}, {0x397a2000}, {0x397a4000}, {0x397a6000}, {0x397a8000}, {0x397aa000}, {0x397ac000}, {0x397ae000}, {0x397b0000}, {0x397b2000}, {0x397b4000}, {0x397b6000}, {0x397b8000}, {0x397ba000}, {0x397bc000}, {0x397be000}, {0x397c0000}, {0x397c2000}, {0x397c4000}, {0x397c6000}, {0x397c8000}, {0x397ca000}, {0x397cc000}, {0x397ce000}, {0x397d0000}, {0x397d2000}, {0x397d4000}, {0x397d6000}, {0x397d8000}, {0x397da000}, {0x397dc000}, {0x397de000}, {0x397e0000}, {0x397e2000}, {0x397e4000}, {0x397e6000}, {0x397e8000}, {0x397ea000}, {0x397ec000}, {0x397ee000}, {0x397f0000}, {0x397f2000}, {0x397f4000}, {0x397f6000}, {0x397f8000}, {0x397fa000}, {0x397fc000}, {0x397fe000}, {0x39800000}, {0x39802000}, {0x39804000}, {0x39806000}, {0x39808000}, {0x3980a000}, {0x3980c000}, {0x3980e000}, {0x39810000}, {0x39812000}, {0x39814000}, {0x39816000}, {0x39818000}, {0x3981a000}, {0x3981c000}, {0x3981e000}, {0x39820000}, {0x39822000}, {0x39824000}, {0x39826000}, {0x39828000}, {0x3982a000}, {0x3982c000}, {0x3982e000}, {0x39830000}, {0x39832000}, {0x39834000}, {0x39836000}, {0x39838000}, {0x3983a000}, {0x3983c000}, {0x3983e000}, {0x39840000}, {0x39842000}, {0x39844000}, {0x39846000}, {0x39848000}, {0x3984a000}, {0x3984c000}, {0x3984e000}, {0x39850000}, {0x39852000}, {0x39854000}, {0x39856000}, {0x39858000}, {0x3985a000}, {0x3985c000}, {0x3985e000}, {0x39860000}, {0x39862000}, {0x39864000}, {0x39866000}, {0x39868000}, {0x3986a000}, {0x3986c000}, {0x3986e000}, {0x39870000}, {0x39872000}, {0x39874000}, {0x39876000}, {0x39878000}, {0x3987a000}, {0x3987c000}, {0x3987e000}, {0x39880000}, {0x39882000}, {0x39884000}, {0x39886000}, {0x39888000}, {0x3988a000}, {0x3988c000}, {0x3988e000}, {0x39890000}, {0x39892000}, {0x39894000}, {0x39896000}, {0x39898000}, {0x3989a000}, {0x3989c000}, {0x3989e000}, {0x398a0000}, {0x398a2000}, {0x398a4000}, {0x398a6000}, {0x398a8000}, {0x398aa000}, {0x398ac000}, {0x398ae000}, {0x398b0000}, {0x398b2000}, {0x398b4000}, {0x398b6000}, {0x398b8000}, {0x398ba000}, {0x398bc000}, {0x398be000}, {0x398c0000}, {0x398c2000}, {0x398c4000}, {0x398c6000}, {0x398c8000}, {0x398ca000}, {0x398cc000}, {0x398ce000}, {0x398d0000}, {0x398d2000}, {0x398d4000}, {0x398d6000}, {0x398d8000}, {0x398da000}, {0x398dc000}, {0x398de000}, {0x398e0000}, {0x398e2000}, {0x398e4000}, {0x398e6000}, {0x398e8000}, {0x398ea000}, {0x398ec000}, {0x398ee000}, {0x398f0000}, {0x398f2000}, {0x398f4000}, {0x398f6000}, {0x398f8000}, {0x398fa000}, {0x398fc000}, {0x398fe000}, {0x39900000}, {0x39902000}, {0x39904000}, {0x39906000}, {0x39908000}, {0x3990a000}, {0x3990c000}, {0x3990e000}, {0x39910000}, {0x39912000}, {0x39914000}, {0x39916000}, {0x39918000}, {0x3991a000}, {0x3991c000}, {0x3991e000}, {0x39920000}, {0x39922000}, {0x39924000}, {0x39926000}, {0x39928000}, {0x3992a000}, {0x3992c000}, {0x3992e000}, {0x39930000}, {0x39932000}, {0x39934000}, {0x39936000}, {0x39938000}, {0x3993a000}, {0x3993c000}, {0x3993e000}, {0x39940000}, {0x39942000}, {0x39944000}, {0x39946000}, {0x39948000}, {0x3994a000}, {0x3994c000}, {0x3994e000}, {0x39950000}, {0x39952000}, {0x39954000}, {0x39956000}, {0x39958000}, {0x3995a000}, {0x3995c000}, {0x3995e000}, {0x39960000}, {0x39962000}, {0x39964000}, {0x39966000}, {0x39968000}, {0x3996a000}, {0x3996c000}, {0x3996e000}, {0x39970000}, {0x39972000}, {0x39974000}, {0x39976000}, {0x39978000}, {0x3997a000}, {0x3997c000}, {0x3997e000}, {0x39980000}, {0x39982000}, {0x39984000}, {0x39986000}, {0x39988000}, {0x3998a000}, {0x3998c000}, {0x3998e000}, {0x39990000}, {0x39992000}, {0x39994000}, {0x39996000}, {0x39998000}, {0x3999a000}, {0x3999c000}, {0x3999e000}, {0x399a0000}, {0x399a2000}, {0x399a4000}, {0x399a6000}, {0x399a8000}, {0x399aa000}, {0x399ac000}, {0x399ae000}, {0x399b0000}, {0x399b2000}, {0x399b4000}, {0x399b6000}, {0x399b8000}, {0x399ba000}, {0x399bc000}, {0x399be000}, {0x399c0000}, {0x399c2000}, {0x399c4000}, {0x399c6000}, {0x399c8000}, {0x399ca000}, {0x399cc000}, {0x399ce000}, {0x399d0000}, {0x399d2000}, {0x399d4000}, {0x399d6000}, {0x399d8000}, {0x399da000}, {0x399dc000}, {0x399de000}, {0x399e0000}, {0x399e2000}, {0x399e4000}, {0x399e6000}, {0x399e8000}, {0x399ea000}, {0x399ec000}, {0x399ee000}, {0x399f0000}, {0x399f2000}, {0x399f4000}, {0x399f6000}, {0x399f8000}, {0x399fa000}, {0x399fc000}, {0x399fe000}, {0x39a00000}, {0x39a02000}, {0x39a04000}, {0x39a06000}, {0x39a08000}, {0x39a0a000}, {0x39a0c000}, {0x39a0e000}, {0x39a10000}, {0x39a12000}, {0x39a14000}, {0x39a16000}, {0x39a18000}, {0x39a1a000}, {0x39a1c000}, {0x39a1e000}, {0x39a20000}, {0x39a22000}, {0x39a24000}, {0x39a26000}, {0x39a28000}, {0x39a2a000}, {0x39a2c000}, {0x39a2e000}, {0x39a30000}, {0x39a32000}, {0x39a34000}, {0x39a36000}, {0x39a38000}, {0x39a3a000}, {0x39a3c000}, {0x39a3e000}, {0x39a40000}, {0x39a42000}, {0x39a44000}, {0x39a46000}, {0x39a48000}, {0x39a4a000}, {0x39a4c000}, {0x39a4e000}, {0x39a50000}, {0x39a52000}, {0x39a54000}, {0x39a56000}, {0x39a58000}, {0x39a5a000}, {0x39a5c000}, {0x39a5e000}, {0x39a60000}, {0x39a62000}, {0x39a64000}, {0x39a66000}, {0x39a68000}, {0x39a6a000}, {0x39a6c000}, {0x39a6e000}, {0x39a70000}, {0x39a72000}, {0x39a74000}, {0x39a76000}, {0x39a78000}, {0x39a7a000}, {0x39a7c000}, {0x39a7e000}, {0x39a80000}, {0x39a82000}, {0x39a84000}, {0x39a86000}, {0x39a88000}, {0x39a8a000}, {0x39a8c000}, {0x39a8e000}, {0x39a90000}, {0x39a92000}, {0x39a94000}, {0x39a96000}, {0x39a98000}, {0x39a9a000}, {0x39a9c000}, {0x39a9e000}, {0x39aa0000}, {0x39aa2000}, {0x39aa4000}, {0x39aa6000}, {0x39aa8000}, {0x39aaa000}, {0x39aac000}, {0x39aae000}, {0x39ab0000}, {0x39ab2000}, {0x39ab4000}, {0x39ab6000}, {0x39ab8000}, {0x39aba000}, {0x39abc000}, {0x39abe000}, {0x39ac0000}, {0x39ac2000}, {0x39ac4000}, {0x39ac6000}, {0x39ac8000}, {0x39aca000}, {0x39acc000}, {0x39ace000}, {0x39ad0000}, {0x39ad2000}, {0x39ad4000}, {0x39ad6000}, {0x39ad8000}, {0x39ada000}, {0x39adc000}, {0x39ade000}, {0x39ae0000}, {0x39ae2000}, {0x39ae4000}, {0x39ae6000}, {0x39ae8000}, {0x39aea000}, {0x39aec000}, {0x39aee000}, {0x39af0000}, {0x39af2000}, {0x39af4000}, {0x39af6000}, {0x39af8000}, {0x39afa000}, {0x39afc000}, {0x39afe000}, {0x39b00000}, {0x39b02000}, {0x39b04000}, {0x39b06000}, {0x39b08000}, {0x39b0a000}, {0x39b0c000}, {0x39b0e000}, {0x39b10000}, {0x39b12000}, {0x39b14000}, {0x39b16000}, {0x39b18000}, {0x39b1a000}, {0x39b1c000}, {0x39b1e000}, {0x39b20000}, {0x39b22000}, {0x39b24000}, {0x39b26000}, {0x39b28000}, {0x39b2a000}, {0x39b2c000}, {0x39b2e000}, {0x39b30000}, {0x39b32000}, {0x39b34000}, {0x39b36000}, {0x39b38000}, {0x39b3a000}, {0x39b3c000}, {0x39b3e000}, {0x39b40000}, {0x39b42000}, {0x39b44000}, {0x39b46000}, {0x39b48000}, {0x39b4a000}, {0x39b4c000}, {0x39b4e000}, {0x39b50000}, {0x39b52000}, {0x39b54000}, {0x39b56000}, {0x39b58000}, {0x39b5a000}, {0x39b5c000}, {0x39b5e000}, {0x39b60000}, {0x39b62000}, {0x39b64000}, {0x39b66000}, {0x39b68000}, {0x39b6a000}, {0x39b6c000}, {0x39b6e000}, {0x39b70000}, {0x39b72000}, {0x39b74000}, {0x39b76000}, {0x39b78000}, {0x39b7a000}, {0x39b7c000}, {0x39b7e000}, {0x39b80000}, {0x39b82000}, {0x39b84000}, {0x39b86000}, {0x39b88000}, {0x39b8a000}, {0x39b8c000}, {0x39b8e000}, {0x39b90000}, {0x39b92000}, {0x39b94000}, {0x39b96000}, {0x39b98000}, {0x39b9a000}, {0x39b9c000}, {0x39b9e000}, {0x39ba0000}, {0x39ba2000}, {0x39ba4000}, {0x39ba6000}, {0x39ba8000}, {0x39baa000}, {0x39bac000}, {0x39bae000}, {0x39bb0000}, {0x39bb2000}, {0x39bb4000}, {0x39bb6000}, {0x39bb8000}, {0x39bba000}, {0x39bbc000}, {0x39bbe000}, {0x39bc0000}, {0x39bc2000}, {0x39bc4000}, {0x39bc6000}, {0x39bc8000}, {0x39bca000}, {0x39bcc000}, {0x39bce000}, {0x39bd0000}, {0x39bd2000}, {0x39bd4000}, {0x39bd6000}, {0x39bd8000}, {0x39bda000}, {0x39bdc000}, {0x39bde000}, {0x39be0000}, {0x39be2000}, {0x39be4000}, {0x39be6000}, {0x39be8000}, {0x39bea000}, {0x39bec000}, {0x39bee000}, {0x39bf0000}, {0x39bf2000}, {0x39bf4000}, {0x39bf6000}, {0x39bf8000}, {0x39bfa000}, {0x39bfc000}, {0x39bfe000}, {0x39c00000}, {0x39c02000}, {0x39c04000}, {0x39c06000}, {0x39c08000}, {0x39c0a000}, {0x39c0c000}, {0x39c0e000}, {0x39c10000}, {0x39c12000}, {0x39c14000}, {0x39c16000}, {0x39c18000}, {0x39c1a000}, {0x39c1c000}, {0x39c1e000}, {0x39c20000}, {0x39c22000}, {0x39c24000}, {0x39c26000}, {0x39c28000}, {0x39c2a000}, {0x39c2c000}, {0x39c2e000}, {0x39c30000}, {0x39c32000}, {0x39c34000}, {0x39c36000}, {0x39c38000}, {0x39c3a000}, {0x39c3c000}, {0x39c3e000}, {0x39c40000}, {0x39c42000}, {0x39c44000}, {0x39c46000}, {0x39c48000}, {0x39c4a000}, {0x39c4c000}, {0x39c4e000}, {0x39c50000}, {0x39c52000}, {0x39c54000}, {0x39c56000}, {0x39c58000}, {0x39c5a000}, {0x39c5c000}, {0x39c5e000}, {0x39c60000}, {0x39c62000}, {0x39c64000}, {0x39c66000}, {0x39c68000}, {0x39c6a000}, {0x39c6c000}, {0x39c6e000}, {0x39c70000}, {0x39c72000}, {0x39c74000}, {0x39c76000}, {0x39c78000}, {0x39c7a000}, {0x39c7c000}, {0x39c7e000}, {0x39c80000}, {0x39c82000}, {0x39c84000}, {0x39c86000}, {0x39c88000}, {0x39c8a000}, {0x39c8c000}, {0x39c8e000}, {0x39c90000}, {0x39c92000}, {0x39c94000}, {0x39c96000}, {0x39c98000}, {0x39c9a000}, {0x39c9c000}, {0x39c9e000}, {0x39ca0000}, {0x39ca2000}, {0x39ca4000}, {0x39ca6000}, {0x39ca8000}, {0x39caa000}, {0x39cac000}, {0x39cae000}, {0x39cb0000}, {0x39cb2000}, {0x39cb4000}, {0x39cb6000}, {0x39cb8000}, {0x39cba000}, {0x39cbc000}, {0x39cbe000}, {0x39cc0000}, {0x39cc2000}, {0x39cc4000}, {0x39cc6000}, {0x39cc8000}, {0x39cca000}, {0x39ccc000}, {0x39cce000}, {0x39cd0000}, {0x39cd2000}, {0x39cd4000}, {0x39cd6000}, {0x39cd8000}, {0x39cda000}, {0x39cdc000}, {0x39cde000}, {0x39ce0000}, {0x39ce2000}, {0x39ce4000}, {0x39ce6000}, {0x39ce8000}, {0x39cea000}, {0x39cec000}, {0x39cee000}, {0x39cf0000}, {0x39cf2000}, {0x39cf4000}, {0x39cf6000}, {0x39cf8000}, {0x39cfa000}, {0x39cfc000}, {0x39cfe000}, {0x39d00000}, {0x39d02000}, {0x39d04000}, {0x39d06000}, {0x39d08000}, {0x39d0a000}, {0x39d0c000}, {0x39d0e000}, {0x39d10000}, {0x39d12000}, {0x39d14000}, {0x39d16000}, {0x39d18000}, {0x39d1a000}, {0x39d1c000}, {0x39d1e000}, {0x39d20000}, {0x39d22000}, {0x39d24000}, {0x39d26000}, {0x39d28000}, {0x39d2a000}, {0x39d2c000}, {0x39d2e000}, {0x39d30000}, {0x39d32000}, {0x39d34000}, {0x39d36000}, {0x39d38000}, {0x39d3a000}, {0x39d3c000}, {0x39d3e000}, {0x39d40000}, {0x39d42000}, {0x39d44000}, {0x39d46000}, {0x39d48000}, {0x39d4a000}, {0x39d4c000}, {0x39d4e000}, {0x39d50000}, {0x39d52000}, {0x39d54000}, {0x39d56000}, {0x39d58000}, {0x39d5a000}, {0x39d5c000}, {0x39d5e000}, {0x39d60000}, {0x39d62000}, {0x39d64000}, {0x39d66000}, {0x39d68000}, {0x39d6a000}, {0x39d6c000}, {0x39d6e000}, {0x39d70000}, {0x39d72000}, {0x39d74000}, {0x39d76000}, {0x39d78000}, {0x39d7a000}, {0x39d7c000}, {0x39d7e000}, {0x39d80000}, {0x39d82000}, {0x39d84000}, {0x39d86000}, {0x39d88000}, {0x39d8a000}, {0x39d8c000}, {0x39d8e000}, {0x39d90000}, {0x39d92000}, {0x39d94000}, {0x39d96000}, {0x39d98000}, {0x39d9a000}, {0x39d9c000}, {0x39d9e000}, {0x39da0000}, {0x39da2000}, {0x39da4000}, {0x39da6000}, {0x39da8000}, {0x39daa000}, {0x39dac000}, {0x39dae000}, {0x39db0000}, {0x39db2000}, {0x39db4000}, {0x39db6000}, {0x39db8000}, {0x39dba000}, {0x39dbc000}, {0x39dbe000}, {0x39dc0000}, {0x39dc2000}, {0x39dc4000}, {0x39dc6000}, {0x39dc8000}, {0x39dca000}, {0x39dcc000}, {0x39dce000}, {0x39dd0000}, {0x39dd2000}, {0x39dd4000}, {0x39dd6000}, {0x39dd8000}, {0x39dda000}, {0x39ddc000}, {0x39dde000}, {0x39de0000}, {0x39de2000}, {0x39de4000}, {0x39de6000}, {0x39de8000}, {0x39dea000}, {0x39dec000}, {0x39dee000}, {0x39df0000}, {0x39df2000}, {0x39df4000}, {0x39df6000}, {0x39df8000}, {0x39dfa000}, {0x39dfc000}, {0x39dfe000}, {0x39e00000}, {0x39e02000}, {0x39e04000}, {0x39e06000}, {0x39e08000}, {0x39e0a000}, {0x39e0c000}, {0x39e0e000}, {0x39e10000}, {0x39e12000}, {0x39e14000}, {0x39e16000}, {0x39e18000}, {0x39e1a000}, {0x39e1c000}, {0x39e1e000}, {0x39e20000}, {0x39e22000}, {0x39e24000}, {0x39e26000}, {0x39e28000}, {0x39e2a000}, {0x39e2c000}, {0x39e2e000}, {0x39e30000}, {0x39e32000}, {0x39e34000}, {0x39e36000}, {0x39e38000}, {0x39e3a000}, {0x39e3c000}, {0x39e3e000}, {0x39e40000}, {0x39e42000}, {0x39e44000}, {0x39e46000}, {0x39e48000}, {0x39e4a000}, {0x39e4c000}, {0x39e4e000}, {0x39e50000}, {0x39e52000}, {0x39e54000}, {0x39e56000}, {0x39e58000}, {0x39e5a000}, {0x39e5c000}, {0x39e5e000}, {0x39e60000}, {0x39e62000}, {0x39e64000}, {0x39e66000}, {0x39e68000}, {0x39e6a000}, {0x39e6c000}, {0x39e6e000}, {0x39e70000}, {0x39e72000}, {0x39e74000}, {0x39e76000}, {0x39e78000}, {0x39e7a000}, {0x39e7c000}, {0x39e7e000}, {0x39e80000}, {0x39e82000}, {0x39e84000}, {0x39e86000}, {0x39e88000}, {0x39e8a000}, {0x39e8c000}, {0x39e8e000}, {0x39e90000}, {0x39e92000}, {0x39e94000}, {0x39e96000}, {0x39e98000}, {0x39e9a000}, {0x39e9c000}, {0x39e9e000}, {0x39ea0000}, {0x39ea2000}, {0x39ea4000}, {0x39ea6000}, {0x39ea8000}, {0x39eaa000}, {0x39eac000}, {0x39eae000}, {0x39eb0000}, {0x39eb2000}, {0x39eb4000}, {0x39eb6000}, {0x39eb8000}, {0x39eba000}, {0x39ebc000}, {0x39ebe000}, {0x39ec0000}, {0x39ec2000}, {0x39ec4000}, {0x39ec6000}, {0x39ec8000}, {0x39eca000}, {0x39ecc000}, {0x39ece000}, {0x39ed0000}, {0x39ed2000}, {0x39ed4000}, {0x39ed6000}, {0x39ed8000}, {0x39eda000}, {0x39edc000}, {0x39ede000}, {0x39ee0000}, {0x39ee2000}, {0x39ee4000}, {0x39ee6000}, {0x39ee8000}, {0x39eea000}, {0x39eec000}, {0x39eee000}, {0x39ef0000}, {0x39ef2000}, {0x39ef4000}, {0x39ef6000}, {0x39ef8000}, {0x39efa000}, {0x39efc000}, {0x39efe000}, {0x39f00000}, {0x39f02000}, {0x39f04000}, {0x39f06000}, {0x39f08000}, {0x39f0a000}, {0x39f0c000}, {0x39f0e000}, {0x39f10000}, {0x39f12000}, {0x39f14000}, {0x39f16000}, {0x39f18000}, {0x39f1a000}, {0x39f1c000}, {0x39f1e000}, {0x39f20000}, {0x39f22000}, {0x39f24000}, {0x39f26000}, {0x39f28000}, {0x39f2a000}, {0x39f2c000}, {0x39f2e000}, {0x39f30000}, {0x39f32000}, {0x39f34000}, {0x39f36000}, {0x39f38000}, {0x39f3a000}, {0x39f3c000}, {0x39f3e000}, {0x39f40000}, {0x39f42000}, {0x39f44000}, {0x39f46000}, {0x39f48000}, {0x39f4a000}, {0x39f4c000}, {0x39f4e000}, {0x39f50000}, {0x39f52000}, {0x39f54000}, {0x39f56000}, {0x39f58000}, {0x39f5a000}, {0x39f5c000}, {0x39f5e000}, {0x39f60000}, {0x39f62000}, {0x39f64000}, {0x39f66000}, {0x39f68000}, {0x39f6a000}, {0x39f6c000}, {0x39f6e000}, {0x39f70000}, {0x39f72000}, {0x39f74000}, {0x39f76000}, {0x39f78000}, {0x39f7a000}, {0x39f7c000}, {0x39f7e000}, {0x39f80000}, {0x39f82000}, {0x39f84000}, {0x39f86000}, {0x39f88000}, {0x39f8a000}, {0x39f8c000}, {0x39f8e000}, {0x39f90000}, {0x39f92000}, {0x39f94000}, {0x39f96000}, {0x39f98000}, {0x39f9a000}, {0x39f9c000}, {0x39f9e000}, {0x39fa0000}, {0x39fa2000}, {0x39fa4000}, {0x39fa6000}, {0x39fa8000}, {0x39faa000}, {0x39fac000}, {0x39fae000}, {0x39fb0000}, {0x39fb2000}, {0x39fb4000}, {0x39fb6000}, {0x39fb8000}, {0x39fba000}, {0x39fbc000}, {0x39fbe000}, {0x39fc0000}, {0x39fc2000}, {0x39fc4000}, {0x39fc6000}, {0x39fc8000}, {0x39fca000}, {0x39fcc000}, {0x39fce000}, {0x39fd0000}, {0x39fd2000}, {0x39fd4000}, {0x39fd6000}, {0x39fd8000}, {0x39fda000}, {0x39fdc000}, {0x39fde000}, {0x39fe0000}, {0x39fe2000}, {0x39fe4000}, {0x39fe6000}, {0x39fe8000}, {0x39fea000}, {0x39fec000}, {0x39fee000}, {0x39ff0000}, {0x39ff2000}, {0x39ff4000}, {0x39ff6000}, {0x39ff8000}, {0x39ffa000}, {0x39ffc000}, {0x39ffe000}, {0x3a000000}, {0x3a002000}, {0x3a004000}, {0x3a006000}, {0x3a008000}, {0x3a00a000}, {0x3a00c000}, {0x3a00e000}, {0x3a010000}, {0x3a012000}, {0x3a014000}, {0x3a016000}, {0x3a018000}, {0x3a01a000}, {0x3a01c000}, {0x3a01e000}, {0x3a020000}, {0x3a022000}, {0x3a024000}, {0x3a026000}, {0x3a028000}, {0x3a02a000}, {0x3a02c000}, {0x3a02e000}, {0x3a030000}, {0x3a032000}, {0x3a034000}, {0x3a036000}, {0x3a038000}, {0x3a03a000}, {0x3a03c000}, {0x3a03e000}, {0x3a040000}, {0x3a042000}, {0x3a044000}, {0x3a046000}, {0x3a048000}, {0x3a04a000}, {0x3a04c000}, {0x3a04e000}, {0x3a050000}, {0x3a052000}, {0x3a054000}, {0x3a056000}, {0x3a058000}, {0x3a05a000}, {0x3a05c000}, {0x3a05e000}, {0x3a060000}, {0x3a062000}, {0x3a064000}, {0x3a066000}, {0x3a068000}, {0x3a06a000}, {0x3a06c000}, {0x3a06e000}, {0x3a070000}, {0x3a072000}, {0x3a074000}, {0x3a076000}, {0x3a078000}, {0x3a07a000}, {0x3a07c000}, {0x3a07e000}, {0x3a080000}, {0x3a082000}, {0x3a084000}, {0x3a086000}, {0x3a088000}, {0x3a08a000}, {0x3a08c000}, {0x3a08e000}, {0x3a090000}, {0x3a092000}, {0x3a094000}, {0x3a096000}, {0x3a098000}, {0x3a09a000}, {0x3a09c000}, {0x3a09e000}, {0x3a0a0000}, {0x3a0a2000}, {0x3a0a4000}, {0x3a0a6000}, {0x3a0a8000}, {0x3a0aa000}, {0x3a0ac000}, {0x3a0ae000}, {0x3a0b0000}, {0x3a0b2000}, {0x3a0b4000}, {0x3a0b6000}, {0x3a0b8000}, {0x3a0ba000}, {0x3a0bc000}, {0x3a0be000}, {0x3a0c0000}, {0x3a0c2000}, {0x3a0c4000}, {0x3a0c6000}, {0x3a0c8000}, {0x3a0ca000}, {0x3a0cc000}, {0x3a0ce000}, {0x3a0d0000}, {0x3a0d2000}, {0x3a0d4000}, {0x3a0d6000}, {0x3a0d8000}, {0x3a0da000}, {0x3a0dc000}, {0x3a0de000}, {0x3a0e0000}, {0x3a0e2000}, {0x3a0e4000}, {0x3a0e6000}, {0x3a0e8000}, {0x3a0ea000}, {0x3a0ec000}, {0x3a0ee000}, {0x3a0f0000}, {0x3a0f2000}, {0x3a0f4000}, {0x3a0f6000}, {0x3a0f8000}, {0x3a0fa000}, {0x3a0fc000}, {0x3a0fe000}, {0x3a100000}, {0x3a102000}, {0x3a104000}, {0x3a106000}, {0x3a108000}, {0x3a10a000}, {0x3a10c000}, {0x3a10e000}, {0x3a110000}, {0x3a112000}, {0x3a114000}, {0x3a116000}, {0x3a118000}, {0x3a11a000}, {0x3a11c000}, {0x3a11e000}, {0x3a120000}, {0x3a122000}, {0x3a124000}, {0x3a126000}, {0x3a128000}, {0x3a12a000}, {0x3a12c000}, {0x3a12e000}, {0x3a130000}, {0x3a132000}, {0x3a134000}, {0x3a136000}, {0x3a138000}, {0x3a13a000}, {0x3a13c000}, {0x3a13e000}, {0x3a140000}, {0x3a142000}, {0x3a144000}, {0x3a146000}, {0x3a148000}, {0x3a14a000}, {0x3a14c000}, {0x3a14e000}, {0x3a150000}, {0x3a152000}, {0x3a154000}, {0x3a156000}, {0x3a158000}, {0x3a15a000}, {0x3a15c000}, {0x3a15e000}, {0x3a160000}, {0x3a162000}, {0x3a164000}, {0x3a166000}, {0x3a168000}, {0x3a16a000}, {0x3a16c000}, {0x3a16e000}, {0x3a170000}, {0x3a172000}, {0x3a174000}, {0x3a176000}, {0x3a178000}, {0x3a17a000}, {0x3a17c000}, {0x3a17e000}, {0x3a180000}, {0x3a182000}, {0x3a184000}, {0x3a186000}, {0x3a188000}, {0x3a18a000}, {0x3a18c000}, {0x3a18e000}, {0x3a190000}, {0x3a192000}, {0x3a194000}, {0x3a196000}, {0x3a198000}, {0x3a19a000}, {0x3a19c000}, {0x3a19e000}, {0x3a1a0000}, {0x3a1a2000}, {0x3a1a4000}, {0x3a1a6000}, {0x3a1a8000}, {0x3a1aa000}, {0x3a1ac000}, {0x3a1ae000}, {0x3a1b0000}, {0x3a1b2000}, {0x3a1b4000}, {0x3a1b6000}, {0x3a1b8000}, {0x3a1ba000}, {0x3a1bc000}, {0x3a1be000}, {0x3a1c0000}, {0x3a1c2000}, {0x3a1c4000}, {0x3a1c6000}, {0x3a1c8000}, {0x3a1ca000}, {0x3a1cc000}, {0x3a1ce000}, {0x3a1d0000}, {0x3a1d2000}, {0x3a1d4000}, {0x3a1d6000}, {0x3a1d8000}, {0x3a1da000}, {0x3a1dc000}, {0x3a1de000}, {0x3a1e0000}, {0x3a1e2000}, {0x3a1e4000}, {0x3a1e6000}, {0x3a1e8000}, {0x3a1ea000}, {0x3a1ec000}, {0x3a1ee000}, {0x3a1f0000}, {0x3a1f2000}, {0x3a1f4000}, {0x3a1f6000}, {0x3a1f8000}, {0x3a1fa000}, {0x3a1fc000}, {0x3a1fe000}, {0x3a200000}, {0x3a202000}, {0x3a204000}, {0x3a206000}, {0x3a208000}, {0x3a20a000}, {0x3a20c000}, {0x3a20e000}, {0x3a210000}, {0x3a212000}, {0x3a214000}, {0x3a216000}, {0x3a218000}, {0x3a21a000}, {0x3a21c000}, {0x3a21e000}, {0x3a220000}, {0x3a222000}, {0x3a224000}, {0x3a226000}, {0x3a228000}, {0x3a22a000}, {0x3a22c000}, {0x3a22e000}, {0x3a230000}, {0x3a232000}, {0x3a234000}, {0x3a236000}, {0x3a238000}, {0x3a23a000}, {0x3a23c000}, {0x3a23e000}, {0x3a240000}, {0x3a242000}, {0x3a244000}, {0x3a246000}, {0x3a248000}, {0x3a24a000}, {0x3a24c000}, {0x3a24e000}, {0x3a250000}, {0x3a252000}, {0x3a254000}, {0x3a256000}, {0x3a258000}, {0x3a25a000}, {0x3a25c000}, {0x3a25e000}, {0x3a260000}, {0x3a262000}, {0x3a264000}, {0x3a266000}, {0x3a268000}, {0x3a26a000}, {0x3a26c000}, {0x3a26e000}, {0x3a270000}, {0x3a272000}, {0x3a274000}, {0x3a276000}, {0x3a278000}, {0x3a27a000}, {0x3a27c000}, {0x3a27e000}, {0x3a280000}, {0x3a282000}, {0x3a284000}, {0x3a286000}, {0x3a288000}, {0x3a28a000}, {0x3a28c000}, {0x3a28e000}, {0x3a290000}, {0x3a292000}, {0x3a294000}, {0x3a296000}, {0x3a298000}, {0x3a29a000}, {0x3a29c000}, {0x3a29e000}, {0x3a2a0000}, {0x3a2a2000}, {0x3a2a4000}, {0x3a2a6000}, {0x3a2a8000}, {0x3a2aa000}, {0x3a2ac000}, {0x3a2ae000}, {0x3a2b0000}, {0x3a2b2000}, {0x3a2b4000}, {0x3a2b6000}, {0x3a2b8000}, {0x3a2ba000}, {0x3a2bc000}, {0x3a2be000}, {0x3a2c0000}, {0x3a2c2000}, {0x3a2c4000}, {0x3a2c6000}, {0x3a2c8000}, {0x3a2ca000}, {0x3a2cc000}, {0x3a2ce000}, {0x3a2d0000}, {0x3a2d2000}, {0x3a2d4000}, {0x3a2d6000}, {0x3a2d8000}, {0x3a2da000}, {0x3a2dc000}, {0x3a2de000}, {0x3a2e0000}, {0x3a2e2000}, {0x3a2e4000}, {0x3a2e6000}, {0x3a2e8000}, {0x3a2ea000}, {0x3a2ec000}, {0x3a2ee000}, {0x3a2f0000}, {0x3a2f2000}, {0x3a2f4000}, {0x3a2f6000}, {0x3a2f8000}, {0x3a2fa000}, {0x3a2fc000}, {0x3a2fe000}, {0x3a300000}, {0x3a302000}, {0x3a304000}, {0x3a306000}, {0x3a308000}, {0x3a30a000}, {0x3a30c000}, {0x3a30e000}, {0x3a310000}, {0x3a312000}, {0x3a314000}, {0x3a316000}, {0x3a318000}, {0x3a31a000}, {0x3a31c000}, {0x3a31e000}, {0x3a320000}, {0x3a322000}, {0x3a324000}, {0x3a326000}, {0x3a328000}, {0x3a32a000}, {0x3a32c000}, {0x3a32e000}, {0x3a330000}, {0x3a332000}, {0x3a334000}, {0x3a336000}, {0x3a338000}, {0x3a33a000}, {0x3a33c000}, {0x3a33e000}, {0x3a340000}, {0x3a342000}, {0x3a344000}, {0x3a346000}, {0x3a348000}, {0x3a34a000}, {0x3a34c000}, {0x3a34e000}, {0x3a350000}, {0x3a352000}, {0x3a354000}, {0x3a356000}, {0x3a358000}, {0x3a35a000}, {0x3a35c000}, {0x3a35e000}, {0x3a360000}, {0x3a362000}, {0x3a364000}, {0x3a366000}, {0x3a368000}, {0x3a36a000}, {0x3a36c000}, {0x3a36e000}, {0x3a370000}, {0x3a372000}, {0x3a374000}, {0x3a376000}, {0x3a378000}, {0x3a37a000}, {0x3a37c000}, {0x3a37e000}, {0x3a380000}, {0x3a382000}, {0x3a384000}, {0x3a386000}, {0x3a388000}, {0x3a38a000}, {0x3a38c000}, {0x3a38e000}, {0x3a390000}, {0x3a392000}, {0x3a394000}, {0x3a396000}, {0x3a398000}, {0x3a39a000}, {0x3a39c000}, {0x3a39e000}, {0x3a3a0000}, {0x3a3a2000}, {0x3a3a4000}, {0x3a3a6000}, {0x3a3a8000}, {0x3a3aa000}, {0x3a3ac000}, {0x3a3ae000}, {0x3a3b0000}, {0x3a3b2000}, {0x3a3b4000}, {0x3a3b6000}, {0x3a3b8000}, {0x3a3ba000}, {0x3a3bc000}, {0x3a3be000}, {0x3a3c0000}, {0x3a3c2000}, {0x3a3c4000}, {0x3a3c6000}, {0x3a3c8000}, {0x3a3ca000}, {0x3a3cc000}, {0x3a3ce000}, {0x3a3d0000}, {0x3a3d2000}, {0x3a3d4000}, {0x3a3d6000}, {0x3a3d8000}, {0x3a3da000}, {0x3a3dc000}, {0x3a3de000}, {0x3a3e0000}, {0x3a3e2000}, {0x3a3e4000}, {0x3a3e6000}, {0x3a3e8000}, {0x3a3ea000}, {0x3a3ec000}, {0x3a3ee000}, {0x3a3f0000}, {0x3a3f2000}, {0x3a3f4000}, {0x3a3f6000}, {0x3a3f8000}, {0x3a3fa000}, {0x3a3fc000}, {0x3a3fe000}, {0x3a400000}, {0x3a402000}, {0x3a404000}, {0x3a406000}, {0x3a408000}, {0x3a40a000}, {0x3a40c000}, {0x3a40e000}, {0x3a410000}, {0x3a412000}, {0x3a414000}, {0x3a416000}, {0x3a418000}, {0x3a41a000}, {0x3a41c000}, {0x3a41e000}, {0x3a420000}, {0x3a422000}, {0x3a424000}, {0x3a426000}, {0x3a428000}, {0x3a42a000}, {0x3a42c000}, {0x3a42e000}, {0x3a430000}, {0x3a432000}, {0x3a434000}, {0x3a436000}, {0x3a438000}, {0x3a43a000}, {0x3a43c000}, {0x3a43e000}, {0x3a440000}, {0x3a442000}, {0x3a444000}, {0x3a446000}, {0x3a448000}, {0x3a44a000}, {0x3a44c000}, {0x3a44e000}, {0x3a450000}, {0x3a452000}, {0x3a454000}, {0x3a456000}, {0x3a458000}, {0x3a45a000}, {0x3a45c000}, {0x3a45e000}, {0x3a460000}, {0x3a462000}, {0x3a464000}, {0x3a466000}, {0x3a468000}, {0x3a46a000}, {0x3a46c000}, {0x3a46e000}, {0x3a470000}, {0x3a472000}, {0x3a474000}, {0x3a476000}, {0x3a478000}, {0x3a47a000}, {0x3a47c000}, {0x3a47e000}, {0x3a480000}, {0x3a482000}, {0x3a484000}, {0x3a486000}, {0x3a488000}, {0x3a48a000}, {0x3a48c000}, {0x3a48e000}, {0x3a490000}, {0x3a492000}, {0x3a494000}, {0x3a496000}, {0x3a498000}, {0x3a49a000}, {0x3a49c000}, {0x3a49e000}, {0x3a4a0000}, {0x3a4a2000}, {0x3a4a4000}, {0x3a4a6000}, {0x3a4a8000}, {0x3a4aa000}, {0x3a4ac000}, {0x3a4ae000}, {0x3a4b0000}, {0x3a4b2000}, {0x3a4b4000}, {0x3a4b6000}, {0x3a4b8000}, {0x3a4ba000}, {0x3a4bc000}, {0x3a4be000}, {0x3a4c0000}, {0x3a4c2000}, {0x3a4c4000}, {0x3a4c6000}, {0x3a4c8000}, {0x3a4ca000}, {0x3a4cc000}, {0x3a4ce000}, {0x3a4d0000}, {0x3a4d2000}, {0x3a4d4000}, {0x3a4d6000}, {0x3a4d8000}, {0x3a4da000}, {0x3a4dc000}, {0x3a4de000}, {0x3a4e0000}, {0x3a4e2000}, {0x3a4e4000}, {0x3a4e6000}, {0x3a4e8000}, {0x3a4ea000}, {0x3a4ec000}, {0x3a4ee000}, {0x3a4f0000}, {0x3a4f2000}, {0x3a4f4000}, {0x3a4f6000}, {0x3a4f8000}, {0x3a4fa000}, {0x3a4fc000}, {0x3a4fe000}, {0x3a500000}, {0x3a502000}, {0x3a504000}, {0x3a506000}, {0x3a508000}, {0x3a50a000}, {0x3a50c000}, {0x3a50e000}, {0x3a510000}, {0x3a512000}, {0x3a514000}, {0x3a516000}, {0x3a518000}, {0x3a51a000}, {0x3a51c000}, {0x3a51e000}, {0x3a520000}, {0x3a522000}, {0x3a524000}, {0x3a526000}, {0x3a528000}, {0x3a52a000}, {0x3a52c000}, {0x3a52e000}, {0x3a530000}, {0x3a532000}, {0x3a534000}, {0x3a536000}, {0x3a538000}, {0x3a53a000}, {0x3a53c000}, {0x3a53e000}, {0x3a540000}, {0x3a542000}, {0x3a544000}, {0x3a546000}, {0x3a548000}, {0x3a54a000}, {0x3a54c000}, {0x3a54e000}, {0x3a550000}, {0x3a552000}, {0x3a554000}, {0x3a556000}, {0x3a558000}, {0x3a55a000}, {0x3a55c000}, {0x3a55e000}, {0x3a560000}, {0x3a562000}, {0x3a564000}, {0x3a566000}, {0x3a568000}, {0x3a56a000}, {0x3a56c000}, {0x3a56e000}, {0x3a570000}, {0x3a572000}, {0x3a574000}, {0x3a576000}, {0x3a578000}, {0x3a57a000}, {0x3a57c000}, {0x3a57e000}, {0x3a580000}, {0x3a582000}, {0x3a584000}, {0x3a586000}, {0x3a588000}, {0x3a58a000}, {0x3a58c000}, {0x3a58e000}, {0x3a590000}, {0x3a592000}, {0x3a594000}, {0x3a596000}, {0x3a598000}, {0x3a59a000}, {0x3a59c000}, {0x3a59e000}, {0x3a5a0000}, {0x3a5a2000}, {0x3a5a4000}, {0x3a5a6000}, {0x3a5a8000}, {0x3a5aa000}, {0x3a5ac000}, {0x3a5ae000}, {0x3a5b0000}, {0x3a5b2000}, {0x3a5b4000}, {0x3a5b6000}, {0x3a5b8000}, {0x3a5ba000}, {0x3a5bc000}, {0x3a5be000}, {0x3a5c0000}, {0x3a5c2000}, {0x3a5c4000}, {0x3a5c6000}, {0x3a5c8000}, {0x3a5ca000}, {0x3a5cc000}, {0x3a5ce000}, {0x3a5d0000}, {0x3a5d2000}, {0x3a5d4000}, {0x3a5d6000}, {0x3a5d8000}, {0x3a5da000}, {0x3a5dc000}, {0x3a5de000}, {0x3a5e0000}, {0x3a5e2000}, {0x3a5e4000}, {0x3a5e6000}, {0x3a5e8000}, {0x3a5ea000}, {0x3a5ec000}, {0x3a5ee000}, {0x3a5f0000}, {0x3a5f2000}, {0x3a5f4000}, {0x3a5f6000}, {0x3a5f8000}, {0x3a5fa000}, {0x3a5fc000}, {0x3a5fe000}, {0x3a600000}, {0x3a602000}, {0x3a604000}, {0x3a606000}, {0x3a608000}, {0x3a60a000}, {0x3a60c000}, {0x3a60e000}, {0x3a610000}, {0x3a612000}, {0x3a614000}, {0x3a616000}, {0x3a618000}, {0x3a61a000}, {0x3a61c000}, {0x3a61e000}, {0x3a620000}, {0x3a622000}, {0x3a624000}, {0x3a626000}, {0x3a628000}, {0x3a62a000}, {0x3a62c000}, {0x3a62e000}, {0x3a630000}, {0x3a632000}, {0x3a634000}, {0x3a636000}, {0x3a638000}, {0x3a63a000}, {0x3a63c000}, {0x3a63e000}, {0x3a640000}, {0x3a642000}, {0x3a644000}, {0x3a646000}, {0x3a648000}, {0x3a64a000}, {0x3a64c000}, {0x3a64e000}, {0x3a650000}, {0x3a652000}, {0x3a654000}, {0x3a656000}, {0x3a658000}, {0x3a65a000}, {0x3a65c000}, {0x3a65e000}, {0x3a660000}, {0x3a662000}, {0x3a664000}, {0x3a666000}, {0x3a668000}, {0x3a66a000}, {0x3a66c000}, {0x3a66e000}, {0x3a670000}, {0x3a672000}, {0x3a674000}, {0x3a676000}, {0x3a678000}, {0x3a67a000}, {0x3a67c000}, {0x3a67e000}, {0x3a680000}, {0x3a682000}, {0x3a684000}, {0x3a686000}, {0x3a688000}, {0x3a68a000}, {0x3a68c000}, {0x3a68e000}, {0x3a690000}, {0x3a692000}, {0x3a694000}, {0x3a696000}, {0x3a698000}, {0x3a69a000}, {0x3a69c000}, {0x3a69e000}, {0x3a6a0000}, {0x3a6a2000}, {0x3a6a4000}, {0x3a6a6000}, {0x3a6a8000}, {0x3a6aa000}, {0x3a6ac000}, {0x3a6ae000}, {0x3a6b0000}, {0x3a6b2000}, {0x3a6b4000}, {0x3a6b6000}, {0x3a6b8000}, {0x3a6ba000}, {0x3a6bc000}, {0x3a6be000}, {0x3a6c0000}, {0x3a6c2000}, {0x3a6c4000}, {0x3a6c6000}, {0x3a6c8000}, {0x3a6ca000}, {0x3a6cc000}, {0x3a6ce000}, {0x3a6d0000}, {0x3a6d2000}, {0x3a6d4000}, {0x3a6d6000}, {0x3a6d8000}, {0x3a6da000}, {0x3a6dc000}, {0x3a6de000}, {0x3a6e0000}, {0x3a6e2000}, {0x3a6e4000}, {0x3a6e6000}, {0x3a6e8000}, {0x3a6ea000}, {0x3a6ec000}, {0x3a6ee000}, {0x3a6f0000}, {0x3a6f2000}, {0x3a6f4000}, {0x3a6f6000}, {0x3a6f8000}, {0x3a6fa000}, {0x3a6fc000}, {0x3a6fe000}, {0x3a700000}, {0x3a702000}, {0x3a704000}, {0x3a706000}, {0x3a708000}, {0x3a70a000}, {0x3a70c000}, {0x3a70e000}, {0x3a710000}, {0x3a712000}, {0x3a714000}, {0x3a716000}, {0x3a718000}, {0x3a71a000}, {0x3a71c000}, {0x3a71e000}, {0x3a720000}, {0x3a722000}, {0x3a724000}, {0x3a726000}, {0x3a728000}, {0x3a72a000}, {0x3a72c000}, {0x3a72e000}, {0x3a730000}, {0x3a732000}, {0x3a734000}, {0x3a736000}, {0x3a738000}, {0x3a73a000}, {0x3a73c000}, {0x3a73e000}, {0x3a740000}, {0x3a742000}, {0x3a744000}, {0x3a746000}, {0x3a748000}, {0x3a74a000}, {0x3a74c000}, {0x3a74e000}, {0x3a750000}, {0x3a752000}, {0x3a754000}, {0x3a756000}, {0x3a758000}, {0x3a75a000}, {0x3a75c000}, {0x3a75e000}, {0x3a760000}, {0x3a762000}, {0x3a764000}, {0x3a766000}, {0x3a768000}, {0x3a76a000}, {0x3a76c000}, {0x3a76e000}, {0x3a770000}, {0x3a772000}, {0x3a774000}, {0x3a776000}, {0x3a778000}, {0x3a77a000}, {0x3a77c000}, {0x3a77e000}, {0x3a780000}, {0x3a782000}, {0x3a784000}, {0x3a786000}, {0x3a788000}, {0x3a78a000}, {0x3a78c000}, {0x3a78e000}, {0x3a790000}, {0x3a792000}, {0x3a794000}, {0x3a796000}, {0x3a798000}, {0x3a79a000}, {0x3a79c000}, {0x3a79e000}, {0x3a7a0000}, {0x3a7a2000}, {0x3a7a4000}, {0x3a7a6000}, {0x3a7a8000}, {0x3a7aa000}, {0x3a7ac000}, {0x3a7ae000}, {0x3a7b0000}, {0x3a7b2000}, {0x3a7b4000}, {0x3a7b6000}, {0x3a7b8000}, {0x3a7ba000}, {0x3a7bc000}, {0x3a7be000}, {0x3a7c0000}, {0x3a7c2000}, {0x3a7c4000}, {0x3a7c6000}, {0x3a7c8000}, {0x3a7ca000}, {0x3a7cc000}, {0x3a7ce000}, {0x3a7d0000}, {0x3a7d2000}, {0x3a7d4000}, {0x3a7d6000}, {0x3a7d8000}, {0x3a7da000}, {0x3a7dc000}, {0x3a7de000}, {0x3a7e0000}, {0x3a7e2000}, {0x3a7e4000}, {0x3a7e6000}, {0x3a7e8000}, {0x3a7ea000}, {0x3a7ec000}, {0x3a7ee000}, {0x3a7f0000}, {0x3a7f2000}, {0x3a7f4000}, {0x3a7f6000}, {0x3a7f8000}, {0x3a7fa000}, {0x3a7fc000}, {0x3a7fe000}, {0x3a800000}, {0x3a802000}, {0x3a804000}, {0x3a806000}, {0x3a808000}, {0x3a80a000}, {0x3a80c000}, {0x3a80e000}, {0x3a810000}, {0x3a812000}, {0x3a814000}, {0x3a816000}, {0x3a818000}, {0x3a81a000}, {0x3a81c000}, {0x3a81e000}, {0x3a820000}, {0x3a822000}, {0x3a824000}, {0x3a826000}, {0x3a828000}, {0x3a82a000}, {0x3a82c000}, {0x3a82e000}, {0x3a830000}, {0x3a832000}, {0x3a834000}, {0x3a836000}, {0x3a838000}, {0x3a83a000}, {0x3a83c000}, {0x3a83e000}, {0x3a840000}, {0x3a842000}, {0x3a844000}, {0x3a846000}, {0x3a848000}, {0x3a84a000}, {0x3a84c000}, {0x3a84e000}, {0x3a850000}, {0x3a852000}, {0x3a854000}, {0x3a856000}, {0x3a858000}, {0x3a85a000}, {0x3a85c000}, {0x3a85e000}, {0x3a860000}, {0x3a862000}, {0x3a864000}, {0x3a866000}, {0x3a868000}, {0x3a86a000}, {0x3a86c000}, {0x3a86e000}, {0x3a870000}, {0x3a872000}, {0x3a874000}, {0x3a876000}, {0x3a878000}, {0x3a87a000}, {0x3a87c000}, {0x3a87e000}, {0x3a880000}, {0x3a882000}, {0x3a884000}, {0x3a886000}, {0x3a888000}, {0x3a88a000}, {0x3a88c000}, {0x3a88e000}, {0x3a890000}, {0x3a892000}, {0x3a894000}, {0x3a896000}, {0x3a898000}, {0x3a89a000}, {0x3a89c000}, {0x3a89e000}, {0x3a8a0000}, {0x3a8a2000}, {0x3a8a4000}, {0x3a8a6000}, {0x3a8a8000}, {0x3a8aa000}, {0x3a8ac000}, {0x3a8ae000}, {0x3a8b0000}, {0x3a8b2000}, {0x3a8b4000}, {0x3a8b6000}, {0x3a8b8000}, {0x3a8ba000}, {0x3a8bc000}, {0x3a8be000}, {0x3a8c0000}, {0x3a8c2000}, {0x3a8c4000}, {0x3a8c6000}, {0x3a8c8000}, {0x3a8ca000}, {0x3a8cc000}, {0x3a8ce000}, {0x3a8d0000}, {0x3a8d2000}, {0x3a8d4000}, {0x3a8d6000}, {0x3a8d8000}, {0x3a8da000}, {0x3a8dc000}, {0x3a8de000}, {0x3a8e0000}, {0x3a8e2000}, {0x3a8e4000}, {0x3a8e6000}, {0x3a8e8000}, {0x3a8ea000}, {0x3a8ec000}, {0x3a8ee000}, {0x3a8f0000}, {0x3a8f2000}, {0x3a8f4000}, {0x3a8f6000}, {0x3a8f8000}, {0x3a8fa000}, {0x3a8fc000}, {0x3a8fe000}, {0x3a900000}, {0x3a902000}, {0x3a904000}, {0x3a906000}, {0x3a908000}, {0x3a90a000}, {0x3a90c000}, {0x3a90e000}, {0x3a910000}, {0x3a912000}, {0x3a914000}, {0x3a916000}, {0x3a918000}, {0x3a91a000}, {0x3a91c000}, {0x3a91e000}, {0x3a920000}, {0x3a922000}, {0x3a924000}, {0x3a926000}, {0x3a928000}, {0x3a92a000}, {0x3a92c000}, {0x3a92e000}, {0x3a930000}, {0x3a932000}, {0x3a934000}, {0x3a936000}, {0x3a938000}, {0x3a93a000}, {0x3a93c000}, {0x3a93e000}, {0x3a940000}, {0x3a942000}, {0x3a944000}, {0x3a946000}, {0x3a948000}, {0x3a94a000}, {0x3a94c000}, {0x3a94e000}, {0x3a950000}, {0x3a952000}, {0x3a954000}, {0x3a956000}, {0x3a958000}, {0x3a95a000}, {0x3a95c000}, {0x3a95e000}, {0x3a960000}, {0x3a962000}, {0x3a964000}, {0x3a966000}, {0x3a968000}, {0x3a96a000}, {0x3a96c000}, {0x3a96e000}, {0x3a970000}, {0x3a972000}, {0x3a974000}, {0x3a976000}, {0x3a978000}, {0x3a97a000}, {0x3a97c000}, {0x3a97e000}, {0x3a980000}, {0x3a982000}, {0x3a984000}, {0x3a986000}, {0x3a988000}, {0x3a98a000}, {0x3a98c000}, {0x3a98e000}, {0x3a990000}, {0x3a992000}, {0x3a994000}, {0x3a996000}, {0x3a998000}, {0x3a99a000}, {0x3a99c000}, {0x3a99e000}, {0x3a9a0000}, {0x3a9a2000}, {0x3a9a4000}, {0x3a9a6000}, {0x3a9a8000}, {0x3a9aa000}, {0x3a9ac000}, {0x3a9ae000}, {0x3a9b0000}, {0x3a9b2000}, {0x3a9b4000}, {0x3a9b6000}, {0x3a9b8000}, {0x3a9ba000}, {0x3a9bc000}, {0x3a9be000}, {0x3a9c0000}, {0x3a9c2000}, {0x3a9c4000}, {0x3a9c6000}, {0x3a9c8000}, {0x3a9ca000}, {0x3a9cc000}, {0x3a9ce000}, {0x3a9d0000}, {0x3a9d2000}, {0x3a9d4000}, {0x3a9d6000}, {0x3a9d8000}, {0x3a9da000}, {0x3a9dc000}, {0x3a9de000}, {0x3a9e0000}, {0x3a9e2000}, {0x3a9e4000}, {0x3a9e6000}, {0x3a9e8000}, {0x3a9ea000}, {0x3a9ec000}, {0x3a9ee000}, {0x3a9f0000}, {0x3a9f2000}, {0x3a9f4000}, {0x3a9f6000}, {0x3a9f8000}, {0x3a9fa000}, {0x3a9fc000}, {0x3a9fe000}, {0x3aa00000}, {0x3aa02000}, {0x3aa04000}, {0x3aa06000}, {0x3aa08000}, {0x3aa0a000}, {0x3aa0c000}, {0x3aa0e000}, {0x3aa10000}, {0x3aa12000}, {0x3aa14000}, {0x3aa16000}, {0x3aa18000}, {0x3aa1a000}, {0x3aa1c000}, {0x3aa1e000}, {0x3aa20000}, {0x3aa22000}, {0x3aa24000}, {0x3aa26000}, {0x3aa28000}, {0x3aa2a000}, {0x3aa2c000}, {0x3aa2e000}, {0x3aa30000}, {0x3aa32000}, {0x3aa34000}, {0x3aa36000}, {0x3aa38000}, {0x3aa3a000}, {0x3aa3c000}, {0x3aa3e000}, {0x3aa40000}, {0x3aa42000}, {0x3aa44000}, {0x3aa46000}, {0x3aa48000}, {0x3aa4a000}, {0x3aa4c000}, {0x3aa4e000}, {0x3aa50000}, {0x3aa52000}, {0x3aa54000}, {0x3aa56000}, {0x3aa58000}, {0x3aa5a000}, {0x3aa5c000}, {0x3aa5e000}, {0x3aa60000}, {0x3aa62000}, {0x3aa64000}, {0x3aa66000}, {0x3aa68000}, {0x3aa6a000}, {0x3aa6c000}, {0x3aa6e000}, {0x3aa70000}, {0x3aa72000}, {0x3aa74000}, {0x3aa76000}, {0x3aa78000}, {0x3aa7a000}, {0x3aa7c000}, {0x3aa7e000}, {0x3aa80000}, {0x3aa82000}, {0x3aa84000}, {0x3aa86000}, {0x3aa88000}, {0x3aa8a000}, {0x3aa8c000}, {0x3aa8e000}, {0x3aa90000}, {0x3aa92000}, {0x3aa94000}, {0x3aa96000}, {0x3aa98000}, {0x3aa9a000}, {0x3aa9c000}, {0x3aa9e000}, {0x3aaa0000}, {0x3aaa2000}, {0x3aaa4000}, {0x3aaa6000}, {0x3aaa8000}, {0x3aaaa000}, {0x3aaac000}, {0x3aaae000}, {0x3aab0000}, {0x3aab2000}, {0x3aab4000}, {0x3aab6000}, {0x3aab8000}, {0x3aaba000}, {0x3aabc000}, {0x3aabe000}, {0x3aac0000}, {0x3aac2000}, {0x3aac4000}, {0x3aac6000}, {0x3aac8000}, {0x3aaca000}, {0x3aacc000}, {0x3aace000}, {0x3aad0000}, {0x3aad2000}, {0x3aad4000}, {0x3aad6000}, {0x3aad8000}, {0x3aada000}, {0x3aadc000}, {0x3aade000}, {0x3aae0000}, {0x3aae2000}, {0x3aae4000}, {0x3aae6000}, {0x3aae8000}, {0x3aaea000}, {0x3aaec000}, {0x3aaee000}, {0x3aaf0000}, {0x3aaf2000}, {0x3aaf4000}, {0x3aaf6000}, {0x3aaf8000}, {0x3aafa000}, {0x3aafc000}, {0x3aafe000}, {0x3ab00000}, {0x3ab02000}, {0x3ab04000}, {0x3ab06000}, {0x3ab08000}, {0x3ab0a000}, {0x3ab0c000}, {0x3ab0e000}, {0x3ab10000}, {0x3ab12000}, {0x3ab14000}, {0x3ab16000}, {0x3ab18000}, {0x3ab1a000}, {0x3ab1c000}, {0x3ab1e000}, {0x3ab20000}, {0x3ab22000}, {0x3ab24000}, {0x3ab26000}, {0x3ab28000}, {0x3ab2a000}, {0x3ab2c000}, {0x3ab2e000}, {0x3ab30000}, {0x3ab32000}, {0x3ab34000}, {0x3ab36000}, {0x3ab38000}, {0x3ab3a000}, {0x3ab3c000}, {0x3ab3e000}, {0x3ab40000}, {0x3ab42000}, {0x3ab44000}, {0x3ab46000}, {0x3ab48000}, {0x3ab4a000}, {0x3ab4c000}, {0x3ab4e000}, {0x3ab50000}, {0x3ab52000}, {0x3ab54000}, {0x3ab56000}, {0x3ab58000}, {0x3ab5a000}, {0x3ab5c000}, {0x3ab5e000}, {0x3ab60000}, {0x3ab62000}, {0x3ab64000}, {0x3ab66000}, {0x3ab68000}, {0x3ab6a000}, {0x3ab6c000}, {0x3ab6e000}, {0x3ab70000}, {0x3ab72000}, {0x3ab74000}, {0x3ab76000}, {0x3ab78000}, {0x3ab7a000}, {0x3ab7c000}, {0x3ab7e000}, {0x3ab80000}, {0x3ab82000}, {0x3ab84000}, {0x3ab86000}, {0x3ab88000}, {0x3ab8a000}, {0x3ab8c000}, {0x3ab8e000}, {0x3ab90000}, {0x3ab92000}, {0x3ab94000}, {0x3ab96000}, {0x3ab98000}, {0x3ab9a000}, {0x3ab9c000}, {0x3ab9e000}, {0x3aba0000}, {0x3aba2000}, {0x3aba4000}, {0x3aba6000}, {0x3aba8000}, {0x3abaa000}, {0x3abac000}, {0x3abae000}, {0x3abb0000}, {0x3abb2000}, {0x3abb4000}, {0x3abb6000}, {0x3abb8000}, {0x3abba000}, {0x3abbc000}, {0x3abbe000}, {0x3abc0000}, {0x3abc2000}, {0x3abc4000}, {0x3abc6000}, {0x3abc8000}, {0x3abca000}, {0x3abcc000}, {0x3abce000}, {0x3abd0000}, {0x3abd2000}, {0x3abd4000}, {0x3abd6000}, {0x3abd8000}, {0x3abda000}, {0x3abdc000}, {0x3abde000}, {0x3abe0000}, {0x3abe2000}, {0x3abe4000}, {0x3abe6000}, {0x3abe8000}, {0x3abea000}, {0x3abec000}, {0x3abee000}, {0x3abf0000}, {0x3abf2000}, {0x3abf4000}, {0x3abf6000}, {0x3abf8000}, {0x3abfa000}, {0x3abfc000}, {0x3abfe000}, {0x3ac00000}, {0x3ac02000}, {0x3ac04000}, {0x3ac06000}, {0x3ac08000}, {0x3ac0a000}, {0x3ac0c000}, {0x3ac0e000}, {0x3ac10000}, {0x3ac12000}, {0x3ac14000}, {0x3ac16000}, {0x3ac18000}, {0x3ac1a000}, {0x3ac1c000}, {0x3ac1e000}, {0x3ac20000}, {0x3ac22000}, {0x3ac24000}, {0x3ac26000}, {0x3ac28000}, {0x3ac2a000}, {0x3ac2c000}, {0x3ac2e000}, {0x3ac30000}, {0x3ac32000}, {0x3ac34000}, {0x3ac36000}, {0x3ac38000}, {0x3ac3a000}, {0x3ac3c000}, {0x3ac3e000}, {0x3ac40000}, {0x3ac42000}, {0x3ac44000}, {0x3ac46000}, {0x3ac48000}, {0x3ac4a000}, {0x3ac4c000}, {0x3ac4e000}, {0x3ac50000}, {0x3ac52000}, {0x3ac54000}, {0x3ac56000}, {0x3ac58000}, {0x3ac5a000}, {0x3ac5c000}, {0x3ac5e000}, {0x3ac60000}, {0x3ac62000}, {0x3ac64000}, {0x3ac66000}, {0x3ac68000}, {0x3ac6a000}, {0x3ac6c000}, {0x3ac6e000}, {0x3ac70000}, {0x3ac72000}, {0x3ac74000}, {0x3ac76000}, {0x3ac78000}, {0x3ac7a000}, {0x3ac7c000}, {0x3ac7e000}, {0x3ac80000}, {0x3ac82000}, {0x3ac84000}, {0x3ac86000}, {0x3ac88000}, {0x3ac8a000}, {0x3ac8c000}, {0x3ac8e000}, {0x3ac90000}, {0x3ac92000}, {0x3ac94000}, {0x3ac96000}, {0x3ac98000}, {0x3ac9a000}, {0x3ac9c000}, {0x3ac9e000}, {0x3aca0000}, {0x3aca2000}, {0x3aca4000}, {0x3aca6000}, {0x3aca8000}, {0x3acaa000}, {0x3acac000}, {0x3acae000}, {0x3acb0000}, {0x3acb2000}, {0x3acb4000}, {0x3acb6000}, {0x3acb8000}, {0x3acba000}, {0x3acbc000}, {0x3acbe000}, {0x3acc0000}, {0x3acc2000}, {0x3acc4000}, {0x3acc6000}, {0x3acc8000}, {0x3acca000}, {0x3accc000}, {0x3acce000}, {0x3acd0000}, {0x3acd2000}, {0x3acd4000}, {0x3acd6000}, {0x3acd8000}, {0x3acda000}, {0x3acdc000}, {0x3acde000}, {0x3ace0000}, {0x3ace2000}, {0x3ace4000}, {0x3ace6000}, {0x3ace8000}, {0x3acea000}, {0x3acec000}, {0x3acee000}, {0x3acf0000}, {0x3acf2000}, {0x3acf4000}, {0x3acf6000}, {0x3acf8000}, {0x3acfa000}, {0x3acfc000}, {0x3acfe000}, {0x3ad00000}, {0x3ad02000}, {0x3ad04000}, {0x3ad06000}, {0x3ad08000}, {0x3ad0a000}, {0x3ad0c000}, {0x3ad0e000}, {0x3ad10000}, {0x3ad12000}, {0x3ad14000}, {0x3ad16000}, {0x3ad18000}, {0x3ad1a000}, {0x3ad1c000}, {0x3ad1e000}, {0x3ad20000}, {0x3ad22000}, {0x3ad24000}, {0x3ad26000}, {0x3ad28000}, {0x3ad2a000}, {0x3ad2c000}, {0x3ad2e000}, {0x3ad30000}, {0x3ad32000}, {0x3ad34000}, {0x3ad36000}, {0x3ad38000}, {0x3ad3a000}, {0x3ad3c000}, {0x3ad3e000}, {0x3ad40000}, {0x3ad42000}, {0x3ad44000}, {0x3ad46000}, {0x3ad48000}, {0x3ad4a000}, {0x3ad4c000}, {0x3ad4e000}, {0x3ad50000}, {0x3ad52000}, {0x3ad54000}, {0x3ad56000}, {0x3ad58000}, {0x3ad5a000}, {0x3ad5c000}, {0x3ad5e000}, {0x3ad60000}, {0x3ad62000}, {0x3ad64000}, {0x3ad66000}, {0x3ad68000}, {0x3ad6a000}, {0x3ad6c000}, {0x3ad6e000}, {0x3ad70000}, {0x3ad72000}, {0x3ad74000}, {0x3ad76000}, {0x3ad78000}, {0x3ad7a000}, {0x3ad7c000}, {0x3ad7e000}, {0x3ad80000}, {0x3ad82000}, {0x3ad84000}, {0x3ad86000}, {0x3ad88000}, {0x3ad8a000}, {0x3ad8c000}, {0x3ad8e000}, {0x3ad90000}, {0x3ad92000}, {0x3ad94000}, {0x3ad96000}, {0x3ad98000}, {0x3ad9a000}, {0x3ad9c000}, {0x3ad9e000}, {0x3ada0000}, {0x3ada2000}, {0x3ada4000}, {0x3ada6000}, {0x3ada8000}, {0x3adaa000}, {0x3adac000}, {0x3adae000}, {0x3adb0000}, {0x3adb2000}, {0x3adb4000}, {0x3adb6000}, {0x3adb8000}, {0x3adba000}, {0x3adbc000}, {0x3adbe000}, {0x3adc0000}, {0x3adc2000}, {0x3adc4000}, {0x3adc6000}, {0x3adc8000}, {0x3adca000}, {0x3adcc000}, {0x3adce000}, {0x3add0000}, {0x3add2000}, {0x3add4000}, {0x3add6000}, {0x3add8000}, {0x3adda000}, {0x3addc000}, {0x3adde000}, {0x3ade0000}, {0x3ade2000}, {0x3ade4000}, {0x3ade6000}, {0x3ade8000}, {0x3adea000}, {0x3adec000}, {0x3adee000}, {0x3adf0000}, {0x3adf2000}, {0x3adf4000}, {0x3adf6000}, {0x3adf8000}, {0x3adfa000}, {0x3adfc000}, {0x3adfe000}, {0x3ae00000}, {0x3ae02000}, {0x3ae04000}, {0x3ae06000}, {0x3ae08000}, {0x3ae0a000}, {0x3ae0c000}, {0x3ae0e000}, {0x3ae10000}, {0x3ae12000}, {0x3ae14000}, {0x3ae16000}, {0x3ae18000}, {0x3ae1a000}, {0x3ae1c000}, {0x3ae1e000}, {0x3ae20000}, {0x3ae22000}, {0x3ae24000}, {0x3ae26000}, {0x3ae28000}, {0x3ae2a000}, {0x3ae2c000}, {0x3ae2e000}, {0x3ae30000}, {0x3ae32000}, {0x3ae34000}, {0x3ae36000}, {0x3ae38000}, {0x3ae3a000}, {0x3ae3c000}, {0x3ae3e000}, {0x3ae40000}, {0x3ae42000}, {0x3ae44000}, {0x3ae46000}, {0x3ae48000}, {0x3ae4a000}, {0x3ae4c000}, {0x3ae4e000}, {0x3ae50000}, {0x3ae52000}, {0x3ae54000}, {0x3ae56000}, {0x3ae58000}, {0x3ae5a000}, {0x3ae5c000}, {0x3ae5e000}, {0x3ae60000}, {0x3ae62000}, {0x3ae64000}, {0x3ae66000}, {0x3ae68000}, {0x3ae6a000}, {0x3ae6c000}, {0x3ae6e000}, {0x3ae70000}, {0x3ae72000}, {0x3ae74000}, {0x3ae76000}, {0x3ae78000}, {0x3ae7a000}, {0x3ae7c000}, {0x3ae7e000}, {0x3ae80000}, {0x3ae82000}, {0x3ae84000}, {0x3ae86000}, {0x3ae88000}, {0x3ae8a000}, {0x3ae8c000}, {0x3ae8e000}, {0x3ae90000}, {0x3ae92000}, {0x3ae94000}, {0x3ae96000}, {0x3ae98000}, {0x3ae9a000}, {0x3ae9c000}, {0x3ae9e000}, {0x3aea0000}, {0x3aea2000}, {0x3aea4000}, {0x3aea6000}, {0x3aea8000}, {0x3aeaa000}, {0x3aeac000}, {0x3aeae000}, {0x3aeb0000}, {0x3aeb2000}, {0x3aeb4000}, {0x3aeb6000}, {0x3aeb8000}, {0x3aeba000}, {0x3aebc000}, {0x3aebe000}, {0x3aec0000}, {0x3aec2000}, {0x3aec4000}, {0x3aec6000}, {0x3aec8000}, {0x3aeca000}, {0x3aecc000}, {0x3aece000}, {0x3aed0000}, {0x3aed2000}, {0x3aed4000}, {0x3aed6000}, {0x3aed8000}, {0x3aeda000}, {0x3aedc000}, {0x3aede000}, {0x3aee0000}, {0x3aee2000}, {0x3aee4000}, {0x3aee6000}, {0x3aee8000}, {0x3aeea000}, {0x3aeec000}, {0x3aeee000}, {0x3aef0000}, {0x3aef2000}, {0x3aef4000}, {0x3aef6000}, {0x3aef8000}, {0x3aefa000}, {0x3aefc000}, {0x3aefe000}, {0x3af00000}, {0x3af02000}, {0x3af04000}, {0x3af06000}, {0x3af08000}, {0x3af0a000}, {0x3af0c000}, {0x3af0e000}, {0x3af10000}, {0x3af12000}, {0x3af14000}, {0x3af16000}, {0x3af18000}, {0x3af1a000}, {0x3af1c000}, {0x3af1e000}, {0x3af20000}, {0x3af22000}, {0x3af24000}, {0x3af26000}, {0x3af28000}, {0x3af2a000}, {0x3af2c000}, {0x3af2e000}, {0x3af30000}, {0x3af32000}, {0x3af34000}, {0x3af36000}, {0x3af38000}, {0x3af3a000}, {0x3af3c000}, {0x3af3e000}, {0x3af40000}, {0x3af42000}, {0x3af44000}, {0x3af46000}, {0x3af48000}, {0x3af4a000}, {0x3af4c000}, {0x3af4e000}, {0x3af50000}, {0x3af52000}, {0x3af54000}, {0x3af56000}, {0x3af58000}, {0x3af5a000}, {0x3af5c000}, {0x3af5e000}, {0x3af60000}, {0x3af62000}, {0x3af64000}, {0x3af66000}, {0x3af68000}, {0x3af6a000}, {0x3af6c000}, {0x3af6e000}, {0x3af70000}, {0x3af72000}, {0x3af74000}, {0x3af76000}, {0x3af78000}, {0x3af7a000}, {0x3af7c000}, {0x3af7e000}, {0x3af80000}, {0x3af82000}, {0x3af84000}, {0x3af86000}, {0x3af88000}, {0x3af8a000}, {0x3af8c000}, {0x3af8e000}, {0x3af90000}, {0x3af92000}, {0x3af94000}, {0x3af96000}, {0x3af98000}, {0x3af9a000}, {0x3af9c000}, {0x3af9e000}, {0x3afa0000}, {0x3afa2000}, {0x3afa4000}, {0x3afa6000}, {0x3afa8000}, {0x3afaa000}, {0x3afac000}, {0x3afae000}, {0x3afb0000}, {0x3afb2000}, {0x3afb4000}, {0x3afb6000}, {0x3afb8000}, {0x3afba000}, {0x3afbc000}, {0x3afbe000}, {0x3afc0000}, {0x3afc2000}, {0x3afc4000}, {0x3afc6000}, {0x3afc8000}, {0x3afca000}, {0x3afcc000}, {0x3afce000}, {0x3afd0000}, {0x3afd2000}, {0x3afd4000}, {0x3afd6000}, {0x3afd8000}, {0x3afda000}, {0x3afdc000}, {0x3afde000}, {0x3afe0000}, {0x3afe2000}, {0x3afe4000}, {0x3afe6000}, {0x3afe8000}, {0x3afea000}, {0x3afec000}, {0x3afee000}, {0x3aff0000}, {0x3aff2000}, {0x3aff4000}, {0x3aff6000}, {0x3aff8000}, {0x3affa000}, {0x3affc000}, {0x3affe000}, {0x3b000000}, {0x3b002000}, {0x3b004000}, {0x3b006000}, {0x3b008000}, {0x3b00a000}, {0x3b00c000}, {0x3b00e000}, {0x3b010000}, {0x3b012000}, {0x3b014000}, {0x3b016000}, {0x3b018000}, {0x3b01a000}, {0x3b01c000}, {0x3b01e000}, {0x3b020000}, {0x3b022000}, {0x3b024000}, {0x3b026000}, {0x3b028000}, {0x3b02a000}, {0x3b02c000}, {0x3b02e000}, {0x3b030000}, {0x3b032000}, {0x3b034000}, {0x3b036000}, {0x3b038000}, {0x3b03a000}, {0x3b03c000}, {0x3b03e000}, {0x3b040000}, {0x3b042000}, {0x3b044000}, {0x3b046000}, {0x3b048000}, {0x3b04a000}, {0x3b04c000}, {0x3b04e000}, {0x3b050000}, {0x3b052000}, {0x3b054000}, {0x3b056000}, {0x3b058000}, {0x3b05a000}, {0x3b05c000}, {0x3b05e000}, {0x3b060000}, {0x3b062000}, {0x3b064000}, {0x3b066000}, {0x3b068000}, {0x3b06a000}, {0x3b06c000}, {0x3b06e000}, {0x3b070000}, {0x3b072000}, {0x3b074000}, {0x3b076000}, {0x3b078000}, {0x3b07a000}, {0x3b07c000}, {0x3b07e000}, {0x3b080000}, {0x3b082000}, {0x3b084000}, {0x3b086000}, {0x3b088000}, {0x3b08a000}, {0x3b08c000}, {0x3b08e000}, {0x3b090000}, {0x3b092000}, {0x3b094000}, {0x3b096000}, {0x3b098000}, {0x3b09a000}, {0x3b09c000}, {0x3b09e000}, {0x3b0a0000}, {0x3b0a2000}, {0x3b0a4000}, {0x3b0a6000}, {0x3b0a8000}, {0x3b0aa000}, {0x3b0ac000}, {0x3b0ae000}, {0x3b0b0000}, {0x3b0b2000}, {0x3b0b4000}, {0x3b0b6000}, {0x3b0b8000}, {0x3b0ba000}, {0x3b0bc000}, {0x3b0be000}, {0x3b0c0000}, {0x3b0c2000}, {0x3b0c4000}, {0x3b0c6000}, {0x3b0c8000}, {0x3b0ca000}, {0x3b0cc000}, {0x3b0ce000}, {0x3b0d0000}, {0x3b0d2000}, {0x3b0d4000}, {0x3b0d6000}, {0x3b0d8000}, {0x3b0da000}, {0x3b0dc000}, {0x3b0de000}, {0x3b0e0000}, {0x3b0e2000}, {0x3b0e4000}, {0x3b0e6000}, {0x3b0e8000}, {0x3b0ea000}, {0x3b0ec000}, {0x3b0ee000}, {0x3b0f0000}, {0x3b0f2000}, {0x3b0f4000}, {0x3b0f6000}, {0x3b0f8000}, {0x3b0fa000}, {0x3b0fc000}, {0x3b0fe000}, {0x3b100000}, {0x3b102000}, {0x3b104000}, {0x3b106000}, {0x3b108000}, {0x3b10a000}, {0x3b10c000}, {0x3b10e000}, {0x3b110000}, {0x3b112000}, {0x3b114000}, {0x3b116000}, {0x3b118000}, {0x3b11a000}, {0x3b11c000}, {0x3b11e000}, {0x3b120000}, {0x3b122000}, {0x3b124000}, {0x3b126000}, {0x3b128000}, {0x3b12a000}, {0x3b12c000}, {0x3b12e000}, {0x3b130000}, {0x3b132000}, {0x3b134000}, {0x3b136000}, {0x3b138000}, {0x3b13a000}, {0x3b13c000}, {0x3b13e000}, {0x3b140000}, {0x3b142000}, {0x3b144000}, {0x3b146000}, {0x3b148000}, {0x3b14a000}, {0x3b14c000}, {0x3b14e000}, {0x3b150000}, {0x3b152000}, {0x3b154000}, {0x3b156000}, {0x3b158000}, {0x3b15a000}, {0x3b15c000}, {0x3b15e000}, {0x3b160000}, {0x3b162000}, {0x3b164000}, {0x3b166000}, {0x3b168000}, {0x3b16a000}, {0x3b16c000}, {0x3b16e000}, {0x3b170000}, {0x3b172000}, {0x3b174000}, {0x3b176000}, {0x3b178000}, {0x3b17a000}, {0x3b17c000}, {0x3b17e000}, {0x3b180000}, {0x3b182000}, {0x3b184000}, {0x3b186000}, {0x3b188000}, {0x3b18a000}, {0x3b18c000}, {0x3b18e000}, {0x3b190000}, {0x3b192000}, {0x3b194000}, {0x3b196000}, {0x3b198000}, {0x3b19a000}, {0x3b19c000}, {0x3b19e000}, {0x3b1a0000}, {0x3b1a2000}, {0x3b1a4000}, {0x3b1a6000}, {0x3b1a8000}, {0x3b1aa000}, {0x3b1ac000}, {0x3b1ae000}, {0x3b1b0000}, {0x3b1b2000}, {0x3b1b4000}, {0x3b1b6000}, {0x3b1b8000}, {0x3b1ba000}, {0x3b1bc000}, {0x3b1be000}, {0x3b1c0000}, {0x3b1c2000}, {0x3b1c4000}, {0x3b1c6000}, {0x3b1c8000}, {0x3b1ca000}, {0x3b1cc000}, {0x3b1ce000}, {0x3b1d0000}, {0x3b1d2000}, {0x3b1d4000}, {0x3b1d6000}, {0x3b1d8000}, {0x3b1da000}, {0x3b1dc000}, {0x3b1de000}, {0x3b1e0000}, {0x3b1e2000}, {0x3b1e4000}, {0x3b1e6000}, {0x3b1e8000}, {0x3b1ea000}, {0x3b1ec000}, {0x3b1ee000}, {0x3b1f0000}, {0x3b1f2000}, {0x3b1f4000}, {0x3b1f6000}, {0x3b1f8000}, {0x3b1fa000}, {0x3b1fc000}, {0x3b1fe000}, {0x3b200000}, {0x3b202000}, {0x3b204000}, {0x3b206000}, {0x3b208000}, {0x3b20a000}, {0x3b20c000}, {0x3b20e000}, {0x3b210000}, {0x3b212000}, {0x3b214000}, {0x3b216000}, {0x3b218000}, {0x3b21a000}, {0x3b21c000}, {0x3b21e000}, {0x3b220000}, {0x3b222000}, {0x3b224000}, {0x3b226000}, {0x3b228000}, {0x3b22a000}, {0x3b22c000}, {0x3b22e000}, {0x3b230000}, {0x3b232000}, {0x3b234000}, {0x3b236000}, {0x3b238000}, {0x3b23a000}, {0x3b23c000}, {0x3b23e000}, {0x3b240000}, {0x3b242000}, {0x3b244000}, {0x3b246000}, {0x3b248000}, {0x3b24a000}, {0x3b24c000}, {0x3b24e000}, {0x3b250000}, {0x3b252000}, {0x3b254000}, {0x3b256000}, {0x3b258000}, {0x3b25a000}, {0x3b25c000}, {0x3b25e000}, {0x3b260000}, {0x3b262000}, {0x3b264000}, {0x3b266000}, {0x3b268000}, {0x3b26a000}, {0x3b26c000}, {0x3b26e000}, {0x3b270000}, {0x3b272000}, {0x3b274000}, {0x3b276000}, {0x3b278000}, {0x3b27a000}, {0x3b27c000}, {0x3b27e000}, {0x3b280000}, {0x3b282000}, {0x3b284000}, {0x3b286000}, {0x3b288000}, {0x3b28a000}, {0x3b28c000}, {0x3b28e000}, {0x3b290000}, {0x3b292000}, {0x3b294000}, {0x3b296000}, {0x3b298000}, {0x3b29a000}, {0x3b29c000}, {0x3b29e000}, {0x3b2a0000}, {0x3b2a2000}, {0x3b2a4000}, {0x3b2a6000}, {0x3b2a8000}, {0x3b2aa000}, {0x3b2ac000}, {0x3b2ae000}, {0x3b2b0000}, {0x3b2b2000}, {0x3b2b4000}, {0x3b2b6000}, {0x3b2b8000}, {0x3b2ba000}, {0x3b2bc000}, {0x3b2be000}, {0x3b2c0000}, {0x3b2c2000}, {0x3b2c4000}, {0x3b2c6000}, {0x3b2c8000}, {0x3b2ca000}, {0x3b2cc000}, {0x3b2ce000}, {0x3b2d0000}, {0x3b2d2000}, {0x3b2d4000}, {0x3b2d6000}, {0x3b2d8000}, {0x3b2da000}, {0x3b2dc000}, {0x3b2de000}, {0x3b2e0000}, {0x3b2e2000}, {0x3b2e4000}, {0x3b2e6000}, {0x3b2e8000}, {0x3b2ea000}, {0x3b2ec000}, {0x3b2ee000}, {0x3b2f0000}, {0x3b2f2000}, {0x3b2f4000}, {0x3b2f6000}, {0x3b2f8000}, {0x3b2fa000}, {0x3b2fc000}, {0x3b2fe000}, {0x3b300000}, {0x3b302000}, {0x3b304000}, {0x3b306000}, {0x3b308000}, {0x3b30a000}, {0x3b30c000}, {0x3b30e000}, {0x3b310000}, {0x3b312000}, {0x3b314000}, {0x3b316000}, {0x3b318000}, {0x3b31a000}, {0x3b31c000}, {0x3b31e000}, {0x3b320000}, {0x3b322000}, {0x3b324000}, {0x3b326000}, {0x3b328000}, {0x3b32a000}, {0x3b32c000}, {0x3b32e000}, {0x3b330000}, {0x3b332000}, {0x3b334000}, {0x3b336000}, {0x3b338000}, {0x3b33a000}, {0x3b33c000}, {0x3b33e000}, {0x3b340000}, {0x3b342000}, {0x3b344000}, {0x3b346000}, {0x3b348000}, {0x3b34a000}, {0x3b34c000}, {0x3b34e000}, {0x3b350000}, {0x3b352000}, {0x3b354000}, {0x3b356000}, {0x3b358000}, {0x3b35a000}, {0x3b35c000}, {0x3b35e000}, {0x3b360000}, {0x3b362000}, {0x3b364000}, {0x3b366000}, {0x3b368000}, {0x3b36a000}, {0x3b36c000}, {0x3b36e000}, {0x3b370000}, {0x3b372000}, {0x3b374000}, {0x3b376000}, {0x3b378000}, {0x3b37a000}, {0x3b37c000}, {0x3b37e000}, {0x3b380000}, {0x3b382000}, {0x3b384000}, {0x3b386000}, {0x3b388000}, {0x3b38a000}, {0x3b38c000}, {0x3b38e000}, {0x3b390000}, {0x3b392000}, {0x3b394000}, {0x3b396000}, {0x3b398000}, {0x3b39a000}, {0x3b39c000}, {0x3b39e000}, {0x3b3a0000}, {0x3b3a2000}, {0x3b3a4000}, {0x3b3a6000}, {0x3b3a8000}, {0x3b3aa000}, {0x3b3ac000}, {0x3b3ae000}, {0x3b3b0000}, {0x3b3b2000}, {0x3b3b4000}, {0x3b3b6000}, {0x3b3b8000}, {0x3b3ba000}, {0x3b3bc000}, {0x3b3be000}, {0x3b3c0000}, {0x3b3c2000}, {0x3b3c4000}, {0x3b3c6000}, {0x3b3c8000}, {0x3b3ca000}, {0x3b3cc000}, {0x3b3ce000}, {0x3b3d0000}, {0x3b3d2000}, {0x3b3d4000}, {0x3b3d6000}, {0x3b3d8000}, {0x3b3da000}, {0x3b3dc000}, {0x3b3de000}, {0x3b3e0000}, {0x3b3e2000}, {0x3b3e4000}, {0x3b3e6000}, {0x3b3e8000}, {0x3b3ea000}, {0x3b3ec000}, {0x3b3ee000}, {0x3b3f0000}, {0x3b3f2000}, {0x3b3f4000}, {0x3b3f6000}, {0x3b3f8000}, {0x3b3fa000}, {0x3b3fc000}, {0x3b3fe000}, {0x3b400000}, {0x3b402000}, {0x3b404000}, {0x3b406000}, {0x3b408000}, {0x3b40a000}, {0x3b40c000}, {0x3b40e000}, {0x3b410000}, {0x3b412000}, {0x3b414000}, {0x3b416000}, {0x3b418000}, {0x3b41a000}, {0x3b41c000}, {0x3b41e000}, {0x3b420000}, {0x3b422000}, {0x3b424000}, {0x3b426000}, {0x3b428000}, {0x3b42a000}, {0x3b42c000}, {0x3b42e000}, {0x3b430000}, {0x3b432000}, {0x3b434000}, {0x3b436000}, {0x3b438000}, {0x3b43a000}, {0x3b43c000}, {0x3b43e000}, {0x3b440000}, {0x3b442000}, {0x3b444000}, {0x3b446000}, {0x3b448000}, {0x3b44a000}, {0x3b44c000}, {0x3b44e000}, {0x3b450000}, {0x3b452000}, {0x3b454000}, {0x3b456000}, {0x3b458000}, {0x3b45a000}, {0x3b45c000}, {0x3b45e000}, {0x3b460000}, {0x3b462000}, {0x3b464000}, {0x3b466000}, {0x3b468000}, {0x3b46a000}, {0x3b46c000}, {0x3b46e000}, {0x3b470000}, {0x3b472000}, {0x3b474000}, {0x3b476000}, {0x3b478000}, {0x3b47a000}, {0x3b47c000}, {0x3b47e000}, {0x3b480000}, {0x3b482000}, {0x3b484000}, {0x3b486000}, {0x3b488000}, {0x3b48a000}, {0x3b48c000}, {0x3b48e000}, {0x3b490000}, {0x3b492000}, {0x3b494000}, {0x3b496000}, {0x3b498000}, {0x3b49a000}, {0x3b49c000}, {0x3b49e000}, {0x3b4a0000}, {0x3b4a2000}, {0x3b4a4000}, {0x3b4a6000}, {0x3b4a8000}, {0x3b4aa000}, {0x3b4ac000}, {0x3b4ae000}, {0x3b4b0000}, {0x3b4b2000}, {0x3b4b4000}, {0x3b4b6000}, {0x3b4b8000}, {0x3b4ba000}, {0x3b4bc000}, {0x3b4be000}, {0x3b4c0000}, {0x3b4c2000}, {0x3b4c4000}, {0x3b4c6000}, {0x3b4c8000}, {0x3b4ca000}, {0x3b4cc000}, {0x3b4ce000}, {0x3b4d0000}, {0x3b4d2000}, {0x3b4d4000}, {0x3b4d6000}, {0x3b4d8000}, {0x3b4da000}, {0x3b4dc000}, {0x3b4de000}, {0x3b4e0000}, {0x3b4e2000}, {0x3b4e4000}, {0x3b4e6000}, {0x3b4e8000}, {0x3b4ea000}, {0x3b4ec000}, {0x3b4ee000}, {0x3b4f0000}, {0x3b4f2000}, {0x3b4f4000}, {0x3b4f6000}, {0x3b4f8000}, {0x3b4fa000}, {0x3b4fc000}, {0x3b4fe000}, {0x3b500000}, {0x3b502000}, {0x3b504000}, {0x3b506000}, {0x3b508000}, {0x3b50a000}, {0x3b50c000}, {0x3b50e000}, {0x3b510000}, {0x3b512000}, {0x3b514000}, {0x3b516000}, {0x3b518000}, {0x3b51a000}, {0x3b51c000}, {0x3b51e000}, {0x3b520000}, {0x3b522000}, {0x3b524000}, {0x3b526000}, {0x3b528000}, {0x3b52a000}, {0x3b52c000}, {0x3b52e000}, {0x3b530000}, {0x3b532000}, {0x3b534000}, {0x3b536000}, {0x3b538000}, {0x3b53a000}, {0x3b53c000}, {0x3b53e000}, {0x3b540000}, {0x3b542000}, {0x3b544000}, {0x3b546000}, {0x3b548000}, {0x3b54a000}, {0x3b54c000}, {0x3b54e000}, {0x3b550000}, {0x3b552000}, {0x3b554000}, {0x3b556000}, {0x3b558000}, {0x3b55a000}, {0x3b55c000}, {0x3b55e000}, {0x3b560000}, {0x3b562000}, {0x3b564000}, {0x3b566000}, {0x3b568000}, {0x3b56a000}, {0x3b56c000}, {0x3b56e000}, {0x3b570000}, {0x3b572000}, {0x3b574000}, {0x3b576000}, {0x3b578000}, {0x3b57a000}, {0x3b57c000}, {0x3b57e000}, {0x3b580000}, {0x3b582000}, {0x3b584000}, {0x3b586000}, {0x3b588000}, {0x3b58a000}, {0x3b58c000}, {0x3b58e000}, {0x3b590000}, {0x3b592000}, {0x3b594000}, {0x3b596000}, {0x3b598000}, {0x3b59a000}, {0x3b59c000}, {0x3b59e000}, {0x3b5a0000}, {0x3b5a2000}, {0x3b5a4000}, {0x3b5a6000}, {0x3b5a8000}, {0x3b5aa000}, {0x3b5ac000}, {0x3b5ae000}, {0x3b5b0000}, {0x3b5b2000}, {0x3b5b4000}, {0x3b5b6000}, {0x3b5b8000}, {0x3b5ba000}, {0x3b5bc000}, {0x3b5be000}, {0x3b5c0000}, {0x3b5c2000}, {0x3b5c4000}, {0x3b5c6000}, {0x3b5c8000}, {0x3b5ca000}, {0x3b5cc000}, {0x3b5ce000}, {0x3b5d0000}, {0x3b5d2000}, {0x3b5d4000}, {0x3b5d6000}, {0x3b5d8000}, {0x3b5da000}, {0x3b5dc000}, {0x3b5de000}, {0x3b5e0000}, {0x3b5e2000}, {0x3b5e4000}, {0x3b5e6000}, {0x3b5e8000}, {0x3b5ea000}, {0x3b5ec000}, {0x3b5ee000}, {0x3b5f0000}, {0x3b5f2000}, {0x3b5f4000}, {0x3b5f6000}, {0x3b5f8000}, {0x3b5fa000}, {0x3b5fc000}, {0x3b5fe000}, {0x3b600000}, {0x3b602000}, {0x3b604000}, {0x3b606000}, {0x3b608000}, {0x3b60a000}, {0x3b60c000}, {0x3b60e000}, {0x3b610000}, {0x3b612000}, {0x3b614000}, {0x3b616000}, {0x3b618000}, {0x3b61a000}, {0x3b61c000}, {0x3b61e000}, {0x3b620000}, {0x3b622000}, {0x3b624000}, {0x3b626000}, {0x3b628000}, {0x3b62a000}, {0x3b62c000}, {0x3b62e000}, {0x3b630000}, {0x3b632000}, {0x3b634000}, {0x3b636000}, {0x3b638000}, {0x3b63a000}, {0x3b63c000}, {0x3b63e000}, {0x3b640000}, {0x3b642000}, {0x3b644000}, {0x3b646000}, {0x3b648000}, {0x3b64a000}, {0x3b64c000}, {0x3b64e000}, {0x3b650000}, {0x3b652000}, {0x3b654000}, {0x3b656000}, {0x3b658000}, {0x3b65a000}, {0x3b65c000}, {0x3b65e000}, {0x3b660000}, {0x3b662000}, {0x3b664000}, {0x3b666000}, {0x3b668000}, {0x3b66a000}, {0x3b66c000}, {0x3b66e000}, {0x3b670000}, {0x3b672000}, {0x3b674000}, {0x3b676000}, {0x3b678000}, {0x3b67a000}, {0x3b67c000}, {0x3b67e000}, {0x3b680000}, {0x3b682000}, {0x3b684000}, {0x3b686000}, {0x3b688000}, {0x3b68a000}, {0x3b68c000}, {0x3b68e000}, {0x3b690000}, {0x3b692000}, {0x3b694000}, {0x3b696000}, {0x3b698000}, {0x3b69a000}, {0x3b69c000}, {0x3b69e000}, {0x3b6a0000}, {0x3b6a2000}, {0x3b6a4000}, {0x3b6a6000}, {0x3b6a8000}, {0x3b6aa000}, {0x3b6ac000}, {0x3b6ae000}, {0x3b6b0000}, {0x3b6b2000}, {0x3b6b4000}, {0x3b6b6000}, {0x3b6b8000}, {0x3b6ba000}, {0x3b6bc000}, {0x3b6be000}, {0x3b6c0000}, {0x3b6c2000}, {0x3b6c4000}, {0x3b6c6000}, {0x3b6c8000}, {0x3b6ca000}, {0x3b6cc000}, {0x3b6ce000}, {0x3b6d0000}, {0x3b6d2000}, {0x3b6d4000}, {0x3b6d6000}, {0x3b6d8000}, {0x3b6da000}, {0x3b6dc000}, {0x3b6de000}, {0x3b6e0000}, {0x3b6e2000}, {0x3b6e4000}, {0x3b6e6000}, {0x3b6e8000}, {0x3b6ea000}, {0x3b6ec000}, {0x3b6ee000}, {0x3b6f0000}, {0x3b6f2000}, {0x3b6f4000}, {0x3b6f6000}, {0x3b6f8000}, {0x3b6fa000}, {0x3b6fc000}, {0x3b6fe000}, {0x3b700000}, {0x3b702000}, {0x3b704000}, {0x3b706000}, {0x3b708000}, {0x3b70a000}, {0x3b70c000}, {0x3b70e000}, {0x3b710000}, {0x3b712000}, {0x3b714000}, {0x3b716000}, {0x3b718000}, {0x3b71a000}, {0x3b71c000}, {0x3b71e000}, {0x3b720000}, {0x3b722000}, {0x3b724000}, {0x3b726000}, {0x3b728000}, {0x3b72a000}, {0x3b72c000}, {0x3b72e000}, {0x3b730000}, {0x3b732000}, {0x3b734000}, {0x3b736000}, {0x3b738000}, {0x3b73a000}, {0x3b73c000}, {0x3b73e000}, {0x3b740000}, {0x3b742000}, {0x3b744000}, {0x3b746000}, {0x3b748000}, {0x3b74a000}, {0x3b74c000}, {0x3b74e000}, {0x3b750000}, {0x3b752000}, {0x3b754000}, {0x3b756000}, {0x3b758000}, {0x3b75a000}, {0x3b75c000}, {0x3b75e000}, {0x3b760000}, {0x3b762000}, {0x3b764000}, {0x3b766000}, {0x3b768000}, {0x3b76a000}, {0x3b76c000}, {0x3b76e000}, {0x3b770000}, {0x3b772000}, {0x3b774000}, {0x3b776000}, {0x3b778000}, {0x3b77a000}, {0x3b77c000}, {0x3b77e000}, {0x3b780000}, {0x3b782000}, {0x3b784000}, {0x3b786000}, {0x3b788000}, {0x3b78a000}, {0x3b78c000}, {0x3b78e000}, {0x3b790000}, {0x3b792000}, {0x3b794000}, {0x3b796000}, {0x3b798000}, {0x3b79a000}, {0x3b79c000}, {0x3b79e000}, {0x3b7a0000}, {0x3b7a2000}, {0x3b7a4000}, {0x3b7a6000}, {0x3b7a8000}, {0x3b7aa000}, {0x3b7ac000}, {0x3b7ae000}, {0x3b7b0000}, {0x3b7b2000}, {0x3b7b4000}, {0x3b7b6000}, {0x3b7b8000}, {0x3b7ba000}, {0x3b7bc000}, {0x3b7be000}, {0x3b7c0000}, {0x3b7c2000}, {0x3b7c4000}, {0x3b7c6000}, {0x3b7c8000}, {0x3b7ca000}, {0x3b7cc000}, {0x3b7ce000}, {0x3b7d0000}, {0x3b7d2000}, {0x3b7d4000}, {0x3b7d6000}, {0x3b7d8000}, {0x3b7da000}, {0x3b7dc000}, {0x3b7de000}, {0x3b7e0000}, {0x3b7e2000}, {0x3b7e4000}, {0x3b7e6000}, {0x3b7e8000}, {0x3b7ea000}, {0x3b7ec000}, {0x3b7ee000}, {0x3b7f0000}, {0x3b7f2000}, {0x3b7f4000}, {0x3b7f6000}, {0x3b7f8000}, {0x3b7fa000}, {0x3b7fc000}, {0x3b7fe000}, {0x3b800000}, {0x3b802000}, {0x3b804000}, {0x3b806000}, {0x3b808000}, {0x3b80a000}, {0x3b80c000}, {0x3b80e000}, {0x3b810000}, {0x3b812000}, {0x3b814000}, {0x3b816000}, {0x3b818000}, {0x3b81a000}, {0x3b81c000}, {0x3b81e000}, {0x3b820000}, {0x3b822000}, {0x3b824000}, {0x3b826000}, {0x3b828000}, {0x3b82a000}, {0x3b82c000}, {0x3b82e000}, {0x3b830000}, {0x3b832000}, {0x3b834000}, {0x3b836000}, {0x3b838000}, {0x3b83a000}, {0x3b83c000}, {0x3b83e000}, {0x3b840000}, {0x3b842000}, {0x3b844000}, {0x3b846000}, {0x3b848000}, {0x3b84a000}, {0x3b84c000}, {0x3b84e000}, {0x3b850000}, {0x3b852000}, {0x3b854000}, {0x3b856000}, {0x3b858000}, {0x3b85a000}, {0x3b85c000}, {0x3b85e000}, {0x3b860000}, {0x3b862000}, {0x3b864000}, {0x3b866000}, {0x3b868000}, {0x3b86a000}, {0x3b86c000}, {0x3b86e000}, {0x3b870000}, {0x3b872000}, {0x3b874000}, {0x3b876000}, {0x3b878000}, {0x3b87a000}, {0x3b87c000}, {0x3b87e000}, {0x3b880000}, {0x3b882000}, {0x3b884000}, {0x3b886000}, {0x3b888000}, {0x3b88a000}, {0x3b88c000}, {0x3b88e000}, {0x3b890000}, {0x3b892000}, {0x3b894000}, {0x3b896000}, {0x3b898000}, {0x3b89a000}, {0x3b89c000}, {0x3b89e000}, {0x3b8a0000}, {0x3b8a2000}, {0x3b8a4000}, {0x3b8a6000}, {0x3b8a8000}, {0x3b8aa000}, {0x3b8ac000}, {0x3b8ae000}, {0x3b8b0000}, {0x3b8b2000}, {0x3b8b4000}, {0x3b8b6000}, {0x3b8b8000}, {0x3b8ba000}, {0x3b8bc000}, {0x3b8be000}, {0x3b8c0000}, {0x3b8c2000}, {0x3b8c4000}, {0x3b8c6000}, {0x3b8c8000}, {0x3b8ca000}, {0x3b8cc000}, {0x3b8ce000}, {0x3b8d0000}, {0x3b8d2000}, {0x3b8d4000}, {0x3b8d6000}, {0x3b8d8000}, {0x3b8da000}, {0x3b8dc000}, {0x3b8de000}, {0x3b8e0000}, {0x3b8e2000}, {0x3b8e4000}, {0x3b8e6000}, {0x3b8e8000}, {0x3b8ea000}, {0x3b8ec000}, {0x3b8ee000}, {0x3b8f0000}, {0x3b8f2000}, {0x3b8f4000}, {0x3b8f6000}, {0x3b8f8000}, {0x3b8fa000}, {0x3b8fc000}, {0x3b8fe000}, {0x3b900000}, {0x3b902000}, {0x3b904000}, {0x3b906000}, {0x3b908000}, {0x3b90a000}, {0x3b90c000}, {0x3b90e000}, {0x3b910000}, {0x3b912000}, {0x3b914000}, {0x3b916000}, {0x3b918000}, {0x3b91a000}, {0x3b91c000}, {0x3b91e000}, {0x3b920000}, {0x3b922000}, {0x3b924000}, {0x3b926000}, {0x3b928000}, {0x3b92a000}, {0x3b92c000}, {0x3b92e000}, {0x3b930000}, {0x3b932000}, {0x3b934000}, {0x3b936000}, {0x3b938000}, {0x3b93a000}, {0x3b93c000}, {0x3b93e000}, {0x3b940000}, {0x3b942000}, {0x3b944000}, {0x3b946000}, {0x3b948000}, {0x3b94a000}, {0x3b94c000}, {0x3b94e000}, {0x3b950000}, {0x3b952000}, {0x3b954000}, {0x3b956000}, {0x3b958000}, {0x3b95a000}, {0x3b95c000}, {0x3b95e000}, {0x3b960000}, {0x3b962000}, {0x3b964000}, {0x3b966000}, {0x3b968000}, {0x3b96a000}, {0x3b96c000}, {0x3b96e000}, {0x3b970000}, {0x3b972000}, {0x3b974000}, {0x3b976000}, {0x3b978000}, {0x3b97a000}, {0x3b97c000}, {0x3b97e000}, {0x3b980000}, {0x3b982000}, {0x3b984000}, {0x3b986000}, {0x3b988000}, {0x3b98a000}, {0x3b98c000}, {0x3b98e000}, {0x3b990000}, {0x3b992000}, {0x3b994000}, {0x3b996000}, {0x3b998000}, {0x3b99a000}, {0x3b99c000}, {0x3b99e000}, {0x3b9a0000}, {0x3b9a2000}, {0x3b9a4000}, {0x3b9a6000}, {0x3b9a8000}, {0x3b9aa000}, {0x3b9ac000}, {0x3b9ae000}, {0x3b9b0000}, {0x3b9b2000}, {0x3b9b4000}, {0x3b9b6000}, {0x3b9b8000}, {0x3b9ba000}, {0x3b9bc000}, {0x3b9be000}, {0x3b9c0000}, {0x3b9c2000}, {0x3b9c4000}, {0x3b9c6000}, {0x3b9c8000}, {0x3b9ca000}, {0x3b9cc000}, {0x3b9ce000}, {0x3b9d0000}, {0x3b9d2000}, {0x3b9d4000}, {0x3b9d6000}, {0x3b9d8000}, {0x3b9da000}, {0x3b9dc000}, {0x3b9de000}, {0x3b9e0000}, {0x3b9e2000}, {0x3b9e4000}, {0x3b9e6000}, {0x3b9e8000}, {0x3b9ea000}, {0x3b9ec000}, {0x3b9ee000}, {0x3b9f0000}, {0x3b9f2000}, {0x3b9f4000}, {0x3b9f6000}, {0x3b9f8000}, {0x3b9fa000}, {0x3b9fc000}, {0x3b9fe000}, {0x3ba00000}, {0x3ba02000}, {0x3ba04000}, {0x3ba06000}, {0x3ba08000}, {0x3ba0a000}, {0x3ba0c000}, {0x3ba0e000}, {0x3ba10000}, {0x3ba12000}, {0x3ba14000}, {0x3ba16000}, {0x3ba18000}, {0x3ba1a000}, {0x3ba1c000}, {0x3ba1e000}, {0x3ba20000}, {0x3ba22000}, {0x3ba24000}, {0x3ba26000}, {0x3ba28000}, {0x3ba2a000}, {0x3ba2c000}, {0x3ba2e000}, {0x3ba30000}, {0x3ba32000}, {0x3ba34000}, {0x3ba36000}, {0x3ba38000}, {0x3ba3a000}, {0x3ba3c000}, {0x3ba3e000}, {0x3ba40000}, {0x3ba42000}, {0x3ba44000}, {0x3ba46000}, {0x3ba48000}, {0x3ba4a000}, {0x3ba4c000}, {0x3ba4e000}, {0x3ba50000}, {0x3ba52000}, {0x3ba54000}, {0x3ba56000}, {0x3ba58000}, {0x3ba5a000}, {0x3ba5c000}, {0x3ba5e000}, {0x3ba60000}, {0x3ba62000}, {0x3ba64000}, {0x3ba66000}, {0x3ba68000}, {0x3ba6a000}, {0x3ba6c000}, {0x3ba6e000}, {0x3ba70000}, {0x3ba72000}, {0x3ba74000}, {0x3ba76000}, {0x3ba78000}, {0x3ba7a000}, {0x3ba7c000}, {0x3ba7e000}, {0x3ba80000}, {0x3ba82000}, {0x3ba84000}, {0x3ba86000}, {0x3ba88000}, {0x3ba8a000}, {0x3ba8c000}, {0x3ba8e000}, {0x3ba90000}, {0x3ba92000}, {0x3ba94000}, {0x3ba96000}, {0x3ba98000}, {0x3ba9a000}, {0x3ba9c000}, {0x3ba9e000}, {0x3baa0000}, {0x3baa2000}, {0x3baa4000}, {0x3baa6000}, {0x3baa8000}, {0x3baaa000}, {0x3baac000}, {0x3baae000}, {0x3bab0000}, {0x3bab2000}, {0x3bab4000}, {0x3bab6000}, {0x3bab8000}, {0x3baba000}, {0x3babc000}, {0x3babe000}, {0x3bac0000}, {0x3bac2000}, {0x3bac4000}, {0x3bac6000}, {0x3bac8000}, {0x3baca000}, {0x3bacc000}, {0x3bace000}, {0x3bad0000}, {0x3bad2000}, {0x3bad4000}, {0x3bad6000}, {0x3bad8000}, {0x3bada000}, {0x3badc000}, {0x3bade000}, {0x3bae0000}, {0x3bae2000}, {0x3bae4000}, {0x3bae6000}, {0x3bae8000}, {0x3baea000}, {0x3baec000}, {0x3baee000}, {0x3baf0000}, {0x3baf2000}, {0x3baf4000}, {0x3baf6000}, {0x3baf8000}, {0x3bafa000}, {0x3bafc000}, {0x3bafe000}, {0x3bb00000}, {0x3bb02000}, {0x3bb04000}, {0x3bb06000}, {0x3bb08000}, {0x3bb0a000}, {0x3bb0c000}, {0x3bb0e000}, {0x3bb10000}, {0x3bb12000}, {0x3bb14000}, {0x3bb16000}, {0x3bb18000}, {0x3bb1a000}, {0x3bb1c000}, {0x3bb1e000}, {0x3bb20000}, {0x3bb22000}, {0x3bb24000}, {0x3bb26000}, {0x3bb28000}, {0x3bb2a000}, {0x3bb2c000}, {0x3bb2e000}, {0x3bb30000}, {0x3bb32000}, {0x3bb34000}, {0x3bb36000}, {0x3bb38000}, {0x3bb3a000}, {0x3bb3c000}, {0x3bb3e000}, {0x3bb40000}, {0x3bb42000}, {0x3bb44000}, {0x3bb46000}, {0x3bb48000}, {0x3bb4a000}, {0x3bb4c000}, {0x3bb4e000}, {0x3bb50000}, {0x3bb52000}, {0x3bb54000}, {0x3bb56000}, {0x3bb58000}, {0x3bb5a000}, {0x3bb5c000}, {0x3bb5e000}, {0x3bb60000}, {0x3bb62000}, {0x3bb64000}, {0x3bb66000}, {0x3bb68000}, {0x3bb6a000}, {0x3bb6c000}, {0x3bb6e000}, {0x3bb70000}, {0x3bb72000}, {0x3bb74000}, {0x3bb76000}, {0x3bb78000}, {0x3bb7a000}, {0x3bb7c000}, {0x3bb7e000}, {0x3bb80000}, {0x3bb82000}, {0x3bb84000}, {0x3bb86000}, {0x3bb88000}, {0x3bb8a000}, {0x3bb8c000}, {0x3bb8e000}, {0x3bb90000}, {0x3bb92000}, {0x3bb94000}, {0x3bb96000}, {0x3bb98000}, {0x3bb9a000}, {0x3bb9c000}, {0x3bb9e000}, {0x3bba0000}, {0x3bba2000}, {0x3bba4000}, {0x3bba6000}, {0x3bba8000}, {0x3bbaa000}, {0x3bbac000}, {0x3bbae000}, {0x3bbb0000}, {0x3bbb2000}, {0x3bbb4000}, {0x3bbb6000}, {0x3bbb8000}, {0x3bbba000}, {0x3bbbc000}, {0x3bbbe000}, {0x3bbc0000}, {0x3bbc2000}, {0x3bbc4000}, {0x3bbc6000}, {0x3bbc8000}, {0x3bbca000}, {0x3bbcc000}, {0x3bbce000}, {0x3bbd0000}, {0x3bbd2000}, {0x3bbd4000}, {0x3bbd6000}, {0x3bbd8000}, {0x3bbda000}, {0x3bbdc000}, {0x3bbde000}, {0x3bbe0000}, {0x3bbe2000}, {0x3bbe4000}, {0x3bbe6000}, {0x3bbe8000}, {0x3bbea000}, {0x3bbec000}, {0x3bbee000}, {0x3bbf0000}, {0x3bbf2000}, {0x3bbf4000}, {0x3bbf6000}, {0x3bbf8000}, {0x3bbfa000}, {0x3bbfc000}, {0x3bbfe000}, {0x3bc00000}, {0x3bc02000}, {0x3bc04000}, {0x3bc06000}, {0x3bc08000}, {0x3bc0a000}, {0x3bc0c000}, {0x3bc0e000}, {0x3bc10000}, {0x3bc12000}, {0x3bc14000}, {0x3bc16000}, {0x3bc18000}, {0x3bc1a000}, {0x3bc1c000}, {0x3bc1e000}, {0x3bc20000}, {0x3bc22000}, {0x3bc24000}, {0x3bc26000}, {0x3bc28000}, {0x3bc2a000}, {0x3bc2c000}, {0x3bc2e000}, {0x3bc30000}, {0x3bc32000}, {0x3bc34000}, {0x3bc36000}, {0x3bc38000}, {0x3bc3a000}, {0x3bc3c000}, {0x3bc3e000}, {0x3bc40000}, {0x3bc42000}, {0x3bc44000}, {0x3bc46000}, {0x3bc48000}, {0x3bc4a000}, {0x3bc4c000}, {0x3bc4e000}, {0x3bc50000}, {0x3bc52000}, {0x3bc54000}, {0x3bc56000}, {0x3bc58000}, {0x3bc5a000}, {0x3bc5c000}, {0x3bc5e000}, {0x3bc60000}, {0x3bc62000}, {0x3bc64000}, {0x3bc66000}, {0x3bc68000}, {0x3bc6a000}, {0x3bc6c000}, {0x3bc6e000}, {0x3bc70000}, {0x3bc72000}, {0x3bc74000}, {0x3bc76000}, {0x3bc78000}, {0x3bc7a000}, {0x3bc7c000}, {0x3bc7e000}, {0x3bc80000}, {0x3bc82000}, {0x3bc84000}, {0x3bc86000}, {0x3bc88000}, {0x3bc8a000}, {0x3bc8c000}, {0x3bc8e000}, {0x3bc90000}, {0x3bc92000}, {0x3bc94000}, {0x3bc96000}, {0x3bc98000}, {0x3bc9a000}, {0x3bc9c000}, {0x3bc9e000}, {0x3bca0000}, {0x3bca2000}, {0x3bca4000}, {0x3bca6000}, {0x3bca8000}, {0x3bcaa000}, {0x3bcac000}, {0x3bcae000}, {0x3bcb0000}, {0x3bcb2000}, {0x3bcb4000}, {0x3bcb6000}, {0x3bcb8000}, {0x3bcba000}, {0x3bcbc000}, {0x3bcbe000}, {0x3bcc0000}, {0x3bcc2000}, {0x3bcc4000}, {0x3bcc6000}, {0x3bcc8000}, {0x3bcca000}, {0x3bccc000}, {0x3bcce000}, {0x3bcd0000}, {0x3bcd2000}, {0x3bcd4000}, {0x3bcd6000}, {0x3bcd8000}, {0x3bcda000}, {0x3bcdc000}, {0x3bcde000}, {0x3bce0000}, {0x3bce2000}, {0x3bce4000}, {0x3bce6000}, {0x3bce8000}, {0x3bcea000}, {0x3bcec000}, {0x3bcee000}, {0x3bcf0000}, {0x3bcf2000}, {0x3bcf4000}, {0x3bcf6000}, {0x3bcf8000}, {0x3bcfa000}, {0x3bcfc000}, {0x3bcfe000}, {0x3bd00000}, {0x3bd02000}, {0x3bd04000}, {0x3bd06000}, {0x3bd08000}, {0x3bd0a000}, {0x3bd0c000}, {0x3bd0e000}, {0x3bd10000}, {0x3bd12000}, {0x3bd14000}, {0x3bd16000}, {0x3bd18000}, {0x3bd1a000}, {0x3bd1c000}, {0x3bd1e000}, {0x3bd20000}, {0x3bd22000}, {0x3bd24000}, {0x3bd26000}, {0x3bd28000}, {0x3bd2a000}, {0x3bd2c000}, {0x3bd2e000}, {0x3bd30000}, {0x3bd32000}, {0x3bd34000}, {0x3bd36000}, {0x3bd38000}, {0x3bd3a000}, {0x3bd3c000}, {0x3bd3e000}, {0x3bd40000}, {0x3bd42000}, {0x3bd44000}, {0x3bd46000}, {0x3bd48000}, {0x3bd4a000}, {0x3bd4c000}, {0x3bd4e000}, {0x3bd50000}, {0x3bd52000}, {0x3bd54000}, {0x3bd56000}, {0x3bd58000}, {0x3bd5a000}, {0x3bd5c000}, {0x3bd5e000}, {0x3bd60000}, {0x3bd62000}, {0x3bd64000}, {0x3bd66000}, {0x3bd68000}, {0x3bd6a000}, {0x3bd6c000}, {0x3bd6e000}, {0x3bd70000}, {0x3bd72000}, {0x3bd74000}, {0x3bd76000}, {0x3bd78000}, {0x3bd7a000}, {0x3bd7c000}, {0x3bd7e000}, {0x3bd80000}, {0x3bd82000}, {0x3bd84000}, {0x3bd86000}, {0x3bd88000}, {0x3bd8a000}, {0x3bd8c000}, {0x3bd8e000}, {0x3bd90000}, {0x3bd92000}, {0x3bd94000}, {0x3bd96000}, {0x3bd98000}, {0x3bd9a000}, {0x3bd9c000}, {0x3bd9e000}, {0x3bda0000}, {0x3bda2000}, {0x3bda4000}, {0x3bda6000}, {0x3bda8000}, {0x3bdaa000}, {0x3bdac000}, {0x3bdae000}, {0x3bdb0000}, {0x3bdb2000}, {0x3bdb4000}, {0x3bdb6000}, {0x3bdb8000}, {0x3bdba000}, {0x3bdbc000}, {0x3bdbe000}, {0x3bdc0000}, {0x3bdc2000}, {0x3bdc4000}, {0x3bdc6000}, {0x3bdc8000}, {0x3bdca000}, {0x3bdcc000}, {0x3bdce000}, {0x3bdd0000}, {0x3bdd2000}, {0x3bdd4000}, {0x3bdd6000}, {0x3bdd8000}, {0x3bdda000}, {0x3bddc000}, {0x3bdde000}, {0x3bde0000}, {0x3bde2000}, {0x3bde4000}, {0x3bde6000}, {0x3bde8000}, {0x3bdea000}, {0x3bdec000}, {0x3bdee000}, {0x3bdf0000}, {0x3bdf2000}, {0x3bdf4000}, {0x3bdf6000}, {0x3bdf8000}, {0x3bdfa000}, {0x3bdfc000}, {0x3bdfe000}, {0x3be00000}, {0x3be02000}, {0x3be04000}, {0x3be06000}, {0x3be08000}, {0x3be0a000}, {0x3be0c000}, {0x3be0e000}, {0x3be10000}, {0x3be12000}, {0x3be14000}, {0x3be16000}, {0x3be18000}, {0x3be1a000}, {0x3be1c000}, {0x3be1e000}, {0x3be20000}, {0x3be22000}, {0x3be24000}, {0x3be26000}, {0x3be28000}, {0x3be2a000}, {0x3be2c000}, {0x3be2e000}, {0x3be30000}, {0x3be32000}, {0x3be34000}, {0x3be36000}, {0x3be38000}, {0x3be3a000}, {0x3be3c000}, {0x3be3e000}, {0x3be40000}, {0x3be42000}, {0x3be44000}, {0x3be46000}, {0x3be48000}, {0x3be4a000}, {0x3be4c000}, {0x3be4e000}, {0x3be50000}, {0x3be52000}, {0x3be54000}, {0x3be56000}, {0x3be58000}, {0x3be5a000}, {0x3be5c000}, {0x3be5e000}, {0x3be60000}, {0x3be62000}, {0x3be64000}, {0x3be66000}, {0x3be68000}, {0x3be6a000}, {0x3be6c000}, {0x3be6e000}, {0x3be70000}, {0x3be72000}, {0x3be74000}, {0x3be76000}, {0x3be78000}, {0x3be7a000}, {0x3be7c000}, {0x3be7e000}, {0x3be80000}, {0x3be82000}, {0x3be84000}, {0x3be86000}, {0x3be88000}, {0x3be8a000}, {0x3be8c000}, {0x3be8e000}, {0x3be90000}, {0x3be92000}, {0x3be94000}, {0x3be96000}, {0x3be98000}, {0x3be9a000}, {0x3be9c000}, {0x3be9e000}, {0x3bea0000}, {0x3bea2000}, {0x3bea4000}, {0x3bea6000}, {0x3bea8000}, {0x3beaa000}, {0x3beac000}, {0x3beae000}, {0x3beb0000}, {0x3beb2000}, {0x3beb4000}, {0x3beb6000}, {0x3beb8000}, {0x3beba000}, {0x3bebc000}, {0x3bebe000}, {0x3bec0000}, {0x3bec2000}, {0x3bec4000}, {0x3bec6000}, {0x3bec8000}, {0x3beca000}, {0x3becc000}, {0x3bece000}, {0x3bed0000}, {0x3bed2000}, {0x3bed4000}, {0x3bed6000}, {0x3bed8000}, {0x3beda000}, {0x3bedc000}, {0x3bede000}, {0x3bee0000}, {0x3bee2000}, {0x3bee4000}, {0x3bee6000}, {0x3bee8000}, {0x3beea000}, {0x3beec000}, {0x3beee000}, {0x3bef0000}, {0x3bef2000}, {0x3bef4000}, {0x3bef6000}, {0x3bef8000}, {0x3befa000}, {0x3befc000}, {0x3befe000}, {0x3bf00000}, {0x3bf02000}, {0x3bf04000}, {0x3bf06000}, {0x3bf08000}, {0x3bf0a000}, {0x3bf0c000}, {0x3bf0e000}, {0x3bf10000}, {0x3bf12000}, {0x3bf14000}, {0x3bf16000}, {0x3bf18000}, {0x3bf1a000}, {0x3bf1c000}, {0x3bf1e000}, {0x3bf20000}, {0x3bf22000}, {0x3bf24000}, {0x3bf26000}, {0x3bf28000}, {0x3bf2a000}, {0x3bf2c000}, {0x3bf2e000}, {0x3bf30000}, {0x3bf32000}, {0x3bf34000}, {0x3bf36000}, {0x3bf38000}, {0x3bf3a000}, {0x3bf3c000}, {0x3bf3e000}, {0x3bf40000}, {0x3bf42000}, {0x3bf44000}, {0x3bf46000}, {0x3bf48000}, {0x3bf4a000}, {0x3bf4c000}, {0x3bf4e000}, {0x3bf50000}, {0x3bf52000}, {0x3bf54000}, {0x3bf56000}, {0x3bf58000}, {0x3bf5a000}, {0x3bf5c000}, {0x3bf5e000}, {0x3bf60000}, {0x3bf62000}, {0x3bf64000}, {0x3bf66000}, {0x3bf68000}, {0x3bf6a000}, {0x3bf6c000}, {0x3bf6e000}, {0x3bf70000}, {0x3bf72000}, {0x3bf74000}, {0x3bf76000}, {0x3bf78000}, {0x3bf7a000}, {0x3bf7c000}, {0x3bf7e000}, {0x3bf80000}, {0x3bf82000}, {0x3bf84000}, {0x3bf86000}, {0x3bf88000}, {0x3bf8a000}, {0x3bf8c000}, {0x3bf8e000}, {0x3bf90000}, {0x3bf92000}, {0x3bf94000}, {0x3bf96000}, {0x3bf98000}, {0x3bf9a000}, {0x3bf9c000}, {0x3bf9e000}, {0x3bfa0000}, {0x3bfa2000}, {0x3bfa4000}, {0x3bfa6000}, {0x3bfa8000}, {0x3bfaa000}, {0x3bfac000}, {0x3bfae000}, {0x3bfb0000}, {0x3bfb2000}, {0x3bfb4000}, {0x3bfb6000}, {0x3bfb8000}, {0x3bfba000}, {0x3bfbc000}, {0x3bfbe000}, {0x3bfc0000}, {0x3bfc2000}, {0x3bfc4000}, {0x3bfc6000}, {0x3bfc8000}, {0x3bfca000}, {0x3bfcc000}, {0x3bfce000}, {0x3bfd0000}, {0x3bfd2000}, {0x3bfd4000}, {0x3bfd6000}, {0x3bfd8000}, {0x3bfda000}, {0x3bfdc000}, {0x3bfde000}, {0x3bfe0000}, {0x3bfe2000}, {0x3bfe4000}, {0x3bfe6000}, {0x3bfe8000}, {0x3bfea000}, {0x3bfec000}, {0x3bfee000}, {0x3bff0000}, {0x3bff2000}, {0x3bff4000}, {0x3bff6000}, {0x3bff8000}, {0x3bffa000}, {0x3bffc000}, {0x3bffe000}, {0x3c000000}, {0x3c002000}, {0x3c004000}, {0x3c006000}, {0x3c008000}, {0x3c00a000}, {0x3c00c000}, {0x3c00e000}, {0x3c010000}, {0x3c012000}, {0x3c014000}, {0x3c016000}, {0x3c018000}, {0x3c01a000}, {0x3c01c000}, {0x3c01e000}, {0x3c020000}, {0x3c022000}, {0x3c024000}, {0x3c026000}, {0x3c028000}, {0x3c02a000}, {0x3c02c000}, {0x3c02e000}, {0x3c030000}, {0x3c032000}, {0x3c034000}, {0x3c036000}, {0x3c038000}, {0x3c03a000}, {0x3c03c000}, {0x3c03e000}, {0x3c040000}, {0x3c042000}, {0x3c044000}, {0x3c046000}, {0x3c048000}, {0x3c04a000}, {0x3c04c000}, {0x3c04e000}, {0x3c050000}, {0x3c052000}, {0x3c054000}, {0x3c056000}, {0x3c058000}, {0x3c05a000}, {0x3c05c000}, {0x3c05e000}, {0x3c060000}, {0x3c062000}, {0x3c064000}, {0x3c066000}, {0x3c068000}, {0x3c06a000}, {0x3c06c000}, {0x3c06e000}, {0x3c070000}, {0x3c072000}, {0x3c074000}, {0x3c076000}, {0x3c078000}, {0x3c07a000}, {0x3c07c000}, {0x3c07e000}, {0x3c080000}, {0x3c082000}, {0x3c084000}, {0x3c086000}, {0x3c088000}, {0x3c08a000}, {0x3c08c000}, {0x3c08e000}, {0x3c090000}, {0x3c092000}, {0x3c094000}, {0x3c096000}, {0x3c098000}, {0x3c09a000}, {0x3c09c000}, {0x3c09e000}, {0x3c0a0000}, {0x3c0a2000}, {0x3c0a4000}, {0x3c0a6000}, {0x3c0a8000}, {0x3c0aa000}, {0x3c0ac000}, {0x3c0ae000}, {0x3c0b0000}, {0x3c0b2000}, {0x3c0b4000}, {0x3c0b6000}, {0x3c0b8000}, {0x3c0ba000}, {0x3c0bc000}, {0x3c0be000}, {0x3c0c0000}, {0x3c0c2000}, {0x3c0c4000}, {0x3c0c6000}, {0x3c0c8000}, {0x3c0ca000}, {0x3c0cc000}, {0x3c0ce000}, {0x3c0d0000}, {0x3c0d2000}, {0x3c0d4000}, {0x3c0d6000}, {0x3c0d8000}, {0x3c0da000}, {0x3c0dc000}, {0x3c0de000}, {0x3c0e0000}, {0x3c0e2000}, {0x3c0e4000}, {0x3c0e6000}, {0x3c0e8000}, {0x3c0ea000}, {0x3c0ec000}, {0x3c0ee000}, {0x3c0f0000}, {0x3c0f2000}, {0x3c0f4000}, {0x3c0f6000}, {0x3c0f8000}, {0x3c0fa000}, {0x3c0fc000}, {0x3c0fe000}, {0x3c100000}, {0x3c102000}, {0x3c104000}, {0x3c106000}, {0x3c108000}, {0x3c10a000}, {0x3c10c000}, {0x3c10e000}, {0x3c110000}, {0x3c112000}, {0x3c114000}, {0x3c116000}, {0x3c118000}, {0x3c11a000}, {0x3c11c000}, {0x3c11e000}, {0x3c120000}, {0x3c122000}, {0x3c124000}, {0x3c126000}, {0x3c128000}, {0x3c12a000}, {0x3c12c000}, {0x3c12e000}, {0x3c130000}, {0x3c132000}, {0x3c134000}, {0x3c136000}, {0x3c138000}, {0x3c13a000}, {0x3c13c000}, {0x3c13e000}, {0x3c140000}, {0x3c142000}, {0x3c144000}, {0x3c146000}, {0x3c148000}, {0x3c14a000}, {0x3c14c000}, {0x3c14e000}, {0x3c150000}, {0x3c152000}, {0x3c154000}, {0x3c156000}, {0x3c158000}, {0x3c15a000}, {0x3c15c000}, {0x3c15e000}, {0x3c160000}, {0x3c162000}, {0x3c164000}, {0x3c166000}, {0x3c168000}, {0x3c16a000}, {0x3c16c000}, {0x3c16e000}, {0x3c170000}, {0x3c172000}, {0x3c174000}, {0x3c176000}, {0x3c178000}, {0x3c17a000}, {0x3c17c000}, {0x3c17e000}, {0x3c180000}, {0x3c182000}, {0x3c184000}, {0x3c186000}, {0x3c188000}, {0x3c18a000}, {0x3c18c000}, {0x3c18e000}, {0x3c190000}, {0x3c192000}, {0x3c194000}, {0x3c196000}, {0x3c198000}, {0x3c19a000}, {0x3c19c000}, {0x3c19e000}, {0x3c1a0000}, {0x3c1a2000}, {0x3c1a4000}, {0x3c1a6000}, {0x3c1a8000}, {0x3c1aa000}, {0x3c1ac000}, {0x3c1ae000}, {0x3c1b0000}, {0x3c1b2000}, {0x3c1b4000}, {0x3c1b6000}, {0x3c1b8000}, {0x3c1ba000}, {0x3c1bc000}, {0x3c1be000}, {0x3c1c0000}, {0x3c1c2000}, {0x3c1c4000}, {0x3c1c6000}, {0x3c1c8000}, {0x3c1ca000}, {0x3c1cc000}, {0x3c1ce000}, {0x3c1d0000}, {0x3c1d2000}, {0x3c1d4000}, {0x3c1d6000}, {0x3c1d8000}, {0x3c1da000}, {0x3c1dc000}, {0x3c1de000}, {0x3c1e0000}, {0x3c1e2000}, {0x3c1e4000}, {0x3c1e6000}, {0x3c1e8000}, {0x3c1ea000}, {0x3c1ec000}, {0x3c1ee000}, {0x3c1f0000}, {0x3c1f2000}, {0x3c1f4000}, {0x3c1f6000}, {0x3c1f8000}, {0x3c1fa000}, {0x3c1fc000}, {0x3c1fe000}, {0x3c200000}, {0x3c202000}, {0x3c204000}, {0x3c206000}, {0x3c208000}, {0x3c20a000}, {0x3c20c000}, {0x3c20e000}, {0x3c210000}, {0x3c212000}, {0x3c214000}, {0x3c216000}, {0x3c218000}, {0x3c21a000}, {0x3c21c000}, {0x3c21e000}, {0x3c220000}, {0x3c222000}, {0x3c224000}, {0x3c226000}, {0x3c228000}, {0x3c22a000}, {0x3c22c000}, {0x3c22e000}, {0x3c230000}, {0x3c232000}, {0x3c234000}, {0x3c236000}, {0x3c238000}, {0x3c23a000}, {0x3c23c000}, {0x3c23e000}, {0x3c240000}, {0x3c242000}, {0x3c244000}, {0x3c246000}, {0x3c248000}, {0x3c24a000}, {0x3c24c000}, {0x3c24e000}, {0x3c250000}, {0x3c252000}, {0x3c254000}, {0x3c256000}, {0x3c258000}, {0x3c25a000}, {0x3c25c000}, {0x3c25e000}, {0x3c260000}, {0x3c262000}, {0x3c264000}, {0x3c266000}, {0x3c268000}, {0x3c26a000}, {0x3c26c000}, {0x3c26e000}, {0x3c270000}, {0x3c272000}, {0x3c274000}, {0x3c276000}, {0x3c278000}, {0x3c27a000}, {0x3c27c000}, {0x3c27e000}, {0x3c280000}, {0x3c282000}, {0x3c284000}, {0x3c286000}, {0x3c288000}, {0x3c28a000}, {0x3c28c000}, {0x3c28e000}, {0x3c290000}, {0x3c292000}, {0x3c294000}, {0x3c296000}, {0x3c298000}, {0x3c29a000}, {0x3c29c000}, {0x3c29e000}, {0x3c2a0000}, {0x3c2a2000}, {0x3c2a4000}, {0x3c2a6000}, {0x3c2a8000}, {0x3c2aa000}, {0x3c2ac000}, {0x3c2ae000}, {0x3c2b0000}, {0x3c2b2000}, {0x3c2b4000}, {0x3c2b6000}, {0x3c2b8000}, {0x3c2ba000}, {0x3c2bc000}, {0x3c2be000}, {0x3c2c0000}, {0x3c2c2000}, {0x3c2c4000}, {0x3c2c6000}, {0x3c2c8000}, {0x3c2ca000}, {0x3c2cc000}, {0x3c2ce000}, {0x3c2d0000}, {0x3c2d2000}, {0x3c2d4000}, {0x3c2d6000}, {0x3c2d8000}, {0x3c2da000}, {0x3c2dc000}, {0x3c2de000}, {0x3c2e0000}, {0x3c2e2000}, {0x3c2e4000}, {0x3c2e6000}, {0x3c2e8000}, {0x3c2ea000}, {0x3c2ec000}, {0x3c2ee000}, {0x3c2f0000}, {0x3c2f2000}, {0x3c2f4000}, {0x3c2f6000}, {0x3c2f8000}, {0x3c2fa000}, {0x3c2fc000}, {0x3c2fe000}, {0x3c300000}, {0x3c302000}, {0x3c304000}, {0x3c306000}, {0x3c308000}, {0x3c30a000}, {0x3c30c000}, {0x3c30e000}, {0x3c310000}, {0x3c312000}, {0x3c314000}, {0x3c316000}, {0x3c318000}, {0x3c31a000}, {0x3c31c000}, {0x3c31e000}, {0x3c320000}, {0x3c322000}, {0x3c324000}, {0x3c326000}, {0x3c328000}, {0x3c32a000}, {0x3c32c000}, {0x3c32e000}, {0x3c330000}, {0x3c332000}, {0x3c334000}, {0x3c336000}, {0x3c338000}, {0x3c33a000}, {0x3c33c000}, {0x3c33e000}, {0x3c340000}, {0x3c342000}, {0x3c344000}, {0x3c346000}, {0x3c348000}, {0x3c34a000}, {0x3c34c000}, {0x3c34e000}, {0x3c350000}, {0x3c352000}, {0x3c354000}, {0x3c356000}, {0x3c358000}, {0x3c35a000}, {0x3c35c000}, {0x3c35e000}, {0x3c360000}, {0x3c362000}, {0x3c364000}, {0x3c366000}, {0x3c368000}, {0x3c36a000}, {0x3c36c000}, {0x3c36e000}, {0x3c370000}, {0x3c372000}, {0x3c374000}, {0x3c376000}, {0x3c378000}, {0x3c37a000}, {0x3c37c000}, {0x3c37e000}, {0x3c380000}, {0x3c382000}, {0x3c384000}, {0x3c386000}, {0x3c388000}, {0x3c38a000}, {0x3c38c000}, {0x3c38e000}, {0x3c390000}, {0x3c392000}, {0x3c394000}, {0x3c396000}, {0x3c398000}, {0x3c39a000}, {0x3c39c000}, {0x3c39e000}, {0x3c3a0000}, {0x3c3a2000}, {0x3c3a4000}, {0x3c3a6000}, {0x3c3a8000}, {0x3c3aa000}, {0x3c3ac000}, {0x3c3ae000}, {0x3c3b0000}, {0x3c3b2000}, {0x3c3b4000}, {0x3c3b6000}, {0x3c3b8000}, {0x3c3ba000}, {0x3c3bc000}, {0x3c3be000}, {0x3c3c0000}, {0x3c3c2000}, {0x3c3c4000}, {0x3c3c6000}, {0x3c3c8000}, {0x3c3ca000}, {0x3c3cc000}, {0x3c3ce000}, {0x3c3d0000}, {0x3c3d2000}, {0x3c3d4000}, {0x3c3d6000}, {0x3c3d8000}, {0x3c3da000}, {0x3c3dc000}, {0x3c3de000}, {0x3c3e0000}, {0x3c3e2000}, {0x3c3e4000}, {0x3c3e6000}, {0x3c3e8000}, {0x3c3ea000}, {0x3c3ec000}, {0x3c3ee000}, {0x3c3f0000}, {0x3c3f2000}, {0x3c3f4000}, {0x3c3f6000}, {0x3c3f8000}, {0x3c3fa000}, {0x3c3fc000}, {0x3c3fe000}, {0x3c400000}, {0x3c402000}, {0x3c404000}, {0x3c406000}, {0x3c408000}, {0x3c40a000}, {0x3c40c000}, {0x3c40e000}, {0x3c410000}, {0x3c412000}, {0x3c414000}, {0x3c416000}, {0x3c418000}, {0x3c41a000}, {0x3c41c000}, {0x3c41e000}, {0x3c420000}, {0x3c422000}, {0x3c424000}, {0x3c426000}, {0x3c428000}, {0x3c42a000}, {0x3c42c000}, {0x3c42e000}, {0x3c430000}, {0x3c432000}, {0x3c434000}, {0x3c436000}, {0x3c438000}, {0x3c43a000}, {0x3c43c000}, {0x3c43e000}, {0x3c440000}, {0x3c442000}, {0x3c444000}, {0x3c446000}, {0x3c448000}, {0x3c44a000}, {0x3c44c000}, {0x3c44e000}, {0x3c450000}, {0x3c452000}, {0x3c454000}, {0x3c456000}, {0x3c458000}, {0x3c45a000}, {0x3c45c000}, {0x3c45e000}, {0x3c460000}, {0x3c462000}, {0x3c464000}, {0x3c466000}, {0x3c468000}, {0x3c46a000}, {0x3c46c000}, {0x3c46e000}, {0x3c470000}, {0x3c472000}, {0x3c474000}, {0x3c476000}, {0x3c478000}, {0x3c47a000}, {0x3c47c000}, {0x3c47e000}, {0x3c480000}, {0x3c482000}, {0x3c484000}, {0x3c486000}, {0x3c488000}, {0x3c48a000}, {0x3c48c000}, {0x3c48e000}, {0x3c490000}, {0x3c492000}, {0x3c494000}, {0x3c496000}, {0x3c498000}, {0x3c49a000}, {0x3c49c000}, {0x3c49e000}, {0x3c4a0000}, {0x3c4a2000}, {0x3c4a4000}, {0x3c4a6000}, {0x3c4a8000}, {0x3c4aa000}, {0x3c4ac000}, {0x3c4ae000}, {0x3c4b0000}, {0x3c4b2000}, {0x3c4b4000}, {0x3c4b6000}, {0x3c4b8000}, {0x3c4ba000}, {0x3c4bc000}, {0x3c4be000}, {0x3c4c0000}, {0x3c4c2000}, {0x3c4c4000}, {0x3c4c6000}, {0x3c4c8000}, {0x3c4ca000}, {0x3c4cc000}, {0x3c4ce000}, {0x3c4d0000}, {0x3c4d2000}, {0x3c4d4000}, {0x3c4d6000}, {0x3c4d8000}, {0x3c4da000}, {0x3c4dc000}, {0x3c4de000}, {0x3c4e0000}, {0x3c4e2000}, {0x3c4e4000}, {0x3c4e6000}, {0x3c4e8000}, {0x3c4ea000}, {0x3c4ec000}, {0x3c4ee000}, {0x3c4f0000}, {0x3c4f2000}, {0x3c4f4000}, {0x3c4f6000}, {0x3c4f8000}, {0x3c4fa000}, {0x3c4fc000}, {0x3c4fe000}, {0x3c500000}, {0x3c502000}, {0x3c504000}, {0x3c506000}, {0x3c508000}, {0x3c50a000}, {0x3c50c000}, {0x3c50e000}, {0x3c510000}, {0x3c512000}, {0x3c514000}, {0x3c516000}, {0x3c518000}, {0x3c51a000}, {0x3c51c000}, {0x3c51e000}, {0x3c520000}, {0x3c522000}, {0x3c524000}, {0x3c526000}, {0x3c528000}, {0x3c52a000}, {0x3c52c000}, {0x3c52e000}, {0x3c530000}, {0x3c532000}, {0x3c534000}, {0x3c536000}, {0x3c538000}, {0x3c53a000}, {0x3c53c000}, {0x3c53e000}, {0x3c540000}, {0x3c542000}, {0x3c544000}, {0x3c546000}, {0x3c548000}, {0x3c54a000}, {0x3c54c000}, {0x3c54e000}, {0x3c550000}, {0x3c552000}, {0x3c554000}, {0x3c556000}, {0x3c558000}, {0x3c55a000}, {0x3c55c000}, {0x3c55e000}, {0x3c560000}, {0x3c562000}, {0x3c564000}, {0x3c566000}, {0x3c568000}, {0x3c56a000}, {0x3c56c000}, {0x3c56e000}, {0x3c570000}, {0x3c572000}, {0x3c574000}, {0x3c576000}, {0x3c578000}, {0x3c57a000}, {0x3c57c000}, {0x3c57e000}, {0x3c580000}, {0x3c582000}, {0x3c584000}, {0x3c586000}, {0x3c588000}, {0x3c58a000}, {0x3c58c000}, {0x3c58e000}, {0x3c590000}, {0x3c592000}, {0x3c594000}, {0x3c596000}, {0x3c598000}, {0x3c59a000}, {0x3c59c000}, {0x3c59e000}, {0x3c5a0000}, {0x3c5a2000}, {0x3c5a4000}, {0x3c5a6000}, {0x3c5a8000}, {0x3c5aa000}, {0x3c5ac000}, {0x3c5ae000}, {0x3c5b0000}, {0x3c5b2000}, {0x3c5b4000}, {0x3c5b6000}, {0x3c5b8000}, {0x3c5ba000}, {0x3c5bc000}, {0x3c5be000}, {0x3c5c0000}, {0x3c5c2000}, {0x3c5c4000}, {0x3c5c6000}, {0x3c5c8000}, {0x3c5ca000}, {0x3c5cc000}, {0x3c5ce000}, {0x3c5d0000}, {0x3c5d2000}, {0x3c5d4000}, {0x3c5d6000}, {0x3c5d8000}, {0x3c5da000}, {0x3c5dc000}, {0x3c5de000}, {0x3c5e0000}, {0x3c5e2000}, {0x3c5e4000}, {0x3c5e6000}, {0x3c5e8000}, {0x3c5ea000}, {0x3c5ec000}, {0x3c5ee000}, {0x3c5f0000}, {0x3c5f2000}, {0x3c5f4000}, {0x3c5f6000}, {0x3c5f8000}, {0x3c5fa000}, {0x3c5fc000}, {0x3c5fe000}, {0x3c600000}, {0x3c602000}, {0x3c604000}, {0x3c606000}, {0x3c608000}, {0x3c60a000}, {0x3c60c000}, {0x3c60e000}, {0x3c610000}, {0x3c612000}, {0x3c614000}, {0x3c616000}, {0x3c618000}, {0x3c61a000}, {0x3c61c000}, {0x3c61e000}, {0x3c620000}, {0x3c622000}, {0x3c624000}, {0x3c626000}, {0x3c628000}, {0x3c62a000}, {0x3c62c000}, {0x3c62e000}, {0x3c630000}, {0x3c632000}, {0x3c634000}, {0x3c636000}, {0x3c638000}, {0x3c63a000}, {0x3c63c000}, {0x3c63e000}, {0x3c640000}, {0x3c642000}, {0x3c644000}, {0x3c646000}, {0x3c648000}, {0x3c64a000}, {0x3c64c000}, {0x3c64e000}, {0x3c650000}, {0x3c652000}, {0x3c654000}, {0x3c656000}, {0x3c658000}, {0x3c65a000}, {0x3c65c000}, {0x3c65e000}, {0x3c660000}, {0x3c662000}, {0x3c664000}, {0x3c666000}, {0x3c668000}, {0x3c66a000}, {0x3c66c000}, {0x3c66e000}, {0x3c670000}, {0x3c672000}, {0x3c674000}, {0x3c676000}, {0x3c678000}, {0x3c67a000}, {0x3c67c000}, {0x3c67e000}, {0x3c680000}, {0x3c682000}, {0x3c684000}, {0x3c686000}, {0x3c688000}, {0x3c68a000}, {0x3c68c000}, {0x3c68e000}, {0x3c690000}, {0x3c692000}, {0x3c694000}, {0x3c696000}, {0x3c698000}, {0x3c69a000}, {0x3c69c000}, {0x3c69e000}, {0x3c6a0000}, {0x3c6a2000}, {0x3c6a4000}, {0x3c6a6000}, {0x3c6a8000}, {0x3c6aa000}, {0x3c6ac000}, {0x3c6ae000}, {0x3c6b0000}, {0x3c6b2000}, {0x3c6b4000}, {0x3c6b6000}, {0x3c6b8000}, {0x3c6ba000}, {0x3c6bc000}, {0x3c6be000}, {0x3c6c0000}, {0x3c6c2000}, {0x3c6c4000}, {0x3c6c6000}, {0x3c6c8000}, {0x3c6ca000}, {0x3c6cc000}, {0x3c6ce000}, {0x3c6d0000}, {0x3c6d2000}, {0x3c6d4000}, {0x3c6d6000}, {0x3c6d8000}, {0x3c6da000}, {0x3c6dc000}, {0x3c6de000}, {0x3c6e0000}, {0x3c6e2000}, {0x3c6e4000}, {0x3c6e6000}, {0x3c6e8000}, {0x3c6ea000}, {0x3c6ec000}, {0x3c6ee000}, {0x3c6f0000}, {0x3c6f2000}, {0x3c6f4000}, {0x3c6f6000}, {0x3c6f8000}, {0x3c6fa000}, {0x3c6fc000}, {0x3c6fe000}, {0x3c700000}, {0x3c702000}, {0x3c704000}, {0x3c706000}, {0x3c708000}, {0x3c70a000}, {0x3c70c000}, {0x3c70e000}, {0x3c710000}, {0x3c712000}, {0x3c714000}, {0x3c716000}, {0x3c718000}, {0x3c71a000}, {0x3c71c000}, {0x3c71e000}, {0x3c720000}, {0x3c722000}, {0x3c724000}, {0x3c726000}, {0x3c728000}, {0x3c72a000}, {0x3c72c000}, {0x3c72e000}, {0x3c730000}, {0x3c732000}, {0x3c734000}, {0x3c736000}, {0x3c738000}, {0x3c73a000}, {0x3c73c000}, {0x3c73e000}, {0x3c740000}, {0x3c742000}, {0x3c744000}, {0x3c746000}, {0x3c748000}, {0x3c74a000}, {0x3c74c000}, {0x3c74e000}, {0x3c750000}, {0x3c752000}, {0x3c754000}, {0x3c756000}, {0x3c758000}, {0x3c75a000}, {0x3c75c000}, {0x3c75e000}, {0x3c760000}, {0x3c762000}, {0x3c764000}, {0x3c766000}, {0x3c768000}, {0x3c76a000}, {0x3c76c000}, {0x3c76e000}, {0x3c770000}, {0x3c772000}, {0x3c774000}, {0x3c776000}, {0x3c778000}, {0x3c77a000}, {0x3c77c000}, {0x3c77e000}, {0x3c780000}, {0x3c782000}, {0x3c784000}, {0x3c786000}, {0x3c788000}, {0x3c78a000}, {0x3c78c000}, {0x3c78e000}, {0x3c790000}, {0x3c792000}, {0x3c794000}, {0x3c796000}, {0x3c798000}, {0x3c79a000}, {0x3c79c000}, {0x3c79e000}, {0x3c7a0000}, {0x3c7a2000}, {0x3c7a4000}, {0x3c7a6000}, {0x3c7a8000}, {0x3c7aa000}, {0x3c7ac000}, {0x3c7ae000}, {0x3c7b0000}, {0x3c7b2000}, {0x3c7b4000}, {0x3c7b6000}, {0x3c7b8000}, {0x3c7ba000}, {0x3c7bc000}, {0x3c7be000}, {0x3c7c0000}, {0x3c7c2000}, {0x3c7c4000}, {0x3c7c6000}, {0x3c7c8000}, {0x3c7ca000}, {0x3c7cc000}, {0x3c7ce000}, {0x3c7d0000}, {0x3c7d2000}, {0x3c7d4000}, {0x3c7d6000}, {0x3c7d8000}, {0x3c7da000}, {0x3c7dc000}, {0x3c7de000}, {0x3c7e0000}, {0x3c7e2000}, {0x3c7e4000}, {0x3c7e6000}, {0x3c7e8000}, {0x3c7ea000}, {0x3c7ec000}, {0x3c7ee000}, {0x3c7f0000}, {0x3c7f2000}, {0x3c7f4000}, {0x3c7f6000}, {0x3c7f8000}, {0x3c7fa000}, {0x3c7fc000}, {0x3c7fe000}, {0x3c800000}, {0x3c802000}, {0x3c804000}, {0x3c806000}, {0x3c808000}, {0x3c80a000}, {0x3c80c000}, {0x3c80e000}, {0x3c810000}, {0x3c812000}, {0x3c814000}, {0x3c816000}, {0x3c818000}, {0x3c81a000}, {0x3c81c000}, {0x3c81e000}, {0x3c820000}, {0x3c822000}, {0x3c824000}, {0x3c826000}, {0x3c828000}, {0x3c82a000}, {0x3c82c000}, {0x3c82e000}, {0x3c830000}, {0x3c832000}, {0x3c834000}, {0x3c836000}, {0x3c838000}, {0x3c83a000}, {0x3c83c000}, {0x3c83e000}, {0x3c840000}, {0x3c842000}, {0x3c844000}, {0x3c846000}, {0x3c848000}, {0x3c84a000}, {0x3c84c000}, {0x3c84e000}, {0x3c850000}, {0x3c852000}, {0x3c854000}, {0x3c856000}, {0x3c858000}, {0x3c85a000}, {0x3c85c000}, {0x3c85e000}, {0x3c860000}, {0x3c862000}, {0x3c864000}, {0x3c866000}, {0x3c868000}, {0x3c86a000}, {0x3c86c000}, {0x3c86e000}, {0x3c870000}, {0x3c872000}, {0x3c874000}, {0x3c876000}, {0x3c878000}, {0x3c87a000}, {0x3c87c000}, {0x3c87e000}, {0x3c880000}, {0x3c882000}, {0x3c884000}, {0x3c886000}, {0x3c888000}, {0x3c88a000}, {0x3c88c000}, {0x3c88e000}, {0x3c890000}, {0x3c892000}, {0x3c894000}, {0x3c896000}, {0x3c898000}, {0x3c89a000}, {0x3c89c000}, {0x3c89e000}, {0x3c8a0000}, {0x3c8a2000}, {0x3c8a4000}, {0x3c8a6000}, {0x3c8a8000}, {0x3c8aa000}, {0x3c8ac000}, {0x3c8ae000}, {0x3c8b0000}, {0x3c8b2000}, {0x3c8b4000}, {0x3c8b6000}, {0x3c8b8000}, {0x3c8ba000}, {0x3c8bc000}, {0x3c8be000}, {0x3c8c0000}, {0x3c8c2000}, {0x3c8c4000}, {0x3c8c6000}, {0x3c8c8000}, {0x3c8ca000}, {0x3c8cc000}, {0x3c8ce000}, {0x3c8d0000}, {0x3c8d2000}, {0x3c8d4000}, {0x3c8d6000}, {0x3c8d8000}, {0x3c8da000}, {0x3c8dc000}, {0x3c8de000}, {0x3c8e0000}, {0x3c8e2000}, {0x3c8e4000}, {0x3c8e6000}, {0x3c8e8000}, {0x3c8ea000}, {0x3c8ec000}, {0x3c8ee000}, {0x3c8f0000}, {0x3c8f2000}, {0x3c8f4000}, {0x3c8f6000}, {0x3c8f8000}, {0x3c8fa000}, {0x3c8fc000}, {0x3c8fe000}, {0x3c900000}, {0x3c902000}, {0x3c904000}, {0x3c906000}, {0x3c908000}, {0x3c90a000}, {0x3c90c000}, {0x3c90e000}, {0x3c910000}, {0x3c912000}, {0x3c914000}, {0x3c916000}, {0x3c918000}, {0x3c91a000}, {0x3c91c000}, {0x3c91e000}, {0x3c920000}, {0x3c922000}, {0x3c924000}, {0x3c926000}, {0x3c928000}, {0x3c92a000}, {0x3c92c000}, {0x3c92e000}, {0x3c930000}, {0x3c932000}, {0x3c934000}, {0x3c936000}, {0x3c938000}, {0x3c93a000}, {0x3c93c000}, {0x3c93e000}, {0x3c940000}, {0x3c942000}, {0x3c944000}, {0x3c946000}, {0x3c948000}, {0x3c94a000}, {0x3c94c000}, {0x3c94e000}, {0x3c950000}, {0x3c952000}, {0x3c954000}, {0x3c956000}, {0x3c958000}, {0x3c95a000}, {0x3c95c000}, {0x3c95e000}, {0x3c960000}, {0x3c962000}, {0x3c964000}, {0x3c966000}, {0x3c968000}, {0x3c96a000}, {0x3c96c000}, {0x3c96e000}, {0x3c970000}, {0x3c972000}, {0x3c974000}, {0x3c976000}, {0x3c978000}, {0x3c97a000}, {0x3c97c000}, {0x3c97e000}, {0x3c980000}, {0x3c982000}, {0x3c984000}, {0x3c986000}, {0x3c988000}, {0x3c98a000}, {0x3c98c000}, {0x3c98e000}, {0x3c990000}, {0x3c992000}, {0x3c994000}, {0x3c996000}, {0x3c998000}, {0x3c99a000}, {0x3c99c000}, {0x3c99e000}, {0x3c9a0000}, {0x3c9a2000}, {0x3c9a4000}, {0x3c9a6000}, {0x3c9a8000}, {0x3c9aa000}, {0x3c9ac000}, {0x3c9ae000}, {0x3c9b0000}, {0x3c9b2000}, {0x3c9b4000}, {0x3c9b6000}, {0x3c9b8000}, {0x3c9ba000}, {0x3c9bc000}, {0x3c9be000}, {0x3c9c0000}, {0x3c9c2000}, {0x3c9c4000}, {0x3c9c6000}, {0x3c9c8000}, {0x3c9ca000}, {0x3c9cc000}, {0x3c9ce000}, {0x3c9d0000}, {0x3c9d2000}, {0x3c9d4000}, {0x3c9d6000}, {0x3c9d8000}, {0x3c9da000}, {0x3c9dc000}, {0x3c9de000}, {0x3c9e0000}, {0x3c9e2000}, {0x3c9e4000}, {0x3c9e6000}, {0x3c9e8000}, {0x3c9ea000}, {0x3c9ec000}, {0x3c9ee000}, {0x3c9f0000}, {0x3c9f2000}, {0x3c9f4000}, {0x3c9f6000}, {0x3c9f8000}, {0x3c9fa000}, {0x3c9fc000}, {0x3c9fe000}, {0x3ca00000}, {0x3ca02000}, {0x3ca04000}, {0x3ca06000}, {0x3ca08000}, {0x3ca0a000}, {0x3ca0c000}, {0x3ca0e000}, {0x3ca10000}, {0x3ca12000}, {0x3ca14000}, {0x3ca16000}, {0x3ca18000}, {0x3ca1a000}, {0x3ca1c000}, {0x3ca1e000}, {0x3ca20000}, {0x3ca22000}, {0x3ca24000}, {0x3ca26000}, {0x3ca28000}, {0x3ca2a000}, {0x3ca2c000}, {0x3ca2e000}, {0x3ca30000}, {0x3ca32000}, {0x3ca34000}, {0x3ca36000}, {0x3ca38000}, {0x3ca3a000}, {0x3ca3c000}, {0x3ca3e000}, {0x3ca40000}, {0x3ca42000}, {0x3ca44000}, {0x3ca46000}, {0x3ca48000}, {0x3ca4a000}, {0x3ca4c000}, {0x3ca4e000}, {0x3ca50000}, {0x3ca52000}, {0x3ca54000}, {0x3ca56000}, {0x3ca58000}, {0x3ca5a000}, {0x3ca5c000}, {0x3ca5e000}, {0x3ca60000}, {0x3ca62000}, {0x3ca64000}, {0x3ca66000}, {0x3ca68000}, {0x3ca6a000}, {0x3ca6c000}, {0x3ca6e000}, {0x3ca70000}, {0x3ca72000}, {0x3ca74000}, {0x3ca76000}, {0x3ca78000}, {0x3ca7a000}, {0x3ca7c000}, {0x3ca7e000}, {0x3ca80000}, {0x3ca82000}, {0x3ca84000}, {0x3ca86000}, {0x3ca88000}, {0x3ca8a000}, {0x3ca8c000}, {0x3ca8e000}, {0x3ca90000}, {0x3ca92000}, {0x3ca94000}, {0x3ca96000}, {0x3ca98000}, {0x3ca9a000}, {0x3ca9c000}, {0x3ca9e000}, {0x3caa0000}, {0x3caa2000}, {0x3caa4000}, {0x3caa6000}, {0x3caa8000}, {0x3caaa000}, {0x3caac000}, {0x3caae000}, {0x3cab0000}, {0x3cab2000}, {0x3cab4000}, {0x3cab6000}, {0x3cab8000}, {0x3caba000}, {0x3cabc000}, {0x3cabe000}, {0x3cac0000}, {0x3cac2000}, {0x3cac4000}, {0x3cac6000}, {0x3cac8000}, {0x3caca000}, {0x3cacc000}, {0x3cace000}, {0x3cad0000}, {0x3cad2000}, {0x3cad4000}, {0x3cad6000}, {0x3cad8000}, {0x3cada000}, {0x3cadc000}, {0x3cade000}, {0x3cae0000}, {0x3cae2000}, {0x3cae4000}, {0x3cae6000}, {0x3cae8000}, {0x3caea000}, {0x3caec000}, {0x3caee000}, {0x3caf0000}, {0x3caf2000}, {0x3caf4000}, {0x3caf6000}, {0x3caf8000}, {0x3cafa000}, {0x3cafc000}, {0x3cafe000}, {0x3cb00000}, {0x3cb02000}, {0x3cb04000}, {0x3cb06000}, {0x3cb08000}, {0x3cb0a000}, {0x3cb0c000}, {0x3cb0e000}, {0x3cb10000}, {0x3cb12000}, {0x3cb14000}, {0x3cb16000}, {0x3cb18000}, {0x3cb1a000}, {0x3cb1c000}, {0x3cb1e000}, {0x3cb20000}, {0x3cb22000}, {0x3cb24000}, {0x3cb26000}, {0x3cb28000}, {0x3cb2a000}, {0x3cb2c000}, {0x3cb2e000}, {0x3cb30000}, {0x3cb32000}, {0x3cb34000}, {0x3cb36000}, {0x3cb38000}, {0x3cb3a000}, {0x3cb3c000}, {0x3cb3e000}, {0x3cb40000}, {0x3cb42000}, {0x3cb44000}, {0x3cb46000}, {0x3cb48000}, {0x3cb4a000}, {0x3cb4c000}, {0x3cb4e000}, {0x3cb50000}, {0x3cb52000}, {0x3cb54000}, {0x3cb56000}, {0x3cb58000}, {0x3cb5a000}, {0x3cb5c000}, {0x3cb5e000}, {0x3cb60000}, {0x3cb62000}, {0x3cb64000}, {0x3cb66000}, {0x3cb68000}, {0x3cb6a000}, {0x3cb6c000}, {0x3cb6e000}, {0x3cb70000}, {0x3cb72000}, {0x3cb74000}, {0x3cb76000}, {0x3cb78000}, {0x3cb7a000}, {0x3cb7c000}, {0x3cb7e000}, {0x3cb80000}, {0x3cb82000}, {0x3cb84000}, {0x3cb86000}, {0x3cb88000}, {0x3cb8a000}, {0x3cb8c000}, {0x3cb8e000}, {0x3cb90000}, {0x3cb92000}, {0x3cb94000}, {0x3cb96000}, {0x3cb98000}, {0x3cb9a000}, {0x3cb9c000}, {0x3cb9e000}, {0x3cba0000}, {0x3cba2000}, {0x3cba4000}, {0x3cba6000}, {0x3cba8000}, {0x3cbaa000}, {0x3cbac000}, {0x3cbae000}, {0x3cbb0000}, {0x3cbb2000}, {0x3cbb4000}, {0x3cbb6000}, {0x3cbb8000}, {0x3cbba000}, {0x3cbbc000}, {0x3cbbe000}, {0x3cbc0000}, {0x3cbc2000}, {0x3cbc4000}, {0x3cbc6000}, {0x3cbc8000}, {0x3cbca000}, {0x3cbcc000}, {0x3cbce000}, {0x3cbd0000}, {0x3cbd2000}, {0x3cbd4000}, {0x3cbd6000}, {0x3cbd8000}, {0x3cbda000}, {0x3cbdc000}, {0x3cbde000}, {0x3cbe0000}, {0x3cbe2000}, {0x3cbe4000}, {0x3cbe6000}, {0x3cbe8000}, {0x3cbea000}, {0x3cbec000}, {0x3cbee000}, {0x3cbf0000}, {0x3cbf2000}, {0x3cbf4000}, {0x3cbf6000}, {0x3cbf8000}, {0x3cbfa000}, {0x3cbfc000}, {0x3cbfe000}, {0x3cc00000}, {0x3cc02000}, {0x3cc04000}, {0x3cc06000}, {0x3cc08000}, {0x3cc0a000}, {0x3cc0c000}, {0x3cc0e000}, {0x3cc10000}, {0x3cc12000}, {0x3cc14000}, {0x3cc16000}, {0x3cc18000}, {0x3cc1a000}, {0x3cc1c000}, {0x3cc1e000}, {0x3cc20000}, {0x3cc22000}, {0x3cc24000}, {0x3cc26000}, {0x3cc28000}, {0x3cc2a000}, {0x3cc2c000}, {0x3cc2e000}, {0x3cc30000}, {0x3cc32000}, {0x3cc34000}, {0x3cc36000}, {0x3cc38000}, {0x3cc3a000}, {0x3cc3c000}, {0x3cc3e000}, {0x3cc40000}, {0x3cc42000}, {0x3cc44000}, {0x3cc46000}, {0x3cc48000}, {0x3cc4a000}, {0x3cc4c000}, {0x3cc4e000}, {0x3cc50000}, {0x3cc52000}, {0x3cc54000}, {0x3cc56000}, {0x3cc58000}, {0x3cc5a000}, {0x3cc5c000}, {0x3cc5e000}, {0x3cc60000}, {0x3cc62000}, {0x3cc64000}, {0x3cc66000}, {0x3cc68000}, {0x3cc6a000}, {0x3cc6c000}, {0x3cc6e000}, {0x3cc70000}, {0x3cc72000}, {0x3cc74000}, {0x3cc76000}, {0x3cc78000}, {0x3cc7a000}, {0x3cc7c000}, {0x3cc7e000}, {0x3cc80000}, {0x3cc82000}, {0x3cc84000}, {0x3cc86000}, {0x3cc88000}, {0x3cc8a000}, {0x3cc8c000}, {0x3cc8e000}, {0x3cc90000}, {0x3cc92000}, {0x3cc94000}, {0x3cc96000}, {0x3cc98000}, {0x3cc9a000}, {0x3cc9c000}, {0x3cc9e000}, {0x3cca0000}, {0x3cca2000}, {0x3cca4000}, {0x3cca6000}, {0x3cca8000}, {0x3ccaa000}, {0x3ccac000}, {0x3ccae000}, {0x3ccb0000}, {0x3ccb2000}, {0x3ccb4000}, {0x3ccb6000}, {0x3ccb8000}, {0x3ccba000}, {0x3ccbc000}, {0x3ccbe000}, {0x3ccc0000}, {0x3ccc2000}, {0x3ccc4000}, {0x3ccc6000}, {0x3ccc8000}, {0x3ccca000}, {0x3cccc000}, {0x3ccce000}, {0x3ccd0000}, {0x3ccd2000}, {0x3ccd4000}, {0x3ccd6000}, {0x3ccd8000}, {0x3ccda000}, {0x3ccdc000}, {0x3ccde000}, {0x3cce0000}, {0x3cce2000}, {0x3cce4000}, {0x3cce6000}, {0x3cce8000}, {0x3ccea000}, {0x3ccec000}, {0x3ccee000}, {0x3ccf0000}, {0x3ccf2000}, {0x3ccf4000}, {0x3ccf6000}, {0x3ccf8000}, {0x3ccfa000}, {0x3ccfc000}, {0x3ccfe000}, {0x3cd00000}, {0x3cd02000}, {0x3cd04000}, {0x3cd06000}, {0x3cd08000}, {0x3cd0a000}, {0x3cd0c000}, {0x3cd0e000}, {0x3cd10000}, {0x3cd12000}, {0x3cd14000}, {0x3cd16000}, {0x3cd18000}, {0x3cd1a000}, {0x3cd1c000}, {0x3cd1e000}, {0x3cd20000}, {0x3cd22000}, {0x3cd24000}, {0x3cd26000}, {0x3cd28000}, {0x3cd2a000}, {0x3cd2c000}, {0x3cd2e000}, {0x3cd30000}, {0x3cd32000}, {0x3cd34000}, {0x3cd36000}, {0x3cd38000}, {0x3cd3a000}, {0x3cd3c000}, {0x3cd3e000}, {0x3cd40000}, {0x3cd42000}, {0x3cd44000}, {0x3cd46000}, {0x3cd48000}, {0x3cd4a000}, {0x3cd4c000}, {0x3cd4e000}, {0x3cd50000}, {0x3cd52000}, {0x3cd54000}, {0x3cd56000}, {0x3cd58000}, {0x3cd5a000}, {0x3cd5c000}, {0x3cd5e000}, {0x3cd60000}, {0x3cd62000}, {0x3cd64000}, {0x3cd66000}, {0x3cd68000}, {0x3cd6a000}, {0x3cd6c000}, {0x3cd6e000}, {0x3cd70000}, {0x3cd72000}, {0x3cd74000}, {0x3cd76000}, {0x3cd78000}, {0x3cd7a000}, {0x3cd7c000}, {0x3cd7e000}, {0x3cd80000}, {0x3cd82000}, {0x3cd84000}, {0x3cd86000}, {0x3cd88000}, {0x3cd8a000}, {0x3cd8c000}, {0x3cd8e000}, {0x3cd90000}, {0x3cd92000}, {0x3cd94000}, {0x3cd96000}, {0x3cd98000}, {0x3cd9a000}, {0x3cd9c000}, {0x3cd9e000}, {0x3cda0000}, {0x3cda2000}, {0x3cda4000}, {0x3cda6000}, {0x3cda8000}, {0x3cdaa000}, {0x3cdac000}, {0x3cdae000}, {0x3cdb0000}, {0x3cdb2000}, {0x3cdb4000}, {0x3cdb6000}, {0x3cdb8000}, {0x3cdba000}, {0x3cdbc000}, {0x3cdbe000}, {0x3cdc0000}, {0x3cdc2000}, {0x3cdc4000}, {0x3cdc6000}, {0x3cdc8000}, {0x3cdca000}, {0x3cdcc000}, {0x3cdce000}, {0x3cdd0000}, {0x3cdd2000}, {0x3cdd4000}, {0x3cdd6000}, {0x3cdd8000}, {0x3cdda000}, {0x3cddc000}, {0x3cdde000}, {0x3cde0000}, {0x3cde2000}, {0x3cde4000}, {0x3cde6000}, {0x3cde8000}, {0x3cdea000}, {0x3cdec000}, {0x3cdee000}, {0x3cdf0000}, {0x3cdf2000}, {0x3cdf4000}, {0x3cdf6000}, {0x3cdf8000}, {0x3cdfa000}, {0x3cdfc000}, {0x3cdfe000}, {0x3ce00000}, {0x3ce02000}, {0x3ce04000}, {0x3ce06000}, {0x3ce08000}, {0x3ce0a000}, {0x3ce0c000}, {0x3ce0e000}, {0x3ce10000}, {0x3ce12000}, {0x3ce14000}, {0x3ce16000}, {0x3ce18000}, {0x3ce1a000}, {0x3ce1c000}, {0x3ce1e000}, {0x3ce20000}, {0x3ce22000}, {0x3ce24000}, {0x3ce26000}, {0x3ce28000}, {0x3ce2a000}, {0x3ce2c000}, {0x3ce2e000}, {0x3ce30000}, {0x3ce32000}, {0x3ce34000}, {0x3ce36000}, {0x3ce38000}, {0x3ce3a000}, {0x3ce3c000}, {0x3ce3e000}, {0x3ce40000}, {0x3ce42000}, {0x3ce44000}, {0x3ce46000}, {0x3ce48000}, {0x3ce4a000}, {0x3ce4c000}, {0x3ce4e000}, {0x3ce50000}, {0x3ce52000}, {0x3ce54000}, {0x3ce56000}, {0x3ce58000}, {0x3ce5a000}, {0x3ce5c000}, {0x3ce5e000}, {0x3ce60000}, {0x3ce62000}, {0x3ce64000}, {0x3ce66000}, {0x3ce68000}, {0x3ce6a000}, {0x3ce6c000}, {0x3ce6e000}, {0x3ce70000}, {0x3ce72000}, {0x3ce74000}, {0x3ce76000}, {0x3ce78000}, {0x3ce7a000}, {0x3ce7c000}, {0x3ce7e000}, {0x3ce80000}, {0x3ce82000}, {0x3ce84000}, {0x3ce86000}, {0x3ce88000}, {0x3ce8a000}, {0x3ce8c000}, {0x3ce8e000}, {0x3ce90000}, {0x3ce92000}, {0x3ce94000}, {0x3ce96000}, {0x3ce98000}, {0x3ce9a000}, {0x3ce9c000}, {0x3ce9e000}, {0x3cea0000}, {0x3cea2000}, {0x3cea4000}, {0x3cea6000}, {0x3cea8000}, {0x3ceaa000}, {0x3ceac000}, {0x3ceae000}, {0x3ceb0000}, {0x3ceb2000}, {0x3ceb4000}, {0x3ceb6000}, {0x3ceb8000}, {0x3ceba000}, {0x3cebc000}, {0x3cebe000}, {0x3cec0000}, {0x3cec2000}, {0x3cec4000}, {0x3cec6000}, {0x3cec8000}, {0x3ceca000}, {0x3cecc000}, {0x3cece000}, {0x3ced0000}, {0x3ced2000}, {0x3ced4000}, {0x3ced6000}, {0x3ced8000}, {0x3ceda000}, {0x3cedc000}, {0x3cede000}, {0x3cee0000}, {0x3cee2000}, {0x3cee4000}, {0x3cee6000}, {0x3cee8000}, {0x3ceea000}, {0x3ceec000}, {0x3ceee000}, {0x3cef0000}, {0x3cef2000}, {0x3cef4000}, {0x3cef6000}, {0x3cef8000}, {0x3cefa000}, {0x3cefc000}, {0x3cefe000}, {0x3cf00000}, {0x3cf02000}, {0x3cf04000}, {0x3cf06000}, {0x3cf08000}, {0x3cf0a000}, {0x3cf0c000}, {0x3cf0e000}, {0x3cf10000}, {0x3cf12000}, {0x3cf14000}, {0x3cf16000}, {0x3cf18000}, {0x3cf1a000}, {0x3cf1c000}, {0x3cf1e000}, {0x3cf20000}, {0x3cf22000}, {0x3cf24000}, {0x3cf26000}, {0x3cf28000}, {0x3cf2a000}, {0x3cf2c000}, {0x3cf2e000}, {0x3cf30000}, {0x3cf32000}, {0x3cf34000}, {0x3cf36000}, {0x3cf38000}, {0x3cf3a000}, {0x3cf3c000}, {0x3cf3e000}, {0x3cf40000}, {0x3cf42000}, {0x3cf44000}, {0x3cf46000}, {0x3cf48000}, {0x3cf4a000}, {0x3cf4c000}, {0x3cf4e000}, {0x3cf50000}, {0x3cf52000}, {0x3cf54000}, {0x3cf56000}, {0x3cf58000}, {0x3cf5a000}, {0x3cf5c000}, {0x3cf5e000}, {0x3cf60000}, {0x3cf62000}, {0x3cf64000}, {0x3cf66000}, {0x3cf68000}, {0x3cf6a000}, {0x3cf6c000}, {0x3cf6e000}, {0x3cf70000}, {0x3cf72000}, {0x3cf74000}, {0x3cf76000}, {0x3cf78000}, {0x3cf7a000}, {0x3cf7c000}, {0x3cf7e000}, {0x3cf80000}, {0x3cf82000}, {0x3cf84000}, {0x3cf86000}, {0x3cf88000}, {0x3cf8a000}, {0x3cf8c000}, {0x3cf8e000}, {0x3cf90000}, {0x3cf92000}, {0x3cf94000}, {0x3cf96000}, {0x3cf98000}, {0x3cf9a000}, {0x3cf9c000}, {0x3cf9e000}, {0x3cfa0000}, {0x3cfa2000}, {0x3cfa4000}, {0x3cfa6000}, {0x3cfa8000}, {0x3cfaa000}, {0x3cfac000}, {0x3cfae000}, {0x3cfb0000}, {0x3cfb2000}, {0x3cfb4000}, {0x3cfb6000}, {0x3cfb8000}, {0x3cfba000}, {0x3cfbc000}, {0x3cfbe000}, {0x3cfc0000}, {0x3cfc2000}, {0x3cfc4000}, {0x3cfc6000}, {0x3cfc8000}, {0x3cfca000}, {0x3cfcc000}, {0x3cfce000}, {0x3cfd0000}, {0x3cfd2000}, {0x3cfd4000}, {0x3cfd6000}, {0x3cfd8000}, {0x3cfda000}, {0x3cfdc000}, {0x3cfde000}, {0x3cfe0000}, {0x3cfe2000}, {0x3cfe4000}, {0x3cfe6000}, {0x3cfe8000}, {0x3cfea000}, {0x3cfec000}, {0x3cfee000}, {0x3cff0000}, {0x3cff2000}, {0x3cff4000}, {0x3cff6000}, {0x3cff8000}, {0x3cffa000}, {0x3cffc000}, {0x3cffe000}, {0x3d000000}, {0x3d002000}, {0x3d004000}, {0x3d006000}, {0x3d008000}, {0x3d00a000}, {0x3d00c000}, {0x3d00e000}, {0x3d010000}, {0x3d012000}, {0x3d014000}, {0x3d016000}, {0x3d018000}, {0x3d01a000}, {0x3d01c000}, {0x3d01e000}, {0x3d020000}, {0x3d022000}, {0x3d024000}, {0x3d026000}, {0x3d028000}, {0x3d02a000}, {0x3d02c000}, {0x3d02e000}, {0x3d030000}, {0x3d032000}, {0x3d034000}, {0x3d036000}, {0x3d038000}, {0x3d03a000}, {0x3d03c000}, {0x3d03e000}, {0x3d040000}, {0x3d042000}, {0x3d044000}, {0x3d046000}, {0x3d048000}, {0x3d04a000}, {0x3d04c000}, {0x3d04e000}, {0x3d050000}, {0x3d052000}, {0x3d054000}, {0x3d056000}, {0x3d058000}, {0x3d05a000}, {0x3d05c000}, {0x3d05e000}, {0x3d060000}, {0x3d062000}, {0x3d064000}, {0x3d066000}, {0x3d068000}, {0x3d06a000}, {0x3d06c000}, {0x3d06e000}, {0x3d070000}, {0x3d072000}, {0x3d074000}, {0x3d076000}, {0x3d078000}, {0x3d07a000}, {0x3d07c000}, {0x3d07e000}, {0x3d080000}, {0x3d082000}, {0x3d084000}, {0x3d086000}, {0x3d088000}, {0x3d08a000}, {0x3d08c000}, {0x3d08e000}, {0x3d090000}, {0x3d092000}, {0x3d094000}, {0x3d096000}, {0x3d098000}, {0x3d09a000}, {0x3d09c000}, {0x3d09e000}, {0x3d0a0000}, {0x3d0a2000}, {0x3d0a4000}, {0x3d0a6000}, {0x3d0a8000}, {0x3d0aa000}, {0x3d0ac000}, {0x3d0ae000}, {0x3d0b0000}, {0x3d0b2000}, {0x3d0b4000}, {0x3d0b6000}, {0x3d0b8000}, {0x3d0ba000}, {0x3d0bc000}, {0x3d0be000}, {0x3d0c0000}, {0x3d0c2000}, {0x3d0c4000}, {0x3d0c6000}, {0x3d0c8000}, {0x3d0ca000}, {0x3d0cc000}, {0x3d0ce000}, {0x3d0d0000}, {0x3d0d2000}, {0x3d0d4000}, {0x3d0d6000}, {0x3d0d8000}, {0x3d0da000}, {0x3d0dc000}, {0x3d0de000}, {0x3d0e0000}, {0x3d0e2000}, {0x3d0e4000}, {0x3d0e6000}, {0x3d0e8000}, {0x3d0ea000}, {0x3d0ec000}, {0x3d0ee000}, {0x3d0f0000}, {0x3d0f2000}, {0x3d0f4000}, {0x3d0f6000}, {0x3d0f8000}, {0x3d0fa000}, {0x3d0fc000}, {0x3d0fe000}, {0x3d100000}, {0x3d102000}, {0x3d104000}, {0x3d106000}, {0x3d108000}, {0x3d10a000}, {0x3d10c000}, {0x3d10e000}, {0x3d110000}, {0x3d112000}, {0x3d114000}, {0x3d116000}, {0x3d118000}, {0x3d11a000}, {0x3d11c000}, {0x3d11e000}, {0x3d120000}, {0x3d122000}, {0x3d124000}, {0x3d126000}, {0x3d128000}, {0x3d12a000}, {0x3d12c000}, {0x3d12e000}, {0x3d130000}, {0x3d132000}, {0x3d134000}, {0x3d136000}, {0x3d138000}, {0x3d13a000}, {0x3d13c000}, {0x3d13e000}, {0x3d140000}, {0x3d142000}, {0x3d144000}, {0x3d146000}, {0x3d148000}, {0x3d14a000}, {0x3d14c000}, {0x3d14e000}, {0x3d150000}, {0x3d152000}, {0x3d154000}, {0x3d156000}, {0x3d158000}, {0x3d15a000}, {0x3d15c000}, {0x3d15e000}, {0x3d160000}, {0x3d162000}, {0x3d164000}, {0x3d166000}, {0x3d168000}, {0x3d16a000}, {0x3d16c000}, {0x3d16e000}, {0x3d170000}, {0x3d172000}, {0x3d174000}, {0x3d176000}, {0x3d178000}, {0x3d17a000}, {0x3d17c000}, {0x3d17e000}, {0x3d180000}, {0x3d182000}, {0x3d184000}, {0x3d186000}, {0x3d188000}, {0x3d18a000}, {0x3d18c000}, {0x3d18e000}, {0x3d190000}, {0x3d192000}, {0x3d194000}, {0x3d196000}, {0x3d198000}, {0x3d19a000}, {0x3d19c000}, {0x3d19e000}, {0x3d1a0000}, {0x3d1a2000}, {0x3d1a4000}, {0x3d1a6000}, {0x3d1a8000}, {0x3d1aa000}, {0x3d1ac000}, {0x3d1ae000}, {0x3d1b0000}, {0x3d1b2000}, {0x3d1b4000}, {0x3d1b6000}, {0x3d1b8000}, {0x3d1ba000}, {0x3d1bc000}, {0x3d1be000}, {0x3d1c0000}, {0x3d1c2000}, {0x3d1c4000}, {0x3d1c6000}, {0x3d1c8000}, {0x3d1ca000}, {0x3d1cc000}, {0x3d1ce000}, {0x3d1d0000}, {0x3d1d2000}, {0x3d1d4000}, {0x3d1d6000}, {0x3d1d8000}, {0x3d1da000}, {0x3d1dc000}, {0x3d1de000}, {0x3d1e0000}, {0x3d1e2000}, {0x3d1e4000}, {0x3d1e6000}, {0x3d1e8000}, {0x3d1ea000}, {0x3d1ec000}, {0x3d1ee000}, {0x3d1f0000}, {0x3d1f2000}, {0x3d1f4000}, {0x3d1f6000}, {0x3d1f8000}, {0x3d1fa000}, {0x3d1fc000}, {0x3d1fe000}, {0x3d200000}, {0x3d202000}, {0x3d204000}, {0x3d206000}, {0x3d208000}, {0x3d20a000}, {0x3d20c000}, {0x3d20e000}, {0x3d210000}, {0x3d212000}, {0x3d214000}, {0x3d216000}, {0x3d218000}, {0x3d21a000}, {0x3d21c000}, {0x3d21e000}, {0x3d220000}, {0x3d222000}, {0x3d224000}, {0x3d226000}, {0x3d228000}, {0x3d22a000}, {0x3d22c000}, {0x3d22e000}, {0x3d230000}, {0x3d232000}, {0x3d234000}, {0x3d236000}, {0x3d238000}, {0x3d23a000}, {0x3d23c000}, {0x3d23e000}, {0x3d240000}, {0x3d242000}, {0x3d244000}, {0x3d246000}, {0x3d248000}, {0x3d24a000}, {0x3d24c000}, {0x3d24e000}, {0x3d250000}, {0x3d252000}, {0x3d254000}, {0x3d256000}, {0x3d258000}, {0x3d25a000}, {0x3d25c000}, {0x3d25e000}, {0x3d260000}, {0x3d262000}, {0x3d264000}, {0x3d266000}, {0x3d268000}, {0x3d26a000}, {0x3d26c000}, {0x3d26e000}, {0x3d270000}, {0x3d272000}, {0x3d274000}, {0x3d276000}, {0x3d278000}, {0x3d27a000}, {0x3d27c000}, {0x3d27e000}, {0x3d280000}, {0x3d282000}, {0x3d284000}, {0x3d286000}, {0x3d288000}, {0x3d28a000}, {0x3d28c000}, {0x3d28e000}, {0x3d290000}, {0x3d292000}, {0x3d294000}, {0x3d296000}, {0x3d298000}, {0x3d29a000}, {0x3d29c000}, {0x3d29e000}, {0x3d2a0000}, {0x3d2a2000}, {0x3d2a4000}, {0x3d2a6000}, {0x3d2a8000}, {0x3d2aa000}, {0x3d2ac000}, {0x3d2ae000}, {0x3d2b0000}, {0x3d2b2000}, {0x3d2b4000}, {0x3d2b6000}, {0x3d2b8000}, {0x3d2ba000}, {0x3d2bc000}, {0x3d2be000}, {0x3d2c0000}, {0x3d2c2000}, {0x3d2c4000}, {0x3d2c6000}, {0x3d2c8000}, {0x3d2ca000}, {0x3d2cc000}, {0x3d2ce000}, {0x3d2d0000}, {0x3d2d2000}, {0x3d2d4000}, {0x3d2d6000}, {0x3d2d8000}, {0x3d2da000}, {0x3d2dc000}, {0x3d2de000}, {0x3d2e0000}, {0x3d2e2000}, {0x3d2e4000}, {0x3d2e6000}, {0x3d2e8000}, {0x3d2ea000}, {0x3d2ec000}, {0x3d2ee000}, {0x3d2f0000}, {0x3d2f2000}, {0x3d2f4000}, {0x3d2f6000}, {0x3d2f8000}, {0x3d2fa000}, {0x3d2fc000}, {0x3d2fe000}, {0x3d300000}, {0x3d302000}, {0x3d304000}, {0x3d306000}, {0x3d308000}, {0x3d30a000}, {0x3d30c000}, {0x3d30e000}, {0x3d310000}, {0x3d312000}, {0x3d314000}, {0x3d316000}, {0x3d318000}, {0x3d31a000}, {0x3d31c000}, {0x3d31e000}, {0x3d320000}, {0x3d322000}, {0x3d324000}, {0x3d326000}, {0x3d328000}, {0x3d32a000}, {0x3d32c000}, {0x3d32e000}, {0x3d330000}, {0x3d332000}, {0x3d334000}, {0x3d336000}, {0x3d338000}, {0x3d33a000}, {0x3d33c000}, {0x3d33e000}, {0x3d340000}, {0x3d342000}, {0x3d344000}, {0x3d346000}, {0x3d348000}, {0x3d34a000}, {0x3d34c000}, {0x3d34e000}, {0x3d350000}, {0x3d352000}, {0x3d354000}, {0x3d356000}, {0x3d358000}, {0x3d35a000}, {0x3d35c000}, {0x3d35e000}, {0x3d360000}, {0x3d362000}, {0x3d364000}, {0x3d366000}, {0x3d368000}, {0x3d36a000}, {0x3d36c000}, {0x3d36e000}, {0x3d370000}, {0x3d372000}, {0x3d374000}, {0x3d376000}, {0x3d378000}, {0x3d37a000}, {0x3d37c000}, {0x3d37e000}, {0x3d380000}, {0x3d382000}, {0x3d384000}, {0x3d386000}, {0x3d388000}, {0x3d38a000}, {0x3d38c000}, {0x3d38e000}, {0x3d390000}, {0x3d392000}, {0x3d394000}, {0x3d396000}, {0x3d398000}, {0x3d39a000}, {0x3d39c000}, {0x3d39e000}, {0x3d3a0000}, {0x3d3a2000}, {0x3d3a4000}, {0x3d3a6000}, {0x3d3a8000}, {0x3d3aa000}, {0x3d3ac000}, {0x3d3ae000}, {0x3d3b0000}, {0x3d3b2000}, {0x3d3b4000}, {0x3d3b6000}, {0x3d3b8000}, {0x3d3ba000}, {0x3d3bc000}, {0x3d3be000}, {0x3d3c0000}, {0x3d3c2000}, {0x3d3c4000}, {0x3d3c6000}, {0x3d3c8000}, {0x3d3ca000}, {0x3d3cc000}, {0x3d3ce000}, {0x3d3d0000}, {0x3d3d2000}, {0x3d3d4000}, {0x3d3d6000}, {0x3d3d8000}, {0x3d3da000}, {0x3d3dc000}, {0x3d3de000}, {0x3d3e0000}, {0x3d3e2000}, {0x3d3e4000}, {0x3d3e6000}, {0x3d3e8000}, {0x3d3ea000}, {0x3d3ec000}, {0x3d3ee000}, {0x3d3f0000}, {0x3d3f2000}, {0x3d3f4000}, {0x3d3f6000}, {0x3d3f8000}, {0x3d3fa000}, {0x3d3fc000}, {0x3d3fe000}, {0x3d400000}, {0x3d402000}, {0x3d404000}, {0x3d406000}, {0x3d408000}, {0x3d40a000}, {0x3d40c000}, {0x3d40e000}, {0x3d410000}, {0x3d412000}, {0x3d414000}, {0x3d416000}, {0x3d418000}, {0x3d41a000}, {0x3d41c000}, {0x3d41e000}, {0x3d420000}, {0x3d422000}, {0x3d424000}, {0x3d426000}, {0x3d428000}, {0x3d42a000}, {0x3d42c000}, {0x3d42e000}, {0x3d430000}, {0x3d432000}, {0x3d434000}, {0x3d436000}, {0x3d438000}, {0x3d43a000}, {0x3d43c000}, {0x3d43e000}, {0x3d440000}, {0x3d442000}, {0x3d444000}, {0x3d446000}, {0x3d448000}, {0x3d44a000}, {0x3d44c000}, {0x3d44e000}, {0x3d450000}, {0x3d452000}, {0x3d454000}, {0x3d456000}, {0x3d458000}, {0x3d45a000}, {0x3d45c000}, {0x3d45e000}, {0x3d460000}, {0x3d462000}, {0x3d464000}, {0x3d466000}, {0x3d468000}, {0x3d46a000}, {0x3d46c000}, {0x3d46e000}, {0x3d470000}, {0x3d472000}, {0x3d474000}, {0x3d476000}, {0x3d478000}, {0x3d47a000}, {0x3d47c000}, {0x3d47e000}, {0x3d480000}, {0x3d482000}, {0x3d484000}, {0x3d486000}, {0x3d488000}, {0x3d48a000}, {0x3d48c000}, {0x3d48e000}, {0x3d490000}, {0x3d492000}, {0x3d494000}, {0x3d496000}, {0x3d498000}, {0x3d49a000}, {0x3d49c000}, {0x3d49e000}, {0x3d4a0000}, {0x3d4a2000}, {0x3d4a4000}, {0x3d4a6000}, {0x3d4a8000}, {0x3d4aa000}, {0x3d4ac000}, {0x3d4ae000}, {0x3d4b0000}, {0x3d4b2000}, {0x3d4b4000}, {0x3d4b6000}, {0x3d4b8000}, {0x3d4ba000}, {0x3d4bc000}, {0x3d4be000}, {0x3d4c0000}, {0x3d4c2000}, {0x3d4c4000}, {0x3d4c6000}, {0x3d4c8000}, {0x3d4ca000}, {0x3d4cc000}, {0x3d4ce000}, {0x3d4d0000}, {0x3d4d2000}, {0x3d4d4000}, {0x3d4d6000}, {0x3d4d8000}, {0x3d4da000}, {0x3d4dc000}, {0x3d4de000}, {0x3d4e0000}, {0x3d4e2000}, {0x3d4e4000}, {0x3d4e6000}, {0x3d4e8000}, {0x3d4ea000}, {0x3d4ec000}, {0x3d4ee000}, {0x3d4f0000}, {0x3d4f2000}, {0x3d4f4000}, {0x3d4f6000}, {0x3d4f8000}, {0x3d4fa000}, {0x3d4fc000}, {0x3d4fe000}, {0x3d500000}, {0x3d502000}, {0x3d504000}, {0x3d506000}, {0x3d508000}, {0x3d50a000}, {0x3d50c000}, {0x3d50e000}, {0x3d510000}, {0x3d512000}, {0x3d514000}, {0x3d516000}, {0x3d518000}, {0x3d51a000}, {0x3d51c000}, {0x3d51e000}, {0x3d520000}, {0x3d522000}, {0x3d524000}, {0x3d526000}, {0x3d528000}, {0x3d52a000}, {0x3d52c000}, {0x3d52e000}, {0x3d530000}, {0x3d532000}, {0x3d534000}, {0x3d536000}, {0x3d538000}, {0x3d53a000}, {0x3d53c000}, {0x3d53e000}, {0x3d540000}, {0x3d542000}, {0x3d544000}, {0x3d546000}, {0x3d548000}, {0x3d54a000}, {0x3d54c000}, {0x3d54e000}, {0x3d550000}, {0x3d552000}, {0x3d554000}, {0x3d556000}, {0x3d558000}, {0x3d55a000}, {0x3d55c000}, {0x3d55e000}, {0x3d560000}, {0x3d562000}, {0x3d564000}, {0x3d566000}, {0x3d568000}, {0x3d56a000}, {0x3d56c000}, {0x3d56e000}, {0x3d570000}, {0x3d572000}, {0x3d574000}, {0x3d576000}, {0x3d578000}, {0x3d57a000}, {0x3d57c000}, {0x3d57e000}, {0x3d580000}, {0x3d582000}, {0x3d584000}, {0x3d586000}, {0x3d588000}, {0x3d58a000}, {0x3d58c000}, {0x3d58e000}, {0x3d590000}, {0x3d592000}, {0x3d594000}, {0x3d596000}, {0x3d598000}, {0x3d59a000}, {0x3d59c000}, {0x3d59e000}, {0x3d5a0000}, {0x3d5a2000}, {0x3d5a4000}, {0x3d5a6000}, {0x3d5a8000}, {0x3d5aa000}, {0x3d5ac000}, {0x3d5ae000}, {0x3d5b0000}, {0x3d5b2000}, {0x3d5b4000}, {0x3d5b6000}, {0x3d5b8000}, {0x3d5ba000}, {0x3d5bc000}, {0x3d5be000}, {0x3d5c0000}, {0x3d5c2000}, {0x3d5c4000}, {0x3d5c6000}, {0x3d5c8000}, {0x3d5ca000}, {0x3d5cc000}, {0x3d5ce000}, {0x3d5d0000}, {0x3d5d2000}, {0x3d5d4000}, {0x3d5d6000}, {0x3d5d8000}, {0x3d5da000}, {0x3d5dc000}, {0x3d5de000}, {0x3d5e0000}, {0x3d5e2000}, {0x3d5e4000}, {0x3d5e6000}, {0x3d5e8000}, {0x3d5ea000}, {0x3d5ec000}, {0x3d5ee000}, {0x3d5f0000}, {0x3d5f2000}, {0x3d5f4000}, {0x3d5f6000}, {0x3d5f8000}, {0x3d5fa000}, {0x3d5fc000}, {0x3d5fe000}, {0x3d600000}, {0x3d602000}, {0x3d604000}, {0x3d606000}, {0x3d608000}, {0x3d60a000}, {0x3d60c000}, {0x3d60e000}, {0x3d610000}, {0x3d612000}, {0x3d614000}, {0x3d616000}, {0x3d618000}, {0x3d61a000}, {0x3d61c000}, {0x3d61e000}, {0x3d620000}, {0x3d622000}, {0x3d624000}, {0x3d626000}, {0x3d628000}, {0x3d62a000}, {0x3d62c000}, {0x3d62e000}, {0x3d630000}, {0x3d632000}, {0x3d634000}, {0x3d636000}, {0x3d638000}, {0x3d63a000}, {0x3d63c000}, {0x3d63e000}, {0x3d640000}, {0x3d642000}, {0x3d644000}, {0x3d646000}, {0x3d648000}, {0x3d64a000}, {0x3d64c000}, {0x3d64e000}, {0x3d650000}, {0x3d652000}, {0x3d654000}, {0x3d656000}, {0x3d658000}, {0x3d65a000}, {0x3d65c000}, {0x3d65e000}, {0x3d660000}, {0x3d662000}, {0x3d664000}, {0x3d666000}, {0x3d668000}, {0x3d66a000}, {0x3d66c000}, {0x3d66e000}, {0x3d670000}, {0x3d672000}, {0x3d674000}, {0x3d676000}, {0x3d678000}, {0x3d67a000}, {0x3d67c000}, {0x3d67e000}, {0x3d680000}, {0x3d682000}, {0x3d684000}, {0x3d686000}, {0x3d688000}, {0x3d68a000}, {0x3d68c000}, {0x3d68e000}, {0x3d690000}, {0x3d692000}, {0x3d694000}, {0x3d696000}, {0x3d698000}, {0x3d69a000}, {0x3d69c000}, {0x3d69e000}, {0x3d6a0000}, {0x3d6a2000}, {0x3d6a4000}, {0x3d6a6000}, {0x3d6a8000}, {0x3d6aa000}, {0x3d6ac000}, {0x3d6ae000}, {0x3d6b0000}, {0x3d6b2000}, {0x3d6b4000}, {0x3d6b6000}, {0x3d6b8000}, {0x3d6ba000}, {0x3d6bc000}, {0x3d6be000}, {0x3d6c0000}, {0x3d6c2000}, {0x3d6c4000}, {0x3d6c6000}, {0x3d6c8000}, {0x3d6ca000}, {0x3d6cc000}, {0x3d6ce000}, {0x3d6d0000}, {0x3d6d2000}, {0x3d6d4000}, {0x3d6d6000}, {0x3d6d8000}, {0x3d6da000}, {0x3d6dc000}, {0x3d6de000}, {0x3d6e0000}, {0x3d6e2000}, {0x3d6e4000}, {0x3d6e6000}, {0x3d6e8000}, {0x3d6ea000}, {0x3d6ec000}, {0x3d6ee000}, {0x3d6f0000}, {0x3d6f2000}, {0x3d6f4000}, {0x3d6f6000}, {0x3d6f8000}, {0x3d6fa000}, {0x3d6fc000}, {0x3d6fe000}, {0x3d700000}, {0x3d702000}, {0x3d704000}, {0x3d706000}, {0x3d708000}, {0x3d70a000}, {0x3d70c000}, {0x3d70e000}, {0x3d710000}, {0x3d712000}, {0x3d714000}, {0x3d716000}, {0x3d718000}, {0x3d71a000}, {0x3d71c000}, {0x3d71e000}, {0x3d720000}, {0x3d722000}, {0x3d724000}, {0x3d726000}, {0x3d728000}, {0x3d72a000}, {0x3d72c000}, {0x3d72e000}, {0x3d730000}, {0x3d732000}, {0x3d734000}, {0x3d736000}, {0x3d738000}, {0x3d73a000}, {0x3d73c000}, {0x3d73e000}, {0x3d740000}, {0x3d742000}, {0x3d744000}, {0x3d746000}, {0x3d748000}, {0x3d74a000}, {0x3d74c000}, {0x3d74e000}, {0x3d750000}, {0x3d752000}, {0x3d754000}, {0x3d756000}, {0x3d758000}, {0x3d75a000}, {0x3d75c000}, {0x3d75e000}, {0x3d760000}, {0x3d762000}, {0x3d764000}, {0x3d766000}, {0x3d768000}, {0x3d76a000}, {0x3d76c000}, {0x3d76e000}, {0x3d770000}, {0x3d772000}, {0x3d774000}, {0x3d776000}, {0x3d778000}, {0x3d77a000}, {0x3d77c000}, {0x3d77e000}, {0x3d780000}, {0x3d782000}, {0x3d784000}, {0x3d786000}, {0x3d788000}, {0x3d78a000}, {0x3d78c000}, {0x3d78e000}, {0x3d790000}, {0x3d792000}, {0x3d794000}, {0x3d796000}, {0x3d798000}, {0x3d79a000}, {0x3d79c000}, {0x3d79e000}, {0x3d7a0000}, {0x3d7a2000}, {0x3d7a4000}, {0x3d7a6000}, {0x3d7a8000}, {0x3d7aa000}, {0x3d7ac000}, {0x3d7ae000}, {0x3d7b0000}, {0x3d7b2000}, {0x3d7b4000}, {0x3d7b6000}, {0x3d7b8000}, {0x3d7ba000}, {0x3d7bc000}, {0x3d7be000}, {0x3d7c0000}, {0x3d7c2000}, {0x3d7c4000}, {0x3d7c6000}, {0x3d7c8000}, {0x3d7ca000}, {0x3d7cc000}, {0x3d7ce000}, {0x3d7d0000}, {0x3d7d2000}, {0x3d7d4000}, {0x3d7d6000}, {0x3d7d8000}, {0x3d7da000}, {0x3d7dc000}, {0x3d7de000}, {0x3d7e0000}, {0x3d7e2000}, {0x3d7e4000}, {0x3d7e6000}, {0x3d7e8000}, {0x3d7ea000}, {0x3d7ec000}, {0x3d7ee000}, {0x3d7f0000}, {0x3d7f2000}, {0x3d7f4000}, {0x3d7f6000}, {0x3d7f8000}, {0x3d7fa000}, {0x3d7fc000}, {0x3d7fe000}, {0x3d800000}, {0x3d802000}, {0x3d804000}, {0x3d806000}, {0x3d808000}, {0x3d80a000}, {0x3d80c000}, {0x3d80e000}, {0x3d810000}, {0x3d812000}, {0x3d814000}, {0x3d816000}, {0x3d818000}, {0x3d81a000}, {0x3d81c000}, {0x3d81e000}, {0x3d820000}, {0x3d822000}, {0x3d824000}, {0x3d826000}, {0x3d828000}, {0x3d82a000}, {0x3d82c000}, {0x3d82e000}, {0x3d830000}, {0x3d832000}, {0x3d834000}, {0x3d836000}, {0x3d838000}, {0x3d83a000}, {0x3d83c000}, {0x3d83e000}, {0x3d840000}, {0x3d842000}, {0x3d844000}, {0x3d846000}, {0x3d848000}, {0x3d84a000}, {0x3d84c000}, {0x3d84e000}, {0x3d850000}, {0x3d852000}, {0x3d854000}, {0x3d856000}, {0x3d858000}, {0x3d85a000}, {0x3d85c000}, {0x3d85e000}, {0x3d860000}, {0x3d862000}, {0x3d864000}, {0x3d866000}, {0x3d868000}, {0x3d86a000}, {0x3d86c000}, {0x3d86e000}, {0x3d870000}, {0x3d872000}, {0x3d874000}, {0x3d876000}, {0x3d878000}, {0x3d87a000}, {0x3d87c000}, {0x3d87e000}, {0x3d880000}, {0x3d882000}, {0x3d884000}, {0x3d886000}, {0x3d888000}, {0x3d88a000}, {0x3d88c000}, {0x3d88e000}, {0x3d890000}, {0x3d892000}, {0x3d894000}, {0x3d896000}, {0x3d898000}, {0x3d89a000}, {0x3d89c000}, {0x3d89e000}, {0x3d8a0000}, {0x3d8a2000}, {0x3d8a4000}, {0x3d8a6000}, {0x3d8a8000}, {0x3d8aa000}, {0x3d8ac000}, {0x3d8ae000}, {0x3d8b0000}, {0x3d8b2000}, {0x3d8b4000}, {0x3d8b6000}, {0x3d8b8000}, {0x3d8ba000}, {0x3d8bc000}, {0x3d8be000}, {0x3d8c0000}, {0x3d8c2000}, {0x3d8c4000}, {0x3d8c6000}, {0x3d8c8000}, {0x3d8ca000}, {0x3d8cc000}, {0x3d8ce000}, {0x3d8d0000}, {0x3d8d2000}, {0x3d8d4000}, {0x3d8d6000}, {0x3d8d8000}, {0x3d8da000}, {0x3d8dc000}, {0x3d8de000}, {0x3d8e0000}, {0x3d8e2000}, {0x3d8e4000}, {0x3d8e6000}, {0x3d8e8000}, {0x3d8ea000}, {0x3d8ec000}, {0x3d8ee000}, {0x3d8f0000}, {0x3d8f2000}, {0x3d8f4000}, {0x3d8f6000}, {0x3d8f8000}, {0x3d8fa000}, {0x3d8fc000}, {0x3d8fe000}, {0x3d900000}, {0x3d902000}, {0x3d904000}, {0x3d906000}, {0x3d908000}, {0x3d90a000}, {0x3d90c000}, {0x3d90e000}, {0x3d910000}, {0x3d912000}, {0x3d914000}, {0x3d916000}, {0x3d918000}, {0x3d91a000}, {0x3d91c000}, {0x3d91e000}, {0x3d920000}, {0x3d922000}, {0x3d924000}, {0x3d926000}, {0x3d928000}, {0x3d92a000}, {0x3d92c000}, {0x3d92e000}, {0x3d930000}, {0x3d932000}, {0x3d934000}, {0x3d936000}, {0x3d938000}, {0x3d93a000}, {0x3d93c000}, {0x3d93e000}, {0x3d940000}, {0x3d942000}, {0x3d944000}, {0x3d946000}, {0x3d948000}, {0x3d94a000}, {0x3d94c000}, {0x3d94e000}, {0x3d950000}, {0x3d952000}, {0x3d954000}, {0x3d956000}, {0x3d958000}, {0x3d95a000}, {0x3d95c000}, {0x3d95e000}, {0x3d960000}, {0x3d962000}, {0x3d964000}, {0x3d966000}, {0x3d968000}, {0x3d96a000}, {0x3d96c000}, {0x3d96e000}, {0x3d970000}, {0x3d972000}, {0x3d974000}, {0x3d976000}, {0x3d978000}, {0x3d97a000}, {0x3d97c000}, {0x3d97e000}, {0x3d980000}, {0x3d982000}, {0x3d984000}, {0x3d986000}, {0x3d988000}, {0x3d98a000}, {0x3d98c000}, {0x3d98e000}, {0x3d990000}, {0x3d992000}, {0x3d994000}, {0x3d996000}, {0x3d998000}, {0x3d99a000}, {0x3d99c000}, {0x3d99e000}, {0x3d9a0000}, {0x3d9a2000}, {0x3d9a4000}, {0x3d9a6000}, {0x3d9a8000}, {0x3d9aa000}, {0x3d9ac000}, {0x3d9ae000}, {0x3d9b0000}, {0x3d9b2000}, {0x3d9b4000}, {0x3d9b6000}, {0x3d9b8000}, {0x3d9ba000}, {0x3d9bc000}, {0x3d9be000}, {0x3d9c0000}, {0x3d9c2000}, {0x3d9c4000}, {0x3d9c6000}, {0x3d9c8000}, {0x3d9ca000}, {0x3d9cc000}, {0x3d9ce000}, {0x3d9d0000}, {0x3d9d2000}, {0x3d9d4000}, {0x3d9d6000}, {0x3d9d8000}, {0x3d9da000}, {0x3d9dc000}, {0x3d9de000}, {0x3d9e0000}, {0x3d9e2000}, {0x3d9e4000}, {0x3d9e6000}, {0x3d9e8000}, {0x3d9ea000}, {0x3d9ec000}, {0x3d9ee000}, {0x3d9f0000}, {0x3d9f2000}, {0x3d9f4000}, {0x3d9f6000}, {0x3d9f8000}, {0x3d9fa000}, {0x3d9fc000}, {0x3d9fe000}, {0x3da00000}, {0x3da02000}, {0x3da04000}, {0x3da06000}, {0x3da08000}, {0x3da0a000}, {0x3da0c000}, {0x3da0e000}, {0x3da10000}, {0x3da12000}, {0x3da14000}, {0x3da16000}, {0x3da18000}, {0x3da1a000}, {0x3da1c000}, {0x3da1e000}, {0x3da20000}, {0x3da22000}, {0x3da24000}, {0x3da26000}, {0x3da28000}, {0x3da2a000}, {0x3da2c000}, {0x3da2e000}, {0x3da30000}, {0x3da32000}, {0x3da34000}, {0x3da36000}, {0x3da38000}, {0x3da3a000}, {0x3da3c000}, {0x3da3e000}, {0x3da40000}, {0x3da42000}, {0x3da44000}, {0x3da46000}, {0x3da48000}, {0x3da4a000}, {0x3da4c000}, {0x3da4e000}, {0x3da50000}, {0x3da52000}, {0x3da54000}, {0x3da56000}, {0x3da58000}, {0x3da5a000}, {0x3da5c000}, {0x3da5e000}, {0x3da60000}, {0x3da62000}, {0x3da64000}, {0x3da66000}, {0x3da68000}, {0x3da6a000}, {0x3da6c000}, {0x3da6e000}, {0x3da70000}, {0x3da72000}, {0x3da74000}, {0x3da76000}, {0x3da78000}, {0x3da7a000}, {0x3da7c000}, {0x3da7e000}, {0x3da80000}, {0x3da82000}, {0x3da84000}, {0x3da86000}, {0x3da88000}, {0x3da8a000}, {0x3da8c000}, {0x3da8e000}, {0x3da90000}, {0x3da92000}, {0x3da94000}, {0x3da96000}, {0x3da98000}, {0x3da9a000}, {0x3da9c000}, {0x3da9e000}, {0x3daa0000}, {0x3daa2000}, {0x3daa4000}, {0x3daa6000}, {0x3daa8000}, {0x3daaa000}, {0x3daac000}, {0x3daae000}, {0x3dab0000}, {0x3dab2000}, {0x3dab4000}, {0x3dab6000}, {0x3dab8000}, {0x3daba000}, {0x3dabc000}, {0x3dabe000}, {0x3dac0000}, {0x3dac2000}, {0x3dac4000}, {0x3dac6000}, {0x3dac8000}, {0x3daca000}, {0x3dacc000}, {0x3dace000}, {0x3dad0000}, {0x3dad2000}, {0x3dad4000}, {0x3dad6000}, {0x3dad8000}, {0x3dada000}, {0x3dadc000}, {0x3dade000}, {0x3dae0000}, {0x3dae2000}, {0x3dae4000}, {0x3dae6000}, {0x3dae8000}, {0x3daea000}, {0x3daec000}, {0x3daee000}, {0x3daf0000}, {0x3daf2000}, {0x3daf4000}, {0x3daf6000}, {0x3daf8000}, {0x3dafa000}, {0x3dafc000}, {0x3dafe000}, {0x3db00000}, {0x3db02000}, {0x3db04000}, {0x3db06000}, {0x3db08000}, {0x3db0a000}, {0x3db0c000}, {0x3db0e000}, {0x3db10000}, {0x3db12000}, {0x3db14000}, {0x3db16000}, {0x3db18000}, {0x3db1a000}, {0x3db1c000}, {0x3db1e000}, {0x3db20000}, {0x3db22000}, {0x3db24000}, {0x3db26000}, {0x3db28000}, {0x3db2a000}, {0x3db2c000}, {0x3db2e000}, {0x3db30000}, {0x3db32000}, {0x3db34000}, {0x3db36000}, {0x3db38000}, {0x3db3a000}, {0x3db3c000}, {0x3db3e000}, {0x3db40000}, {0x3db42000}, {0x3db44000}, {0x3db46000}, {0x3db48000}, {0x3db4a000}, {0x3db4c000}, {0x3db4e000}, {0x3db50000}, {0x3db52000}, {0x3db54000}, {0x3db56000}, {0x3db58000}, {0x3db5a000}, {0x3db5c000}, {0x3db5e000}, {0x3db60000}, {0x3db62000}, {0x3db64000}, {0x3db66000}, {0x3db68000}, {0x3db6a000}, {0x3db6c000}, {0x3db6e000}, {0x3db70000}, {0x3db72000}, {0x3db74000}, {0x3db76000}, {0x3db78000}, {0x3db7a000}, {0x3db7c000}, {0x3db7e000}, {0x3db80000}, {0x3db82000}, {0x3db84000}, {0x3db86000}, {0x3db88000}, {0x3db8a000}, {0x3db8c000}, {0x3db8e000}, {0x3db90000}, {0x3db92000}, {0x3db94000}, {0x3db96000}, {0x3db98000}, {0x3db9a000}, {0x3db9c000}, {0x3db9e000}, {0x3dba0000}, {0x3dba2000}, {0x3dba4000}, {0x3dba6000}, {0x3dba8000}, {0x3dbaa000}, {0x3dbac000}, {0x3dbae000}, {0x3dbb0000}, {0x3dbb2000}, {0x3dbb4000}, {0x3dbb6000}, {0x3dbb8000}, {0x3dbba000}, {0x3dbbc000}, {0x3dbbe000}, {0x3dbc0000}, {0x3dbc2000}, {0x3dbc4000}, {0x3dbc6000}, {0x3dbc8000}, {0x3dbca000}, {0x3dbcc000}, {0x3dbce000}, {0x3dbd0000}, {0x3dbd2000}, {0x3dbd4000}, {0x3dbd6000}, {0x3dbd8000}, {0x3dbda000}, {0x3dbdc000}, {0x3dbde000}, {0x3dbe0000}, {0x3dbe2000}, {0x3dbe4000}, {0x3dbe6000}, {0x3dbe8000}, {0x3dbea000}, {0x3dbec000}, {0x3dbee000}, {0x3dbf0000}, {0x3dbf2000}, {0x3dbf4000}, {0x3dbf6000}, {0x3dbf8000}, {0x3dbfa000}, {0x3dbfc000}, {0x3dbfe000}, {0x3dc00000}, {0x3dc02000}, {0x3dc04000}, {0x3dc06000}, {0x3dc08000}, {0x3dc0a000}, {0x3dc0c000}, {0x3dc0e000}, {0x3dc10000}, {0x3dc12000}, {0x3dc14000}, {0x3dc16000}, {0x3dc18000}, {0x3dc1a000}, {0x3dc1c000}, {0x3dc1e000}, {0x3dc20000}, {0x3dc22000}, {0x3dc24000}, {0x3dc26000}, {0x3dc28000}, {0x3dc2a000}, {0x3dc2c000}, {0x3dc2e000}, {0x3dc30000}, {0x3dc32000}, {0x3dc34000}, {0x3dc36000}, {0x3dc38000}, {0x3dc3a000}, {0x3dc3c000}, {0x3dc3e000}, {0x3dc40000}, {0x3dc42000}, {0x3dc44000}, {0x3dc46000}, {0x3dc48000}, {0x3dc4a000}, {0x3dc4c000}, {0x3dc4e000}, {0x3dc50000}, {0x3dc52000}, {0x3dc54000}, {0x3dc56000}, {0x3dc58000}, {0x3dc5a000}, {0x3dc5c000}, {0x3dc5e000}, {0x3dc60000}, {0x3dc62000}, {0x3dc64000}, {0x3dc66000}, {0x3dc68000}, {0x3dc6a000}, {0x3dc6c000}, {0x3dc6e000}, {0x3dc70000}, {0x3dc72000}, {0x3dc74000}, {0x3dc76000}, {0x3dc78000}, {0x3dc7a000}, {0x3dc7c000}, {0x3dc7e000}, {0x3dc80000}, {0x3dc82000}, {0x3dc84000}, {0x3dc86000}, {0x3dc88000}, {0x3dc8a000}, {0x3dc8c000}, {0x3dc8e000}, {0x3dc90000}, {0x3dc92000}, {0x3dc94000}, {0x3dc96000}, {0x3dc98000}, {0x3dc9a000}, {0x3dc9c000}, {0x3dc9e000}, {0x3dca0000}, {0x3dca2000}, {0x3dca4000}, {0x3dca6000}, {0x3dca8000}, {0x3dcaa000}, {0x3dcac000}, {0x3dcae000}, {0x3dcb0000}, {0x3dcb2000}, {0x3dcb4000}, {0x3dcb6000}, {0x3dcb8000}, {0x3dcba000}, {0x3dcbc000}, {0x3dcbe000}, {0x3dcc0000}, {0x3dcc2000}, {0x3dcc4000}, {0x3dcc6000}, {0x3dcc8000}, {0x3dcca000}, {0x3dccc000}, {0x3dcce000}, {0x3dcd0000}, {0x3dcd2000}, {0x3dcd4000}, {0x3dcd6000}, {0x3dcd8000}, {0x3dcda000}, {0x3dcdc000}, {0x3dcde000}, {0x3dce0000}, {0x3dce2000}, {0x3dce4000}, {0x3dce6000}, {0x3dce8000}, {0x3dcea000}, {0x3dcec000}, {0x3dcee000}, {0x3dcf0000}, {0x3dcf2000}, {0x3dcf4000}, {0x3dcf6000}, {0x3dcf8000}, {0x3dcfa000}, {0x3dcfc000}, {0x3dcfe000}, {0x3dd00000}, {0x3dd02000}, {0x3dd04000}, {0x3dd06000}, {0x3dd08000}, {0x3dd0a000}, {0x3dd0c000}, {0x3dd0e000}, {0x3dd10000}, {0x3dd12000}, {0x3dd14000}, {0x3dd16000}, {0x3dd18000}, {0x3dd1a000}, {0x3dd1c000}, {0x3dd1e000}, {0x3dd20000}, {0x3dd22000}, {0x3dd24000}, {0x3dd26000}, {0x3dd28000}, {0x3dd2a000}, {0x3dd2c000}, {0x3dd2e000}, {0x3dd30000}, {0x3dd32000}, {0x3dd34000}, {0x3dd36000}, {0x3dd38000}, {0x3dd3a000}, {0x3dd3c000}, {0x3dd3e000}, {0x3dd40000}, {0x3dd42000}, {0x3dd44000}, {0x3dd46000}, {0x3dd48000}, {0x3dd4a000}, {0x3dd4c000}, {0x3dd4e000}, {0x3dd50000}, {0x3dd52000}, {0x3dd54000}, {0x3dd56000}, {0x3dd58000}, {0x3dd5a000}, {0x3dd5c000}, {0x3dd5e000}, {0x3dd60000}, {0x3dd62000}, {0x3dd64000}, {0x3dd66000}, {0x3dd68000}, {0x3dd6a000}, {0x3dd6c000}, {0x3dd6e000}, {0x3dd70000}, {0x3dd72000}, {0x3dd74000}, {0x3dd76000}, {0x3dd78000}, {0x3dd7a000}, {0x3dd7c000}, {0x3dd7e000}, {0x3dd80000}, {0x3dd82000}, {0x3dd84000}, {0x3dd86000}, {0x3dd88000}, {0x3dd8a000}, {0x3dd8c000}, {0x3dd8e000}, {0x3dd90000}, {0x3dd92000}, {0x3dd94000}, {0x3dd96000}, {0x3dd98000}, {0x3dd9a000}, {0x3dd9c000}, {0x3dd9e000}, {0x3dda0000}, {0x3dda2000}, {0x3dda4000}, {0x3dda6000}, {0x3dda8000}, {0x3ddaa000}, {0x3ddac000}, {0x3ddae000}, {0x3ddb0000}, {0x3ddb2000}, {0x3ddb4000}, {0x3ddb6000}, {0x3ddb8000}, {0x3ddba000}, {0x3ddbc000}, {0x3ddbe000}, {0x3ddc0000}, {0x3ddc2000}, {0x3ddc4000}, {0x3ddc6000}, {0x3ddc8000}, {0x3ddca000}, {0x3ddcc000}, {0x3ddce000}, {0x3ddd0000}, {0x3ddd2000}, {0x3ddd4000}, {0x3ddd6000}, {0x3ddd8000}, {0x3ddda000}, {0x3dddc000}, {0x3ddde000}, {0x3dde0000}, {0x3dde2000}, {0x3dde4000}, {0x3dde6000}, {0x3dde8000}, {0x3ddea000}, {0x3ddec000}, {0x3ddee000}, {0x3ddf0000}, {0x3ddf2000}, {0x3ddf4000}, {0x3ddf6000}, {0x3ddf8000}, {0x3ddfa000}, {0x3ddfc000}, {0x3ddfe000}, {0x3de00000}, {0x3de02000}, {0x3de04000}, {0x3de06000}, {0x3de08000}, {0x3de0a000}, {0x3de0c000}, {0x3de0e000}, {0x3de10000}, {0x3de12000}, {0x3de14000}, {0x3de16000}, {0x3de18000}, {0x3de1a000}, {0x3de1c000}, {0x3de1e000}, {0x3de20000}, {0x3de22000}, {0x3de24000}, {0x3de26000}, {0x3de28000}, {0x3de2a000}, {0x3de2c000}, {0x3de2e000}, {0x3de30000}, {0x3de32000}, {0x3de34000}, {0x3de36000}, {0x3de38000}, {0x3de3a000}, {0x3de3c000}, {0x3de3e000}, {0x3de40000}, {0x3de42000}, {0x3de44000}, {0x3de46000}, {0x3de48000}, {0x3de4a000}, {0x3de4c000}, {0x3de4e000}, {0x3de50000}, {0x3de52000}, {0x3de54000}, {0x3de56000}, {0x3de58000}, {0x3de5a000}, {0x3de5c000}, {0x3de5e000}, {0x3de60000}, {0x3de62000}, {0x3de64000}, {0x3de66000}, {0x3de68000}, {0x3de6a000}, {0x3de6c000}, {0x3de6e000}, {0x3de70000}, {0x3de72000}, {0x3de74000}, {0x3de76000}, {0x3de78000}, {0x3de7a000}, {0x3de7c000}, {0x3de7e000}, {0x3de80000}, {0x3de82000}, {0x3de84000}, {0x3de86000}, {0x3de88000}, {0x3de8a000}, {0x3de8c000}, {0x3de8e000}, {0x3de90000}, {0x3de92000}, {0x3de94000}, {0x3de96000}, {0x3de98000}, {0x3de9a000}, {0x3de9c000}, {0x3de9e000}, {0x3dea0000}, {0x3dea2000}, {0x3dea4000}, {0x3dea6000}, {0x3dea8000}, {0x3deaa000}, {0x3deac000}, {0x3deae000}, {0x3deb0000}, {0x3deb2000}, {0x3deb4000}, {0x3deb6000}, {0x3deb8000}, {0x3deba000}, {0x3debc000}, {0x3debe000}, {0x3dec0000}, {0x3dec2000}, {0x3dec4000}, {0x3dec6000}, {0x3dec8000}, {0x3deca000}, {0x3decc000}, {0x3dece000}, {0x3ded0000}, {0x3ded2000}, {0x3ded4000}, {0x3ded6000}, {0x3ded8000}, {0x3deda000}, {0x3dedc000}, {0x3dede000}, {0x3dee0000}, {0x3dee2000}, {0x3dee4000}, {0x3dee6000}, {0x3dee8000}, {0x3deea000}, {0x3deec000}, {0x3deee000}, {0x3def0000}, {0x3def2000}, {0x3def4000}, {0x3def6000}, {0x3def8000}, {0x3defa000}, {0x3defc000}, {0x3defe000}, {0x3df00000}, {0x3df02000}, {0x3df04000}, {0x3df06000}, {0x3df08000}, {0x3df0a000}, {0x3df0c000}, {0x3df0e000}, {0x3df10000}, {0x3df12000}, {0x3df14000}, {0x3df16000}, {0x3df18000}, {0x3df1a000}, {0x3df1c000}, {0x3df1e000}, {0x3df20000}, {0x3df22000}, {0x3df24000}, {0x3df26000}, {0x3df28000}, {0x3df2a000}, {0x3df2c000}, {0x3df2e000}, {0x3df30000}, {0x3df32000}, {0x3df34000}, {0x3df36000}, {0x3df38000}, {0x3df3a000}, {0x3df3c000}, {0x3df3e000}, {0x3df40000}, {0x3df42000}, {0x3df44000}, {0x3df46000}, {0x3df48000}, {0x3df4a000}, {0x3df4c000}, {0x3df4e000}, {0x3df50000}, {0x3df52000}, {0x3df54000}, {0x3df56000}, {0x3df58000}, {0x3df5a000}, {0x3df5c000}, {0x3df5e000}, {0x3df60000}, {0x3df62000}, {0x3df64000}, {0x3df66000}, {0x3df68000}, {0x3df6a000}, {0x3df6c000}, {0x3df6e000}, {0x3df70000}, {0x3df72000}, {0x3df74000}, {0x3df76000}, {0x3df78000}, {0x3df7a000}, {0x3df7c000}, {0x3df7e000}, {0x3df80000}, {0x3df82000}, {0x3df84000}, {0x3df86000}, {0x3df88000}, {0x3df8a000}, {0x3df8c000}, {0x3df8e000}, {0x3df90000}, {0x3df92000}, {0x3df94000}, {0x3df96000}, {0x3df98000}, {0x3df9a000}, {0x3df9c000}, {0x3df9e000}, {0x3dfa0000}, {0x3dfa2000}, {0x3dfa4000}, {0x3dfa6000}, {0x3dfa8000}, {0x3dfaa000}, {0x3dfac000}, {0x3dfae000}, {0x3dfb0000}, {0x3dfb2000}, {0x3dfb4000}, {0x3dfb6000}, {0x3dfb8000}, {0x3dfba000}, {0x3dfbc000}, {0x3dfbe000}, {0x3dfc0000}, {0x3dfc2000}, {0x3dfc4000}, {0x3dfc6000}, {0x3dfc8000}, {0x3dfca000}, {0x3dfcc000}, {0x3dfce000}, {0x3dfd0000}, {0x3dfd2000}, {0x3dfd4000}, {0x3dfd6000}, {0x3dfd8000}, {0x3dfda000}, {0x3dfdc000}, {0x3dfde000}, {0x3dfe0000}, {0x3dfe2000}, {0x3dfe4000}, {0x3dfe6000}, {0x3dfe8000}, {0x3dfea000}, {0x3dfec000}, {0x3dfee000}, {0x3dff0000}, {0x3dff2000}, {0x3dff4000}, {0x3dff6000}, {0x3dff8000}, {0x3dffa000}, {0x3dffc000}, {0x3dffe000}, {0x3e000000}, {0x3e002000}, {0x3e004000}, {0x3e006000}, {0x3e008000}, {0x3e00a000}, {0x3e00c000}, {0x3e00e000}, {0x3e010000}, {0x3e012000}, {0x3e014000}, {0x3e016000}, {0x3e018000}, {0x3e01a000}, {0x3e01c000}, {0x3e01e000}, {0x3e020000}, {0x3e022000}, {0x3e024000}, {0x3e026000}, {0x3e028000}, {0x3e02a000}, {0x3e02c000}, {0x3e02e000}, {0x3e030000}, {0x3e032000}, {0x3e034000}, {0x3e036000}, {0x3e038000}, {0x3e03a000}, {0x3e03c000}, {0x3e03e000}, {0x3e040000}, {0x3e042000}, {0x3e044000}, {0x3e046000}, {0x3e048000}, {0x3e04a000}, {0x3e04c000}, {0x3e04e000}, {0x3e050000}, {0x3e052000}, {0x3e054000}, {0x3e056000}, {0x3e058000}, {0x3e05a000}, {0x3e05c000}, {0x3e05e000}, {0x3e060000}, {0x3e062000}, {0x3e064000}, {0x3e066000}, {0x3e068000}, {0x3e06a000}, {0x3e06c000}, {0x3e06e000}, {0x3e070000}, {0x3e072000}, {0x3e074000}, {0x3e076000}, {0x3e078000}, {0x3e07a000}, {0x3e07c000}, {0x3e07e000}, {0x3e080000}, {0x3e082000}, {0x3e084000}, {0x3e086000}, {0x3e088000}, {0x3e08a000}, {0x3e08c000}, {0x3e08e000}, {0x3e090000}, {0x3e092000}, {0x3e094000}, {0x3e096000}, {0x3e098000}, {0x3e09a000}, {0x3e09c000}, {0x3e09e000}, {0x3e0a0000}, {0x3e0a2000}, {0x3e0a4000}, {0x3e0a6000}, {0x3e0a8000}, {0x3e0aa000}, {0x3e0ac000}, {0x3e0ae000}, {0x3e0b0000}, {0x3e0b2000}, {0x3e0b4000}, {0x3e0b6000}, {0x3e0b8000}, {0x3e0ba000}, {0x3e0bc000}, {0x3e0be000}, {0x3e0c0000}, {0x3e0c2000}, {0x3e0c4000}, {0x3e0c6000}, {0x3e0c8000}, {0x3e0ca000}, {0x3e0cc000}, {0x3e0ce000}, {0x3e0d0000}, {0x3e0d2000}, {0x3e0d4000}, {0x3e0d6000}, {0x3e0d8000}, {0x3e0da000}, {0x3e0dc000}, {0x3e0de000}, {0x3e0e0000}, {0x3e0e2000}, {0x3e0e4000}, {0x3e0e6000}, {0x3e0e8000}, {0x3e0ea000}, {0x3e0ec000}, {0x3e0ee000}, {0x3e0f0000}, {0x3e0f2000}, {0x3e0f4000}, {0x3e0f6000}, {0x3e0f8000}, {0x3e0fa000}, {0x3e0fc000}, {0x3e0fe000}, {0x3e100000}, {0x3e102000}, {0x3e104000}, {0x3e106000}, {0x3e108000}, {0x3e10a000}, {0x3e10c000}, {0x3e10e000}, {0x3e110000}, {0x3e112000}, {0x3e114000}, {0x3e116000}, {0x3e118000}, {0x3e11a000}, {0x3e11c000}, {0x3e11e000}, {0x3e120000}, {0x3e122000}, {0x3e124000}, {0x3e126000}, {0x3e128000}, {0x3e12a000}, {0x3e12c000}, {0x3e12e000}, {0x3e130000}, {0x3e132000}, {0x3e134000}, {0x3e136000}, {0x3e138000}, {0x3e13a000}, {0x3e13c000}, {0x3e13e000}, {0x3e140000}, {0x3e142000}, {0x3e144000}, {0x3e146000}, {0x3e148000}, {0x3e14a000}, {0x3e14c000}, {0x3e14e000}, {0x3e150000}, {0x3e152000}, {0x3e154000}, {0x3e156000}, {0x3e158000}, {0x3e15a000}, {0x3e15c000}, {0x3e15e000}, {0x3e160000}, {0x3e162000}, {0x3e164000}, {0x3e166000}, {0x3e168000}, {0x3e16a000}, {0x3e16c000}, {0x3e16e000}, {0x3e170000}, {0x3e172000}, {0x3e174000}, {0x3e176000}, {0x3e178000}, {0x3e17a000}, {0x3e17c000}, {0x3e17e000}, {0x3e180000}, {0x3e182000}, {0x3e184000}, {0x3e186000}, {0x3e188000}, {0x3e18a000}, {0x3e18c000}, {0x3e18e000}, {0x3e190000}, {0x3e192000}, {0x3e194000}, {0x3e196000}, {0x3e198000}, {0x3e19a000}, {0x3e19c000}, {0x3e19e000}, {0x3e1a0000}, {0x3e1a2000}, {0x3e1a4000}, {0x3e1a6000}, {0x3e1a8000}, {0x3e1aa000}, {0x3e1ac000}, {0x3e1ae000}, {0x3e1b0000}, {0x3e1b2000}, {0x3e1b4000}, {0x3e1b6000}, {0x3e1b8000}, {0x3e1ba000}, {0x3e1bc000}, {0x3e1be000}, {0x3e1c0000}, {0x3e1c2000}, {0x3e1c4000}, {0x3e1c6000}, {0x3e1c8000}, {0x3e1ca000}, {0x3e1cc000}, {0x3e1ce000}, {0x3e1d0000}, {0x3e1d2000}, {0x3e1d4000}, {0x3e1d6000}, {0x3e1d8000}, {0x3e1da000}, {0x3e1dc000}, {0x3e1de000}, {0x3e1e0000}, {0x3e1e2000}, {0x3e1e4000}, {0x3e1e6000}, {0x3e1e8000}, {0x3e1ea000}, {0x3e1ec000}, {0x3e1ee000}, {0x3e1f0000}, {0x3e1f2000}, {0x3e1f4000}, {0x3e1f6000}, {0x3e1f8000}, {0x3e1fa000}, {0x3e1fc000}, {0x3e1fe000}, {0x3e200000}, {0x3e202000}, {0x3e204000}, {0x3e206000}, {0x3e208000}, {0x3e20a000}, {0x3e20c000}, {0x3e20e000}, {0x3e210000}, {0x3e212000}, {0x3e214000}, {0x3e216000}, {0x3e218000}, {0x3e21a000}, {0x3e21c000}, {0x3e21e000}, {0x3e220000}, {0x3e222000}, {0x3e224000}, {0x3e226000}, {0x3e228000}, {0x3e22a000}, {0x3e22c000}, {0x3e22e000}, {0x3e230000}, {0x3e232000}, {0x3e234000}, {0x3e236000}, {0x3e238000}, {0x3e23a000}, {0x3e23c000}, {0x3e23e000}, {0x3e240000}, {0x3e242000}, {0x3e244000}, {0x3e246000}, {0x3e248000}, {0x3e24a000}, {0x3e24c000}, {0x3e24e000}, {0x3e250000}, {0x3e252000}, {0x3e254000}, {0x3e256000}, {0x3e258000}, {0x3e25a000}, {0x3e25c000}, {0x3e25e000}, {0x3e260000}, {0x3e262000}, {0x3e264000}, {0x3e266000}, {0x3e268000}, {0x3e26a000}, {0x3e26c000}, {0x3e26e000}, {0x3e270000}, {0x3e272000}, {0x3e274000}, {0x3e276000}, {0x3e278000}, {0x3e27a000}, {0x3e27c000}, {0x3e27e000}, {0x3e280000}, {0x3e282000}, {0x3e284000}, {0x3e286000}, {0x3e288000}, {0x3e28a000}, {0x3e28c000}, {0x3e28e000}, {0x3e290000}, {0x3e292000}, {0x3e294000}, {0x3e296000}, {0x3e298000}, {0x3e29a000}, {0x3e29c000}, {0x3e29e000}, {0x3e2a0000}, {0x3e2a2000}, {0x3e2a4000}, {0x3e2a6000}, {0x3e2a8000}, {0x3e2aa000}, {0x3e2ac000}, {0x3e2ae000}, {0x3e2b0000}, {0x3e2b2000}, {0x3e2b4000}, {0x3e2b6000}, {0x3e2b8000}, {0x3e2ba000}, {0x3e2bc000}, {0x3e2be000}, {0x3e2c0000}, {0x3e2c2000}, {0x3e2c4000}, {0x3e2c6000}, {0x3e2c8000}, {0x3e2ca000}, {0x3e2cc000}, {0x3e2ce000}, {0x3e2d0000}, {0x3e2d2000}, {0x3e2d4000}, {0x3e2d6000}, {0x3e2d8000}, {0x3e2da000}, {0x3e2dc000}, {0x3e2de000}, {0x3e2e0000}, {0x3e2e2000}, {0x3e2e4000}, {0x3e2e6000}, {0x3e2e8000}, {0x3e2ea000}, {0x3e2ec000}, {0x3e2ee000}, {0x3e2f0000}, {0x3e2f2000}, {0x3e2f4000}, {0x3e2f6000}, {0x3e2f8000}, {0x3e2fa000}, {0x3e2fc000}, {0x3e2fe000}, {0x3e300000}, {0x3e302000}, {0x3e304000}, {0x3e306000}, {0x3e308000}, {0x3e30a000}, {0x3e30c000}, {0x3e30e000}, {0x3e310000}, {0x3e312000}, {0x3e314000}, {0x3e316000}, {0x3e318000}, {0x3e31a000}, {0x3e31c000}, {0x3e31e000}, {0x3e320000}, {0x3e322000}, {0x3e324000}, {0x3e326000}, {0x3e328000}, {0x3e32a000}, {0x3e32c000}, {0x3e32e000}, {0x3e330000}, {0x3e332000}, {0x3e334000}, {0x3e336000}, {0x3e338000}, {0x3e33a000}, {0x3e33c000}, {0x3e33e000}, {0x3e340000}, {0x3e342000}, {0x3e344000}, {0x3e346000}, {0x3e348000}, {0x3e34a000}, {0x3e34c000}, {0x3e34e000}, {0x3e350000}, {0x3e352000}, {0x3e354000}, {0x3e356000}, {0x3e358000}, {0x3e35a000}, {0x3e35c000}, {0x3e35e000}, {0x3e360000}, {0x3e362000}, {0x3e364000}, {0x3e366000}, {0x3e368000}, {0x3e36a000}, {0x3e36c000}, {0x3e36e000}, {0x3e370000}, {0x3e372000}, {0x3e374000}, {0x3e376000}, {0x3e378000}, {0x3e37a000}, {0x3e37c000}, {0x3e37e000}, {0x3e380000}, {0x3e382000}, {0x3e384000}, {0x3e386000}, {0x3e388000}, {0x3e38a000}, {0x3e38c000}, {0x3e38e000}, {0x3e390000}, {0x3e392000}, {0x3e394000}, {0x3e396000}, {0x3e398000}, {0x3e39a000}, {0x3e39c000}, {0x3e39e000}, {0x3e3a0000}, {0x3e3a2000}, {0x3e3a4000}, {0x3e3a6000}, {0x3e3a8000}, {0x3e3aa000}, {0x3e3ac000}, {0x3e3ae000}, {0x3e3b0000}, {0x3e3b2000}, {0x3e3b4000}, {0x3e3b6000}, {0x3e3b8000}, {0x3e3ba000}, {0x3e3bc000}, {0x3e3be000}, {0x3e3c0000}, {0x3e3c2000}, {0x3e3c4000}, {0x3e3c6000}, {0x3e3c8000}, {0x3e3ca000}, {0x3e3cc000}, {0x3e3ce000}, {0x3e3d0000}, {0x3e3d2000}, {0x3e3d4000}, {0x3e3d6000}, {0x3e3d8000}, {0x3e3da000}, {0x3e3dc000}, {0x3e3de000}, {0x3e3e0000}, {0x3e3e2000}, {0x3e3e4000}, {0x3e3e6000}, {0x3e3e8000}, {0x3e3ea000}, {0x3e3ec000}, {0x3e3ee000}, {0x3e3f0000}, {0x3e3f2000}, {0x3e3f4000}, {0x3e3f6000}, {0x3e3f8000}, {0x3e3fa000}, {0x3e3fc000}, {0x3e3fe000}, {0x3e400000}, {0x3e402000}, {0x3e404000}, {0x3e406000}, {0x3e408000}, {0x3e40a000}, {0x3e40c000}, {0x3e40e000}, {0x3e410000}, {0x3e412000}, {0x3e414000}, {0x3e416000}, {0x3e418000}, {0x3e41a000}, {0x3e41c000}, {0x3e41e000}, {0x3e420000}, {0x3e422000}, {0x3e424000}, {0x3e426000}, {0x3e428000}, {0x3e42a000}, {0x3e42c000}, {0x3e42e000}, {0x3e430000}, {0x3e432000}, {0x3e434000}, {0x3e436000}, {0x3e438000}, {0x3e43a000}, {0x3e43c000}, {0x3e43e000}, {0x3e440000}, {0x3e442000}, {0x3e444000}, {0x3e446000}, {0x3e448000}, {0x3e44a000}, {0x3e44c000}, {0x3e44e000}, {0x3e450000}, {0x3e452000}, {0x3e454000}, {0x3e456000}, {0x3e458000}, {0x3e45a000}, {0x3e45c000}, {0x3e45e000}, {0x3e460000}, {0x3e462000}, {0x3e464000}, {0x3e466000}, {0x3e468000}, {0x3e46a000}, {0x3e46c000}, {0x3e46e000}, {0x3e470000}, {0x3e472000}, {0x3e474000}, {0x3e476000}, {0x3e478000}, {0x3e47a000}, {0x3e47c000}, {0x3e47e000}, {0x3e480000}, {0x3e482000}, {0x3e484000}, {0x3e486000}, {0x3e488000}, {0x3e48a000}, {0x3e48c000}, {0x3e48e000}, {0x3e490000}, {0x3e492000}, {0x3e494000}, {0x3e496000}, {0x3e498000}, {0x3e49a000}, {0x3e49c000}, {0x3e49e000}, {0x3e4a0000}, {0x3e4a2000}, {0x3e4a4000}, {0x3e4a6000}, {0x3e4a8000}, {0x3e4aa000}, {0x3e4ac000}, {0x3e4ae000}, {0x3e4b0000}, {0x3e4b2000}, {0x3e4b4000}, {0x3e4b6000}, {0x3e4b8000}, {0x3e4ba000}, {0x3e4bc000}, {0x3e4be000}, {0x3e4c0000}, {0x3e4c2000}, {0x3e4c4000}, {0x3e4c6000}, {0x3e4c8000}, {0x3e4ca000}, {0x3e4cc000}, {0x3e4ce000}, {0x3e4d0000}, {0x3e4d2000}, {0x3e4d4000}, {0x3e4d6000}, {0x3e4d8000}, {0x3e4da000}, {0x3e4dc000}, {0x3e4de000}, {0x3e4e0000}, {0x3e4e2000}, {0x3e4e4000}, {0x3e4e6000}, {0x3e4e8000}, {0x3e4ea000}, {0x3e4ec000}, {0x3e4ee000}, {0x3e4f0000}, {0x3e4f2000}, {0x3e4f4000}, {0x3e4f6000}, {0x3e4f8000}, {0x3e4fa000}, {0x3e4fc000}, {0x3e4fe000}, {0x3e500000}, {0x3e502000}, {0x3e504000}, {0x3e506000}, {0x3e508000}, {0x3e50a000}, {0x3e50c000}, {0x3e50e000}, {0x3e510000}, {0x3e512000}, {0x3e514000}, {0x3e516000}, {0x3e518000}, {0x3e51a000}, {0x3e51c000}, {0x3e51e000}, {0x3e520000}, {0x3e522000}, {0x3e524000}, {0x3e526000}, {0x3e528000}, {0x3e52a000}, {0x3e52c000}, {0x3e52e000}, {0x3e530000}, {0x3e532000}, {0x3e534000}, {0x3e536000}, {0x3e538000}, {0x3e53a000}, {0x3e53c000}, {0x3e53e000}, {0x3e540000}, {0x3e542000}, {0x3e544000}, {0x3e546000}, {0x3e548000}, {0x3e54a000}, {0x3e54c000}, {0x3e54e000}, {0x3e550000}, {0x3e552000}, {0x3e554000}, {0x3e556000}, {0x3e558000}, {0x3e55a000}, {0x3e55c000}, {0x3e55e000}, {0x3e560000}, {0x3e562000}, {0x3e564000}, {0x3e566000}, {0x3e568000}, {0x3e56a000}, {0x3e56c000}, {0x3e56e000}, {0x3e570000}, {0x3e572000}, {0x3e574000}, {0x3e576000}, {0x3e578000}, {0x3e57a000}, {0x3e57c000}, {0x3e57e000}, {0x3e580000}, {0x3e582000}, {0x3e584000}, {0x3e586000}, {0x3e588000}, {0x3e58a000}, {0x3e58c000}, {0x3e58e000}, {0x3e590000}, {0x3e592000}, {0x3e594000}, {0x3e596000}, {0x3e598000}, {0x3e59a000}, {0x3e59c000}, {0x3e59e000}, {0x3e5a0000}, {0x3e5a2000}, {0x3e5a4000}, {0x3e5a6000}, {0x3e5a8000}, {0x3e5aa000}, {0x3e5ac000}, {0x3e5ae000}, {0x3e5b0000}, {0x3e5b2000}, {0x3e5b4000}, {0x3e5b6000}, {0x3e5b8000}, {0x3e5ba000}, {0x3e5bc000}, {0x3e5be000}, {0x3e5c0000}, {0x3e5c2000}, {0x3e5c4000}, {0x3e5c6000}, {0x3e5c8000}, {0x3e5ca000}, {0x3e5cc000}, {0x3e5ce000}, {0x3e5d0000}, {0x3e5d2000}, {0x3e5d4000}, {0x3e5d6000}, {0x3e5d8000}, {0x3e5da000}, {0x3e5dc000}, {0x3e5de000}, {0x3e5e0000}, {0x3e5e2000}, {0x3e5e4000}, {0x3e5e6000}, {0x3e5e8000}, {0x3e5ea000}, {0x3e5ec000}, {0x3e5ee000}, {0x3e5f0000}, {0x3e5f2000}, {0x3e5f4000}, {0x3e5f6000}, {0x3e5f8000}, {0x3e5fa000}, {0x3e5fc000}, {0x3e5fe000}, {0x3e600000}, {0x3e602000}, {0x3e604000}, {0x3e606000}, {0x3e608000}, {0x3e60a000}, {0x3e60c000}, {0x3e60e000}, {0x3e610000}, {0x3e612000}, {0x3e614000}, {0x3e616000}, {0x3e618000}, {0x3e61a000}, {0x3e61c000}, {0x3e61e000}, {0x3e620000}, {0x3e622000}, {0x3e624000}, {0x3e626000}, {0x3e628000}, {0x3e62a000}, {0x3e62c000}, {0x3e62e000}, {0x3e630000}, {0x3e632000}, {0x3e634000}, {0x3e636000}, {0x3e638000}, {0x3e63a000}, {0x3e63c000}, {0x3e63e000}, {0x3e640000}, {0x3e642000}, {0x3e644000}, {0x3e646000}, {0x3e648000}, {0x3e64a000}, {0x3e64c000}, {0x3e64e000}, {0x3e650000}, {0x3e652000}, {0x3e654000}, {0x3e656000}, {0x3e658000}, {0x3e65a000}, {0x3e65c000}, {0x3e65e000}, {0x3e660000}, {0x3e662000}, {0x3e664000}, {0x3e666000}, {0x3e668000}, {0x3e66a000}, {0x3e66c000}, {0x3e66e000}, {0x3e670000}, {0x3e672000}, {0x3e674000}, {0x3e676000}, {0x3e678000}, {0x3e67a000}, {0x3e67c000}, {0x3e67e000}, {0x3e680000}, {0x3e682000}, {0x3e684000}, {0x3e686000}, {0x3e688000}, {0x3e68a000}, {0x3e68c000}, {0x3e68e000}, {0x3e690000}, {0x3e692000}, {0x3e694000}, {0x3e696000}, {0x3e698000}, {0x3e69a000}, {0x3e69c000}, {0x3e69e000}, {0x3e6a0000}, {0x3e6a2000}, {0x3e6a4000}, {0x3e6a6000}, {0x3e6a8000}, {0x3e6aa000}, {0x3e6ac000}, {0x3e6ae000}, {0x3e6b0000}, {0x3e6b2000}, {0x3e6b4000}, {0x3e6b6000}, {0x3e6b8000}, {0x3e6ba000}, {0x3e6bc000}, {0x3e6be000}, {0x3e6c0000}, {0x3e6c2000}, {0x3e6c4000}, {0x3e6c6000}, {0x3e6c8000}, {0x3e6ca000}, {0x3e6cc000}, {0x3e6ce000}, {0x3e6d0000}, {0x3e6d2000}, {0x3e6d4000}, {0x3e6d6000}, {0x3e6d8000}, {0x3e6da000}, {0x3e6dc000}, {0x3e6de000}, {0x3e6e0000}, {0x3e6e2000}, {0x3e6e4000}, {0x3e6e6000}, {0x3e6e8000}, {0x3e6ea000}, {0x3e6ec000}, {0x3e6ee000}, {0x3e6f0000}, {0x3e6f2000}, {0x3e6f4000}, {0x3e6f6000}, {0x3e6f8000}, {0x3e6fa000}, {0x3e6fc000}, {0x3e6fe000}, {0x3e700000}, {0x3e702000}, {0x3e704000}, {0x3e706000}, {0x3e708000}, {0x3e70a000}, {0x3e70c000}, {0x3e70e000}, {0x3e710000}, {0x3e712000}, {0x3e714000}, {0x3e716000}, {0x3e718000}, {0x3e71a000}, {0x3e71c000}, {0x3e71e000}, {0x3e720000}, {0x3e722000}, {0x3e724000}, {0x3e726000}, {0x3e728000}, {0x3e72a000}, {0x3e72c000}, {0x3e72e000}, {0x3e730000}, {0x3e732000}, {0x3e734000}, {0x3e736000}, {0x3e738000}, {0x3e73a000}, {0x3e73c000}, {0x3e73e000}, {0x3e740000}, {0x3e742000}, {0x3e744000}, {0x3e746000}, {0x3e748000}, {0x3e74a000}, {0x3e74c000}, {0x3e74e000}, {0x3e750000}, {0x3e752000}, {0x3e754000}, {0x3e756000}, {0x3e758000}, {0x3e75a000}, {0x3e75c000}, {0x3e75e000}, {0x3e760000}, {0x3e762000}, {0x3e764000}, {0x3e766000}, {0x3e768000}, {0x3e76a000}, {0x3e76c000}, {0x3e76e000}, {0x3e770000}, {0x3e772000}, {0x3e774000}, {0x3e776000}, {0x3e778000}, {0x3e77a000}, {0x3e77c000}, {0x3e77e000}, {0x3e780000}, {0x3e782000}, {0x3e784000}, {0x3e786000}, {0x3e788000}, {0x3e78a000}, {0x3e78c000}, {0x3e78e000}, {0x3e790000}, {0x3e792000}, {0x3e794000}, {0x3e796000}, {0x3e798000}, {0x3e79a000}, {0x3e79c000}, {0x3e79e000}, {0x3e7a0000}, {0x3e7a2000}, {0x3e7a4000}, {0x3e7a6000}, {0x3e7a8000}, {0x3e7aa000}, {0x3e7ac000}, {0x3e7ae000}, {0x3e7b0000}, {0x3e7b2000}, {0x3e7b4000}, {0x3e7b6000}, {0x3e7b8000}, {0x3e7ba000}, {0x3e7bc000}, {0x3e7be000}, {0x3e7c0000}, {0x3e7c2000}, {0x3e7c4000}, {0x3e7c6000}, {0x3e7c8000}, {0x3e7ca000}, {0x3e7cc000}, {0x3e7ce000}, {0x3e7d0000}, {0x3e7d2000}, {0x3e7d4000}, {0x3e7d6000}, {0x3e7d8000}, {0x3e7da000}, {0x3e7dc000}, {0x3e7de000}, {0x3e7e0000}, {0x3e7e2000}, {0x3e7e4000}, {0x3e7e6000}, {0x3e7e8000}, {0x3e7ea000}, {0x3e7ec000}, {0x3e7ee000}, {0x3e7f0000}, {0x3e7f2000}, {0x3e7f4000}, {0x3e7f6000}, {0x3e7f8000}, {0x3e7fa000}, {0x3e7fc000}, {0x3e7fe000}, {0x3e800000}, {0x3e802000}, {0x3e804000}, {0x3e806000}, {0x3e808000}, {0x3e80a000}, {0x3e80c000}, {0x3e80e000}, {0x3e810000}, {0x3e812000}, {0x3e814000}, {0x3e816000}, {0x3e818000}, {0x3e81a000}, {0x3e81c000}, {0x3e81e000}, {0x3e820000}, {0x3e822000}, {0x3e824000}, {0x3e826000}, {0x3e828000}, {0x3e82a000}, {0x3e82c000}, {0x3e82e000}, {0x3e830000}, {0x3e832000}, {0x3e834000}, {0x3e836000}, {0x3e838000}, {0x3e83a000}, {0x3e83c000}, {0x3e83e000}, {0x3e840000}, {0x3e842000}, {0x3e844000}, {0x3e846000}, {0x3e848000}, {0x3e84a000}, {0x3e84c000}, {0x3e84e000}, {0x3e850000}, {0x3e852000}, {0x3e854000}, {0x3e856000}, {0x3e858000}, {0x3e85a000}, {0x3e85c000}, {0x3e85e000}, {0x3e860000}, {0x3e862000}, {0x3e864000}, {0x3e866000}, {0x3e868000}, {0x3e86a000}, {0x3e86c000}, {0x3e86e000}, {0x3e870000}, {0x3e872000}, {0x3e874000}, {0x3e876000}, {0x3e878000}, {0x3e87a000}, {0x3e87c000}, {0x3e87e000}, {0x3e880000}, {0x3e882000}, {0x3e884000}, {0x3e886000}, {0x3e888000}, {0x3e88a000}, {0x3e88c000}, {0x3e88e000}, {0x3e890000}, {0x3e892000}, {0x3e894000}, {0x3e896000}, {0x3e898000}, {0x3e89a000}, {0x3e89c000}, {0x3e89e000}, {0x3e8a0000}, {0x3e8a2000}, {0x3e8a4000}, {0x3e8a6000}, {0x3e8a8000}, {0x3e8aa000}, {0x3e8ac000}, {0x3e8ae000}, {0x3e8b0000}, {0x3e8b2000}, {0x3e8b4000}, {0x3e8b6000}, {0x3e8b8000}, {0x3e8ba000}, {0x3e8bc000}, {0x3e8be000}, {0x3e8c0000}, {0x3e8c2000}, {0x3e8c4000}, {0x3e8c6000}, {0x3e8c8000}, {0x3e8ca000}, {0x3e8cc000}, {0x3e8ce000}, {0x3e8d0000}, {0x3e8d2000}, {0x3e8d4000}, {0x3e8d6000}, {0x3e8d8000}, {0x3e8da000}, {0x3e8dc000}, {0x3e8de000}, {0x3e8e0000}, {0x3e8e2000}, {0x3e8e4000}, {0x3e8e6000}, {0x3e8e8000}, {0x3e8ea000}, {0x3e8ec000}, {0x3e8ee000}, {0x3e8f0000}, {0x3e8f2000}, {0x3e8f4000}, {0x3e8f6000}, {0x3e8f8000}, {0x3e8fa000}, {0x3e8fc000}, {0x3e8fe000}, {0x3e900000}, {0x3e902000}, {0x3e904000}, {0x3e906000}, {0x3e908000}, {0x3e90a000}, {0x3e90c000}, {0x3e90e000}, {0x3e910000}, {0x3e912000}, {0x3e914000}, {0x3e916000}, {0x3e918000}, {0x3e91a000}, {0x3e91c000}, {0x3e91e000}, {0x3e920000}, {0x3e922000}, {0x3e924000}, {0x3e926000}, {0x3e928000}, {0x3e92a000}, {0x3e92c000}, {0x3e92e000}, {0x3e930000}, {0x3e932000}, {0x3e934000}, {0x3e936000}, {0x3e938000}, {0x3e93a000}, {0x3e93c000}, {0x3e93e000}, {0x3e940000}, {0x3e942000}, {0x3e944000}, {0x3e946000}, {0x3e948000}, {0x3e94a000}, {0x3e94c000}, {0x3e94e000}, {0x3e950000}, {0x3e952000}, {0x3e954000}, {0x3e956000}, {0x3e958000}, {0x3e95a000}, {0x3e95c000}, {0x3e95e000}, {0x3e960000}, {0x3e962000}, {0x3e964000}, {0x3e966000}, {0x3e968000}, {0x3e96a000}, {0x3e96c000}, {0x3e96e000}, {0x3e970000}, {0x3e972000}, {0x3e974000}, {0x3e976000}, {0x3e978000}, {0x3e97a000}, {0x3e97c000}, {0x3e97e000}, {0x3e980000}, {0x3e982000}, {0x3e984000}, {0x3e986000}, {0x3e988000}, {0x3e98a000}, {0x3e98c000}, {0x3e98e000}, {0x3e990000}, {0x3e992000}, {0x3e994000}, {0x3e996000}, {0x3e998000}, {0x3e99a000}, {0x3e99c000}, {0x3e99e000}, {0x3e9a0000}, {0x3e9a2000}, {0x3e9a4000}, {0x3e9a6000}, {0x3e9a8000}, {0x3e9aa000}, {0x3e9ac000}, {0x3e9ae000}, {0x3e9b0000}, {0x3e9b2000}, {0x3e9b4000}, {0x3e9b6000}, {0x3e9b8000}, {0x3e9ba000}, {0x3e9bc000}, {0x3e9be000}, {0x3e9c0000}, {0x3e9c2000}, {0x3e9c4000}, {0x3e9c6000}, {0x3e9c8000}, {0x3e9ca000}, {0x3e9cc000}, {0x3e9ce000}, {0x3e9d0000}, {0x3e9d2000}, {0x3e9d4000}, {0x3e9d6000}, {0x3e9d8000}, {0x3e9da000}, {0x3e9dc000}, {0x3e9de000}, {0x3e9e0000}, {0x3e9e2000}, {0x3e9e4000}, {0x3e9e6000}, {0x3e9e8000}, {0x3e9ea000}, {0x3e9ec000}, {0x3e9ee000}, {0x3e9f0000}, {0x3e9f2000}, {0x3e9f4000}, {0x3e9f6000}, {0x3e9f8000}, {0x3e9fa000}, {0x3e9fc000}, {0x3e9fe000}, {0x3ea00000}, {0x3ea02000}, {0x3ea04000}, {0x3ea06000}, {0x3ea08000}, {0x3ea0a000}, {0x3ea0c000}, {0x3ea0e000}, {0x3ea10000}, {0x3ea12000}, {0x3ea14000}, {0x3ea16000}, {0x3ea18000}, {0x3ea1a000}, {0x3ea1c000}, {0x3ea1e000}, {0x3ea20000}, {0x3ea22000}, {0x3ea24000}, {0x3ea26000}, {0x3ea28000}, {0x3ea2a000}, {0x3ea2c000}, {0x3ea2e000}, {0x3ea30000}, {0x3ea32000}, {0x3ea34000}, {0x3ea36000}, {0x3ea38000}, {0x3ea3a000}, {0x3ea3c000}, {0x3ea3e000}, {0x3ea40000}, {0x3ea42000}, {0x3ea44000}, {0x3ea46000}, {0x3ea48000}, {0x3ea4a000}, {0x3ea4c000}, {0x3ea4e000}, {0x3ea50000}, {0x3ea52000}, {0x3ea54000}, {0x3ea56000}, {0x3ea58000}, {0x3ea5a000}, {0x3ea5c000}, {0x3ea5e000}, {0x3ea60000}, {0x3ea62000}, {0x3ea64000}, {0x3ea66000}, {0x3ea68000}, {0x3ea6a000}, {0x3ea6c000}, {0x3ea6e000}, {0x3ea70000}, {0x3ea72000}, {0x3ea74000}, {0x3ea76000}, {0x3ea78000}, {0x3ea7a000}, {0x3ea7c000}, {0x3ea7e000}, {0x3ea80000}, {0x3ea82000}, {0x3ea84000}, {0x3ea86000}, {0x3ea88000}, {0x3ea8a000}, {0x3ea8c000}, {0x3ea8e000}, {0x3ea90000}, {0x3ea92000}, {0x3ea94000}, {0x3ea96000}, {0x3ea98000}, {0x3ea9a000}, {0x3ea9c000}, {0x3ea9e000}, {0x3eaa0000}, {0x3eaa2000}, {0x3eaa4000}, {0x3eaa6000}, {0x3eaa8000}, {0x3eaaa000}, {0x3eaac000}, {0x3eaae000}, {0x3eab0000}, {0x3eab2000}, {0x3eab4000}, {0x3eab6000}, {0x3eab8000}, {0x3eaba000}, {0x3eabc000}, {0x3eabe000}, {0x3eac0000}, {0x3eac2000}, {0x3eac4000}, {0x3eac6000}, {0x3eac8000}, {0x3eaca000}, {0x3eacc000}, {0x3eace000}, {0x3ead0000}, {0x3ead2000}, {0x3ead4000}, {0x3ead6000}, {0x3ead8000}, {0x3eada000}, {0x3eadc000}, {0x3eade000}, {0x3eae0000}, {0x3eae2000}, {0x3eae4000}, {0x3eae6000}, {0x3eae8000}, {0x3eaea000}, {0x3eaec000}, {0x3eaee000}, {0x3eaf0000}, {0x3eaf2000}, {0x3eaf4000}, {0x3eaf6000}, {0x3eaf8000}, {0x3eafa000}, {0x3eafc000}, {0x3eafe000}, {0x3eb00000}, {0x3eb02000}, {0x3eb04000}, {0x3eb06000}, {0x3eb08000}, {0x3eb0a000}, {0x3eb0c000}, {0x3eb0e000}, {0x3eb10000}, {0x3eb12000}, {0x3eb14000}, {0x3eb16000}, {0x3eb18000}, {0x3eb1a000}, {0x3eb1c000}, {0x3eb1e000}, {0x3eb20000}, {0x3eb22000}, {0x3eb24000}, {0x3eb26000}, {0x3eb28000}, {0x3eb2a000}, {0x3eb2c000}, {0x3eb2e000}, {0x3eb30000}, {0x3eb32000}, {0x3eb34000}, {0x3eb36000}, {0x3eb38000}, {0x3eb3a000}, {0x3eb3c000}, {0x3eb3e000}, {0x3eb40000}, {0x3eb42000}, {0x3eb44000}, {0x3eb46000}, {0x3eb48000}, {0x3eb4a000}, {0x3eb4c000}, {0x3eb4e000}, {0x3eb50000}, {0x3eb52000}, {0x3eb54000}, {0x3eb56000}, {0x3eb58000}, {0x3eb5a000}, {0x3eb5c000}, {0x3eb5e000}, {0x3eb60000}, {0x3eb62000}, {0x3eb64000}, {0x3eb66000}, {0x3eb68000}, {0x3eb6a000}, {0x3eb6c000}, {0x3eb6e000}, {0x3eb70000}, {0x3eb72000}, {0x3eb74000}, {0x3eb76000}, {0x3eb78000}, {0x3eb7a000}, {0x3eb7c000}, {0x3eb7e000}, {0x3eb80000}, {0x3eb82000}, {0x3eb84000}, {0x3eb86000}, {0x3eb88000}, {0x3eb8a000}, {0x3eb8c000}, {0x3eb8e000}, {0x3eb90000}, {0x3eb92000}, {0x3eb94000}, {0x3eb96000}, {0x3eb98000}, {0x3eb9a000}, {0x3eb9c000}, {0x3eb9e000}, {0x3eba0000}, {0x3eba2000}, {0x3eba4000}, {0x3eba6000}, {0x3eba8000}, {0x3ebaa000}, {0x3ebac000}, {0x3ebae000}, {0x3ebb0000}, {0x3ebb2000}, {0x3ebb4000}, {0x3ebb6000}, {0x3ebb8000}, {0x3ebba000}, {0x3ebbc000}, {0x3ebbe000}, {0x3ebc0000}, {0x3ebc2000}, {0x3ebc4000}, {0x3ebc6000}, {0x3ebc8000}, {0x3ebca000}, {0x3ebcc000}, {0x3ebce000}, {0x3ebd0000}, {0x3ebd2000}, {0x3ebd4000}, {0x3ebd6000}, {0x3ebd8000}, {0x3ebda000}, {0x3ebdc000}, {0x3ebde000}, {0x3ebe0000}, {0x3ebe2000}, {0x3ebe4000}, {0x3ebe6000}, {0x3ebe8000}, {0x3ebea000}, {0x3ebec000}, {0x3ebee000}, {0x3ebf0000}, {0x3ebf2000}, {0x3ebf4000}, {0x3ebf6000}, {0x3ebf8000}, {0x3ebfa000}, {0x3ebfc000}, {0x3ebfe000}, {0x3ec00000}, {0x3ec02000}, {0x3ec04000}, {0x3ec06000}, {0x3ec08000}, {0x3ec0a000}, {0x3ec0c000}, {0x3ec0e000}, {0x3ec10000}, {0x3ec12000}, {0x3ec14000}, {0x3ec16000}, {0x3ec18000}, {0x3ec1a000}, {0x3ec1c000}, {0x3ec1e000}, {0x3ec20000}, {0x3ec22000}, {0x3ec24000}, {0x3ec26000}, {0x3ec28000}, {0x3ec2a000}, {0x3ec2c000}, {0x3ec2e000}, {0x3ec30000}, {0x3ec32000}, {0x3ec34000}, {0x3ec36000}, {0x3ec38000}, {0x3ec3a000}, {0x3ec3c000}, {0x3ec3e000}, {0x3ec40000}, {0x3ec42000}, {0x3ec44000}, {0x3ec46000}, {0x3ec48000}, {0x3ec4a000}, {0x3ec4c000}, {0x3ec4e000}, {0x3ec50000}, {0x3ec52000}, {0x3ec54000}, {0x3ec56000}, {0x3ec58000}, {0x3ec5a000}, {0x3ec5c000}, {0x3ec5e000}, {0x3ec60000}, {0x3ec62000}, {0x3ec64000}, {0x3ec66000}, {0x3ec68000}, {0x3ec6a000}, {0x3ec6c000}, {0x3ec6e000}, {0x3ec70000}, {0x3ec72000}, {0x3ec74000}, {0x3ec76000}, {0x3ec78000}, {0x3ec7a000}, {0x3ec7c000}, {0x3ec7e000}, {0x3ec80000}, {0x3ec82000}, {0x3ec84000}, {0x3ec86000}, {0x3ec88000}, {0x3ec8a000}, {0x3ec8c000}, {0x3ec8e000}, {0x3ec90000}, {0x3ec92000}, {0x3ec94000}, {0x3ec96000}, {0x3ec98000}, {0x3ec9a000}, {0x3ec9c000}, {0x3ec9e000}, {0x3eca0000}, {0x3eca2000}, {0x3eca4000}, {0x3eca6000}, {0x3eca8000}, {0x3ecaa000}, {0x3ecac000}, {0x3ecae000}, {0x3ecb0000}, {0x3ecb2000}, {0x3ecb4000}, {0x3ecb6000}, {0x3ecb8000}, {0x3ecba000}, {0x3ecbc000}, {0x3ecbe000}, {0x3ecc0000}, {0x3ecc2000}, {0x3ecc4000}, {0x3ecc6000}, {0x3ecc8000}, {0x3ecca000}, {0x3eccc000}, {0x3ecce000}, {0x3ecd0000}, {0x3ecd2000}, {0x3ecd4000}, {0x3ecd6000}, {0x3ecd8000}, {0x3ecda000}, {0x3ecdc000}, {0x3ecde000}, {0x3ece0000}, {0x3ece2000}, {0x3ece4000}, {0x3ece6000}, {0x3ece8000}, {0x3ecea000}, {0x3ecec000}, {0x3ecee000}, {0x3ecf0000}, {0x3ecf2000}, {0x3ecf4000}, {0x3ecf6000}, {0x3ecf8000}, {0x3ecfa000}, {0x3ecfc000}, {0x3ecfe000}, {0x3ed00000}, {0x3ed02000}, {0x3ed04000}, {0x3ed06000}, {0x3ed08000}, {0x3ed0a000}, {0x3ed0c000}, {0x3ed0e000}, {0x3ed10000}, {0x3ed12000}, {0x3ed14000}, {0x3ed16000}, {0x3ed18000}, {0x3ed1a000}, {0x3ed1c000}, {0x3ed1e000}, {0x3ed20000}, {0x3ed22000}, {0x3ed24000}, {0x3ed26000}, {0x3ed28000}, {0x3ed2a000}, {0x3ed2c000}, {0x3ed2e000}, {0x3ed30000}, {0x3ed32000}, {0x3ed34000}, {0x3ed36000}, {0x3ed38000}, {0x3ed3a000}, {0x3ed3c000}, {0x3ed3e000}, {0x3ed40000}, {0x3ed42000}, {0x3ed44000}, {0x3ed46000}, {0x3ed48000}, {0x3ed4a000}, {0x3ed4c000}, {0x3ed4e000}, {0x3ed50000}, {0x3ed52000}, {0x3ed54000}, {0x3ed56000}, {0x3ed58000}, {0x3ed5a000}, {0x3ed5c000}, {0x3ed5e000}, {0x3ed60000}, {0x3ed62000}, {0x3ed64000}, {0x3ed66000}, {0x3ed68000}, {0x3ed6a000}, {0x3ed6c000}, {0x3ed6e000}, {0x3ed70000}, {0x3ed72000}, {0x3ed74000}, {0x3ed76000}, {0x3ed78000}, {0x3ed7a000}, {0x3ed7c000}, {0x3ed7e000}, {0x3ed80000}, {0x3ed82000}, {0x3ed84000}, {0x3ed86000}, {0x3ed88000}, {0x3ed8a000}, {0x3ed8c000}, {0x3ed8e000}, {0x3ed90000}, {0x3ed92000}, {0x3ed94000}, {0x3ed96000}, {0x3ed98000}, {0x3ed9a000}, {0x3ed9c000}, {0x3ed9e000}, {0x3eda0000}, {0x3eda2000}, {0x3eda4000}, {0x3eda6000}, {0x3eda8000}, {0x3edaa000}, {0x3edac000}, {0x3edae000}, {0x3edb0000}, {0x3edb2000}, {0x3edb4000}, {0x3edb6000}, {0x3edb8000}, {0x3edba000}, {0x3edbc000}, {0x3edbe000}, {0x3edc0000}, {0x3edc2000}, {0x3edc4000}, {0x3edc6000}, {0x3edc8000}, {0x3edca000}, {0x3edcc000}, {0x3edce000}, {0x3edd0000}, {0x3edd2000}, {0x3edd4000}, {0x3edd6000}, {0x3edd8000}, {0x3edda000}, {0x3eddc000}, {0x3edde000}, {0x3ede0000}, {0x3ede2000}, {0x3ede4000}, {0x3ede6000}, {0x3ede8000}, {0x3edea000}, {0x3edec000}, {0x3edee000}, {0x3edf0000}, {0x3edf2000}, {0x3edf4000}, {0x3edf6000}, {0x3edf8000}, {0x3edfa000}, {0x3edfc000}, {0x3edfe000}, {0x3ee00000}, {0x3ee02000}, {0x3ee04000}, {0x3ee06000}, {0x3ee08000}, {0x3ee0a000}, {0x3ee0c000}, {0x3ee0e000}, {0x3ee10000}, {0x3ee12000}, {0x3ee14000}, {0x3ee16000}, {0x3ee18000}, {0x3ee1a000}, {0x3ee1c000}, {0x3ee1e000}, {0x3ee20000}, {0x3ee22000}, {0x3ee24000}, {0x3ee26000}, {0x3ee28000}, {0x3ee2a000}, {0x3ee2c000}, {0x3ee2e000}, {0x3ee30000}, {0x3ee32000}, {0x3ee34000}, {0x3ee36000}, {0x3ee38000}, {0x3ee3a000}, {0x3ee3c000}, {0x3ee3e000}, {0x3ee40000}, {0x3ee42000}, {0x3ee44000}, {0x3ee46000}, {0x3ee48000}, {0x3ee4a000}, {0x3ee4c000}, {0x3ee4e000}, {0x3ee50000}, {0x3ee52000}, {0x3ee54000}, {0x3ee56000}, {0x3ee58000}, {0x3ee5a000}, {0x3ee5c000}, {0x3ee5e000}, {0x3ee60000}, {0x3ee62000}, {0x3ee64000}, {0x3ee66000}, {0x3ee68000}, {0x3ee6a000}, {0x3ee6c000}, {0x3ee6e000}, {0x3ee70000}, {0x3ee72000}, {0x3ee74000}, {0x3ee76000}, {0x3ee78000}, {0x3ee7a000}, {0x3ee7c000}, {0x3ee7e000}, {0x3ee80000}, {0x3ee82000}, {0x3ee84000}, {0x3ee86000}, {0x3ee88000}, {0x3ee8a000}, {0x3ee8c000}, {0x3ee8e000}, {0x3ee90000}, {0x3ee92000}, {0x3ee94000}, {0x3ee96000}, {0x3ee98000}, {0x3ee9a000}, {0x3ee9c000}, {0x3ee9e000}, {0x3eea0000}, {0x3eea2000}, {0x3eea4000}, {0x3eea6000}, {0x3eea8000}, {0x3eeaa000}, {0x3eeac000}, {0x3eeae000}, {0x3eeb0000}, {0x3eeb2000}, {0x3eeb4000}, {0x3eeb6000}, {0x3eeb8000}, {0x3eeba000}, {0x3eebc000}, {0x3eebe000}, {0x3eec0000}, {0x3eec2000}, {0x3eec4000}, {0x3eec6000}, {0x3eec8000}, {0x3eeca000}, {0x3eecc000}, {0x3eece000}, {0x3eed0000}, {0x3eed2000}, {0x3eed4000}, {0x3eed6000}, {0x3eed8000}, {0x3eeda000}, {0x3eedc000}, {0x3eede000}, {0x3eee0000}, {0x3eee2000}, {0x3eee4000}, {0x3eee6000}, {0x3eee8000}, {0x3eeea000}, {0x3eeec000}, {0x3eeee000}, {0x3eef0000}, {0x3eef2000}, {0x3eef4000}, {0x3eef6000}, {0x3eef8000}, {0x3eefa000}, {0x3eefc000}, {0x3eefe000}, {0x3ef00000}, {0x3ef02000}, {0x3ef04000}, {0x3ef06000}, {0x3ef08000}, {0x3ef0a000}, {0x3ef0c000}, {0x3ef0e000}, {0x3ef10000}, {0x3ef12000}, {0x3ef14000}, {0x3ef16000}, {0x3ef18000}, {0x3ef1a000}, {0x3ef1c000}, {0x3ef1e000}, {0x3ef20000}, {0x3ef22000}, {0x3ef24000}, {0x3ef26000}, {0x3ef28000}, {0x3ef2a000}, {0x3ef2c000}, {0x3ef2e000}, {0x3ef30000}, {0x3ef32000}, {0x3ef34000}, {0x3ef36000}, {0x3ef38000}, {0x3ef3a000}, {0x3ef3c000}, {0x3ef3e000}, {0x3ef40000}, {0x3ef42000}, {0x3ef44000}, {0x3ef46000}, {0x3ef48000}, {0x3ef4a000}, {0x3ef4c000}, {0x3ef4e000}, {0x3ef50000}, {0x3ef52000}, {0x3ef54000}, {0x3ef56000}, {0x3ef58000}, {0x3ef5a000}, {0x3ef5c000}, {0x3ef5e000}, {0x3ef60000}, {0x3ef62000}, {0x3ef64000}, {0x3ef66000}, {0x3ef68000}, {0x3ef6a000}, {0x3ef6c000}, {0x3ef6e000}, {0x3ef70000}, {0x3ef72000}, {0x3ef74000}, {0x3ef76000}, {0x3ef78000}, {0x3ef7a000}, {0x3ef7c000}, {0x3ef7e000}, {0x3ef80000}, {0x3ef82000}, {0x3ef84000}, {0x3ef86000}, {0x3ef88000}, {0x3ef8a000}, {0x3ef8c000}, {0x3ef8e000}, {0x3ef90000}, {0x3ef92000}, {0x3ef94000}, {0x3ef96000}, {0x3ef98000}, {0x3ef9a000}, {0x3ef9c000}, {0x3ef9e000}, {0x3efa0000}, {0x3efa2000}, {0x3efa4000}, {0x3efa6000}, {0x3efa8000}, {0x3efaa000}, {0x3efac000}, {0x3efae000}, {0x3efb0000}, {0x3efb2000}, {0x3efb4000}, {0x3efb6000}, {0x3efb8000}, {0x3efba000}, {0x3efbc000}, {0x3efbe000}, {0x3efc0000}, {0x3efc2000}, {0x3efc4000}, {0x3efc6000}, {0x3efc8000}, {0x3efca000}, {0x3efcc000}, {0x3efce000}, {0x3efd0000}, {0x3efd2000}, {0x3efd4000}, {0x3efd6000}, {0x3efd8000}, {0x3efda000}, {0x3efdc000}, {0x3efde000}, {0x3efe0000}, {0x3efe2000}, {0x3efe4000}, {0x3efe6000}, {0x3efe8000}, {0x3efea000}, {0x3efec000}, {0x3efee000}, {0x3eff0000}, {0x3eff2000}, {0x3eff4000}, {0x3eff6000}, {0x3eff8000}, {0x3effa000}, {0x3effc000}, {0x3effe000}, {0x3f000000}, {0x3f002000}, {0x3f004000}, {0x3f006000}, {0x3f008000}, {0x3f00a000}, {0x3f00c000}, {0x3f00e000}, {0x3f010000}, {0x3f012000}, {0x3f014000}, {0x3f016000}, {0x3f018000}, {0x3f01a000}, {0x3f01c000}, {0x3f01e000}, {0x3f020000}, {0x3f022000}, {0x3f024000}, {0x3f026000}, {0x3f028000}, {0x3f02a000}, {0x3f02c000}, {0x3f02e000}, {0x3f030000}, {0x3f032000}, {0x3f034000}, {0x3f036000}, {0x3f038000}, {0x3f03a000}, {0x3f03c000}, {0x3f03e000}, {0x3f040000}, {0x3f042000}, {0x3f044000}, {0x3f046000}, {0x3f048000}, {0x3f04a000}, {0x3f04c000}, {0x3f04e000}, {0x3f050000}, {0x3f052000}, {0x3f054000}, {0x3f056000}, {0x3f058000}, {0x3f05a000}, {0x3f05c000}, {0x3f05e000}, {0x3f060000}, {0x3f062000}, {0x3f064000}, {0x3f066000}, {0x3f068000}, {0x3f06a000}, {0x3f06c000}, {0x3f06e000}, {0x3f070000}, {0x3f072000}, {0x3f074000}, {0x3f076000}, {0x3f078000}, {0x3f07a000}, {0x3f07c000}, {0x3f07e000}, {0x3f080000}, {0x3f082000}, {0x3f084000}, {0x3f086000}, {0x3f088000}, {0x3f08a000}, {0x3f08c000}, {0x3f08e000}, {0x3f090000}, {0x3f092000}, {0x3f094000}, {0x3f096000}, {0x3f098000}, {0x3f09a000}, {0x3f09c000}, {0x3f09e000}, {0x3f0a0000}, {0x3f0a2000}, {0x3f0a4000}, {0x3f0a6000}, {0x3f0a8000}, {0x3f0aa000}, {0x3f0ac000}, {0x3f0ae000}, {0x3f0b0000}, {0x3f0b2000}, {0x3f0b4000}, {0x3f0b6000}, {0x3f0b8000}, {0x3f0ba000}, {0x3f0bc000}, {0x3f0be000}, {0x3f0c0000}, {0x3f0c2000}, {0x3f0c4000}, {0x3f0c6000}, {0x3f0c8000}, {0x3f0ca000}, {0x3f0cc000}, {0x3f0ce000}, {0x3f0d0000}, {0x3f0d2000}, {0x3f0d4000}, {0x3f0d6000}, {0x3f0d8000}, {0x3f0da000}, {0x3f0dc000}, {0x3f0de000}, {0x3f0e0000}, {0x3f0e2000}, {0x3f0e4000}, {0x3f0e6000}, {0x3f0e8000}, {0x3f0ea000}, {0x3f0ec000}, {0x3f0ee000}, {0x3f0f0000}, {0x3f0f2000}, {0x3f0f4000}, {0x3f0f6000}, {0x3f0f8000}, {0x3f0fa000}, {0x3f0fc000}, {0x3f0fe000}, {0x3f100000}, {0x3f102000}, {0x3f104000}, {0x3f106000}, {0x3f108000}, {0x3f10a000}, {0x3f10c000}, {0x3f10e000}, {0x3f110000}, {0x3f112000}, {0x3f114000}, {0x3f116000}, {0x3f118000}, {0x3f11a000}, {0x3f11c000}, {0x3f11e000}, {0x3f120000}, {0x3f122000}, {0x3f124000}, {0x3f126000}, {0x3f128000}, {0x3f12a000}, {0x3f12c000}, {0x3f12e000}, {0x3f130000}, {0x3f132000}, {0x3f134000}, {0x3f136000}, {0x3f138000}, {0x3f13a000}, {0x3f13c000}, {0x3f13e000}, {0x3f140000}, {0x3f142000}, {0x3f144000}, {0x3f146000}, {0x3f148000}, {0x3f14a000}, {0x3f14c000}, {0x3f14e000}, {0x3f150000}, {0x3f152000}, {0x3f154000}, {0x3f156000}, {0x3f158000}, {0x3f15a000}, {0x3f15c000}, {0x3f15e000}, {0x3f160000}, {0x3f162000}, {0x3f164000}, {0x3f166000}, {0x3f168000}, {0x3f16a000}, {0x3f16c000}, {0x3f16e000}, {0x3f170000}, {0x3f172000}, {0x3f174000}, {0x3f176000}, {0x3f178000}, {0x3f17a000}, {0x3f17c000}, {0x3f17e000}, {0x3f180000}, {0x3f182000}, {0x3f184000}, {0x3f186000}, {0x3f188000}, {0x3f18a000}, {0x3f18c000}, {0x3f18e000}, {0x3f190000}, {0x3f192000}, {0x3f194000}, {0x3f196000}, {0x3f198000}, {0x3f19a000}, {0x3f19c000}, {0x3f19e000}, {0x3f1a0000}, {0x3f1a2000}, {0x3f1a4000}, {0x3f1a6000}, {0x3f1a8000}, {0x3f1aa000}, {0x3f1ac000}, {0x3f1ae000}, {0x3f1b0000}, {0x3f1b2000}, {0x3f1b4000}, {0x3f1b6000}, {0x3f1b8000}, {0x3f1ba000}, {0x3f1bc000}, {0x3f1be000}, {0x3f1c0000}, {0x3f1c2000}, {0x3f1c4000}, {0x3f1c6000}, {0x3f1c8000}, {0x3f1ca000}, {0x3f1cc000}, {0x3f1ce000}, {0x3f1d0000}, {0x3f1d2000}, {0x3f1d4000}, {0x3f1d6000}, {0x3f1d8000}, {0x3f1da000}, {0x3f1dc000}, {0x3f1de000}, {0x3f1e0000}, {0x3f1e2000}, {0x3f1e4000}, {0x3f1e6000}, {0x3f1e8000}, {0x3f1ea000}, {0x3f1ec000}, {0x3f1ee000}, {0x3f1f0000}, {0x3f1f2000}, {0x3f1f4000}, {0x3f1f6000}, {0x3f1f8000}, {0x3f1fa000}, {0x3f1fc000}, {0x3f1fe000}, {0x3f200000}, {0x3f202000}, {0x3f204000}, {0x3f206000}, {0x3f208000}, {0x3f20a000}, {0x3f20c000}, {0x3f20e000}, {0x3f210000}, {0x3f212000}, {0x3f214000}, {0x3f216000}, {0x3f218000}, {0x3f21a000}, {0x3f21c000}, {0x3f21e000}, {0x3f220000}, {0x3f222000}, {0x3f224000}, {0x3f226000}, {0x3f228000}, {0x3f22a000}, {0x3f22c000}, {0x3f22e000}, {0x3f230000}, {0x3f232000}, {0x3f234000}, {0x3f236000}, {0x3f238000}, {0x3f23a000}, {0x3f23c000}, {0x3f23e000}, {0x3f240000}, {0x3f242000}, {0x3f244000}, {0x3f246000}, {0x3f248000}, {0x3f24a000}, {0x3f24c000}, {0x3f24e000}, {0x3f250000}, {0x3f252000}, {0x3f254000}, {0x3f256000}, {0x3f258000}, {0x3f25a000}, {0x3f25c000}, {0x3f25e000}, {0x3f260000}, {0x3f262000}, {0x3f264000}, {0x3f266000}, {0x3f268000}, {0x3f26a000}, {0x3f26c000}, {0x3f26e000}, {0x3f270000}, {0x3f272000}, {0x3f274000}, {0x3f276000}, {0x3f278000}, {0x3f27a000}, {0x3f27c000}, {0x3f27e000}, {0x3f280000}, {0x3f282000}, {0x3f284000}, {0x3f286000}, {0x3f288000}, {0x3f28a000}, {0x3f28c000}, {0x3f28e000}, {0x3f290000}, {0x3f292000}, {0x3f294000}, {0x3f296000}, {0x3f298000}, {0x3f29a000}, {0x3f29c000}, {0x3f29e000}, {0x3f2a0000}, {0x3f2a2000}, {0x3f2a4000}, {0x3f2a6000}, {0x3f2a8000}, {0x3f2aa000}, {0x3f2ac000}, {0x3f2ae000}, {0x3f2b0000}, {0x3f2b2000}, {0x3f2b4000}, {0x3f2b6000}, {0x3f2b8000}, {0x3f2ba000}, {0x3f2bc000}, {0x3f2be000}, {0x3f2c0000}, {0x3f2c2000}, {0x3f2c4000}, {0x3f2c6000}, {0x3f2c8000}, {0x3f2ca000}, {0x3f2cc000}, {0x3f2ce000}, {0x3f2d0000}, {0x3f2d2000}, {0x3f2d4000}, {0x3f2d6000}, {0x3f2d8000}, {0x3f2da000}, {0x3f2dc000}, {0x3f2de000}, {0x3f2e0000}, {0x3f2e2000}, {0x3f2e4000}, {0x3f2e6000}, {0x3f2e8000}, {0x3f2ea000}, {0x3f2ec000}, {0x3f2ee000}, {0x3f2f0000}, {0x3f2f2000}, {0x3f2f4000}, {0x3f2f6000}, {0x3f2f8000}, {0x3f2fa000}, {0x3f2fc000}, {0x3f2fe000}, {0x3f300000}, {0x3f302000}, {0x3f304000}, {0x3f306000}, {0x3f308000}, {0x3f30a000}, {0x3f30c000}, {0x3f30e000}, {0x3f310000}, {0x3f312000}, {0x3f314000}, {0x3f316000}, {0x3f318000}, {0x3f31a000}, {0x3f31c000}, {0x3f31e000}, {0x3f320000}, {0x3f322000}, {0x3f324000}, {0x3f326000}, {0x3f328000}, {0x3f32a000}, {0x3f32c000}, {0x3f32e000}, {0x3f330000}, {0x3f332000}, {0x3f334000}, {0x3f336000}, {0x3f338000}, {0x3f33a000}, {0x3f33c000}, {0x3f33e000}, {0x3f340000}, {0x3f342000}, {0x3f344000}, {0x3f346000}, {0x3f348000}, {0x3f34a000}, {0x3f34c000}, {0x3f34e000}, {0x3f350000}, {0x3f352000}, {0x3f354000}, {0x3f356000}, {0x3f358000}, {0x3f35a000}, {0x3f35c000}, {0x3f35e000}, {0x3f360000}, {0x3f362000}, {0x3f364000}, {0x3f366000}, {0x3f368000}, {0x3f36a000}, {0x3f36c000}, {0x3f36e000}, {0x3f370000}, {0x3f372000}, {0x3f374000}, {0x3f376000}, {0x3f378000}, {0x3f37a000}, {0x3f37c000}, {0x3f37e000}, {0x3f380000}, {0x3f382000}, {0x3f384000}, {0x3f386000}, {0x3f388000}, {0x3f38a000}, {0x3f38c000}, {0x3f38e000}, {0x3f390000}, {0x3f392000}, {0x3f394000}, {0x3f396000}, {0x3f398000}, {0x3f39a000}, {0x3f39c000}, {0x3f39e000}, {0x3f3a0000}, {0x3f3a2000}, {0x3f3a4000}, {0x3f3a6000}, {0x3f3a8000}, {0x3f3aa000}, {0x3f3ac000}, {0x3f3ae000}, {0x3f3b0000}, {0x3f3b2000}, {0x3f3b4000}, {0x3f3b6000}, {0x3f3b8000}, {0x3f3ba000}, {0x3f3bc000}, {0x3f3be000}, {0x3f3c0000}, {0x3f3c2000}, {0x3f3c4000}, {0x3f3c6000}, {0x3f3c8000}, {0x3f3ca000}, {0x3f3cc000}, {0x3f3ce000}, {0x3f3d0000}, {0x3f3d2000}, {0x3f3d4000}, {0x3f3d6000}, {0x3f3d8000}, {0x3f3da000}, {0x3f3dc000}, {0x3f3de000}, {0x3f3e0000}, {0x3f3e2000}, {0x3f3e4000}, {0x3f3e6000}, {0x3f3e8000}, {0x3f3ea000}, {0x3f3ec000}, {0x3f3ee000}, {0x3f3f0000}, {0x3f3f2000}, {0x3f3f4000}, {0x3f3f6000}, {0x3f3f8000}, {0x3f3fa000}, {0x3f3fc000}, {0x3f3fe000}, {0x3f400000}, {0x3f402000}, {0x3f404000}, {0x3f406000}, {0x3f408000}, {0x3f40a000}, {0x3f40c000}, {0x3f40e000}, {0x3f410000}, {0x3f412000}, {0x3f414000}, {0x3f416000}, {0x3f418000}, {0x3f41a000}, {0x3f41c000}, {0x3f41e000}, {0x3f420000}, {0x3f422000}, {0x3f424000}, {0x3f426000}, {0x3f428000}, {0x3f42a000}, {0x3f42c000}, {0x3f42e000}, {0x3f430000}, {0x3f432000}, {0x3f434000}, {0x3f436000}, {0x3f438000}, {0x3f43a000}, {0x3f43c000}, {0x3f43e000}, {0x3f440000}, {0x3f442000}, {0x3f444000}, {0x3f446000}, {0x3f448000}, {0x3f44a000}, {0x3f44c000}, {0x3f44e000}, {0x3f450000}, {0x3f452000}, {0x3f454000}, {0x3f456000}, {0x3f458000}, {0x3f45a000}, {0x3f45c000}, {0x3f45e000}, {0x3f460000}, {0x3f462000}, {0x3f464000}, {0x3f466000}, {0x3f468000}, {0x3f46a000}, {0x3f46c000}, {0x3f46e000}, {0x3f470000}, {0x3f472000}, {0x3f474000}, {0x3f476000}, {0x3f478000}, {0x3f47a000}, {0x3f47c000}, {0x3f47e000}, {0x3f480000}, {0x3f482000}, {0x3f484000}, {0x3f486000}, {0x3f488000}, {0x3f48a000}, {0x3f48c000}, {0x3f48e000}, {0x3f490000}, {0x3f492000}, {0x3f494000}, {0x3f496000}, {0x3f498000}, {0x3f49a000}, {0x3f49c000}, {0x3f49e000}, {0x3f4a0000}, {0x3f4a2000}, {0x3f4a4000}, {0x3f4a6000}, {0x3f4a8000}, {0x3f4aa000}, {0x3f4ac000}, {0x3f4ae000}, {0x3f4b0000}, {0x3f4b2000}, {0x3f4b4000}, {0x3f4b6000}, {0x3f4b8000}, {0x3f4ba000}, {0x3f4bc000}, {0x3f4be000}, {0x3f4c0000}, {0x3f4c2000}, {0x3f4c4000}, {0x3f4c6000}, {0x3f4c8000}, {0x3f4ca000}, {0x3f4cc000}, {0x3f4ce000}, {0x3f4d0000}, {0x3f4d2000}, {0x3f4d4000}, {0x3f4d6000}, {0x3f4d8000}, {0x3f4da000}, {0x3f4dc000}, {0x3f4de000}, {0x3f4e0000}, {0x3f4e2000}, {0x3f4e4000}, {0x3f4e6000}, {0x3f4e8000}, {0x3f4ea000}, {0x3f4ec000}, {0x3f4ee000}, {0x3f4f0000}, {0x3f4f2000}, {0x3f4f4000}, {0x3f4f6000}, {0x3f4f8000}, {0x3f4fa000}, {0x3f4fc000}, {0x3f4fe000}, {0x3f500000}, {0x3f502000}, {0x3f504000}, {0x3f506000}, {0x3f508000}, {0x3f50a000}, {0x3f50c000}, {0x3f50e000}, {0x3f510000}, {0x3f512000}, {0x3f514000}, {0x3f516000}, {0x3f518000}, {0x3f51a000}, {0x3f51c000}, {0x3f51e000}, {0x3f520000}, {0x3f522000}, {0x3f524000}, {0x3f526000}, {0x3f528000}, {0x3f52a000}, {0x3f52c000}, {0x3f52e000}, {0x3f530000}, {0x3f532000}, {0x3f534000}, {0x3f536000}, {0x3f538000}, {0x3f53a000}, {0x3f53c000}, {0x3f53e000}, {0x3f540000}, {0x3f542000}, {0x3f544000}, {0x3f546000}, {0x3f548000}, {0x3f54a000}, {0x3f54c000}, {0x3f54e000}, {0x3f550000}, {0x3f552000}, {0x3f554000}, {0x3f556000}, {0x3f558000}, {0x3f55a000}, {0x3f55c000}, {0x3f55e000}, {0x3f560000}, {0x3f562000}, {0x3f564000}, {0x3f566000}, {0x3f568000}, {0x3f56a000}, {0x3f56c000}, {0x3f56e000}, {0x3f570000}, {0x3f572000}, {0x3f574000}, {0x3f576000}, {0x3f578000}, {0x3f57a000}, {0x3f57c000}, {0x3f57e000}, {0x3f580000}, {0x3f582000}, {0x3f584000}, {0x3f586000}, {0x3f588000}, {0x3f58a000}, {0x3f58c000}, {0x3f58e000}, {0x3f590000}, {0x3f592000}, {0x3f594000}, {0x3f596000}, {0x3f598000}, {0x3f59a000}, {0x3f59c000}, {0x3f59e000}, {0x3f5a0000}, {0x3f5a2000}, {0x3f5a4000}, {0x3f5a6000}, {0x3f5a8000}, {0x3f5aa000}, {0x3f5ac000}, {0x3f5ae000}, {0x3f5b0000}, {0x3f5b2000}, {0x3f5b4000}, {0x3f5b6000}, {0x3f5b8000}, {0x3f5ba000}, {0x3f5bc000}, {0x3f5be000}, {0x3f5c0000}, {0x3f5c2000}, {0x3f5c4000}, {0x3f5c6000}, {0x3f5c8000}, {0x3f5ca000}, {0x3f5cc000}, {0x3f5ce000}, {0x3f5d0000}, {0x3f5d2000}, {0x3f5d4000}, {0x3f5d6000}, {0x3f5d8000}, {0x3f5da000}, {0x3f5dc000}, {0x3f5de000}, {0x3f5e0000}, {0x3f5e2000}, {0x3f5e4000}, {0x3f5e6000}, {0x3f5e8000}, {0x3f5ea000}, {0x3f5ec000}, {0x3f5ee000}, {0x3f5f0000}, {0x3f5f2000}, {0x3f5f4000}, {0x3f5f6000}, {0x3f5f8000}, {0x3f5fa000}, {0x3f5fc000}, {0x3f5fe000}, {0x3f600000}, {0x3f602000}, {0x3f604000}, {0x3f606000}, {0x3f608000}, {0x3f60a000}, {0x3f60c000}, {0x3f60e000}, {0x3f610000}, {0x3f612000}, {0x3f614000}, {0x3f616000}, {0x3f618000}, {0x3f61a000}, {0x3f61c000}, {0x3f61e000}, {0x3f620000}, {0x3f622000}, {0x3f624000}, {0x3f626000}, {0x3f628000}, {0x3f62a000}, {0x3f62c000}, {0x3f62e000}, {0x3f630000}, {0x3f632000}, {0x3f634000}, {0x3f636000}, {0x3f638000}, {0x3f63a000}, {0x3f63c000}, {0x3f63e000}, {0x3f640000}, {0x3f642000}, {0x3f644000}, {0x3f646000}, {0x3f648000}, {0x3f64a000}, {0x3f64c000}, {0x3f64e000}, {0x3f650000}, {0x3f652000}, {0x3f654000}, {0x3f656000}, {0x3f658000}, {0x3f65a000}, {0x3f65c000}, {0x3f65e000}, {0x3f660000}, {0x3f662000}, {0x3f664000}, {0x3f666000}, {0x3f668000}, {0x3f66a000}, {0x3f66c000}, {0x3f66e000}, {0x3f670000}, {0x3f672000}, {0x3f674000}, {0x3f676000}, {0x3f678000}, {0x3f67a000}, {0x3f67c000}, {0x3f67e000}, {0x3f680000}, {0x3f682000}, {0x3f684000}, {0x3f686000}, {0x3f688000}, {0x3f68a000}, {0x3f68c000}, {0x3f68e000}, {0x3f690000}, {0x3f692000}, {0x3f694000}, {0x3f696000}, {0x3f698000}, {0x3f69a000}, {0x3f69c000}, {0x3f69e000}, {0x3f6a0000}, {0x3f6a2000}, {0x3f6a4000}, {0x3f6a6000}, {0x3f6a8000}, {0x3f6aa000}, {0x3f6ac000}, {0x3f6ae000}, {0x3f6b0000}, {0x3f6b2000}, {0x3f6b4000}, {0x3f6b6000}, {0x3f6b8000}, {0x3f6ba000}, {0x3f6bc000}, {0x3f6be000}, {0x3f6c0000}, {0x3f6c2000}, {0x3f6c4000}, {0x3f6c6000}, {0x3f6c8000}, {0x3f6ca000}, {0x3f6cc000}, {0x3f6ce000}, {0x3f6d0000}, {0x3f6d2000}, {0x3f6d4000}, {0x3f6d6000}, {0x3f6d8000}, {0x3f6da000}, {0x3f6dc000}, {0x3f6de000}, {0x3f6e0000}, {0x3f6e2000}, {0x3f6e4000}, {0x3f6e6000}, {0x3f6e8000}, {0x3f6ea000}, {0x3f6ec000}, {0x3f6ee000}, {0x3f6f0000}, {0x3f6f2000}, {0x3f6f4000}, {0x3f6f6000}, {0x3f6f8000}, {0x3f6fa000}, {0x3f6fc000}, {0x3f6fe000}, {0x3f700000}, {0x3f702000}, {0x3f704000}, {0x3f706000}, {0x3f708000}, {0x3f70a000}, {0x3f70c000}, {0x3f70e000}, {0x3f710000}, {0x3f712000}, {0x3f714000}, {0x3f716000}, {0x3f718000}, {0x3f71a000}, {0x3f71c000}, {0x3f71e000}, {0x3f720000}, {0x3f722000}, {0x3f724000}, {0x3f726000}, {0x3f728000}, {0x3f72a000}, {0x3f72c000}, {0x3f72e000}, {0x3f730000}, {0x3f732000}, {0x3f734000}, {0x3f736000}, {0x3f738000}, {0x3f73a000}, {0x3f73c000}, {0x3f73e000}, {0x3f740000}, {0x3f742000}, {0x3f744000}, {0x3f746000}, {0x3f748000}, {0x3f74a000}, {0x3f74c000}, {0x3f74e000}, {0x3f750000}, {0x3f752000}, {0x3f754000}, {0x3f756000}, {0x3f758000}, {0x3f75a000}, {0x3f75c000}, {0x3f75e000}, {0x3f760000}, {0x3f762000}, {0x3f764000}, {0x3f766000}, {0x3f768000}, {0x3f76a000}, {0x3f76c000}, {0x3f76e000}, {0x3f770000}, {0x3f772000}, {0x3f774000}, {0x3f776000}, {0x3f778000}, {0x3f77a000}, {0x3f77c000}, {0x3f77e000}, {0x3f780000}, {0x3f782000}, {0x3f784000}, {0x3f786000}, {0x3f788000}, {0x3f78a000}, {0x3f78c000}, {0x3f78e000}, {0x3f790000}, {0x3f792000}, {0x3f794000}, {0x3f796000}, {0x3f798000}, {0x3f79a000}, {0x3f79c000}, {0x3f79e000}, {0x3f7a0000}, {0x3f7a2000}, {0x3f7a4000}, {0x3f7a6000}, {0x3f7a8000}, {0x3f7aa000}, {0x3f7ac000}, {0x3f7ae000}, {0x3f7b0000}, {0x3f7b2000}, {0x3f7b4000}, {0x3f7b6000}, {0x3f7b8000}, {0x3f7ba000}, {0x3f7bc000}, {0x3f7be000}, {0x3f7c0000}, {0x3f7c2000}, {0x3f7c4000}, {0x3f7c6000}, {0x3f7c8000}, {0x3f7ca000}, {0x3f7cc000}, {0x3f7ce000}, {0x3f7d0000}, {0x3f7d2000}, {0x3f7d4000}, {0x3f7d6000}, {0x3f7d8000}, {0x3f7da000}, {0x3f7dc000}, {0x3f7de000}, {0x3f7e0000}, {0x3f7e2000}, {0x3f7e4000}, {0x3f7e6000}, {0x3f7e8000}, {0x3f7ea000}, {0x3f7ec000}, {0x3f7ee000}, {0x3f7f0000}, {0x3f7f2000}, {0x3f7f4000}, {0x3f7f6000}, {0x3f7f8000}, {0x3f7fa000}, {0x3f7fc000}, {0x3f7fe000}, {0x3f800000}, {0x3f802000}, {0x3f804000}, {0x3f806000}, {0x3f808000}, {0x3f80a000}, {0x3f80c000}, {0x3f80e000}, {0x3f810000}, {0x3f812000}, {0x3f814000}, {0x3f816000}, {0x3f818000}, {0x3f81a000}, {0x3f81c000}, {0x3f81e000}, {0x3f820000}, {0x3f822000}, {0x3f824000}, {0x3f826000}, {0x3f828000}, {0x3f82a000}, {0x3f82c000}, {0x3f82e000}, {0x3f830000}, {0x3f832000}, {0x3f834000}, {0x3f836000}, {0x3f838000}, {0x3f83a000}, {0x3f83c000}, {0x3f83e000}, {0x3f840000}, {0x3f842000}, {0x3f844000}, {0x3f846000}, {0x3f848000}, {0x3f84a000}, {0x3f84c000}, {0x3f84e000}, {0x3f850000}, {0x3f852000}, {0x3f854000}, {0x3f856000}, {0x3f858000}, {0x3f85a000}, {0x3f85c000}, {0x3f85e000}, {0x3f860000}, {0x3f862000}, {0x3f864000}, {0x3f866000}, {0x3f868000}, {0x3f86a000}, {0x3f86c000}, {0x3f86e000}, {0x3f870000}, {0x3f872000}, {0x3f874000}, {0x3f876000}, {0x3f878000}, {0x3f87a000}, {0x3f87c000}, {0x3f87e000}, {0x3f880000}, {0x3f882000}, {0x3f884000}, {0x3f886000}, {0x3f888000}, {0x3f88a000}, {0x3f88c000}, {0x3f88e000}, {0x3f890000}, {0x3f892000}, {0x3f894000}, {0x3f896000}, {0x3f898000}, {0x3f89a000}, {0x3f89c000}, {0x3f89e000}, {0x3f8a0000}, {0x3f8a2000}, {0x3f8a4000}, {0x3f8a6000}, {0x3f8a8000}, {0x3f8aa000}, {0x3f8ac000}, {0x3f8ae000}, {0x3f8b0000}, {0x3f8b2000}, {0x3f8b4000}, {0x3f8b6000}, {0x3f8b8000}, {0x3f8ba000}, {0x3f8bc000}, {0x3f8be000}, {0x3f8c0000}, {0x3f8c2000}, {0x3f8c4000}, {0x3f8c6000}, {0x3f8c8000}, {0x3f8ca000}, {0x3f8cc000}, {0x3f8ce000}, {0x3f8d0000}, {0x3f8d2000}, {0x3f8d4000}, {0x3f8d6000}, {0x3f8d8000}, {0x3f8da000}, {0x3f8dc000}, {0x3f8de000}, {0x3f8e0000}, {0x3f8e2000}, {0x3f8e4000}, {0x3f8e6000}, {0x3f8e8000}, {0x3f8ea000}, {0x3f8ec000}, {0x3f8ee000}, {0x3f8f0000}, {0x3f8f2000}, {0x3f8f4000}, {0x3f8f6000}, {0x3f8f8000}, {0x3f8fa000}, {0x3f8fc000}, {0x3f8fe000}, {0x3f900000}, {0x3f902000}, {0x3f904000}, {0x3f906000}, {0x3f908000}, {0x3f90a000}, {0x3f90c000}, {0x3f90e000}, {0x3f910000}, {0x3f912000}, {0x3f914000}, {0x3f916000}, {0x3f918000}, {0x3f91a000}, {0x3f91c000}, {0x3f91e000}, {0x3f920000}, {0x3f922000}, {0x3f924000}, {0x3f926000}, {0x3f928000}, {0x3f92a000}, {0x3f92c000}, {0x3f92e000}, {0x3f930000}, {0x3f932000}, {0x3f934000}, {0x3f936000}, {0x3f938000}, {0x3f93a000}, {0x3f93c000}, {0x3f93e000}, {0x3f940000}, {0x3f942000}, {0x3f944000}, {0x3f946000}, {0x3f948000}, {0x3f94a000}, {0x3f94c000}, {0x3f94e000}, {0x3f950000}, {0x3f952000}, {0x3f954000}, {0x3f956000}, {0x3f958000}, {0x3f95a000}, {0x3f95c000}, {0x3f95e000}, {0x3f960000}, {0x3f962000}, {0x3f964000}, {0x3f966000}, {0x3f968000}, {0x3f96a000}, {0x3f96c000}, {0x3f96e000}, {0x3f970000}, {0x3f972000}, {0x3f974000}, {0x3f976000}, {0x3f978000}, {0x3f97a000}, {0x3f97c000}, {0x3f97e000}, {0x3f980000}, {0x3f982000}, {0x3f984000}, {0x3f986000}, {0x3f988000}, {0x3f98a000}, {0x3f98c000}, {0x3f98e000}, {0x3f990000}, {0x3f992000}, {0x3f994000}, {0x3f996000}, {0x3f998000}, {0x3f99a000}, {0x3f99c000}, {0x3f99e000}, {0x3f9a0000}, {0x3f9a2000}, {0x3f9a4000}, {0x3f9a6000}, {0x3f9a8000}, {0x3f9aa000}, {0x3f9ac000}, {0x3f9ae000}, {0x3f9b0000}, {0x3f9b2000}, {0x3f9b4000}, {0x3f9b6000}, {0x3f9b8000}, {0x3f9ba000}, {0x3f9bc000}, {0x3f9be000}, {0x3f9c0000}, {0x3f9c2000}, {0x3f9c4000}, {0x3f9c6000}, {0x3f9c8000}, {0x3f9ca000}, {0x3f9cc000}, {0x3f9ce000}, {0x3f9d0000}, {0x3f9d2000}, {0x3f9d4000}, {0x3f9d6000}, {0x3f9d8000}, {0x3f9da000}, {0x3f9dc000}, {0x3f9de000}, {0x3f9e0000}, {0x3f9e2000}, {0x3f9e4000}, {0x3f9e6000}, {0x3f9e8000}, {0x3f9ea000}, {0x3f9ec000}, {0x3f9ee000}, {0x3f9f0000}, {0x3f9f2000}, {0x3f9f4000}, {0x3f9f6000}, {0x3f9f8000}, {0x3f9fa000}, {0x3f9fc000}, {0x3f9fe000}, {0x3fa00000}, {0x3fa02000}, {0x3fa04000}, {0x3fa06000}, {0x3fa08000}, {0x3fa0a000}, {0x3fa0c000}, {0x3fa0e000}, {0x3fa10000}, {0x3fa12000}, {0x3fa14000}, {0x3fa16000}, {0x3fa18000}, {0x3fa1a000}, {0x3fa1c000}, {0x3fa1e000}, {0x3fa20000}, {0x3fa22000}, {0x3fa24000}, {0x3fa26000}, {0x3fa28000}, {0x3fa2a000}, {0x3fa2c000}, {0x3fa2e000}, {0x3fa30000}, {0x3fa32000}, {0x3fa34000}, {0x3fa36000}, {0x3fa38000}, {0x3fa3a000}, {0x3fa3c000}, {0x3fa3e000}, {0x3fa40000}, {0x3fa42000}, {0x3fa44000}, {0x3fa46000}, {0x3fa48000}, {0x3fa4a000}, {0x3fa4c000}, {0x3fa4e000}, {0x3fa50000}, {0x3fa52000}, {0x3fa54000}, {0x3fa56000}, {0x3fa58000}, {0x3fa5a000}, {0x3fa5c000}, {0x3fa5e000}, {0x3fa60000}, {0x3fa62000}, {0x3fa64000}, {0x3fa66000}, {0x3fa68000}, {0x3fa6a000}, {0x3fa6c000}, {0x3fa6e000}, {0x3fa70000}, {0x3fa72000}, {0x3fa74000}, {0x3fa76000}, {0x3fa78000}, {0x3fa7a000}, {0x3fa7c000}, {0x3fa7e000}, {0x3fa80000}, {0x3fa82000}, {0x3fa84000}, {0x3fa86000}, {0x3fa88000}, {0x3fa8a000}, {0x3fa8c000}, {0x3fa8e000}, {0x3fa90000}, {0x3fa92000}, {0x3fa94000}, {0x3fa96000}, {0x3fa98000}, {0x3fa9a000}, {0x3fa9c000}, {0x3fa9e000}, {0x3faa0000}, {0x3faa2000}, {0x3faa4000}, {0x3faa6000}, {0x3faa8000}, {0x3faaa000}, {0x3faac000}, {0x3faae000}, {0x3fab0000}, {0x3fab2000}, {0x3fab4000}, {0x3fab6000}, {0x3fab8000}, {0x3faba000}, {0x3fabc000}, {0x3fabe000}, {0x3fac0000}, {0x3fac2000}, {0x3fac4000}, {0x3fac6000}, {0x3fac8000}, {0x3faca000}, {0x3facc000}, {0x3face000}, {0x3fad0000}, {0x3fad2000}, {0x3fad4000}, {0x3fad6000}, {0x3fad8000}, {0x3fada000}, {0x3fadc000}, {0x3fade000}, {0x3fae0000}, {0x3fae2000}, {0x3fae4000}, {0x3fae6000}, {0x3fae8000}, {0x3faea000}, {0x3faec000}, {0x3faee000}, {0x3faf0000}, {0x3faf2000}, {0x3faf4000}, {0x3faf6000}, {0x3faf8000}, {0x3fafa000}, {0x3fafc000}, {0x3fafe000}, {0x3fb00000}, {0x3fb02000}, {0x3fb04000}, {0x3fb06000}, {0x3fb08000}, {0x3fb0a000}, {0x3fb0c000}, {0x3fb0e000}, {0x3fb10000}, {0x3fb12000}, {0x3fb14000}, {0x3fb16000}, {0x3fb18000}, {0x3fb1a000}, {0x3fb1c000}, {0x3fb1e000}, {0x3fb20000}, {0x3fb22000}, {0x3fb24000}, {0x3fb26000}, {0x3fb28000}, {0x3fb2a000}, {0x3fb2c000}, {0x3fb2e000}, {0x3fb30000}, {0x3fb32000}, {0x3fb34000}, {0x3fb36000}, {0x3fb38000}, {0x3fb3a000}, {0x3fb3c000}, {0x3fb3e000}, {0x3fb40000}, {0x3fb42000}, {0x3fb44000}, {0x3fb46000}, {0x3fb48000}, {0x3fb4a000}, {0x3fb4c000}, {0x3fb4e000}, {0x3fb50000}, {0x3fb52000}, {0x3fb54000}, {0x3fb56000}, {0x3fb58000}, {0x3fb5a000}, {0x3fb5c000}, {0x3fb5e000}, {0x3fb60000}, {0x3fb62000}, {0x3fb64000}, {0x3fb66000}, {0x3fb68000}, {0x3fb6a000}, {0x3fb6c000}, {0x3fb6e000}, {0x3fb70000}, {0x3fb72000}, {0x3fb74000}, {0x3fb76000}, {0x3fb78000}, {0x3fb7a000}, {0x3fb7c000}, {0x3fb7e000}, {0x3fb80000}, {0x3fb82000}, {0x3fb84000}, {0x3fb86000}, {0x3fb88000}, {0x3fb8a000}, {0x3fb8c000}, {0x3fb8e000}, {0x3fb90000}, {0x3fb92000}, {0x3fb94000}, {0x3fb96000}, {0x3fb98000}, {0x3fb9a000}, {0x3fb9c000}, {0x3fb9e000}, {0x3fba0000}, {0x3fba2000}, {0x3fba4000}, {0x3fba6000}, {0x3fba8000}, {0x3fbaa000}, {0x3fbac000}, {0x3fbae000}, {0x3fbb0000}, {0x3fbb2000}, {0x3fbb4000}, {0x3fbb6000}, {0x3fbb8000}, {0x3fbba000}, {0x3fbbc000}, {0x3fbbe000}, {0x3fbc0000}, {0x3fbc2000}, {0x3fbc4000}, {0x3fbc6000}, {0x3fbc8000}, {0x3fbca000}, {0x3fbcc000}, {0x3fbce000}, {0x3fbd0000}, {0x3fbd2000}, {0x3fbd4000}, {0x3fbd6000}, {0x3fbd8000}, {0x3fbda000}, {0x3fbdc000}, {0x3fbde000}, {0x3fbe0000}, {0x3fbe2000}, {0x3fbe4000}, {0x3fbe6000}, {0x3fbe8000}, {0x3fbea000}, {0x3fbec000}, {0x3fbee000}, {0x3fbf0000}, {0x3fbf2000}, {0x3fbf4000}, {0x3fbf6000}, {0x3fbf8000}, {0x3fbfa000}, {0x3fbfc000}, {0x3fbfe000}, {0x3fc00000}, {0x3fc02000}, {0x3fc04000}, {0x3fc06000}, {0x3fc08000}, {0x3fc0a000}, {0x3fc0c000}, {0x3fc0e000}, {0x3fc10000}, {0x3fc12000}, {0x3fc14000}, {0x3fc16000}, {0x3fc18000}, {0x3fc1a000}, {0x3fc1c000}, {0x3fc1e000}, {0x3fc20000}, {0x3fc22000}, {0x3fc24000}, {0x3fc26000}, {0x3fc28000}, {0x3fc2a000}, {0x3fc2c000}, {0x3fc2e000}, {0x3fc30000}, {0x3fc32000}, {0x3fc34000}, {0x3fc36000}, {0x3fc38000}, {0x3fc3a000}, {0x3fc3c000}, {0x3fc3e000}, {0x3fc40000}, {0x3fc42000}, {0x3fc44000}, {0x3fc46000}, {0x3fc48000}, {0x3fc4a000}, {0x3fc4c000}, {0x3fc4e000}, {0x3fc50000}, {0x3fc52000}, {0x3fc54000}, {0x3fc56000}, {0x3fc58000}, {0x3fc5a000}, {0x3fc5c000}, {0x3fc5e000}, {0x3fc60000}, {0x3fc62000}, {0x3fc64000}, {0x3fc66000}, {0x3fc68000}, {0x3fc6a000}, {0x3fc6c000}, {0x3fc6e000}, {0x3fc70000}, {0x3fc72000}, {0x3fc74000}, {0x3fc76000}, {0x3fc78000}, {0x3fc7a000}, {0x3fc7c000}, {0x3fc7e000}, {0x3fc80000}, {0x3fc82000}, {0x3fc84000}, {0x3fc86000}, {0x3fc88000}, {0x3fc8a000}, {0x3fc8c000}, {0x3fc8e000}, {0x3fc90000}, {0x3fc92000}, {0x3fc94000}, {0x3fc96000}, {0x3fc98000}, {0x3fc9a000}, {0x3fc9c000}, {0x3fc9e000}, {0x3fca0000}, {0x3fca2000}, {0x3fca4000}, {0x3fca6000}, {0x3fca8000}, {0x3fcaa000}, {0x3fcac000}, {0x3fcae000}, {0x3fcb0000}, {0x3fcb2000}, {0x3fcb4000}, {0x3fcb6000}, {0x3fcb8000}, {0x3fcba000}, {0x3fcbc000}, {0x3fcbe000}, {0x3fcc0000}, {0x3fcc2000}, {0x3fcc4000}, {0x3fcc6000}, {0x3fcc8000}, {0x3fcca000}, {0x3fccc000}, {0x3fcce000}, {0x3fcd0000}, {0x3fcd2000}, {0x3fcd4000}, {0x3fcd6000}, {0x3fcd8000}, {0x3fcda000}, {0x3fcdc000}, {0x3fcde000}, {0x3fce0000}, {0x3fce2000}, {0x3fce4000}, {0x3fce6000}, {0x3fce8000}, {0x3fcea000}, {0x3fcec000}, {0x3fcee000}, {0x3fcf0000}, {0x3fcf2000}, {0x3fcf4000}, {0x3fcf6000}, {0x3fcf8000}, {0x3fcfa000}, {0x3fcfc000}, {0x3fcfe000}, {0x3fd00000}, {0x3fd02000}, {0x3fd04000}, {0x3fd06000}, {0x3fd08000}, {0x3fd0a000}, {0x3fd0c000}, {0x3fd0e000}, {0x3fd10000}, {0x3fd12000}, {0x3fd14000}, {0x3fd16000}, {0x3fd18000}, {0x3fd1a000}, {0x3fd1c000}, {0x3fd1e000}, {0x3fd20000}, {0x3fd22000}, {0x3fd24000}, {0x3fd26000}, {0x3fd28000}, {0x3fd2a000}, {0x3fd2c000}, {0x3fd2e000}, {0x3fd30000}, {0x3fd32000}, {0x3fd34000}, {0x3fd36000}, {0x3fd38000}, {0x3fd3a000}, {0x3fd3c000}, {0x3fd3e000}, {0x3fd40000}, {0x3fd42000}, {0x3fd44000}, {0x3fd46000}, {0x3fd48000}, {0x3fd4a000}, {0x3fd4c000}, {0x3fd4e000}, {0x3fd50000}, {0x3fd52000}, {0x3fd54000}, {0x3fd56000}, {0x3fd58000}, {0x3fd5a000}, {0x3fd5c000}, {0x3fd5e000}, {0x3fd60000}, {0x3fd62000}, {0x3fd64000}, {0x3fd66000}, {0x3fd68000}, {0x3fd6a000}, {0x3fd6c000}, {0x3fd6e000}, {0x3fd70000}, {0x3fd72000}, {0x3fd74000}, {0x3fd76000}, {0x3fd78000}, {0x3fd7a000}, {0x3fd7c000}, {0x3fd7e000}, {0x3fd80000}, {0x3fd82000}, {0x3fd84000}, {0x3fd86000}, {0x3fd88000}, {0x3fd8a000}, {0x3fd8c000}, {0x3fd8e000}, {0x3fd90000}, {0x3fd92000}, {0x3fd94000}, {0x3fd96000}, {0x3fd98000}, {0x3fd9a000}, {0x3fd9c000}, {0x3fd9e000}, {0x3fda0000}, {0x3fda2000}, {0x3fda4000}, {0x3fda6000}, {0x3fda8000}, {0x3fdaa000}, {0x3fdac000}, {0x3fdae000}, {0x3fdb0000}, {0x3fdb2000}, {0x3fdb4000}, {0x3fdb6000}, {0x3fdb8000}, {0x3fdba000}, {0x3fdbc000}, {0x3fdbe000}, {0x3fdc0000}, {0x3fdc2000}, {0x3fdc4000}, {0x3fdc6000}, {0x3fdc8000}, {0x3fdca000}, {0x3fdcc000}, {0x3fdce000}, {0x3fdd0000}, {0x3fdd2000}, {0x3fdd4000}, {0x3fdd6000}, {0x3fdd8000}, {0x3fdda000}, {0x3fddc000}, {0x3fdde000}, {0x3fde0000}, {0x3fde2000}, {0x3fde4000}, {0x3fde6000}, {0x3fde8000}, {0x3fdea000}, {0x3fdec000}, {0x3fdee000}, {0x3fdf0000}, {0x3fdf2000}, {0x3fdf4000}, {0x3fdf6000}, {0x3fdf8000}, {0x3fdfa000}, {0x3fdfc000}, {0x3fdfe000}, {0x3fe00000}, {0x3fe02000}, {0x3fe04000}, {0x3fe06000}, {0x3fe08000}, {0x3fe0a000}, {0x3fe0c000}, {0x3fe0e000}, {0x3fe10000}, {0x3fe12000}, {0x3fe14000}, {0x3fe16000}, {0x3fe18000}, {0x3fe1a000}, {0x3fe1c000}, {0x3fe1e000}, {0x3fe20000}, {0x3fe22000}, {0x3fe24000}, {0x3fe26000}, {0x3fe28000}, {0x3fe2a000}, {0x3fe2c000}, {0x3fe2e000}, {0x3fe30000}, {0x3fe32000}, {0x3fe34000}, {0x3fe36000}, {0x3fe38000}, {0x3fe3a000}, {0x3fe3c000}, {0x3fe3e000}, {0x3fe40000}, {0x3fe42000}, {0x3fe44000}, {0x3fe46000}, {0x3fe48000}, {0x3fe4a000}, {0x3fe4c000}, {0x3fe4e000}, {0x3fe50000}, {0x3fe52000}, {0x3fe54000}, {0x3fe56000}, {0x3fe58000}, {0x3fe5a000}, {0x3fe5c000}, {0x3fe5e000}, {0x3fe60000}, {0x3fe62000}, {0x3fe64000}, {0x3fe66000}, {0x3fe68000}, {0x3fe6a000}, {0x3fe6c000}, {0x3fe6e000}, {0x3fe70000}, {0x3fe72000}, {0x3fe74000}, {0x3fe76000}, {0x3fe78000}, {0x3fe7a000}, {0x3fe7c000}, {0x3fe7e000}, {0x3fe80000}, {0x3fe82000}, {0x3fe84000}, {0x3fe86000}, {0x3fe88000}, {0x3fe8a000}, {0x3fe8c000}, {0x3fe8e000}, {0x3fe90000}, {0x3fe92000}, {0x3fe94000}, {0x3fe96000}, {0x3fe98000}, {0x3fe9a000}, {0x3fe9c000}, {0x3fe9e000}, {0x3fea0000}, {0x3fea2000}, {0x3fea4000}, {0x3fea6000}, {0x3fea8000}, {0x3feaa000}, {0x3feac000}, {0x3feae000}, {0x3feb0000}, {0x3feb2000}, {0x3feb4000}, {0x3feb6000}, {0x3feb8000}, {0x3feba000}, {0x3febc000}, {0x3febe000}, {0x3fec0000}, {0x3fec2000}, {0x3fec4000}, {0x3fec6000}, {0x3fec8000}, {0x3feca000}, {0x3fecc000}, {0x3fece000}, {0x3fed0000}, {0x3fed2000}, {0x3fed4000}, {0x3fed6000}, {0x3fed8000}, {0x3feda000}, {0x3fedc000}, {0x3fede000}, {0x3fee0000}, {0x3fee2000}, {0x3fee4000}, {0x3fee6000}, {0x3fee8000}, {0x3feea000}, {0x3feec000}, {0x3feee000}, {0x3fef0000}, {0x3fef2000}, {0x3fef4000}, {0x3fef6000}, {0x3fef8000}, {0x3fefa000}, {0x3fefc000}, {0x3fefe000}, {0x3ff00000}, {0x3ff02000}, {0x3ff04000}, {0x3ff06000}, {0x3ff08000}, {0x3ff0a000}, {0x3ff0c000}, {0x3ff0e000}, {0x3ff10000}, {0x3ff12000}, {0x3ff14000}, {0x3ff16000}, {0x3ff18000}, {0x3ff1a000}, {0x3ff1c000}, {0x3ff1e000}, {0x3ff20000}, {0x3ff22000}, {0x3ff24000}, {0x3ff26000}, {0x3ff28000}, {0x3ff2a000}, {0x3ff2c000}, {0x3ff2e000}, {0x3ff30000}, {0x3ff32000}, {0x3ff34000}, {0x3ff36000}, {0x3ff38000}, {0x3ff3a000}, {0x3ff3c000}, {0x3ff3e000}, {0x3ff40000}, {0x3ff42000}, {0x3ff44000}, {0x3ff46000}, {0x3ff48000}, {0x3ff4a000}, {0x3ff4c000}, {0x3ff4e000}, {0x3ff50000}, {0x3ff52000}, {0x3ff54000}, {0x3ff56000}, {0x3ff58000}, {0x3ff5a000}, {0x3ff5c000}, {0x3ff5e000}, {0x3ff60000}, {0x3ff62000}, {0x3ff64000}, {0x3ff66000}, {0x3ff68000}, {0x3ff6a000}, {0x3ff6c000}, {0x3ff6e000}, {0x3ff70000}, {0x3ff72000}, {0x3ff74000}, {0x3ff76000}, {0x3ff78000}, {0x3ff7a000}, {0x3ff7c000}, {0x3ff7e000}, {0x3ff80000}, {0x3ff82000}, {0x3ff84000}, {0x3ff86000}, {0x3ff88000}, {0x3ff8a000}, {0x3ff8c000}, {0x3ff8e000}, {0x3ff90000}, {0x3ff92000}, {0x3ff94000}, {0x3ff96000}, {0x3ff98000}, {0x3ff9a000}, {0x3ff9c000}, {0x3ff9e000}, {0x3ffa0000}, {0x3ffa2000}, {0x3ffa4000}, {0x3ffa6000}, {0x3ffa8000}, {0x3ffaa000}, {0x3ffac000}, {0x3ffae000}, {0x3ffb0000}, {0x3ffb2000}, {0x3ffb4000}, {0x3ffb6000}, {0x3ffb8000}, {0x3ffba000}, {0x3ffbc000}, {0x3ffbe000}, {0x3ffc0000}, {0x3ffc2000}, {0x3ffc4000}, {0x3ffc6000}, {0x3ffc8000}, {0x3ffca000}, {0x3ffcc000}, {0x3ffce000}, {0x3ffd0000}, {0x3ffd2000}, {0x3ffd4000}, {0x3ffd6000}, {0x3ffd8000}, {0x3ffda000}, {0x3ffdc000}, {0x3ffde000}, {0x3ffe0000}, {0x3ffe2000}, {0x3ffe4000}, {0x3ffe6000}, {0x3ffe8000}, {0x3ffea000}, {0x3ffec000}, {0x3ffee000}, {0x3fff0000}, {0x3fff2000}, {0x3fff4000}, {0x3fff6000}, {0x3fff8000}, {0x3fffa000}, {0x3fffc000}, {0x3fffe000}, {0x40000000}, {0x40002000}, {0x40004000}, {0x40006000}, {0x40008000}, {0x4000a000}, {0x4000c000}, {0x4000e000}, {0x40010000}, {0x40012000}, {0x40014000}, {0x40016000}, {0x40018000}, {0x4001a000}, {0x4001c000}, {0x4001e000}, {0x40020000}, {0x40022000}, {0x40024000}, {0x40026000}, {0x40028000}, {0x4002a000}, {0x4002c000}, {0x4002e000}, {0x40030000}, {0x40032000}, {0x40034000}, {0x40036000}, {0x40038000}, {0x4003a000}, {0x4003c000}, {0x4003e000}, {0x40040000}, {0x40042000}, {0x40044000}, {0x40046000}, {0x40048000}, {0x4004a000}, {0x4004c000}, {0x4004e000}, {0x40050000}, {0x40052000}, {0x40054000}, {0x40056000}, {0x40058000}, {0x4005a000}, {0x4005c000}, {0x4005e000}, {0x40060000}, {0x40062000}, {0x40064000}, {0x40066000}, {0x40068000}, {0x4006a000}, {0x4006c000}, {0x4006e000}, {0x40070000}, {0x40072000}, {0x40074000}, {0x40076000}, {0x40078000}, {0x4007a000}, {0x4007c000}, {0x4007e000}, {0x40080000}, {0x40082000}, {0x40084000}, {0x40086000}, {0x40088000}, {0x4008a000}, {0x4008c000}, {0x4008e000}, {0x40090000}, {0x40092000}, {0x40094000}, {0x40096000}, {0x40098000}, {0x4009a000}, {0x4009c000}, {0x4009e000}, {0x400a0000}, {0x400a2000}, {0x400a4000}, {0x400a6000}, {0x400a8000}, {0x400aa000}, {0x400ac000}, {0x400ae000}, {0x400b0000}, {0x400b2000}, {0x400b4000}, {0x400b6000}, {0x400b8000}, {0x400ba000}, {0x400bc000}, {0x400be000}, {0x400c0000}, {0x400c2000}, {0x400c4000}, {0x400c6000}, {0x400c8000}, {0x400ca000}, {0x400cc000}, {0x400ce000}, {0x400d0000}, {0x400d2000}, {0x400d4000}, {0x400d6000}, {0x400d8000}, {0x400da000}, {0x400dc000}, {0x400de000}, {0x400e0000}, {0x400e2000}, {0x400e4000}, {0x400e6000}, {0x400e8000}, {0x400ea000}, {0x400ec000}, {0x400ee000}, {0x400f0000}, {0x400f2000}, {0x400f4000}, {0x400f6000}, {0x400f8000}, {0x400fa000}, {0x400fc000}, {0x400fe000}, {0x40100000}, {0x40102000}, {0x40104000}, {0x40106000}, {0x40108000}, {0x4010a000}, {0x4010c000}, {0x4010e000}, {0x40110000}, {0x40112000}, {0x40114000}, {0x40116000}, {0x40118000}, {0x4011a000}, {0x4011c000}, {0x4011e000}, {0x40120000}, {0x40122000}, {0x40124000}, {0x40126000}, {0x40128000}, {0x4012a000}, {0x4012c000}, {0x4012e000}, {0x40130000}, {0x40132000}, {0x40134000}, {0x40136000}, {0x40138000}, {0x4013a000}, {0x4013c000}, {0x4013e000}, {0x40140000}, {0x40142000}, {0x40144000}, {0x40146000}, {0x40148000}, {0x4014a000}, {0x4014c000}, {0x4014e000}, {0x40150000}, {0x40152000}, {0x40154000}, {0x40156000}, {0x40158000}, {0x4015a000}, {0x4015c000}, {0x4015e000}, {0x40160000}, {0x40162000}, {0x40164000}, {0x40166000}, {0x40168000}, {0x4016a000}, {0x4016c000}, {0x4016e000}, {0x40170000}, {0x40172000}, {0x40174000}, {0x40176000}, {0x40178000}, {0x4017a000}, {0x4017c000}, {0x4017e000}, {0x40180000}, {0x40182000}, {0x40184000}, {0x40186000}, {0x40188000}, {0x4018a000}, {0x4018c000}, {0x4018e000}, {0x40190000}, {0x40192000}, {0x40194000}, {0x40196000}, {0x40198000}, {0x4019a000}, {0x4019c000}, {0x4019e000}, {0x401a0000}, {0x401a2000}, {0x401a4000}, {0x401a6000}, {0x401a8000}, {0x401aa000}, {0x401ac000}, {0x401ae000}, {0x401b0000}, {0x401b2000}, {0x401b4000}, {0x401b6000}, {0x401b8000}, {0x401ba000}, {0x401bc000}, {0x401be000}, {0x401c0000}, {0x401c2000}, {0x401c4000}, {0x401c6000}, {0x401c8000}, {0x401ca000}, {0x401cc000}, {0x401ce000}, {0x401d0000}, {0x401d2000}, {0x401d4000}, {0x401d6000}, {0x401d8000}, {0x401da000}, {0x401dc000}, {0x401de000}, {0x401e0000}, {0x401e2000}, {0x401e4000}, {0x401e6000}, {0x401e8000}, {0x401ea000}, {0x401ec000}, {0x401ee000}, {0x401f0000}, {0x401f2000}, {0x401f4000}, {0x401f6000}, {0x401f8000}, {0x401fa000}, {0x401fc000}, {0x401fe000}, {0x40200000}, {0x40202000}, {0x40204000}, {0x40206000}, {0x40208000}, {0x4020a000}, {0x4020c000}, {0x4020e000}, {0x40210000}, {0x40212000}, {0x40214000}, {0x40216000}, {0x40218000}, {0x4021a000}, {0x4021c000}, {0x4021e000}, {0x40220000}, {0x40222000}, {0x40224000}, {0x40226000}, {0x40228000}, {0x4022a000}, {0x4022c000}, {0x4022e000}, {0x40230000}, {0x40232000}, {0x40234000}, {0x40236000}, {0x40238000}, {0x4023a000}, {0x4023c000}, {0x4023e000}, {0x40240000}, {0x40242000}, {0x40244000}, {0x40246000}, {0x40248000}, {0x4024a000}, {0x4024c000}, {0x4024e000}, {0x40250000}, {0x40252000}, {0x40254000}, {0x40256000}, {0x40258000}, {0x4025a000}, {0x4025c000}, {0x4025e000}, {0x40260000}, {0x40262000}, {0x40264000}, {0x40266000}, {0x40268000}, {0x4026a000}, {0x4026c000}, {0x4026e000}, {0x40270000}, {0x40272000}, {0x40274000}, {0x40276000}, {0x40278000}, {0x4027a000}, {0x4027c000}, {0x4027e000}, {0x40280000}, {0x40282000}, {0x40284000}, {0x40286000}, {0x40288000}, {0x4028a000}, {0x4028c000}, {0x4028e000}, {0x40290000}, {0x40292000}, {0x40294000}, {0x40296000}, {0x40298000}, {0x4029a000}, {0x4029c000}, {0x4029e000}, {0x402a0000}, {0x402a2000}, {0x402a4000}, {0x402a6000}, {0x402a8000}, {0x402aa000}, {0x402ac000}, {0x402ae000}, {0x402b0000}, {0x402b2000}, {0x402b4000}, {0x402b6000}, {0x402b8000}, {0x402ba000}, {0x402bc000}, {0x402be000}, {0x402c0000}, {0x402c2000}, {0x402c4000}, {0x402c6000}, {0x402c8000}, {0x402ca000}, {0x402cc000}, {0x402ce000}, {0x402d0000}, {0x402d2000}, {0x402d4000}, {0x402d6000}, {0x402d8000}, {0x402da000}, {0x402dc000}, {0x402de000}, {0x402e0000}, {0x402e2000}, {0x402e4000}, {0x402e6000}, {0x402e8000}, {0x402ea000}, {0x402ec000}, {0x402ee000}, {0x402f0000}, {0x402f2000}, {0x402f4000}, {0x402f6000}, {0x402f8000}, {0x402fa000}, {0x402fc000}, {0x402fe000}, {0x40300000}, {0x40302000}, {0x40304000}, {0x40306000}, {0x40308000}, {0x4030a000}, {0x4030c000}, {0x4030e000}, {0x40310000}, {0x40312000}, {0x40314000}, {0x40316000}, {0x40318000}, {0x4031a000}, {0x4031c000}, {0x4031e000}, {0x40320000}, {0x40322000}, {0x40324000}, {0x40326000}, {0x40328000}, {0x4032a000}, {0x4032c000}, {0x4032e000}, {0x40330000}, {0x40332000}, {0x40334000}, {0x40336000}, {0x40338000}, {0x4033a000}, {0x4033c000}, {0x4033e000}, {0x40340000}, {0x40342000}, {0x40344000}, {0x40346000}, {0x40348000}, {0x4034a000}, {0x4034c000}, {0x4034e000}, {0x40350000}, {0x40352000}, {0x40354000}, {0x40356000}, {0x40358000}, {0x4035a000}, {0x4035c000}, {0x4035e000}, {0x40360000}, {0x40362000}, {0x40364000}, {0x40366000}, {0x40368000}, {0x4036a000}, {0x4036c000}, {0x4036e000}, {0x40370000}, {0x40372000}, {0x40374000}, {0x40376000}, {0x40378000}, {0x4037a000}, {0x4037c000}, {0x4037e000}, {0x40380000}, {0x40382000}, {0x40384000}, {0x40386000}, {0x40388000}, {0x4038a000}, {0x4038c000}, {0x4038e000}, {0x40390000}, {0x40392000}, {0x40394000}, {0x40396000}, {0x40398000}, {0x4039a000}, {0x4039c000}, {0x4039e000}, {0x403a0000}, {0x403a2000}, {0x403a4000}, {0x403a6000}, {0x403a8000}, {0x403aa000}, {0x403ac000}, {0x403ae000}, {0x403b0000}, {0x403b2000}, {0x403b4000}, {0x403b6000}, {0x403b8000}, {0x403ba000}, {0x403bc000}, {0x403be000}, {0x403c0000}, {0x403c2000}, {0x403c4000}, {0x403c6000}, {0x403c8000}, {0x403ca000}, {0x403cc000}, {0x403ce000}, {0x403d0000}, {0x403d2000}, {0x403d4000}, {0x403d6000}, {0x403d8000}, {0x403da000}, {0x403dc000}, {0x403de000}, {0x403e0000}, {0x403e2000}, {0x403e4000}, {0x403e6000}, {0x403e8000}, {0x403ea000}, {0x403ec000}, {0x403ee000}, {0x403f0000}, {0x403f2000}, {0x403f4000}, {0x403f6000}, {0x403f8000}, {0x403fa000}, {0x403fc000}, {0x403fe000}, {0x40400000}, {0x40402000}, {0x40404000}, {0x40406000}, {0x40408000}, {0x4040a000}, {0x4040c000}, {0x4040e000}, {0x40410000}, {0x40412000}, {0x40414000}, {0x40416000}, {0x40418000}, {0x4041a000}, {0x4041c000}, {0x4041e000}, {0x40420000}, {0x40422000}, {0x40424000}, {0x40426000}, {0x40428000}, {0x4042a000}, {0x4042c000}, {0x4042e000}, {0x40430000}, {0x40432000}, {0x40434000}, {0x40436000}, {0x40438000}, {0x4043a000}, {0x4043c000}, {0x4043e000}, {0x40440000}, {0x40442000}, {0x40444000}, {0x40446000}, {0x40448000}, {0x4044a000}, {0x4044c000}, {0x4044e000}, {0x40450000}, {0x40452000}, {0x40454000}, {0x40456000}, {0x40458000}, {0x4045a000}, {0x4045c000}, {0x4045e000}, {0x40460000}, {0x40462000}, {0x40464000}, {0x40466000}, {0x40468000}, {0x4046a000}, {0x4046c000}, {0x4046e000}, {0x40470000}, {0x40472000}, {0x40474000}, {0x40476000}, {0x40478000}, {0x4047a000}, {0x4047c000}, {0x4047e000}, {0x40480000}, {0x40482000}, {0x40484000}, {0x40486000}, {0x40488000}, {0x4048a000}, {0x4048c000}, {0x4048e000}, {0x40490000}, {0x40492000}, {0x40494000}, {0x40496000}, {0x40498000}, {0x4049a000}, {0x4049c000}, {0x4049e000}, {0x404a0000}, {0x404a2000}, {0x404a4000}, {0x404a6000}, {0x404a8000}, {0x404aa000}, {0x404ac000}, {0x404ae000}, {0x404b0000}, {0x404b2000}, {0x404b4000}, {0x404b6000}, {0x404b8000}, {0x404ba000}, {0x404bc000}, {0x404be000}, {0x404c0000}, {0x404c2000}, {0x404c4000}, {0x404c6000}, {0x404c8000}, {0x404ca000}, {0x404cc000}, {0x404ce000}, {0x404d0000}, {0x404d2000}, {0x404d4000}, {0x404d6000}, {0x404d8000}, {0x404da000}, {0x404dc000}, {0x404de000}, {0x404e0000}, {0x404e2000}, {0x404e4000}, {0x404e6000}, {0x404e8000}, {0x404ea000}, {0x404ec000}, {0x404ee000}, {0x404f0000}, {0x404f2000}, {0x404f4000}, {0x404f6000}, {0x404f8000}, {0x404fa000}, {0x404fc000}, {0x404fe000}, {0x40500000}, {0x40502000}, {0x40504000}, {0x40506000}, {0x40508000}, {0x4050a000}, {0x4050c000}, {0x4050e000}, {0x40510000}, {0x40512000}, {0x40514000}, {0x40516000}, {0x40518000}, {0x4051a000}, {0x4051c000}, {0x4051e000}, {0x40520000}, {0x40522000}, {0x40524000}, {0x40526000}, {0x40528000}, {0x4052a000}, {0x4052c000}, {0x4052e000}, {0x40530000}, {0x40532000}, {0x40534000}, {0x40536000}, {0x40538000}, {0x4053a000}, {0x4053c000}, {0x4053e000}, {0x40540000}, {0x40542000}, {0x40544000}, {0x40546000}, {0x40548000}, {0x4054a000}, {0x4054c000}, {0x4054e000}, {0x40550000}, {0x40552000}, {0x40554000}, {0x40556000}, {0x40558000}, {0x4055a000}, {0x4055c000}, {0x4055e000}, {0x40560000}, {0x40562000}, {0x40564000}, {0x40566000}, {0x40568000}, {0x4056a000}, {0x4056c000}, {0x4056e000}, {0x40570000}, {0x40572000}, {0x40574000}, {0x40576000}, {0x40578000}, {0x4057a000}, {0x4057c000}, {0x4057e000}, {0x40580000}, {0x40582000}, {0x40584000}, {0x40586000}, {0x40588000}, {0x4058a000}, {0x4058c000}, {0x4058e000}, {0x40590000}, {0x40592000}, {0x40594000}, {0x40596000}, {0x40598000}, {0x4059a000}, {0x4059c000}, {0x4059e000}, {0x405a0000}, {0x405a2000}, {0x405a4000}, {0x405a6000}, {0x405a8000}, {0x405aa000}, {0x405ac000}, {0x405ae000}, {0x405b0000}, {0x405b2000}, {0x405b4000}, {0x405b6000}, {0x405b8000}, {0x405ba000}, {0x405bc000}, {0x405be000}, {0x405c0000}, {0x405c2000}, {0x405c4000}, {0x405c6000}, {0x405c8000}, {0x405ca000}, {0x405cc000}, {0x405ce000}, {0x405d0000}, {0x405d2000}, {0x405d4000}, {0x405d6000}, {0x405d8000}, {0x405da000}, {0x405dc000}, {0x405de000}, {0x405e0000}, {0x405e2000}, {0x405e4000}, {0x405e6000}, {0x405e8000}, {0x405ea000}, {0x405ec000}, {0x405ee000}, {0x405f0000}, {0x405f2000}, {0x405f4000}, {0x405f6000}, {0x405f8000}, {0x405fa000}, {0x405fc000}, {0x405fe000}, {0x40600000}, {0x40602000}, {0x40604000}, {0x40606000}, {0x40608000}, {0x4060a000}, {0x4060c000}, {0x4060e000}, {0x40610000}, {0x40612000}, {0x40614000}, {0x40616000}, {0x40618000}, {0x4061a000}, {0x4061c000}, {0x4061e000}, {0x40620000}, {0x40622000}, {0x40624000}, {0x40626000}, {0x40628000}, {0x4062a000}, {0x4062c000}, {0x4062e000}, {0x40630000}, {0x40632000}, {0x40634000}, {0x40636000}, {0x40638000}, {0x4063a000}, {0x4063c000}, {0x4063e000}, {0x40640000}, {0x40642000}, {0x40644000}, {0x40646000}, {0x40648000}, {0x4064a000}, {0x4064c000}, {0x4064e000}, {0x40650000}, {0x40652000}, {0x40654000}, {0x40656000}, {0x40658000}, {0x4065a000}, {0x4065c000}, {0x4065e000}, {0x40660000}, {0x40662000}, {0x40664000}, {0x40666000}, {0x40668000}, {0x4066a000}, {0x4066c000}, {0x4066e000}, {0x40670000}, {0x40672000}, {0x40674000}, {0x40676000}, {0x40678000}, {0x4067a000}, {0x4067c000}, {0x4067e000}, {0x40680000}, {0x40682000}, {0x40684000}, {0x40686000}, {0x40688000}, {0x4068a000}, {0x4068c000}, {0x4068e000}, {0x40690000}, {0x40692000}, {0x40694000}, {0x40696000}, {0x40698000}, {0x4069a000}, {0x4069c000}, {0x4069e000}, {0x406a0000}, {0x406a2000}, {0x406a4000}, {0x406a6000}, {0x406a8000}, {0x406aa000}, {0x406ac000}, {0x406ae000}, {0x406b0000}, {0x406b2000}, {0x406b4000}, {0x406b6000}, {0x406b8000}, {0x406ba000}, {0x406bc000}, {0x406be000}, {0x406c0000}, {0x406c2000}, {0x406c4000}, {0x406c6000}, {0x406c8000}, {0x406ca000}, {0x406cc000}, {0x406ce000}, {0x406d0000}, {0x406d2000}, {0x406d4000}, {0x406d6000}, {0x406d8000}, {0x406da000}, {0x406dc000}, {0x406de000}, {0x406e0000}, {0x406e2000}, {0x406e4000}, {0x406e6000}, {0x406e8000}, {0x406ea000}, {0x406ec000}, {0x406ee000}, {0x406f0000}, {0x406f2000}, {0x406f4000}, {0x406f6000}, {0x406f8000}, {0x406fa000}, {0x406fc000}, {0x406fe000}, {0x40700000}, {0x40702000}, {0x40704000}, {0x40706000}, {0x40708000}, {0x4070a000}, {0x4070c000}, {0x4070e000}, {0x40710000}, {0x40712000}, {0x40714000}, {0x40716000}, {0x40718000}, {0x4071a000}, {0x4071c000}, {0x4071e000}, {0x40720000}, {0x40722000}, {0x40724000}, {0x40726000}, {0x40728000}, {0x4072a000}, {0x4072c000}, {0x4072e000}, {0x40730000}, {0x40732000}, {0x40734000}, {0x40736000}, {0x40738000}, {0x4073a000}, {0x4073c000}, {0x4073e000}, {0x40740000}, {0x40742000}, {0x40744000}, {0x40746000}, {0x40748000}, {0x4074a000}, {0x4074c000}, {0x4074e000}, {0x40750000}, {0x40752000}, {0x40754000}, {0x40756000}, {0x40758000}, {0x4075a000}, {0x4075c000}, {0x4075e000}, {0x40760000}, {0x40762000}, {0x40764000}, {0x40766000}, {0x40768000}, {0x4076a000}, {0x4076c000}, {0x4076e000}, {0x40770000}, {0x40772000}, {0x40774000}, {0x40776000}, {0x40778000}, {0x4077a000}, {0x4077c000}, {0x4077e000}, {0x40780000}, {0x40782000}, {0x40784000}, {0x40786000}, {0x40788000}, {0x4078a000}, {0x4078c000}, {0x4078e000}, {0x40790000}, {0x40792000}, {0x40794000}, {0x40796000}, {0x40798000}, {0x4079a000}, {0x4079c000}, {0x4079e000}, {0x407a0000}, {0x407a2000}, {0x407a4000}, {0x407a6000}, {0x407a8000}, {0x407aa000}, {0x407ac000}, {0x407ae000}, {0x407b0000}, {0x407b2000}, {0x407b4000}, {0x407b6000}, {0x407b8000}, {0x407ba000}, {0x407bc000}, {0x407be000}, {0x407c0000}, {0x407c2000}, {0x407c4000}, {0x407c6000}, {0x407c8000}, {0x407ca000}, {0x407cc000}, {0x407ce000}, {0x407d0000}, {0x407d2000}, {0x407d4000}, {0x407d6000}, {0x407d8000}, {0x407da000}, {0x407dc000}, {0x407de000}, {0x407e0000}, {0x407e2000}, {0x407e4000}, {0x407e6000}, {0x407e8000}, {0x407ea000}, {0x407ec000}, {0x407ee000}, {0x407f0000}, {0x407f2000}, {0x407f4000}, {0x407f6000}, {0x407f8000}, {0x407fa000}, {0x407fc000}, {0x407fe000}, {0x40800000}, {0x40802000}, {0x40804000}, {0x40806000}, {0x40808000}, {0x4080a000}, {0x4080c000}, {0x4080e000}, {0x40810000}, {0x40812000}, {0x40814000}, {0x40816000}, {0x40818000}, {0x4081a000}, {0x4081c000}, {0x4081e000}, {0x40820000}, {0x40822000}, {0x40824000}, {0x40826000}, {0x40828000}, {0x4082a000}, {0x4082c000}, {0x4082e000}, {0x40830000}, {0x40832000}, {0x40834000}, {0x40836000}, {0x40838000}, {0x4083a000}, {0x4083c000}, {0x4083e000}, {0x40840000}, {0x40842000}, {0x40844000}, {0x40846000}, {0x40848000}, {0x4084a000}, {0x4084c000}, {0x4084e000}, {0x40850000}, {0x40852000}, {0x40854000}, {0x40856000}, {0x40858000}, {0x4085a000}, {0x4085c000}, {0x4085e000}, {0x40860000}, {0x40862000}, {0x40864000}, {0x40866000}, {0x40868000}, {0x4086a000}, {0x4086c000}, {0x4086e000}, {0x40870000}, {0x40872000}, {0x40874000}, {0x40876000}, {0x40878000}, {0x4087a000}, {0x4087c000}, {0x4087e000}, {0x40880000}, {0x40882000}, {0x40884000}, {0x40886000}, {0x40888000}, {0x4088a000}, {0x4088c000}, {0x4088e000}, {0x40890000}, {0x40892000}, {0x40894000}, {0x40896000}, {0x40898000}, {0x4089a000}, {0x4089c000}, {0x4089e000}, {0x408a0000}, {0x408a2000}, {0x408a4000}, {0x408a6000}, {0x408a8000}, {0x408aa000}, {0x408ac000}, {0x408ae000}, {0x408b0000}, {0x408b2000}, {0x408b4000}, {0x408b6000}, {0x408b8000}, {0x408ba000}, {0x408bc000}, {0x408be000}, {0x408c0000}, {0x408c2000}, {0x408c4000}, {0x408c6000}, {0x408c8000}, {0x408ca000}, {0x408cc000}, {0x408ce000}, {0x408d0000}, {0x408d2000}, {0x408d4000}, {0x408d6000}, {0x408d8000}, {0x408da000}, {0x408dc000}, {0x408de000}, {0x408e0000}, {0x408e2000}, {0x408e4000}, {0x408e6000}, {0x408e8000}, {0x408ea000}, {0x408ec000}, {0x408ee000}, {0x408f0000}, {0x408f2000}, {0x408f4000}, {0x408f6000}, {0x408f8000}, {0x408fa000}, {0x408fc000}, {0x408fe000}, {0x40900000}, {0x40902000}, {0x40904000}, {0x40906000}, {0x40908000}, {0x4090a000}, {0x4090c000}, {0x4090e000}, {0x40910000}, {0x40912000}, {0x40914000}, {0x40916000}, {0x40918000}, {0x4091a000}, {0x4091c000}, {0x4091e000}, {0x40920000}, {0x40922000}, {0x40924000}, {0x40926000}, {0x40928000}, {0x4092a000}, {0x4092c000}, {0x4092e000}, {0x40930000}, {0x40932000}, {0x40934000}, {0x40936000}, {0x40938000}, {0x4093a000}, {0x4093c000}, {0x4093e000}, {0x40940000}, {0x40942000}, {0x40944000}, {0x40946000}, {0x40948000}, {0x4094a000}, {0x4094c000}, {0x4094e000}, {0x40950000}, {0x40952000}, {0x40954000}, {0x40956000}, {0x40958000}, {0x4095a000}, {0x4095c000}, {0x4095e000}, {0x40960000}, {0x40962000}, {0x40964000}, {0x40966000}, {0x40968000}, {0x4096a000}, {0x4096c000}, {0x4096e000}, {0x40970000}, {0x40972000}, {0x40974000}, {0x40976000}, {0x40978000}, {0x4097a000}, {0x4097c000}, {0x4097e000}, {0x40980000}, {0x40982000}, {0x40984000}, {0x40986000}, {0x40988000}, {0x4098a000}, {0x4098c000}, {0x4098e000}, {0x40990000}, {0x40992000}, {0x40994000}, {0x40996000}, {0x40998000}, {0x4099a000}, {0x4099c000}, {0x4099e000}, {0x409a0000}, {0x409a2000}, {0x409a4000}, {0x409a6000}, {0x409a8000}, {0x409aa000}, {0x409ac000}, {0x409ae000}, {0x409b0000}, {0x409b2000}, {0x409b4000}, {0x409b6000}, {0x409b8000}, {0x409ba000}, {0x409bc000}, {0x409be000}, {0x409c0000}, {0x409c2000}, {0x409c4000}, {0x409c6000}, {0x409c8000}, {0x409ca000}, {0x409cc000}, {0x409ce000}, {0x409d0000}, {0x409d2000}, {0x409d4000}, {0x409d6000}, {0x409d8000}, {0x409da000}, {0x409dc000}, {0x409de000}, {0x409e0000}, {0x409e2000}, {0x409e4000}, {0x409e6000}, {0x409e8000}, {0x409ea000}, {0x409ec000}, {0x409ee000}, {0x409f0000}, {0x409f2000}, {0x409f4000}, {0x409f6000}, {0x409f8000}, {0x409fa000}, {0x409fc000}, {0x409fe000}, {0x40a00000}, {0x40a02000}, {0x40a04000}, {0x40a06000}, {0x40a08000}, {0x40a0a000}, {0x40a0c000}, {0x40a0e000}, {0x40a10000}, {0x40a12000}, {0x40a14000}, {0x40a16000}, {0x40a18000}, {0x40a1a000}, {0x40a1c000}, {0x40a1e000}, {0x40a20000}, {0x40a22000}, {0x40a24000}, {0x40a26000}, {0x40a28000}, {0x40a2a000}, {0x40a2c000}, {0x40a2e000}, {0x40a30000}, {0x40a32000}, {0x40a34000}, {0x40a36000}, {0x40a38000}, {0x40a3a000}, {0x40a3c000}, {0x40a3e000}, {0x40a40000}, {0x40a42000}, {0x40a44000}, {0x40a46000}, {0x40a48000}, {0x40a4a000}, {0x40a4c000}, {0x40a4e000}, {0x40a50000}, {0x40a52000}, {0x40a54000}, {0x40a56000}, {0x40a58000}, {0x40a5a000}, {0x40a5c000}, {0x40a5e000}, {0x40a60000}, {0x40a62000}, {0x40a64000}, {0x40a66000}, {0x40a68000}, {0x40a6a000}, {0x40a6c000}, {0x40a6e000}, {0x40a70000}, {0x40a72000}, {0x40a74000}, {0x40a76000}, {0x40a78000}, {0x40a7a000}, {0x40a7c000}, {0x40a7e000}, {0x40a80000}, {0x40a82000}, {0x40a84000}, {0x40a86000}, {0x40a88000}, {0x40a8a000}, {0x40a8c000}, {0x40a8e000}, {0x40a90000}, {0x40a92000}, {0x40a94000}, {0x40a96000}, {0x40a98000}, {0x40a9a000}, {0x40a9c000}, {0x40a9e000}, {0x40aa0000}, {0x40aa2000}, {0x40aa4000}, {0x40aa6000}, {0x40aa8000}, {0x40aaa000}, {0x40aac000}, {0x40aae000}, {0x40ab0000}, {0x40ab2000}, {0x40ab4000}, {0x40ab6000}, {0x40ab8000}, {0x40aba000}, {0x40abc000}, {0x40abe000}, {0x40ac0000}, {0x40ac2000}, {0x40ac4000}, {0x40ac6000}, {0x40ac8000}, {0x40aca000}, {0x40acc000}, {0x40ace000}, {0x40ad0000}, {0x40ad2000}, {0x40ad4000}, {0x40ad6000}, {0x40ad8000}, {0x40ada000}, {0x40adc000}, {0x40ade000}, {0x40ae0000}, {0x40ae2000}, {0x40ae4000}, {0x40ae6000}, {0x40ae8000}, {0x40aea000}, {0x40aec000}, {0x40aee000}, {0x40af0000}, {0x40af2000}, {0x40af4000}, {0x40af6000}, {0x40af8000}, {0x40afa000}, {0x40afc000}, {0x40afe000}, {0x40b00000}, {0x40b02000}, {0x40b04000}, {0x40b06000}, {0x40b08000}, {0x40b0a000}, {0x40b0c000}, {0x40b0e000}, {0x40b10000}, {0x40b12000}, {0x40b14000}, {0x40b16000}, {0x40b18000}, {0x40b1a000}, {0x40b1c000}, {0x40b1e000}, {0x40b20000}, {0x40b22000}, {0x40b24000}, {0x40b26000}, {0x40b28000}, {0x40b2a000}, {0x40b2c000}, {0x40b2e000}, {0x40b30000}, {0x40b32000}, {0x40b34000}, {0x40b36000}, {0x40b38000}, {0x40b3a000}, {0x40b3c000}, {0x40b3e000}, {0x40b40000}, {0x40b42000}, {0x40b44000}, {0x40b46000}, {0x40b48000}, {0x40b4a000}, {0x40b4c000}, {0x40b4e000}, {0x40b50000}, {0x40b52000}, {0x40b54000}, {0x40b56000}, {0x40b58000}, {0x40b5a000}, {0x40b5c000}, {0x40b5e000}, {0x40b60000}, {0x40b62000}, {0x40b64000}, {0x40b66000}, {0x40b68000}, {0x40b6a000}, {0x40b6c000}, {0x40b6e000}, {0x40b70000}, {0x40b72000}, {0x40b74000}, {0x40b76000}, {0x40b78000}, {0x40b7a000}, {0x40b7c000}, {0x40b7e000}, {0x40b80000}, {0x40b82000}, {0x40b84000}, {0x40b86000}, {0x40b88000}, {0x40b8a000}, {0x40b8c000}, {0x40b8e000}, {0x40b90000}, {0x40b92000}, {0x40b94000}, {0x40b96000}, {0x40b98000}, {0x40b9a000}, {0x40b9c000}, {0x40b9e000}, {0x40ba0000}, {0x40ba2000}, {0x40ba4000}, {0x40ba6000}, {0x40ba8000}, {0x40baa000}, {0x40bac000}, {0x40bae000}, {0x40bb0000}, {0x40bb2000}, {0x40bb4000}, {0x40bb6000}, {0x40bb8000}, {0x40bba000}, {0x40bbc000}, {0x40bbe000}, {0x40bc0000}, {0x40bc2000}, {0x40bc4000}, {0x40bc6000}, {0x40bc8000}, {0x40bca000}, {0x40bcc000}, {0x40bce000}, {0x40bd0000}, {0x40bd2000}, {0x40bd4000}, {0x40bd6000}, {0x40bd8000}, {0x40bda000}, {0x40bdc000}, {0x40bde000}, {0x40be0000}, {0x40be2000}, {0x40be4000}, {0x40be6000}, {0x40be8000}, {0x40bea000}, {0x40bec000}, {0x40bee000}, {0x40bf0000}, {0x40bf2000}, {0x40bf4000}, {0x40bf6000}, {0x40bf8000}, {0x40bfa000}, {0x40bfc000}, {0x40bfe000}, {0x40c00000}, {0x40c02000}, {0x40c04000}, {0x40c06000}, {0x40c08000}, {0x40c0a000}, {0x40c0c000}, {0x40c0e000}, {0x40c10000}, {0x40c12000}, {0x40c14000}, {0x40c16000}, {0x40c18000}, {0x40c1a000}, {0x40c1c000}, {0x40c1e000}, {0x40c20000}, {0x40c22000}, {0x40c24000}, {0x40c26000}, {0x40c28000}, {0x40c2a000}, {0x40c2c000}, {0x40c2e000}, {0x40c30000}, {0x40c32000}, {0x40c34000}, {0x40c36000}, {0x40c38000}, {0x40c3a000}, {0x40c3c000}, {0x40c3e000}, {0x40c40000}, {0x40c42000}, {0x40c44000}, {0x40c46000}, {0x40c48000}, {0x40c4a000}, {0x40c4c000}, {0x40c4e000}, {0x40c50000}, {0x40c52000}, {0x40c54000}, {0x40c56000}, {0x40c58000}, {0x40c5a000}, {0x40c5c000}, {0x40c5e000}, {0x40c60000}, {0x40c62000}, {0x40c64000}, {0x40c66000}, {0x40c68000}, {0x40c6a000}, {0x40c6c000}, {0x40c6e000}, {0x40c70000}, {0x40c72000}, {0x40c74000}, {0x40c76000}, {0x40c78000}, {0x40c7a000}, {0x40c7c000}, {0x40c7e000}, {0x40c80000}, {0x40c82000}, {0x40c84000}, {0x40c86000}, {0x40c88000}, {0x40c8a000}, {0x40c8c000}, {0x40c8e000}, {0x40c90000}, {0x40c92000}, {0x40c94000}, {0x40c96000}, {0x40c98000}, {0x40c9a000}, {0x40c9c000}, {0x40c9e000}, {0x40ca0000}, {0x40ca2000}, {0x40ca4000}, {0x40ca6000}, {0x40ca8000}, {0x40caa000}, {0x40cac000}, {0x40cae000}, {0x40cb0000}, {0x40cb2000}, {0x40cb4000}, {0x40cb6000}, {0x40cb8000}, {0x40cba000}, {0x40cbc000}, {0x40cbe000}, {0x40cc0000}, {0x40cc2000}, {0x40cc4000}, {0x40cc6000}, {0x40cc8000}, {0x40cca000}, {0x40ccc000}, {0x40cce000}, {0x40cd0000}, {0x40cd2000}, {0x40cd4000}, {0x40cd6000}, {0x40cd8000}, {0x40cda000}, {0x40cdc000}, {0x40cde000}, {0x40ce0000}, {0x40ce2000}, {0x40ce4000}, {0x40ce6000}, {0x40ce8000}, {0x40cea000}, {0x40cec000}, {0x40cee000}, {0x40cf0000}, {0x40cf2000}, {0x40cf4000}, {0x40cf6000}, {0x40cf8000}, {0x40cfa000}, {0x40cfc000}, {0x40cfe000}, {0x40d00000}, {0x40d02000}, {0x40d04000}, {0x40d06000}, {0x40d08000}, {0x40d0a000}, {0x40d0c000}, {0x40d0e000}, {0x40d10000}, {0x40d12000}, {0x40d14000}, {0x40d16000}, {0x40d18000}, {0x40d1a000}, {0x40d1c000}, {0x40d1e000}, {0x40d20000}, {0x40d22000}, {0x40d24000}, {0x40d26000}, {0x40d28000}, {0x40d2a000}, {0x40d2c000}, {0x40d2e000}, {0x40d30000}, {0x40d32000}, {0x40d34000}, {0x40d36000}, {0x40d38000}, {0x40d3a000}, {0x40d3c000}, {0x40d3e000}, {0x40d40000}, {0x40d42000}, {0x40d44000}, {0x40d46000}, {0x40d48000}, {0x40d4a000}, {0x40d4c000}, {0x40d4e000}, {0x40d50000}, {0x40d52000}, {0x40d54000}, {0x40d56000}, {0x40d58000}, {0x40d5a000}, {0x40d5c000}, {0x40d5e000}, {0x40d60000}, {0x40d62000}, {0x40d64000}, {0x40d66000}, {0x40d68000}, {0x40d6a000}, {0x40d6c000}, {0x40d6e000}, {0x40d70000}, {0x40d72000}, {0x40d74000}, {0x40d76000}, {0x40d78000}, {0x40d7a000}, {0x40d7c000}, {0x40d7e000}, {0x40d80000}, {0x40d82000}, {0x40d84000}, {0x40d86000}, {0x40d88000}, {0x40d8a000}, {0x40d8c000}, {0x40d8e000}, {0x40d90000}, {0x40d92000}, {0x40d94000}, {0x40d96000}, {0x40d98000}, {0x40d9a000}, {0x40d9c000}, {0x40d9e000}, {0x40da0000}, {0x40da2000}, {0x40da4000}, {0x40da6000}, {0x40da8000}, {0x40daa000}, {0x40dac000}, {0x40dae000}, {0x40db0000}, {0x40db2000}, {0x40db4000}, {0x40db6000}, {0x40db8000}, {0x40dba000}, {0x40dbc000}, {0x40dbe000}, {0x40dc0000}, {0x40dc2000}, {0x40dc4000}, {0x40dc6000}, {0x40dc8000}, {0x40dca000}, {0x40dcc000}, {0x40dce000}, {0x40dd0000}, {0x40dd2000}, {0x40dd4000}, {0x40dd6000}, {0x40dd8000}, {0x40dda000}, {0x40ddc000}, {0x40dde000}, {0x40de0000}, {0x40de2000}, {0x40de4000}, {0x40de6000}, {0x40de8000}, {0x40dea000}, {0x40dec000}, {0x40dee000}, {0x40df0000}, {0x40df2000}, {0x40df4000}, {0x40df6000}, {0x40df8000}, {0x40dfa000}, {0x40dfc000}, {0x40dfe000}, {0x40e00000}, {0x40e02000}, {0x40e04000}, {0x40e06000}, {0x40e08000}, {0x40e0a000}, {0x40e0c000}, {0x40e0e000}, {0x40e10000}, {0x40e12000}, {0x40e14000}, {0x40e16000}, {0x40e18000}, {0x40e1a000}, {0x40e1c000}, {0x40e1e000}, {0x40e20000}, {0x40e22000}, {0x40e24000}, {0x40e26000}, {0x40e28000}, {0x40e2a000}, {0x40e2c000}, {0x40e2e000}, {0x40e30000}, {0x40e32000}, {0x40e34000}, {0x40e36000}, {0x40e38000}, {0x40e3a000}, {0x40e3c000}, {0x40e3e000}, {0x40e40000}, {0x40e42000}, {0x40e44000}, {0x40e46000}, {0x40e48000}, {0x40e4a000}, {0x40e4c000}, {0x40e4e000}, {0x40e50000}, {0x40e52000}, {0x40e54000}, {0x40e56000}, {0x40e58000}, {0x40e5a000}, {0x40e5c000}, {0x40e5e000}, {0x40e60000}, {0x40e62000}, {0x40e64000}, {0x40e66000}, {0x40e68000}, {0x40e6a000}, {0x40e6c000}, {0x40e6e000}, {0x40e70000}, {0x40e72000}, {0x40e74000}, {0x40e76000}, {0x40e78000}, {0x40e7a000}, {0x40e7c000}, {0x40e7e000}, {0x40e80000}, {0x40e82000}, {0x40e84000}, {0x40e86000}, {0x40e88000}, {0x40e8a000}, {0x40e8c000}, {0x40e8e000}, {0x40e90000}, {0x40e92000}, {0x40e94000}, {0x40e96000}, {0x40e98000}, {0x40e9a000}, {0x40e9c000}, {0x40e9e000}, {0x40ea0000}, {0x40ea2000}, {0x40ea4000}, {0x40ea6000}, {0x40ea8000}, {0x40eaa000}, {0x40eac000}, {0x40eae000}, {0x40eb0000}, {0x40eb2000}, {0x40eb4000}, {0x40eb6000}, {0x40eb8000}, {0x40eba000}, {0x40ebc000}, {0x40ebe000}, {0x40ec0000}, {0x40ec2000}, {0x40ec4000}, {0x40ec6000}, {0x40ec8000}, {0x40eca000}, {0x40ecc000}, {0x40ece000}, {0x40ed0000}, {0x40ed2000}, {0x40ed4000}, {0x40ed6000}, {0x40ed8000}, {0x40eda000}, {0x40edc000}, {0x40ede000}, {0x40ee0000}, {0x40ee2000}, {0x40ee4000}, {0x40ee6000}, {0x40ee8000}, {0x40eea000}, {0x40eec000}, {0x40eee000}, {0x40ef0000}, {0x40ef2000}, {0x40ef4000}, {0x40ef6000}, {0x40ef8000}, {0x40efa000}, {0x40efc000}, {0x40efe000}, {0x40f00000}, {0x40f02000}, {0x40f04000}, {0x40f06000}, {0x40f08000}, {0x40f0a000}, {0x40f0c000}, {0x40f0e000}, {0x40f10000}, {0x40f12000}, {0x40f14000}, {0x40f16000}, {0x40f18000}, {0x40f1a000}, {0x40f1c000}, {0x40f1e000}, {0x40f20000}, {0x40f22000}, {0x40f24000}, {0x40f26000}, {0x40f28000}, {0x40f2a000}, {0x40f2c000}, {0x40f2e000}, {0x40f30000}, {0x40f32000}, {0x40f34000}, {0x40f36000}, {0x40f38000}, {0x40f3a000}, {0x40f3c000}, {0x40f3e000}, {0x40f40000}, {0x40f42000}, {0x40f44000}, {0x40f46000}, {0x40f48000}, {0x40f4a000}, {0x40f4c000}, {0x40f4e000}, {0x40f50000}, {0x40f52000}, {0x40f54000}, {0x40f56000}, {0x40f58000}, {0x40f5a000}, {0x40f5c000}, {0x40f5e000}, {0x40f60000}, {0x40f62000}, {0x40f64000}, {0x40f66000}, {0x40f68000}, {0x40f6a000}, {0x40f6c000}, {0x40f6e000}, {0x40f70000}, {0x40f72000}, {0x40f74000}, {0x40f76000}, {0x40f78000}, {0x40f7a000}, {0x40f7c000}, {0x40f7e000}, {0x40f80000}, {0x40f82000}, {0x40f84000}, {0x40f86000}, {0x40f88000}, {0x40f8a000}, {0x40f8c000}, {0x40f8e000}, {0x40f90000}, {0x40f92000}, {0x40f94000}, {0x40f96000}, {0x40f98000}, {0x40f9a000}, {0x40f9c000}, {0x40f9e000}, {0x40fa0000}, {0x40fa2000}, {0x40fa4000}, {0x40fa6000}, {0x40fa8000}, {0x40faa000}, {0x40fac000}, {0x40fae000}, {0x40fb0000}, {0x40fb2000}, {0x40fb4000}, {0x40fb6000}, {0x40fb8000}, {0x40fba000}, {0x40fbc000}, {0x40fbe000}, {0x40fc0000}, {0x40fc2000}, {0x40fc4000}, {0x40fc6000}, {0x40fc8000}, {0x40fca000}, {0x40fcc000}, {0x40fce000}, {0x40fd0000}, {0x40fd2000}, {0x40fd4000}, {0x40fd6000}, {0x40fd8000}, {0x40fda000}, {0x40fdc000}, {0x40fde000}, {0x40fe0000}, {0x40fe2000}, {0x40fe4000}, {0x40fe6000}, {0x40fe8000}, {0x40fea000}, {0x40fec000}, {0x40fee000}, {0x40ff0000}, {0x40ff2000}, {0x40ff4000}, {0x40ff6000}, {0x40ff8000}, {0x40ffa000}, {0x40ffc000}, {0x40ffe000}, {0x41000000}, {0x41002000}, {0x41004000}, {0x41006000}, {0x41008000}, {0x4100a000}, {0x4100c000}, {0x4100e000}, {0x41010000}, {0x41012000}, {0x41014000}, {0x41016000}, {0x41018000}, {0x4101a000}, {0x4101c000}, {0x4101e000}, {0x41020000}, {0x41022000}, {0x41024000}, {0x41026000}, {0x41028000}, {0x4102a000}, {0x4102c000}, {0x4102e000}, {0x41030000}, {0x41032000}, {0x41034000}, {0x41036000}, {0x41038000}, {0x4103a000}, {0x4103c000}, {0x4103e000}, {0x41040000}, {0x41042000}, {0x41044000}, {0x41046000}, {0x41048000}, {0x4104a000}, {0x4104c000}, {0x4104e000}, {0x41050000}, {0x41052000}, {0x41054000}, {0x41056000}, {0x41058000}, {0x4105a000}, {0x4105c000}, {0x4105e000}, {0x41060000}, {0x41062000}, {0x41064000}, {0x41066000}, {0x41068000}, {0x4106a000}, {0x4106c000}, {0x4106e000}, {0x41070000}, {0x41072000}, {0x41074000}, {0x41076000}, {0x41078000}, {0x4107a000}, {0x4107c000}, {0x4107e000}, {0x41080000}, {0x41082000}, {0x41084000}, {0x41086000}, {0x41088000}, {0x4108a000}, {0x4108c000}, {0x4108e000}, {0x41090000}, {0x41092000}, {0x41094000}, {0x41096000}, {0x41098000}, {0x4109a000}, {0x4109c000}, {0x4109e000}, {0x410a0000}, {0x410a2000}, {0x410a4000}, {0x410a6000}, {0x410a8000}, {0x410aa000}, {0x410ac000}, {0x410ae000}, {0x410b0000}, {0x410b2000}, {0x410b4000}, {0x410b6000}, {0x410b8000}, {0x410ba000}, {0x410bc000}, {0x410be000}, {0x410c0000}, {0x410c2000}, {0x410c4000}, {0x410c6000}, {0x410c8000}, {0x410ca000}, {0x410cc000}, {0x410ce000}, {0x410d0000}, {0x410d2000}, {0x410d4000}, {0x410d6000}, {0x410d8000}, {0x410da000}, {0x410dc000}, {0x410de000}, {0x410e0000}, {0x410e2000}, {0x410e4000}, {0x410e6000}, {0x410e8000}, {0x410ea000}, {0x410ec000}, {0x410ee000}, {0x410f0000}, {0x410f2000}, {0x410f4000}, {0x410f6000}, {0x410f8000}, {0x410fa000}, {0x410fc000}, {0x410fe000}, {0x41100000}, {0x41102000}, {0x41104000}, {0x41106000}, {0x41108000}, {0x4110a000}, {0x4110c000}, {0x4110e000}, {0x41110000}, {0x41112000}, {0x41114000}, {0x41116000}, {0x41118000}, {0x4111a000}, {0x4111c000}, {0x4111e000}, {0x41120000}, {0x41122000}, {0x41124000}, {0x41126000}, {0x41128000}, {0x4112a000}, {0x4112c000}, {0x4112e000}, {0x41130000}, {0x41132000}, {0x41134000}, {0x41136000}, {0x41138000}, {0x4113a000}, {0x4113c000}, {0x4113e000}, {0x41140000}, {0x41142000}, {0x41144000}, {0x41146000}, {0x41148000}, {0x4114a000}, {0x4114c000}, {0x4114e000}, {0x41150000}, {0x41152000}, {0x41154000}, {0x41156000}, {0x41158000}, {0x4115a000}, {0x4115c000}, {0x4115e000}, {0x41160000}, {0x41162000}, {0x41164000}, {0x41166000}, {0x41168000}, {0x4116a000}, {0x4116c000}, {0x4116e000}, {0x41170000}, {0x41172000}, {0x41174000}, {0x41176000}, {0x41178000}, {0x4117a000}, {0x4117c000}, {0x4117e000}, {0x41180000}, {0x41182000}, {0x41184000}, {0x41186000}, {0x41188000}, {0x4118a000}, {0x4118c000}, {0x4118e000}, {0x41190000}, {0x41192000}, {0x41194000}, {0x41196000}, {0x41198000}, {0x4119a000}, {0x4119c000}, {0x4119e000}, {0x411a0000}, {0x411a2000}, {0x411a4000}, {0x411a6000}, {0x411a8000}, {0x411aa000}, {0x411ac000}, {0x411ae000}, {0x411b0000}, {0x411b2000}, {0x411b4000}, {0x411b6000}, {0x411b8000}, {0x411ba000}, {0x411bc000}, {0x411be000}, {0x411c0000}, {0x411c2000}, {0x411c4000}, {0x411c6000}, {0x411c8000}, {0x411ca000}, {0x411cc000}, {0x411ce000}, {0x411d0000}, {0x411d2000}, {0x411d4000}, {0x411d6000}, {0x411d8000}, {0x411da000}, {0x411dc000}, {0x411de000}, {0x411e0000}, {0x411e2000}, {0x411e4000}, {0x411e6000}, {0x411e8000}, {0x411ea000}, {0x411ec000}, {0x411ee000}, {0x411f0000}, {0x411f2000}, {0x411f4000}, {0x411f6000}, {0x411f8000}, {0x411fa000}, {0x411fc000}, {0x411fe000}, {0x41200000}, {0x41202000}, {0x41204000}, {0x41206000}, {0x41208000}, {0x4120a000}, {0x4120c000}, {0x4120e000}, {0x41210000}, {0x41212000}, {0x41214000}, {0x41216000}, {0x41218000}, {0x4121a000}, {0x4121c000}, {0x4121e000}, {0x41220000}, {0x41222000}, {0x41224000}, {0x41226000}, {0x41228000}, {0x4122a000}, {0x4122c000}, {0x4122e000}, {0x41230000}, {0x41232000}, {0x41234000}, {0x41236000}, {0x41238000}, {0x4123a000}, {0x4123c000}, {0x4123e000}, {0x41240000}, {0x41242000}, {0x41244000}, {0x41246000}, {0x41248000}, {0x4124a000}, {0x4124c000}, {0x4124e000}, {0x41250000}, {0x41252000}, {0x41254000}, {0x41256000}, {0x41258000}, {0x4125a000}, {0x4125c000}, {0x4125e000}, {0x41260000}, {0x41262000}, {0x41264000}, {0x41266000}, {0x41268000}, {0x4126a000}, {0x4126c000}, {0x4126e000}, {0x41270000}, {0x41272000}, {0x41274000}, {0x41276000}, {0x41278000}, {0x4127a000}, {0x4127c000}, {0x4127e000}, {0x41280000}, {0x41282000}, {0x41284000}, {0x41286000}, {0x41288000}, {0x4128a000}, {0x4128c000}, {0x4128e000}, {0x41290000}, {0x41292000}, {0x41294000}, {0x41296000}, {0x41298000}, {0x4129a000}, {0x4129c000}, {0x4129e000}, {0x412a0000}, {0x412a2000}, {0x412a4000}, {0x412a6000}, {0x412a8000}, {0x412aa000}, {0x412ac000}, {0x412ae000}, {0x412b0000}, {0x412b2000}, {0x412b4000}, {0x412b6000}, {0x412b8000}, {0x412ba000}, {0x412bc000}, {0x412be000}, {0x412c0000}, {0x412c2000}, {0x412c4000}, {0x412c6000}, {0x412c8000}, {0x412ca000}, {0x412cc000}, {0x412ce000}, {0x412d0000}, {0x412d2000}, {0x412d4000}, {0x412d6000}, {0x412d8000}, {0x412da000}, {0x412dc000}, {0x412de000}, {0x412e0000}, {0x412e2000}, {0x412e4000}, {0x412e6000}, {0x412e8000}, {0x412ea000}, {0x412ec000}, {0x412ee000}, {0x412f0000}, {0x412f2000}, {0x412f4000}, {0x412f6000}, {0x412f8000}, {0x412fa000}, {0x412fc000}, {0x412fe000}, {0x41300000}, {0x41302000}, {0x41304000}, {0x41306000}, {0x41308000}, {0x4130a000}, {0x4130c000}, {0x4130e000}, {0x41310000}, {0x41312000}, {0x41314000}, {0x41316000}, {0x41318000}, {0x4131a000}, {0x4131c000}, {0x4131e000}, {0x41320000}, {0x41322000}, {0x41324000}, {0x41326000}, {0x41328000}, {0x4132a000}, {0x4132c000}, {0x4132e000}, {0x41330000}, {0x41332000}, {0x41334000}, {0x41336000}, {0x41338000}, {0x4133a000}, {0x4133c000}, {0x4133e000}, {0x41340000}, {0x41342000}, {0x41344000}, {0x41346000}, {0x41348000}, {0x4134a000}, {0x4134c000}, {0x4134e000}, {0x41350000}, {0x41352000}, {0x41354000}, {0x41356000}, {0x41358000}, {0x4135a000}, {0x4135c000}, {0x4135e000}, {0x41360000}, {0x41362000}, {0x41364000}, {0x41366000}, {0x41368000}, {0x4136a000}, {0x4136c000}, {0x4136e000}, {0x41370000}, {0x41372000}, {0x41374000}, {0x41376000}, {0x41378000}, {0x4137a000}, {0x4137c000}, {0x4137e000}, {0x41380000}, {0x41382000}, {0x41384000}, {0x41386000}, {0x41388000}, {0x4138a000}, {0x4138c000}, {0x4138e000}, {0x41390000}, {0x41392000}, {0x41394000}, {0x41396000}, {0x41398000}, {0x4139a000}, {0x4139c000}, {0x4139e000}, {0x413a0000}, {0x413a2000}, {0x413a4000}, {0x413a6000}, {0x413a8000}, {0x413aa000}, {0x413ac000}, {0x413ae000}, {0x413b0000}, {0x413b2000}, {0x413b4000}, {0x413b6000}, {0x413b8000}, {0x413ba000}, {0x413bc000}, {0x413be000}, {0x413c0000}, {0x413c2000}, {0x413c4000}, {0x413c6000}, {0x413c8000}, {0x413ca000}, {0x413cc000}, {0x413ce000}, {0x413d0000}, {0x413d2000}, {0x413d4000}, {0x413d6000}, {0x413d8000}, {0x413da000}, {0x413dc000}, {0x413de000}, {0x413e0000}, {0x413e2000}, {0x413e4000}, {0x413e6000}, {0x413e8000}, {0x413ea000}, {0x413ec000}, {0x413ee000}, {0x413f0000}, {0x413f2000}, {0x413f4000}, {0x413f6000}, {0x413f8000}, {0x413fa000}, {0x413fc000}, {0x413fe000}, {0x41400000}, {0x41402000}, {0x41404000}, {0x41406000}, {0x41408000}, {0x4140a000}, {0x4140c000}, {0x4140e000}, {0x41410000}, {0x41412000}, {0x41414000}, {0x41416000}, {0x41418000}, {0x4141a000}, {0x4141c000}, {0x4141e000}, {0x41420000}, {0x41422000}, {0x41424000}, {0x41426000}, {0x41428000}, {0x4142a000}, {0x4142c000}, {0x4142e000}, {0x41430000}, {0x41432000}, {0x41434000}, {0x41436000}, {0x41438000}, {0x4143a000}, {0x4143c000}, {0x4143e000}, {0x41440000}, {0x41442000}, {0x41444000}, {0x41446000}, {0x41448000}, {0x4144a000}, {0x4144c000}, {0x4144e000}, {0x41450000}, {0x41452000}, {0x41454000}, {0x41456000}, {0x41458000}, {0x4145a000}, {0x4145c000}, {0x4145e000}, {0x41460000}, {0x41462000}, {0x41464000}, {0x41466000}, {0x41468000}, {0x4146a000}, {0x4146c000}, {0x4146e000}, {0x41470000}, {0x41472000}, {0x41474000}, {0x41476000}, {0x41478000}, {0x4147a000}, {0x4147c000}, {0x4147e000}, {0x41480000}, {0x41482000}, {0x41484000}, {0x41486000}, {0x41488000}, {0x4148a000}, {0x4148c000}, {0x4148e000}, {0x41490000}, {0x41492000}, {0x41494000}, {0x41496000}, {0x41498000}, {0x4149a000}, {0x4149c000}, {0x4149e000}, {0x414a0000}, {0x414a2000}, {0x414a4000}, {0x414a6000}, {0x414a8000}, {0x414aa000}, {0x414ac000}, {0x414ae000}, {0x414b0000}, {0x414b2000}, {0x414b4000}, {0x414b6000}, {0x414b8000}, {0x414ba000}, {0x414bc000}, {0x414be000}, {0x414c0000}, {0x414c2000}, {0x414c4000}, {0x414c6000}, {0x414c8000}, {0x414ca000}, {0x414cc000}, {0x414ce000}, {0x414d0000}, {0x414d2000}, {0x414d4000}, {0x414d6000}, {0x414d8000}, {0x414da000}, {0x414dc000}, {0x414de000}, {0x414e0000}, {0x414e2000}, {0x414e4000}, {0x414e6000}, {0x414e8000}, {0x414ea000}, {0x414ec000}, {0x414ee000}, {0x414f0000}, {0x414f2000}, {0x414f4000}, {0x414f6000}, {0x414f8000}, {0x414fa000}, {0x414fc000}, {0x414fe000}, {0x41500000}, {0x41502000}, {0x41504000}, {0x41506000}, {0x41508000}, {0x4150a000}, {0x4150c000}, {0x4150e000}, {0x41510000}, {0x41512000}, {0x41514000}, {0x41516000}, {0x41518000}, {0x4151a000}, {0x4151c000}, {0x4151e000}, {0x41520000}, {0x41522000}, {0x41524000}, {0x41526000}, {0x41528000}, {0x4152a000}, {0x4152c000}, {0x4152e000}, {0x41530000}, {0x41532000}, {0x41534000}, {0x41536000}, {0x41538000}, {0x4153a000}, {0x4153c000}, {0x4153e000}, {0x41540000}, {0x41542000}, {0x41544000}, {0x41546000}, {0x41548000}, {0x4154a000}, {0x4154c000}, {0x4154e000}, {0x41550000}, {0x41552000}, {0x41554000}, {0x41556000}, {0x41558000}, {0x4155a000}, {0x4155c000}, {0x4155e000}, {0x41560000}, {0x41562000}, {0x41564000}, {0x41566000}, {0x41568000}, {0x4156a000}, {0x4156c000}, {0x4156e000}, {0x41570000}, {0x41572000}, {0x41574000}, {0x41576000}, {0x41578000}, {0x4157a000}, {0x4157c000}, {0x4157e000}, {0x41580000}, {0x41582000}, {0x41584000}, {0x41586000}, {0x41588000}, {0x4158a000}, {0x4158c000}, {0x4158e000}, {0x41590000}, {0x41592000}, {0x41594000}, {0x41596000}, {0x41598000}, {0x4159a000}, {0x4159c000}, {0x4159e000}, {0x415a0000}, {0x415a2000}, {0x415a4000}, {0x415a6000}, {0x415a8000}, {0x415aa000}, {0x415ac000}, {0x415ae000}, {0x415b0000}, {0x415b2000}, {0x415b4000}, {0x415b6000}, {0x415b8000}, {0x415ba000}, {0x415bc000}, {0x415be000}, {0x415c0000}, {0x415c2000}, {0x415c4000}, {0x415c6000}, {0x415c8000}, {0x415ca000}, {0x415cc000}, {0x415ce000}, {0x415d0000}, {0x415d2000}, {0x415d4000}, {0x415d6000}, {0x415d8000}, {0x415da000}, {0x415dc000}, {0x415de000}, {0x415e0000}, {0x415e2000}, {0x415e4000}, {0x415e6000}, {0x415e8000}, {0x415ea000}, {0x415ec000}, {0x415ee000}, {0x415f0000}, {0x415f2000}, {0x415f4000}, {0x415f6000}, {0x415f8000}, {0x415fa000}, {0x415fc000}, {0x415fe000}, {0x41600000}, {0x41602000}, {0x41604000}, {0x41606000}, {0x41608000}, {0x4160a000}, {0x4160c000}, {0x4160e000}, {0x41610000}, {0x41612000}, {0x41614000}, {0x41616000}, {0x41618000}, {0x4161a000}, {0x4161c000}, {0x4161e000}, {0x41620000}, {0x41622000}, {0x41624000}, {0x41626000}, {0x41628000}, {0x4162a000}, {0x4162c000}, {0x4162e000}, {0x41630000}, {0x41632000}, {0x41634000}, {0x41636000}, {0x41638000}, {0x4163a000}, {0x4163c000}, {0x4163e000}, {0x41640000}, {0x41642000}, {0x41644000}, {0x41646000}, {0x41648000}, {0x4164a000}, {0x4164c000}, {0x4164e000}, {0x41650000}, {0x41652000}, {0x41654000}, {0x41656000}, {0x41658000}, {0x4165a000}, {0x4165c000}, {0x4165e000}, {0x41660000}, {0x41662000}, {0x41664000}, {0x41666000}, {0x41668000}, {0x4166a000}, {0x4166c000}, {0x4166e000}, {0x41670000}, {0x41672000}, {0x41674000}, {0x41676000}, {0x41678000}, {0x4167a000}, {0x4167c000}, {0x4167e000}, {0x41680000}, {0x41682000}, {0x41684000}, {0x41686000}, {0x41688000}, {0x4168a000}, {0x4168c000}, {0x4168e000}, {0x41690000}, {0x41692000}, {0x41694000}, {0x41696000}, {0x41698000}, {0x4169a000}, {0x4169c000}, {0x4169e000}, {0x416a0000}, {0x416a2000}, {0x416a4000}, {0x416a6000}, {0x416a8000}, {0x416aa000}, {0x416ac000}, {0x416ae000}, {0x416b0000}, {0x416b2000}, {0x416b4000}, {0x416b6000}, {0x416b8000}, {0x416ba000}, {0x416bc000}, {0x416be000}, {0x416c0000}, {0x416c2000}, {0x416c4000}, {0x416c6000}, {0x416c8000}, {0x416ca000}, {0x416cc000}, {0x416ce000}, {0x416d0000}, {0x416d2000}, {0x416d4000}, {0x416d6000}, {0x416d8000}, {0x416da000}, {0x416dc000}, {0x416de000}, {0x416e0000}, {0x416e2000}, {0x416e4000}, {0x416e6000}, {0x416e8000}, {0x416ea000}, {0x416ec000}, {0x416ee000}, {0x416f0000}, {0x416f2000}, {0x416f4000}, {0x416f6000}, {0x416f8000}, {0x416fa000}, {0x416fc000}, {0x416fe000}, {0x41700000}, {0x41702000}, {0x41704000}, {0x41706000}, {0x41708000}, {0x4170a000}, {0x4170c000}, {0x4170e000}, {0x41710000}, {0x41712000}, {0x41714000}, {0x41716000}, {0x41718000}, {0x4171a000}, {0x4171c000}, {0x4171e000}, {0x41720000}, {0x41722000}, {0x41724000}, {0x41726000}, {0x41728000}, {0x4172a000}, {0x4172c000}, {0x4172e000}, {0x41730000}, {0x41732000}, {0x41734000}, {0x41736000}, {0x41738000}, {0x4173a000}, {0x4173c000}, {0x4173e000}, {0x41740000}, {0x41742000}, {0x41744000}, {0x41746000}, {0x41748000}, {0x4174a000}, {0x4174c000}, {0x4174e000}, {0x41750000}, {0x41752000}, {0x41754000}, {0x41756000}, {0x41758000}, {0x4175a000}, {0x4175c000}, {0x4175e000}, {0x41760000}, {0x41762000}, {0x41764000}, {0x41766000}, {0x41768000}, {0x4176a000}, {0x4176c000}, {0x4176e000}, {0x41770000}, {0x41772000}, {0x41774000}, {0x41776000}, {0x41778000}, {0x4177a000}, {0x4177c000}, {0x4177e000}, {0x41780000}, {0x41782000}, {0x41784000}, {0x41786000}, {0x41788000}, {0x4178a000}, {0x4178c000}, {0x4178e000}, {0x41790000}, {0x41792000}, {0x41794000}, {0x41796000}, {0x41798000}, {0x4179a000}, {0x4179c000}, {0x4179e000}, {0x417a0000}, {0x417a2000}, {0x417a4000}, {0x417a6000}, {0x417a8000}, {0x417aa000}, {0x417ac000}, {0x417ae000}, {0x417b0000}, {0x417b2000}, {0x417b4000}, {0x417b6000}, {0x417b8000}, {0x417ba000}, {0x417bc000}, {0x417be000}, {0x417c0000}, {0x417c2000}, {0x417c4000}, {0x417c6000}, {0x417c8000}, {0x417ca000}, {0x417cc000}, {0x417ce000}, {0x417d0000}, {0x417d2000}, {0x417d4000}, {0x417d6000}, {0x417d8000}, {0x417da000}, {0x417dc000}, {0x417de000}, {0x417e0000}, {0x417e2000}, {0x417e4000}, {0x417e6000}, {0x417e8000}, {0x417ea000}, {0x417ec000}, {0x417ee000}, {0x417f0000}, {0x417f2000}, {0x417f4000}, {0x417f6000}, {0x417f8000}, {0x417fa000}, {0x417fc000}, {0x417fe000}, {0x41800000}, {0x41802000}, {0x41804000}, {0x41806000}, {0x41808000}, {0x4180a000}, {0x4180c000}, {0x4180e000}, {0x41810000}, {0x41812000}, {0x41814000}, {0x41816000}, {0x41818000}, {0x4181a000}, {0x4181c000}, {0x4181e000}, {0x41820000}, {0x41822000}, {0x41824000}, {0x41826000}, {0x41828000}, {0x4182a000}, {0x4182c000}, {0x4182e000}, {0x41830000}, {0x41832000}, {0x41834000}, {0x41836000}, {0x41838000}, {0x4183a000}, {0x4183c000}, {0x4183e000}, {0x41840000}, {0x41842000}, {0x41844000}, {0x41846000}, {0x41848000}, {0x4184a000}, {0x4184c000}, {0x4184e000}, {0x41850000}, {0x41852000}, {0x41854000}, {0x41856000}, {0x41858000}, {0x4185a000}, {0x4185c000}, {0x4185e000}, {0x41860000}, {0x41862000}, {0x41864000}, {0x41866000}, {0x41868000}, {0x4186a000}, {0x4186c000}, {0x4186e000}, {0x41870000}, {0x41872000}, {0x41874000}, {0x41876000}, {0x41878000}, {0x4187a000}, {0x4187c000}, {0x4187e000}, {0x41880000}, {0x41882000}, {0x41884000}, {0x41886000}, {0x41888000}, {0x4188a000}, {0x4188c000}, {0x4188e000}, {0x41890000}, {0x41892000}, {0x41894000}, {0x41896000}, {0x41898000}, {0x4189a000}, {0x4189c000}, {0x4189e000}, {0x418a0000}, {0x418a2000}, {0x418a4000}, {0x418a6000}, {0x418a8000}, {0x418aa000}, {0x418ac000}, {0x418ae000}, {0x418b0000}, {0x418b2000}, {0x418b4000}, {0x418b6000}, {0x418b8000}, {0x418ba000}, {0x418bc000}, {0x418be000}, {0x418c0000}, {0x418c2000}, {0x418c4000}, {0x418c6000}, {0x418c8000}, {0x418ca000}, {0x418cc000}, {0x418ce000}, {0x418d0000}, {0x418d2000}, {0x418d4000}, {0x418d6000}, {0x418d8000}, {0x418da000}, {0x418dc000}, {0x418de000}, {0x418e0000}, {0x418e2000}, {0x418e4000}, {0x418e6000}, {0x418e8000}, {0x418ea000}, {0x418ec000}, {0x418ee000}, {0x418f0000}, {0x418f2000}, {0x418f4000}, {0x418f6000}, {0x418f8000}, {0x418fa000}, {0x418fc000}, {0x418fe000}, {0x41900000}, {0x41902000}, {0x41904000}, {0x41906000}, {0x41908000}, {0x4190a000}, {0x4190c000}, {0x4190e000}, {0x41910000}, {0x41912000}, {0x41914000}, {0x41916000}, {0x41918000}, {0x4191a000}, {0x4191c000}, {0x4191e000}, {0x41920000}, {0x41922000}, {0x41924000}, {0x41926000}, {0x41928000}, {0x4192a000}, {0x4192c000}, {0x4192e000}, {0x41930000}, {0x41932000}, {0x41934000}, {0x41936000}, {0x41938000}, {0x4193a000}, {0x4193c000}, {0x4193e000}, {0x41940000}, {0x41942000}, {0x41944000}, {0x41946000}, {0x41948000}, {0x4194a000}, {0x4194c000}, {0x4194e000}, {0x41950000}, {0x41952000}, {0x41954000}, {0x41956000}, {0x41958000}, {0x4195a000}, {0x4195c000}, {0x4195e000}, {0x41960000}, {0x41962000}, {0x41964000}, {0x41966000}, {0x41968000}, {0x4196a000}, {0x4196c000}, {0x4196e000}, {0x41970000}, {0x41972000}, {0x41974000}, {0x41976000}, {0x41978000}, {0x4197a000}, {0x4197c000}, {0x4197e000}, {0x41980000}, {0x41982000}, {0x41984000}, {0x41986000}, {0x41988000}, {0x4198a000}, {0x4198c000}, {0x4198e000}, {0x41990000}, {0x41992000}, {0x41994000}, {0x41996000}, {0x41998000}, {0x4199a000}, {0x4199c000}, {0x4199e000}, {0x419a0000}, {0x419a2000}, {0x419a4000}, {0x419a6000}, {0x419a8000}, {0x419aa000}, {0x419ac000}, {0x419ae000}, {0x419b0000}, {0x419b2000}, {0x419b4000}, {0x419b6000}, {0x419b8000}, {0x419ba000}, {0x419bc000}, {0x419be000}, {0x419c0000}, {0x419c2000}, {0x419c4000}, {0x419c6000}, {0x419c8000}, {0x419ca000}, {0x419cc000}, {0x419ce000}, {0x419d0000}, {0x419d2000}, {0x419d4000}, {0x419d6000}, {0x419d8000}, {0x419da000}, {0x419dc000}, {0x419de000}, {0x419e0000}, {0x419e2000}, {0x419e4000}, {0x419e6000}, {0x419e8000}, {0x419ea000}, {0x419ec000}, {0x419ee000}, {0x419f0000}, {0x419f2000}, {0x419f4000}, {0x419f6000}, {0x419f8000}, {0x419fa000}, {0x419fc000}, {0x419fe000}, {0x41a00000}, {0x41a02000}, {0x41a04000}, {0x41a06000}, {0x41a08000}, {0x41a0a000}, {0x41a0c000}, {0x41a0e000}, {0x41a10000}, {0x41a12000}, {0x41a14000}, {0x41a16000}, {0x41a18000}, {0x41a1a000}, {0x41a1c000}, {0x41a1e000}, {0x41a20000}, {0x41a22000}, {0x41a24000}, {0x41a26000}, {0x41a28000}, {0x41a2a000}, {0x41a2c000}, {0x41a2e000}, {0x41a30000}, {0x41a32000}, {0x41a34000}, {0x41a36000}, {0x41a38000}, {0x41a3a000}, {0x41a3c000}, {0x41a3e000}, {0x41a40000}, {0x41a42000}, {0x41a44000}, {0x41a46000}, {0x41a48000}, {0x41a4a000}, {0x41a4c000}, {0x41a4e000}, {0x41a50000}, {0x41a52000}, {0x41a54000}, {0x41a56000}, {0x41a58000}, {0x41a5a000}, {0x41a5c000}, {0x41a5e000}, {0x41a60000}, {0x41a62000}, {0x41a64000}, {0x41a66000}, {0x41a68000}, {0x41a6a000}, {0x41a6c000}, {0x41a6e000}, {0x41a70000}, {0x41a72000}, {0x41a74000}, {0x41a76000}, {0x41a78000}, {0x41a7a000}, {0x41a7c000}, {0x41a7e000}, {0x41a80000}, {0x41a82000}, {0x41a84000}, {0x41a86000}, {0x41a88000}, {0x41a8a000}, {0x41a8c000}, {0x41a8e000}, {0x41a90000}, {0x41a92000}, {0x41a94000}, {0x41a96000}, {0x41a98000}, {0x41a9a000}, {0x41a9c000}, {0x41a9e000}, {0x41aa0000}, {0x41aa2000}, {0x41aa4000}, {0x41aa6000}, {0x41aa8000}, {0x41aaa000}, {0x41aac000}, {0x41aae000}, {0x41ab0000}, {0x41ab2000}, {0x41ab4000}, {0x41ab6000}, {0x41ab8000}, {0x41aba000}, {0x41abc000}, {0x41abe000}, {0x41ac0000}, {0x41ac2000}, {0x41ac4000}, {0x41ac6000}, {0x41ac8000}, {0x41aca000}, {0x41acc000}, {0x41ace000}, {0x41ad0000}, {0x41ad2000}, {0x41ad4000}, {0x41ad6000}, {0x41ad8000}, {0x41ada000}, {0x41adc000}, {0x41ade000}, {0x41ae0000}, {0x41ae2000}, {0x41ae4000}, {0x41ae6000}, {0x41ae8000}, {0x41aea000}, {0x41aec000}, {0x41aee000}, {0x41af0000}, {0x41af2000}, {0x41af4000}, {0x41af6000}, {0x41af8000}, {0x41afa000}, {0x41afc000}, {0x41afe000}, {0x41b00000}, {0x41b02000}, {0x41b04000}, {0x41b06000}, {0x41b08000}, {0x41b0a000}, {0x41b0c000}, {0x41b0e000}, {0x41b10000}, {0x41b12000}, {0x41b14000}, {0x41b16000}, {0x41b18000}, {0x41b1a000}, {0x41b1c000}, {0x41b1e000}, {0x41b20000}, {0x41b22000}, {0x41b24000}, {0x41b26000}, {0x41b28000}, {0x41b2a000}, {0x41b2c000}, {0x41b2e000}, {0x41b30000}, {0x41b32000}, {0x41b34000}, {0x41b36000}, {0x41b38000}, {0x41b3a000}, {0x41b3c000}, {0x41b3e000}, {0x41b40000}, {0x41b42000}, {0x41b44000}, {0x41b46000}, {0x41b48000}, {0x41b4a000}, {0x41b4c000}, {0x41b4e000}, {0x41b50000}, {0x41b52000}, {0x41b54000}, {0x41b56000}, {0x41b58000}, {0x41b5a000}, {0x41b5c000}, {0x41b5e000}, {0x41b60000}, {0x41b62000}, {0x41b64000}, {0x41b66000}, {0x41b68000}, {0x41b6a000}, {0x41b6c000}, {0x41b6e000}, {0x41b70000}, {0x41b72000}, {0x41b74000}, {0x41b76000}, {0x41b78000}, {0x41b7a000}, {0x41b7c000}, {0x41b7e000}, {0x41b80000}, {0x41b82000}, {0x41b84000}, {0x41b86000}, {0x41b88000}, {0x41b8a000}, {0x41b8c000}, {0x41b8e000}, {0x41b90000}, {0x41b92000}, {0x41b94000}, {0x41b96000}, {0x41b98000}, {0x41b9a000}, {0x41b9c000}, {0x41b9e000}, {0x41ba0000}, {0x41ba2000}, {0x41ba4000}, {0x41ba6000}, {0x41ba8000}, {0x41baa000}, {0x41bac000}, {0x41bae000}, {0x41bb0000}, {0x41bb2000}, {0x41bb4000}, {0x41bb6000}, {0x41bb8000}, {0x41bba000}, {0x41bbc000}, {0x41bbe000}, {0x41bc0000}, {0x41bc2000}, {0x41bc4000}, {0x41bc6000}, {0x41bc8000}, {0x41bca000}, {0x41bcc000}, {0x41bce000}, {0x41bd0000}, {0x41bd2000}, {0x41bd4000}, {0x41bd6000}, {0x41bd8000}, {0x41bda000}, {0x41bdc000}, {0x41bde000}, {0x41be0000}, {0x41be2000}, {0x41be4000}, {0x41be6000}, {0x41be8000}, {0x41bea000}, {0x41bec000}, {0x41bee000}, {0x41bf0000}, {0x41bf2000}, {0x41bf4000}, {0x41bf6000}, {0x41bf8000}, {0x41bfa000}, {0x41bfc000}, {0x41bfe000}, {0x41c00000}, {0x41c02000}, {0x41c04000}, {0x41c06000}, {0x41c08000}, {0x41c0a000}, {0x41c0c000}, {0x41c0e000}, {0x41c10000}, {0x41c12000}, {0x41c14000}, {0x41c16000}, {0x41c18000}, {0x41c1a000}, {0x41c1c000}, {0x41c1e000}, {0x41c20000}, {0x41c22000}, {0x41c24000}, {0x41c26000}, {0x41c28000}, {0x41c2a000}, {0x41c2c000}, {0x41c2e000}, {0x41c30000}, {0x41c32000}, {0x41c34000}, {0x41c36000}, {0x41c38000}, {0x41c3a000}, {0x41c3c000}, {0x41c3e000}, {0x41c40000}, {0x41c42000}, {0x41c44000}, {0x41c46000}, {0x41c48000}, {0x41c4a000}, {0x41c4c000}, {0x41c4e000}, {0x41c50000}, {0x41c52000}, {0x41c54000}, {0x41c56000}, {0x41c58000}, {0x41c5a000}, {0x41c5c000}, {0x41c5e000}, {0x41c60000}, {0x41c62000}, {0x41c64000}, {0x41c66000}, {0x41c68000}, {0x41c6a000}, {0x41c6c000}, {0x41c6e000}, {0x41c70000}, {0x41c72000}, {0x41c74000}, {0x41c76000}, {0x41c78000}, {0x41c7a000}, {0x41c7c000}, {0x41c7e000}, {0x41c80000}, {0x41c82000}, {0x41c84000}, {0x41c86000}, {0x41c88000}, {0x41c8a000}, {0x41c8c000}, {0x41c8e000}, {0x41c90000}, {0x41c92000}, {0x41c94000}, {0x41c96000}, {0x41c98000}, {0x41c9a000}, {0x41c9c000}, {0x41c9e000}, {0x41ca0000}, {0x41ca2000}, {0x41ca4000}, {0x41ca6000}, {0x41ca8000}, {0x41caa000}, {0x41cac000}, {0x41cae000}, {0x41cb0000}, {0x41cb2000}, {0x41cb4000}, {0x41cb6000}, {0x41cb8000}, {0x41cba000}, {0x41cbc000}, {0x41cbe000}, {0x41cc0000}, {0x41cc2000}, {0x41cc4000}, {0x41cc6000}, {0x41cc8000}, {0x41cca000}, {0x41ccc000}, {0x41cce000}, {0x41cd0000}, {0x41cd2000}, {0x41cd4000}, {0x41cd6000}, {0x41cd8000}, {0x41cda000}, {0x41cdc000}, {0x41cde000}, {0x41ce0000}, {0x41ce2000}, {0x41ce4000}, {0x41ce6000}, {0x41ce8000}, {0x41cea000}, {0x41cec000}, {0x41cee000}, {0x41cf0000}, {0x41cf2000}, {0x41cf4000}, {0x41cf6000}, {0x41cf8000}, {0x41cfa000}, {0x41cfc000}, {0x41cfe000}, {0x41d00000}, {0x41d02000}, {0x41d04000}, {0x41d06000}, {0x41d08000}, {0x41d0a000}, {0x41d0c000}, {0x41d0e000}, {0x41d10000}, {0x41d12000}, {0x41d14000}, {0x41d16000}, {0x41d18000}, {0x41d1a000}, {0x41d1c000}, {0x41d1e000}, {0x41d20000}, {0x41d22000}, {0x41d24000}, {0x41d26000}, {0x41d28000}, {0x41d2a000}, {0x41d2c000}, {0x41d2e000}, {0x41d30000}, {0x41d32000}, {0x41d34000}, {0x41d36000}, {0x41d38000}, {0x41d3a000}, {0x41d3c000}, {0x41d3e000}, {0x41d40000}, {0x41d42000}, {0x41d44000}, {0x41d46000}, {0x41d48000}, {0x41d4a000}, {0x41d4c000}, {0x41d4e000}, {0x41d50000}, {0x41d52000}, {0x41d54000}, {0x41d56000}, {0x41d58000}, {0x41d5a000}, {0x41d5c000}, {0x41d5e000}, {0x41d60000}, {0x41d62000}, {0x41d64000}, {0x41d66000}, {0x41d68000}, {0x41d6a000}, {0x41d6c000}, {0x41d6e000}, {0x41d70000}, {0x41d72000}, {0x41d74000}, {0x41d76000}, {0x41d78000}, {0x41d7a000}, {0x41d7c000}, {0x41d7e000}, {0x41d80000}, {0x41d82000}, {0x41d84000}, {0x41d86000}, {0x41d88000}, {0x41d8a000}, {0x41d8c000}, {0x41d8e000}, {0x41d90000}, {0x41d92000}, {0x41d94000}, {0x41d96000}, {0x41d98000}, {0x41d9a000}, {0x41d9c000}, {0x41d9e000}, {0x41da0000}, {0x41da2000}, {0x41da4000}, {0x41da6000}, {0x41da8000}, {0x41daa000}, {0x41dac000}, {0x41dae000}, {0x41db0000}, {0x41db2000}, {0x41db4000}, {0x41db6000}, {0x41db8000}, {0x41dba000}, {0x41dbc000}, {0x41dbe000}, {0x41dc0000}, {0x41dc2000}, {0x41dc4000}, {0x41dc6000}, {0x41dc8000}, {0x41dca000}, {0x41dcc000}, {0x41dce000}, {0x41dd0000}, {0x41dd2000}, {0x41dd4000}, {0x41dd6000}, {0x41dd8000}, {0x41dda000}, {0x41ddc000}, {0x41dde000}, {0x41de0000}, {0x41de2000}, {0x41de4000}, {0x41de6000}, {0x41de8000}, {0x41dea000}, {0x41dec000}, {0x41dee000}, {0x41df0000}, {0x41df2000}, {0x41df4000}, {0x41df6000}, {0x41df8000}, {0x41dfa000}, {0x41dfc000}, {0x41dfe000}, {0x41e00000}, {0x41e02000}, {0x41e04000}, {0x41e06000}, {0x41e08000}, {0x41e0a000}, {0x41e0c000}, {0x41e0e000}, {0x41e10000}, {0x41e12000}, {0x41e14000}, {0x41e16000}, {0x41e18000}, {0x41e1a000}, {0x41e1c000}, {0x41e1e000}, {0x41e20000}, {0x41e22000}, {0x41e24000}, {0x41e26000}, {0x41e28000}, {0x41e2a000}, {0x41e2c000}, {0x41e2e000}, {0x41e30000}, {0x41e32000}, {0x41e34000}, {0x41e36000}, {0x41e38000}, {0x41e3a000}, {0x41e3c000}, {0x41e3e000}, {0x41e40000}, {0x41e42000}, {0x41e44000}, {0x41e46000}, {0x41e48000}, {0x41e4a000}, {0x41e4c000}, {0x41e4e000}, {0x41e50000}, {0x41e52000}, {0x41e54000}, {0x41e56000}, {0x41e58000}, {0x41e5a000}, {0x41e5c000}, {0x41e5e000}, {0x41e60000}, {0x41e62000}, {0x41e64000}, {0x41e66000}, {0x41e68000}, {0x41e6a000}, {0x41e6c000}, {0x41e6e000}, {0x41e70000}, {0x41e72000}, {0x41e74000}, {0x41e76000}, {0x41e78000}, {0x41e7a000}, {0x41e7c000}, {0x41e7e000}, {0x41e80000}, {0x41e82000}, {0x41e84000}, {0x41e86000}, {0x41e88000}, {0x41e8a000}, {0x41e8c000}, {0x41e8e000}, {0x41e90000}, {0x41e92000}, {0x41e94000}, {0x41e96000}, {0x41e98000}, {0x41e9a000}, {0x41e9c000}, {0x41e9e000}, {0x41ea0000}, {0x41ea2000}, {0x41ea4000}, {0x41ea6000}, {0x41ea8000}, {0x41eaa000}, {0x41eac000}, {0x41eae000}, {0x41eb0000}, {0x41eb2000}, {0x41eb4000}, {0x41eb6000}, {0x41eb8000}, {0x41eba000}, {0x41ebc000}, {0x41ebe000}, {0x41ec0000}, {0x41ec2000}, {0x41ec4000}, {0x41ec6000}, {0x41ec8000}, {0x41eca000}, {0x41ecc000}, {0x41ece000}, {0x41ed0000}, {0x41ed2000}, {0x41ed4000}, {0x41ed6000}, {0x41ed8000}, {0x41eda000}, {0x41edc000}, {0x41ede000}, {0x41ee0000}, {0x41ee2000}, {0x41ee4000}, {0x41ee6000}, {0x41ee8000}, {0x41eea000}, {0x41eec000}, {0x41eee000}, {0x41ef0000}, {0x41ef2000}, {0x41ef4000}, {0x41ef6000}, {0x41ef8000}, {0x41efa000}, {0x41efc000}, {0x41efe000}, {0x41f00000}, {0x41f02000}, {0x41f04000}, {0x41f06000}, {0x41f08000}, {0x41f0a000}, {0x41f0c000}, {0x41f0e000}, {0x41f10000}, {0x41f12000}, {0x41f14000}, {0x41f16000}, {0x41f18000}, {0x41f1a000}, {0x41f1c000}, {0x41f1e000}, {0x41f20000}, {0x41f22000}, {0x41f24000}, {0x41f26000}, {0x41f28000}, {0x41f2a000}, {0x41f2c000}, {0x41f2e000}, {0x41f30000}, {0x41f32000}, {0x41f34000}, {0x41f36000}, {0x41f38000}, {0x41f3a000}, {0x41f3c000}, {0x41f3e000}, {0x41f40000}, {0x41f42000}, {0x41f44000}, {0x41f46000}, {0x41f48000}, {0x41f4a000}, {0x41f4c000}, {0x41f4e000}, {0x41f50000}, {0x41f52000}, {0x41f54000}, {0x41f56000}, {0x41f58000}, {0x41f5a000}, {0x41f5c000}, {0x41f5e000}, {0x41f60000}, {0x41f62000}, {0x41f64000}, {0x41f66000}, {0x41f68000}, {0x41f6a000}, {0x41f6c000}, {0x41f6e000}, {0x41f70000}, {0x41f72000}, {0x41f74000}, {0x41f76000}, {0x41f78000}, {0x41f7a000}, {0x41f7c000}, {0x41f7e000}, {0x41f80000}, {0x41f82000}, {0x41f84000}, {0x41f86000}, {0x41f88000}, {0x41f8a000}, {0x41f8c000}, {0x41f8e000}, {0x41f90000}, {0x41f92000}, {0x41f94000}, {0x41f96000}, {0x41f98000}, {0x41f9a000}, {0x41f9c000}, {0x41f9e000}, {0x41fa0000}, {0x41fa2000}, {0x41fa4000}, {0x41fa6000}, {0x41fa8000}, {0x41faa000}, {0x41fac000}, {0x41fae000}, {0x41fb0000}, {0x41fb2000}, {0x41fb4000}, {0x41fb6000}, {0x41fb8000}, {0x41fba000}, {0x41fbc000}, {0x41fbe000}, {0x41fc0000}, {0x41fc2000}, {0x41fc4000}, {0x41fc6000}, {0x41fc8000}, {0x41fca000}, {0x41fcc000}, {0x41fce000}, {0x41fd0000}, {0x41fd2000}, {0x41fd4000}, {0x41fd6000}, {0x41fd8000}, {0x41fda000}, {0x41fdc000}, {0x41fde000}, {0x41fe0000}, {0x41fe2000}, {0x41fe4000}, {0x41fe6000}, {0x41fe8000}, {0x41fea000}, {0x41fec000}, {0x41fee000}, {0x41ff0000}, {0x41ff2000}, {0x41ff4000}, {0x41ff6000}, {0x41ff8000}, {0x41ffa000}, {0x41ffc000}, {0x41ffe000}, {0x42000000}, {0x42002000}, {0x42004000}, {0x42006000}, {0x42008000}, {0x4200a000}, {0x4200c000}, {0x4200e000}, {0x42010000}, {0x42012000}, {0x42014000}, {0x42016000}, {0x42018000}, {0x4201a000}, {0x4201c000}, {0x4201e000}, {0x42020000}, {0x42022000}, {0x42024000}, {0x42026000}, {0x42028000}, {0x4202a000}, {0x4202c000}, {0x4202e000}, {0x42030000}, {0x42032000}, {0x42034000}, {0x42036000}, {0x42038000}, {0x4203a000}, {0x4203c000}, {0x4203e000}, {0x42040000}, {0x42042000}, {0x42044000}, {0x42046000}, {0x42048000}, {0x4204a000}, {0x4204c000}, {0x4204e000}, {0x42050000}, {0x42052000}, {0x42054000}, {0x42056000}, {0x42058000}, {0x4205a000}, {0x4205c000}, {0x4205e000}, {0x42060000}, {0x42062000}, {0x42064000}, {0x42066000}, {0x42068000}, {0x4206a000}, {0x4206c000}, {0x4206e000}, {0x42070000}, {0x42072000}, {0x42074000}, {0x42076000}, {0x42078000}, {0x4207a000}, {0x4207c000}, {0x4207e000}, {0x42080000}, {0x42082000}, {0x42084000}, {0x42086000}, {0x42088000}, {0x4208a000}, {0x4208c000}, {0x4208e000}, {0x42090000}, {0x42092000}, {0x42094000}, {0x42096000}, {0x42098000}, {0x4209a000}, {0x4209c000}, {0x4209e000}, {0x420a0000}, {0x420a2000}, {0x420a4000}, {0x420a6000}, {0x420a8000}, {0x420aa000}, {0x420ac000}, {0x420ae000}, {0x420b0000}, {0x420b2000}, {0x420b4000}, {0x420b6000}, {0x420b8000}, {0x420ba000}, {0x420bc000}, {0x420be000}, {0x420c0000}, {0x420c2000}, {0x420c4000}, {0x420c6000}, {0x420c8000}, {0x420ca000}, {0x420cc000}, {0x420ce000}, {0x420d0000}, {0x420d2000}, {0x420d4000}, {0x420d6000}, {0x420d8000}, {0x420da000}, {0x420dc000}, {0x420de000}, {0x420e0000}, {0x420e2000}, {0x420e4000}, {0x420e6000}, {0x420e8000}, {0x420ea000}, {0x420ec000}, {0x420ee000}, {0x420f0000}, {0x420f2000}, {0x420f4000}, {0x420f6000}, {0x420f8000}, {0x420fa000}, {0x420fc000}, {0x420fe000}, {0x42100000}, {0x42102000}, {0x42104000}, {0x42106000}, {0x42108000}, {0x4210a000}, {0x4210c000}, {0x4210e000}, {0x42110000}, {0x42112000}, {0x42114000}, {0x42116000}, {0x42118000}, {0x4211a000}, {0x4211c000}, {0x4211e000}, {0x42120000}, {0x42122000}, {0x42124000}, {0x42126000}, {0x42128000}, {0x4212a000}, {0x4212c000}, {0x4212e000}, {0x42130000}, {0x42132000}, {0x42134000}, {0x42136000}, {0x42138000}, {0x4213a000}, {0x4213c000}, {0x4213e000}, {0x42140000}, {0x42142000}, {0x42144000}, {0x42146000}, {0x42148000}, {0x4214a000}, {0x4214c000}, {0x4214e000}, {0x42150000}, {0x42152000}, {0x42154000}, {0x42156000}, {0x42158000}, {0x4215a000}, {0x4215c000}, {0x4215e000}, {0x42160000}, {0x42162000}, {0x42164000}, {0x42166000}, {0x42168000}, {0x4216a000}, {0x4216c000}, {0x4216e000}, {0x42170000}, {0x42172000}, {0x42174000}, {0x42176000}, {0x42178000}, {0x4217a000}, {0x4217c000}, {0x4217e000}, {0x42180000}, {0x42182000}, {0x42184000}, {0x42186000}, {0x42188000}, {0x4218a000}, {0x4218c000}, {0x4218e000}, {0x42190000}, {0x42192000}, {0x42194000}, {0x42196000}, {0x42198000}, {0x4219a000}, {0x4219c000}, {0x4219e000}, {0x421a0000}, {0x421a2000}, {0x421a4000}, {0x421a6000}, {0x421a8000}, {0x421aa000}, {0x421ac000}, {0x421ae000}, {0x421b0000}, {0x421b2000}, {0x421b4000}, {0x421b6000}, {0x421b8000}, {0x421ba000}, {0x421bc000}, {0x421be000}, {0x421c0000}, {0x421c2000}, {0x421c4000}, {0x421c6000}, {0x421c8000}, {0x421ca000}, {0x421cc000}, {0x421ce000}, {0x421d0000}, {0x421d2000}, {0x421d4000}, {0x421d6000}, {0x421d8000}, {0x421da000}, {0x421dc000}, {0x421de000}, {0x421e0000}, {0x421e2000}, {0x421e4000}, {0x421e6000}, {0x421e8000}, {0x421ea000}, {0x421ec000}, {0x421ee000}, {0x421f0000}, {0x421f2000}, {0x421f4000}, {0x421f6000}, {0x421f8000}, {0x421fa000}, {0x421fc000}, {0x421fe000}, {0x42200000}, {0x42202000}, {0x42204000}, {0x42206000}, {0x42208000}, {0x4220a000}, {0x4220c000}, {0x4220e000}, {0x42210000}, {0x42212000}, {0x42214000}, {0x42216000}, {0x42218000}, {0x4221a000}, {0x4221c000}, {0x4221e000}, {0x42220000}, {0x42222000}, {0x42224000}, {0x42226000}, {0x42228000}, {0x4222a000}, {0x4222c000}, {0x4222e000}, {0x42230000}, {0x42232000}, {0x42234000}, {0x42236000}, {0x42238000}, {0x4223a000}, {0x4223c000}, {0x4223e000}, {0x42240000}, {0x42242000}, {0x42244000}, {0x42246000}, {0x42248000}, {0x4224a000}, {0x4224c000}, {0x4224e000}, {0x42250000}, {0x42252000}, {0x42254000}, {0x42256000}, {0x42258000}, {0x4225a000}, {0x4225c000}, {0x4225e000}, {0x42260000}, {0x42262000}, {0x42264000}, {0x42266000}, {0x42268000}, {0x4226a000}, {0x4226c000}, {0x4226e000}, {0x42270000}, {0x42272000}, {0x42274000}, {0x42276000}, {0x42278000}, {0x4227a000}, {0x4227c000}, {0x4227e000}, {0x42280000}, {0x42282000}, {0x42284000}, {0x42286000}, {0x42288000}, {0x4228a000}, {0x4228c000}, {0x4228e000}, {0x42290000}, {0x42292000}, {0x42294000}, {0x42296000}, {0x42298000}, {0x4229a000}, {0x4229c000}, {0x4229e000}, {0x422a0000}, {0x422a2000}, {0x422a4000}, {0x422a6000}, {0x422a8000}, {0x422aa000}, {0x422ac000}, {0x422ae000}, {0x422b0000}, {0x422b2000}, {0x422b4000}, {0x422b6000}, {0x422b8000}, {0x422ba000}, {0x422bc000}, {0x422be000}, {0x422c0000}, {0x422c2000}, {0x422c4000}, {0x422c6000}, {0x422c8000}, {0x422ca000}, {0x422cc000}, {0x422ce000}, {0x422d0000}, {0x422d2000}, {0x422d4000}, {0x422d6000}, {0x422d8000}, {0x422da000}, {0x422dc000}, {0x422de000}, {0x422e0000}, {0x422e2000}, {0x422e4000}, {0x422e6000}, {0x422e8000}, {0x422ea000}, {0x422ec000}, {0x422ee000}, {0x422f0000}, {0x422f2000}, {0x422f4000}, {0x422f6000}, {0x422f8000}, {0x422fa000}, {0x422fc000}, {0x422fe000}, {0x42300000}, {0x42302000}, {0x42304000}, {0x42306000}, {0x42308000}, {0x4230a000}, {0x4230c000}, {0x4230e000}, {0x42310000}, {0x42312000}, {0x42314000}, {0x42316000}, {0x42318000}, {0x4231a000}, {0x4231c000}, {0x4231e000}, {0x42320000}, {0x42322000}, {0x42324000}, {0x42326000}, {0x42328000}, {0x4232a000}, {0x4232c000}, {0x4232e000}, {0x42330000}, {0x42332000}, {0x42334000}, {0x42336000}, {0x42338000}, {0x4233a000}, {0x4233c000}, {0x4233e000}, {0x42340000}, {0x42342000}, {0x42344000}, {0x42346000}, {0x42348000}, {0x4234a000}, {0x4234c000}, {0x4234e000}, {0x42350000}, {0x42352000}, {0x42354000}, {0x42356000}, {0x42358000}, {0x4235a000}, {0x4235c000}, {0x4235e000}, {0x42360000}, {0x42362000}, {0x42364000}, {0x42366000}, {0x42368000}, {0x4236a000}, {0x4236c000}, {0x4236e000}, {0x42370000}, {0x42372000}, {0x42374000}, {0x42376000}, {0x42378000}, {0x4237a000}, {0x4237c000}, {0x4237e000}, {0x42380000}, {0x42382000}, {0x42384000}, {0x42386000}, {0x42388000}, {0x4238a000}, {0x4238c000}, {0x4238e000}, {0x42390000}, {0x42392000}, {0x42394000}, {0x42396000}, {0x42398000}, {0x4239a000}, {0x4239c000}, {0x4239e000}, {0x423a0000}, {0x423a2000}, {0x423a4000}, {0x423a6000}, {0x423a8000}, {0x423aa000}, {0x423ac000}, {0x423ae000}, {0x423b0000}, {0x423b2000}, {0x423b4000}, {0x423b6000}, {0x423b8000}, {0x423ba000}, {0x423bc000}, {0x423be000}, {0x423c0000}, {0x423c2000}, {0x423c4000}, {0x423c6000}, {0x423c8000}, {0x423ca000}, {0x423cc000}, {0x423ce000}, {0x423d0000}, {0x423d2000}, {0x423d4000}, {0x423d6000}, {0x423d8000}, {0x423da000}, {0x423dc000}, {0x423de000}, {0x423e0000}, {0x423e2000}, {0x423e4000}, {0x423e6000}, {0x423e8000}, {0x423ea000}, {0x423ec000}, {0x423ee000}, {0x423f0000}, {0x423f2000}, {0x423f4000}, {0x423f6000}, {0x423f8000}, {0x423fa000}, {0x423fc000}, {0x423fe000}, {0x42400000}, {0x42402000}, {0x42404000}, {0x42406000}, {0x42408000}, {0x4240a000}, {0x4240c000}, {0x4240e000}, {0x42410000}, {0x42412000}, {0x42414000}, {0x42416000}, {0x42418000}, {0x4241a000}, {0x4241c000}, {0x4241e000}, {0x42420000}, {0x42422000}, {0x42424000}, {0x42426000}, {0x42428000}, {0x4242a000}, {0x4242c000}, {0x4242e000}, {0x42430000}, {0x42432000}, {0x42434000}, {0x42436000}, {0x42438000}, {0x4243a000}, {0x4243c000}, {0x4243e000}, {0x42440000}, {0x42442000}, {0x42444000}, {0x42446000}, {0x42448000}, {0x4244a000}, {0x4244c000}, {0x4244e000}, {0x42450000}, {0x42452000}, {0x42454000}, {0x42456000}, {0x42458000}, {0x4245a000}, {0x4245c000}, {0x4245e000}, {0x42460000}, {0x42462000}, {0x42464000}, {0x42466000}, {0x42468000}, {0x4246a000}, {0x4246c000}, {0x4246e000}, {0x42470000}, {0x42472000}, {0x42474000}, {0x42476000}, {0x42478000}, {0x4247a000}, {0x4247c000}, {0x4247e000}, {0x42480000}, {0x42482000}, {0x42484000}, {0x42486000}, {0x42488000}, {0x4248a000}, {0x4248c000}, {0x4248e000}, {0x42490000}, {0x42492000}, {0x42494000}, {0x42496000}, {0x42498000}, {0x4249a000}, {0x4249c000}, {0x4249e000}, {0x424a0000}, {0x424a2000}, {0x424a4000}, {0x424a6000}, {0x424a8000}, {0x424aa000}, {0x424ac000}, {0x424ae000}, {0x424b0000}, {0x424b2000}, {0x424b4000}, {0x424b6000}, {0x424b8000}, {0x424ba000}, {0x424bc000}, {0x424be000}, {0x424c0000}, {0x424c2000}, {0x424c4000}, {0x424c6000}, {0x424c8000}, {0x424ca000}, {0x424cc000}, {0x424ce000}, {0x424d0000}, {0x424d2000}, {0x424d4000}, {0x424d6000}, {0x424d8000}, {0x424da000}, {0x424dc000}, {0x424de000}, {0x424e0000}, {0x424e2000}, {0x424e4000}, {0x424e6000}, {0x424e8000}, {0x424ea000}, {0x424ec000}, {0x424ee000}, {0x424f0000}, {0x424f2000}, {0x424f4000}, {0x424f6000}, {0x424f8000}, {0x424fa000}, {0x424fc000}, {0x424fe000}, {0x42500000}, {0x42502000}, {0x42504000}, {0x42506000}, {0x42508000}, {0x4250a000}, {0x4250c000}, {0x4250e000}, {0x42510000}, {0x42512000}, {0x42514000}, {0x42516000}, {0x42518000}, {0x4251a000}, {0x4251c000}, {0x4251e000}, {0x42520000}, {0x42522000}, {0x42524000}, {0x42526000}, {0x42528000}, {0x4252a000}, {0x4252c000}, {0x4252e000}, {0x42530000}, {0x42532000}, {0x42534000}, {0x42536000}, {0x42538000}, {0x4253a000}, {0x4253c000}, {0x4253e000}, {0x42540000}, {0x42542000}, {0x42544000}, {0x42546000}, {0x42548000}, {0x4254a000}, {0x4254c000}, {0x4254e000}, {0x42550000}, {0x42552000}, {0x42554000}, {0x42556000}, {0x42558000}, {0x4255a000}, {0x4255c000}, {0x4255e000}, {0x42560000}, {0x42562000}, {0x42564000}, {0x42566000}, {0x42568000}, {0x4256a000}, {0x4256c000}, {0x4256e000}, {0x42570000}, {0x42572000}, {0x42574000}, {0x42576000}, {0x42578000}, {0x4257a000}, {0x4257c000}, {0x4257e000}, {0x42580000}, {0x42582000}, {0x42584000}, {0x42586000}, {0x42588000}, {0x4258a000}, {0x4258c000}, {0x4258e000}, {0x42590000}, {0x42592000}, {0x42594000}, {0x42596000}, {0x42598000}, {0x4259a000}, {0x4259c000}, {0x4259e000}, {0x425a0000}, {0x425a2000}, {0x425a4000}, {0x425a6000}, {0x425a8000}, {0x425aa000}, {0x425ac000}, {0x425ae000}, {0x425b0000}, {0x425b2000}, {0x425b4000}, {0x425b6000}, {0x425b8000}, {0x425ba000}, {0x425bc000}, {0x425be000}, {0x425c0000}, {0x425c2000}, {0x425c4000}, {0x425c6000}, {0x425c8000}, {0x425ca000}, {0x425cc000}, {0x425ce000}, {0x425d0000}, {0x425d2000}, {0x425d4000}, {0x425d6000}, {0x425d8000}, {0x425da000}, {0x425dc000}, {0x425de000}, {0x425e0000}, {0x425e2000}, {0x425e4000}, {0x425e6000}, {0x425e8000}, {0x425ea000}, {0x425ec000}, {0x425ee000}, {0x425f0000}, {0x425f2000}, {0x425f4000}, {0x425f6000}, {0x425f8000}, {0x425fa000}, {0x425fc000}, {0x425fe000}, {0x42600000}, {0x42602000}, {0x42604000}, {0x42606000}, {0x42608000}, {0x4260a000}, {0x4260c000}, {0x4260e000}, {0x42610000}, {0x42612000}, {0x42614000}, {0x42616000}, {0x42618000}, {0x4261a000}, {0x4261c000}, {0x4261e000}, {0x42620000}, {0x42622000}, {0x42624000}, {0x42626000}, {0x42628000}, {0x4262a000}, {0x4262c000}, {0x4262e000}, {0x42630000}, {0x42632000}, {0x42634000}, {0x42636000}, {0x42638000}, {0x4263a000}, {0x4263c000}, {0x4263e000}, {0x42640000}, {0x42642000}, {0x42644000}, {0x42646000}, {0x42648000}, {0x4264a000}, {0x4264c000}, {0x4264e000}, {0x42650000}, {0x42652000}, {0x42654000}, {0x42656000}, {0x42658000}, {0x4265a000}, {0x4265c000}, {0x4265e000}, {0x42660000}, {0x42662000}, {0x42664000}, {0x42666000}, {0x42668000}, {0x4266a000}, {0x4266c000}, {0x4266e000}, {0x42670000}, {0x42672000}, {0x42674000}, {0x42676000}, {0x42678000}, {0x4267a000}, {0x4267c000}, {0x4267e000}, {0x42680000}, {0x42682000}, {0x42684000}, {0x42686000}, {0x42688000}, {0x4268a000}, {0x4268c000}, {0x4268e000}, {0x42690000}, {0x42692000}, {0x42694000}, {0x42696000}, {0x42698000}, {0x4269a000}, {0x4269c000}, {0x4269e000}, {0x426a0000}, {0x426a2000}, {0x426a4000}, {0x426a6000}, {0x426a8000}, {0x426aa000}, {0x426ac000}, {0x426ae000}, {0x426b0000}, {0x426b2000}, {0x426b4000}, {0x426b6000}, {0x426b8000}, {0x426ba000}, {0x426bc000}, {0x426be000}, {0x426c0000}, {0x426c2000}, {0x426c4000}, {0x426c6000}, {0x426c8000}, {0x426ca000}, {0x426cc000}, {0x426ce000}, {0x426d0000}, {0x426d2000}, {0x426d4000}, {0x426d6000}, {0x426d8000}, {0x426da000}, {0x426dc000}, {0x426de000}, {0x426e0000}, {0x426e2000}, {0x426e4000}, {0x426e6000}, {0x426e8000}, {0x426ea000}, {0x426ec000}, {0x426ee000}, {0x426f0000}, {0x426f2000}, {0x426f4000}, {0x426f6000}, {0x426f8000}, {0x426fa000}, {0x426fc000}, {0x426fe000}, {0x42700000}, {0x42702000}, {0x42704000}, {0x42706000}, {0x42708000}, {0x4270a000}, {0x4270c000}, {0x4270e000}, {0x42710000}, {0x42712000}, {0x42714000}, {0x42716000}, {0x42718000}, {0x4271a000}, {0x4271c000}, {0x4271e000}, {0x42720000}, {0x42722000}, {0x42724000}, {0x42726000}, {0x42728000}, {0x4272a000}, {0x4272c000}, {0x4272e000}, {0x42730000}, {0x42732000}, {0x42734000}, {0x42736000}, {0x42738000}, {0x4273a000}, {0x4273c000}, {0x4273e000}, {0x42740000}, {0x42742000}, {0x42744000}, {0x42746000}, {0x42748000}, {0x4274a000}, {0x4274c000}, {0x4274e000}, {0x42750000}, {0x42752000}, {0x42754000}, {0x42756000}, {0x42758000}, {0x4275a000}, {0x4275c000}, {0x4275e000}, {0x42760000}, {0x42762000}, {0x42764000}, {0x42766000}, {0x42768000}, {0x4276a000}, {0x4276c000}, {0x4276e000}, {0x42770000}, {0x42772000}, {0x42774000}, {0x42776000}, {0x42778000}, {0x4277a000}, {0x4277c000}, {0x4277e000}, {0x42780000}, {0x42782000}, {0x42784000}, {0x42786000}, {0x42788000}, {0x4278a000}, {0x4278c000}, {0x4278e000}, {0x42790000}, {0x42792000}, {0x42794000}, {0x42796000}, {0x42798000}, {0x4279a000}, {0x4279c000}, {0x4279e000}, {0x427a0000}, {0x427a2000}, {0x427a4000}, {0x427a6000}, {0x427a8000}, {0x427aa000}, {0x427ac000}, {0x427ae000}, {0x427b0000}, {0x427b2000}, {0x427b4000}, {0x427b6000}, {0x427b8000}, {0x427ba000}, {0x427bc000}, {0x427be000}, {0x427c0000}, {0x427c2000}, {0x427c4000}, {0x427c6000}, {0x427c8000}, {0x427ca000}, {0x427cc000}, {0x427ce000}, {0x427d0000}, {0x427d2000}, {0x427d4000}, {0x427d6000}, {0x427d8000}, {0x427da000}, {0x427dc000}, {0x427de000}, {0x427e0000}, {0x427e2000}, {0x427e4000}, {0x427e6000}, {0x427e8000}, {0x427ea000}, {0x427ec000}, {0x427ee000}, {0x427f0000}, {0x427f2000}, {0x427f4000}, {0x427f6000}, {0x427f8000}, {0x427fa000}, {0x427fc000}, {0x427fe000}, {0x42800000}, {0x42802000}, {0x42804000}, {0x42806000}, {0x42808000}, {0x4280a000}, {0x4280c000}, {0x4280e000}, {0x42810000}, {0x42812000}, {0x42814000}, {0x42816000}, {0x42818000}, {0x4281a000}, {0x4281c000}, {0x4281e000}, {0x42820000}, {0x42822000}, {0x42824000}, {0x42826000}, {0x42828000}, {0x4282a000}, {0x4282c000}, {0x4282e000}, {0x42830000}, {0x42832000}, {0x42834000}, {0x42836000}, {0x42838000}, {0x4283a000}, {0x4283c000}, {0x4283e000}, {0x42840000}, {0x42842000}, {0x42844000}, {0x42846000}, {0x42848000}, {0x4284a000}, {0x4284c000}, {0x4284e000}, {0x42850000}, {0x42852000}, {0x42854000}, {0x42856000}, {0x42858000}, {0x4285a000}, {0x4285c000}, {0x4285e000}, {0x42860000}, {0x42862000}, {0x42864000}, {0x42866000}, {0x42868000}, {0x4286a000}, {0x4286c000}, {0x4286e000}, {0x42870000}, {0x42872000}, {0x42874000}, {0x42876000}, {0x42878000}, {0x4287a000}, {0x4287c000}, {0x4287e000}, {0x42880000}, {0x42882000}, {0x42884000}, {0x42886000}, {0x42888000}, {0x4288a000}, {0x4288c000}, {0x4288e000}, {0x42890000}, {0x42892000}, {0x42894000}, {0x42896000}, {0x42898000}, {0x4289a000}, {0x4289c000}, {0x4289e000}, {0x428a0000}, {0x428a2000}, {0x428a4000}, {0x428a6000}, {0x428a8000}, {0x428aa000}, {0x428ac000}, {0x428ae000}, {0x428b0000}, {0x428b2000}, {0x428b4000}, {0x428b6000}, {0x428b8000}, {0x428ba000}, {0x428bc000}, {0x428be000}, {0x428c0000}, {0x428c2000}, {0x428c4000}, {0x428c6000}, {0x428c8000}, {0x428ca000}, {0x428cc000}, {0x428ce000}, {0x428d0000}, {0x428d2000}, {0x428d4000}, {0x428d6000}, {0x428d8000}, {0x428da000}, {0x428dc000}, {0x428de000}, {0x428e0000}, {0x428e2000}, {0x428e4000}, {0x428e6000}, {0x428e8000}, {0x428ea000}, {0x428ec000}, {0x428ee000}, {0x428f0000}, {0x428f2000}, {0x428f4000}, {0x428f6000}, {0x428f8000}, {0x428fa000}, {0x428fc000}, {0x428fe000}, {0x42900000}, {0x42902000}, {0x42904000}, {0x42906000}, {0x42908000}, {0x4290a000}, {0x4290c000}, {0x4290e000}, {0x42910000}, {0x42912000}, {0x42914000}, {0x42916000}, {0x42918000}, {0x4291a000}, {0x4291c000}, {0x4291e000}, {0x42920000}, {0x42922000}, {0x42924000}, {0x42926000}, {0x42928000}, {0x4292a000}, {0x4292c000}, {0x4292e000}, {0x42930000}, {0x42932000}, {0x42934000}, {0x42936000}, {0x42938000}, {0x4293a000}, {0x4293c000}, {0x4293e000}, {0x42940000}, {0x42942000}, {0x42944000}, {0x42946000}, {0x42948000}, {0x4294a000}, {0x4294c000}, {0x4294e000}, {0x42950000}, {0x42952000}, {0x42954000}, {0x42956000}, {0x42958000}, {0x4295a000}, {0x4295c000}, {0x4295e000}, {0x42960000}, {0x42962000}, {0x42964000}, {0x42966000}, {0x42968000}, {0x4296a000}, {0x4296c000}, {0x4296e000}, {0x42970000}, {0x42972000}, {0x42974000}, {0x42976000}, {0x42978000}, {0x4297a000}, {0x4297c000}, {0x4297e000}, {0x42980000}, {0x42982000}, {0x42984000}, {0x42986000}, {0x42988000}, {0x4298a000}, {0x4298c000}, {0x4298e000}, {0x42990000}, {0x42992000}, {0x42994000}, {0x42996000}, {0x42998000}, {0x4299a000}, {0x4299c000}, {0x4299e000}, {0x429a0000}, {0x429a2000}, {0x429a4000}, {0x429a6000}, {0x429a8000}, {0x429aa000}, {0x429ac000}, {0x429ae000}, {0x429b0000}, {0x429b2000}, {0x429b4000}, {0x429b6000}, {0x429b8000}, {0x429ba000}, {0x429bc000}, {0x429be000}, {0x429c0000}, {0x429c2000}, {0x429c4000}, {0x429c6000}, {0x429c8000}, {0x429ca000}, {0x429cc000}, {0x429ce000}, {0x429d0000}, {0x429d2000}, {0x429d4000}, {0x429d6000}, {0x429d8000}, {0x429da000}, {0x429dc000}, {0x429de000}, {0x429e0000}, {0x429e2000}, {0x429e4000}, {0x429e6000}, {0x429e8000}, {0x429ea000}, {0x429ec000}, {0x429ee000}, {0x429f0000}, {0x429f2000}, {0x429f4000}, {0x429f6000}, {0x429f8000}, {0x429fa000}, {0x429fc000}, {0x429fe000}, {0x42a00000}, {0x42a02000}, {0x42a04000}, {0x42a06000}, {0x42a08000}, {0x42a0a000}, {0x42a0c000}, {0x42a0e000}, {0x42a10000}, {0x42a12000}, {0x42a14000}, {0x42a16000}, {0x42a18000}, {0x42a1a000}, {0x42a1c000}, {0x42a1e000}, {0x42a20000}, {0x42a22000}, {0x42a24000}, {0x42a26000}, {0x42a28000}, {0x42a2a000}, {0x42a2c000}, {0x42a2e000}, {0x42a30000}, {0x42a32000}, {0x42a34000}, {0x42a36000}, {0x42a38000}, {0x42a3a000}, {0x42a3c000}, {0x42a3e000}, {0x42a40000}, {0x42a42000}, {0x42a44000}, {0x42a46000}, {0x42a48000}, {0x42a4a000}, {0x42a4c000}, {0x42a4e000}, {0x42a50000}, {0x42a52000}, {0x42a54000}, {0x42a56000}, {0x42a58000}, {0x42a5a000}, {0x42a5c000}, {0x42a5e000}, {0x42a60000}, {0x42a62000}, {0x42a64000}, {0x42a66000}, {0x42a68000}, {0x42a6a000}, {0x42a6c000}, {0x42a6e000}, {0x42a70000}, {0x42a72000}, {0x42a74000}, {0x42a76000}, {0x42a78000}, {0x42a7a000}, {0x42a7c000}, {0x42a7e000}, {0x42a80000}, {0x42a82000}, {0x42a84000}, {0x42a86000}, {0x42a88000}, {0x42a8a000}, {0x42a8c000}, {0x42a8e000}, {0x42a90000}, {0x42a92000}, {0x42a94000}, {0x42a96000}, {0x42a98000}, {0x42a9a000}, {0x42a9c000}, {0x42a9e000}, {0x42aa0000}, {0x42aa2000}, {0x42aa4000}, {0x42aa6000}, {0x42aa8000}, {0x42aaa000}, {0x42aac000}, {0x42aae000}, {0x42ab0000}, {0x42ab2000}, {0x42ab4000}, {0x42ab6000}, {0x42ab8000}, {0x42aba000}, {0x42abc000}, {0x42abe000}, {0x42ac0000}, {0x42ac2000}, {0x42ac4000}, {0x42ac6000}, {0x42ac8000}, {0x42aca000}, {0x42acc000}, {0x42ace000}, {0x42ad0000}, {0x42ad2000}, {0x42ad4000}, {0x42ad6000}, {0x42ad8000}, {0x42ada000}, {0x42adc000}, {0x42ade000}, {0x42ae0000}, {0x42ae2000}, {0x42ae4000}, {0x42ae6000}, {0x42ae8000}, {0x42aea000}, {0x42aec000}, {0x42aee000}, {0x42af0000}, {0x42af2000}, {0x42af4000}, {0x42af6000}, {0x42af8000}, {0x42afa000}, {0x42afc000}, {0x42afe000}, {0x42b00000}, {0x42b02000}, {0x42b04000}, {0x42b06000}, {0x42b08000}, {0x42b0a000}, {0x42b0c000}, {0x42b0e000}, {0x42b10000}, {0x42b12000}, {0x42b14000}, {0x42b16000}, {0x42b18000}, {0x42b1a000}, {0x42b1c000}, {0x42b1e000}, {0x42b20000}, {0x42b22000}, {0x42b24000}, {0x42b26000}, {0x42b28000}, {0x42b2a000}, {0x42b2c000}, {0x42b2e000}, {0x42b30000}, {0x42b32000}, {0x42b34000}, {0x42b36000}, {0x42b38000}, {0x42b3a000}, {0x42b3c000}, {0x42b3e000}, {0x42b40000}, {0x42b42000}, {0x42b44000}, {0x42b46000}, {0x42b48000}, {0x42b4a000}, {0x42b4c000}, {0x42b4e000}, {0x42b50000}, {0x42b52000}, {0x42b54000}, {0x42b56000}, {0x42b58000}, {0x42b5a000}, {0x42b5c000}, {0x42b5e000}, {0x42b60000}, {0x42b62000}, {0x42b64000}, {0x42b66000}, {0x42b68000}, {0x42b6a000}, {0x42b6c000}, {0x42b6e000}, {0x42b70000}, {0x42b72000}, {0x42b74000}, {0x42b76000}, {0x42b78000}, {0x42b7a000}, {0x42b7c000}, {0x42b7e000}, {0x42b80000}, {0x42b82000}, {0x42b84000}, {0x42b86000}, {0x42b88000}, {0x42b8a000}, {0x42b8c000}, {0x42b8e000}, {0x42b90000}, {0x42b92000}, {0x42b94000}, {0x42b96000}, {0x42b98000}, {0x42b9a000}, {0x42b9c000}, {0x42b9e000}, {0x42ba0000}, {0x42ba2000}, {0x42ba4000}, {0x42ba6000}, {0x42ba8000}, {0x42baa000}, {0x42bac000}, {0x42bae000}, {0x42bb0000}, {0x42bb2000}, {0x42bb4000}, {0x42bb6000}, {0x42bb8000}, {0x42bba000}, {0x42bbc000}, {0x42bbe000}, {0x42bc0000}, {0x42bc2000}, {0x42bc4000}, {0x42bc6000}, {0x42bc8000}, {0x42bca000}, {0x42bcc000}, {0x42bce000}, {0x42bd0000}, {0x42bd2000}, {0x42bd4000}, {0x42bd6000}, {0x42bd8000}, {0x42bda000}, {0x42bdc000}, {0x42bde000}, {0x42be0000}, {0x42be2000}, {0x42be4000}, {0x42be6000}, {0x42be8000}, {0x42bea000}, {0x42bec000}, {0x42bee000}, {0x42bf0000}, {0x42bf2000}, {0x42bf4000}, {0x42bf6000}, {0x42bf8000}, {0x42bfa000}, {0x42bfc000}, {0x42bfe000}, {0x42c00000}, {0x42c02000}, {0x42c04000}, {0x42c06000}, {0x42c08000}, {0x42c0a000}, {0x42c0c000}, {0x42c0e000}, {0x42c10000}, {0x42c12000}, {0x42c14000}, {0x42c16000}, {0x42c18000}, {0x42c1a000}, {0x42c1c000}, {0x42c1e000}, {0x42c20000}, {0x42c22000}, {0x42c24000}, {0x42c26000}, {0x42c28000}, {0x42c2a000}, {0x42c2c000}, {0x42c2e000}, {0x42c30000}, {0x42c32000}, {0x42c34000}, {0x42c36000}, {0x42c38000}, {0x42c3a000}, {0x42c3c000}, {0x42c3e000}, {0x42c40000}, {0x42c42000}, {0x42c44000}, {0x42c46000}, {0x42c48000}, {0x42c4a000}, {0x42c4c000}, {0x42c4e000}, {0x42c50000}, {0x42c52000}, {0x42c54000}, {0x42c56000}, {0x42c58000}, {0x42c5a000}, {0x42c5c000}, {0x42c5e000}, {0x42c60000}, {0x42c62000}, {0x42c64000}, {0x42c66000}, {0x42c68000}, {0x42c6a000}, {0x42c6c000}, {0x42c6e000}, {0x42c70000}, {0x42c72000}, {0x42c74000}, {0x42c76000}, {0x42c78000}, {0x42c7a000}, {0x42c7c000}, {0x42c7e000}, {0x42c80000}, {0x42c82000}, {0x42c84000}, {0x42c86000}, {0x42c88000}, {0x42c8a000}, {0x42c8c000}, {0x42c8e000}, {0x42c90000}, {0x42c92000}, {0x42c94000}, {0x42c96000}, {0x42c98000}, {0x42c9a000}, {0x42c9c000}, {0x42c9e000}, {0x42ca0000}, {0x42ca2000}, {0x42ca4000}, {0x42ca6000}, {0x42ca8000}, {0x42caa000}, {0x42cac000}, {0x42cae000}, {0x42cb0000}, {0x42cb2000}, {0x42cb4000}, {0x42cb6000}, {0x42cb8000}, {0x42cba000}, {0x42cbc000}, {0x42cbe000}, {0x42cc0000}, {0x42cc2000}, {0x42cc4000}, {0x42cc6000}, {0x42cc8000}, {0x42cca000}, {0x42ccc000}, {0x42cce000}, {0x42cd0000}, {0x42cd2000}, {0x42cd4000}, {0x42cd6000}, {0x42cd8000}, {0x42cda000}, {0x42cdc000}, {0x42cde000}, {0x42ce0000}, {0x42ce2000}, {0x42ce4000}, {0x42ce6000}, {0x42ce8000}, {0x42cea000}, {0x42cec000}, {0x42cee000}, {0x42cf0000}, {0x42cf2000}, {0x42cf4000}, {0x42cf6000}, {0x42cf8000}, {0x42cfa000}, {0x42cfc000}, {0x42cfe000}, {0x42d00000}, {0x42d02000}, {0x42d04000}, {0x42d06000}, {0x42d08000}, {0x42d0a000}, {0x42d0c000}, {0x42d0e000}, {0x42d10000}, {0x42d12000}, {0x42d14000}, {0x42d16000}, {0x42d18000}, {0x42d1a000}, {0x42d1c000}, {0x42d1e000}, {0x42d20000}, {0x42d22000}, {0x42d24000}, {0x42d26000}, {0x42d28000}, {0x42d2a000}, {0x42d2c000}, {0x42d2e000}, {0x42d30000}, {0x42d32000}, {0x42d34000}, {0x42d36000}, {0x42d38000}, {0x42d3a000}, {0x42d3c000}, {0x42d3e000}, {0x42d40000}, {0x42d42000}, {0x42d44000}, {0x42d46000}, {0x42d48000}, {0x42d4a000}, {0x42d4c000}, {0x42d4e000}, {0x42d50000}, {0x42d52000}, {0x42d54000}, {0x42d56000}, {0x42d58000}, {0x42d5a000}, {0x42d5c000}, {0x42d5e000}, {0x42d60000}, {0x42d62000}, {0x42d64000}, {0x42d66000}, {0x42d68000}, {0x42d6a000}, {0x42d6c000}, {0x42d6e000}, {0x42d70000}, {0x42d72000}, {0x42d74000}, {0x42d76000}, {0x42d78000}, {0x42d7a000}, {0x42d7c000}, {0x42d7e000}, {0x42d80000}, {0x42d82000}, {0x42d84000}, {0x42d86000}, {0x42d88000}, {0x42d8a000}, {0x42d8c000}, {0x42d8e000}, {0x42d90000}, {0x42d92000}, {0x42d94000}, {0x42d96000}, {0x42d98000}, {0x42d9a000}, {0x42d9c000}, {0x42d9e000}, {0x42da0000}, {0x42da2000}, {0x42da4000}, {0x42da6000}, {0x42da8000}, {0x42daa000}, {0x42dac000}, {0x42dae000}, {0x42db0000}, {0x42db2000}, {0x42db4000}, {0x42db6000}, {0x42db8000}, {0x42dba000}, {0x42dbc000}, {0x42dbe000}, {0x42dc0000}, {0x42dc2000}, {0x42dc4000}, {0x42dc6000}, {0x42dc8000}, {0x42dca000}, {0x42dcc000}, {0x42dce000}, {0x42dd0000}, {0x42dd2000}, {0x42dd4000}, {0x42dd6000}, {0x42dd8000}, {0x42dda000}, {0x42ddc000}, {0x42dde000}, {0x42de0000}, {0x42de2000}, {0x42de4000}, {0x42de6000}, {0x42de8000}, {0x42dea000}, {0x42dec000}, {0x42dee000}, {0x42df0000}, {0x42df2000}, {0x42df4000}, {0x42df6000}, {0x42df8000}, {0x42dfa000}, {0x42dfc000}, {0x42dfe000}, {0x42e00000}, {0x42e02000}, {0x42e04000}, {0x42e06000}, {0x42e08000}, {0x42e0a000}, {0x42e0c000}, {0x42e0e000}, {0x42e10000}, {0x42e12000}, {0x42e14000}, {0x42e16000}, {0x42e18000}, {0x42e1a000}, {0x42e1c000}, {0x42e1e000}, {0x42e20000}, {0x42e22000}, {0x42e24000}, {0x42e26000}, {0x42e28000}, {0x42e2a000}, {0x42e2c000}, {0x42e2e000}, {0x42e30000}, {0x42e32000}, {0x42e34000}, {0x42e36000}, {0x42e38000}, {0x42e3a000}, {0x42e3c000}, {0x42e3e000}, {0x42e40000}, {0x42e42000}, {0x42e44000}, {0x42e46000}, {0x42e48000}, {0x42e4a000}, {0x42e4c000}, {0x42e4e000}, {0x42e50000}, {0x42e52000}, {0x42e54000}, {0x42e56000}, {0x42e58000}, {0x42e5a000}, {0x42e5c000}, {0x42e5e000}, {0x42e60000}, {0x42e62000}, {0x42e64000}, {0x42e66000}, {0x42e68000}, {0x42e6a000}, {0x42e6c000}, {0x42e6e000}, {0x42e70000}, {0x42e72000}, {0x42e74000}, {0x42e76000}, {0x42e78000}, {0x42e7a000}, {0x42e7c000}, {0x42e7e000}, {0x42e80000}, {0x42e82000}, {0x42e84000}, {0x42e86000}, {0x42e88000}, {0x42e8a000}, {0x42e8c000}, {0x42e8e000}, {0x42e90000}, {0x42e92000}, {0x42e94000}, {0x42e96000}, {0x42e98000}, {0x42e9a000}, {0x42e9c000}, {0x42e9e000}, {0x42ea0000}, {0x42ea2000}, {0x42ea4000}, {0x42ea6000}, {0x42ea8000}, {0x42eaa000}, {0x42eac000}, {0x42eae000}, {0x42eb0000}, {0x42eb2000}, {0x42eb4000}, {0x42eb6000}, {0x42eb8000}, {0x42eba000}, {0x42ebc000}, {0x42ebe000}, {0x42ec0000}, {0x42ec2000}, {0x42ec4000}, {0x42ec6000}, {0x42ec8000}, {0x42eca000}, {0x42ecc000}, {0x42ece000}, {0x42ed0000}, {0x42ed2000}, {0x42ed4000}, {0x42ed6000}, {0x42ed8000}, {0x42eda000}, {0x42edc000}, {0x42ede000}, {0x42ee0000}, {0x42ee2000}, {0x42ee4000}, {0x42ee6000}, {0x42ee8000}, {0x42eea000}, {0x42eec000}, {0x42eee000}, {0x42ef0000}, {0x42ef2000}, {0x42ef4000}, {0x42ef6000}, {0x42ef8000}, {0x42efa000}, {0x42efc000}, {0x42efe000}, {0x42f00000}, {0x42f02000}, {0x42f04000}, {0x42f06000}, {0x42f08000}, {0x42f0a000}, {0x42f0c000}, {0x42f0e000}, {0x42f10000}, {0x42f12000}, {0x42f14000}, {0x42f16000}, {0x42f18000}, {0x42f1a000}, {0x42f1c000}, {0x42f1e000}, {0x42f20000}, {0x42f22000}, {0x42f24000}, {0x42f26000}, {0x42f28000}, {0x42f2a000}, {0x42f2c000}, {0x42f2e000}, {0x42f30000}, {0x42f32000}, {0x42f34000}, {0x42f36000}, {0x42f38000}, {0x42f3a000}, {0x42f3c000}, {0x42f3e000}, {0x42f40000}, {0x42f42000}, {0x42f44000}, {0x42f46000}, {0x42f48000}, {0x42f4a000}, {0x42f4c000}, {0x42f4e000}, {0x42f50000}, {0x42f52000}, {0x42f54000}, {0x42f56000}, {0x42f58000}, {0x42f5a000}, {0x42f5c000}, {0x42f5e000}, {0x42f60000}, {0x42f62000}, {0x42f64000}, {0x42f66000}, {0x42f68000}, {0x42f6a000}, {0x42f6c000}, {0x42f6e000}, {0x42f70000}, {0x42f72000}, {0x42f74000}, {0x42f76000}, {0x42f78000}, {0x42f7a000}, {0x42f7c000}, {0x42f7e000}, {0x42f80000}, {0x42f82000}, {0x42f84000}, {0x42f86000}, {0x42f88000}, {0x42f8a000}, {0x42f8c000}, {0x42f8e000}, {0x42f90000}, {0x42f92000}, {0x42f94000}, {0x42f96000}, {0x42f98000}, {0x42f9a000}, {0x42f9c000}, {0x42f9e000}, {0x42fa0000}, {0x42fa2000}, {0x42fa4000}, {0x42fa6000}, {0x42fa8000}, {0x42faa000}, {0x42fac000}, {0x42fae000}, {0x42fb0000}, {0x42fb2000}, {0x42fb4000}, {0x42fb6000}, {0x42fb8000}, {0x42fba000}, {0x42fbc000}, {0x42fbe000}, {0x42fc0000}, {0x42fc2000}, {0x42fc4000}, {0x42fc6000}, {0x42fc8000}, {0x42fca000}, {0x42fcc000}, {0x42fce000}, {0x42fd0000}, {0x42fd2000}, {0x42fd4000}, {0x42fd6000}, {0x42fd8000}, {0x42fda000}, {0x42fdc000}, {0x42fde000}, {0x42fe0000}, {0x42fe2000}, {0x42fe4000}, {0x42fe6000}, {0x42fe8000}, {0x42fea000}, {0x42fec000}, {0x42fee000}, {0x42ff0000}, {0x42ff2000}, {0x42ff4000}, {0x42ff6000}, {0x42ff8000}, {0x42ffa000}, {0x42ffc000}, {0x42ffe000}, {0x43000000}, {0x43002000}, {0x43004000}, {0x43006000}, {0x43008000}, {0x4300a000}, {0x4300c000}, {0x4300e000}, {0x43010000}, {0x43012000}, {0x43014000}, {0x43016000}, {0x43018000}, {0x4301a000}, {0x4301c000}, {0x4301e000}, {0x43020000}, {0x43022000}, {0x43024000}, {0x43026000}, {0x43028000}, {0x4302a000}, {0x4302c000}, {0x4302e000}, {0x43030000}, {0x43032000}, {0x43034000}, {0x43036000}, {0x43038000}, {0x4303a000}, {0x4303c000}, {0x4303e000}, {0x43040000}, {0x43042000}, {0x43044000}, {0x43046000}, {0x43048000}, {0x4304a000}, {0x4304c000}, {0x4304e000}, {0x43050000}, {0x43052000}, {0x43054000}, {0x43056000}, {0x43058000}, {0x4305a000}, {0x4305c000}, {0x4305e000}, {0x43060000}, {0x43062000}, {0x43064000}, {0x43066000}, {0x43068000}, {0x4306a000}, {0x4306c000}, {0x4306e000}, {0x43070000}, {0x43072000}, {0x43074000}, {0x43076000}, {0x43078000}, {0x4307a000}, {0x4307c000}, {0x4307e000}, {0x43080000}, {0x43082000}, {0x43084000}, {0x43086000}, {0x43088000}, {0x4308a000}, {0x4308c000}, {0x4308e000}, {0x43090000}, {0x43092000}, {0x43094000}, {0x43096000}, {0x43098000}, {0x4309a000}, {0x4309c000}, {0x4309e000}, {0x430a0000}, {0x430a2000}, {0x430a4000}, {0x430a6000}, {0x430a8000}, {0x430aa000}, {0x430ac000}, {0x430ae000}, {0x430b0000}, {0x430b2000}, {0x430b4000}, {0x430b6000}, {0x430b8000}, {0x430ba000}, {0x430bc000}, {0x430be000}, {0x430c0000}, {0x430c2000}, {0x430c4000}, {0x430c6000}, {0x430c8000}, {0x430ca000}, {0x430cc000}, {0x430ce000}, {0x430d0000}, {0x430d2000}, {0x430d4000}, {0x430d6000}, {0x430d8000}, {0x430da000}, {0x430dc000}, {0x430de000}, {0x430e0000}, {0x430e2000}, {0x430e4000}, {0x430e6000}, {0x430e8000}, {0x430ea000}, {0x430ec000}, {0x430ee000}, {0x430f0000}, {0x430f2000}, {0x430f4000}, {0x430f6000}, {0x430f8000}, {0x430fa000}, {0x430fc000}, {0x430fe000}, {0x43100000}, {0x43102000}, {0x43104000}, {0x43106000}, {0x43108000}, {0x4310a000}, {0x4310c000}, {0x4310e000}, {0x43110000}, {0x43112000}, {0x43114000}, {0x43116000}, {0x43118000}, {0x4311a000}, {0x4311c000}, {0x4311e000}, {0x43120000}, {0x43122000}, {0x43124000}, {0x43126000}, {0x43128000}, {0x4312a000}, {0x4312c000}, {0x4312e000}, {0x43130000}, {0x43132000}, {0x43134000}, {0x43136000}, {0x43138000}, {0x4313a000}, {0x4313c000}, {0x4313e000}, {0x43140000}, {0x43142000}, {0x43144000}, {0x43146000}, {0x43148000}, {0x4314a000}, {0x4314c000}, {0x4314e000}, {0x43150000}, {0x43152000}, {0x43154000}, {0x43156000}, {0x43158000}, {0x4315a000}, {0x4315c000}, {0x4315e000}, {0x43160000}, {0x43162000}, {0x43164000}, {0x43166000}, {0x43168000}, {0x4316a000}, {0x4316c000}, {0x4316e000}, {0x43170000}, {0x43172000}, {0x43174000}, {0x43176000}, {0x43178000}, {0x4317a000}, {0x4317c000}, {0x4317e000}, {0x43180000}, {0x43182000}, {0x43184000}, {0x43186000}, {0x43188000}, {0x4318a000}, {0x4318c000}, {0x4318e000}, {0x43190000}, {0x43192000}, {0x43194000}, {0x43196000}, {0x43198000}, {0x4319a000}, {0x4319c000}, {0x4319e000}, {0x431a0000}, {0x431a2000}, {0x431a4000}, {0x431a6000}, {0x431a8000}, {0x431aa000}, {0x431ac000}, {0x431ae000}, {0x431b0000}, {0x431b2000}, {0x431b4000}, {0x431b6000}, {0x431b8000}, {0x431ba000}, {0x431bc000}, {0x431be000}, {0x431c0000}, {0x431c2000}, {0x431c4000}, {0x431c6000}, {0x431c8000}, {0x431ca000}, {0x431cc000}, {0x431ce000}, {0x431d0000}, {0x431d2000}, {0x431d4000}, {0x431d6000}, {0x431d8000}, {0x431da000}, {0x431dc000}, {0x431de000}, {0x431e0000}, {0x431e2000}, {0x431e4000}, {0x431e6000}, {0x431e8000}, {0x431ea000}, {0x431ec000}, {0x431ee000}, {0x431f0000}, {0x431f2000}, {0x431f4000}, {0x431f6000}, {0x431f8000}, {0x431fa000}, {0x431fc000}, {0x431fe000}, {0x43200000}, {0x43202000}, {0x43204000}, {0x43206000}, {0x43208000}, {0x4320a000}, {0x4320c000}, {0x4320e000}, {0x43210000}, {0x43212000}, {0x43214000}, {0x43216000}, {0x43218000}, {0x4321a000}, {0x4321c000}, {0x4321e000}, {0x43220000}, {0x43222000}, {0x43224000}, {0x43226000}, {0x43228000}, {0x4322a000}, {0x4322c000}, {0x4322e000}, {0x43230000}, {0x43232000}, {0x43234000}, {0x43236000}, {0x43238000}, {0x4323a000}, {0x4323c000}, {0x4323e000}, {0x43240000}, {0x43242000}, {0x43244000}, {0x43246000}, {0x43248000}, {0x4324a000}, {0x4324c000}, {0x4324e000}, {0x43250000}, {0x43252000}, {0x43254000}, {0x43256000}, {0x43258000}, {0x4325a000}, {0x4325c000}, {0x4325e000}, {0x43260000}, {0x43262000}, {0x43264000}, {0x43266000}, {0x43268000}, {0x4326a000}, {0x4326c000}, {0x4326e000}, {0x43270000}, {0x43272000}, {0x43274000}, {0x43276000}, {0x43278000}, {0x4327a000}, {0x4327c000}, {0x4327e000}, {0x43280000}, {0x43282000}, {0x43284000}, {0x43286000}, {0x43288000}, {0x4328a000}, {0x4328c000}, {0x4328e000}, {0x43290000}, {0x43292000}, {0x43294000}, {0x43296000}, {0x43298000}, {0x4329a000}, {0x4329c000}, {0x4329e000}, {0x432a0000}, {0x432a2000}, {0x432a4000}, {0x432a6000}, {0x432a8000}, {0x432aa000}, {0x432ac000}, {0x432ae000}, {0x432b0000}, {0x432b2000}, {0x432b4000}, {0x432b6000}, {0x432b8000}, {0x432ba000}, {0x432bc000}, {0x432be000}, {0x432c0000}, {0x432c2000}, {0x432c4000}, {0x432c6000}, {0x432c8000}, {0x432ca000}, {0x432cc000}, {0x432ce000}, {0x432d0000}, {0x432d2000}, {0x432d4000}, {0x432d6000}, {0x432d8000}, {0x432da000}, {0x432dc000}, {0x432de000}, {0x432e0000}, {0x432e2000}, {0x432e4000}, {0x432e6000}, {0x432e8000}, {0x432ea000}, {0x432ec000}, {0x432ee000}, {0x432f0000}, {0x432f2000}, {0x432f4000}, {0x432f6000}, {0x432f8000}, {0x432fa000}, {0x432fc000}, {0x432fe000}, {0x43300000}, {0x43302000}, {0x43304000}, {0x43306000}, {0x43308000}, {0x4330a000}, {0x4330c000}, {0x4330e000}, {0x43310000}, {0x43312000}, {0x43314000}, {0x43316000}, {0x43318000}, {0x4331a000}, {0x4331c000}, {0x4331e000}, {0x43320000}, {0x43322000}, {0x43324000}, {0x43326000}, {0x43328000}, {0x4332a000}, {0x4332c000}, {0x4332e000}, {0x43330000}, {0x43332000}, {0x43334000}, {0x43336000}, {0x43338000}, {0x4333a000}, {0x4333c000}, {0x4333e000}, {0x43340000}, {0x43342000}, {0x43344000}, {0x43346000}, {0x43348000}, {0x4334a000}, {0x4334c000}, {0x4334e000}, {0x43350000}, {0x43352000}, {0x43354000}, {0x43356000}, {0x43358000}, {0x4335a000}, {0x4335c000}, {0x4335e000}, {0x43360000}, {0x43362000}, {0x43364000}, {0x43366000}, {0x43368000}, {0x4336a000}, {0x4336c000}, {0x4336e000}, {0x43370000}, {0x43372000}, {0x43374000}, {0x43376000}, {0x43378000}, {0x4337a000}, {0x4337c000}, {0x4337e000}, {0x43380000}, {0x43382000}, {0x43384000}, {0x43386000}, {0x43388000}, {0x4338a000}, {0x4338c000}, {0x4338e000}, {0x43390000}, {0x43392000}, {0x43394000}, {0x43396000}, {0x43398000}, {0x4339a000}, {0x4339c000}, {0x4339e000}, {0x433a0000}, {0x433a2000}, {0x433a4000}, {0x433a6000}, {0x433a8000}, {0x433aa000}, {0x433ac000}, {0x433ae000}, {0x433b0000}, {0x433b2000}, {0x433b4000}, {0x433b6000}, {0x433b8000}, {0x433ba000}, {0x433bc000}, {0x433be000}, {0x433c0000}, {0x433c2000}, {0x433c4000}, {0x433c6000}, {0x433c8000}, {0x433ca000}, {0x433cc000}, {0x433ce000}, {0x433d0000}, {0x433d2000}, {0x433d4000}, {0x433d6000}, {0x433d8000}, {0x433da000}, {0x433dc000}, {0x433de000}, {0x433e0000}, {0x433e2000}, {0x433e4000}, {0x433e6000}, {0x433e8000}, {0x433ea000}, {0x433ec000}, {0x433ee000}, {0x433f0000}, {0x433f2000}, {0x433f4000}, {0x433f6000}, {0x433f8000}, {0x433fa000}, {0x433fc000}, {0x433fe000}, {0x43400000}, {0x43402000}, {0x43404000}, {0x43406000}, {0x43408000}, {0x4340a000}, {0x4340c000}, {0x4340e000}, {0x43410000}, {0x43412000}, {0x43414000}, {0x43416000}, {0x43418000}, {0x4341a000}, {0x4341c000}, {0x4341e000}, {0x43420000}, {0x43422000}, {0x43424000}, {0x43426000}, {0x43428000}, {0x4342a000}, {0x4342c000}, {0x4342e000}, {0x43430000}, {0x43432000}, {0x43434000}, {0x43436000}, {0x43438000}, {0x4343a000}, {0x4343c000}, {0x4343e000}, {0x43440000}, {0x43442000}, {0x43444000}, {0x43446000}, {0x43448000}, {0x4344a000}, {0x4344c000}, {0x4344e000}, {0x43450000}, {0x43452000}, {0x43454000}, {0x43456000}, {0x43458000}, {0x4345a000}, {0x4345c000}, {0x4345e000}, {0x43460000}, {0x43462000}, {0x43464000}, {0x43466000}, {0x43468000}, {0x4346a000}, {0x4346c000}, {0x4346e000}, {0x43470000}, {0x43472000}, {0x43474000}, {0x43476000}, {0x43478000}, {0x4347a000}, {0x4347c000}, {0x4347e000}, {0x43480000}, {0x43482000}, {0x43484000}, {0x43486000}, {0x43488000}, {0x4348a000}, {0x4348c000}, {0x4348e000}, {0x43490000}, {0x43492000}, {0x43494000}, {0x43496000}, {0x43498000}, {0x4349a000}, {0x4349c000}, {0x4349e000}, {0x434a0000}, {0x434a2000}, {0x434a4000}, {0x434a6000}, {0x434a8000}, {0x434aa000}, {0x434ac000}, {0x434ae000}, {0x434b0000}, {0x434b2000}, {0x434b4000}, {0x434b6000}, {0x434b8000}, {0x434ba000}, {0x434bc000}, {0x434be000}, {0x434c0000}, {0x434c2000}, {0x434c4000}, {0x434c6000}, {0x434c8000}, {0x434ca000}, {0x434cc000}, {0x434ce000}, {0x434d0000}, {0x434d2000}, {0x434d4000}, {0x434d6000}, {0x434d8000}, {0x434da000}, {0x434dc000}, {0x434de000}, {0x434e0000}, {0x434e2000}, {0x434e4000}, {0x434e6000}, {0x434e8000}, {0x434ea000}, {0x434ec000}, {0x434ee000}, {0x434f0000}, {0x434f2000}, {0x434f4000}, {0x434f6000}, {0x434f8000}, {0x434fa000}, {0x434fc000}, {0x434fe000}, {0x43500000}, {0x43502000}, {0x43504000}, {0x43506000}, {0x43508000}, {0x4350a000}, {0x4350c000}, {0x4350e000}, {0x43510000}, {0x43512000}, {0x43514000}, {0x43516000}, {0x43518000}, {0x4351a000}, {0x4351c000}, {0x4351e000}, {0x43520000}, {0x43522000}, {0x43524000}, {0x43526000}, {0x43528000}, {0x4352a000}, {0x4352c000}, {0x4352e000}, {0x43530000}, {0x43532000}, {0x43534000}, {0x43536000}, {0x43538000}, {0x4353a000}, {0x4353c000}, {0x4353e000}, {0x43540000}, {0x43542000}, {0x43544000}, {0x43546000}, {0x43548000}, {0x4354a000}, {0x4354c000}, {0x4354e000}, {0x43550000}, {0x43552000}, {0x43554000}, {0x43556000}, {0x43558000}, {0x4355a000}, {0x4355c000}, {0x4355e000}, {0x43560000}, {0x43562000}, {0x43564000}, {0x43566000}, {0x43568000}, {0x4356a000}, {0x4356c000}, {0x4356e000}, {0x43570000}, {0x43572000}, {0x43574000}, {0x43576000}, {0x43578000}, {0x4357a000}, {0x4357c000}, {0x4357e000}, {0x43580000}, {0x43582000}, {0x43584000}, {0x43586000}, {0x43588000}, {0x4358a000}, {0x4358c000}, {0x4358e000}, {0x43590000}, {0x43592000}, {0x43594000}, {0x43596000}, {0x43598000}, {0x4359a000}, {0x4359c000}, {0x4359e000}, {0x435a0000}, {0x435a2000}, {0x435a4000}, {0x435a6000}, {0x435a8000}, {0x435aa000}, {0x435ac000}, {0x435ae000}, {0x435b0000}, {0x435b2000}, {0x435b4000}, {0x435b6000}, {0x435b8000}, {0x435ba000}, {0x435bc000}, {0x435be000}, {0x435c0000}, {0x435c2000}, {0x435c4000}, {0x435c6000}, {0x435c8000}, {0x435ca000}, {0x435cc000}, {0x435ce000}, {0x435d0000}, {0x435d2000}, {0x435d4000}, {0x435d6000}, {0x435d8000}, {0x435da000}, {0x435dc000}, {0x435de000}, {0x435e0000}, {0x435e2000}, {0x435e4000}, {0x435e6000}, {0x435e8000}, {0x435ea000}, {0x435ec000}, {0x435ee000}, {0x435f0000}, {0x435f2000}, {0x435f4000}, {0x435f6000}, {0x435f8000}, {0x435fa000}, {0x435fc000}, {0x435fe000}, {0x43600000}, {0x43602000}, {0x43604000}, {0x43606000}, {0x43608000}, {0x4360a000}, {0x4360c000}, {0x4360e000}, {0x43610000}, {0x43612000}, {0x43614000}, {0x43616000}, {0x43618000}, {0x4361a000}, {0x4361c000}, {0x4361e000}, {0x43620000}, {0x43622000}, {0x43624000}, {0x43626000}, {0x43628000}, {0x4362a000}, {0x4362c000}, {0x4362e000}, {0x43630000}, {0x43632000}, {0x43634000}, {0x43636000}, {0x43638000}, {0x4363a000}, {0x4363c000}, {0x4363e000}, {0x43640000}, {0x43642000}, {0x43644000}, {0x43646000}, {0x43648000}, {0x4364a000}, {0x4364c000}, {0x4364e000}, {0x43650000}, {0x43652000}, {0x43654000}, {0x43656000}, {0x43658000}, {0x4365a000}, {0x4365c000}, {0x4365e000}, {0x43660000}, {0x43662000}, {0x43664000}, {0x43666000}, {0x43668000}, {0x4366a000}, {0x4366c000}, {0x4366e000}, {0x43670000}, {0x43672000}, {0x43674000}, {0x43676000}, {0x43678000}, {0x4367a000}, {0x4367c000}, {0x4367e000}, {0x43680000}, {0x43682000}, {0x43684000}, {0x43686000}, {0x43688000}, {0x4368a000}, {0x4368c000}, {0x4368e000}, {0x43690000}, {0x43692000}, {0x43694000}, {0x43696000}, {0x43698000}, {0x4369a000}, {0x4369c000}, {0x4369e000}, {0x436a0000}, {0x436a2000}, {0x436a4000}, {0x436a6000}, {0x436a8000}, {0x436aa000}, {0x436ac000}, {0x436ae000}, {0x436b0000}, {0x436b2000}, {0x436b4000}, {0x436b6000}, {0x436b8000}, {0x436ba000}, {0x436bc000}, {0x436be000}, {0x436c0000}, {0x436c2000}, {0x436c4000}, {0x436c6000}, {0x436c8000}, {0x436ca000}, {0x436cc000}, {0x436ce000}, {0x436d0000}, {0x436d2000}, {0x436d4000}, {0x436d6000}, {0x436d8000}, {0x436da000}, {0x436dc000}, {0x436de000}, {0x436e0000}, {0x436e2000}, {0x436e4000}, {0x436e6000}, {0x436e8000}, {0x436ea000}, {0x436ec000}, {0x436ee000}, {0x436f0000}, {0x436f2000}, {0x436f4000}, {0x436f6000}, {0x436f8000}, {0x436fa000}, {0x436fc000}, {0x436fe000}, {0x43700000}, {0x43702000}, {0x43704000}, {0x43706000}, {0x43708000}, {0x4370a000}, {0x4370c000}, {0x4370e000}, {0x43710000}, {0x43712000}, {0x43714000}, {0x43716000}, {0x43718000}, {0x4371a000}, {0x4371c000}, {0x4371e000}, {0x43720000}, {0x43722000}, {0x43724000}, {0x43726000}, {0x43728000}, {0x4372a000}, {0x4372c000}, {0x4372e000}, {0x43730000}, {0x43732000}, {0x43734000}, {0x43736000}, {0x43738000}, {0x4373a000}, {0x4373c000}, {0x4373e000}, {0x43740000}, {0x43742000}, {0x43744000}, {0x43746000}, {0x43748000}, {0x4374a000}, {0x4374c000}, {0x4374e000}, {0x43750000}, {0x43752000}, {0x43754000}, {0x43756000}, {0x43758000}, {0x4375a000}, {0x4375c000}, {0x4375e000}, {0x43760000}, {0x43762000}, {0x43764000}, {0x43766000}, {0x43768000}, {0x4376a000}, {0x4376c000}, {0x4376e000}, {0x43770000}, {0x43772000}, {0x43774000}, {0x43776000}, {0x43778000}, {0x4377a000}, {0x4377c000}, {0x4377e000}, {0x43780000}, {0x43782000}, {0x43784000}, {0x43786000}, {0x43788000}, {0x4378a000}, {0x4378c000}, {0x4378e000}, {0x43790000}, {0x43792000}, {0x43794000}, {0x43796000}, {0x43798000}, {0x4379a000}, {0x4379c000}, {0x4379e000}, {0x437a0000}, {0x437a2000}, {0x437a4000}, {0x437a6000}, {0x437a8000}, {0x437aa000}, {0x437ac000}, {0x437ae000}, {0x437b0000}, {0x437b2000}, {0x437b4000}, {0x437b6000}, {0x437b8000}, {0x437ba000}, {0x437bc000}, {0x437be000}, {0x437c0000}, {0x437c2000}, {0x437c4000}, {0x437c6000}, {0x437c8000}, {0x437ca000}, {0x437cc000}, {0x437ce000}, {0x437d0000}, {0x437d2000}, {0x437d4000}, {0x437d6000}, {0x437d8000}, {0x437da000}, {0x437dc000}, {0x437de000}, {0x437e0000}, {0x437e2000}, {0x437e4000}, {0x437e6000}, {0x437e8000}, {0x437ea000}, {0x437ec000}, {0x437ee000}, {0x437f0000}, {0x437f2000}, {0x437f4000}, {0x437f6000}, {0x437f8000}, {0x437fa000}, {0x437fc000}, {0x437fe000}, {0x43800000}, {0x43802000}, {0x43804000}, {0x43806000}, {0x43808000}, {0x4380a000}, {0x4380c000}, {0x4380e000}, {0x43810000}, {0x43812000}, {0x43814000}, {0x43816000}, {0x43818000}, {0x4381a000}, {0x4381c000}, {0x4381e000}, {0x43820000}, {0x43822000}, {0x43824000}, {0x43826000}, {0x43828000}, {0x4382a000}, {0x4382c000}, {0x4382e000}, {0x43830000}, {0x43832000}, {0x43834000}, {0x43836000}, {0x43838000}, {0x4383a000}, {0x4383c000}, {0x4383e000}, {0x43840000}, {0x43842000}, {0x43844000}, {0x43846000}, {0x43848000}, {0x4384a000}, {0x4384c000}, {0x4384e000}, {0x43850000}, {0x43852000}, {0x43854000}, {0x43856000}, {0x43858000}, {0x4385a000}, {0x4385c000}, {0x4385e000}, {0x43860000}, {0x43862000}, {0x43864000}, {0x43866000}, {0x43868000}, {0x4386a000}, {0x4386c000}, {0x4386e000}, {0x43870000}, {0x43872000}, {0x43874000}, {0x43876000}, {0x43878000}, {0x4387a000}, {0x4387c000}, {0x4387e000}, {0x43880000}, {0x43882000}, {0x43884000}, {0x43886000}, {0x43888000}, {0x4388a000}, {0x4388c000}, {0x4388e000}, {0x43890000}, {0x43892000}, {0x43894000}, {0x43896000}, {0x43898000}, {0x4389a000}, {0x4389c000}, {0x4389e000}, {0x438a0000}, {0x438a2000}, {0x438a4000}, {0x438a6000}, {0x438a8000}, {0x438aa000}, {0x438ac000}, {0x438ae000}, {0x438b0000}, {0x438b2000}, {0x438b4000}, {0x438b6000}, {0x438b8000}, {0x438ba000}, {0x438bc000}, {0x438be000}, {0x438c0000}, {0x438c2000}, {0x438c4000}, {0x438c6000}, {0x438c8000}, {0x438ca000}, {0x438cc000}, {0x438ce000}, {0x438d0000}, {0x438d2000}, {0x438d4000}, {0x438d6000}, {0x438d8000}, {0x438da000}, {0x438dc000}, {0x438de000}, {0x438e0000}, {0x438e2000}, {0x438e4000}, {0x438e6000}, {0x438e8000}, {0x438ea000}, {0x438ec000}, {0x438ee000}, {0x438f0000}, {0x438f2000}, {0x438f4000}, {0x438f6000}, {0x438f8000}, {0x438fa000}, {0x438fc000}, {0x438fe000}, {0x43900000}, {0x43902000}, {0x43904000}, {0x43906000}, {0x43908000}, {0x4390a000}, {0x4390c000}, {0x4390e000}, {0x43910000}, {0x43912000}, {0x43914000}, {0x43916000}, {0x43918000}, {0x4391a000}, {0x4391c000}, {0x4391e000}, {0x43920000}, {0x43922000}, {0x43924000}, {0x43926000}, {0x43928000}, {0x4392a000}, {0x4392c000}, {0x4392e000}, {0x43930000}, {0x43932000}, {0x43934000}, {0x43936000}, {0x43938000}, {0x4393a000}, {0x4393c000}, {0x4393e000}, {0x43940000}, {0x43942000}, {0x43944000}, {0x43946000}, {0x43948000}, {0x4394a000}, {0x4394c000}, {0x4394e000}, {0x43950000}, {0x43952000}, {0x43954000}, {0x43956000}, {0x43958000}, {0x4395a000}, {0x4395c000}, {0x4395e000}, {0x43960000}, {0x43962000}, {0x43964000}, {0x43966000}, {0x43968000}, {0x4396a000}, {0x4396c000}, {0x4396e000}, {0x43970000}, {0x43972000}, {0x43974000}, {0x43976000}, {0x43978000}, {0x4397a000}, {0x4397c000}, {0x4397e000}, {0x43980000}, {0x43982000}, {0x43984000}, {0x43986000}, {0x43988000}, {0x4398a000}, {0x4398c000}, {0x4398e000}, {0x43990000}, {0x43992000}, {0x43994000}, {0x43996000}, {0x43998000}, {0x4399a000}, {0x4399c000}, {0x4399e000}, {0x439a0000}, {0x439a2000}, {0x439a4000}, {0x439a6000}, {0x439a8000}, {0x439aa000}, {0x439ac000}, {0x439ae000}, {0x439b0000}, {0x439b2000}, {0x439b4000}, {0x439b6000}, {0x439b8000}, {0x439ba000}, {0x439bc000}, {0x439be000}, {0x439c0000}, {0x439c2000}, {0x439c4000}, {0x439c6000}, {0x439c8000}, {0x439ca000}, {0x439cc000}, {0x439ce000}, {0x439d0000}, {0x439d2000}, {0x439d4000}, {0x439d6000}, {0x439d8000}, {0x439da000}, {0x439dc000}, {0x439de000}, {0x439e0000}, {0x439e2000}, {0x439e4000}, {0x439e6000}, {0x439e8000}, {0x439ea000}, {0x439ec000}, {0x439ee000}, {0x439f0000}, {0x439f2000}, {0x439f4000}, {0x439f6000}, {0x439f8000}, {0x439fa000}, {0x439fc000}, {0x439fe000}, {0x43a00000}, {0x43a02000}, {0x43a04000}, {0x43a06000}, {0x43a08000}, {0x43a0a000}, {0x43a0c000}, {0x43a0e000}, {0x43a10000}, {0x43a12000}, {0x43a14000}, {0x43a16000}, {0x43a18000}, {0x43a1a000}, {0x43a1c000}, {0x43a1e000}, {0x43a20000}, {0x43a22000}, {0x43a24000}, {0x43a26000}, {0x43a28000}, {0x43a2a000}, {0x43a2c000}, {0x43a2e000}, {0x43a30000}, {0x43a32000}, {0x43a34000}, {0x43a36000}, {0x43a38000}, {0x43a3a000}, {0x43a3c000}, {0x43a3e000}, {0x43a40000}, {0x43a42000}, {0x43a44000}, {0x43a46000}, {0x43a48000}, {0x43a4a000}, {0x43a4c000}, {0x43a4e000}, {0x43a50000}, {0x43a52000}, {0x43a54000}, {0x43a56000}, {0x43a58000}, {0x43a5a000}, {0x43a5c000}, {0x43a5e000}, {0x43a60000}, {0x43a62000}, {0x43a64000}, {0x43a66000}, {0x43a68000}, {0x43a6a000}, {0x43a6c000}, {0x43a6e000}, {0x43a70000}, {0x43a72000}, {0x43a74000}, {0x43a76000}, {0x43a78000}, {0x43a7a000}, {0x43a7c000}, {0x43a7e000}, {0x43a80000}, {0x43a82000}, {0x43a84000}, {0x43a86000}, {0x43a88000}, {0x43a8a000}, {0x43a8c000}, {0x43a8e000}, {0x43a90000}, {0x43a92000}, {0x43a94000}, {0x43a96000}, {0x43a98000}, {0x43a9a000}, {0x43a9c000}, {0x43a9e000}, {0x43aa0000}, {0x43aa2000}, {0x43aa4000}, {0x43aa6000}, {0x43aa8000}, {0x43aaa000}, {0x43aac000}, {0x43aae000}, {0x43ab0000}, {0x43ab2000}, {0x43ab4000}, {0x43ab6000}, {0x43ab8000}, {0x43aba000}, {0x43abc000}, {0x43abe000}, {0x43ac0000}, {0x43ac2000}, {0x43ac4000}, {0x43ac6000}, {0x43ac8000}, {0x43aca000}, {0x43acc000}, {0x43ace000}, {0x43ad0000}, {0x43ad2000}, {0x43ad4000}, {0x43ad6000}, {0x43ad8000}, {0x43ada000}, {0x43adc000}, {0x43ade000}, {0x43ae0000}, {0x43ae2000}, {0x43ae4000}, {0x43ae6000}, {0x43ae8000}, {0x43aea000}, {0x43aec000}, {0x43aee000}, {0x43af0000}, {0x43af2000}, {0x43af4000}, {0x43af6000}, {0x43af8000}, {0x43afa000}, {0x43afc000}, {0x43afe000}, {0x43b00000}, {0x43b02000}, {0x43b04000}, {0x43b06000}, {0x43b08000}, {0x43b0a000}, {0x43b0c000}, {0x43b0e000}, {0x43b10000}, {0x43b12000}, {0x43b14000}, {0x43b16000}, {0x43b18000}, {0x43b1a000}, {0x43b1c000}, {0x43b1e000}, {0x43b20000}, {0x43b22000}, {0x43b24000}, {0x43b26000}, {0x43b28000}, {0x43b2a000}, {0x43b2c000}, {0x43b2e000}, {0x43b30000}, {0x43b32000}, {0x43b34000}, {0x43b36000}, {0x43b38000}, {0x43b3a000}, {0x43b3c000}, {0x43b3e000}, {0x43b40000}, {0x43b42000}, {0x43b44000}, {0x43b46000}, {0x43b48000}, {0x43b4a000}, {0x43b4c000}, {0x43b4e000}, {0x43b50000}, {0x43b52000}, {0x43b54000}, {0x43b56000}, {0x43b58000}, {0x43b5a000}, {0x43b5c000}, {0x43b5e000}, {0x43b60000}, {0x43b62000}, {0x43b64000}, {0x43b66000}, {0x43b68000}, {0x43b6a000}, {0x43b6c000}, {0x43b6e000}, {0x43b70000}, {0x43b72000}, {0x43b74000}, {0x43b76000}, {0x43b78000}, {0x43b7a000}, {0x43b7c000}, {0x43b7e000}, {0x43b80000}, {0x43b82000}, {0x43b84000}, {0x43b86000}, {0x43b88000}, {0x43b8a000}, {0x43b8c000}, {0x43b8e000}, {0x43b90000}, {0x43b92000}, {0x43b94000}, {0x43b96000}, {0x43b98000}, {0x43b9a000}, {0x43b9c000}, {0x43b9e000}, {0x43ba0000}, {0x43ba2000}, {0x43ba4000}, {0x43ba6000}, {0x43ba8000}, {0x43baa000}, {0x43bac000}, {0x43bae000}, {0x43bb0000}, {0x43bb2000}, {0x43bb4000}, {0x43bb6000}, {0x43bb8000}, {0x43bba000}, {0x43bbc000}, {0x43bbe000}, {0x43bc0000}, {0x43bc2000}, {0x43bc4000}, {0x43bc6000}, {0x43bc8000}, {0x43bca000}, {0x43bcc000}, {0x43bce000}, {0x43bd0000}, {0x43bd2000}, {0x43bd4000}, {0x43bd6000}, {0x43bd8000}, {0x43bda000}, {0x43bdc000}, {0x43bde000}, {0x43be0000}, {0x43be2000}, {0x43be4000}, {0x43be6000}, {0x43be8000}, {0x43bea000}, {0x43bec000}, {0x43bee000}, {0x43bf0000}, {0x43bf2000}, {0x43bf4000}, {0x43bf6000}, {0x43bf8000}, {0x43bfa000}, {0x43bfc000}, {0x43bfe000}, {0x43c00000}, {0x43c02000}, {0x43c04000}, {0x43c06000}, {0x43c08000}, {0x43c0a000}, {0x43c0c000}, {0x43c0e000}, {0x43c10000}, {0x43c12000}, {0x43c14000}, {0x43c16000}, {0x43c18000}, {0x43c1a000}, {0x43c1c000}, {0x43c1e000}, {0x43c20000}, {0x43c22000}, {0x43c24000}, {0x43c26000}, {0x43c28000}, {0x43c2a000}, {0x43c2c000}, {0x43c2e000}, {0x43c30000}, {0x43c32000}, {0x43c34000}, {0x43c36000}, {0x43c38000}, {0x43c3a000}, {0x43c3c000}, {0x43c3e000}, {0x43c40000}, {0x43c42000}, {0x43c44000}, {0x43c46000}, {0x43c48000}, {0x43c4a000}, {0x43c4c000}, {0x43c4e000}, {0x43c50000}, {0x43c52000}, {0x43c54000}, {0x43c56000}, {0x43c58000}, {0x43c5a000}, {0x43c5c000}, {0x43c5e000}, {0x43c60000}, {0x43c62000}, {0x43c64000}, {0x43c66000}, {0x43c68000}, {0x43c6a000}, {0x43c6c000}, {0x43c6e000}, {0x43c70000}, {0x43c72000}, {0x43c74000}, {0x43c76000}, {0x43c78000}, {0x43c7a000}, {0x43c7c000}, {0x43c7e000}, {0x43c80000}, {0x43c82000}, {0x43c84000}, {0x43c86000}, {0x43c88000}, {0x43c8a000}, {0x43c8c000}, {0x43c8e000}, {0x43c90000}, {0x43c92000}, {0x43c94000}, {0x43c96000}, {0x43c98000}, {0x43c9a000}, {0x43c9c000}, {0x43c9e000}, {0x43ca0000}, {0x43ca2000}, {0x43ca4000}, {0x43ca6000}, {0x43ca8000}, {0x43caa000}, {0x43cac000}, {0x43cae000}, {0x43cb0000}, {0x43cb2000}, {0x43cb4000}, {0x43cb6000}, {0x43cb8000}, {0x43cba000}, {0x43cbc000}, {0x43cbe000}, {0x43cc0000}, {0x43cc2000}, {0x43cc4000}, {0x43cc6000}, {0x43cc8000}, {0x43cca000}, {0x43ccc000}, {0x43cce000}, {0x43cd0000}, {0x43cd2000}, {0x43cd4000}, {0x43cd6000}, {0x43cd8000}, {0x43cda000}, {0x43cdc000}, {0x43cde000}, {0x43ce0000}, {0x43ce2000}, {0x43ce4000}, {0x43ce6000}, {0x43ce8000}, {0x43cea000}, {0x43cec000}, {0x43cee000}, {0x43cf0000}, {0x43cf2000}, {0x43cf4000}, {0x43cf6000}, {0x43cf8000}, {0x43cfa000}, {0x43cfc000}, {0x43cfe000}, {0x43d00000}, {0x43d02000}, {0x43d04000}, {0x43d06000}, {0x43d08000}, {0x43d0a000}, {0x43d0c000}, {0x43d0e000}, {0x43d10000}, {0x43d12000}, {0x43d14000}, {0x43d16000}, {0x43d18000}, {0x43d1a000}, {0x43d1c000}, {0x43d1e000}, {0x43d20000}, {0x43d22000}, {0x43d24000}, {0x43d26000}, {0x43d28000}, {0x43d2a000}, {0x43d2c000}, {0x43d2e000}, {0x43d30000}, {0x43d32000}, {0x43d34000}, {0x43d36000}, {0x43d38000}, {0x43d3a000}, {0x43d3c000}, {0x43d3e000}, {0x43d40000}, {0x43d42000}, {0x43d44000}, {0x43d46000}, {0x43d48000}, {0x43d4a000}, {0x43d4c000}, {0x43d4e000}, {0x43d50000}, {0x43d52000}, {0x43d54000}, {0x43d56000}, {0x43d58000}, {0x43d5a000}, {0x43d5c000}, {0x43d5e000}, {0x43d60000}, {0x43d62000}, {0x43d64000}, {0x43d66000}, {0x43d68000}, {0x43d6a000}, {0x43d6c000}, {0x43d6e000}, {0x43d70000}, {0x43d72000}, {0x43d74000}, {0x43d76000}, {0x43d78000}, {0x43d7a000}, {0x43d7c000}, {0x43d7e000}, {0x43d80000}, {0x43d82000}, {0x43d84000}, {0x43d86000}, {0x43d88000}, {0x43d8a000}, {0x43d8c000}, {0x43d8e000}, {0x43d90000}, {0x43d92000}, {0x43d94000}, {0x43d96000}, {0x43d98000}, {0x43d9a000}, {0x43d9c000}, {0x43d9e000}, {0x43da0000}, {0x43da2000}, {0x43da4000}, {0x43da6000}, {0x43da8000}, {0x43daa000}, {0x43dac000}, {0x43dae000}, {0x43db0000}, {0x43db2000}, {0x43db4000}, {0x43db6000}, {0x43db8000}, {0x43dba000}, {0x43dbc000}, {0x43dbe000}, {0x43dc0000}, {0x43dc2000}, {0x43dc4000}, {0x43dc6000}, {0x43dc8000}, {0x43dca000}, {0x43dcc000}, {0x43dce000}, {0x43dd0000}, {0x43dd2000}, {0x43dd4000}, {0x43dd6000}, {0x43dd8000}, {0x43dda000}, {0x43ddc000}, {0x43dde000}, {0x43de0000}, {0x43de2000}, {0x43de4000}, {0x43de6000}, {0x43de8000}, {0x43dea000}, {0x43dec000}, {0x43dee000}, {0x43df0000}, {0x43df2000}, {0x43df4000}, {0x43df6000}, {0x43df8000}, {0x43dfa000}, {0x43dfc000}, {0x43dfe000}, {0x43e00000}, {0x43e02000}, {0x43e04000}, {0x43e06000}, {0x43e08000}, {0x43e0a000}, {0x43e0c000}, {0x43e0e000}, {0x43e10000}, {0x43e12000}, {0x43e14000}, {0x43e16000}, {0x43e18000}, {0x43e1a000}, {0x43e1c000}, {0x43e1e000}, {0x43e20000}, {0x43e22000}, {0x43e24000}, {0x43e26000}, {0x43e28000}, {0x43e2a000}, {0x43e2c000}, {0x43e2e000}, {0x43e30000}, {0x43e32000}, {0x43e34000}, {0x43e36000}, {0x43e38000}, {0x43e3a000}, {0x43e3c000}, {0x43e3e000}, {0x43e40000}, {0x43e42000}, {0x43e44000}, {0x43e46000}, {0x43e48000}, {0x43e4a000}, {0x43e4c000}, {0x43e4e000}, {0x43e50000}, {0x43e52000}, {0x43e54000}, {0x43e56000}, {0x43e58000}, {0x43e5a000}, {0x43e5c000}, {0x43e5e000}, {0x43e60000}, {0x43e62000}, {0x43e64000}, {0x43e66000}, {0x43e68000}, {0x43e6a000}, {0x43e6c000}, {0x43e6e000}, {0x43e70000}, {0x43e72000}, {0x43e74000}, {0x43e76000}, {0x43e78000}, {0x43e7a000}, {0x43e7c000}, {0x43e7e000}, {0x43e80000}, {0x43e82000}, {0x43e84000}, {0x43e86000}, {0x43e88000}, {0x43e8a000}, {0x43e8c000}, {0x43e8e000}, {0x43e90000}, {0x43e92000}, {0x43e94000}, {0x43e96000}, {0x43e98000}, {0x43e9a000}, {0x43e9c000}, {0x43e9e000}, {0x43ea0000}, {0x43ea2000}, {0x43ea4000}, {0x43ea6000}, {0x43ea8000}, {0x43eaa000}, {0x43eac000}, {0x43eae000}, {0x43eb0000}, {0x43eb2000}, {0x43eb4000}, {0x43eb6000}, {0x43eb8000}, {0x43eba000}, {0x43ebc000}, {0x43ebe000}, {0x43ec0000}, {0x43ec2000}, {0x43ec4000}, {0x43ec6000}, {0x43ec8000}, {0x43eca000}, {0x43ecc000}, {0x43ece000}, {0x43ed0000}, {0x43ed2000}, {0x43ed4000}, {0x43ed6000}, {0x43ed8000}, {0x43eda000}, {0x43edc000}, {0x43ede000}, {0x43ee0000}, {0x43ee2000}, {0x43ee4000}, {0x43ee6000}, {0x43ee8000}, {0x43eea000}, {0x43eec000}, {0x43eee000}, {0x43ef0000}, {0x43ef2000}, {0x43ef4000}, {0x43ef6000}, {0x43ef8000}, {0x43efa000}, {0x43efc000}, {0x43efe000}, {0x43f00000}, {0x43f02000}, {0x43f04000}, {0x43f06000}, {0x43f08000}, {0x43f0a000}, {0x43f0c000}, {0x43f0e000}, {0x43f10000}, {0x43f12000}, {0x43f14000}, {0x43f16000}, {0x43f18000}, {0x43f1a000}, {0x43f1c000}, {0x43f1e000}, {0x43f20000}, {0x43f22000}, {0x43f24000}, {0x43f26000}, {0x43f28000}, {0x43f2a000}, {0x43f2c000}, {0x43f2e000}, {0x43f30000}, {0x43f32000}, {0x43f34000}, {0x43f36000}, {0x43f38000}, {0x43f3a000}, {0x43f3c000}, {0x43f3e000}, {0x43f40000}, {0x43f42000}, {0x43f44000}, {0x43f46000}, {0x43f48000}, {0x43f4a000}, {0x43f4c000}, {0x43f4e000}, {0x43f50000}, {0x43f52000}, {0x43f54000}, {0x43f56000}, {0x43f58000}, {0x43f5a000}, {0x43f5c000}, {0x43f5e000}, {0x43f60000}, {0x43f62000}, {0x43f64000}, {0x43f66000}, {0x43f68000}, {0x43f6a000}, {0x43f6c000}, {0x43f6e000}, {0x43f70000}, {0x43f72000}, {0x43f74000}, {0x43f76000}, {0x43f78000}, {0x43f7a000}, {0x43f7c000}, {0x43f7e000}, {0x43f80000}, {0x43f82000}, {0x43f84000}, {0x43f86000}, {0x43f88000}, {0x43f8a000}, {0x43f8c000}, {0x43f8e000}, {0x43f90000}, {0x43f92000}, {0x43f94000}, {0x43f96000}, {0x43f98000}, {0x43f9a000}, {0x43f9c000}, {0x43f9e000}, {0x43fa0000}, {0x43fa2000}, {0x43fa4000}, {0x43fa6000}, {0x43fa8000}, {0x43faa000}, {0x43fac000}, {0x43fae000}, {0x43fb0000}, {0x43fb2000}, {0x43fb4000}, {0x43fb6000}, {0x43fb8000}, {0x43fba000}, {0x43fbc000}, {0x43fbe000}, {0x43fc0000}, {0x43fc2000}, {0x43fc4000}, {0x43fc6000}, {0x43fc8000}, {0x43fca000}, {0x43fcc000}, {0x43fce000}, {0x43fd0000}, {0x43fd2000}, {0x43fd4000}, {0x43fd6000}, {0x43fd8000}, {0x43fda000}, {0x43fdc000}, {0x43fde000}, {0x43fe0000}, {0x43fe2000}, {0x43fe4000}, {0x43fe6000}, {0x43fe8000}, {0x43fea000}, {0x43fec000}, {0x43fee000}, {0x43ff0000}, {0x43ff2000}, {0x43ff4000}, {0x43ff6000}, {0x43ff8000}, {0x43ffa000}, {0x43ffc000}, {0x43ffe000}, {0x44000000}, {0x44002000}, {0x44004000}, {0x44006000}, {0x44008000}, {0x4400a000}, {0x4400c000}, {0x4400e000}, {0x44010000}, {0x44012000}, {0x44014000}, {0x44016000}, {0x44018000}, {0x4401a000}, {0x4401c000}, {0x4401e000}, {0x44020000}, {0x44022000}, {0x44024000}, {0x44026000}, {0x44028000}, {0x4402a000}, {0x4402c000}, {0x4402e000}, {0x44030000}, {0x44032000}, {0x44034000}, {0x44036000}, {0x44038000}, {0x4403a000}, {0x4403c000}, {0x4403e000}, {0x44040000}, {0x44042000}, {0x44044000}, {0x44046000}, {0x44048000}, {0x4404a000}, {0x4404c000}, {0x4404e000}, {0x44050000}, {0x44052000}, {0x44054000}, {0x44056000}, {0x44058000}, {0x4405a000}, {0x4405c000}, {0x4405e000}, {0x44060000}, {0x44062000}, {0x44064000}, {0x44066000}, {0x44068000}, {0x4406a000}, {0x4406c000}, {0x4406e000}, {0x44070000}, {0x44072000}, {0x44074000}, {0x44076000}, {0x44078000}, {0x4407a000}, {0x4407c000}, {0x4407e000}, {0x44080000}, {0x44082000}, {0x44084000}, {0x44086000}, {0x44088000}, {0x4408a000}, {0x4408c000}, {0x4408e000}, {0x44090000}, {0x44092000}, {0x44094000}, {0x44096000}, {0x44098000}, {0x4409a000}, {0x4409c000}, {0x4409e000}, {0x440a0000}, {0x440a2000}, {0x440a4000}, {0x440a6000}, {0x440a8000}, {0x440aa000}, {0x440ac000}, {0x440ae000}, {0x440b0000}, {0x440b2000}, {0x440b4000}, {0x440b6000}, {0x440b8000}, {0x440ba000}, {0x440bc000}, {0x440be000}, {0x440c0000}, {0x440c2000}, {0x440c4000}, {0x440c6000}, {0x440c8000}, {0x440ca000}, {0x440cc000}, {0x440ce000}, {0x440d0000}, {0x440d2000}, {0x440d4000}, {0x440d6000}, {0x440d8000}, {0x440da000}, {0x440dc000}, {0x440de000}, {0x440e0000}, {0x440e2000}, {0x440e4000}, {0x440e6000}, {0x440e8000}, {0x440ea000}, {0x440ec000}, {0x440ee000}, {0x440f0000}, {0x440f2000}, {0x440f4000}, {0x440f6000}, {0x440f8000}, {0x440fa000}, {0x440fc000}, {0x440fe000}, {0x44100000}, {0x44102000}, {0x44104000}, {0x44106000}, {0x44108000}, {0x4410a000}, {0x4410c000}, {0x4410e000}, {0x44110000}, {0x44112000}, {0x44114000}, {0x44116000}, {0x44118000}, {0x4411a000}, {0x4411c000}, {0x4411e000}, {0x44120000}, {0x44122000}, {0x44124000}, {0x44126000}, {0x44128000}, {0x4412a000}, {0x4412c000}, {0x4412e000}, {0x44130000}, {0x44132000}, {0x44134000}, {0x44136000}, {0x44138000}, {0x4413a000}, {0x4413c000}, {0x4413e000}, {0x44140000}, {0x44142000}, {0x44144000}, {0x44146000}, {0x44148000}, {0x4414a000}, {0x4414c000}, {0x4414e000}, {0x44150000}, {0x44152000}, {0x44154000}, {0x44156000}, {0x44158000}, {0x4415a000}, {0x4415c000}, {0x4415e000}, {0x44160000}, {0x44162000}, {0x44164000}, {0x44166000}, {0x44168000}, {0x4416a000}, {0x4416c000}, {0x4416e000}, {0x44170000}, {0x44172000}, {0x44174000}, {0x44176000}, {0x44178000}, {0x4417a000}, {0x4417c000}, {0x4417e000}, {0x44180000}, {0x44182000}, {0x44184000}, {0x44186000}, {0x44188000}, {0x4418a000}, {0x4418c000}, {0x4418e000}, {0x44190000}, {0x44192000}, {0x44194000}, {0x44196000}, {0x44198000}, {0x4419a000}, {0x4419c000}, {0x4419e000}, {0x441a0000}, {0x441a2000}, {0x441a4000}, {0x441a6000}, {0x441a8000}, {0x441aa000}, {0x441ac000}, {0x441ae000}, {0x441b0000}, {0x441b2000}, {0x441b4000}, {0x441b6000}, {0x441b8000}, {0x441ba000}, {0x441bc000}, {0x441be000}, {0x441c0000}, {0x441c2000}, {0x441c4000}, {0x441c6000}, {0x441c8000}, {0x441ca000}, {0x441cc000}, {0x441ce000}, {0x441d0000}, {0x441d2000}, {0x441d4000}, {0x441d6000}, {0x441d8000}, {0x441da000}, {0x441dc000}, {0x441de000}, {0x441e0000}, {0x441e2000}, {0x441e4000}, {0x441e6000}, {0x441e8000}, {0x441ea000}, {0x441ec000}, {0x441ee000}, {0x441f0000}, {0x441f2000}, {0x441f4000}, {0x441f6000}, {0x441f8000}, {0x441fa000}, {0x441fc000}, {0x441fe000}, {0x44200000}, {0x44202000}, {0x44204000}, {0x44206000}, {0x44208000}, {0x4420a000}, {0x4420c000}, {0x4420e000}, {0x44210000}, {0x44212000}, {0x44214000}, {0x44216000}, {0x44218000}, {0x4421a000}, {0x4421c000}, {0x4421e000}, {0x44220000}, {0x44222000}, {0x44224000}, {0x44226000}, {0x44228000}, {0x4422a000}, {0x4422c000}, {0x4422e000}, {0x44230000}, {0x44232000}, {0x44234000}, {0x44236000}, {0x44238000}, {0x4423a000}, {0x4423c000}, {0x4423e000}, {0x44240000}, {0x44242000}, {0x44244000}, {0x44246000}, {0x44248000}, {0x4424a000}, {0x4424c000}, {0x4424e000}, {0x44250000}, {0x44252000}, {0x44254000}, {0x44256000}, {0x44258000}, {0x4425a000}, {0x4425c000}, {0x4425e000}, {0x44260000}, {0x44262000}, {0x44264000}, {0x44266000}, {0x44268000}, {0x4426a000}, {0x4426c000}, {0x4426e000}, {0x44270000}, {0x44272000}, {0x44274000}, {0x44276000}, {0x44278000}, {0x4427a000}, {0x4427c000}, {0x4427e000}, {0x44280000}, {0x44282000}, {0x44284000}, {0x44286000}, {0x44288000}, {0x4428a000}, {0x4428c000}, {0x4428e000}, {0x44290000}, {0x44292000}, {0x44294000}, {0x44296000}, {0x44298000}, {0x4429a000}, {0x4429c000}, {0x4429e000}, {0x442a0000}, {0x442a2000}, {0x442a4000}, {0x442a6000}, {0x442a8000}, {0x442aa000}, {0x442ac000}, {0x442ae000}, {0x442b0000}, {0x442b2000}, {0x442b4000}, {0x442b6000}, {0x442b8000}, {0x442ba000}, {0x442bc000}, {0x442be000}, {0x442c0000}, {0x442c2000}, {0x442c4000}, {0x442c6000}, {0x442c8000}, {0x442ca000}, {0x442cc000}, {0x442ce000}, {0x442d0000}, {0x442d2000}, {0x442d4000}, {0x442d6000}, {0x442d8000}, {0x442da000}, {0x442dc000}, {0x442de000}, {0x442e0000}, {0x442e2000}, {0x442e4000}, {0x442e6000}, {0x442e8000}, {0x442ea000}, {0x442ec000}, {0x442ee000}, {0x442f0000}, {0x442f2000}, {0x442f4000}, {0x442f6000}, {0x442f8000}, {0x442fa000}, {0x442fc000}, {0x442fe000}, {0x44300000}, {0x44302000}, {0x44304000}, {0x44306000}, {0x44308000}, {0x4430a000}, {0x4430c000}, {0x4430e000}, {0x44310000}, {0x44312000}, {0x44314000}, {0x44316000}, {0x44318000}, {0x4431a000}, {0x4431c000}, {0x4431e000}, {0x44320000}, {0x44322000}, {0x44324000}, {0x44326000}, {0x44328000}, {0x4432a000}, {0x4432c000}, {0x4432e000}, {0x44330000}, {0x44332000}, {0x44334000}, {0x44336000}, {0x44338000}, {0x4433a000}, {0x4433c000}, {0x4433e000}, {0x44340000}, {0x44342000}, {0x44344000}, {0x44346000}, {0x44348000}, {0x4434a000}, {0x4434c000}, {0x4434e000}, {0x44350000}, {0x44352000}, {0x44354000}, {0x44356000}, {0x44358000}, {0x4435a000}, {0x4435c000}, {0x4435e000}, {0x44360000}, {0x44362000}, {0x44364000}, {0x44366000}, {0x44368000}, {0x4436a000}, {0x4436c000}, {0x4436e000}, {0x44370000}, {0x44372000}, {0x44374000}, {0x44376000}, {0x44378000}, {0x4437a000}, {0x4437c000}, {0x4437e000}, {0x44380000}, {0x44382000}, {0x44384000}, {0x44386000}, {0x44388000}, {0x4438a000}, {0x4438c000}, {0x4438e000}, {0x44390000}, {0x44392000}, {0x44394000}, {0x44396000}, {0x44398000}, {0x4439a000}, {0x4439c000}, {0x4439e000}, {0x443a0000}, {0x443a2000}, {0x443a4000}, {0x443a6000}, {0x443a8000}, {0x443aa000}, {0x443ac000}, {0x443ae000}, {0x443b0000}, {0x443b2000}, {0x443b4000}, {0x443b6000}, {0x443b8000}, {0x443ba000}, {0x443bc000}, {0x443be000}, {0x443c0000}, {0x443c2000}, {0x443c4000}, {0x443c6000}, {0x443c8000}, {0x443ca000}, {0x443cc000}, {0x443ce000}, {0x443d0000}, {0x443d2000}, {0x443d4000}, {0x443d6000}, {0x443d8000}, {0x443da000}, {0x443dc000}, {0x443de000}, {0x443e0000}, {0x443e2000}, {0x443e4000}, {0x443e6000}, {0x443e8000}, {0x443ea000}, {0x443ec000}, {0x443ee000}, {0x443f0000}, {0x443f2000}, {0x443f4000}, {0x443f6000}, {0x443f8000}, {0x443fa000}, {0x443fc000}, {0x443fe000}, {0x44400000}, {0x44402000}, {0x44404000}, {0x44406000}, {0x44408000}, {0x4440a000}, {0x4440c000}, {0x4440e000}, {0x44410000}, {0x44412000}, {0x44414000}, {0x44416000}, {0x44418000}, {0x4441a000}, {0x4441c000}, {0x4441e000}, {0x44420000}, {0x44422000}, {0x44424000}, {0x44426000}, {0x44428000}, {0x4442a000}, {0x4442c000}, {0x4442e000}, {0x44430000}, {0x44432000}, {0x44434000}, {0x44436000}, {0x44438000}, {0x4443a000}, {0x4443c000}, {0x4443e000}, {0x44440000}, {0x44442000}, {0x44444000}, {0x44446000}, {0x44448000}, {0x4444a000}, {0x4444c000}, {0x4444e000}, {0x44450000}, {0x44452000}, {0x44454000}, {0x44456000}, {0x44458000}, {0x4445a000}, {0x4445c000}, {0x4445e000}, {0x44460000}, {0x44462000}, {0x44464000}, {0x44466000}, {0x44468000}, {0x4446a000}, {0x4446c000}, {0x4446e000}, {0x44470000}, {0x44472000}, {0x44474000}, {0x44476000}, {0x44478000}, {0x4447a000}, {0x4447c000}, {0x4447e000}, {0x44480000}, {0x44482000}, {0x44484000}, {0x44486000}, {0x44488000}, {0x4448a000}, {0x4448c000}, {0x4448e000}, {0x44490000}, {0x44492000}, {0x44494000}, {0x44496000}, {0x44498000}, {0x4449a000}, {0x4449c000}, {0x4449e000}, {0x444a0000}, {0x444a2000}, {0x444a4000}, {0x444a6000}, {0x444a8000}, {0x444aa000}, {0x444ac000}, {0x444ae000}, {0x444b0000}, {0x444b2000}, {0x444b4000}, {0x444b6000}, {0x444b8000}, {0x444ba000}, {0x444bc000}, {0x444be000}, {0x444c0000}, {0x444c2000}, {0x444c4000}, {0x444c6000}, {0x444c8000}, {0x444ca000}, {0x444cc000}, {0x444ce000}, {0x444d0000}, {0x444d2000}, {0x444d4000}, {0x444d6000}, {0x444d8000}, {0x444da000}, {0x444dc000}, {0x444de000}, {0x444e0000}, {0x444e2000}, {0x444e4000}, {0x444e6000}, {0x444e8000}, {0x444ea000}, {0x444ec000}, {0x444ee000}, {0x444f0000}, {0x444f2000}, {0x444f4000}, {0x444f6000}, {0x444f8000}, {0x444fa000}, {0x444fc000}, {0x444fe000}, {0x44500000}, {0x44502000}, {0x44504000}, {0x44506000}, {0x44508000}, {0x4450a000}, {0x4450c000}, {0x4450e000}, {0x44510000}, {0x44512000}, {0x44514000}, {0x44516000}, {0x44518000}, {0x4451a000}, {0x4451c000}, {0x4451e000}, {0x44520000}, {0x44522000}, {0x44524000}, {0x44526000}, {0x44528000}, {0x4452a000}, {0x4452c000}, {0x4452e000}, {0x44530000}, {0x44532000}, {0x44534000}, {0x44536000}, {0x44538000}, {0x4453a000}, {0x4453c000}, {0x4453e000}, {0x44540000}, {0x44542000}, {0x44544000}, {0x44546000}, {0x44548000}, {0x4454a000}, {0x4454c000}, {0x4454e000}, {0x44550000}, {0x44552000}, {0x44554000}, {0x44556000}, {0x44558000}, {0x4455a000}, {0x4455c000}, {0x4455e000}, {0x44560000}, {0x44562000}, {0x44564000}, {0x44566000}, {0x44568000}, {0x4456a000}, {0x4456c000}, {0x4456e000}, {0x44570000}, {0x44572000}, {0x44574000}, {0x44576000}, {0x44578000}, {0x4457a000}, {0x4457c000}, {0x4457e000}, {0x44580000}, {0x44582000}, {0x44584000}, {0x44586000}, {0x44588000}, {0x4458a000}, {0x4458c000}, {0x4458e000}, {0x44590000}, {0x44592000}, {0x44594000}, {0x44596000}, {0x44598000}, {0x4459a000}, {0x4459c000}, {0x4459e000}, {0x445a0000}, {0x445a2000}, {0x445a4000}, {0x445a6000}, {0x445a8000}, {0x445aa000}, {0x445ac000}, {0x445ae000}, {0x445b0000}, {0x445b2000}, {0x445b4000}, {0x445b6000}, {0x445b8000}, {0x445ba000}, {0x445bc000}, {0x445be000}, {0x445c0000}, {0x445c2000}, {0x445c4000}, {0x445c6000}, {0x445c8000}, {0x445ca000}, {0x445cc000}, {0x445ce000}, {0x445d0000}, {0x445d2000}, {0x445d4000}, {0x445d6000}, {0x445d8000}, {0x445da000}, {0x445dc000}, {0x445de000}, {0x445e0000}, {0x445e2000}, {0x445e4000}, {0x445e6000}, {0x445e8000}, {0x445ea000}, {0x445ec000}, {0x445ee000}, {0x445f0000}, {0x445f2000}, {0x445f4000}, {0x445f6000}, {0x445f8000}, {0x445fa000}, {0x445fc000}, {0x445fe000}, {0x44600000}, {0x44602000}, {0x44604000}, {0x44606000}, {0x44608000}, {0x4460a000}, {0x4460c000}, {0x4460e000}, {0x44610000}, {0x44612000}, {0x44614000}, {0x44616000}, {0x44618000}, {0x4461a000}, {0x4461c000}, {0x4461e000}, {0x44620000}, {0x44622000}, {0x44624000}, {0x44626000}, {0x44628000}, {0x4462a000}, {0x4462c000}, {0x4462e000}, {0x44630000}, {0x44632000}, {0x44634000}, {0x44636000}, {0x44638000}, {0x4463a000}, {0x4463c000}, {0x4463e000}, {0x44640000}, {0x44642000}, {0x44644000}, {0x44646000}, {0x44648000}, {0x4464a000}, {0x4464c000}, {0x4464e000}, {0x44650000}, {0x44652000}, {0x44654000}, {0x44656000}, {0x44658000}, {0x4465a000}, {0x4465c000}, {0x4465e000}, {0x44660000}, {0x44662000}, {0x44664000}, {0x44666000}, {0x44668000}, {0x4466a000}, {0x4466c000}, {0x4466e000}, {0x44670000}, {0x44672000}, {0x44674000}, {0x44676000}, {0x44678000}, {0x4467a000}, {0x4467c000}, {0x4467e000}, {0x44680000}, {0x44682000}, {0x44684000}, {0x44686000}, {0x44688000}, {0x4468a000}, {0x4468c000}, {0x4468e000}, {0x44690000}, {0x44692000}, {0x44694000}, {0x44696000}, {0x44698000}, {0x4469a000}, {0x4469c000}, {0x4469e000}, {0x446a0000}, {0x446a2000}, {0x446a4000}, {0x446a6000}, {0x446a8000}, {0x446aa000}, {0x446ac000}, {0x446ae000}, {0x446b0000}, {0x446b2000}, {0x446b4000}, {0x446b6000}, {0x446b8000}, {0x446ba000}, {0x446bc000}, {0x446be000}, {0x446c0000}, {0x446c2000}, {0x446c4000}, {0x446c6000}, {0x446c8000}, {0x446ca000}, {0x446cc000}, {0x446ce000}, {0x446d0000}, {0x446d2000}, {0x446d4000}, {0x446d6000}, {0x446d8000}, {0x446da000}, {0x446dc000}, {0x446de000}, {0x446e0000}, {0x446e2000}, {0x446e4000}, {0x446e6000}, {0x446e8000}, {0x446ea000}, {0x446ec000}, {0x446ee000}, {0x446f0000}, {0x446f2000}, {0x446f4000}, {0x446f6000}, {0x446f8000}, {0x446fa000}, {0x446fc000}, {0x446fe000}, {0x44700000}, {0x44702000}, {0x44704000}, {0x44706000}, {0x44708000}, {0x4470a000}, {0x4470c000}, {0x4470e000}, {0x44710000}, {0x44712000}, {0x44714000}, {0x44716000}, {0x44718000}, {0x4471a000}, {0x4471c000}, {0x4471e000}, {0x44720000}, {0x44722000}, {0x44724000}, {0x44726000}, {0x44728000}, {0x4472a000}, {0x4472c000}, {0x4472e000}, {0x44730000}, {0x44732000}, {0x44734000}, {0x44736000}, {0x44738000}, {0x4473a000}, {0x4473c000}, {0x4473e000}, {0x44740000}, {0x44742000}, {0x44744000}, {0x44746000}, {0x44748000}, {0x4474a000}, {0x4474c000}, {0x4474e000}, {0x44750000}, {0x44752000}, {0x44754000}, {0x44756000}, {0x44758000}, {0x4475a000}, {0x4475c000}, {0x4475e000}, {0x44760000}, {0x44762000}, {0x44764000}, {0x44766000}, {0x44768000}, {0x4476a000}, {0x4476c000}, {0x4476e000}, {0x44770000}, {0x44772000}, {0x44774000}, {0x44776000}, {0x44778000}, {0x4477a000}, {0x4477c000}, {0x4477e000}, {0x44780000}, {0x44782000}, {0x44784000}, {0x44786000}, {0x44788000}, {0x4478a000}, {0x4478c000}, {0x4478e000}, {0x44790000}, {0x44792000}, {0x44794000}, {0x44796000}, {0x44798000}, {0x4479a000}, {0x4479c000}, {0x4479e000}, {0x447a0000}, {0x447a2000}, {0x447a4000}, {0x447a6000}, {0x447a8000}, {0x447aa000}, {0x447ac000}, {0x447ae000}, {0x447b0000}, {0x447b2000}, {0x447b4000}, {0x447b6000}, {0x447b8000}, {0x447ba000}, {0x447bc000}, {0x447be000}, {0x447c0000}, {0x447c2000}, {0x447c4000}, {0x447c6000}, {0x447c8000}, {0x447ca000}, {0x447cc000}, {0x447ce000}, {0x447d0000}, {0x447d2000}, {0x447d4000}, {0x447d6000}, {0x447d8000}, {0x447da000}, {0x447dc000}, {0x447de000}, {0x447e0000}, {0x447e2000}, {0x447e4000}, {0x447e6000}, {0x447e8000}, {0x447ea000}, {0x447ec000}, {0x447ee000}, {0x447f0000}, {0x447f2000}, {0x447f4000}, {0x447f6000}, {0x447f8000}, {0x447fa000}, {0x447fc000}, {0x447fe000}, {0x44800000}, {0x44802000}, {0x44804000}, {0x44806000}, {0x44808000}, {0x4480a000}, {0x4480c000}, {0x4480e000}, {0x44810000}, {0x44812000}, {0x44814000}, {0x44816000}, {0x44818000}, {0x4481a000}, {0x4481c000}, {0x4481e000}, {0x44820000}, {0x44822000}, {0x44824000}, {0x44826000}, {0x44828000}, {0x4482a000}, {0x4482c000}, {0x4482e000}, {0x44830000}, {0x44832000}, {0x44834000}, {0x44836000}, {0x44838000}, {0x4483a000}, {0x4483c000}, {0x4483e000}, {0x44840000}, {0x44842000}, {0x44844000}, {0x44846000}, {0x44848000}, {0x4484a000}, {0x4484c000}, {0x4484e000}, {0x44850000}, {0x44852000}, {0x44854000}, {0x44856000}, {0x44858000}, {0x4485a000}, {0x4485c000}, {0x4485e000}, {0x44860000}, {0x44862000}, {0x44864000}, {0x44866000}, {0x44868000}, {0x4486a000}, {0x4486c000}, {0x4486e000}, {0x44870000}, {0x44872000}, {0x44874000}, {0x44876000}, {0x44878000}, {0x4487a000}, {0x4487c000}, {0x4487e000}, {0x44880000}, {0x44882000}, {0x44884000}, {0x44886000}, {0x44888000}, {0x4488a000}, {0x4488c000}, {0x4488e000}, {0x44890000}, {0x44892000}, {0x44894000}, {0x44896000}, {0x44898000}, {0x4489a000}, {0x4489c000}, {0x4489e000}, {0x448a0000}, {0x448a2000}, {0x448a4000}, {0x448a6000}, {0x448a8000}, {0x448aa000}, {0x448ac000}, {0x448ae000}, {0x448b0000}, {0x448b2000}, {0x448b4000}, {0x448b6000}, {0x448b8000}, {0x448ba000}, {0x448bc000}, {0x448be000}, {0x448c0000}, {0x448c2000}, {0x448c4000}, {0x448c6000}, {0x448c8000}, {0x448ca000}, {0x448cc000}, {0x448ce000}, {0x448d0000}, {0x448d2000}, {0x448d4000}, {0x448d6000}, {0x448d8000}, {0x448da000}, {0x448dc000}, {0x448de000}, {0x448e0000}, {0x448e2000}, {0x448e4000}, {0x448e6000}, {0x448e8000}, {0x448ea000}, {0x448ec000}, {0x448ee000}, {0x448f0000}, {0x448f2000}, {0x448f4000}, {0x448f6000}, {0x448f8000}, {0x448fa000}, {0x448fc000}, {0x448fe000}, {0x44900000}, {0x44902000}, {0x44904000}, {0x44906000}, {0x44908000}, {0x4490a000}, {0x4490c000}, {0x4490e000}, {0x44910000}, {0x44912000}, {0x44914000}, {0x44916000}, {0x44918000}, {0x4491a000}, {0x4491c000}, {0x4491e000}, {0x44920000}, {0x44922000}, {0x44924000}, {0x44926000}, {0x44928000}, {0x4492a000}, {0x4492c000}, {0x4492e000}, {0x44930000}, {0x44932000}, {0x44934000}, {0x44936000}, {0x44938000}, {0x4493a000}, {0x4493c000}, {0x4493e000}, {0x44940000}, {0x44942000}, {0x44944000}, {0x44946000}, {0x44948000}, {0x4494a000}, {0x4494c000}, {0x4494e000}, {0x44950000}, {0x44952000}, {0x44954000}, {0x44956000}, {0x44958000}, {0x4495a000}, {0x4495c000}, {0x4495e000}, {0x44960000}, {0x44962000}, {0x44964000}, {0x44966000}, {0x44968000}, {0x4496a000}, {0x4496c000}, {0x4496e000}, {0x44970000}, {0x44972000}, {0x44974000}, {0x44976000}, {0x44978000}, {0x4497a000}, {0x4497c000}, {0x4497e000}, {0x44980000}, {0x44982000}, {0x44984000}, {0x44986000}, {0x44988000}, {0x4498a000}, {0x4498c000}, {0x4498e000}, {0x44990000}, {0x44992000}, {0x44994000}, {0x44996000}, {0x44998000}, {0x4499a000}, {0x4499c000}, {0x4499e000}, {0x449a0000}, {0x449a2000}, {0x449a4000}, {0x449a6000}, {0x449a8000}, {0x449aa000}, {0x449ac000}, {0x449ae000}, {0x449b0000}, {0x449b2000}, {0x449b4000}, {0x449b6000}, {0x449b8000}, {0x449ba000}, {0x449bc000}, {0x449be000}, {0x449c0000}, {0x449c2000}, {0x449c4000}, {0x449c6000}, {0x449c8000}, {0x449ca000}, {0x449cc000}, {0x449ce000}, {0x449d0000}, {0x449d2000}, {0x449d4000}, {0x449d6000}, {0x449d8000}, {0x449da000}, {0x449dc000}, {0x449de000}, {0x449e0000}, {0x449e2000}, {0x449e4000}, {0x449e6000}, {0x449e8000}, {0x449ea000}, {0x449ec000}, {0x449ee000}, {0x449f0000}, {0x449f2000}, {0x449f4000}, {0x449f6000}, {0x449f8000}, {0x449fa000}, {0x449fc000}, {0x449fe000}, {0x44a00000}, {0x44a02000}, {0x44a04000}, {0x44a06000}, {0x44a08000}, {0x44a0a000}, {0x44a0c000}, {0x44a0e000}, {0x44a10000}, {0x44a12000}, {0x44a14000}, {0x44a16000}, {0x44a18000}, {0x44a1a000}, {0x44a1c000}, {0x44a1e000}, {0x44a20000}, {0x44a22000}, {0x44a24000}, {0x44a26000}, {0x44a28000}, {0x44a2a000}, {0x44a2c000}, {0x44a2e000}, {0x44a30000}, {0x44a32000}, {0x44a34000}, {0x44a36000}, {0x44a38000}, {0x44a3a000}, {0x44a3c000}, {0x44a3e000}, {0x44a40000}, {0x44a42000}, {0x44a44000}, {0x44a46000}, {0x44a48000}, {0x44a4a000}, {0x44a4c000}, {0x44a4e000}, {0x44a50000}, {0x44a52000}, {0x44a54000}, {0x44a56000}, {0x44a58000}, {0x44a5a000}, {0x44a5c000}, {0x44a5e000}, {0x44a60000}, {0x44a62000}, {0x44a64000}, {0x44a66000}, {0x44a68000}, {0x44a6a000}, {0x44a6c000}, {0x44a6e000}, {0x44a70000}, {0x44a72000}, {0x44a74000}, {0x44a76000}, {0x44a78000}, {0x44a7a000}, {0x44a7c000}, {0x44a7e000}, {0x44a80000}, {0x44a82000}, {0x44a84000}, {0x44a86000}, {0x44a88000}, {0x44a8a000}, {0x44a8c000}, {0x44a8e000}, {0x44a90000}, {0x44a92000}, {0x44a94000}, {0x44a96000}, {0x44a98000}, {0x44a9a000}, {0x44a9c000}, {0x44a9e000}, {0x44aa0000}, {0x44aa2000}, {0x44aa4000}, {0x44aa6000}, {0x44aa8000}, {0x44aaa000}, {0x44aac000}, {0x44aae000}, {0x44ab0000}, {0x44ab2000}, {0x44ab4000}, {0x44ab6000}, {0x44ab8000}, {0x44aba000}, {0x44abc000}, {0x44abe000}, {0x44ac0000}, {0x44ac2000}, {0x44ac4000}, {0x44ac6000}, {0x44ac8000}, {0x44aca000}, {0x44acc000}, {0x44ace000}, {0x44ad0000}, {0x44ad2000}, {0x44ad4000}, {0x44ad6000}, {0x44ad8000}, {0x44ada000}, {0x44adc000}, {0x44ade000}, {0x44ae0000}, {0x44ae2000}, {0x44ae4000}, {0x44ae6000}, {0x44ae8000}, {0x44aea000}, {0x44aec000}, {0x44aee000}, {0x44af0000}, {0x44af2000}, {0x44af4000}, {0x44af6000}, {0x44af8000}, {0x44afa000}, {0x44afc000}, {0x44afe000}, {0x44b00000}, {0x44b02000}, {0x44b04000}, {0x44b06000}, {0x44b08000}, {0x44b0a000}, {0x44b0c000}, {0x44b0e000}, {0x44b10000}, {0x44b12000}, {0x44b14000}, {0x44b16000}, {0x44b18000}, {0x44b1a000}, {0x44b1c000}, {0x44b1e000}, {0x44b20000}, {0x44b22000}, {0x44b24000}, {0x44b26000}, {0x44b28000}, {0x44b2a000}, {0x44b2c000}, {0x44b2e000}, {0x44b30000}, {0x44b32000}, {0x44b34000}, {0x44b36000}, {0x44b38000}, {0x44b3a000}, {0x44b3c000}, {0x44b3e000}, {0x44b40000}, {0x44b42000}, {0x44b44000}, {0x44b46000}, {0x44b48000}, {0x44b4a000}, {0x44b4c000}, {0x44b4e000}, {0x44b50000}, {0x44b52000}, {0x44b54000}, {0x44b56000}, {0x44b58000}, {0x44b5a000}, {0x44b5c000}, {0x44b5e000}, {0x44b60000}, {0x44b62000}, {0x44b64000}, {0x44b66000}, {0x44b68000}, {0x44b6a000}, {0x44b6c000}, {0x44b6e000}, {0x44b70000}, {0x44b72000}, {0x44b74000}, {0x44b76000}, {0x44b78000}, {0x44b7a000}, {0x44b7c000}, {0x44b7e000}, {0x44b80000}, {0x44b82000}, {0x44b84000}, {0x44b86000}, {0x44b88000}, {0x44b8a000}, {0x44b8c000}, {0x44b8e000}, {0x44b90000}, {0x44b92000}, {0x44b94000}, {0x44b96000}, {0x44b98000}, {0x44b9a000}, {0x44b9c000}, {0x44b9e000}, {0x44ba0000}, {0x44ba2000}, {0x44ba4000}, {0x44ba6000}, {0x44ba8000}, {0x44baa000}, {0x44bac000}, {0x44bae000}, {0x44bb0000}, {0x44bb2000}, {0x44bb4000}, {0x44bb6000}, {0x44bb8000}, {0x44bba000}, {0x44bbc000}, {0x44bbe000}, {0x44bc0000}, {0x44bc2000}, {0x44bc4000}, {0x44bc6000}, {0x44bc8000}, {0x44bca000}, {0x44bcc000}, {0x44bce000}, {0x44bd0000}, {0x44bd2000}, {0x44bd4000}, {0x44bd6000}, {0x44bd8000}, {0x44bda000}, {0x44bdc000}, {0x44bde000}, {0x44be0000}, {0x44be2000}, {0x44be4000}, {0x44be6000}, {0x44be8000}, {0x44bea000}, {0x44bec000}, {0x44bee000}, {0x44bf0000}, {0x44bf2000}, {0x44bf4000}, {0x44bf6000}, {0x44bf8000}, {0x44bfa000}, {0x44bfc000}, {0x44bfe000}, {0x44c00000}, {0x44c02000}, {0x44c04000}, {0x44c06000}, {0x44c08000}, {0x44c0a000}, {0x44c0c000}, {0x44c0e000}, {0x44c10000}, {0x44c12000}, {0x44c14000}, {0x44c16000}, {0x44c18000}, {0x44c1a000}, {0x44c1c000}, {0x44c1e000}, {0x44c20000}, {0x44c22000}, {0x44c24000}, {0x44c26000}, {0x44c28000}, {0x44c2a000}, {0x44c2c000}, {0x44c2e000}, {0x44c30000}, {0x44c32000}, {0x44c34000}, {0x44c36000}, {0x44c38000}, {0x44c3a000}, {0x44c3c000}, {0x44c3e000}, {0x44c40000}, {0x44c42000}, {0x44c44000}, {0x44c46000}, {0x44c48000}, {0x44c4a000}, {0x44c4c000}, {0x44c4e000}, {0x44c50000}, {0x44c52000}, {0x44c54000}, {0x44c56000}, {0x44c58000}, {0x44c5a000}, {0x44c5c000}, {0x44c5e000}, {0x44c60000}, {0x44c62000}, {0x44c64000}, {0x44c66000}, {0x44c68000}, {0x44c6a000}, {0x44c6c000}, {0x44c6e000}, {0x44c70000}, {0x44c72000}, {0x44c74000}, {0x44c76000}, {0x44c78000}, {0x44c7a000}, {0x44c7c000}, {0x44c7e000}, {0x44c80000}, {0x44c82000}, {0x44c84000}, {0x44c86000}, {0x44c88000}, {0x44c8a000}, {0x44c8c000}, {0x44c8e000}, {0x44c90000}, {0x44c92000}, {0x44c94000}, {0x44c96000}, {0x44c98000}, {0x44c9a000}, {0x44c9c000}, {0x44c9e000}, {0x44ca0000}, {0x44ca2000}, {0x44ca4000}, {0x44ca6000}, {0x44ca8000}, {0x44caa000}, {0x44cac000}, {0x44cae000}, {0x44cb0000}, {0x44cb2000}, {0x44cb4000}, {0x44cb6000}, {0x44cb8000}, {0x44cba000}, {0x44cbc000}, {0x44cbe000}, {0x44cc0000}, {0x44cc2000}, {0x44cc4000}, {0x44cc6000}, {0x44cc8000}, {0x44cca000}, {0x44ccc000}, {0x44cce000}, {0x44cd0000}, {0x44cd2000}, {0x44cd4000}, {0x44cd6000}, {0x44cd8000}, {0x44cda000}, {0x44cdc000}, {0x44cde000}, {0x44ce0000}, {0x44ce2000}, {0x44ce4000}, {0x44ce6000}, {0x44ce8000}, {0x44cea000}, {0x44cec000}, {0x44cee000}, {0x44cf0000}, {0x44cf2000}, {0x44cf4000}, {0x44cf6000}, {0x44cf8000}, {0x44cfa000}, {0x44cfc000}, {0x44cfe000}, {0x44d00000}, {0x44d02000}, {0x44d04000}, {0x44d06000}, {0x44d08000}, {0x44d0a000}, {0x44d0c000}, {0x44d0e000}, {0x44d10000}, {0x44d12000}, {0x44d14000}, {0x44d16000}, {0x44d18000}, {0x44d1a000}, {0x44d1c000}, {0x44d1e000}, {0x44d20000}, {0x44d22000}, {0x44d24000}, {0x44d26000}, {0x44d28000}, {0x44d2a000}, {0x44d2c000}, {0x44d2e000}, {0x44d30000}, {0x44d32000}, {0x44d34000}, {0x44d36000}, {0x44d38000}, {0x44d3a000}, {0x44d3c000}, {0x44d3e000}, {0x44d40000}, {0x44d42000}, {0x44d44000}, {0x44d46000}, {0x44d48000}, {0x44d4a000}, {0x44d4c000}, {0x44d4e000}, {0x44d50000}, {0x44d52000}, {0x44d54000}, {0x44d56000}, {0x44d58000}, {0x44d5a000}, {0x44d5c000}, {0x44d5e000}, {0x44d60000}, {0x44d62000}, {0x44d64000}, {0x44d66000}, {0x44d68000}, {0x44d6a000}, {0x44d6c000}, {0x44d6e000}, {0x44d70000}, {0x44d72000}, {0x44d74000}, {0x44d76000}, {0x44d78000}, {0x44d7a000}, {0x44d7c000}, {0x44d7e000}, {0x44d80000}, {0x44d82000}, {0x44d84000}, {0x44d86000}, {0x44d88000}, {0x44d8a000}, {0x44d8c000}, {0x44d8e000}, {0x44d90000}, {0x44d92000}, {0x44d94000}, {0x44d96000}, {0x44d98000}, {0x44d9a000}, {0x44d9c000}, {0x44d9e000}, {0x44da0000}, {0x44da2000}, {0x44da4000}, {0x44da6000}, {0x44da8000}, {0x44daa000}, {0x44dac000}, {0x44dae000}, {0x44db0000}, {0x44db2000}, {0x44db4000}, {0x44db6000}, {0x44db8000}, {0x44dba000}, {0x44dbc000}, {0x44dbe000}, {0x44dc0000}, {0x44dc2000}, {0x44dc4000}, {0x44dc6000}, {0x44dc8000}, {0x44dca000}, {0x44dcc000}, {0x44dce000}, {0x44dd0000}, {0x44dd2000}, {0x44dd4000}, {0x44dd6000}, {0x44dd8000}, {0x44dda000}, {0x44ddc000}, {0x44dde000}, {0x44de0000}, {0x44de2000}, {0x44de4000}, {0x44de6000}, {0x44de8000}, {0x44dea000}, {0x44dec000}, {0x44dee000}, {0x44df0000}, {0x44df2000}, {0x44df4000}, {0x44df6000}, {0x44df8000}, {0x44dfa000}, {0x44dfc000}, {0x44dfe000}, {0x44e00000}, {0x44e02000}, {0x44e04000}, {0x44e06000}, {0x44e08000}, {0x44e0a000}, {0x44e0c000}, {0x44e0e000}, {0x44e10000}, {0x44e12000}, {0x44e14000}, {0x44e16000}, {0x44e18000}, {0x44e1a000}, {0x44e1c000}, {0x44e1e000}, {0x44e20000}, {0x44e22000}, {0x44e24000}, {0x44e26000}, {0x44e28000}, {0x44e2a000}, {0x44e2c000}, {0x44e2e000}, {0x44e30000}, {0x44e32000}, {0x44e34000}, {0x44e36000}, {0x44e38000}, {0x44e3a000}, {0x44e3c000}, {0x44e3e000}, {0x44e40000}, {0x44e42000}, {0x44e44000}, {0x44e46000}, {0x44e48000}, {0x44e4a000}, {0x44e4c000}, {0x44e4e000}, {0x44e50000}, {0x44e52000}, {0x44e54000}, {0x44e56000}, {0x44e58000}, {0x44e5a000}, {0x44e5c000}, {0x44e5e000}, {0x44e60000}, {0x44e62000}, {0x44e64000}, {0x44e66000}, {0x44e68000}, {0x44e6a000}, {0x44e6c000}, {0x44e6e000}, {0x44e70000}, {0x44e72000}, {0x44e74000}, {0x44e76000}, {0x44e78000}, {0x44e7a000}, {0x44e7c000}, {0x44e7e000}, {0x44e80000}, {0x44e82000}, {0x44e84000}, {0x44e86000}, {0x44e88000}, {0x44e8a000}, {0x44e8c000}, {0x44e8e000}, {0x44e90000}, {0x44e92000}, {0x44e94000}, {0x44e96000}, {0x44e98000}, {0x44e9a000}, {0x44e9c000}, {0x44e9e000}, {0x44ea0000}, {0x44ea2000}, {0x44ea4000}, {0x44ea6000}, {0x44ea8000}, {0x44eaa000}, {0x44eac000}, {0x44eae000}, {0x44eb0000}, {0x44eb2000}, {0x44eb4000}, {0x44eb6000}, {0x44eb8000}, {0x44eba000}, {0x44ebc000}, {0x44ebe000}, {0x44ec0000}, {0x44ec2000}, {0x44ec4000}, {0x44ec6000}, {0x44ec8000}, {0x44eca000}, {0x44ecc000}, {0x44ece000}, {0x44ed0000}, {0x44ed2000}, {0x44ed4000}, {0x44ed6000}, {0x44ed8000}, {0x44eda000}, {0x44edc000}, {0x44ede000}, {0x44ee0000}, {0x44ee2000}, {0x44ee4000}, {0x44ee6000}, {0x44ee8000}, {0x44eea000}, {0x44eec000}, {0x44eee000}, {0x44ef0000}, {0x44ef2000}, {0x44ef4000}, {0x44ef6000}, {0x44ef8000}, {0x44efa000}, {0x44efc000}, {0x44efe000}, {0x44f00000}, {0x44f02000}, {0x44f04000}, {0x44f06000}, {0x44f08000}, {0x44f0a000}, {0x44f0c000}, {0x44f0e000}, {0x44f10000}, {0x44f12000}, {0x44f14000}, {0x44f16000}, {0x44f18000}, {0x44f1a000}, {0x44f1c000}, {0x44f1e000}, {0x44f20000}, {0x44f22000}, {0x44f24000}, {0x44f26000}, {0x44f28000}, {0x44f2a000}, {0x44f2c000}, {0x44f2e000}, {0x44f30000}, {0x44f32000}, {0x44f34000}, {0x44f36000}, {0x44f38000}, {0x44f3a000}, {0x44f3c000}, {0x44f3e000}, {0x44f40000}, {0x44f42000}, {0x44f44000}, {0x44f46000}, {0x44f48000}, {0x44f4a000}, {0x44f4c000}, {0x44f4e000}, {0x44f50000}, {0x44f52000}, {0x44f54000}, {0x44f56000}, {0x44f58000}, {0x44f5a000}, {0x44f5c000}, {0x44f5e000}, {0x44f60000}, {0x44f62000}, {0x44f64000}, {0x44f66000}, {0x44f68000}, {0x44f6a000}, {0x44f6c000}, {0x44f6e000}, {0x44f70000}, {0x44f72000}, {0x44f74000}, {0x44f76000}, {0x44f78000}, {0x44f7a000}, {0x44f7c000}, {0x44f7e000}, {0x44f80000}, {0x44f82000}, {0x44f84000}, {0x44f86000}, {0x44f88000}, {0x44f8a000}, {0x44f8c000}, {0x44f8e000}, {0x44f90000}, {0x44f92000}, {0x44f94000}, {0x44f96000}, {0x44f98000}, {0x44f9a000}, {0x44f9c000}, {0x44f9e000}, {0x44fa0000}, {0x44fa2000}, {0x44fa4000}, {0x44fa6000}, {0x44fa8000}, {0x44faa000}, {0x44fac000}, {0x44fae000}, {0x44fb0000}, {0x44fb2000}, {0x44fb4000}, {0x44fb6000}, {0x44fb8000}, {0x44fba000}, {0x44fbc000}, {0x44fbe000}, {0x44fc0000}, {0x44fc2000}, {0x44fc4000}, {0x44fc6000}, {0x44fc8000}, {0x44fca000}, {0x44fcc000}, {0x44fce000}, {0x44fd0000}, {0x44fd2000}, {0x44fd4000}, {0x44fd6000}, {0x44fd8000}, {0x44fda000}, {0x44fdc000}, {0x44fde000}, {0x44fe0000}, {0x44fe2000}, {0x44fe4000}, {0x44fe6000}, {0x44fe8000}, {0x44fea000}, {0x44fec000}, {0x44fee000}, {0x44ff0000}, {0x44ff2000}, {0x44ff4000}, {0x44ff6000}, {0x44ff8000}, {0x44ffa000}, {0x44ffc000}, {0x44ffe000}, {0x45000000}, {0x45002000}, {0x45004000}, {0x45006000}, {0x45008000}, {0x4500a000}, {0x4500c000}, {0x4500e000}, {0x45010000}, {0x45012000}, {0x45014000}, {0x45016000}, {0x45018000}, {0x4501a000}, {0x4501c000}, {0x4501e000}, {0x45020000}, {0x45022000}, {0x45024000}, {0x45026000}, {0x45028000}, {0x4502a000}, {0x4502c000}, {0x4502e000}, {0x45030000}, {0x45032000}, {0x45034000}, {0x45036000}, {0x45038000}, {0x4503a000}, {0x4503c000}, {0x4503e000}, {0x45040000}, {0x45042000}, {0x45044000}, {0x45046000}, {0x45048000}, {0x4504a000}, {0x4504c000}, {0x4504e000}, {0x45050000}, {0x45052000}, {0x45054000}, {0x45056000}, {0x45058000}, {0x4505a000}, {0x4505c000}, {0x4505e000}, {0x45060000}, {0x45062000}, {0x45064000}, {0x45066000}, {0x45068000}, {0x4506a000}, {0x4506c000}, {0x4506e000}, {0x45070000}, {0x45072000}, {0x45074000}, {0x45076000}, {0x45078000}, {0x4507a000}, {0x4507c000}, {0x4507e000}, {0x45080000}, {0x45082000}, {0x45084000}, {0x45086000}, {0x45088000}, {0x4508a000}, {0x4508c000}, {0x4508e000}, {0x45090000}, {0x45092000}, {0x45094000}, {0x45096000}, {0x45098000}, {0x4509a000}, {0x4509c000}, {0x4509e000}, {0x450a0000}, {0x450a2000}, {0x450a4000}, {0x450a6000}, {0x450a8000}, {0x450aa000}, {0x450ac000}, {0x450ae000}, {0x450b0000}, {0x450b2000}, {0x450b4000}, {0x450b6000}, {0x450b8000}, {0x450ba000}, {0x450bc000}, {0x450be000}, {0x450c0000}, {0x450c2000}, {0x450c4000}, {0x450c6000}, {0x450c8000}, {0x450ca000}, {0x450cc000}, {0x450ce000}, {0x450d0000}, {0x450d2000}, {0x450d4000}, {0x450d6000}, {0x450d8000}, {0x450da000}, {0x450dc000}, {0x450de000}, {0x450e0000}, {0x450e2000}, {0x450e4000}, {0x450e6000}, {0x450e8000}, {0x450ea000}, {0x450ec000}, {0x450ee000}, {0x450f0000}, {0x450f2000}, {0x450f4000}, {0x450f6000}, {0x450f8000}, {0x450fa000}, {0x450fc000}, {0x450fe000}, {0x45100000}, {0x45102000}, {0x45104000}, {0x45106000}, {0x45108000}, {0x4510a000}, {0x4510c000}, {0x4510e000}, {0x45110000}, {0x45112000}, {0x45114000}, {0x45116000}, {0x45118000}, {0x4511a000}, {0x4511c000}, {0x4511e000}, {0x45120000}, {0x45122000}, {0x45124000}, {0x45126000}, {0x45128000}, {0x4512a000}, {0x4512c000}, {0x4512e000}, {0x45130000}, {0x45132000}, {0x45134000}, {0x45136000}, {0x45138000}, {0x4513a000}, {0x4513c000}, {0x4513e000}, {0x45140000}, {0x45142000}, {0x45144000}, {0x45146000}, {0x45148000}, {0x4514a000}, {0x4514c000}, {0x4514e000}, {0x45150000}, {0x45152000}, {0x45154000}, {0x45156000}, {0x45158000}, {0x4515a000}, {0x4515c000}, {0x4515e000}, {0x45160000}, {0x45162000}, {0x45164000}, {0x45166000}, {0x45168000}, {0x4516a000}, {0x4516c000}, {0x4516e000}, {0x45170000}, {0x45172000}, {0x45174000}, {0x45176000}, {0x45178000}, {0x4517a000}, {0x4517c000}, {0x4517e000}, {0x45180000}, {0x45182000}, {0x45184000}, {0x45186000}, {0x45188000}, {0x4518a000}, {0x4518c000}, {0x4518e000}, {0x45190000}, {0x45192000}, {0x45194000}, {0x45196000}, {0x45198000}, {0x4519a000}, {0x4519c000}, {0x4519e000}, {0x451a0000}, {0x451a2000}, {0x451a4000}, {0x451a6000}, {0x451a8000}, {0x451aa000}, {0x451ac000}, {0x451ae000}, {0x451b0000}, {0x451b2000}, {0x451b4000}, {0x451b6000}, {0x451b8000}, {0x451ba000}, {0x451bc000}, {0x451be000}, {0x451c0000}, {0x451c2000}, {0x451c4000}, {0x451c6000}, {0x451c8000}, {0x451ca000}, {0x451cc000}, {0x451ce000}, {0x451d0000}, {0x451d2000}, {0x451d4000}, {0x451d6000}, {0x451d8000}, {0x451da000}, {0x451dc000}, {0x451de000}, {0x451e0000}, {0x451e2000}, {0x451e4000}, {0x451e6000}, {0x451e8000}, {0x451ea000}, {0x451ec000}, {0x451ee000}, {0x451f0000}, {0x451f2000}, {0x451f4000}, {0x451f6000}, {0x451f8000}, {0x451fa000}, {0x451fc000}, {0x451fe000}, {0x45200000}, {0x45202000}, {0x45204000}, {0x45206000}, {0x45208000}, {0x4520a000}, {0x4520c000}, {0x4520e000}, {0x45210000}, {0x45212000}, {0x45214000}, {0x45216000}, {0x45218000}, {0x4521a000}, {0x4521c000}, {0x4521e000}, {0x45220000}, {0x45222000}, {0x45224000}, {0x45226000}, {0x45228000}, {0x4522a000}, {0x4522c000}, {0x4522e000}, {0x45230000}, {0x45232000}, {0x45234000}, {0x45236000}, {0x45238000}, {0x4523a000}, {0x4523c000}, {0x4523e000}, {0x45240000}, {0x45242000}, {0x45244000}, {0x45246000}, {0x45248000}, {0x4524a000}, {0x4524c000}, {0x4524e000}, {0x45250000}, {0x45252000}, {0x45254000}, {0x45256000}, {0x45258000}, {0x4525a000}, {0x4525c000}, {0x4525e000}, {0x45260000}, {0x45262000}, {0x45264000}, {0x45266000}, {0x45268000}, {0x4526a000}, {0x4526c000}, {0x4526e000}, {0x45270000}, {0x45272000}, {0x45274000}, {0x45276000}, {0x45278000}, {0x4527a000}, {0x4527c000}, {0x4527e000}, {0x45280000}, {0x45282000}, {0x45284000}, {0x45286000}, {0x45288000}, {0x4528a000}, {0x4528c000}, {0x4528e000}, {0x45290000}, {0x45292000}, {0x45294000}, {0x45296000}, {0x45298000}, {0x4529a000}, {0x4529c000}, {0x4529e000}, {0x452a0000}, {0x452a2000}, {0x452a4000}, {0x452a6000}, {0x452a8000}, {0x452aa000}, {0x452ac000}, {0x452ae000}, {0x452b0000}, {0x452b2000}, {0x452b4000}, {0x452b6000}, {0x452b8000}, {0x452ba000}, {0x452bc000}, {0x452be000}, {0x452c0000}, {0x452c2000}, {0x452c4000}, {0x452c6000}, {0x452c8000}, {0x452ca000}, {0x452cc000}, {0x452ce000}, {0x452d0000}, {0x452d2000}, {0x452d4000}, {0x452d6000}, {0x452d8000}, {0x452da000}, {0x452dc000}, {0x452de000}, {0x452e0000}, {0x452e2000}, {0x452e4000}, {0x452e6000}, {0x452e8000}, {0x452ea000}, {0x452ec000}, {0x452ee000}, {0x452f0000}, {0x452f2000}, {0x452f4000}, {0x452f6000}, {0x452f8000}, {0x452fa000}, {0x452fc000}, {0x452fe000}, {0x45300000}, {0x45302000}, {0x45304000}, {0x45306000}, {0x45308000}, {0x4530a000}, {0x4530c000}, {0x4530e000}, {0x45310000}, {0x45312000}, {0x45314000}, {0x45316000}, {0x45318000}, {0x4531a000}, {0x4531c000}, {0x4531e000}, {0x45320000}, {0x45322000}, {0x45324000}, {0x45326000}, {0x45328000}, {0x4532a000}, {0x4532c000}, {0x4532e000}, {0x45330000}, {0x45332000}, {0x45334000}, {0x45336000}, {0x45338000}, {0x4533a000}, {0x4533c000}, {0x4533e000}, {0x45340000}, {0x45342000}, {0x45344000}, {0x45346000}, {0x45348000}, {0x4534a000}, {0x4534c000}, {0x4534e000}, {0x45350000}, {0x45352000}, {0x45354000}, {0x45356000}, {0x45358000}, {0x4535a000}, {0x4535c000}, {0x4535e000}, {0x45360000}, {0x45362000}, {0x45364000}, {0x45366000}, {0x45368000}, {0x4536a000}, {0x4536c000}, {0x4536e000}, {0x45370000}, {0x45372000}, {0x45374000}, {0x45376000}, {0x45378000}, {0x4537a000}, {0x4537c000}, {0x4537e000}, {0x45380000}, {0x45382000}, {0x45384000}, {0x45386000}, {0x45388000}, {0x4538a000}, {0x4538c000}, {0x4538e000}, {0x45390000}, {0x45392000}, {0x45394000}, {0x45396000}, {0x45398000}, {0x4539a000}, {0x4539c000}, {0x4539e000}, {0x453a0000}, {0x453a2000}, {0x453a4000}, {0x453a6000}, {0x453a8000}, {0x453aa000}, {0x453ac000}, {0x453ae000}, {0x453b0000}, {0x453b2000}, {0x453b4000}, {0x453b6000}, {0x453b8000}, {0x453ba000}, {0x453bc000}, {0x453be000}, {0x453c0000}, {0x453c2000}, {0x453c4000}, {0x453c6000}, {0x453c8000}, {0x453ca000}, {0x453cc000}, {0x453ce000}, {0x453d0000}, {0x453d2000}, {0x453d4000}, {0x453d6000}, {0x453d8000}, {0x453da000}, {0x453dc000}, {0x453de000}, {0x453e0000}, {0x453e2000}, {0x453e4000}, {0x453e6000}, {0x453e8000}, {0x453ea000}, {0x453ec000}, {0x453ee000}, {0x453f0000}, {0x453f2000}, {0x453f4000}, {0x453f6000}, {0x453f8000}, {0x453fa000}, {0x453fc000}, {0x453fe000}, {0x45400000}, {0x45402000}, {0x45404000}, {0x45406000}, {0x45408000}, {0x4540a000}, {0x4540c000}, {0x4540e000}, {0x45410000}, {0x45412000}, {0x45414000}, {0x45416000}, {0x45418000}, {0x4541a000}, {0x4541c000}, {0x4541e000}, {0x45420000}, {0x45422000}, {0x45424000}, {0x45426000}, {0x45428000}, {0x4542a000}, {0x4542c000}, {0x4542e000}, {0x45430000}, {0x45432000}, {0x45434000}, {0x45436000}, {0x45438000}, {0x4543a000}, {0x4543c000}, {0x4543e000}, {0x45440000}, {0x45442000}, {0x45444000}, {0x45446000}, {0x45448000}, {0x4544a000}, {0x4544c000}, {0x4544e000}, {0x45450000}, {0x45452000}, {0x45454000}, {0x45456000}, {0x45458000}, {0x4545a000}, {0x4545c000}, {0x4545e000}, {0x45460000}, {0x45462000}, {0x45464000}, {0x45466000}, {0x45468000}, {0x4546a000}, {0x4546c000}, {0x4546e000}, {0x45470000}, {0x45472000}, {0x45474000}, {0x45476000}, {0x45478000}, {0x4547a000}, {0x4547c000}, {0x4547e000}, {0x45480000}, {0x45482000}, {0x45484000}, {0x45486000}, {0x45488000}, {0x4548a000}, {0x4548c000}, {0x4548e000}, {0x45490000}, {0x45492000}, {0x45494000}, {0x45496000}, {0x45498000}, {0x4549a000}, {0x4549c000}, {0x4549e000}, {0x454a0000}, {0x454a2000}, {0x454a4000}, {0x454a6000}, {0x454a8000}, {0x454aa000}, {0x454ac000}, {0x454ae000}, {0x454b0000}, {0x454b2000}, {0x454b4000}, {0x454b6000}, {0x454b8000}, {0x454ba000}, {0x454bc000}, {0x454be000}, {0x454c0000}, {0x454c2000}, {0x454c4000}, {0x454c6000}, {0x454c8000}, {0x454ca000}, {0x454cc000}, {0x454ce000}, {0x454d0000}, {0x454d2000}, {0x454d4000}, {0x454d6000}, {0x454d8000}, {0x454da000}, {0x454dc000}, {0x454de000}, {0x454e0000}, {0x454e2000}, {0x454e4000}, {0x454e6000}, {0x454e8000}, {0x454ea000}, {0x454ec000}, {0x454ee000}, {0x454f0000}, {0x454f2000}, {0x454f4000}, {0x454f6000}, {0x454f8000}, {0x454fa000}, {0x454fc000}, {0x454fe000}, {0x45500000}, {0x45502000}, {0x45504000}, {0x45506000}, {0x45508000}, {0x4550a000}, {0x4550c000}, {0x4550e000}, {0x45510000}, {0x45512000}, {0x45514000}, {0x45516000}, {0x45518000}, {0x4551a000}, {0x4551c000}, {0x4551e000}, {0x45520000}, {0x45522000}, {0x45524000}, {0x45526000}, {0x45528000}, {0x4552a000}, {0x4552c000}, {0x4552e000}, {0x45530000}, {0x45532000}, {0x45534000}, {0x45536000}, {0x45538000}, {0x4553a000}, {0x4553c000}, {0x4553e000}, {0x45540000}, {0x45542000}, {0x45544000}, {0x45546000}, {0x45548000}, {0x4554a000}, {0x4554c000}, {0x4554e000}, {0x45550000}, {0x45552000}, {0x45554000}, {0x45556000}, {0x45558000}, {0x4555a000}, {0x4555c000}, {0x4555e000}, {0x45560000}, {0x45562000}, {0x45564000}, {0x45566000}, {0x45568000}, {0x4556a000}, {0x4556c000}, {0x4556e000}, {0x45570000}, {0x45572000}, {0x45574000}, {0x45576000}, {0x45578000}, {0x4557a000}, {0x4557c000}, {0x4557e000}, {0x45580000}, {0x45582000}, {0x45584000}, {0x45586000}, {0x45588000}, {0x4558a000}, {0x4558c000}, {0x4558e000}, {0x45590000}, {0x45592000}, {0x45594000}, {0x45596000}, {0x45598000}, {0x4559a000}, {0x4559c000}, {0x4559e000}, {0x455a0000}, {0x455a2000}, {0x455a4000}, {0x455a6000}, {0x455a8000}, {0x455aa000}, {0x455ac000}, {0x455ae000}, {0x455b0000}, {0x455b2000}, {0x455b4000}, {0x455b6000}, {0x455b8000}, {0x455ba000}, {0x455bc000}, {0x455be000}, {0x455c0000}, {0x455c2000}, {0x455c4000}, {0x455c6000}, {0x455c8000}, {0x455ca000}, {0x455cc000}, {0x455ce000}, {0x455d0000}, {0x455d2000}, {0x455d4000}, {0x455d6000}, {0x455d8000}, {0x455da000}, {0x455dc000}, {0x455de000}, {0x455e0000}, {0x455e2000}, {0x455e4000}, {0x455e6000}, {0x455e8000}, {0x455ea000}, {0x455ec000}, {0x455ee000}, {0x455f0000}, {0x455f2000}, {0x455f4000}, {0x455f6000}, {0x455f8000}, {0x455fa000}, {0x455fc000}, {0x455fe000}, {0x45600000}, {0x45602000}, {0x45604000}, {0x45606000}, {0x45608000}, {0x4560a000}, {0x4560c000}, {0x4560e000}, {0x45610000}, {0x45612000}, {0x45614000}, {0x45616000}, {0x45618000}, {0x4561a000}, {0x4561c000}, {0x4561e000}, {0x45620000}, {0x45622000}, {0x45624000}, {0x45626000}, {0x45628000}, {0x4562a000}, {0x4562c000}, {0x4562e000}, {0x45630000}, {0x45632000}, {0x45634000}, {0x45636000}, {0x45638000}, {0x4563a000}, {0x4563c000}, {0x4563e000}, {0x45640000}, {0x45642000}, {0x45644000}, {0x45646000}, {0x45648000}, {0x4564a000}, {0x4564c000}, {0x4564e000}, {0x45650000}, {0x45652000}, {0x45654000}, {0x45656000}, {0x45658000}, {0x4565a000}, {0x4565c000}, {0x4565e000}, {0x45660000}, {0x45662000}, {0x45664000}, {0x45666000}, {0x45668000}, {0x4566a000}, {0x4566c000}, {0x4566e000}, {0x45670000}, {0x45672000}, {0x45674000}, {0x45676000}, {0x45678000}, {0x4567a000}, {0x4567c000}, {0x4567e000}, {0x45680000}, {0x45682000}, {0x45684000}, {0x45686000}, {0x45688000}, {0x4568a000}, {0x4568c000}, {0x4568e000}, {0x45690000}, {0x45692000}, {0x45694000}, {0x45696000}, {0x45698000}, {0x4569a000}, {0x4569c000}, {0x4569e000}, {0x456a0000}, {0x456a2000}, {0x456a4000}, {0x456a6000}, {0x456a8000}, {0x456aa000}, {0x456ac000}, {0x456ae000}, {0x456b0000}, {0x456b2000}, {0x456b4000}, {0x456b6000}, {0x456b8000}, {0x456ba000}, {0x456bc000}, {0x456be000}, {0x456c0000}, {0x456c2000}, {0x456c4000}, {0x456c6000}, {0x456c8000}, {0x456ca000}, {0x456cc000}, {0x456ce000}, {0x456d0000}, {0x456d2000}, {0x456d4000}, {0x456d6000}, {0x456d8000}, {0x456da000}, {0x456dc000}, {0x456de000}, {0x456e0000}, {0x456e2000}, {0x456e4000}, {0x456e6000}, {0x456e8000}, {0x456ea000}, {0x456ec000}, {0x456ee000}, {0x456f0000}, {0x456f2000}, {0x456f4000}, {0x456f6000}, {0x456f8000}, {0x456fa000}, {0x456fc000}, {0x456fe000}, {0x45700000}, {0x45702000}, {0x45704000}, {0x45706000}, {0x45708000}, {0x4570a000}, {0x4570c000}, {0x4570e000}, {0x45710000}, {0x45712000}, {0x45714000}, {0x45716000}, {0x45718000}, {0x4571a000}, {0x4571c000}, {0x4571e000}, {0x45720000}, {0x45722000}, {0x45724000}, {0x45726000}, {0x45728000}, {0x4572a000}, {0x4572c000}, {0x4572e000}, {0x45730000}, {0x45732000}, {0x45734000}, {0x45736000}, {0x45738000}, {0x4573a000}, {0x4573c000}, {0x4573e000}, {0x45740000}, {0x45742000}, {0x45744000}, {0x45746000}, {0x45748000}, {0x4574a000}, {0x4574c000}, {0x4574e000}, {0x45750000}, {0x45752000}, {0x45754000}, {0x45756000}, {0x45758000}, {0x4575a000}, {0x4575c000}, {0x4575e000}, {0x45760000}, {0x45762000}, {0x45764000}, {0x45766000}, {0x45768000}, {0x4576a000}, {0x4576c000}, {0x4576e000}, {0x45770000}, {0x45772000}, {0x45774000}, {0x45776000}, {0x45778000}, {0x4577a000}, {0x4577c000}, {0x4577e000}, {0x45780000}, {0x45782000}, {0x45784000}, {0x45786000}, {0x45788000}, {0x4578a000}, {0x4578c000}, {0x4578e000}, {0x45790000}, {0x45792000}, {0x45794000}, {0x45796000}, {0x45798000}, {0x4579a000}, {0x4579c000}, {0x4579e000}, {0x457a0000}, {0x457a2000}, {0x457a4000}, {0x457a6000}, {0x457a8000}, {0x457aa000}, {0x457ac000}, {0x457ae000}, {0x457b0000}, {0x457b2000}, {0x457b4000}, {0x457b6000}, {0x457b8000}, {0x457ba000}, {0x457bc000}, {0x457be000}, {0x457c0000}, {0x457c2000}, {0x457c4000}, {0x457c6000}, {0x457c8000}, {0x457ca000}, {0x457cc000}, {0x457ce000}, {0x457d0000}, {0x457d2000}, {0x457d4000}, {0x457d6000}, {0x457d8000}, {0x457da000}, {0x457dc000}, {0x457de000}, {0x457e0000}, {0x457e2000}, {0x457e4000}, {0x457e6000}, {0x457e8000}, {0x457ea000}, {0x457ec000}, {0x457ee000}, {0x457f0000}, {0x457f2000}, {0x457f4000}, {0x457f6000}, {0x457f8000}, {0x457fa000}, {0x457fc000}, {0x457fe000}, {0x45800000}, {0x45802000}, {0x45804000}, {0x45806000}, {0x45808000}, {0x4580a000}, {0x4580c000}, {0x4580e000}, {0x45810000}, {0x45812000}, {0x45814000}, {0x45816000}, {0x45818000}, {0x4581a000}, {0x4581c000}, {0x4581e000}, {0x45820000}, {0x45822000}, {0x45824000}, {0x45826000}, {0x45828000}, {0x4582a000}, {0x4582c000}, {0x4582e000}, {0x45830000}, {0x45832000}, {0x45834000}, {0x45836000}, {0x45838000}, {0x4583a000}, {0x4583c000}, {0x4583e000}, {0x45840000}, {0x45842000}, {0x45844000}, {0x45846000}, {0x45848000}, {0x4584a000}, {0x4584c000}, {0x4584e000}, {0x45850000}, {0x45852000}, {0x45854000}, {0x45856000}, {0x45858000}, {0x4585a000}, {0x4585c000}, {0x4585e000}, {0x45860000}, {0x45862000}, {0x45864000}, {0x45866000}, {0x45868000}, {0x4586a000}, {0x4586c000}, {0x4586e000}, {0x45870000}, {0x45872000}, {0x45874000}, {0x45876000}, {0x45878000}, {0x4587a000}, {0x4587c000}, {0x4587e000}, {0x45880000}, {0x45882000}, {0x45884000}, {0x45886000}, {0x45888000}, {0x4588a000}, {0x4588c000}, {0x4588e000}, {0x45890000}, {0x45892000}, {0x45894000}, {0x45896000}, {0x45898000}, {0x4589a000}, {0x4589c000}, {0x4589e000}, {0x458a0000}, {0x458a2000}, {0x458a4000}, {0x458a6000}, {0x458a8000}, {0x458aa000}, {0x458ac000}, {0x458ae000}, {0x458b0000}, {0x458b2000}, {0x458b4000}, {0x458b6000}, {0x458b8000}, {0x458ba000}, {0x458bc000}, {0x458be000}, {0x458c0000}, {0x458c2000}, {0x458c4000}, {0x458c6000}, {0x458c8000}, {0x458ca000}, {0x458cc000}, {0x458ce000}, {0x458d0000}, {0x458d2000}, {0x458d4000}, {0x458d6000}, {0x458d8000}, {0x458da000}, {0x458dc000}, {0x458de000}, {0x458e0000}, {0x458e2000}, {0x458e4000}, {0x458e6000}, {0x458e8000}, {0x458ea000}, {0x458ec000}, {0x458ee000}, {0x458f0000}, {0x458f2000}, {0x458f4000}, {0x458f6000}, {0x458f8000}, {0x458fa000}, {0x458fc000}, {0x458fe000}, {0x45900000}, {0x45902000}, {0x45904000}, {0x45906000}, {0x45908000}, {0x4590a000}, {0x4590c000}, {0x4590e000}, {0x45910000}, {0x45912000}, {0x45914000}, {0x45916000}, {0x45918000}, {0x4591a000}, {0x4591c000}, {0x4591e000}, {0x45920000}, {0x45922000}, {0x45924000}, {0x45926000}, {0x45928000}, {0x4592a000}, {0x4592c000}, {0x4592e000}, {0x45930000}, {0x45932000}, {0x45934000}, {0x45936000}, {0x45938000}, {0x4593a000}, {0x4593c000}, {0x4593e000}, {0x45940000}, {0x45942000}, {0x45944000}, {0x45946000}, {0x45948000}, {0x4594a000}, {0x4594c000}, {0x4594e000}, {0x45950000}, {0x45952000}, {0x45954000}, {0x45956000}, {0x45958000}, {0x4595a000}, {0x4595c000}, {0x4595e000}, {0x45960000}, {0x45962000}, {0x45964000}, {0x45966000}, {0x45968000}, {0x4596a000}, {0x4596c000}, {0x4596e000}, {0x45970000}, {0x45972000}, {0x45974000}, {0x45976000}, {0x45978000}, {0x4597a000}, {0x4597c000}, {0x4597e000}, {0x45980000}, {0x45982000}, {0x45984000}, {0x45986000}, {0x45988000}, {0x4598a000}, {0x4598c000}, {0x4598e000}, {0x45990000}, {0x45992000}, {0x45994000}, {0x45996000}, {0x45998000}, {0x4599a000}, {0x4599c000}, {0x4599e000}, {0x459a0000}, {0x459a2000}, {0x459a4000}, {0x459a6000}, {0x459a8000}, {0x459aa000}, {0x459ac000}, {0x459ae000}, {0x459b0000}, {0x459b2000}, {0x459b4000}, {0x459b6000}, {0x459b8000}, {0x459ba000}, {0x459bc000}, {0x459be000}, {0x459c0000}, {0x459c2000}, {0x459c4000}, {0x459c6000}, {0x459c8000}, {0x459ca000}, {0x459cc000}, {0x459ce000}, {0x459d0000}, {0x459d2000}, {0x459d4000}, {0x459d6000}, {0x459d8000}, {0x459da000}, {0x459dc000}, {0x459de000}, {0x459e0000}, {0x459e2000}, {0x459e4000}, {0x459e6000}, {0x459e8000}, {0x459ea000}, {0x459ec000}, {0x459ee000}, {0x459f0000}, {0x459f2000}, {0x459f4000}, {0x459f6000}, {0x459f8000}, {0x459fa000}, {0x459fc000}, {0x459fe000}, {0x45a00000}, {0x45a02000}, {0x45a04000}, {0x45a06000}, {0x45a08000}, {0x45a0a000}, {0x45a0c000}, {0x45a0e000}, {0x45a10000}, {0x45a12000}, {0x45a14000}, {0x45a16000}, {0x45a18000}, {0x45a1a000}, {0x45a1c000}, {0x45a1e000}, {0x45a20000}, {0x45a22000}, {0x45a24000}, {0x45a26000}, {0x45a28000}, {0x45a2a000}, {0x45a2c000}, {0x45a2e000}, {0x45a30000}, {0x45a32000}, {0x45a34000}, {0x45a36000}, {0x45a38000}, {0x45a3a000}, {0x45a3c000}, {0x45a3e000}, {0x45a40000}, {0x45a42000}, {0x45a44000}, {0x45a46000}, {0x45a48000}, {0x45a4a000}, {0x45a4c000}, {0x45a4e000}, {0x45a50000}, {0x45a52000}, {0x45a54000}, {0x45a56000}, {0x45a58000}, {0x45a5a000}, {0x45a5c000}, {0x45a5e000}, {0x45a60000}, {0x45a62000}, {0x45a64000}, {0x45a66000}, {0x45a68000}, {0x45a6a000}, {0x45a6c000}, {0x45a6e000}, {0x45a70000}, {0x45a72000}, {0x45a74000}, {0x45a76000}, {0x45a78000}, {0x45a7a000}, {0x45a7c000}, {0x45a7e000}, {0x45a80000}, {0x45a82000}, {0x45a84000}, {0x45a86000}, {0x45a88000}, {0x45a8a000}, {0x45a8c000}, {0x45a8e000}, {0x45a90000}, {0x45a92000}, {0x45a94000}, {0x45a96000}, {0x45a98000}, {0x45a9a000}, {0x45a9c000}, {0x45a9e000}, {0x45aa0000}, {0x45aa2000}, {0x45aa4000}, {0x45aa6000}, {0x45aa8000}, {0x45aaa000}, {0x45aac000}, {0x45aae000}, {0x45ab0000}, {0x45ab2000}, {0x45ab4000}, {0x45ab6000}, {0x45ab8000}, {0x45aba000}, {0x45abc000}, {0x45abe000}, {0x45ac0000}, {0x45ac2000}, {0x45ac4000}, {0x45ac6000}, {0x45ac8000}, {0x45aca000}, {0x45acc000}, {0x45ace000}, {0x45ad0000}, {0x45ad2000}, {0x45ad4000}, {0x45ad6000}, {0x45ad8000}, {0x45ada000}, {0x45adc000}, {0x45ade000}, {0x45ae0000}, {0x45ae2000}, {0x45ae4000}, {0x45ae6000}, {0x45ae8000}, {0x45aea000}, {0x45aec000}, {0x45aee000}, {0x45af0000}, {0x45af2000}, {0x45af4000}, {0x45af6000}, {0x45af8000}, {0x45afa000}, {0x45afc000}, {0x45afe000}, {0x45b00000}, {0x45b02000}, {0x45b04000}, {0x45b06000}, {0x45b08000}, {0x45b0a000}, {0x45b0c000}, {0x45b0e000}, {0x45b10000}, {0x45b12000}, {0x45b14000}, {0x45b16000}, {0x45b18000}, {0x45b1a000}, {0x45b1c000}, {0x45b1e000}, {0x45b20000}, {0x45b22000}, {0x45b24000}, {0x45b26000}, {0x45b28000}, {0x45b2a000}, {0x45b2c000}, {0x45b2e000}, {0x45b30000}, {0x45b32000}, {0x45b34000}, {0x45b36000}, {0x45b38000}, {0x45b3a000}, {0x45b3c000}, {0x45b3e000}, {0x45b40000}, {0x45b42000}, {0x45b44000}, {0x45b46000}, {0x45b48000}, {0x45b4a000}, {0x45b4c000}, {0x45b4e000}, {0x45b50000}, {0x45b52000}, {0x45b54000}, {0x45b56000}, {0x45b58000}, {0x45b5a000}, {0x45b5c000}, {0x45b5e000}, {0x45b60000}, {0x45b62000}, {0x45b64000}, {0x45b66000}, {0x45b68000}, {0x45b6a000}, {0x45b6c000}, {0x45b6e000}, {0x45b70000}, {0x45b72000}, {0x45b74000}, {0x45b76000}, {0x45b78000}, {0x45b7a000}, {0x45b7c000}, {0x45b7e000}, {0x45b80000}, {0x45b82000}, {0x45b84000}, {0x45b86000}, {0x45b88000}, {0x45b8a000}, {0x45b8c000}, {0x45b8e000}, {0x45b90000}, {0x45b92000}, {0x45b94000}, {0x45b96000}, {0x45b98000}, {0x45b9a000}, {0x45b9c000}, {0x45b9e000}, {0x45ba0000}, {0x45ba2000}, {0x45ba4000}, {0x45ba6000}, {0x45ba8000}, {0x45baa000}, {0x45bac000}, {0x45bae000}, {0x45bb0000}, {0x45bb2000}, {0x45bb4000}, {0x45bb6000}, {0x45bb8000}, {0x45bba000}, {0x45bbc000}, {0x45bbe000}, {0x45bc0000}, {0x45bc2000}, {0x45bc4000}, {0x45bc6000}, {0x45bc8000}, {0x45bca000}, {0x45bcc000}, {0x45bce000}, {0x45bd0000}, {0x45bd2000}, {0x45bd4000}, {0x45bd6000}, {0x45bd8000}, {0x45bda000}, {0x45bdc000}, {0x45bde000}, {0x45be0000}, {0x45be2000}, {0x45be4000}, {0x45be6000}, {0x45be8000}, {0x45bea000}, {0x45bec000}, {0x45bee000}, {0x45bf0000}, {0x45bf2000}, {0x45bf4000}, {0x45bf6000}, {0x45bf8000}, {0x45bfa000}, {0x45bfc000}, {0x45bfe000}, {0x45c00000}, {0x45c02000}, {0x45c04000}, {0x45c06000}, {0x45c08000}, {0x45c0a000}, {0x45c0c000}, {0x45c0e000}, {0x45c10000}, {0x45c12000}, {0x45c14000}, {0x45c16000}, {0x45c18000}, {0x45c1a000}, {0x45c1c000}, {0x45c1e000}, {0x45c20000}, {0x45c22000}, {0x45c24000}, {0x45c26000}, {0x45c28000}, {0x45c2a000}, {0x45c2c000}, {0x45c2e000}, {0x45c30000}, {0x45c32000}, {0x45c34000}, {0x45c36000}, {0x45c38000}, {0x45c3a000}, {0x45c3c000}, {0x45c3e000}, {0x45c40000}, {0x45c42000}, {0x45c44000}, {0x45c46000}, {0x45c48000}, {0x45c4a000}, {0x45c4c000}, {0x45c4e000}, {0x45c50000}, {0x45c52000}, {0x45c54000}, {0x45c56000}, {0x45c58000}, {0x45c5a000}, {0x45c5c000}, {0x45c5e000}, {0x45c60000}, {0x45c62000}, {0x45c64000}, {0x45c66000}, {0x45c68000}, {0x45c6a000}, {0x45c6c000}, {0x45c6e000}, {0x45c70000}, {0x45c72000}, {0x45c74000}, {0x45c76000}, {0x45c78000}, {0x45c7a000}, {0x45c7c000}, {0x45c7e000}, {0x45c80000}, {0x45c82000}, {0x45c84000}, {0x45c86000}, {0x45c88000}, {0x45c8a000}, {0x45c8c000}, {0x45c8e000}, {0x45c90000}, {0x45c92000}, {0x45c94000}, {0x45c96000}, {0x45c98000}, {0x45c9a000}, {0x45c9c000}, {0x45c9e000}, {0x45ca0000}, {0x45ca2000}, {0x45ca4000}, {0x45ca6000}, {0x45ca8000}, {0x45caa000}, {0x45cac000}, {0x45cae000}, {0x45cb0000}, {0x45cb2000}, {0x45cb4000}, {0x45cb6000}, {0x45cb8000}, {0x45cba000}, {0x45cbc000}, {0x45cbe000}, {0x45cc0000}, {0x45cc2000}, {0x45cc4000}, {0x45cc6000}, {0x45cc8000}, {0x45cca000}, {0x45ccc000}, {0x45cce000}, {0x45cd0000}, {0x45cd2000}, {0x45cd4000}, {0x45cd6000}, {0x45cd8000}, {0x45cda000}, {0x45cdc000}, {0x45cde000}, {0x45ce0000}, {0x45ce2000}, {0x45ce4000}, {0x45ce6000}, {0x45ce8000}, {0x45cea000}, {0x45cec000}, {0x45cee000}, {0x45cf0000}, {0x45cf2000}, {0x45cf4000}, {0x45cf6000}, {0x45cf8000}, {0x45cfa000}, {0x45cfc000}, {0x45cfe000}, {0x45d00000}, {0x45d02000}, {0x45d04000}, {0x45d06000}, {0x45d08000}, {0x45d0a000}, {0x45d0c000}, {0x45d0e000}, {0x45d10000}, {0x45d12000}, {0x45d14000}, {0x45d16000}, {0x45d18000}, {0x45d1a000}, {0x45d1c000}, {0x45d1e000}, {0x45d20000}, {0x45d22000}, {0x45d24000}, {0x45d26000}, {0x45d28000}, {0x45d2a000}, {0x45d2c000}, {0x45d2e000}, {0x45d30000}, {0x45d32000}, {0x45d34000}, {0x45d36000}, {0x45d38000}, {0x45d3a000}, {0x45d3c000}, {0x45d3e000}, {0x45d40000}, {0x45d42000}, {0x45d44000}, {0x45d46000}, {0x45d48000}, {0x45d4a000}, {0x45d4c000}, {0x45d4e000}, {0x45d50000}, {0x45d52000}, {0x45d54000}, {0x45d56000}, {0x45d58000}, {0x45d5a000}, {0x45d5c000}, {0x45d5e000}, {0x45d60000}, {0x45d62000}, {0x45d64000}, {0x45d66000}, {0x45d68000}, {0x45d6a000}, {0x45d6c000}, {0x45d6e000}, {0x45d70000}, {0x45d72000}, {0x45d74000}, {0x45d76000}, {0x45d78000}, {0x45d7a000}, {0x45d7c000}, {0x45d7e000}, {0x45d80000}, {0x45d82000}, {0x45d84000}, {0x45d86000}, {0x45d88000}, {0x45d8a000}, {0x45d8c000}, {0x45d8e000}, {0x45d90000}, {0x45d92000}, {0x45d94000}, {0x45d96000}, {0x45d98000}, {0x45d9a000}, {0x45d9c000}, {0x45d9e000}, {0x45da0000}, {0x45da2000}, {0x45da4000}, {0x45da6000}, {0x45da8000}, {0x45daa000}, {0x45dac000}, {0x45dae000}, {0x45db0000}, {0x45db2000}, {0x45db4000}, {0x45db6000}, {0x45db8000}, {0x45dba000}, {0x45dbc000}, {0x45dbe000}, {0x45dc0000}, {0x45dc2000}, {0x45dc4000}, {0x45dc6000}, {0x45dc8000}, {0x45dca000}, {0x45dcc000}, {0x45dce000}, {0x45dd0000}, {0x45dd2000}, {0x45dd4000}, {0x45dd6000}, {0x45dd8000}, {0x45dda000}, {0x45ddc000}, {0x45dde000}, {0x45de0000}, {0x45de2000}, {0x45de4000}, {0x45de6000}, {0x45de8000}, {0x45dea000}, {0x45dec000}, {0x45dee000}, {0x45df0000}, {0x45df2000}, {0x45df4000}, {0x45df6000}, {0x45df8000}, {0x45dfa000}, {0x45dfc000}, {0x45dfe000}, {0x45e00000}, {0x45e02000}, {0x45e04000}, {0x45e06000}, {0x45e08000}, {0x45e0a000}, {0x45e0c000}, {0x45e0e000}, {0x45e10000}, {0x45e12000}, {0x45e14000}, {0x45e16000}, {0x45e18000}, {0x45e1a000}, {0x45e1c000}, {0x45e1e000}, {0x45e20000}, {0x45e22000}, {0x45e24000}, {0x45e26000}, {0x45e28000}, {0x45e2a000}, {0x45e2c000}, {0x45e2e000}, {0x45e30000}, {0x45e32000}, {0x45e34000}, {0x45e36000}, {0x45e38000}, {0x45e3a000}, {0x45e3c000}, {0x45e3e000}, {0x45e40000}, {0x45e42000}, {0x45e44000}, {0x45e46000}, {0x45e48000}, {0x45e4a000}, {0x45e4c000}, {0x45e4e000}, {0x45e50000}, {0x45e52000}, {0x45e54000}, {0x45e56000}, {0x45e58000}, {0x45e5a000}, {0x45e5c000}, {0x45e5e000}, {0x45e60000}, {0x45e62000}, {0x45e64000}, {0x45e66000}, {0x45e68000}, {0x45e6a000}, {0x45e6c000}, {0x45e6e000}, {0x45e70000}, {0x45e72000}, {0x45e74000}, {0x45e76000}, {0x45e78000}, {0x45e7a000}, {0x45e7c000}, {0x45e7e000}, {0x45e80000}, {0x45e82000}, {0x45e84000}, {0x45e86000}, {0x45e88000}, {0x45e8a000}, {0x45e8c000}, {0x45e8e000}, {0x45e90000}, {0x45e92000}, {0x45e94000}, {0x45e96000}, {0x45e98000}, {0x45e9a000}, {0x45e9c000}, {0x45e9e000}, {0x45ea0000}, {0x45ea2000}, {0x45ea4000}, {0x45ea6000}, {0x45ea8000}, {0x45eaa000}, {0x45eac000}, {0x45eae000}, {0x45eb0000}, {0x45eb2000}, {0x45eb4000}, {0x45eb6000}, {0x45eb8000}, {0x45eba000}, {0x45ebc000}, {0x45ebe000}, {0x45ec0000}, {0x45ec2000}, {0x45ec4000}, {0x45ec6000}, {0x45ec8000}, {0x45eca000}, {0x45ecc000}, {0x45ece000}, {0x45ed0000}, {0x45ed2000}, {0x45ed4000}, {0x45ed6000}, {0x45ed8000}, {0x45eda000}, {0x45edc000}, {0x45ede000}, {0x45ee0000}, {0x45ee2000}, {0x45ee4000}, {0x45ee6000}, {0x45ee8000}, {0x45eea000}, {0x45eec000}, {0x45eee000}, {0x45ef0000}, {0x45ef2000}, {0x45ef4000}, {0x45ef6000}, {0x45ef8000}, {0x45efa000}, {0x45efc000}, {0x45efe000}, {0x45f00000}, {0x45f02000}, {0x45f04000}, {0x45f06000}, {0x45f08000}, {0x45f0a000}, {0x45f0c000}, {0x45f0e000}, {0x45f10000}, {0x45f12000}, {0x45f14000}, {0x45f16000}, {0x45f18000}, {0x45f1a000}, {0x45f1c000}, {0x45f1e000}, {0x45f20000}, {0x45f22000}, {0x45f24000}, {0x45f26000}, {0x45f28000}, {0x45f2a000}, {0x45f2c000}, {0x45f2e000}, {0x45f30000}, {0x45f32000}, {0x45f34000}, {0x45f36000}, {0x45f38000}, {0x45f3a000}, {0x45f3c000}, {0x45f3e000}, {0x45f40000}, {0x45f42000}, {0x45f44000}, {0x45f46000}, {0x45f48000}, {0x45f4a000}, {0x45f4c000}, {0x45f4e000}, {0x45f50000}, {0x45f52000}, {0x45f54000}, {0x45f56000}, {0x45f58000}, {0x45f5a000}, {0x45f5c000}, {0x45f5e000}, {0x45f60000}, {0x45f62000}, {0x45f64000}, {0x45f66000}, {0x45f68000}, {0x45f6a000}, {0x45f6c000}, {0x45f6e000}, {0x45f70000}, {0x45f72000}, {0x45f74000}, {0x45f76000}, {0x45f78000}, {0x45f7a000}, {0x45f7c000}, {0x45f7e000}, {0x45f80000}, {0x45f82000}, {0x45f84000}, {0x45f86000}, {0x45f88000}, {0x45f8a000}, {0x45f8c000}, {0x45f8e000}, {0x45f90000}, {0x45f92000}, {0x45f94000}, {0x45f96000}, {0x45f98000}, {0x45f9a000}, {0x45f9c000}, {0x45f9e000}, {0x45fa0000}, {0x45fa2000}, {0x45fa4000}, {0x45fa6000}, {0x45fa8000}, {0x45faa000}, {0x45fac000}, {0x45fae000}, {0x45fb0000}, {0x45fb2000}, {0x45fb4000}, {0x45fb6000}, {0x45fb8000}, {0x45fba000}, {0x45fbc000}, {0x45fbe000}, {0x45fc0000}, {0x45fc2000}, {0x45fc4000}, {0x45fc6000}, {0x45fc8000}, {0x45fca000}, {0x45fcc000}, {0x45fce000}, {0x45fd0000}, {0x45fd2000}, {0x45fd4000}, {0x45fd6000}, {0x45fd8000}, {0x45fda000}, {0x45fdc000}, {0x45fde000}, {0x45fe0000}, {0x45fe2000}, {0x45fe4000}, {0x45fe6000}, {0x45fe8000}, {0x45fea000}, {0x45fec000}, {0x45fee000}, {0x45ff0000}, {0x45ff2000}, {0x45ff4000}, {0x45ff6000}, {0x45ff8000}, {0x45ffa000}, {0x45ffc000}, {0x45ffe000}, {0x46000000}, {0x46002000}, {0x46004000}, {0x46006000}, {0x46008000}, {0x4600a000}, {0x4600c000}, {0x4600e000}, {0x46010000}, {0x46012000}, {0x46014000}, {0x46016000}, {0x46018000}, {0x4601a000}, {0x4601c000}, {0x4601e000}, {0x46020000}, {0x46022000}, {0x46024000}, {0x46026000}, {0x46028000}, {0x4602a000}, {0x4602c000}, {0x4602e000}, {0x46030000}, {0x46032000}, {0x46034000}, {0x46036000}, {0x46038000}, {0x4603a000}, {0x4603c000}, {0x4603e000}, {0x46040000}, {0x46042000}, {0x46044000}, {0x46046000}, {0x46048000}, {0x4604a000}, {0x4604c000}, {0x4604e000}, {0x46050000}, {0x46052000}, {0x46054000}, {0x46056000}, {0x46058000}, {0x4605a000}, {0x4605c000}, {0x4605e000}, {0x46060000}, {0x46062000}, {0x46064000}, {0x46066000}, {0x46068000}, {0x4606a000}, {0x4606c000}, {0x4606e000}, {0x46070000}, {0x46072000}, {0x46074000}, {0x46076000}, {0x46078000}, {0x4607a000}, {0x4607c000}, {0x4607e000}, {0x46080000}, {0x46082000}, {0x46084000}, {0x46086000}, {0x46088000}, {0x4608a000}, {0x4608c000}, {0x4608e000}, {0x46090000}, {0x46092000}, {0x46094000}, {0x46096000}, {0x46098000}, {0x4609a000}, {0x4609c000}, {0x4609e000}, {0x460a0000}, {0x460a2000}, {0x460a4000}, {0x460a6000}, {0x460a8000}, {0x460aa000}, {0x460ac000}, {0x460ae000}, {0x460b0000}, {0x460b2000}, {0x460b4000}, {0x460b6000}, {0x460b8000}, {0x460ba000}, {0x460bc000}, {0x460be000}, {0x460c0000}, {0x460c2000}, {0x460c4000}, {0x460c6000}, {0x460c8000}, {0x460ca000}, {0x460cc000}, {0x460ce000}, {0x460d0000}, {0x460d2000}, {0x460d4000}, {0x460d6000}, {0x460d8000}, {0x460da000}, {0x460dc000}, {0x460de000}, {0x460e0000}, {0x460e2000}, {0x460e4000}, {0x460e6000}, {0x460e8000}, {0x460ea000}, {0x460ec000}, {0x460ee000}, {0x460f0000}, {0x460f2000}, {0x460f4000}, {0x460f6000}, {0x460f8000}, {0x460fa000}, {0x460fc000}, {0x460fe000}, {0x46100000}, {0x46102000}, {0x46104000}, {0x46106000}, {0x46108000}, {0x4610a000}, {0x4610c000}, {0x4610e000}, {0x46110000}, {0x46112000}, {0x46114000}, {0x46116000}, {0x46118000}, {0x4611a000}, {0x4611c000}, {0x4611e000}, {0x46120000}, {0x46122000}, {0x46124000}, {0x46126000}, {0x46128000}, {0x4612a000}, {0x4612c000}, {0x4612e000}, {0x46130000}, {0x46132000}, {0x46134000}, {0x46136000}, {0x46138000}, {0x4613a000}, {0x4613c000}, {0x4613e000}, {0x46140000}, {0x46142000}, {0x46144000}, {0x46146000}, {0x46148000}, {0x4614a000}, {0x4614c000}, {0x4614e000}, {0x46150000}, {0x46152000}, {0x46154000}, {0x46156000}, {0x46158000}, {0x4615a000}, {0x4615c000}, {0x4615e000}, {0x46160000}, {0x46162000}, {0x46164000}, {0x46166000}, {0x46168000}, {0x4616a000}, {0x4616c000}, {0x4616e000}, {0x46170000}, {0x46172000}, {0x46174000}, {0x46176000}, {0x46178000}, {0x4617a000}, {0x4617c000}, {0x4617e000}, {0x46180000}, {0x46182000}, {0x46184000}, {0x46186000}, {0x46188000}, {0x4618a000}, {0x4618c000}, {0x4618e000}, {0x46190000}, {0x46192000}, {0x46194000}, {0x46196000}, {0x46198000}, {0x4619a000}, {0x4619c000}, {0x4619e000}, {0x461a0000}, {0x461a2000}, {0x461a4000}, {0x461a6000}, {0x461a8000}, {0x461aa000}, {0x461ac000}, {0x461ae000}, {0x461b0000}, {0x461b2000}, {0x461b4000}, {0x461b6000}, {0x461b8000}, {0x461ba000}, {0x461bc000}, {0x461be000}, {0x461c0000}, {0x461c2000}, {0x461c4000}, {0x461c6000}, {0x461c8000}, {0x461ca000}, {0x461cc000}, {0x461ce000}, {0x461d0000}, {0x461d2000}, {0x461d4000}, {0x461d6000}, {0x461d8000}, {0x461da000}, {0x461dc000}, {0x461de000}, {0x461e0000}, {0x461e2000}, {0x461e4000}, {0x461e6000}, {0x461e8000}, {0x461ea000}, {0x461ec000}, {0x461ee000}, {0x461f0000}, {0x461f2000}, {0x461f4000}, {0x461f6000}, {0x461f8000}, {0x461fa000}, {0x461fc000}, {0x461fe000}, {0x46200000}, {0x46202000}, {0x46204000}, {0x46206000}, {0x46208000}, {0x4620a000}, {0x4620c000}, {0x4620e000}, {0x46210000}, {0x46212000}, {0x46214000}, {0x46216000}, {0x46218000}, {0x4621a000}, {0x4621c000}, {0x4621e000}, {0x46220000}, {0x46222000}, {0x46224000}, {0x46226000}, {0x46228000}, {0x4622a000}, {0x4622c000}, {0x4622e000}, {0x46230000}, {0x46232000}, {0x46234000}, {0x46236000}, {0x46238000}, {0x4623a000}, {0x4623c000}, {0x4623e000}, {0x46240000}, {0x46242000}, {0x46244000}, {0x46246000}, {0x46248000}, {0x4624a000}, {0x4624c000}, {0x4624e000}, {0x46250000}, {0x46252000}, {0x46254000}, {0x46256000}, {0x46258000}, {0x4625a000}, {0x4625c000}, {0x4625e000}, {0x46260000}, {0x46262000}, {0x46264000}, {0x46266000}, {0x46268000}, {0x4626a000}, {0x4626c000}, {0x4626e000}, {0x46270000}, {0x46272000}, {0x46274000}, {0x46276000}, {0x46278000}, {0x4627a000}, {0x4627c000}, {0x4627e000}, {0x46280000}, {0x46282000}, {0x46284000}, {0x46286000}, {0x46288000}, {0x4628a000}, {0x4628c000}, {0x4628e000}, {0x46290000}, {0x46292000}, {0x46294000}, {0x46296000}, {0x46298000}, {0x4629a000}, {0x4629c000}, {0x4629e000}, {0x462a0000}, {0x462a2000}, {0x462a4000}, {0x462a6000}, {0x462a8000}, {0x462aa000}, {0x462ac000}, {0x462ae000}, {0x462b0000}, {0x462b2000}, {0x462b4000}, {0x462b6000}, {0x462b8000}, {0x462ba000}, {0x462bc000}, {0x462be000}, {0x462c0000}, {0x462c2000}, {0x462c4000}, {0x462c6000}, {0x462c8000}, {0x462ca000}, {0x462cc000}, {0x462ce000}, {0x462d0000}, {0x462d2000}, {0x462d4000}, {0x462d6000}, {0x462d8000}, {0x462da000}, {0x462dc000}, {0x462de000}, {0x462e0000}, {0x462e2000}, {0x462e4000}, {0x462e6000}, {0x462e8000}, {0x462ea000}, {0x462ec000}, {0x462ee000}, {0x462f0000}, {0x462f2000}, {0x462f4000}, {0x462f6000}, {0x462f8000}, {0x462fa000}, {0x462fc000}, {0x462fe000}, {0x46300000}, {0x46302000}, {0x46304000}, {0x46306000}, {0x46308000}, {0x4630a000}, {0x4630c000}, {0x4630e000}, {0x46310000}, {0x46312000}, {0x46314000}, {0x46316000}, {0x46318000}, {0x4631a000}, {0x4631c000}, {0x4631e000}, {0x46320000}, {0x46322000}, {0x46324000}, {0x46326000}, {0x46328000}, {0x4632a000}, {0x4632c000}, {0x4632e000}, {0x46330000}, {0x46332000}, {0x46334000}, {0x46336000}, {0x46338000}, {0x4633a000}, {0x4633c000}, {0x4633e000}, {0x46340000}, {0x46342000}, {0x46344000}, {0x46346000}, {0x46348000}, {0x4634a000}, {0x4634c000}, {0x4634e000}, {0x46350000}, {0x46352000}, {0x46354000}, {0x46356000}, {0x46358000}, {0x4635a000}, {0x4635c000}, {0x4635e000}, {0x46360000}, {0x46362000}, {0x46364000}, {0x46366000}, {0x46368000}, {0x4636a000}, {0x4636c000}, {0x4636e000}, {0x46370000}, {0x46372000}, {0x46374000}, {0x46376000}, {0x46378000}, {0x4637a000}, {0x4637c000}, {0x4637e000}, {0x46380000}, {0x46382000}, {0x46384000}, {0x46386000}, {0x46388000}, {0x4638a000}, {0x4638c000}, {0x4638e000}, {0x46390000}, {0x46392000}, {0x46394000}, {0x46396000}, {0x46398000}, {0x4639a000}, {0x4639c000}, {0x4639e000}, {0x463a0000}, {0x463a2000}, {0x463a4000}, {0x463a6000}, {0x463a8000}, {0x463aa000}, {0x463ac000}, {0x463ae000}, {0x463b0000}, {0x463b2000}, {0x463b4000}, {0x463b6000}, {0x463b8000}, {0x463ba000}, {0x463bc000}, {0x463be000}, {0x463c0000}, {0x463c2000}, {0x463c4000}, {0x463c6000}, {0x463c8000}, {0x463ca000}, {0x463cc000}, {0x463ce000}, {0x463d0000}, {0x463d2000}, {0x463d4000}, {0x463d6000}, {0x463d8000}, {0x463da000}, {0x463dc000}, {0x463de000}, {0x463e0000}, {0x463e2000}, {0x463e4000}, {0x463e6000}, {0x463e8000}, {0x463ea000}, {0x463ec000}, {0x463ee000}, {0x463f0000}, {0x463f2000}, {0x463f4000}, {0x463f6000}, {0x463f8000}, {0x463fa000}, {0x463fc000}, {0x463fe000}, {0x46400000}, {0x46402000}, {0x46404000}, {0x46406000}, {0x46408000}, {0x4640a000}, {0x4640c000}, {0x4640e000}, {0x46410000}, {0x46412000}, {0x46414000}, {0x46416000}, {0x46418000}, {0x4641a000}, {0x4641c000}, {0x4641e000}, {0x46420000}, {0x46422000}, {0x46424000}, {0x46426000}, {0x46428000}, {0x4642a000}, {0x4642c000}, {0x4642e000}, {0x46430000}, {0x46432000}, {0x46434000}, {0x46436000}, {0x46438000}, {0x4643a000}, {0x4643c000}, {0x4643e000}, {0x46440000}, {0x46442000}, {0x46444000}, {0x46446000}, {0x46448000}, {0x4644a000}, {0x4644c000}, {0x4644e000}, {0x46450000}, {0x46452000}, {0x46454000}, {0x46456000}, {0x46458000}, {0x4645a000}, {0x4645c000}, {0x4645e000}, {0x46460000}, {0x46462000}, {0x46464000}, {0x46466000}, {0x46468000}, {0x4646a000}, {0x4646c000}, {0x4646e000}, {0x46470000}, {0x46472000}, {0x46474000}, {0x46476000}, {0x46478000}, {0x4647a000}, {0x4647c000}, {0x4647e000}, {0x46480000}, {0x46482000}, {0x46484000}, {0x46486000}, {0x46488000}, {0x4648a000}, {0x4648c000}, {0x4648e000}, {0x46490000}, {0x46492000}, {0x46494000}, {0x46496000}, {0x46498000}, {0x4649a000}, {0x4649c000}, {0x4649e000}, {0x464a0000}, {0x464a2000}, {0x464a4000}, {0x464a6000}, {0x464a8000}, {0x464aa000}, {0x464ac000}, {0x464ae000}, {0x464b0000}, {0x464b2000}, {0x464b4000}, {0x464b6000}, {0x464b8000}, {0x464ba000}, {0x464bc000}, {0x464be000}, {0x464c0000}, {0x464c2000}, {0x464c4000}, {0x464c6000}, {0x464c8000}, {0x464ca000}, {0x464cc000}, {0x464ce000}, {0x464d0000}, {0x464d2000}, {0x464d4000}, {0x464d6000}, {0x464d8000}, {0x464da000}, {0x464dc000}, {0x464de000}, {0x464e0000}, {0x464e2000}, {0x464e4000}, {0x464e6000}, {0x464e8000}, {0x464ea000}, {0x464ec000}, {0x464ee000}, {0x464f0000}, {0x464f2000}, {0x464f4000}, {0x464f6000}, {0x464f8000}, {0x464fa000}, {0x464fc000}, {0x464fe000}, {0x46500000}, {0x46502000}, {0x46504000}, {0x46506000}, {0x46508000}, {0x4650a000}, {0x4650c000}, {0x4650e000}, {0x46510000}, {0x46512000}, {0x46514000}, {0x46516000}, {0x46518000}, {0x4651a000}, {0x4651c000}, {0x4651e000}, {0x46520000}, {0x46522000}, {0x46524000}, {0x46526000}, {0x46528000}, {0x4652a000}, {0x4652c000}, {0x4652e000}, {0x46530000}, {0x46532000}, {0x46534000}, {0x46536000}, {0x46538000}, {0x4653a000}, {0x4653c000}, {0x4653e000}, {0x46540000}, {0x46542000}, {0x46544000}, {0x46546000}, {0x46548000}, {0x4654a000}, {0x4654c000}, {0x4654e000}, {0x46550000}, {0x46552000}, {0x46554000}, {0x46556000}, {0x46558000}, {0x4655a000}, {0x4655c000}, {0x4655e000}, {0x46560000}, {0x46562000}, {0x46564000}, {0x46566000}, {0x46568000}, {0x4656a000}, {0x4656c000}, {0x4656e000}, {0x46570000}, {0x46572000}, {0x46574000}, {0x46576000}, {0x46578000}, {0x4657a000}, {0x4657c000}, {0x4657e000}, {0x46580000}, {0x46582000}, {0x46584000}, {0x46586000}, {0x46588000}, {0x4658a000}, {0x4658c000}, {0x4658e000}, {0x46590000}, {0x46592000}, {0x46594000}, {0x46596000}, {0x46598000}, {0x4659a000}, {0x4659c000}, {0x4659e000}, {0x465a0000}, {0x465a2000}, {0x465a4000}, {0x465a6000}, {0x465a8000}, {0x465aa000}, {0x465ac000}, {0x465ae000}, {0x465b0000}, {0x465b2000}, {0x465b4000}, {0x465b6000}, {0x465b8000}, {0x465ba000}, {0x465bc000}, {0x465be000}, {0x465c0000}, {0x465c2000}, {0x465c4000}, {0x465c6000}, {0x465c8000}, {0x465ca000}, {0x465cc000}, {0x465ce000}, {0x465d0000}, {0x465d2000}, {0x465d4000}, {0x465d6000}, {0x465d8000}, {0x465da000}, {0x465dc000}, {0x465de000}, {0x465e0000}, {0x465e2000}, {0x465e4000}, {0x465e6000}, {0x465e8000}, {0x465ea000}, {0x465ec000}, {0x465ee000}, {0x465f0000}, {0x465f2000}, {0x465f4000}, {0x465f6000}, {0x465f8000}, {0x465fa000}, {0x465fc000}, {0x465fe000}, {0x46600000}, {0x46602000}, {0x46604000}, {0x46606000}, {0x46608000}, {0x4660a000}, {0x4660c000}, {0x4660e000}, {0x46610000}, {0x46612000}, {0x46614000}, {0x46616000}, {0x46618000}, {0x4661a000}, {0x4661c000}, {0x4661e000}, {0x46620000}, {0x46622000}, {0x46624000}, {0x46626000}, {0x46628000}, {0x4662a000}, {0x4662c000}, {0x4662e000}, {0x46630000}, {0x46632000}, {0x46634000}, {0x46636000}, {0x46638000}, {0x4663a000}, {0x4663c000}, {0x4663e000}, {0x46640000}, {0x46642000}, {0x46644000}, {0x46646000}, {0x46648000}, {0x4664a000}, {0x4664c000}, {0x4664e000}, {0x46650000}, {0x46652000}, {0x46654000}, {0x46656000}, {0x46658000}, {0x4665a000}, {0x4665c000}, {0x4665e000}, {0x46660000}, {0x46662000}, {0x46664000}, {0x46666000}, {0x46668000}, {0x4666a000}, {0x4666c000}, {0x4666e000}, {0x46670000}, {0x46672000}, {0x46674000}, {0x46676000}, {0x46678000}, {0x4667a000}, {0x4667c000}, {0x4667e000}, {0x46680000}, {0x46682000}, {0x46684000}, {0x46686000}, {0x46688000}, {0x4668a000}, {0x4668c000}, {0x4668e000}, {0x46690000}, {0x46692000}, {0x46694000}, {0x46696000}, {0x46698000}, {0x4669a000}, {0x4669c000}, {0x4669e000}, {0x466a0000}, {0x466a2000}, {0x466a4000}, {0x466a6000}, {0x466a8000}, {0x466aa000}, {0x466ac000}, {0x466ae000}, {0x466b0000}, {0x466b2000}, {0x466b4000}, {0x466b6000}, {0x466b8000}, {0x466ba000}, {0x466bc000}, {0x466be000}, {0x466c0000}, {0x466c2000}, {0x466c4000}, {0x466c6000}, {0x466c8000}, {0x466ca000}, {0x466cc000}, {0x466ce000}, {0x466d0000}, {0x466d2000}, {0x466d4000}, {0x466d6000}, {0x466d8000}, {0x466da000}, {0x466dc000}, {0x466de000}, {0x466e0000}, {0x466e2000}, {0x466e4000}, {0x466e6000}, {0x466e8000}, {0x466ea000}, {0x466ec000}, {0x466ee000}, {0x466f0000}, {0x466f2000}, {0x466f4000}, {0x466f6000}, {0x466f8000}, {0x466fa000}, {0x466fc000}, {0x466fe000}, {0x46700000}, {0x46702000}, {0x46704000}, {0x46706000}, {0x46708000}, {0x4670a000}, {0x4670c000}, {0x4670e000}, {0x46710000}, {0x46712000}, {0x46714000}, {0x46716000}, {0x46718000}, {0x4671a000}, {0x4671c000}, {0x4671e000}, {0x46720000}, {0x46722000}, {0x46724000}, {0x46726000}, {0x46728000}, {0x4672a000}, {0x4672c000}, {0x4672e000}, {0x46730000}, {0x46732000}, {0x46734000}, {0x46736000}, {0x46738000}, {0x4673a000}, {0x4673c000}, {0x4673e000}, {0x46740000}, {0x46742000}, {0x46744000}, {0x46746000}, {0x46748000}, {0x4674a000}, {0x4674c000}, {0x4674e000}, {0x46750000}, {0x46752000}, {0x46754000}, {0x46756000}, {0x46758000}, {0x4675a000}, {0x4675c000}, {0x4675e000}, {0x46760000}, {0x46762000}, {0x46764000}, {0x46766000}, {0x46768000}, {0x4676a000}, {0x4676c000}, {0x4676e000}, {0x46770000}, {0x46772000}, {0x46774000}, {0x46776000}, {0x46778000}, {0x4677a000}, {0x4677c000}, {0x4677e000}, {0x46780000}, {0x46782000}, {0x46784000}, {0x46786000}, {0x46788000}, {0x4678a000}, {0x4678c000}, {0x4678e000}, {0x46790000}, {0x46792000}, {0x46794000}, {0x46796000}, {0x46798000}, {0x4679a000}, {0x4679c000}, {0x4679e000}, {0x467a0000}, {0x467a2000}, {0x467a4000}, {0x467a6000}, {0x467a8000}, {0x467aa000}, {0x467ac000}, {0x467ae000}, {0x467b0000}, {0x467b2000}, {0x467b4000}, {0x467b6000}, {0x467b8000}, {0x467ba000}, {0x467bc000}, {0x467be000}, {0x467c0000}, {0x467c2000}, {0x467c4000}, {0x467c6000}, {0x467c8000}, {0x467ca000}, {0x467cc000}, {0x467ce000}, {0x467d0000}, {0x467d2000}, {0x467d4000}, {0x467d6000}, {0x467d8000}, {0x467da000}, {0x467dc000}, {0x467de000}, {0x467e0000}, {0x467e2000}, {0x467e4000}, {0x467e6000}, {0x467e8000}, {0x467ea000}, {0x467ec000}, {0x467ee000}, {0x467f0000}, {0x467f2000}, {0x467f4000}, {0x467f6000}, {0x467f8000}, {0x467fa000}, {0x467fc000}, {0x467fe000}, {0x46800000}, {0x46802000}, {0x46804000}, {0x46806000}, {0x46808000}, {0x4680a000}, {0x4680c000}, {0x4680e000}, {0x46810000}, {0x46812000}, {0x46814000}, {0x46816000}, {0x46818000}, {0x4681a000}, {0x4681c000}, {0x4681e000}, {0x46820000}, {0x46822000}, {0x46824000}, {0x46826000}, {0x46828000}, {0x4682a000}, {0x4682c000}, {0x4682e000}, {0x46830000}, {0x46832000}, {0x46834000}, {0x46836000}, {0x46838000}, {0x4683a000}, {0x4683c000}, {0x4683e000}, {0x46840000}, {0x46842000}, {0x46844000}, {0x46846000}, {0x46848000}, {0x4684a000}, {0x4684c000}, {0x4684e000}, {0x46850000}, {0x46852000}, {0x46854000}, {0x46856000}, {0x46858000}, {0x4685a000}, {0x4685c000}, {0x4685e000}, {0x46860000}, {0x46862000}, {0x46864000}, {0x46866000}, {0x46868000}, {0x4686a000}, {0x4686c000}, {0x4686e000}, {0x46870000}, {0x46872000}, {0x46874000}, {0x46876000}, {0x46878000}, {0x4687a000}, {0x4687c000}, {0x4687e000}, {0x46880000}, {0x46882000}, {0x46884000}, {0x46886000}, {0x46888000}, {0x4688a000}, {0x4688c000}, {0x4688e000}, {0x46890000}, {0x46892000}, {0x46894000}, {0x46896000}, {0x46898000}, {0x4689a000}, {0x4689c000}, {0x4689e000}, {0x468a0000}, {0x468a2000}, {0x468a4000}, {0x468a6000}, {0x468a8000}, {0x468aa000}, {0x468ac000}, {0x468ae000}, {0x468b0000}, {0x468b2000}, {0x468b4000}, {0x468b6000}, {0x468b8000}, {0x468ba000}, {0x468bc000}, {0x468be000}, {0x468c0000}, {0x468c2000}, {0x468c4000}, {0x468c6000}, {0x468c8000}, {0x468ca000}, {0x468cc000}, {0x468ce000}, {0x468d0000}, {0x468d2000}, {0x468d4000}, {0x468d6000}, {0x468d8000}, {0x468da000}, {0x468dc000}, {0x468de000}, {0x468e0000}, {0x468e2000}, {0x468e4000}, {0x468e6000}, {0x468e8000}, {0x468ea000}, {0x468ec000}, {0x468ee000}, {0x468f0000}, {0x468f2000}, {0x468f4000}, {0x468f6000}, {0x468f8000}, {0x468fa000}, {0x468fc000}, {0x468fe000}, {0x46900000}, {0x46902000}, {0x46904000}, {0x46906000}, {0x46908000}, {0x4690a000}, {0x4690c000}, {0x4690e000}, {0x46910000}, {0x46912000}, {0x46914000}, {0x46916000}, {0x46918000}, {0x4691a000}, {0x4691c000}, {0x4691e000}, {0x46920000}, {0x46922000}, {0x46924000}, {0x46926000}, {0x46928000}, {0x4692a000}, {0x4692c000}, {0x4692e000}, {0x46930000}, {0x46932000}, {0x46934000}, {0x46936000}, {0x46938000}, {0x4693a000}, {0x4693c000}, {0x4693e000}, {0x46940000}, {0x46942000}, {0x46944000}, {0x46946000}, {0x46948000}, {0x4694a000}, {0x4694c000}, {0x4694e000}, {0x46950000}, {0x46952000}, {0x46954000}, {0x46956000}, {0x46958000}, {0x4695a000}, {0x4695c000}, {0x4695e000}, {0x46960000}, {0x46962000}, {0x46964000}, {0x46966000}, {0x46968000}, {0x4696a000}, {0x4696c000}, {0x4696e000}, {0x46970000}, {0x46972000}, {0x46974000}, {0x46976000}, {0x46978000}, {0x4697a000}, {0x4697c000}, {0x4697e000}, {0x46980000}, {0x46982000}, {0x46984000}, {0x46986000}, {0x46988000}, {0x4698a000}, {0x4698c000}, {0x4698e000}, {0x46990000}, {0x46992000}, {0x46994000}, {0x46996000}, {0x46998000}, {0x4699a000}, {0x4699c000}, {0x4699e000}, {0x469a0000}, {0x469a2000}, {0x469a4000}, {0x469a6000}, {0x469a8000}, {0x469aa000}, {0x469ac000}, {0x469ae000}, {0x469b0000}, {0x469b2000}, {0x469b4000}, {0x469b6000}, {0x469b8000}, {0x469ba000}, {0x469bc000}, {0x469be000}, {0x469c0000}, {0x469c2000}, {0x469c4000}, {0x469c6000}, {0x469c8000}, {0x469ca000}, {0x469cc000}, {0x469ce000}, {0x469d0000}, {0x469d2000}, {0x469d4000}, {0x469d6000}, {0x469d8000}, {0x469da000}, {0x469dc000}, {0x469de000}, {0x469e0000}, {0x469e2000}, {0x469e4000}, {0x469e6000}, {0x469e8000}, {0x469ea000}, {0x469ec000}, {0x469ee000}, {0x469f0000}, {0x469f2000}, {0x469f4000}, {0x469f6000}, {0x469f8000}, {0x469fa000}, {0x469fc000}, {0x469fe000}, {0x46a00000}, {0x46a02000}, {0x46a04000}, {0x46a06000}, {0x46a08000}, {0x46a0a000}, {0x46a0c000}, {0x46a0e000}, {0x46a10000}, {0x46a12000}, {0x46a14000}, {0x46a16000}, {0x46a18000}, {0x46a1a000}, {0x46a1c000}, {0x46a1e000}, {0x46a20000}, {0x46a22000}, {0x46a24000}, {0x46a26000}, {0x46a28000}, {0x46a2a000}, {0x46a2c000}, {0x46a2e000}, {0x46a30000}, {0x46a32000}, {0x46a34000}, {0x46a36000}, {0x46a38000}, {0x46a3a000}, {0x46a3c000}, {0x46a3e000}, {0x46a40000}, {0x46a42000}, {0x46a44000}, {0x46a46000}, {0x46a48000}, {0x46a4a000}, {0x46a4c000}, {0x46a4e000}, {0x46a50000}, {0x46a52000}, {0x46a54000}, {0x46a56000}, {0x46a58000}, {0x46a5a000}, {0x46a5c000}, {0x46a5e000}, {0x46a60000}, {0x46a62000}, {0x46a64000}, {0x46a66000}, {0x46a68000}, {0x46a6a000}, {0x46a6c000}, {0x46a6e000}, {0x46a70000}, {0x46a72000}, {0x46a74000}, {0x46a76000}, {0x46a78000}, {0x46a7a000}, {0x46a7c000}, {0x46a7e000}, {0x46a80000}, {0x46a82000}, {0x46a84000}, {0x46a86000}, {0x46a88000}, {0x46a8a000}, {0x46a8c000}, {0x46a8e000}, {0x46a90000}, {0x46a92000}, {0x46a94000}, {0x46a96000}, {0x46a98000}, {0x46a9a000}, {0x46a9c000}, {0x46a9e000}, {0x46aa0000}, {0x46aa2000}, {0x46aa4000}, {0x46aa6000}, {0x46aa8000}, {0x46aaa000}, {0x46aac000}, {0x46aae000}, {0x46ab0000}, {0x46ab2000}, {0x46ab4000}, {0x46ab6000}, {0x46ab8000}, {0x46aba000}, {0x46abc000}, {0x46abe000}, {0x46ac0000}, {0x46ac2000}, {0x46ac4000}, {0x46ac6000}, {0x46ac8000}, {0x46aca000}, {0x46acc000}, {0x46ace000}, {0x46ad0000}, {0x46ad2000}, {0x46ad4000}, {0x46ad6000}, {0x46ad8000}, {0x46ada000}, {0x46adc000}, {0x46ade000}, {0x46ae0000}, {0x46ae2000}, {0x46ae4000}, {0x46ae6000}, {0x46ae8000}, {0x46aea000}, {0x46aec000}, {0x46aee000}, {0x46af0000}, {0x46af2000}, {0x46af4000}, {0x46af6000}, {0x46af8000}, {0x46afa000}, {0x46afc000}, {0x46afe000}, {0x46b00000}, {0x46b02000}, {0x46b04000}, {0x46b06000}, {0x46b08000}, {0x46b0a000}, {0x46b0c000}, {0x46b0e000}, {0x46b10000}, {0x46b12000}, {0x46b14000}, {0x46b16000}, {0x46b18000}, {0x46b1a000}, {0x46b1c000}, {0x46b1e000}, {0x46b20000}, {0x46b22000}, {0x46b24000}, {0x46b26000}, {0x46b28000}, {0x46b2a000}, {0x46b2c000}, {0x46b2e000}, {0x46b30000}, {0x46b32000}, {0x46b34000}, {0x46b36000}, {0x46b38000}, {0x46b3a000}, {0x46b3c000}, {0x46b3e000}, {0x46b40000}, {0x46b42000}, {0x46b44000}, {0x46b46000}, {0x46b48000}, {0x46b4a000}, {0x46b4c000}, {0x46b4e000}, {0x46b50000}, {0x46b52000}, {0x46b54000}, {0x46b56000}, {0x46b58000}, {0x46b5a000}, {0x46b5c000}, {0x46b5e000}, {0x46b60000}, {0x46b62000}, {0x46b64000}, {0x46b66000}, {0x46b68000}, {0x46b6a000}, {0x46b6c000}, {0x46b6e000}, {0x46b70000}, {0x46b72000}, {0x46b74000}, {0x46b76000}, {0x46b78000}, {0x46b7a000}, {0x46b7c000}, {0x46b7e000}, {0x46b80000}, {0x46b82000}, {0x46b84000}, {0x46b86000}, {0x46b88000}, {0x46b8a000}, {0x46b8c000}, {0x46b8e000}, {0x46b90000}, {0x46b92000}, {0x46b94000}, {0x46b96000}, {0x46b98000}, {0x46b9a000}, {0x46b9c000}, {0x46b9e000}, {0x46ba0000}, {0x46ba2000}, {0x46ba4000}, {0x46ba6000}, {0x46ba8000}, {0x46baa000}, {0x46bac000}, {0x46bae000}, {0x46bb0000}, {0x46bb2000}, {0x46bb4000}, {0x46bb6000}, {0x46bb8000}, {0x46bba000}, {0x46bbc000}, {0x46bbe000}, {0x46bc0000}, {0x46bc2000}, {0x46bc4000}, {0x46bc6000}, {0x46bc8000}, {0x46bca000}, {0x46bcc000}, {0x46bce000}, {0x46bd0000}, {0x46bd2000}, {0x46bd4000}, {0x46bd6000}, {0x46bd8000}, {0x46bda000}, {0x46bdc000}, {0x46bde000}, {0x46be0000}, {0x46be2000}, {0x46be4000}, {0x46be6000}, {0x46be8000}, {0x46bea000}, {0x46bec000}, {0x46bee000}, {0x46bf0000}, {0x46bf2000}, {0x46bf4000}, {0x46bf6000}, {0x46bf8000}, {0x46bfa000}, {0x46bfc000}, {0x46bfe000}, {0x46c00000}, {0x46c02000}, {0x46c04000}, {0x46c06000}, {0x46c08000}, {0x46c0a000}, {0x46c0c000}, {0x46c0e000}, {0x46c10000}, {0x46c12000}, {0x46c14000}, {0x46c16000}, {0x46c18000}, {0x46c1a000}, {0x46c1c000}, {0x46c1e000}, {0x46c20000}, {0x46c22000}, {0x46c24000}, {0x46c26000}, {0x46c28000}, {0x46c2a000}, {0x46c2c000}, {0x46c2e000}, {0x46c30000}, {0x46c32000}, {0x46c34000}, {0x46c36000}, {0x46c38000}, {0x46c3a000}, {0x46c3c000}, {0x46c3e000}, {0x46c40000}, {0x46c42000}, {0x46c44000}, {0x46c46000}, {0x46c48000}, {0x46c4a000}, {0x46c4c000}, {0x46c4e000}, {0x46c50000}, {0x46c52000}, {0x46c54000}, {0x46c56000}, {0x46c58000}, {0x46c5a000}, {0x46c5c000}, {0x46c5e000}, {0x46c60000}, {0x46c62000}, {0x46c64000}, {0x46c66000}, {0x46c68000}, {0x46c6a000}, {0x46c6c000}, {0x46c6e000}, {0x46c70000}, {0x46c72000}, {0x46c74000}, {0x46c76000}, {0x46c78000}, {0x46c7a000}, {0x46c7c000}, {0x46c7e000}, {0x46c80000}, {0x46c82000}, {0x46c84000}, {0x46c86000}, {0x46c88000}, {0x46c8a000}, {0x46c8c000}, {0x46c8e000}, {0x46c90000}, {0x46c92000}, {0x46c94000}, {0x46c96000}, {0x46c98000}, {0x46c9a000}, {0x46c9c000}, {0x46c9e000}, {0x46ca0000}, {0x46ca2000}, {0x46ca4000}, {0x46ca6000}, {0x46ca8000}, {0x46caa000}, {0x46cac000}, {0x46cae000}, {0x46cb0000}, {0x46cb2000}, {0x46cb4000}, {0x46cb6000}, {0x46cb8000}, {0x46cba000}, {0x46cbc000}, {0x46cbe000}, {0x46cc0000}, {0x46cc2000}, {0x46cc4000}, {0x46cc6000}, {0x46cc8000}, {0x46cca000}, {0x46ccc000}, {0x46cce000}, {0x46cd0000}, {0x46cd2000}, {0x46cd4000}, {0x46cd6000}, {0x46cd8000}, {0x46cda000}, {0x46cdc000}, {0x46cde000}, {0x46ce0000}, {0x46ce2000}, {0x46ce4000}, {0x46ce6000}, {0x46ce8000}, {0x46cea000}, {0x46cec000}, {0x46cee000}, {0x46cf0000}, {0x46cf2000}, {0x46cf4000}, {0x46cf6000}, {0x46cf8000}, {0x46cfa000}, {0x46cfc000}, {0x46cfe000}, {0x46d00000}, {0x46d02000}, {0x46d04000}, {0x46d06000}, {0x46d08000}, {0x46d0a000}, {0x46d0c000}, {0x46d0e000}, {0x46d10000}, {0x46d12000}, {0x46d14000}, {0x46d16000}, {0x46d18000}, {0x46d1a000}, {0x46d1c000}, {0x46d1e000}, {0x46d20000}, {0x46d22000}, {0x46d24000}, {0x46d26000}, {0x46d28000}, {0x46d2a000}, {0x46d2c000}, {0x46d2e000}, {0x46d30000}, {0x46d32000}, {0x46d34000}, {0x46d36000}, {0x46d38000}, {0x46d3a000}, {0x46d3c000}, {0x46d3e000}, {0x46d40000}, {0x46d42000}, {0x46d44000}, {0x46d46000}, {0x46d48000}, {0x46d4a000}, {0x46d4c000}, {0x46d4e000}, {0x46d50000}, {0x46d52000}, {0x46d54000}, {0x46d56000}, {0x46d58000}, {0x46d5a000}, {0x46d5c000}, {0x46d5e000}, {0x46d60000}, {0x46d62000}, {0x46d64000}, {0x46d66000}, {0x46d68000}, {0x46d6a000}, {0x46d6c000}, {0x46d6e000}, {0x46d70000}, {0x46d72000}, {0x46d74000}, {0x46d76000}, {0x46d78000}, {0x46d7a000}, {0x46d7c000}, {0x46d7e000}, {0x46d80000}, {0x46d82000}, {0x46d84000}, {0x46d86000}, {0x46d88000}, {0x46d8a000}, {0x46d8c000}, {0x46d8e000}, {0x46d90000}, {0x46d92000}, {0x46d94000}, {0x46d96000}, {0x46d98000}, {0x46d9a000}, {0x46d9c000}, {0x46d9e000}, {0x46da0000}, {0x46da2000}, {0x46da4000}, {0x46da6000}, {0x46da8000}, {0x46daa000}, {0x46dac000}, {0x46dae000}, {0x46db0000}, {0x46db2000}, {0x46db4000}, {0x46db6000}, {0x46db8000}, {0x46dba000}, {0x46dbc000}, {0x46dbe000}, {0x46dc0000}, {0x46dc2000}, {0x46dc4000}, {0x46dc6000}, {0x46dc8000}, {0x46dca000}, {0x46dcc000}, {0x46dce000}, {0x46dd0000}, {0x46dd2000}, {0x46dd4000}, {0x46dd6000}, {0x46dd8000}, {0x46dda000}, {0x46ddc000}, {0x46dde000}, {0x46de0000}, {0x46de2000}, {0x46de4000}, {0x46de6000}, {0x46de8000}, {0x46dea000}, {0x46dec000}, {0x46dee000}, {0x46df0000}, {0x46df2000}, {0x46df4000}, {0x46df6000}, {0x46df8000}, {0x46dfa000}, {0x46dfc000}, {0x46dfe000}, {0x46e00000}, {0x46e02000}, {0x46e04000}, {0x46e06000}, {0x46e08000}, {0x46e0a000}, {0x46e0c000}, {0x46e0e000}, {0x46e10000}, {0x46e12000}, {0x46e14000}, {0x46e16000}, {0x46e18000}, {0x46e1a000}, {0x46e1c000}, {0x46e1e000}, {0x46e20000}, {0x46e22000}, {0x46e24000}, {0x46e26000}, {0x46e28000}, {0x46e2a000}, {0x46e2c000}, {0x46e2e000}, {0x46e30000}, {0x46e32000}, {0x46e34000}, {0x46e36000}, {0x46e38000}, {0x46e3a000}, {0x46e3c000}, {0x46e3e000}, {0x46e40000}, {0x46e42000}, {0x46e44000}, {0x46e46000}, {0x46e48000}, {0x46e4a000}, {0x46e4c000}, {0x46e4e000}, {0x46e50000}, {0x46e52000}, {0x46e54000}, {0x46e56000}, {0x46e58000}, {0x46e5a000}, {0x46e5c000}, {0x46e5e000}, {0x46e60000}, {0x46e62000}, {0x46e64000}, {0x46e66000}, {0x46e68000}, {0x46e6a000}, {0x46e6c000}, {0x46e6e000}, {0x46e70000}, {0x46e72000}, {0x46e74000}, {0x46e76000}, {0x46e78000}, {0x46e7a000}, {0x46e7c000}, {0x46e7e000}, {0x46e80000}, {0x46e82000}, {0x46e84000}, {0x46e86000}, {0x46e88000}, {0x46e8a000}, {0x46e8c000}, {0x46e8e000}, {0x46e90000}, {0x46e92000}, {0x46e94000}, {0x46e96000}, {0x46e98000}, {0x46e9a000}, {0x46e9c000}, {0x46e9e000}, {0x46ea0000}, {0x46ea2000}, {0x46ea4000}, {0x46ea6000}, {0x46ea8000}, {0x46eaa000}, {0x46eac000}, {0x46eae000}, {0x46eb0000}, {0x46eb2000}, {0x46eb4000}, {0x46eb6000}, {0x46eb8000}, {0x46eba000}, {0x46ebc000}, {0x46ebe000}, {0x46ec0000}, {0x46ec2000}, {0x46ec4000}, {0x46ec6000}, {0x46ec8000}, {0x46eca000}, {0x46ecc000}, {0x46ece000}, {0x46ed0000}, {0x46ed2000}, {0x46ed4000}, {0x46ed6000}, {0x46ed8000}, {0x46eda000}, {0x46edc000}, {0x46ede000}, {0x46ee0000}, {0x46ee2000}, {0x46ee4000}, {0x46ee6000}, {0x46ee8000}, {0x46eea000}, {0x46eec000}, {0x46eee000}, {0x46ef0000}, {0x46ef2000}, {0x46ef4000}, {0x46ef6000}, {0x46ef8000}, {0x46efa000}, {0x46efc000}, {0x46efe000}, {0x46f00000}, {0x46f02000}, {0x46f04000}, {0x46f06000}, {0x46f08000}, {0x46f0a000}, {0x46f0c000}, {0x46f0e000}, {0x46f10000}, {0x46f12000}, {0x46f14000}, {0x46f16000}, {0x46f18000}, {0x46f1a000}, {0x46f1c000}, {0x46f1e000}, {0x46f20000}, {0x46f22000}, {0x46f24000}, {0x46f26000}, {0x46f28000}, {0x46f2a000}, {0x46f2c000}, {0x46f2e000}, {0x46f30000}, {0x46f32000}, {0x46f34000}, {0x46f36000}, {0x46f38000}, {0x46f3a000}, {0x46f3c000}, {0x46f3e000}, {0x46f40000}, {0x46f42000}, {0x46f44000}, {0x46f46000}, {0x46f48000}, {0x46f4a000}, {0x46f4c000}, {0x46f4e000}, {0x46f50000}, {0x46f52000}, {0x46f54000}, {0x46f56000}, {0x46f58000}, {0x46f5a000}, {0x46f5c000}, {0x46f5e000}, {0x46f60000}, {0x46f62000}, {0x46f64000}, {0x46f66000}, {0x46f68000}, {0x46f6a000}, {0x46f6c000}, {0x46f6e000}, {0x46f70000}, {0x46f72000}, {0x46f74000}, {0x46f76000}, {0x46f78000}, {0x46f7a000}, {0x46f7c000}, {0x46f7e000}, {0x46f80000}, {0x46f82000}, {0x46f84000}, {0x46f86000}, {0x46f88000}, {0x46f8a000}, {0x46f8c000}, {0x46f8e000}, {0x46f90000}, {0x46f92000}, {0x46f94000}, {0x46f96000}, {0x46f98000}, {0x46f9a000}, {0x46f9c000}, {0x46f9e000}, {0x46fa0000}, {0x46fa2000}, {0x46fa4000}, {0x46fa6000}, {0x46fa8000}, {0x46faa000}, {0x46fac000}, {0x46fae000}, {0x46fb0000}, {0x46fb2000}, {0x46fb4000}, {0x46fb6000}, {0x46fb8000}, {0x46fba000}, {0x46fbc000}, {0x46fbe000}, {0x46fc0000}, {0x46fc2000}, {0x46fc4000}, {0x46fc6000}, {0x46fc8000}, {0x46fca000}, {0x46fcc000}, {0x46fce000}, {0x46fd0000}, {0x46fd2000}, {0x46fd4000}, {0x46fd6000}, {0x46fd8000}, {0x46fda000}, {0x46fdc000}, {0x46fde000}, {0x46fe0000}, {0x46fe2000}, {0x46fe4000}, {0x46fe6000}, {0x46fe8000}, {0x46fea000}, {0x46fec000}, {0x46fee000}, {0x46ff0000}, {0x46ff2000}, {0x46ff4000}, {0x46ff6000}, {0x46ff8000}, {0x46ffa000}, {0x46ffc000}, {0x46ffe000}, {0x47000000}, {0x47002000}, {0x47004000}, {0x47006000}, {0x47008000}, {0x4700a000}, {0x4700c000}, {0x4700e000}, {0x47010000}, {0x47012000}, {0x47014000}, {0x47016000}, {0x47018000}, {0x4701a000}, {0x4701c000}, {0x4701e000}, {0x47020000}, {0x47022000}, {0x47024000}, {0x47026000}, {0x47028000}, {0x4702a000}, {0x4702c000}, {0x4702e000}, {0x47030000}, {0x47032000}, {0x47034000}, {0x47036000}, {0x47038000}, {0x4703a000}, {0x4703c000}, {0x4703e000}, {0x47040000}, {0x47042000}, {0x47044000}, {0x47046000}, {0x47048000}, {0x4704a000}, {0x4704c000}, {0x4704e000}, {0x47050000}, {0x47052000}, {0x47054000}, {0x47056000}, {0x47058000}, {0x4705a000}, {0x4705c000}, {0x4705e000}, {0x47060000}, {0x47062000}, {0x47064000}, {0x47066000}, {0x47068000}, {0x4706a000}, {0x4706c000}, {0x4706e000}, {0x47070000}, {0x47072000}, {0x47074000}, {0x47076000}, {0x47078000}, {0x4707a000}, {0x4707c000}, {0x4707e000}, {0x47080000}, {0x47082000}, {0x47084000}, {0x47086000}, {0x47088000}, {0x4708a000}, {0x4708c000}, {0x4708e000}, {0x47090000}, {0x47092000}, {0x47094000}, {0x47096000}, {0x47098000}, {0x4709a000}, {0x4709c000}, {0x4709e000}, {0x470a0000}, {0x470a2000}, {0x470a4000}, {0x470a6000}, {0x470a8000}, {0x470aa000}, {0x470ac000}, {0x470ae000}, {0x470b0000}, {0x470b2000}, {0x470b4000}, {0x470b6000}, {0x470b8000}, {0x470ba000}, {0x470bc000}, {0x470be000}, {0x470c0000}, {0x470c2000}, {0x470c4000}, {0x470c6000}, {0x470c8000}, {0x470ca000}, {0x470cc000}, {0x470ce000}, {0x470d0000}, {0x470d2000}, {0x470d4000}, {0x470d6000}, {0x470d8000}, {0x470da000}, {0x470dc000}, {0x470de000}, {0x470e0000}, {0x470e2000}, {0x470e4000}, {0x470e6000}, {0x470e8000}, {0x470ea000}, {0x470ec000}, {0x470ee000}, {0x470f0000}, {0x470f2000}, {0x470f4000}, {0x470f6000}, {0x470f8000}, {0x470fa000}, {0x470fc000}, {0x470fe000}, {0x47100000}, {0x47102000}, {0x47104000}, {0x47106000}, {0x47108000}, {0x4710a000}, {0x4710c000}, {0x4710e000}, {0x47110000}, {0x47112000}, {0x47114000}, {0x47116000}, {0x47118000}, {0x4711a000}, {0x4711c000}, {0x4711e000}, {0x47120000}, {0x47122000}, {0x47124000}, {0x47126000}, {0x47128000}, {0x4712a000}, {0x4712c000}, {0x4712e000}, {0x47130000}, {0x47132000}, {0x47134000}, {0x47136000}, {0x47138000}, {0x4713a000}, {0x4713c000}, {0x4713e000}, {0x47140000}, {0x47142000}, {0x47144000}, {0x47146000}, {0x47148000}, {0x4714a000}, {0x4714c000}, {0x4714e000}, {0x47150000}, {0x47152000}, {0x47154000}, {0x47156000}, {0x47158000}, {0x4715a000}, {0x4715c000}, {0x4715e000}, {0x47160000}, {0x47162000}, {0x47164000}, {0x47166000}, {0x47168000}, {0x4716a000}, {0x4716c000}, {0x4716e000}, {0x47170000}, {0x47172000}, {0x47174000}, {0x47176000}, {0x47178000}, {0x4717a000}, {0x4717c000}, {0x4717e000}, {0x47180000}, {0x47182000}, {0x47184000}, {0x47186000}, {0x47188000}, {0x4718a000}, {0x4718c000}, {0x4718e000}, {0x47190000}, {0x47192000}, {0x47194000}, {0x47196000}, {0x47198000}, {0x4719a000}, {0x4719c000}, {0x4719e000}, {0x471a0000}, {0x471a2000}, {0x471a4000}, {0x471a6000}, {0x471a8000}, {0x471aa000}, {0x471ac000}, {0x471ae000}, {0x471b0000}, {0x471b2000}, {0x471b4000}, {0x471b6000}, {0x471b8000}, {0x471ba000}, {0x471bc000}, {0x471be000}, {0x471c0000}, {0x471c2000}, {0x471c4000}, {0x471c6000}, {0x471c8000}, {0x471ca000}, {0x471cc000}, {0x471ce000}, {0x471d0000}, {0x471d2000}, {0x471d4000}, {0x471d6000}, {0x471d8000}, {0x471da000}, {0x471dc000}, {0x471de000}, {0x471e0000}, {0x471e2000}, {0x471e4000}, {0x471e6000}, {0x471e8000}, {0x471ea000}, {0x471ec000}, {0x471ee000}, {0x471f0000}, {0x471f2000}, {0x471f4000}, {0x471f6000}, {0x471f8000}, {0x471fa000}, {0x471fc000}, {0x471fe000}, {0x47200000}, {0x47202000}, {0x47204000}, {0x47206000}, {0x47208000}, {0x4720a000}, {0x4720c000}, {0x4720e000}, {0x47210000}, {0x47212000}, {0x47214000}, {0x47216000}, {0x47218000}, {0x4721a000}, {0x4721c000}, {0x4721e000}, {0x47220000}, {0x47222000}, {0x47224000}, {0x47226000}, {0x47228000}, {0x4722a000}, {0x4722c000}, {0x4722e000}, {0x47230000}, {0x47232000}, {0x47234000}, {0x47236000}, {0x47238000}, {0x4723a000}, {0x4723c000}, {0x4723e000}, {0x47240000}, {0x47242000}, {0x47244000}, {0x47246000}, {0x47248000}, {0x4724a000}, {0x4724c000}, {0x4724e000}, {0x47250000}, {0x47252000}, {0x47254000}, {0x47256000}, {0x47258000}, {0x4725a000}, {0x4725c000}, {0x4725e000}, {0x47260000}, {0x47262000}, {0x47264000}, {0x47266000}, {0x47268000}, {0x4726a000}, {0x4726c000}, {0x4726e000}, {0x47270000}, {0x47272000}, {0x47274000}, {0x47276000}, {0x47278000}, {0x4727a000}, {0x4727c000}, {0x4727e000}, {0x47280000}, {0x47282000}, {0x47284000}, {0x47286000}, {0x47288000}, {0x4728a000}, {0x4728c000}, {0x4728e000}, {0x47290000}, {0x47292000}, {0x47294000}, {0x47296000}, {0x47298000}, {0x4729a000}, {0x4729c000}, {0x4729e000}, {0x472a0000}, {0x472a2000}, {0x472a4000}, {0x472a6000}, {0x472a8000}, {0x472aa000}, {0x472ac000}, {0x472ae000}, {0x472b0000}, {0x472b2000}, {0x472b4000}, {0x472b6000}, {0x472b8000}, {0x472ba000}, {0x472bc000}, {0x472be000}, {0x472c0000}, {0x472c2000}, {0x472c4000}, {0x472c6000}, {0x472c8000}, {0x472ca000}, {0x472cc000}, {0x472ce000}, {0x472d0000}, {0x472d2000}, {0x472d4000}, {0x472d6000}, {0x472d8000}, {0x472da000}, {0x472dc000}, {0x472de000}, {0x472e0000}, {0x472e2000}, {0x472e4000}, {0x472e6000}, {0x472e8000}, {0x472ea000}, {0x472ec000}, {0x472ee000}, {0x472f0000}, {0x472f2000}, {0x472f4000}, {0x472f6000}, {0x472f8000}, {0x472fa000}, {0x472fc000}, {0x472fe000}, {0x47300000}, {0x47302000}, {0x47304000}, {0x47306000}, {0x47308000}, {0x4730a000}, {0x4730c000}, {0x4730e000}, {0x47310000}, {0x47312000}, {0x47314000}, {0x47316000}, {0x47318000}, {0x4731a000}, {0x4731c000}, {0x4731e000}, {0x47320000}, {0x47322000}, {0x47324000}, {0x47326000}, {0x47328000}, {0x4732a000}, {0x4732c000}, {0x4732e000}, {0x47330000}, {0x47332000}, {0x47334000}, {0x47336000}, {0x47338000}, {0x4733a000}, {0x4733c000}, {0x4733e000}, {0x47340000}, {0x47342000}, {0x47344000}, {0x47346000}, {0x47348000}, {0x4734a000}, {0x4734c000}, {0x4734e000}, {0x47350000}, {0x47352000}, {0x47354000}, {0x47356000}, {0x47358000}, {0x4735a000}, {0x4735c000}, {0x4735e000}, {0x47360000}, {0x47362000}, {0x47364000}, {0x47366000}, {0x47368000}, {0x4736a000}, {0x4736c000}, {0x4736e000}, {0x47370000}, {0x47372000}, {0x47374000}, {0x47376000}, {0x47378000}, {0x4737a000}, {0x4737c000}, {0x4737e000}, {0x47380000}, {0x47382000}, {0x47384000}, {0x47386000}, {0x47388000}, {0x4738a000}, {0x4738c000}, {0x4738e000}, {0x47390000}, {0x47392000}, {0x47394000}, {0x47396000}, {0x47398000}, {0x4739a000}, {0x4739c000}, {0x4739e000}, {0x473a0000}, {0x473a2000}, {0x473a4000}, {0x473a6000}, {0x473a8000}, {0x473aa000}, {0x473ac000}, {0x473ae000}, {0x473b0000}, {0x473b2000}, {0x473b4000}, {0x473b6000}, {0x473b8000}, {0x473ba000}, {0x473bc000}, {0x473be000}, {0x473c0000}, {0x473c2000}, {0x473c4000}, {0x473c6000}, {0x473c8000}, {0x473ca000}, {0x473cc000}, {0x473ce000}, {0x473d0000}, {0x473d2000}, {0x473d4000}, {0x473d6000}, {0x473d8000}, {0x473da000}, {0x473dc000}, {0x473de000}, {0x473e0000}, {0x473e2000}, {0x473e4000}, {0x473e6000}, {0x473e8000}, {0x473ea000}, {0x473ec000}, {0x473ee000}, {0x473f0000}, {0x473f2000}, {0x473f4000}, {0x473f6000}, {0x473f8000}, {0x473fa000}, {0x473fc000}, {0x473fe000}, {0x47400000}, {0x47402000}, {0x47404000}, {0x47406000}, {0x47408000}, {0x4740a000}, {0x4740c000}, {0x4740e000}, {0x47410000}, {0x47412000}, {0x47414000}, {0x47416000}, {0x47418000}, {0x4741a000}, {0x4741c000}, {0x4741e000}, {0x47420000}, {0x47422000}, {0x47424000}, {0x47426000}, {0x47428000}, {0x4742a000}, {0x4742c000}, {0x4742e000}, {0x47430000}, {0x47432000}, {0x47434000}, {0x47436000}, {0x47438000}, {0x4743a000}, {0x4743c000}, {0x4743e000}, {0x47440000}, {0x47442000}, {0x47444000}, {0x47446000}, {0x47448000}, {0x4744a000}, {0x4744c000}, {0x4744e000}, {0x47450000}, {0x47452000}, {0x47454000}, {0x47456000}, {0x47458000}, {0x4745a000}, {0x4745c000}, {0x4745e000}, {0x47460000}, {0x47462000}, {0x47464000}, {0x47466000}, {0x47468000}, {0x4746a000}, {0x4746c000}, {0x4746e000}, {0x47470000}, {0x47472000}, {0x47474000}, {0x47476000}, {0x47478000}, {0x4747a000}, {0x4747c000}, {0x4747e000}, {0x47480000}, {0x47482000}, {0x47484000}, {0x47486000}, {0x47488000}, {0x4748a000}, {0x4748c000}, {0x4748e000}, {0x47490000}, {0x47492000}, {0x47494000}, {0x47496000}, {0x47498000}, {0x4749a000}, {0x4749c000}, {0x4749e000}, {0x474a0000}, {0x474a2000}, {0x474a4000}, {0x474a6000}, {0x474a8000}, {0x474aa000}, {0x474ac000}, {0x474ae000}, {0x474b0000}, {0x474b2000}, {0x474b4000}, {0x474b6000}, {0x474b8000}, {0x474ba000}, {0x474bc000}, {0x474be000}, {0x474c0000}, {0x474c2000}, {0x474c4000}, {0x474c6000}, {0x474c8000}, {0x474ca000}, {0x474cc000}, {0x474ce000}, {0x474d0000}, {0x474d2000}, {0x474d4000}, {0x474d6000}, {0x474d8000}, {0x474da000}, {0x474dc000}, {0x474de000}, {0x474e0000}, {0x474e2000}, {0x474e4000}, {0x474e6000}, {0x474e8000}, {0x474ea000}, {0x474ec000}, {0x474ee000}, {0x474f0000}, {0x474f2000}, {0x474f4000}, {0x474f6000}, {0x474f8000}, {0x474fa000}, {0x474fc000}, {0x474fe000}, {0x47500000}, {0x47502000}, {0x47504000}, {0x47506000}, {0x47508000}, {0x4750a000}, {0x4750c000}, {0x4750e000}, {0x47510000}, {0x47512000}, {0x47514000}, {0x47516000}, {0x47518000}, {0x4751a000}, {0x4751c000}, {0x4751e000}, {0x47520000}, {0x47522000}, {0x47524000}, {0x47526000}, {0x47528000}, {0x4752a000}, {0x4752c000}, {0x4752e000}, {0x47530000}, {0x47532000}, {0x47534000}, {0x47536000}, {0x47538000}, {0x4753a000}, {0x4753c000}, {0x4753e000}, {0x47540000}, {0x47542000}, {0x47544000}, {0x47546000}, {0x47548000}, {0x4754a000}, {0x4754c000}, {0x4754e000}, {0x47550000}, {0x47552000}, {0x47554000}, {0x47556000}, {0x47558000}, {0x4755a000}, {0x4755c000}, {0x4755e000}, {0x47560000}, {0x47562000}, {0x47564000}, {0x47566000}, {0x47568000}, {0x4756a000}, {0x4756c000}, {0x4756e000}, {0x47570000}, {0x47572000}, {0x47574000}, {0x47576000}, {0x47578000}, {0x4757a000}, {0x4757c000}, {0x4757e000}, {0x47580000}, {0x47582000}, {0x47584000}, {0x47586000}, {0x47588000}, {0x4758a000}, {0x4758c000}, {0x4758e000}, {0x47590000}, {0x47592000}, {0x47594000}, {0x47596000}, {0x47598000}, {0x4759a000}, {0x4759c000}, {0x4759e000}, {0x475a0000}, {0x475a2000}, {0x475a4000}, {0x475a6000}, {0x475a8000}, {0x475aa000}, {0x475ac000}, {0x475ae000}, {0x475b0000}, {0x475b2000}, {0x475b4000}, {0x475b6000}, {0x475b8000}, {0x475ba000}, {0x475bc000}, {0x475be000}, {0x475c0000}, {0x475c2000}, {0x475c4000}, {0x475c6000}, {0x475c8000}, {0x475ca000}, {0x475cc000}, {0x475ce000}, {0x475d0000}, {0x475d2000}, {0x475d4000}, {0x475d6000}, {0x475d8000}, {0x475da000}, {0x475dc000}, {0x475de000}, {0x475e0000}, {0x475e2000}, {0x475e4000}, {0x475e6000}, {0x475e8000}, {0x475ea000}, {0x475ec000}, {0x475ee000}, {0x475f0000}, {0x475f2000}, {0x475f4000}, {0x475f6000}, {0x475f8000}, {0x475fa000}, {0x475fc000}, {0x475fe000}, {0x47600000}, {0x47602000}, {0x47604000}, {0x47606000}, {0x47608000}, {0x4760a000}, {0x4760c000}, {0x4760e000}, {0x47610000}, {0x47612000}, {0x47614000}, {0x47616000}, {0x47618000}, {0x4761a000}, {0x4761c000}, {0x4761e000}, {0x47620000}, {0x47622000}, {0x47624000}, {0x47626000}, {0x47628000}, {0x4762a000}, {0x4762c000}, {0x4762e000}, {0x47630000}, {0x47632000}, {0x47634000}, {0x47636000}, {0x47638000}, {0x4763a000}, {0x4763c000}, {0x4763e000}, {0x47640000}, {0x47642000}, {0x47644000}, {0x47646000}, {0x47648000}, {0x4764a000}, {0x4764c000}, {0x4764e000}, {0x47650000}, {0x47652000}, {0x47654000}, {0x47656000}, {0x47658000}, {0x4765a000}, {0x4765c000}, {0x4765e000}, {0x47660000}, {0x47662000}, {0x47664000}, {0x47666000}, {0x47668000}, {0x4766a000}, {0x4766c000}, {0x4766e000}, {0x47670000}, {0x47672000}, {0x47674000}, {0x47676000}, {0x47678000}, {0x4767a000}, {0x4767c000}, {0x4767e000}, {0x47680000}, {0x47682000}, {0x47684000}, {0x47686000}, {0x47688000}, {0x4768a000}, {0x4768c000}, {0x4768e000}, {0x47690000}, {0x47692000}, {0x47694000}, {0x47696000}, {0x47698000}, {0x4769a000}, {0x4769c000}, {0x4769e000}, {0x476a0000}, {0x476a2000}, {0x476a4000}, {0x476a6000}, {0x476a8000}, {0x476aa000}, {0x476ac000}, {0x476ae000}, {0x476b0000}, {0x476b2000}, {0x476b4000}, {0x476b6000}, {0x476b8000}, {0x476ba000}, {0x476bc000}, {0x476be000}, {0x476c0000}, {0x476c2000}, {0x476c4000}, {0x476c6000}, {0x476c8000}, {0x476ca000}, {0x476cc000}, {0x476ce000}, {0x476d0000}, {0x476d2000}, {0x476d4000}, {0x476d6000}, {0x476d8000}, {0x476da000}, {0x476dc000}, {0x476de000}, {0x476e0000}, {0x476e2000}, {0x476e4000}, {0x476e6000}, {0x476e8000}, {0x476ea000}, {0x476ec000}, {0x476ee000}, {0x476f0000}, {0x476f2000}, {0x476f4000}, {0x476f6000}, {0x476f8000}, {0x476fa000}, {0x476fc000}, {0x476fe000}, {0x47700000}, {0x47702000}, {0x47704000}, {0x47706000}, {0x47708000}, {0x4770a000}, {0x4770c000}, {0x4770e000}, {0x47710000}, {0x47712000}, {0x47714000}, {0x47716000}, {0x47718000}, {0x4771a000}, {0x4771c000}, {0x4771e000}, {0x47720000}, {0x47722000}, {0x47724000}, {0x47726000}, {0x47728000}, {0x4772a000}, {0x4772c000}, {0x4772e000}, {0x47730000}, {0x47732000}, {0x47734000}, {0x47736000}, {0x47738000}, {0x4773a000}, {0x4773c000}, {0x4773e000}, {0x47740000}, {0x47742000}, {0x47744000}, {0x47746000}, {0x47748000}, {0x4774a000}, {0x4774c000}, {0x4774e000}, {0x47750000}, {0x47752000}, {0x47754000}, {0x47756000}, {0x47758000}, {0x4775a000}, {0x4775c000}, {0x4775e000}, {0x47760000}, {0x47762000}, {0x47764000}, {0x47766000}, {0x47768000}, {0x4776a000}, {0x4776c000}, {0x4776e000}, {0x47770000}, {0x47772000}, {0x47774000}, {0x47776000}, {0x47778000}, {0x4777a000}, {0x4777c000}, {0x4777e000}, {0x47780000}, {0x47782000}, {0x47784000}, {0x47786000}, {0x47788000}, {0x4778a000}, {0x4778c000}, {0x4778e000}, {0x47790000}, {0x47792000}, {0x47794000}, {0x47796000}, {0x47798000}, {0x4779a000}, {0x4779c000}, {0x4779e000}, {0x477a0000}, {0x477a2000}, {0x477a4000}, {0x477a6000}, {0x477a8000}, {0x477aa000}, {0x477ac000}, {0x477ae000}, {0x477b0000}, {0x477b2000}, {0x477b4000}, {0x477b6000}, {0x477b8000}, {0x477ba000}, {0x477bc000}, {0x477be000}, {0x477c0000}, {0x477c2000}, {0x477c4000}, {0x477c6000}, {0x477c8000}, {0x477ca000}, {0x477cc000}, {0x477ce000}, {0x477d0000}, {0x477d2000}, {0x477d4000}, {0x477d6000}, {0x477d8000}, {0x477da000}, {0x477dc000}, {0x477de000}, {0x477e0000}, {0x477e2000}, {0x477e4000}, {0x477e6000}, {0x477e8000}, {0x477ea000}, {0x477ec000}, {0x477ee000}, {0x477f0000}, {0x477f2000}, {0x477f4000}, {0x477f6000}, {0x477f8000}, {0x477fa000}, {0x477fc000}, {0x477fe000}, {0x7f800000}, {0x7f802000}, {0x7f804000}, {0x7f806000}, {0x7f808000}, {0x7f80a000}, {0x7f80c000}, {0x7f80e000}, {0x7f810000}, {0x7f812000}, {0x7f814000}, {0x7f816000}, {0x7f818000}, {0x7f81a000}, {0x7f81c000}, {0x7f81e000}, {0x7f820000}, {0x7f822000}, {0x7f824000}, {0x7f826000}, {0x7f828000}, {0x7f82a000}, {0x7f82c000}, {0x7f82e000}, {0x7f830000}, {0x7f832000}, {0x7f834000}, {0x7f836000}, {0x7f838000}, {0x7f83a000}, {0x7f83c000}, {0x7f83e000}, {0x7f840000}, {0x7f842000}, {0x7f844000}, {0x7f846000}, {0x7f848000}, {0x7f84a000}, {0x7f84c000}, {0x7f84e000}, {0x7f850000}, {0x7f852000}, {0x7f854000}, {0x7f856000}, {0x7f858000}, {0x7f85a000}, {0x7f85c000}, {0x7f85e000}, {0x7f860000}, {0x7f862000}, {0x7f864000}, {0x7f866000}, {0x7f868000}, {0x7f86a000}, {0x7f86c000}, {0x7f86e000}, {0x7f870000}, {0x7f872000}, {0x7f874000}, {0x7f876000}, {0x7f878000}, {0x7f87a000}, {0x7f87c000}, {0x7f87e000}, {0x7f880000}, {0x7f882000}, {0x7f884000}, {0x7f886000}, {0x7f888000}, {0x7f88a000}, {0x7f88c000}, {0x7f88e000}, {0x7f890000}, {0x7f892000}, {0x7f894000}, {0x7f896000}, {0x7f898000}, {0x7f89a000}, {0x7f89c000}, {0x7f89e000}, {0x7f8a0000}, {0x7f8a2000}, {0x7f8a4000}, {0x7f8a6000}, {0x7f8a8000}, {0x7f8aa000}, {0x7f8ac000}, {0x7f8ae000}, {0x7f8b0000}, {0x7f8b2000}, {0x7f8b4000}, {0x7f8b6000}, {0x7f8b8000}, {0x7f8ba000}, {0x7f8bc000}, {0x7f8be000}, {0x7f8c0000}, {0x7f8c2000}, {0x7f8c4000}, {0x7f8c6000}, {0x7f8c8000}, {0x7f8ca000}, {0x7f8cc000}, {0x7f8ce000}, {0x7f8d0000}, {0x7f8d2000}, {0x7f8d4000}, {0x7f8d6000}, {0x7f8d8000}, {0x7f8da000}, {0x7f8dc000}, {0x7f8de000}, {0x7f8e0000}, {0x7f8e2000}, {0x7f8e4000}, {0x7f8e6000}, {0x7f8e8000}, {0x7f8ea000}, {0x7f8ec000}, {0x7f8ee000}, {0x7f8f0000}, {0x7f8f2000}, {0x7f8f4000}, {0x7f8f6000}, {0x7f8f8000}, {0x7f8fa000}, {0x7f8fc000}, {0x7f8fe000}, {0x7f900000}, {0x7f902000}, {0x7f904000}, {0x7f906000}, {0x7f908000}, {0x7f90a000}, {0x7f90c000}, {0x7f90e000}, {0x7f910000}, {0x7f912000}, {0x7f914000}, {0x7f916000}, {0x7f918000}, {0x7f91a000}, {0x7f91c000}, {0x7f91e000}, {0x7f920000}, {0x7f922000}, {0x7f924000}, {0x7f926000}, {0x7f928000}, {0x7f92a000}, {0x7f92c000}, {0x7f92e000}, {0x7f930000}, {0x7f932000}, {0x7f934000}, {0x7f936000}, {0x7f938000}, {0x7f93a000}, {0x7f93c000}, {0x7f93e000}, {0x7f940000}, {0x7f942000}, {0x7f944000}, {0x7f946000}, {0x7f948000}, {0x7f94a000}, {0x7f94c000}, {0x7f94e000}, {0x7f950000}, {0x7f952000}, {0x7f954000}, {0x7f956000}, {0x7f958000}, {0x7f95a000}, {0x7f95c000}, {0x7f95e000}, {0x7f960000}, {0x7f962000}, {0x7f964000}, {0x7f966000}, {0x7f968000}, {0x7f96a000}, {0x7f96c000}, {0x7f96e000}, {0x7f970000}, {0x7f972000}, {0x7f974000}, {0x7f976000}, {0x7f978000}, {0x7f97a000}, {0x7f97c000}, {0x7f97e000}, {0x7f980000}, {0x7f982000}, {0x7f984000}, {0x7f986000}, {0x7f988000}, {0x7f98a000}, {0x7f98c000}, {0x7f98e000}, {0x7f990000}, {0x7f992000}, {0x7f994000}, {0x7f996000}, {0x7f998000}, {0x7f99a000}, {0x7f99c000}, {0x7f99e000}, {0x7f9a0000}, {0x7f9a2000}, {0x7f9a4000}, {0x7f9a6000}, {0x7f9a8000}, {0x7f9aa000}, {0x7f9ac000}, {0x7f9ae000}, {0x7f9b0000}, {0x7f9b2000}, {0x7f9b4000}, {0x7f9b6000}, {0x7f9b8000}, {0x7f9ba000}, {0x7f9bc000}, {0x7f9be000}, {0x7f9c0000}, {0x7f9c2000}, {0x7f9c4000}, {0x7f9c6000}, {0x7f9c8000}, {0x7f9ca000}, {0x7f9cc000}, {0x7f9ce000}, {0x7f9d0000}, {0x7f9d2000}, {0x7f9d4000}, {0x7f9d6000}, {0x7f9d8000}, {0x7f9da000}, {0x7f9dc000}, {0x7f9de000}, {0x7f9e0000}, {0x7f9e2000}, {0x7f9e4000}, {0x7f9e6000}, {0x7f9e8000}, {0x7f9ea000}, {0x7f9ec000}, {0x7f9ee000}, {0x7f9f0000}, {0x7f9f2000}, {0x7f9f4000}, {0x7f9f6000}, {0x7f9f8000}, {0x7f9fa000}, {0x7f9fc000}, {0x7f9fe000}, {0x7fa00000}, {0x7fa02000}, {0x7fa04000}, {0x7fa06000}, {0x7fa08000}, {0x7fa0a000}, {0x7fa0c000}, {0x7fa0e000}, {0x7fa10000}, {0x7fa12000}, {0x7fa14000}, {0x7fa16000}, {0x7fa18000}, {0x7fa1a000}, {0x7fa1c000}, {0x7fa1e000}, {0x7fa20000}, {0x7fa22000}, {0x7fa24000}, {0x7fa26000}, {0x7fa28000}, {0x7fa2a000}, {0x7fa2c000}, {0x7fa2e000}, {0x7fa30000}, {0x7fa32000}, {0x7fa34000}, {0x7fa36000}, {0x7fa38000}, {0x7fa3a000}, {0x7fa3c000}, {0x7fa3e000}, {0x7fa40000}, {0x7fa42000}, {0x7fa44000}, {0x7fa46000}, {0x7fa48000}, {0x7fa4a000}, {0x7fa4c000}, {0x7fa4e000}, {0x7fa50000}, {0x7fa52000}, {0x7fa54000}, {0x7fa56000}, {0x7fa58000}, {0x7fa5a000}, {0x7fa5c000}, {0x7fa5e000}, {0x7fa60000}, {0x7fa62000}, {0x7fa64000}, {0x7fa66000}, {0x7fa68000}, {0x7fa6a000}, {0x7fa6c000}, {0x7fa6e000}, {0x7fa70000}, {0x7fa72000}, {0x7fa74000}, {0x7fa76000}, {0x7fa78000}, {0x7fa7a000}, {0x7fa7c000}, {0x7fa7e000}, {0x7fa80000}, {0x7fa82000}, {0x7fa84000}, {0x7fa86000}, {0x7fa88000}, {0x7fa8a000}, {0x7fa8c000}, {0x7fa8e000}, {0x7fa90000}, {0x7fa92000}, {0x7fa94000}, {0x7fa96000}, {0x7fa98000}, {0x7fa9a000}, {0x7fa9c000}, {0x7fa9e000}, {0x7faa0000}, {0x7faa2000}, {0x7faa4000}, {0x7faa6000}, {0x7faa8000}, {0x7faaa000}, {0x7faac000}, {0x7faae000}, {0x7fab0000}, {0x7fab2000}, {0x7fab4000}, {0x7fab6000}, {0x7fab8000}, {0x7faba000}, {0x7fabc000}, {0x7fabe000}, {0x7fac0000}, {0x7fac2000}, {0x7fac4000}, {0x7fac6000}, {0x7fac8000}, {0x7faca000}, {0x7facc000}, {0x7face000}, {0x7fad0000}, {0x7fad2000}, {0x7fad4000}, {0x7fad6000}, {0x7fad8000}, {0x7fada000}, {0x7fadc000}, {0x7fade000}, {0x7fae0000}, {0x7fae2000}, {0x7fae4000}, {0x7fae6000}, {0x7fae8000}, {0x7faea000}, {0x7faec000}, {0x7faee000}, {0x7faf0000}, {0x7faf2000}, {0x7faf4000}, {0x7faf6000}, {0x7faf8000}, {0x7fafa000}, {0x7fafc000}, {0x7fafe000}, {0x7fb00000}, {0x7fb02000}, {0x7fb04000}, {0x7fb06000}, {0x7fb08000}, {0x7fb0a000}, {0x7fb0c000}, {0x7fb0e000}, {0x7fb10000}, {0x7fb12000}, {0x7fb14000}, {0x7fb16000}, {0x7fb18000}, {0x7fb1a000}, {0x7fb1c000}, {0x7fb1e000}, {0x7fb20000}, {0x7fb22000}, {0x7fb24000}, {0x7fb26000}, {0x7fb28000}, {0x7fb2a000}, {0x7fb2c000}, {0x7fb2e000}, {0x7fb30000}, {0x7fb32000}, {0x7fb34000}, {0x7fb36000}, {0x7fb38000}, {0x7fb3a000}, {0x7fb3c000}, {0x7fb3e000}, {0x7fb40000}, {0x7fb42000}, {0x7fb44000}, {0x7fb46000}, {0x7fb48000}, {0x7fb4a000}, {0x7fb4c000}, {0x7fb4e000}, {0x7fb50000}, {0x7fb52000}, {0x7fb54000}, {0x7fb56000}, {0x7fb58000}, {0x7fb5a000}, {0x7fb5c000}, {0x7fb5e000}, {0x7fb60000}, {0x7fb62000}, {0x7fb64000}, {0x7fb66000}, {0x7fb68000}, {0x7fb6a000}, {0x7fb6c000}, {0x7fb6e000}, {0x7fb70000}, {0x7fb72000}, {0x7fb74000}, {0x7fb76000}, {0x7fb78000}, {0x7fb7a000}, {0x7fb7c000}, {0x7fb7e000}, {0x7fb80000}, {0x7fb82000}, {0x7fb84000}, {0x7fb86000}, {0x7fb88000}, {0x7fb8a000}, {0x7fb8c000}, {0x7fb8e000}, {0x7fb90000}, {0x7fb92000}, {0x7fb94000}, {0x7fb96000}, {0x7fb98000}, {0x7fb9a000}, {0x7fb9c000}, {0x7fb9e000}, {0x7fba0000}, {0x7fba2000}, {0x7fba4000}, {0x7fba6000}, {0x7fba8000}, {0x7fbaa000}, {0x7fbac000}, {0x7fbae000}, {0x7fbb0000}, {0x7fbb2000}, {0x7fbb4000}, {0x7fbb6000}, {0x7fbb8000}, {0x7fbba000}, {0x7fbbc000}, {0x7fbbe000}, {0x7fbc0000}, {0x7fbc2000}, {0x7fbc4000}, {0x7fbc6000}, {0x7fbc8000}, {0x7fbca000}, {0x7fbcc000}, {0x7fbce000}, {0x7fbd0000}, {0x7fbd2000}, {0x7fbd4000}, {0x7fbd6000}, {0x7fbd8000}, {0x7fbda000}, {0x7fbdc000}, {0x7fbde000}, {0x7fbe0000}, {0x7fbe2000}, {0x7fbe4000}, {0x7fbe6000}, {0x7fbe8000}, {0x7fbea000}, {0x7fbec000}, {0x7fbee000}, {0x7fbf0000}, {0x7fbf2000}, {0x7fbf4000}, {0x7fbf6000}, {0x7fbf8000}, {0x7fbfa000}, {0x7fbfc000}, {0x7fbfe000}, {0x7fc00000}, {0x7fc02000}, {0x7fc04000}, {0x7fc06000}, {0x7fc08000}, {0x7fc0a000}, {0x7fc0c000}, {0x7fc0e000}, {0x7fc10000}, {0x7fc12000}, {0x7fc14000}, {0x7fc16000}, {0x7fc18000}, {0x7fc1a000}, {0x7fc1c000}, {0x7fc1e000}, {0x7fc20000}, {0x7fc22000}, {0x7fc24000}, {0x7fc26000}, {0x7fc28000}, {0x7fc2a000}, {0x7fc2c000}, {0x7fc2e000}, {0x7fc30000}, {0x7fc32000}, {0x7fc34000}, {0x7fc36000}, {0x7fc38000}, {0x7fc3a000}, {0x7fc3c000}, {0x7fc3e000}, {0x7fc40000}, {0x7fc42000}, {0x7fc44000}, {0x7fc46000}, {0x7fc48000}, {0x7fc4a000}, {0x7fc4c000}, {0x7fc4e000}, {0x7fc50000}, {0x7fc52000}, {0x7fc54000}, {0x7fc56000}, {0x7fc58000}, {0x7fc5a000}, {0x7fc5c000}, {0x7fc5e000}, {0x7fc60000}, {0x7fc62000}, {0x7fc64000}, {0x7fc66000}, {0x7fc68000}, {0x7fc6a000}, {0x7fc6c000}, {0x7fc6e000}, {0x7fc70000}, {0x7fc72000}, {0x7fc74000}, {0x7fc76000}, {0x7fc78000}, {0x7fc7a000}, {0x7fc7c000}, {0x7fc7e000}, {0x7fc80000}, {0x7fc82000}, {0x7fc84000}, {0x7fc86000}, {0x7fc88000}, {0x7fc8a000}, {0x7fc8c000}, {0x7fc8e000}, {0x7fc90000}, {0x7fc92000}, {0x7fc94000}, {0x7fc96000}, {0x7fc98000}, {0x7fc9a000}, {0x7fc9c000}, {0x7fc9e000}, {0x7fca0000}, {0x7fca2000}, {0x7fca4000}, {0x7fca6000}, {0x7fca8000}, {0x7fcaa000}, {0x7fcac000}, {0x7fcae000}, {0x7fcb0000}, {0x7fcb2000}, {0x7fcb4000}, {0x7fcb6000}, {0x7fcb8000}, {0x7fcba000}, {0x7fcbc000}, {0x7fcbe000}, {0x7fcc0000}, {0x7fcc2000}, {0x7fcc4000}, {0x7fcc6000}, {0x7fcc8000}, {0x7fcca000}, {0x7fccc000}, {0x7fcce000}, {0x7fcd0000}, {0x7fcd2000}, {0x7fcd4000}, {0x7fcd6000}, {0x7fcd8000}, {0x7fcda000}, {0x7fcdc000}, {0x7fcde000}, {0x7fce0000}, {0x7fce2000}, {0x7fce4000}, {0x7fce6000}, {0x7fce8000}, {0x7fcea000}, {0x7fcec000}, {0x7fcee000}, {0x7fcf0000}, {0x7fcf2000}, {0x7fcf4000}, {0x7fcf6000}, {0x7fcf8000}, {0x7fcfa000}, {0x7fcfc000}, {0x7fcfe000}, {0x7fd00000}, {0x7fd02000}, {0x7fd04000}, {0x7fd06000}, {0x7fd08000}, {0x7fd0a000}, {0x7fd0c000}, {0x7fd0e000}, {0x7fd10000}, {0x7fd12000}, {0x7fd14000}, {0x7fd16000}, {0x7fd18000}, {0x7fd1a000}, {0x7fd1c000}, {0x7fd1e000}, {0x7fd20000}, {0x7fd22000}, {0x7fd24000}, {0x7fd26000}, {0x7fd28000}, {0x7fd2a000}, {0x7fd2c000}, {0x7fd2e000}, {0x7fd30000}, {0x7fd32000}, {0x7fd34000}, {0x7fd36000}, {0x7fd38000}, {0x7fd3a000}, {0x7fd3c000}, {0x7fd3e000}, {0x7fd40000}, {0x7fd42000}, {0x7fd44000}, {0x7fd46000}, {0x7fd48000}, {0x7fd4a000}, {0x7fd4c000}, {0x7fd4e000}, {0x7fd50000}, {0x7fd52000}, {0x7fd54000}, {0x7fd56000}, {0x7fd58000}, {0x7fd5a000}, {0x7fd5c000}, {0x7fd5e000}, {0x7fd60000}, {0x7fd62000}, {0x7fd64000}, {0x7fd66000}, {0x7fd68000}, {0x7fd6a000}, {0x7fd6c000}, {0x7fd6e000}, {0x7fd70000}, {0x7fd72000}, {0x7fd74000}, {0x7fd76000}, {0x7fd78000}, {0x7fd7a000}, {0x7fd7c000}, {0x7fd7e000}, {0x7fd80000}, {0x7fd82000}, {0x7fd84000}, {0x7fd86000}, {0x7fd88000}, {0x7fd8a000}, {0x7fd8c000}, {0x7fd8e000}, {0x7fd90000}, {0x7fd92000}, {0x7fd94000}, {0x7fd96000}, {0x7fd98000}, {0x7fd9a000}, {0x7fd9c000}, {0x7fd9e000}, {0x7fda0000}, {0x7fda2000}, {0x7fda4000}, {0x7fda6000}, {0x7fda8000}, {0x7fdaa000}, {0x7fdac000}, {0x7fdae000}, {0x7fdb0000}, {0x7fdb2000}, {0x7fdb4000}, {0x7fdb6000}, {0x7fdb8000}, {0x7fdba000}, {0x7fdbc000}, {0x7fdbe000}, {0x7fdc0000}, {0x7fdc2000}, {0x7fdc4000}, {0x7fdc6000}, {0x7fdc8000}, {0x7fdca000}, {0x7fdcc000}, {0x7fdce000}, {0x7fdd0000}, {0x7fdd2000}, {0x7fdd4000}, {0x7fdd6000}, {0x7fdd8000}, {0x7fdda000}, {0x7fddc000}, {0x7fdde000}, {0x7fde0000}, {0x7fde2000}, {0x7fde4000}, {0x7fde6000}, {0x7fde8000}, {0x7fdea000}, {0x7fdec000}, {0x7fdee000}, {0x7fdf0000}, {0x7fdf2000}, {0x7fdf4000}, {0x7fdf6000}, {0x7fdf8000}, {0x7fdfa000}, {0x7fdfc000}, {0x7fdfe000}, {0x7fe00000}, {0x7fe02000}, {0x7fe04000}, {0x7fe06000}, {0x7fe08000}, {0x7fe0a000}, {0x7fe0c000}, {0x7fe0e000}, {0x7fe10000}, {0x7fe12000}, {0x7fe14000}, {0x7fe16000}, {0x7fe18000}, {0x7fe1a000}, {0x7fe1c000}, {0x7fe1e000}, {0x7fe20000}, {0x7fe22000}, {0x7fe24000}, {0x7fe26000}, {0x7fe28000}, {0x7fe2a000}, {0x7fe2c000}, {0x7fe2e000}, {0x7fe30000}, {0x7fe32000}, {0x7fe34000}, {0x7fe36000}, {0x7fe38000}, {0x7fe3a000}, {0x7fe3c000}, {0x7fe3e000}, {0x7fe40000}, {0x7fe42000}, {0x7fe44000}, {0x7fe46000}, {0x7fe48000}, {0x7fe4a000}, {0x7fe4c000}, {0x7fe4e000}, {0x7fe50000}, {0x7fe52000}, {0x7fe54000}, {0x7fe56000}, {0x7fe58000}, {0x7fe5a000}, {0x7fe5c000}, {0x7fe5e000}, {0x7fe60000}, {0x7fe62000}, {0x7fe64000}, {0x7fe66000}, {0x7fe68000}, {0x7fe6a000}, {0x7fe6c000}, {0x7fe6e000}, {0x7fe70000}, {0x7fe72000}, {0x7fe74000}, {0x7fe76000}, {0x7fe78000}, {0x7fe7a000}, {0x7fe7c000}, {0x7fe7e000}, {0x7fe80000}, {0x7fe82000}, {0x7fe84000}, {0x7fe86000}, {0x7fe88000}, {0x7fe8a000}, {0x7fe8c000}, {0x7fe8e000}, {0x7fe90000}, {0x7fe92000}, {0x7fe94000}, {0x7fe96000}, {0x7fe98000}, {0x7fe9a000}, {0x7fe9c000}, {0x7fe9e000}, {0x7fea0000}, {0x7fea2000}, {0x7fea4000}, {0x7fea6000}, {0x7fea8000}, {0x7feaa000}, {0x7feac000}, {0x7feae000}, {0x7feb0000}, {0x7feb2000}, {0x7feb4000}, {0x7feb6000}, {0x7feb8000}, {0x7feba000}, {0x7febc000}, {0x7febe000}, {0x7fec0000}, {0x7fec2000}, {0x7fec4000}, {0x7fec6000}, {0x7fec8000}, {0x7feca000}, {0x7fecc000}, {0x7fece000}, {0x7fed0000}, {0x7fed2000}, {0x7fed4000}, {0x7fed6000}, {0x7fed8000}, {0x7feda000}, {0x7fedc000}, {0x7fede000}, {0x7fee0000}, {0x7fee2000}, {0x7fee4000}, {0x7fee6000}, {0x7fee8000}, {0x7feea000}, {0x7feec000}, {0x7feee000}, {0x7fef0000}, {0x7fef2000}, {0x7fef4000}, {0x7fef6000}, {0x7fef8000}, {0x7fefa000}, {0x7fefc000}, {0x7fefe000}, {0x7ff00000}, {0x7ff02000}, {0x7ff04000}, {0x7ff06000}, {0x7ff08000}, {0x7ff0a000}, {0x7ff0c000}, {0x7ff0e000}, {0x7ff10000}, {0x7ff12000}, {0x7ff14000}, {0x7ff16000}, {0x7ff18000}, {0x7ff1a000}, {0x7ff1c000}, {0x7ff1e000}, {0x7ff20000}, {0x7ff22000}, {0x7ff24000}, {0x7ff26000}, {0x7ff28000}, {0x7ff2a000}, {0x7ff2c000}, {0x7ff2e000}, {0x7ff30000}, {0x7ff32000}, {0x7ff34000}, {0x7ff36000}, {0x7ff38000}, {0x7ff3a000}, {0x7ff3c000}, {0x7ff3e000}, {0x7ff40000}, {0x7ff42000}, {0x7ff44000}, {0x7ff46000}, {0x7ff48000}, {0x7ff4a000}, {0x7ff4c000}, {0x7ff4e000}, {0x7ff50000}, {0x7ff52000}, {0x7ff54000}, {0x7ff56000}, {0x7ff58000}, {0x7ff5a000}, {0x7ff5c000}, {0x7ff5e000}, {0x7ff60000}, {0x7ff62000}, {0x7ff64000}, {0x7ff66000}, {0x7ff68000}, {0x7ff6a000}, {0x7ff6c000}, {0x7ff6e000}, {0x7ff70000}, {0x7ff72000}, {0x7ff74000}, {0x7ff76000}, {0x7ff78000}, {0x7ff7a000}, {0x7ff7c000}, {0x7ff7e000}, {0x7ff80000}, {0x7ff82000}, {0x7ff84000}, {0x7ff86000}, {0x7ff88000}, {0x7ff8a000}, {0x7ff8c000}, {0x7ff8e000}, {0x7ff90000}, {0x7ff92000}, {0x7ff94000}, {0x7ff96000}, {0x7ff98000}, {0x7ff9a000}, {0x7ff9c000}, {0x7ff9e000}, {0x7ffa0000}, {0x7ffa2000}, {0x7ffa4000}, {0x7ffa6000}, {0x7ffa8000}, {0x7ffaa000}, {0x7ffac000}, {0x7ffae000}, {0x7ffb0000}, {0x7ffb2000}, {0x7ffb4000}, {0x7ffb6000}, {0x7ffb8000}, {0x7ffba000}, {0x7ffbc000}, {0x7ffbe000}, {0x7ffc0000}, {0x7ffc2000}, {0x7ffc4000}, {0x7ffc6000}, {0x7ffc8000}, {0x7ffca000}, {0x7ffcc000}, {0x7ffce000}, {0x7ffd0000}, {0x7ffd2000}, {0x7ffd4000}, {0x7ffd6000}, {0x7ffd8000}, {0x7ffda000}, {0x7ffdc000}, {0x7ffde000}, {0x7ffe0000}, {0x7ffe2000}, {0x7ffe4000}, {0x7ffe6000}, {0x7ffe8000}, {0x7ffea000}, {0x7ffec000}, {0x7ffee000}, {0x7fff0000}, {0x7fff2000}, {0x7fff4000}, {0x7fff6000}, {0x7fff8000}, {0x7fffa000}, {0x7fffc000}, {0x7fffe000}, {0x80000000}, {0xb3800000}, {0xb4000000}, {0xb4400000}, {0xb4800000}, {0xb4a00000}, {0xb4c00000}, {0xb4e00000}, {0xb5000000}, {0xb5100000}, {0xb5200000}, {0xb5300000}, {0xb5400000}, {0xb5500000}, {0xb5600000}, {0xb5700000}, {0xb5800000}, {0xb5880000}, {0xb5900000}, {0xb5980000}, {0xb5a00000}, {0xb5a80000}, {0xb5b00000}, {0xb5b80000}, {0xb5c00000}, {0xb5c80000}, {0xb5d00000}, {0xb5d80000}, {0xb5e00000}, {0xb5e80000}, {0xb5f00000}, {0xb5f80000}, {0xb6000000}, {0xb6040000}, {0xb6080000}, {0xb60c0000}, {0xb6100000}, {0xb6140000}, {0xb6180000}, {0xb61c0000}, {0xb6200000}, {0xb6240000}, {0xb6280000}, {0xb62c0000}, {0xb6300000}, {0xb6340000}, {0xb6380000}, {0xb63c0000}, {0xb6400000}, {0xb6440000}, {0xb6480000}, {0xb64c0000}, {0xb6500000}, {0xb6540000}, {0xb6580000}, {0xb65c0000}, {0xb6600000}, {0xb6640000}, {0xb6680000}, {0xb66c0000}, {0xb6700000}, {0xb6740000}, {0xb6780000}, {0xb67c0000}, {0xb6800000}, {0xb6820000}, {0xb6840000}, {0xb6860000}, {0xb6880000}, {0xb68a0000}, {0xb68c0000}, {0xb68e0000}, {0xb6900000}, {0xb6920000}, {0xb6940000}, {0xb6960000}, {0xb6980000}, {0xb69a0000}, {0xb69c0000}, {0xb69e0000}, {0xb6a00000}, {0xb6a20000}, {0xb6a40000}, {0xb6a60000}, {0xb6a80000}, {0xb6aa0000}, {0xb6ac0000}, {0xb6ae0000}, {0xb6b00000}, {0xb6b20000}, {0xb6b40000}, {0xb6b60000}, {0xb6b80000}, {0xb6ba0000}, {0xb6bc0000}, {0xb6be0000}, {0xb6c00000}, {0xb6c20000}, {0xb6c40000}, {0xb6c60000}, {0xb6c80000}, {0xb6ca0000}, {0xb6cc0000}, {0xb6ce0000}, {0xb6d00000}, {0xb6d20000}, {0xb6d40000}, {0xb6d60000}, {0xb6d80000}, {0xb6da0000}, {0xb6dc0000}, {0xb6de0000}, {0xb6e00000}, {0xb6e20000}, {0xb6e40000}, {0xb6e60000}, {0xb6e80000}, {0xb6ea0000}, {0xb6ec0000}, {0xb6ee0000}, {0xb6f00000}, {0xb6f20000}, {0xb6f40000}, {0xb6f60000}, {0xb6f80000}, {0xb6fa0000}, {0xb6fc0000}, {0xb6fe0000}, {0xb7000000}, {0xb7010000}, {0xb7020000}, {0xb7030000}, {0xb7040000}, {0xb7050000}, {0xb7060000}, {0xb7070000}, {0xb7080000}, {0xb7090000}, {0xb70a0000}, {0xb70b0000}, {0xb70c0000}, {0xb70d0000}, {0xb70e0000}, {0xb70f0000}, {0xb7100000}, {0xb7110000}, {0xb7120000}, {0xb7130000}, {0xb7140000}, {0xb7150000}, {0xb7160000}, {0xb7170000}, {0xb7180000}, {0xb7190000}, {0xb71a0000}, {0xb71b0000}, {0xb71c0000}, {0xb71d0000}, {0xb71e0000}, {0xb71f0000}, {0xb7200000}, {0xb7210000}, {0xb7220000}, {0xb7230000}, {0xb7240000}, {0xb7250000}, {0xb7260000}, {0xb7270000}, {0xb7280000}, {0xb7290000}, {0xb72a0000}, {0xb72b0000}, {0xb72c0000}, {0xb72d0000}, {0xb72e0000}, {0xb72f0000}, {0xb7300000}, {0xb7310000}, {0xb7320000}, {0xb7330000}, {0xb7340000}, {0xb7350000}, {0xb7360000}, {0xb7370000}, {0xb7380000}, {0xb7390000}, {0xb73a0000}, {0xb73b0000}, {0xb73c0000}, {0xb73d0000}, {0xb73e0000}, {0xb73f0000}, {0xb7400000}, {0xb7410000}, {0xb7420000}, {0xb7430000}, {0xb7440000}, {0xb7450000}, {0xb7460000}, {0xb7470000}, {0xb7480000}, {0xb7490000}, {0xb74a0000}, {0xb74b0000}, {0xb74c0000}, {0xb74d0000}, {0xb74e0000}, {0xb74f0000}, {0xb7500000}, {0xb7510000}, {0xb7520000}, {0xb7530000}, {0xb7540000}, {0xb7550000}, {0xb7560000}, {0xb7570000}, {0xb7580000}, {0xb7590000}, {0xb75a0000}, {0xb75b0000}, {0xb75c0000}, {0xb75d0000}, {0xb75e0000}, {0xb75f0000}, {0xb7600000}, {0xb7610000}, {0xb7620000}, {0xb7630000}, {0xb7640000}, {0xb7650000}, {0xb7660000}, {0xb7670000}, {0xb7680000}, {0xb7690000}, {0xb76a0000}, {0xb76b0000}, {0xb76c0000}, {0xb76d0000}, {0xb76e0000}, {0xb76f0000}, {0xb7700000}, {0xb7710000}, {0xb7720000}, {0xb7730000}, {0xb7740000}, {0xb7750000}, {0xb7760000}, {0xb7770000}, {0xb7780000}, {0xb7790000}, {0xb77a0000}, {0xb77b0000}, {0xb77c0000}, {0xb77d0000}, {0xb77e0000}, {0xb77f0000}, {0xb7800000}, {0xb7808000}, {0xb7810000}, {0xb7818000}, {0xb7820000}, {0xb7828000}, {0xb7830000}, {0xb7838000}, {0xb7840000}, {0xb7848000}, {0xb7850000}, {0xb7858000}, {0xb7860000}, {0xb7868000}, {0xb7870000}, {0xb7878000}, {0xb7880000}, {0xb7888000}, {0xb7890000}, {0xb7898000}, {0xb78a0000}, {0xb78a8000}, {0xb78b0000}, {0xb78b8000}, {0xb78c0000}, {0xb78c8000}, {0xb78d0000}, {0xb78d8000}, {0xb78e0000}, {0xb78e8000}, {0xb78f0000}, {0xb78f8000}, {0xb7900000}, {0xb7908000}, {0xb7910000}, {0xb7918000}, {0xb7920000}, {0xb7928000}, {0xb7930000}, {0xb7938000}, {0xb7940000}, {0xb7948000}, {0xb7950000}, {0xb7958000}, {0xb7960000}, {0xb7968000}, {0xb7970000}, {0xb7978000}, {0xb7980000}, {0xb7988000}, {0xb7990000}, {0xb7998000}, {0xb79a0000}, {0xb79a8000}, {0xb79b0000}, {0xb79b8000}, {0xb79c0000}, {0xb79c8000}, {0xb79d0000}, {0xb79d8000}, {0xb79e0000}, {0xb79e8000}, {0xb79f0000}, {0xb79f8000}, {0xb7a00000}, {0xb7a08000}, {0xb7a10000}, {0xb7a18000}, {0xb7a20000}, {0xb7a28000}, {0xb7a30000}, {0xb7a38000}, {0xb7a40000}, {0xb7a48000}, {0xb7a50000}, {0xb7a58000}, {0xb7a60000}, {0xb7a68000}, {0xb7a70000}, {0xb7a78000}, {0xb7a80000}, {0xb7a88000}, {0xb7a90000}, {0xb7a98000}, {0xb7aa0000}, {0xb7aa8000}, {0xb7ab0000}, {0xb7ab8000}, {0xb7ac0000}, {0xb7ac8000}, {0xb7ad0000}, {0xb7ad8000}, {0xb7ae0000}, {0xb7ae8000}, {0xb7af0000}, {0xb7af8000}, {0xb7b00000}, {0xb7b08000}, {0xb7b10000}, {0xb7b18000}, {0xb7b20000}, {0xb7b28000}, {0xb7b30000}, {0xb7b38000}, {0xb7b40000}, {0xb7b48000}, {0xb7b50000}, {0xb7b58000}, {0xb7b60000}, {0xb7b68000}, {0xb7b70000}, {0xb7b78000}, {0xb7b80000}, {0xb7b88000}, {0xb7b90000}, {0xb7b98000}, {0xb7ba0000}, {0xb7ba8000}, {0xb7bb0000}, {0xb7bb8000}, {0xb7bc0000}, {0xb7bc8000}, {0xb7bd0000}, {0xb7bd8000}, {0xb7be0000}, {0xb7be8000}, {0xb7bf0000}, {0xb7bf8000}, {0xb7c00000}, {0xb7c08000}, {0xb7c10000}, {0xb7c18000}, {0xb7c20000}, {0xb7c28000}, {0xb7c30000}, {0xb7c38000}, {0xb7c40000}, {0xb7c48000}, {0xb7c50000}, {0xb7c58000}, {0xb7c60000}, {0xb7c68000}, {0xb7c70000}, {0xb7c78000}, {0xb7c80000}, {0xb7c88000}, {0xb7c90000}, {0xb7c98000}, {0xb7ca0000}, {0xb7ca8000}, {0xb7cb0000}, {0xb7cb8000}, {0xb7cc0000}, {0xb7cc8000}, {0xb7cd0000}, {0xb7cd8000}, {0xb7ce0000}, {0xb7ce8000}, {0xb7cf0000}, {0xb7cf8000}, {0xb7d00000}, {0xb7d08000}, {0xb7d10000}, {0xb7d18000}, {0xb7d20000}, {0xb7d28000}, {0xb7d30000}, {0xb7d38000}, {0xb7d40000}, {0xb7d48000}, {0xb7d50000}, {0xb7d58000}, {0xb7d60000}, {0xb7d68000}, {0xb7d70000}, {0xb7d78000}, {0xb7d80000}, {0xb7d88000}, {0xb7d90000}, {0xb7d98000}, {0xb7da0000}, {0xb7da8000}, {0xb7db0000}, {0xb7db8000}, {0xb7dc0000}, {0xb7dc8000}, {0xb7dd0000}, {0xb7dd8000}, {0xb7de0000}, {0xb7de8000}, {0xb7df0000}, {0xb7df8000}, {0xb7e00000}, {0xb7e08000}, {0xb7e10000}, {0xb7e18000}, {0xb7e20000}, {0xb7e28000}, {0xb7e30000}, {0xb7e38000}, {0xb7e40000}, {0xb7e48000}, {0xb7e50000}, {0xb7e58000}, {0xb7e60000}, {0xb7e68000}, {0xb7e70000}, {0xb7e78000}, {0xb7e80000}, {0xb7e88000}, {0xb7e90000}, {0xb7e98000}, {0xb7ea0000}, {0xb7ea8000}, {0xb7eb0000}, {0xb7eb8000}, {0xb7ec0000}, {0xb7ec8000}, {0xb7ed0000}, {0xb7ed8000}, {0xb7ee0000}, {0xb7ee8000}, {0xb7ef0000}, {0xb7ef8000}, {0xb7f00000}, {0xb7f08000}, {0xb7f10000}, {0xb7f18000}, {0xb7f20000}, {0xb7f28000}, {0xb7f30000}, {0xb7f38000}, {0xb7f40000}, {0xb7f48000}, {0xb7f50000}, {0xb7f58000}, {0xb7f60000}, {0xb7f68000}, {0xb7f70000}, {0xb7f78000}, {0xb7f80000}, {0xb7f88000}, {0xb7f90000}, {0xb7f98000}, {0xb7fa0000}, {0xb7fa8000}, {0xb7fb0000}, {0xb7fb8000}, {0xb7fc0000}, {0xb7fc8000}, {0xb7fd0000}, {0xb7fd8000}, {0xb7fe0000}, {0xb7fe8000}, {0xb7ff0000}, {0xb7ff8000}, {0xb8000000}, {0xb8004000}, {0xb8008000}, {0xb800c000}, {0xb8010000}, {0xb8014000}, {0xb8018000}, {0xb801c000}, {0xb8020000}, {0xb8024000}, {0xb8028000}, {0xb802c000}, {0xb8030000}, {0xb8034000}, {0xb8038000}, {0xb803c000}, {0xb8040000}, {0xb8044000}, {0xb8048000}, {0xb804c000}, {0xb8050000}, {0xb8054000}, {0xb8058000}, {0xb805c000}, {0xb8060000}, {0xb8064000}, {0xb8068000}, {0xb806c000}, {0xb8070000}, {0xb8074000}, {0xb8078000}, {0xb807c000}, {0xb8080000}, {0xb8084000}, {0xb8088000}, {0xb808c000}, {0xb8090000}, {0xb8094000}, {0xb8098000}, {0xb809c000}, {0xb80a0000}, {0xb80a4000}, {0xb80a8000}, {0xb80ac000}, {0xb80b0000}, {0xb80b4000}, {0xb80b8000}, {0xb80bc000}, {0xb80c0000}, {0xb80c4000}, {0xb80c8000}, {0xb80cc000}, {0xb80d0000}, {0xb80d4000}, {0xb80d8000}, {0xb80dc000}, {0xb80e0000}, {0xb80e4000}, {0xb80e8000}, {0xb80ec000}, {0xb80f0000}, {0xb80f4000}, {0xb80f8000}, {0xb80fc000}, {0xb8100000}, {0xb8104000}, {0xb8108000}, {0xb810c000}, {0xb8110000}, {0xb8114000}, {0xb8118000}, {0xb811c000}, {0xb8120000}, {0xb8124000}, {0xb8128000}, {0xb812c000}, {0xb8130000}, {0xb8134000}, {0xb8138000}, {0xb813c000}, {0xb8140000}, {0xb8144000}, {0xb8148000}, {0xb814c000}, {0xb8150000}, {0xb8154000}, {0xb8158000}, {0xb815c000}, {0xb8160000}, {0xb8164000}, {0xb8168000}, {0xb816c000}, {0xb8170000}, {0xb8174000}, {0xb8178000}, {0xb817c000}, {0xb8180000}, {0xb8184000}, {0xb8188000}, {0xb818c000}, {0xb8190000}, {0xb8194000}, {0xb8198000}, {0xb819c000}, {0xb81a0000}, {0xb81a4000}, {0xb81a8000}, {0xb81ac000}, {0xb81b0000}, {0xb81b4000}, {0xb81b8000}, {0xb81bc000}, {0xb81c0000}, {0xb81c4000}, {0xb81c8000}, {0xb81cc000}, {0xb81d0000}, {0xb81d4000}, {0xb81d8000}, {0xb81dc000}, {0xb81e0000}, {0xb81e4000}, {0xb81e8000}, {0xb81ec000}, {0xb81f0000}, {0xb81f4000}, {0xb81f8000}, {0xb81fc000}, {0xb8200000}, {0xb8204000}, {0xb8208000}, {0xb820c000}, {0xb8210000}, {0xb8214000}, {0xb8218000}, {0xb821c000}, {0xb8220000}, {0xb8224000}, {0xb8228000}, {0xb822c000}, {0xb8230000}, {0xb8234000}, {0xb8238000}, {0xb823c000}, {0xb8240000}, {0xb8244000}, {0xb8248000}, {0xb824c000}, {0xb8250000}, {0xb8254000}, {0xb8258000}, {0xb825c000}, {0xb8260000}, {0xb8264000}, {0xb8268000}, {0xb826c000}, {0xb8270000}, {0xb8274000}, {0xb8278000}, {0xb827c000}, {0xb8280000}, {0xb8284000}, {0xb8288000}, {0xb828c000}, {0xb8290000}, {0xb8294000}, {0xb8298000}, {0xb829c000}, {0xb82a0000}, {0xb82a4000}, {0xb82a8000}, {0xb82ac000}, {0xb82b0000}, {0xb82b4000}, {0xb82b8000}, {0xb82bc000}, {0xb82c0000}, {0xb82c4000}, {0xb82c8000}, {0xb82cc000}, {0xb82d0000}, {0xb82d4000}, {0xb82d8000}, {0xb82dc000}, {0xb82e0000}, {0xb82e4000}, {0xb82e8000}, {0xb82ec000}, {0xb82f0000}, {0xb82f4000}, {0xb82f8000}, {0xb82fc000}, {0xb8300000}, {0xb8304000}, {0xb8308000}, {0xb830c000}, {0xb8310000}, {0xb8314000}, {0xb8318000}, {0xb831c000}, {0xb8320000}, {0xb8324000}, {0xb8328000}, {0xb832c000}, {0xb8330000}, {0xb8334000}, {0xb8338000}, {0xb833c000}, {0xb8340000}, {0xb8344000}, {0xb8348000}, {0xb834c000}, {0xb8350000}, {0xb8354000}, {0xb8358000}, {0xb835c000}, {0xb8360000}, {0xb8364000}, {0xb8368000}, {0xb836c000}, {0xb8370000}, {0xb8374000}, {0xb8378000}, {0xb837c000}, {0xb8380000}, {0xb8384000}, {0xb8388000}, {0xb838c000}, {0xb8390000}, {0xb8394000}, {0xb8398000}, {0xb839c000}, {0xb83a0000}, {0xb83a4000}, {0xb83a8000}, {0xb83ac000}, {0xb83b0000}, {0xb83b4000}, {0xb83b8000}, {0xb83bc000}, {0xb83c0000}, {0xb83c4000}, {0xb83c8000}, {0xb83cc000}, {0xb83d0000}, {0xb83d4000}, {0xb83d8000}, {0xb83dc000}, {0xb83e0000}, {0xb83e4000}, {0xb83e8000}, {0xb83ec000}, {0xb83f0000}, {0xb83f4000}, {0xb83f8000}, {0xb83fc000}, {0xb8400000}, {0xb8404000}, {0xb8408000}, {0xb840c000}, {0xb8410000}, {0xb8414000}, {0xb8418000}, {0xb841c000}, {0xb8420000}, {0xb8424000}, {0xb8428000}, {0xb842c000}, {0xb8430000}, {0xb8434000}, {0xb8438000}, {0xb843c000}, {0xb8440000}, {0xb8444000}, {0xb8448000}, {0xb844c000}, {0xb8450000}, {0xb8454000}, {0xb8458000}, {0xb845c000}, {0xb8460000}, {0xb8464000}, {0xb8468000}, {0xb846c000}, {0xb8470000}, {0xb8474000}, {0xb8478000}, {0xb847c000}, {0xb8480000}, {0xb8484000}, {0xb8488000}, {0xb848c000}, {0xb8490000}, {0xb8494000}, {0xb8498000}, {0xb849c000}, {0xb84a0000}, {0xb84a4000}, {0xb84a8000}, {0xb84ac000}, {0xb84b0000}, {0xb84b4000}, {0xb84b8000}, {0xb84bc000}, {0xb84c0000}, {0xb84c4000}, {0xb84c8000}, {0xb84cc000}, {0xb84d0000}, {0xb84d4000}, {0xb84d8000}, {0xb84dc000}, {0xb84e0000}, {0xb84e4000}, {0xb84e8000}, {0xb84ec000}, {0xb84f0000}, {0xb84f4000}, {0xb84f8000}, {0xb84fc000}, {0xb8500000}, {0xb8504000}, {0xb8508000}, {0xb850c000}, {0xb8510000}, {0xb8514000}, {0xb8518000}, {0xb851c000}, {0xb8520000}, {0xb8524000}, {0xb8528000}, {0xb852c000}, {0xb8530000}, {0xb8534000}, {0xb8538000}, {0xb853c000}, {0xb8540000}, {0xb8544000}, {0xb8548000}, {0xb854c000}, {0xb8550000}, {0xb8554000}, {0xb8558000}, {0xb855c000}, {0xb8560000}, {0xb8564000}, {0xb8568000}, {0xb856c000}, {0xb8570000}, {0xb8574000}, {0xb8578000}, {0xb857c000}, {0xb8580000}, {0xb8584000}, {0xb8588000}, {0xb858c000}, {0xb8590000}, {0xb8594000}, {0xb8598000}, {0xb859c000}, {0xb85a0000}, {0xb85a4000}, {0xb85a8000}, {0xb85ac000}, {0xb85b0000}, {0xb85b4000}, {0xb85b8000}, {0xb85bc000}, {0xb85c0000}, {0xb85c4000}, {0xb85c8000}, {0xb85cc000}, {0xb85d0000}, {0xb85d4000}, {0xb85d8000}, {0xb85dc000}, {0xb85e0000}, {0xb85e4000}, {0xb85e8000}, {0xb85ec000}, {0xb85f0000}, {0xb85f4000}, {0xb85f8000}, {0xb85fc000}, {0xb8600000}, {0xb8604000}, {0xb8608000}, {0xb860c000}, {0xb8610000}, {0xb8614000}, {0xb8618000}, {0xb861c000}, {0xb8620000}, {0xb8624000}, {0xb8628000}, {0xb862c000}, {0xb8630000}, {0xb8634000}, {0xb8638000}, {0xb863c000}, {0xb8640000}, {0xb8644000}, {0xb8648000}, {0xb864c000}, {0xb8650000}, {0xb8654000}, {0xb8658000}, {0xb865c000}, {0xb8660000}, {0xb8664000}, {0xb8668000}, {0xb866c000}, {0xb8670000}, {0xb8674000}, {0xb8678000}, {0xb867c000}, {0xb8680000}, {0xb8684000}, {0xb8688000}, {0xb868c000}, {0xb8690000}, {0xb8694000}, {0xb8698000}, {0xb869c000}, {0xb86a0000}, {0xb86a4000}, {0xb86a8000}, {0xb86ac000}, {0xb86b0000}, {0xb86b4000}, {0xb86b8000}, {0xb86bc000}, {0xb86c0000}, {0xb86c4000}, {0xb86c8000}, {0xb86cc000}, {0xb86d0000}, {0xb86d4000}, {0xb86d8000}, {0xb86dc000}, {0xb86e0000}, {0xb86e4000}, {0xb86e8000}, {0xb86ec000}, {0xb86f0000}, {0xb86f4000}, {0xb86f8000}, {0xb86fc000}, {0xb8700000}, {0xb8704000}, {0xb8708000}, {0xb870c000}, {0xb8710000}, {0xb8714000}, {0xb8718000}, {0xb871c000}, {0xb8720000}, {0xb8724000}, {0xb8728000}, {0xb872c000}, {0xb8730000}, {0xb8734000}, {0xb8738000}, {0xb873c000}, {0xb8740000}, {0xb8744000}, {0xb8748000}, {0xb874c000}, {0xb8750000}, {0xb8754000}, {0xb8758000}, {0xb875c000}, {0xb8760000}, {0xb8764000}, {0xb8768000}, {0xb876c000}, {0xb8770000}, {0xb8774000}, {0xb8778000}, {0xb877c000}, {0xb8780000}, {0xb8784000}, {0xb8788000}, {0xb878c000}, {0xb8790000}, {0xb8794000}, {0xb8798000}, {0xb879c000}, {0xb87a0000}, {0xb87a4000}, {0xb87a8000}, {0xb87ac000}, {0xb87b0000}, {0xb87b4000}, {0xb87b8000}, {0xb87bc000}, {0xb87c0000}, {0xb87c4000}, {0xb87c8000}, {0xb87cc000}, {0xb87d0000}, {0xb87d4000}, {0xb87d8000}, {0xb87dc000}, {0xb87e0000}, {0xb87e4000}, {0xb87e8000}, {0xb87ec000}, {0xb87f0000}, {0xb87f4000}, {0xb87f8000}, {0xb87fc000}, {0xb8800000}, {0xb8802000}, {0xb8804000}, {0xb8806000}, {0xb8808000}, {0xb880a000}, {0xb880c000}, {0xb880e000}, {0xb8810000}, {0xb8812000}, {0xb8814000}, {0xb8816000}, {0xb8818000}, {0xb881a000}, {0xb881c000}, {0xb881e000}, {0xb8820000}, {0xb8822000}, {0xb8824000}, {0xb8826000}, {0xb8828000}, {0xb882a000}, {0xb882c000}, {0xb882e000}, {0xb8830000}, {0xb8832000}, {0xb8834000}, {0xb8836000}, {0xb8838000}, {0xb883a000}, {0xb883c000}, {0xb883e000}, {0xb8840000}, {0xb8842000}, {0xb8844000}, {0xb8846000}, {0xb8848000}, {0xb884a000}, {0xb884c000}, {0xb884e000}, {0xb8850000}, {0xb8852000}, {0xb8854000}, {0xb8856000}, {0xb8858000}, {0xb885a000}, {0xb885c000}, {0xb885e000}, {0xb8860000}, {0xb8862000}, {0xb8864000}, {0xb8866000}, {0xb8868000}, {0xb886a000}, {0xb886c000}, {0xb886e000}, {0xb8870000}, {0xb8872000}, {0xb8874000}, {0xb8876000}, {0xb8878000}, {0xb887a000}, {0xb887c000}, {0xb887e000}, {0xb8880000}, {0xb8882000}, {0xb8884000}, {0xb8886000}, {0xb8888000}, {0xb888a000}, {0xb888c000}, {0xb888e000}, {0xb8890000}, {0xb8892000}, {0xb8894000}, {0xb8896000}, {0xb8898000}, {0xb889a000}, {0xb889c000}, {0xb889e000}, {0xb88a0000}, {0xb88a2000}, {0xb88a4000}, {0xb88a6000}, {0xb88a8000}, {0xb88aa000}, {0xb88ac000}, {0xb88ae000}, {0xb88b0000}, {0xb88b2000}, {0xb88b4000}, {0xb88b6000}, {0xb88b8000}, {0xb88ba000}, {0xb88bc000}, {0xb88be000}, {0xb88c0000}, {0xb88c2000}, {0xb88c4000}, {0xb88c6000}, {0xb88c8000}, {0xb88ca000}, {0xb88cc000}, {0xb88ce000}, {0xb88d0000}, {0xb88d2000}, {0xb88d4000}, {0xb88d6000}, {0xb88d8000}, {0xb88da000}, {0xb88dc000}, {0xb88de000}, {0xb88e0000}, {0xb88e2000}, {0xb88e4000}, {0xb88e6000}, {0xb88e8000}, {0xb88ea000}, {0xb88ec000}, {0xb88ee000}, {0xb88f0000}, {0xb88f2000}, {0xb88f4000}, {0xb88f6000}, {0xb88f8000}, {0xb88fa000}, {0xb88fc000}, {0xb88fe000}, {0xb8900000}, {0xb8902000}, {0xb8904000}, {0xb8906000}, {0xb8908000}, {0xb890a000}, {0xb890c000}, {0xb890e000}, {0xb8910000}, {0xb8912000}, {0xb8914000}, {0xb8916000}, {0xb8918000}, {0xb891a000}, {0xb891c000}, {0xb891e000}, {0xb8920000}, {0xb8922000}, {0xb8924000}, {0xb8926000}, {0xb8928000}, {0xb892a000}, {0xb892c000}, {0xb892e000}, {0xb8930000}, {0xb8932000}, {0xb8934000}, {0xb8936000}, {0xb8938000}, {0xb893a000}, {0xb893c000}, {0xb893e000}, {0xb8940000}, {0xb8942000}, {0xb8944000}, {0xb8946000}, {0xb8948000}, {0xb894a000}, {0xb894c000}, {0xb894e000}, {0xb8950000}, {0xb8952000}, {0xb8954000}, {0xb8956000}, {0xb8958000}, {0xb895a000}, {0xb895c000}, {0xb895e000}, {0xb8960000}, {0xb8962000}, {0xb8964000}, {0xb8966000}, {0xb8968000}, {0xb896a000}, {0xb896c000}, {0xb896e000}, {0xb8970000}, {0xb8972000}, {0xb8974000}, {0xb8976000}, {0xb8978000}, {0xb897a000}, {0xb897c000}, {0xb897e000}, {0xb8980000}, {0xb8982000}, {0xb8984000}, {0xb8986000}, {0xb8988000}, {0xb898a000}, {0xb898c000}, {0xb898e000}, {0xb8990000}, {0xb8992000}, {0xb8994000}, {0xb8996000}, {0xb8998000}, {0xb899a000}, {0xb899c000}, {0xb899e000}, {0xb89a0000}, {0xb89a2000}, {0xb89a4000}, {0xb89a6000}, {0xb89a8000}, {0xb89aa000}, {0xb89ac000}, {0xb89ae000}, {0xb89b0000}, {0xb89b2000}, {0xb89b4000}, {0xb89b6000}, {0xb89b8000}, {0xb89ba000}, {0xb89bc000}, {0xb89be000}, {0xb89c0000}, {0xb89c2000}, {0xb89c4000}, {0xb89c6000}, {0xb89c8000}, {0xb89ca000}, {0xb89cc000}, {0xb89ce000}, {0xb89d0000}, {0xb89d2000}, {0xb89d4000}, {0xb89d6000}, {0xb89d8000}, {0xb89da000}, {0xb89dc000}, {0xb89de000}, {0xb89e0000}, {0xb89e2000}, {0xb89e4000}, {0xb89e6000}, {0xb89e8000}, {0xb89ea000}, {0xb89ec000}, {0xb89ee000}, {0xb89f0000}, {0xb89f2000}, {0xb89f4000}, {0xb89f6000}, {0xb89f8000}, {0xb89fa000}, {0xb89fc000}, {0xb89fe000}, {0xb8a00000}, {0xb8a02000}, {0xb8a04000}, {0xb8a06000}, {0xb8a08000}, {0xb8a0a000}, {0xb8a0c000}, {0xb8a0e000}, {0xb8a10000}, {0xb8a12000}, {0xb8a14000}, {0xb8a16000}, {0xb8a18000}, {0xb8a1a000}, {0xb8a1c000}, {0xb8a1e000}, {0xb8a20000}, {0xb8a22000}, {0xb8a24000}, {0xb8a26000}, {0xb8a28000}, {0xb8a2a000}, {0xb8a2c000}, {0xb8a2e000}, {0xb8a30000}, {0xb8a32000}, {0xb8a34000}, {0xb8a36000}, {0xb8a38000}, {0xb8a3a000}, {0xb8a3c000}, {0xb8a3e000}, {0xb8a40000}, {0xb8a42000}, {0xb8a44000}, {0xb8a46000}, {0xb8a48000}, {0xb8a4a000}, {0xb8a4c000}, {0xb8a4e000}, {0xb8a50000}, {0xb8a52000}, {0xb8a54000}, {0xb8a56000}, {0xb8a58000}, {0xb8a5a000}, {0xb8a5c000}, {0xb8a5e000}, {0xb8a60000}, {0xb8a62000}, {0xb8a64000}, {0xb8a66000}, {0xb8a68000}, {0xb8a6a000}, {0xb8a6c000}, {0xb8a6e000}, {0xb8a70000}, {0xb8a72000}, {0xb8a74000}, {0xb8a76000}, {0xb8a78000}, {0xb8a7a000}, {0xb8a7c000}, {0xb8a7e000}, {0xb8a80000}, {0xb8a82000}, {0xb8a84000}, {0xb8a86000}, {0xb8a88000}, {0xb8a8a000}, {0xb8a8c000}, {0xb8a8e000}, {0xb8a90000}, {0xb8a92000}, {0xb8a94000}, {0xb8a96000}, {0xb8a98000}, {0xb8a9a000}, {0xb8a9c000}, {0xb8a9e000}, {0xb8aa0000}, {0xb8aa2000}, {0xb8aa4000}, {0xb8aa6000}, {0xb8aa8000}, {0xb8aaa000}, {0xb8aac000}, {0xb8aae000}, {0xb8ab0000}, {0xb8ab2000}, {0xb8ab4000}, {0xb8ab6000}, {0xb8ab8000}, {0xb8aba000}, {0xb8abc000}, {0xb8abe000}, {0xb8ac0000}, {0xb8ac2000}, {0xb8ac4000}, {0xb8ac6000}, {0xb8ac8000}, {0xb8aca000}, {0xb8acc000}, {0xb8ace000}, {0xb8ad0000}, {0xb8ad2000}, {0xb8ad4000}, {0xb8ad6000}, {0xb8ad8000}, {0xb8ada000}, {0xb8adc000}, {0xb8ade000}, {0xb8ae0000}, {0xb8ae2000}, {0xb8ae4000}, {0xb8ae6000}, {0xb8ae8000}, {0xb8aea000}, {0xb8aec000}, {0xb8aee000}, {0xb8af0000}, {0xb8af2000}, {0xb8af4000}, {0xb8af6000}, {0xb8af8000}, {0xb8afa000}, {0xb8afc000}, {0xb8afe000}, {0xb8b00000}, {0xb8b02000}, {0xb8b04000}, {0xb8b06000}, {0xb8b08000}, {0xb8b0a000}, {0xb8b0c000}, {0xb8b0e000}, {0xb8b10000}, {0xb8b12000}, {0xb8b14000}, {0xb8b16000}, {0xb8b18000}, {0xb8b1a000}, {0xb8b1c000}, {0xb8b1e000}, {0xb8b20000}, {0xb8b22000}, {0xb8b24000}, {0xb8b26000}, {0xb8b28000}, {0xb8b2a000}, {0xb8b2c000}, {0xb8b2e000}, {0xb8b30000}, {0xb8b32000}, {0xb8b34000}, {0xb8b36000}, {0xb8b38000}, {0xb8b3a000}, {0xb8b3c000}, {0xb8b3e000}, {0xb8b40000}, {0xb8b42000}, {0xb8b44000}, {0xb8b46000}, {0xb8b48000}, {0xb8b4a000}, {0xb8b4c000}, {0xb8b4e000}, {0xb8b50000}, {0xb8b52000}, {0xb8b54000}, {0xb8b56000}, {0xb8b58000}, {0xb8b5a000}, {0xb8b5c000}, {0xb8b5e000}, {0xb8b60000}, {0xb8b62000}, {0xb8b64000}, {0xb8b66000}, {0xb8b68000}, {0xb8b6a000}, {0xb8b6c000}, {0xb8b6e000}, {0xb8b70000}, {0xb8b72000}, {0xb8b74000}, {0xb8b76000}, {0xb8b78000}, {0xb8b7a000}, {0xb8b7c000}, {0xb8b7e000}, {0xb8b80000}, {0xb8b82000}, {0xb8b84000}, {0xb8b86000}, {0xb8b88000}, {0xb8b8a000}, {0xb8b8c000}, {0xb8b8e000}, {0xb8b90000}, {0xb8b92000}, {0xb8b94000}, {0xb8b96000}, {0xb8b98000}, {0xb8b9a000}, {0xb8b9c000}, {0xb8b9e000}, {0xb8ba0000}, {0xb8ba2000}, {0xb8ba4000}, {0xb8ba6000}, {0xb8ba8000}, {0xb8baa000}, {0xb8bac000}, {0xb8bae000}, {0xb8bb0000}, {0xb8bb2000}, {0xb8bb4000}, {0xb8bb6000}, {0xb8bb8000}, {0xb8bba000}, {0xb8bbc000}, {0xb8bbe000}, {0xb8bc0000}, {0xb8bc2000}, {0xb8bc4000}, {0xb8bc6000}, {0xb8bc8000}, {0xb8bca000}, {0xb8bcc000}, {0xb8bce000}, {0xb8bd0000}, {0xb8bd2000}, {0xb8bd4000}, {0xb8bd6000}, {0xb8bd8000}, {0xb8bda000}, {0xb8bdc000}, {0xb8bde000}, {0xb8be0000}, {0xb8be2000}, {0xb8be4000}, {0xb8be6000}, {0xb8be8000}, {0xb8bea000}, {0xb8bec000}, {0xb8bee000}, {0xb8bf0000}, {0xb8bf2000}, {0xb8bf4000}, {0xb8bf6000}, {0xb8bf8000}, {0xb8bfa000}, {0xb8bfc000}, {0xb8bfe000}, {0xb8c00000}, {0xb8c02000}, {0xb8c04000}, {0xb8c06000}, {0xb8c08000}, {0xb8c0a000}, {0xb8c0c000}, {0xb8c0e000}, {0xb8c10000}, {0xb8c12000}, {0xb8c14000}, {0xb8c16000}, {0xb8c18000}, {0xb8c1a000}, {0xb8c1c000}, {0xb8c1e000}, {0xb8c20000}, {0xb8c22000}, {0xb8c24000}, {0xb8c26000}, {0xb8c28000}, {0xb8c2a000}, {0xb8c2c000}, {0xb8c2e000}, {0xb8c30000}, {0xb8c32000}, {0xb8c34000}, {0xb8c36000}, {0xb8c38000}, {0xb8c3a000}, {0xb8c3c000}, {0xb8c3e000}, {0xb8c40000}, {0xb8c42000}, {0xb8c44000}, {0xb8c46000}, {0xb8c48000}, {0xb8c4a000}, {0xb8c4c000}, {0xb8c4e000}, {0xb8c50000}, {0xb8c52000}, {0xb8c54000}, {0xb8c56000}, {0xb8c58000}, {0xb8c5a000}, {0xb8c5c000}, {0xb8c5e000}, {0xb8c60000}, {0xb8c62000}, {0xb8c64000}, {0xb8c66000}, {0xb8c68000}, {0xb8c6a000}, {0xb8c6c000}, {0xb8c6e000}, {0xb8c70000}, {0xb8c72000}, {0xb8c74000}, {0xb8c76000}, {0xb8c78000}, {0xb8c7a000}, {0xb8c7c000}, {0xb8c7e000}, {0xb8c80000}, {0xb8c82000}, {0xb8c84000}, {0xb8c86000}, {0xb8c88000}, {0xb8c8a000}, {0xb8c8c000}, {0xb8c8e000}, {0xb8c90000}, {0xb8c92000}, {0xb8c94000}, {0xb8c96000}, {0xb8c98000}, {0xb8c9a000}, {0xb8c9c000}, {0xb8c9e000}, {0xb8ca0000}, {0xb8ca2000}, {0xb8ca4000}, {0xb8ca6000}, {0xb8ca8000}, {0xb8caa000}, {0xb8cac000}, {0xb8cae000}, {0xb8cb0000}, {0xb8cb2000}, {0xb8cb4000}, {0xb8cb6000}, {0xb8cb8000}, {0xb8cba000}, {0xb8cbc000}, {0xb8cbe000}, {0xb8cc0000}, {0xb8cc2000}, {0xb8cc4000}, {0xb8cc6000}, {0xb8cc8000}, {0xb8cca000}, {0xb8ccc000}, {0xb8cce000}, {0xb8cd0000}, {0xb8cd2000}, {0xb8cd4000}, {0xb8cd6000}, {0xb8cd8000}, {0xb8cda000}, {0xb8cdc000}, {0xb8cde000}, {0xb8ce0000}, {0xb8ce2000}, {0xb8ce4000}, {0xb8ce6000}, {0xb8ce8000}, {0xb8cea000}, {0xb8cec000}, {0xb8cee000}, {0xb8cf0000}, {0xb8cf2000}, {0xb8cf4000}, {0xb8cf6000}, {0xb8cf8000}, {0xb8cfa000}, {0xb8cfc000}, {0xb8cfe000}, {0xb8d00000}, {0xb8d02000}, {0xb8d04000}, {0xb8d06000}, {0xb8d08000}, {0xb8d0a000}, {0xb8d0c000}, {0xb8d0e000}, {0xb8d10000}, {0xb8d12000}, {0xb8d14000}, {0xb8d16000}, {0xb8d18000}, {0xb8d1a000}, {0xb8d1c000}, {0xb8d1e000}, {0xb8d20000}, {0xb8d22000}, {0xb8d24000}, {0xb8d26000}, {0xb8d28000}, {0xb8d2a000}, {0xb8d2c000}, {0xb8d2e000}, {0xb8d30000}, {0xb8d32000}, {0xb8d34000}, {0xb8d36000}, {0xb8d38000}, {0xb8d3a000}, {0xb8d3c000}, {0xb8d3e000}, {0xb8d40000}, {0xb8d42000}, {0xb8d44000}, {0xb8d46000}, {0xb8d48000}, {0xb8d4a000}, {0xb8d4c000}, {0xb8d4e000}, {0xb8d50000}, {0xb8d52000}, {0xb8d54000}, {0xb8d56000}, {0xb8d58000}, {0xb8d5a000}, {0xb8d5c000}, {0xb8d5e000}, {0xb8d60000}, {0xb8d62000}, {0xb8d64000}, {0xb8d66000}, {0xb8d68000}, {0xb8d6a000}, {0xb8d6c000}, {0xb8d6e000}, {0xb8d70000}, {0xb8d72000}, {0xb8d74000}, {0xb8d76000}, {0xb8d78000}, {0xb8d7a000}, {0xb8d7c000}, {0xb8d7e000}, {0xb8d80000}, {0xb8d82000}, {0xb8d84000}, {0xb8d86000}, {0xb8d88000}, {0xb8d8a000}, {0xb8d8c000}, {0xb8d8e000}, {0xb8d90000}, {0xb8d92000}, {0xb8d94000}, {0xb8d96000}, {0xb8d98000}, {0xb8d9a000}, {0xb8d9c000}, {0xb8d9e000}, {0xb8da0000}, {0xb8da2000}, {0xb8da4000}, {0xb8da6000}, {0xb8da8000}, {0xb8daa000}, {0xb8dac000}, {0xb8dae000}, {0xb8db0000}, {0xb8db2000}, {0xb8db4000}, {0xb8db6000}, {0xb8db8000}, {0xb8dba000}, {0xb8dbc000}, {0xb8dbe000}, {0xb8dc0000}, {0xb8dc2000}, {0xb8dc4000}, {0xb8dc6000}, {0xb8dc8000}, {0xb8dca000}, {0xb8dcc000}, {0xb8dce000}, {0xb8dd0000}, {0xb8dd2000}, {0xb8dd4000}, {0xb8dd6000}, {0xb8dd8000}, {0xb8dda000}, {0xb8ddc000}, {0xb8dde000}, {0xb8de0000}, {0xb8de2000}, {0xb8de4000}, {0xb8de6000}, {0xb8de8000}, {0xb8dea000}, {0xb8dec000}, {0xb8dee000}, {0xb8df0000}, {0xb8df2000}, {0xb8df4000}, {0xb8df6000}, {0xb8df8000}, {0xb8dfa000}, {0xb8dfc000}, {0xb8dfe000}, {0xb8e00000}, {0xb8e02000}, {0xb8e04000}, {0xb8e06000}, {0xb8e08000}, {0xb8e0a000}, {0xb8e0c000}, {0xb8e0e000}, {0xb8e10000}, {0xb8e12000}, {0xb8e14000}, {0xb8e16000}, {0xb8e18000}, {0xb8e1a000}, {0xb8e1c000}, {0xb8e1e000}, {0xb8e20000}, {0xb8e22000}, {0xb8e24000}, {0xb8e26000}, {0xb8e28000}, {0xb8e2a000}, {0xb8e2c000}, {0xb8e2e000}, {0xb8e30000}, {0xb8e32000}, {0xb8e34000}, {0xb8e36000}, {0xb8e38000}, {0xb8e3a000}, {0xb8e3c000}, {0xb8e3e000}, {0xb8e40000}, {0xb8e42000}, {0xb8e44000}, {0xb8e46000}, {0xb8e48000}, {0xb8e4a000}, {0xb8e4c000}, {0xb8e4e000}, {0xb8e50000}, {0xb8e52000}, {0xb8e54000}, {0xb8e56000}, {0xb8e58000}, {0xb8e5a000}, {0xb8e5c000}, {0xb8e5e000}, {0xb8e60000}, {0xb8e62000}, {0xb8e64000}, {0xb8e66000}, {0xb8e68000}, {0xb8e6a000}, {0xb8e6c000}, {0xb8e6e000}, {0xb8e70000}, {0xb8e72000}, {0xb8e74000}, {0xb8e76000}, {0xb8e78000}, {0xb8e7a000}, {0xb8e7c000}, {0xb8e7e000}, {0xb8e80000}, {0xb8e82000}, {0xb8e84000}, {0xb8e86000}, {0xb8e88000}, {0xb8e8a000}, {0xb8e8c000}, {0xb8e8e000}, {0xb8e90000}, {0xb8e92000}, {0xb8e94000}, {0xb8e96000}, {0xb8e98000}, {0xb8e9a000}, {0xb8e9c000}, {0xb8e9e000}, {0xb8ea0000}, {0xb8ea2000}, {0xb8ea4000}, {0xb8ea6000}, {0xb8ea8000}, {0xb8eaa000}, {0xb8eac000}, {0xb8eae000}, {0xb8eb0000}, {0xb8eb2000}, {0xb8eb4000}, {0xb8eb6000}, {0xb8eb8000}, {0xb8eba000}, {0xb8ebc000}, {0xb8ebe000}, {0xb8ec0000}, {0xb8ec2000}, {0xb8ec4000}, {0xb8ec6000}, {0xb8ec8000}, {0xb8eca000}, {0xb8ecc000}, {0xb8ece000}, {0xb8ed0000}, {0xb8ed2000}, {0xb8ed4000}, {0xb8ed6000}, {0xb8ed8000}, {0xb8eda000}, {0xb8edc000}, {0xb8ede000}, {0xb8ee0000}, {0xb8ee2000}, {0xb8ee4000}, {0xb8ee6000}, {0xb8ee8000}, {0xb8eea000}, {0xb8eec000}, {0xb8eee000}, {0xb8ef0000}, {0xb8ef2000}, {0xb8ef4000}, {0xb8ef6000}, {0xb8ef8000}, {0xb8efa000}, {0xb8efc000}, {0xb8efe000}, {0xb8f00000}, {0xb8f02000}, {0xb8f04000}, {0xb8f06000}, {0xb8f08000}, {0xb8f0a000}, {0xb8f0c000}, {0xb8f0e000}, {0xb8f10000}, {0xb8f12000}, {0xb8f14000}, {0xb8f16000}, {0xb8f18000}, {0xb8f1a000}, {0xb8f1c000}, {0xb8f1e000}, {0xb8f20000}, {0xb8f22000}, {0xb8f24000}, {0xb8f26000}, {0xb8f28000}, {0xb8f2a000}, {0xb8f2c000}, {0xb8f2e000}, {0xb8f30000}, {0xb8f32000}, {0xb8f34000}, {0xb8f36000}, {0xb8f38000}, {0xb8f3a000}, {0xb8f3c000}, {0xb8f3e000}, {0xb8f40000}, {0xb8f42000}, {0xb8f44000}, {0xb8f46000}, {0xb8f48000}, {0xb8f4a000}, {0xb8f4c000}, {0xb8f4e000}, {0xb8f50000}, {0xb8f52000}, {0xb8f54000}, {0xb8f56000}, {0xb8f58000}, {0xb8f5a000}, {0xb8f5c000}, {0xb8f5e000}, {0xb8f60000}, {0xb8f62000}, {0xb8f64000}, {0xb8f66000}, {0xb8f68000}, {0xb8f6a000}, {0xb8f6c000}, {0xb8f6e000}, {0xb8f70000}, {0xb8f72000}, {0xb8f74000}, {0xb8f76000}, {0xb8f78000}, {0xb8f7a000}, {0xb8f7c000}, {0xb8f7e000}, {0xb8f80000}, {0xb8f82000}, {0xb8f84000}, {0xb8f86000}, {0xb8f88000}, {0xb8f8a000}, {0xb8f8c000}, {0xb8f8e000}, {0xb8f90000}, {0xb8f92000}, {0xb8f94000}, {0xb8f96000}, {0xb8f98000}, {0xb8f9a000}, {0xb8f9c000}, {0xb8f9e000}, {0xb8fa0000}, {0xb8fa2000}, {0xb8fa4000}, {0xb8fa6000}, {0xb8fa8000}, {0xb8faa000}, {0xb8fac000}, {0xb8fae000}, {0xb8fb0000}, {0xb8fb2000}, {0xb8fb4000}, {0xb8fb6000}, {0xb8fb8000}, {0xb8fba000}, {0xb8fbc000}, {0xb8fbe000}, {0xb8fc0000}, {0xb8fc2000}, {0xb8fc4000}, {0xb8fc6000}, {0xb8fc8000}, {0xb8fca000}, {0xb8fcc000}, {0xb8fce000}, {0xb8fd0000}, {0xb8fd2000}, {0xb8fd4000}, {0xb8fd6000}, {0xb8fd8000}, {0xb8fda000}, {0xb8fdc000}, {0xb8fde000}, {0xb8fe0000}, {0xb8fe2000}, {0xb8fe4000}, {0xb8fe6000}, {0xb8fe8000}, {0xb8fea000}, {0xb8fec000}, {0xb8fee000}, {0xb8ff0000}, {0xb8ff2000}, {0xb8ff4000}, {0xb8ff6000}, {0xb8ff8000}, {0xb8ffa000}, {0xb8ffc000}, {0xb8ffe000}, {0xb9000000}, {0xb9002000}, {0xb9004000}, {0xb9006000}, {0xb9008000}, {0xb900a000}, {0xb900c000}, {0xb900e000}, {0xb9010000}, {0xb9012000}, {0xb9014000}, {0xb9016000}, {0xb9018000}, {0xb901a000}, {0xb901c000}, {0xb901e000}, {0xb9020000}, {0xb9022000}, {0xb9024000}, {0xb9026000}, {0xb9028000}, {0xb902a000}, {0xb902c000}, {0xb902e000}, {0xb9030000}, {0xb9032000}, {0xb9034000}, {0xb9036000}, {0xb9038000}, {0xb903a000}, {0xb903c000}, {0xb903e000}, {0xb9040000}, {0xb9042000}, {0xb9044000}, {0xb9046000}, {0xb9048000}, {0xb904a000}, {0xb904c000}, {0xb904e000}, {0xb9050000}, {0xb9052000}, {0xb9054000}, {0xb9056000}, {0xb9058000}, {0xb905a000}, {0xb905c000}, {0xb905e000}, {0xb9060000}, {0xb9062000}, {0xb9064000}, {0xb9066000}, {0xb9068000}, {0xb906a000}, {0xb906c000}, {0xb906e000}, {0xb9070000}, {0xb9072000}, {0xb9074000}, {0xb9076000}, {0xb9078000}, {0xb907a000}, {0xb907c000}, {0xb907e000}, {0xb9080000}, {0xb9082000}, {0xb9084000}, {0xb9086000}, {0xb9088000}, {0xb908a000}, {0xb908c000}, {0xb908e000}, {0xb9090000}, {0xb9092000}, {0xb9094000}, {0xb9096000}, {0xb9098000}, {0xb909a000}, {0xb909c000}, {0xb909e000}, {0xb90a0000}, {0xb90a2000}, {0xb90a4000}, {0xb90a6000}, {0xb90a8000}, {0xb90aa000}, {0xb90ac000}, {0xb90ae000}, {0xb90b0000}, {0xb90b2000}, {0xb90b4000}, {0xb90b6000}, {0xb90b8000}, {0xb90ba000}, {0xb90bc000}, {0xb90be000}, {0xb90c0000}, {0xb90c2000}, {0xb90c4000}, {0xb90c6000}, {0xb90c8000}, {0xb90ca000}, {0xb90cc000}, {0xb90ce000}, {0xb90d0000}, {0xb90d2000}, {0xb90d4000}, {0xb90d6000}, {0xb90d8000}, {0xb90da000}, {0xb90dc000}, {0xb90de000}, {0xb90e0000}, {0xb90e2000}, {0xb90e4000}, {0xb90e6000}, {0xb90e8000}, {0xb90ea000}, {0xb90ec000}, {0xb90ee000}, {0xb90f0000}, {0xb90f2000}, {0xb90f4000}, {0xb90f6000}, {0xb90f8000}, {0xb90fa000}, {0xb90fc000}, {0xb90fe000}, {0xb9100000}, {0xb9102000}, {0xb9104000}, {0xb9106000}, {0xb9108000}, {0xb910a000}, {0xb910c000}, {0xb910e000}, {0xb9110000}, {0xb9112000}, {0xb9114000}, {0xb9116000}, {0xb9118000}, {0xb911a000}, {0xb911c000}, {0xb911e000}, {0xb9120000}, {0xb9122000}, {0xb9124000}, {0xb9126000}, {0xb9128000}, {0xb912a000}, {0xb912c000}, {0xb912e000}, {0xb9130000}, {0xb9132000}, {0xb9134000}, {0xb9136000}, {0xb9138000}, {0xb913a000}, {0xb913c000}, {0xb913e000}, {0xb9140000}, {0xb9142000}, {0xb9144000}, {0xb9146000}, {0xb9148000}, {0xb914a000}, {0xb914c000}, {0xb914e000}, {0xb9150000}, {0xb9152000}, {0xb9154000}, {0xb9156000}, {0xb9158000}, {0xb915a000}, {0xb915c000}, {0xb915e000}, {0xb9160000}, {0xb9162000}, {0xb9164000}, {0xb9166000}, {0xb9168000}, {0xb916a000}, {0xb916c000}, {0xb916e000}, {0xb9170000}, {0xb9172000}, {0xb9174000}, {0xb9176000}, {0xb9178000}, {0xb917a000}, {0xb917c000}, {0xb917e000}, {0xb9180000}, {0xb9182000}, {0xb9184000}, {0xb9186000}, {0xb9188000}, {0xb918a000}, {0xb918c000}, {0xb918e000}, {0xb9190000}, {0xb9192000}, {0xb9194000}, {0xb9196000}, {0xb9198000}, {0xb919a000}, {0xb919c000}, {0xb919e000}, {0xb91a0000}, {0xb91a2000}, {0xb91a4000}, {0xb91a6000}, {0xb91a8000}, {0xb91aa000}, {0xb91ac000}, {0xb91ae000}, {0xb91b0000}, {0xb91b2000}, {0xb91b4000}, {0xb91b6000}, {0xb91b8000}, {0xb91ba000}, {0xb91bc000}, {0xb91be000}, {0xb91c0000}, {0xb91c2000}, {0xb91c4000}, {0xb91c6000}, {0xb91c8000}, {0xb91ca000}, {0xb91cc000}, {0xb91ce000}, {0xb91d0000}, {0xb91d2000}, {0xb91d4000}, {0xb91d6000}, {0xb91d8000}, {0xb91da000}, {0xb91dc000}, {0xb91de000}, {0xb91e0000}, {0xb91e2000}, {0xb91e4000}, {0xb91e6000}, {0xb91e8000}, {0xb91ea000}, {0xb91ec000}, {0xb91ee000}, {0xb91f0000}, {0xb91f2000}, {0xb91f4000}, {0xb91f6000}, {0xb91f8000}, {0xb91fa000}, {0xb91fc000}, {0xb91fe000}, {0xb9200000}, {0xb9202000}, {0xb9204000}, {0xb9206000}, {0xb9208000}, {0xb920a000}, {0xb920c000}, {0xb920e000}, {0xb9210000}, {0xb9212000}, {0xb9214000}, {0xb9216000}, {0xb9218000}, {0xb921a000}, {0xb921c000}, {0xb921e000}, {0xb9220000}, {0xb9222000}, {0xb9224000}, {0xb9226000}, {0xb9228000}, {0xb922a000}, {0xb922c000}, {0xb922e000}, {0xb9230000}, {0xb9232000}, {0xb9234000}, {0xb9236000}, {0xb9238000}, {0xb923a000}, {0xb923c000}, {0xb923e000}, {0xb9240000}, {0xb9242000}, {0xb9244000}, {0xb9246000}, {0xb9248000}, {0xb924a000}, {0xb924c000}, {0xb924e000}, {0xb9250000}, {0xb9252000}, {0xb9254000}, {0xb9256000}, {0xb9258000}, {0xb925a000}, {0xb925c000}, {0xb925e000}, {0xb9260000}, {0xb9262000}, {0xb9264000}, {0xb9266000}, {0xb9268000}, {0xb926a000}, {0xb926c000}, {0xb926e000}, {0xb9270000}, {0xb9272000}, {0xb9274000}, {0xb9276000}, {0xb9278000}, {0xb927a000}, {0xb927c000}, {0xb927e000}, {0xb9280000}, {0xb9282000}, {0xb9284000}, {0xb9286000}, {0xb9288000}, {0xb928a000}, {0xb928c000}, {0xb928e000}, {0xb9290000}, {0xb9292000}, {0xb9294000}, {0xb9296000}, {0xb9298000}, {0xb929a000}, {0xb929c000}, {0xb929e000}, {0xb92a0000}, {0xb92a2000}, {0xb92a4000}, {0xb92a6000}, {0xb92a8000}, {0xb92aa000}, {0xb92ac000}, {0xb92ae000}, {0xb92b0000}, {0xb92b2000}, {0xb92b4000}, {0xb92b6000}, {0xb92b8000}, {0xb92ba000}, {0xb92bc000}, {0xb92be000}, {0xb92c0000}, {0xb92c2000}, {0xb92c4000}, {0xb92c6000}, {0xb92c8000}, {0xb92ca000}, {0xb92cc000}, {0xb92ce000}, {0xb92d0000}, {0xb92d2000}, {0xb92d4000}, {0xb92d6000}, {0xb92d8000}, {0xb92da000}, {0xb92dc000}, {0xb92de000}, {0xb92e0000}, {0xb92e2000}, {0xb92e4000}, {0xb92e6000}, {0xb92e8000}, {0xb92ea000}, {0xb92ec000}, {0xb92ee000}, {0xb92f0000}, {0xb92f2000}, {0xb92f4000}, {0xb92f6000}, {0xb92f8000}, {0xb92fa000}, {0xb92fc000}, {0xb92fe000}, {0xb9300000}, {0xb9302000}, {0xb9304000}, {0xb9306000}, {0xb9308000}, {0xb930a000}, {0xb930c000}, {0xb930e000}, {0xb9310000}, {0xb9312000}, {0xb9314000}, {0xb9316000}, {0xb9318000}, {0xb931a000}, {0xb931c000}, {0xb931e000}, {0xb9320000}, {0xb9322000}, {0xb9324000}, {0xb9326000}, {0xb9328000}, {0xb932a000}, {0xb932c000}, {0xb932e000}, {0xb9330000}, {0xb9332000}, {0xb9334000}, {0xb9336000}, {0xb9338000}, {0xb933a000}, {0xb933c000}, {0xb933e000}, {0xb9340000}, {0xb9342000}, {0xb9344000}, {0xb9346000}, {0xb9348000}, {0xb934a000}, {0xb934c000}, {0xb934e000}, {0xb9350000}, {0xb9352000}, {0xb9354000}, {0xb9356000}, {0xb9358000}, {0xb935a000}, {0xb935c000}, {0xb935e000}, {0xb9360000}, {0xb9362000}, {0xb9364000}, {0xb9366000}, {0xb9368000}, {0xb936a000}, {0xb936c000}, {0xb936e000}, {0xb9370000}, {0xb9372000}, {0xb9374000}, {0xb9376000}, {0xb9378000}, {0xb937a000}, {0xb937c000}, {0xb937e000}, {0xb9380000}, {0xb9382000}, {0xb9384000}, {0xb9386000}, {0xb9388000}, {0xb938a000}, {0xb938c000}, {0xb938e000}, {0xb9390000}, {0xb9392000}, {0xb9394000}, {0xb9396000}, {0xb9398000}, {0xb939a000}, {0xb939c000}, {0xb939e000}, {0xb93a0000}, {0xb93a2000}, {0xb93a4000}, {0xb93a6000}, {0xb93a8000}, {0xb93aa000}, {0xb93ac000}, {0xb93ae000}, {0xb93b0000}, {0xb93b2000}, {0xb93b4000}, {0xb93b6000}, {0xb93b8000}, {0xb93ba000}, {0xb93bc000}, {0xb93be000}, {0xb93c0000}, {0xb93c2000}, {0xb93c4000}, {0xb93c6000}, {0xb93c8000}, {0xb93ca000}, {0xb93cc000}, {0xb93ce000}, {0xb93d0000}, {0xb93d2000}, {0xb93d4000}, {0xb93d6000}, {0xb93d8000}, {0xb93da000}, {0xb93dc000}, {0xb93de000}, {0xb93e0000}, {0xb93e2000}, {0xb93e4000}, {0xb93e6000}, {0xb93e8000}, {0xb93ea000}, {0xb93ec000}, {0xb93ee000}, {0xb93f0000}, {0xb93f2000}, {0xb93f4000}, {0xb93f6000}, {0xb93f8000}, {0xb93fa000}, {0xb93fc000}, {0xb93fe000}, {0xb9400000}, {0xb9402000}, {0xb9404000}, {0xb9406000}, {0xb9408000}, {0xb940a000}, {0xb940c000}, {0xb940e000}, {0xb9410000}, {0xb9412000}, {0xb9414000}, {0xb9416000}, {0xb9418000}, {0xb941a000}, {0xb941c000}, {0xb941e000}, {0xb9420000}, {0xb9422000}, {0xb9424000}, {0xb9426000}, {0xb9428000}, {0xb942a000}, {0xb942c000}, {0xb942e000}, {0xb9430000}, {0xb9432000}, {0xb9434000}, {0xb9436000}, {0xb9438000}, {0xb943a000}, {0xb943c000}, {0xb943e000}, {0xb9440000}, {0xb9442000}, {0xb9444000}, {0xb9446000}, {0xb9448000}, {0xb944a000}, {0xb944c000}, {0xb944e000}, {0xb9450000}, {0xb9452000}, {0xb9454000}, {0xb9456000}, {0xb9458000}, {0xb945a000}, {0xb945c000}, {0xb945e000}, {0xb9460000}, {0xb9462000}, {0xb9464000}, {0xb9466000}, {0xb9468000}, {0xb946a000}, {0xb946c000}, {0xb946e000}, {0xb9470000}, {0xb9472000}, {0xb9474000}, {0xb9476000}, {0xb9478000}, {0xb947a000}, {0xb947c000}, {0xb947e000}, {0xb9480000}, {0xb9482000}, {0xb9484000}, {0xb9486000}, {0xb9488000}, {0xb948a000}, {0xb948c000}, {0xb948e000}, {0xb9490000}, {0xb9492000}, {0xb9494000}, {0xb9496000}, {0xb9498000}, {0xb949a000}, {0xb949c000}, {0xb949e000}, {0xb94a0000}, {0xb94a2000}, {0xb94a4000}, {0xb94a6000}, {0xb94a8000}, {0xb94aa000}, {0xb94ac000}, {0xb94ae000}, {0xb94b0000}, {0xb94b2000}, {0xb94b4000}, {0xb94b6000}, {0xb94b8000}, {0xb94ba000}, {0xb94bc000}, {0xb94be000}, {0xb94c0000}, {0xb94c2000}, {0xb94c4000}, {0xb94c6000}, {0xb94c8000}, {0xb94ca000}, {0xb94cc000}, {0xb94ce000}, {0xb94d0000}, {0xb94d2000}, {0xb94d4000}, {0xb94d6000}, {0xb94d8000}, {0xb94da000}, {0xb94dc000}, {0xb94de000}, {0xb94e0000}, {0xb94e2000}, {0xb94e4000}, {0xb94e6000}, {0xb94e8000}, {0xb94ea000}, {0xb94ec000}, {0xb94ee000}, {0xb94f0000}, {0xb94f2000}, {0xb94f4000}, {0xb94f6000}, {0xb94f8000}, {0xb94fa000}, {0xb94fc000}, {0xb94fe000}, {0xb9500000}, {0xb9502000}, {0xb9504000}, {0xb9506000}, {0xb9508000}, {0xb950a000}, {0xb950c000}, {0xb950e000}, {0xb9510000}, {0xb9512000}, {0xb9514000}, {0xb9516000}, {0xb9518000}, {0xb951a000}, {0xb951c000}, {0xb951e000}, {0xb9520000}, {0xb9522000}, {0xb9524000}, {0xb9526000}, {0xb9528000}, {0xb952a000}, {0xb952c000}, {0xb952e000}, {0xb9530000}, {0xb9532000}, {0xb9534000}, {0xb9536000}, {0xb9538000}, {0xb953a000}, {0xb953c000}, {0xb953e000}, {0xb9540000}, {0xb9542000}, {0xb9544000}, {0xb9546000}, {0xb9548000}, {0xb954a000}, {0xb954c000}, {0xb954e000}, {0xb9550000}, {0xb9552000}, {0xb9554000}, {0xb9556000}, {0xb9558000}, {0xb955a000}, {0xb955c000}, {0xb955e000}, {0xb9560000}, {0xb9562000}, {0xb9564000}, {0xb9566000}, {0xb9568000}, {0xb956a000}, {0xb956c000}, {0xb956e000}, {0xb9570000}, {0xb9572000}, {0xb9574000}, {0xb9576000}, {0xb9578000}, {0xb957a000}, {0xb957c000}, {0xb957e000}, {0xb9580000}, {0xb9582000}, {0xb9584000}, {0xb9586000}, {0xb9588000}, {0xb958a000}, {0xb958c000}, {0xb958e000}, {0xb9590000}, {0xb9592000}, {0xb9594000}, {0xb9596000}, {0xb9598000}, {0xb959a000}, {0xb959c000}, {0xb959e000}, {0xb95a0000}, {0xb95a2000}, {0xb95a4000}, {0xb95a6000}, {0xb95a8000}, {0xb95aa000}, {0xb95ac000}, {0xb95ae000}, {0xb95b0000}, {0xb95b2000}, {0xb95b4000}, {0xb95b6000}, {0xb95b8000}, {0xb95ba000}, {0xb95bc000}, {0xb95be000}, {0xb95c0000}, {0xb95c2000}, {0xb95c4000}, {0xb95c6000}, {0xb95c8000}, {0xb95ca000}, {0xb95cc000}, {0xb95ce000}, {0xb95d0000}, {0xb95d2000}, {0xb95d4000}, {0xb95d6000}, {0xb95d8000}, {0xb95da000}, {0xb95dc000}, {0xb95de000}, {0xb95e0000}, {0xb95e2000}, {0xb95e4000}, {0xb95e6000}, {0xb95e8000}, {0xb95ea000}, {0xb95ec000}, {0xb95ee000}, {0xb95f0000}, {0xb95f2000}, {0xb95f4000}, {0xb95f6000}, {0xb95f8000}, {0xb95fa000}, {0xb95fc000}, {0xb95fe000}, {0xb9600000}, {0xb9602000}, {0xb9604000}, {0xb9606000}, {0xb9608000}, {0xb960a000}, {0xb960c000}, {0xb960e000}, {0xb9610000}, {0xb9612000}, {0xb9614000}, {0xb9616000}, {0xb9618000}, {0xb961a000}, {0xb961c000}, {0xb961e000}, {0xb9620000}, {0xb9622000}, {0xb9624000}, {0xb9626000}, {0xb9628000}, {0xb962a000}, {0xb962c000}, {0xb962e000}, {0xb9630000}, {0xb9632000}, {0xb9634000}, {0xb9636000}, {0xb9638000}, {0xb963a000}, {0xb963c000}, {0xb963e000}, {0xb9640000}, {0xb9642000}, {0xb9644000}, {0xb9646000}, {0xb9648000}, {0xb964a000}, {0xb964c000}, {0xb964e000}, {0xb9650000}, {0xb9652000}, {0xb9654000}, {0xb9656000}, {0xb9658000}, {0xb965a000}, {0xb965c000}, {0xb965e000}, {0xb9660000}, {0xb9662000}, {0xb9664000}, {0xb9666000}, {0xb9668000}, {0xb966a000}, {0xb966c000}, {0xb966e000}, {0xb9670000}, {0xb9672000}, {0xb9674000}, {0xb9676000}, {0xb9678000}, {0xb967a000}, {0xb967c000}, {0xb967e000}, {0xb9680000}, {0xb9682000}, {0xb9684000}, {0xb9686000}, {0xb9688000}, {0xb968a000}, {0xb968c000}, {0xb968e000}, {0xb9690000}, {0xb9692000}, {0xb9694000}, {0xb9696000}, {0xb9698000}, {0xb969a000}, {0xb969c000}, {0xb969e000}, {0xb96a0000}, {0xb96a2000}, {0xb96a4000}, {0xb96a6000}, {0xb96a8000}, {0xb96aa000}, {0xb96ac000}, {0xb96ae000}, {0xb96b0000}, {0xb96b2000}, {0xb96b4000}, {0xb96b6000}, {0xb96b8000}, {0xb96ba000}, {0xb96bc000}, {0xb96be000}, {0xb96c0000}, {0xb96c2000}, {0xb96c4000}, {0xb96c6000}, {0xb96c8000}, {0xb96ca000}, {0xb96cc000}, {0xb96ce000}, {0xb96d0000}, {0xb96d2000}, {0xb96d4000}, {0xb96d6000}, {0xb96d8000}, {0xb96da000}, {0xb96dc000}, {0xb96de000}, {0xb96e0000}, {0xb96e2000}, {0xb96e4000}, {0xb96e6000}, {0xb96e8000}, {0xb96ea000}, {0xb96ec000}, {0xb96ee000}, {0xb96f0000}, {0xb96f2000}, {0xb96f4000}, {0xb96f6000}, {0xb96f8000}, {0xb96fa000}, {0xb96fc000}, {0xb96fe000}, {0xb9700000}, {0xb9702000}, {0xb9704000}, {0xb9706000}, {0xb9708000}, {0xb970a000}, {0xb970c000}, {0xb970e000}, {0xb9710000}, {0xb9712000}, {0xb9714000}, {0xb9716000}, {0xb9718000}, {0xb971a000}, {0xb971c000}, {0xb971e000}, {0xb9720000}, {0xb9722000}, {0xb9724000}, {0xb9726000}, {0xb9728000}, {0xb972a000}, {0xb972c000}, {0xb972e000}, {0xb9730000}, {0xb9732000}, {0xb9734000}, {0xb9736000}, {0xb9738000}, {0xb973a000}, {0xb973c000}, {0xb973e000}, {0xb9740000}, {0xb9742000}, {0xb9744000}, {0xb9746000}, {0xb9748000}, {0xb974a000}, {0xb974c000}, {0xb974e000}, {0xb9750000}, {0xb9752000}, {0xb9754000}, {0xb9756000}, {0xb9758000}, {0xb975a000}, {0xb975c000}, {0xb975e000}, {0xb9760000}, {0xb9762000}, {0xb9764000}, {0xb9766000}, {0xb9768000}, {0xb976a000}, {0xb976c000}, {0xb976e000}, {0xb9770000}, {0xb9772000}, {0xb9774000}, {0xb9776000}, {0xb9778000}, {0xb977a000}, {0xb977c000}, {0xb977e000}, {0xb9780000}, {0xb9782000}, {0xb9784000}, {0xb9786000}, {0xb9788000}, {0xb978a000}, {0xb978c000}, {0xb978e000}, {0xb9790000}, {0xb9792000}, {0xb9794000}, {0xb9796000}, {0xb9798000}, {0xb979a000}, {0xb979c000}, {0xb979e000}, {0xb97a0000}, {0xb97a2000}, {0xb97a4000}, {0xb97a6000}, {0xb97a8000}, {0xb97aa000}, {0xb97ac000}, {0xb97ae000}, {0xb97b0000}, {0xb97b2000}, {0xb97b4000}, {0xb97b6000}, {0xb97b8000}, {0xb97ba000}, {0xb97bc000}, {0xb97be000}, {0xb97c0000}, {0xb97c2000}, {0xb97c4000}, {0xb97c6000}, {0xb97c8000}, {0xb97ca000}, {0xb97cc000}, {0xb97ce000}, {0xb97d0000}, {0xb97d2000}, {0xb97d4000}, {0xb97d6000}, {0xb97d8000}, {0xb97da000}, {0xb97dc000}, {0xb97de000}, {0xb97e0000}, {0xb97e2000}, {0xb97e4000}, {0xb97e6000}, {0xb97e8000}, {0xb97ea000}, {0xb97ec000}, {0xb97ee000}, {0xb97f0000}, {0xb97f2000}, {0xb97f4000}, {0xb97f6000}, {0xb97f8000}, {0xb97fa000}, {0xb97fc000}, {0xb97fe000}, {0xb9800000}, {0xb9802000}, {0xb9804000}, {0xb9806000}, {0xb9808000}, {0xb980a000}, {0xb980c000}, {0xb980e000}, {0xb9810000}, {0xb9812000}, {0xb9814000}, {0xb9816000}, {0xb9818000}, {0xb981a000}, {0xb981c000}, {0xb981e000}, {0xb9820000}, {0xb9822000}, {0xb9824000}, {0xb9826000}, {0xb9828000}, {0xb982a000}, {0xb982c000}, {0xb982e000}, {0xb9830000}, {0xb9832000}, {0xb9834000}, {0xb9836000}, {0xb9838000}, {0xb983a000}, {0xb983c000}, {0xb983e000}, {0xb9840000}, {0xb9842000}, {0xb9844000}, {0xb9846000}, {0xb9848000}, {0xb984a000}, {0xb984c000}, {0xb984e000}, {0xb9850000}, {0xb9852000}, {0xb9854000}, {0xb9856000}, {0xb9858000}, {0xb985a000}, {0xb985c000}, {0xb985e000}, {0xb9860000}, {0xb9862000}, {0xb9864000}, {0xb9866000}, {0xb9868000}, {0xb986a000}, {0xb986c000}, {0xb986e000}, {0xb9870000}, {0xb9872000}, {0xb9874000}, {0xb9876000}, {0xb9878000}, {0xb987a000}, {0xb987c000}, {0xb987e000}, {0xb9880000}, {0xb9882000}, {0xb9884000}, {0xb9886000}, {0xb9888000}, {0xb988a000}, {0xb988c000}, {0xb988e000}, {0xb9890000}, {0xb9892000}, {0xb9894000}, {0xb9896000}, {0xb9898000}, {0xb989a000}, {0xb989c000}, {0xb989e000}, {0xb98a0000}, {0xb98a2000}, {0xb98a4000}, {0xb98a6000}, {0xb98a8000}, {0xb98aa000}, {0xb98ac000}, {0xb98ae000}, {0xb98b0000}, {0xb98b2000}, {0xb98b4000}, {0xb98b6000}, {0xb98b8000}, {0xb98ba000}, {0xb98bc000}, {0xb98be000}, {0xb98c0000}, {0xb98c2000}, {0xb98c4000}, {0xb98c6000}, {0xb98c8000}, {0xb98ca000}, {0xb98cc000}, {0xb98ce000}, {0xb98d0000}, {0xb98d2000}, {0xb98d4000}, {0xb98d6000}, {0xb98d8000}, {0xb98da000}, {0xb98dc000}, {0xb98de000}, {0xb98e0000}, {0xb98e2000}, {0xb98e4000}, {0xb98e6000}, {0xb98e8000}, {0xb98ea000}, {0xb98ec000}, {0xb98ee000}, {0xb98f0000}, {0xb98f2000}, {0xb98f4000}, {0xb98f6000}, {0xb98f8000}, {0xb98fa000}, {0xb98fc000}, {0xb98fe000}, {0xb9900000}, {0xb9902000}, {0xb9904000}, {0xb9906000}, {0xb9908000}, {0xb990a000}, {0xb990c000}, {0xb990e000}, {0xb9910000}, {0xb9912000}, {0xb9914000}, {0xb9916000}, {0xb9918000}, {0xb991a000}, {0xb991c000}, {0xb991e000}, {0xb9920000}, {0xb9922000}, {0xb9924000}, {0xb9926000}, {0xb9928000}, {0xb992a000}, {0xb992c000}, {0xb992e000}, {0xb9930000}, {0xb9932000}, {0xb9934000}, {0xb9936000}, {0xb9938000}, {0xb993a000}, {0xb993c000}, {0xb993e000}, {0xb9940000}, {0xb9942000}, {0xb9944000}, {0xb9946000}, {0xb9948000}, {0xb994a000}, {0xb994c000}, {0xb994e000}, {0xb9950000}, {0xb9952000}, {0xb9954000}, {0xb9956000}, {0xb9958000}, {0xb995a000}, {0xb995c000}, {0xb995e000}, {0xb9960000}, {0xb9962000}, {0xb9964000}, {0xb9966000}, {0xb9968000}, {0xb996a000}, {0xb996c000}, {0xb996e000}, {0xb9970000}, {0xb9972000}, {0xb9974000}, {0xb9976000}, {0xb9978000}, {0xb997a000}, {0xb997c000}, {0xb997e000}, {0xb9980000}, {0xb9982000}, {0xb9984000}, {0xb9986000}, {0xb9988000}, {0xb998a000}, {0xb998c000}, {0xb998e000}, {0xb9990000}, {0xb9992000}, {0xb9994000}, {0xb9996000}, {0xb9998000}, {0xb999a000}, {0xb999c000}, {0xb999e000}, {0xb99a0000}, {0xb99a2000}, {0xb99a4000}, {0xb99a6000}, {0xb99a8000}, {0xb99aa000}, {0xb99ac000}, {0xb99ae000}, {0xb99b0000}, {0xb99b2000}, {0xb99b4000}, {0xb99b6000}, {0xb99b8000}, {0xb99ba000}, {0xb99bc000}, {0xb99be000}, {0xb99c0000}, {0xb99c2000}, {0xb99c4000}, {0xb99c6000}, {0xb99c8000}, {0xb99ca000}, {0xb99cc000}, {0xb99ce000}, {0xb99d0000}, {0xb99d2000}, {0xb99d4000}, {0xb99d6000}, {0xb99d8000}, {0xb99da000}, {0xb99dc000}, {0xb99de000}, {0xb99e0000}, {0xb99e2000}, {0xb99e4000}, {0xb99e6000}, {0xb99e8000}, {0xb99ea000}, {0xb99ec000}, {0xb99ee000}, {0xb99f0000}, {0xb99f2000}, {0xb99f4000}, {0xb99f6000}, {0xb99f8000}, {0xb99fa000}, {0xb99fc000}, {0xb99fe000}, {0xb9a00000}, {0xb9a02000}, {0xb9a04000}, {0xb9a06000}, {0xb9a08000}, {0xb9a0a000}, {0xb9a0c000}, {0xb9a0e000}, {0xb9a10000}, {0xb9a12000}, {0xb9a14000}, {0xb9a16000}, {0xb9a18000}, {0xb9a1a000}, {0xb9a1c000}, {0xb9a1e000}, {0xb9a20000}, {0xb9a22000}, {0xb9a24000}, {0xb9a26000}, {0xb9a28000}, {0xb9a2a000}, {0xb9a2c000}, {0xb9a2e000}, {0xb9a30000}, {0xb9a32000}, {0xb9a34000}, {0xb9a36000}, {0xb9a38000}, {0xb9a3a000}, {0xb9a3c000}, {0xb9a3e000}, {0xb9a40000}, {0xb9a42000}, {0xb9a44000}, {0xb9a46000}, {0xb9a48000}, {0xb9a4a000}, {0xb9a4c000}, {0xb9a4e000}, {0xb9a50000}, {0xb9a52000}, {0xb9a54000}, {0xb9a56000}, {0xb9a58000}, {0xb9a5a000}, {0xb9a5c000}, {0xb9a5e000}, {0xb9a60000}, {0xb9a62000}, {0xb9a64000}, {0xb9a66000}, {0xb9a68000}, {0xb9a6a000}, {0xb9a6c000}, {0xb9a6e000}, {0xb9a70000}, {0xb9a72000}, {0xb9a74000}, {0xb9a76000}, {0xb9a78000}, {0xb9a7a000}, {0xb9a7c000}, {0xb9a7e000}, {0xb9a80000}, {0xb9a82000}, {0xb9a84000}, {0xb9a86000}, {0xb9a88000}, {0xb9a8a000}, {0xb9a8c000}, {0xb9a8e000}, {0xb9a90000}, {0xb9a92000}, {0xb9a94000}, {0xb9a96000}, {0xb9a98000}, {0xb9a9a000}, {0xb9a9c000}, {0xb9a9e000}, {0xb9aa0000}, {0xb9aa2000}, {0xb9aa4000}, {0xb9aa6000}, {0xb9aa8000}, {0xb9aaa000}, {0xb9aac000}, {0xb9aae000}, {0xb9ab0000}, {0xb9ab2000}, {0xb9ab4000}, {0xb9ab6000}, {0xb9ab8000}, {0xb9aba000}, {0xb9abc000}, {0xb9abe000}, {0xb9ac0000}, {0xb9ac2000}, {0xb9ac4000}, {0xb9ac6000}, {0xb9ac8000}, {0xb9aca000}, {0xb9acc000}, {0xb9ace000}, {0xb9ad0000}, {0xb9ad2000}, {0xb9ad4000}, {0xb9ad6000}, {0xb9ad8000}, {0xb9ada000}, {0xb9adc000}, {0xb9ade000}, {0xb9ae0000}, {0xb9ae2000}, {0xb9ae4000}, {0xb9ae6000}, {0xb9ae8000}, {0xb9aea000}, {0xb9aec000}, {0xb9aee000}, {0xb9af0000}, {0xb9af2000}, {0xb9af4000}, {0xb9af6000}, {0xb9af8000}, {0xb9afa000}, {0xb9afc000}, {0xb9afe000}, {0xb9b00000}, {0xb9b02000}, {0xb9b04000}, {0xb9b06000}, {0xb9b08000}, {0xb9b0a000}, {0xb9b0c000}, {0xb9b0e000}, {0xb9b10000}, {0xb9b12000}, {0xb9b14000}, {0xb9b16000}, {0xb9b18000}, {0xb9b1a000}, {0xb9b1c000}, {0xb9b1e000}, {0xb9b20000}, {0xb9b22000}, {0xb9b24000}, {0xb9b26000}, {0xb9b28000}, {0xb9b2a000}, {0xb9b2c000}, {0xb9b2e000}, {0xb9b30000}, {0xb9b32000}, {0xb9b34000}, {0xb9b36000}, {0xb9b38000}, {0xb9b3a000}, {0xb9b3c000}, {0xb9b3e000}, {0xb9b40000}, {0xb9b42000}, {0xb9b44000}, {0xb9b46000}, {0xb9b48000}, {0xb9b4a000}, {0xb9b4c000}, {0xb9b4e000}, {0xb9b50000}, {0xb9b52000}, {0xb9b54000}, {0xb9b56000}, {0xb9b58000}, {0xb9b5a000}, {0xb9b5c000}, {0xb9b5e000}, {0xb9b60000}, {0xb9b62000}, {0xb9b64000}, {0xb9b66000}, {0xb9b68000}, {0xb9b6a000}, {0xb9b6c000}, {0xb9b6e000}, {0xb9b70000}, {0xb9b72000}, {0xb9b74000}, {0xb9b76000}, {0xb9b78000}, {0xb9b7a000}, {0xb9b7c000}, {0xb9b7e000}, {0xb9b80000}, {0xb9b82000}, {0xb9b84000}, {0xb9b86000}, {0xb9b88000}, {0xb9b8a000}, {0xb9b8c000}, {0xb9b8e000}, {0xb9b90000}, {0xb9b92000}, {0xb9b94000}, {0xb9b96000}, {0xb9b98000}, {0xb9b9a000}, {0xb9b9c000}, {0xb9b9e000}, {0xb9ba0000}, {0xb9ba2000}, {0xb9ba4000}, {0xb9ba6000}, {0xb9ba8000}, {0xb9baa000}, {0xb9bac000}, {0xb9bae000}, {0xb9bb0000}, {0xb9bb2000}, {0xb9bb4000}, {0xb9bb6000}, {0xb9bb8000}, {0xb9bba000}, {0xb9bbc000}, {0xb9bbe000}, {0xb9bc0000}, {0xb9bc2000}, {0xb9bc4000}, {0xb9bc6000}, {0xb9bc8000}, {0xb9bca000}, {0xb9bcc000}, {0xb9bce000}, {0xb9bd0000}, {0xb9bd2000}, {0xb9bd4000}, {0xb9bd6000}, {0xb9bd8000}, {0xb9bda000}, {0xb9bdc000}, {0xb9bde000}, {0xb9be0000}, {0xb9be2000}, {0xb9be4000}, {0xb9be6000}, {0xb9be8000}, {0xb9bea000}, {0xb9bec000}, {0xb9bee000}, {0xb9bf0000}, {0xb9bf2000}, {0xb9bf4000}, {0xb9bf6000}, {0xb9bf8000}, {0xb9bfa000}, {0xb9bfc000}, {0xb9bfe000}, {0xb9c00000}, {0xb9c02000}, {0xb9c04000}, {0xb9c06000}, {0xb9c08000}, {0xb9c0a000}, {0xb9c0c000}, {0xb9c0e000}, {0xb9c10000}, {0xb9c12000}, {0xb9c14000}, {0xb9c16000}, {0xb9c18000}, {0xb9c1a000}, {0xb9c1c000}, {0xb9c1e000}, {0xb9c20000}, {0xb9c22000}, {0xb9c24000}, {0xb9c26000}, {0xb9c28000}, {0xb9c2a000}, {0xb9c2c000}, {0xb9c2e000}, {0xb9c30000}, {0xb9c32000}, {0xb9c34000}, {0xb9c36000}, {0xb9c38000}, {0xb9c3a000}, {0xb9c3c000}, {0xb9c3e000}, {0xb9c40000}, {0xb9c42000}, {0xb9c44000}, {0xb9c46000}, {0xb9c48000}, {0xb9c4a000}, {0xb9c4c000}, {0xb9c4e000}, {0xb9c50000}, {0xb9c52000}, {0xb9c54000}, {0xb9c56000}, {0xb9c58000}, {0xb9c5a000}, {0xb9c5c000}, {0xb9c5e000}, {0xb9c60000}, {0xb9c62000}, {0xb9c64000}, {0xb9c66000}, {0xb9c68000}, {0xb9c6a000}, {0xb9c6c000}, {0xb9c6e000}, {0xb9c70000}, {0xb9c72000}, {0xb9c74000}, {0xb9c76000}, {0xb9c78000}, {0xb9c7a000}, {0xb9c7c000}, {0xb9c7e000}, {0xb9c80000}, {0xb9c82000}, {0xb9c84000}, {0xb9c86000}, {0xb9c88000}, {0xb9c8a000}, {0xb9c8c000}, {0xb9c8e000}, {0xb9c90000}, {0xb9c92000}, {0xb9c94000}, {0xb9c96000}, {0xb9c98000}, {0xb9c9a000}, {0xb9c9c000}, {0xb9c9e000}, {0xb9ca0000}, {0xb9ca2000}, {0xb9ca4000}, {0xb9ca6000}, {0xb9ca8000}, {0xb9caa000}, {0xb9cac000}, {0xb9cae000}, {0xb9cb0000}, {0xb9cb2000}, {0xb9cb4000}, {0xb9cb6000}, {0xb9cb8000}, {0xb9cba000}, {0xb9cbc000}, {0xb9cbe000}, {0xb9cc0000}, {0xb9cc2000}, {0xb9cc4000}, {0xb9cc6000}, {0xb9cc8000}, {0xb9cca000}, {0xb9ccc000}, {0xb9cce000}, {0xb9cd0000}, {0xb9cd2000}, {0xb9cd4000}, {0xb9cd6000}, {0xb9cd8000}, {0xb9cda000}, {0xb9cdc000}, {0xb9cde000}, {0xb9ce0000}, {0xb9ce2000}, {0xb9ce4000}, {0xb9ce6000}, {0xb9ce8000}, {0xb9cea000}, {0xb9cec000}, {0xb9cee000}, {0xb9cf0000}, {0xb9cf2000}, {0xb9cf4000}, {0xb9cf6000}, {0xb9cf8000}, {0xb9cfa000}, {0xb9cfc000}, {0xb9cfe000}, {0xb9d00000}, {0xb9d02000}, {0xb9d04000}, {0xb9d06000}, {0xb9d08000}, {0xb9d0a000}, {0xb9d0c000}, {0xb9d0e000}, {0xb9d10000}, {0xb9d12000}, {0xb9d14000}, {0xb9d16000}, {0xb9d18000}, {0xb9d1a000}, {0xb9d1c000}, {0xb9d1e000}, {0xb9d20000}, {0xb9d22000}, {0xb9d24000}, {0xb9d26000}, {0xb9d28000}, {0xb9d2a000}, {0xb9d2c000}, {0xb9d2e000}, {0xb9d30000}, {0xb9d32000}, {0xb9d34000}, {0xb9d36000}, {0xb9d38000}, {0xb9d3a000}, {0xb9d3c000}, {0xb9d3e000}, {0xb9d40000}, {0xb9d42000}, {0xb9d44000}, {0xb9d46000}, {0xb9d48000}, {0xb9d4a000}, {0xb9d4c000}, {0xb9d4e000}, {0xb9d50000}, {0xb9d52000}, {0xb9d54000}, {0xb9d56000}, {0xb9d58000}, {0xb9d5a000}, {0xb9d5c000}, {0xb9d5e000}, {0xb9d60000}, {0xb9d62000}, {0xb9d64000}, {0xb9d66000}, {0xb9d68000}, {0xb9d6a000}, {0xb9d6c000}, {0xb9d6e000}, {0xb9d70000}, {0xb9d72000}, {0xb9d74000}, {0xb9d76000}, {0xb9d78000}, {0xb9d7a000}, {0xb9d7c000}, {0xb9d7e000}, {0xb9d80000}, {0xb9d82000}, {0xb9d84000}, {0xb9d86000}, {0xb9d88000}, {0xb9d8a000}, {0xb9d8c000}, {0xb9d8e000}, {0xb9d90000}, {0xb9d92000}, {0xb9d94000}, {0xb9d96000}, {0xb9d98000}, {0xb9d9a000}, {0xb9d9c000}, {0xb9d9e000}, {0xb9da0000}, {0xb9da2000}, {0xb9da4000}, {0xb9da6000}, {0xb9da8000}, {0xb9daa000}, {0xb9dac000}, {0xb9dae000}, {0xb9db0000}, {0xb9db2000}, {0xb9db4000}, {0xb9db6000}, {0xb9db8000}, {0xb9dba000}, {0xb9dbc000}, {0xb9dbe000}, {0xb9dc0000}, {0xb9dc2000}, {0xb9dc4000}, {0xb9dc6000}, {0xb9dc8000}, {0xb9dca000}, {0xb9dcc000}, {0xb9dce000}, {0xb9dd0000}, {0xb9dd2000}, {0xb9dd4000}, {0xb9dd6000}, {0xb9dd8000}, {0xb9dda000}, {0xb9ddc000}, {0xb9dde000}, {0xb9de0000}, {0xb9de2000}, {0xb9de4000}, {0xb9de6000}, {0xb9de8000}, {0xb9dea000}, {0xb9dec000}, {0xb9dee000}, {0xb9df0000}, {0xb9df2000}, {0xb9df4000}, {0xb9df6000}, {0xb9df8000}, {0xb9dfa000}, {0xb9dfc000}, {0xb9dfe000}, {0xb9e00000}, {0xb9e02000}, {0xb9e04000}, {0xb9e06000}, {0xb9e08000}, {0xb9e0a000}, {0xb9e0c000}, {0xb9e0e000}, {0xb9e10000}, {0xb9e12000}, {0xb9e14000}, {0xb9e16000}, {0xb9e18000}, {0xb9e1a000}, {0xb9e1c000}, {0xb9e1e000}, {0xb9e20000}, {0xb9e22000}, {0xb9e24000}, {0xb9e26000}, {0xb9e28000}, {0xb9e2a000}, {0xb9e2c000}, {0xb9e2e000}, {0xb9e30000}, {0xb9e32000}, {0xb9e34000}, {0xb9e36000}, {0xb9e38000}, {0xb9e3a000}, {0xb9e3c000}, {0xb9e3e000}, {0xb9e40000}, {0xb9e42000}, {0xb9e44000}, {0xb9e46000}, {0xb9e48000}, {0xb9e4a000}, {0xb9e4c000}, {0xb9e4e000}, {0xb9e50000}, {0xb9e52000}, {0xb9e54000}, {0xb9e56000}, {0xb9e58000}, {0xb9e5a000}, {0xb9e5c000}, {0xb9e5e000}, {0xb9e60000}, {0xb9e62000}, {0xb9e64000}, {0xb9e66000}, {0xb9e68000}, {0xb9e6a000}, {0xb9e6c000}, {0xb9e6e000}, {0xb9e70000}, {0xb9e72000}, {0xb9e74000}, {0xb9e76000}, {0xb9e78000}, {0xb9e7a000}, {0xb9e7c000}, {0xb9e7e000}, {0xb9e80000}, {0xb9e82000}, {0xb9e84000}, {0xb9e86000}, {0xb9e88000}, {0xb9e8a000}, {0xb9e8c000}, {0xb9e8e000}, {0xb9e90000}, {0xb9e92000}, {0xb9e94000}, {0xb9e96000}, {0xb9e98000}, {0xb9e9a000}, {0xb9e9c000}, {0xb9e9e000}, {0xb9ea0000}, {0xb9ea2000}, {0xb9ea4000}, {0xb9ea6000}, {0xb9ea8000}, {0xb9eaa000}, {0xb9eac000}, {0xb9eae000}, {0xb9eb0000}, {0xb9eb2000}, {0xb9eb4000}, {0xb9eb6000}, {0xb9eb8000}, {0xb9eba000}, {0xb9ebc000}, {0xb9ebe000}, {0xb9ec0000}, {0xb9ec2000}, {0xb9ec4000}, {0xb9ec6000}, {0xb9ec8000}, {0xb9eca000}, {0xb9ecc000}, {0xb9ece000}, {0xb9ed0000}, {0xb9ed2000}, {0xb9ed4000}, {0xb9ed6000}, {0xb9ed8000}, {0xb9eda000}, {0xb9edc000}, {0xb9ede000}, {0xb9ee0000}, {0xb9ee2000}, {0xb9ee4000}, {0xb9ee6000}, {0xb9ee8000}, {0xb9eea000}, {0xb9eec000}, {0xb9eee000}, {0xb9ef0000}, {0xb9ef2000}, {0xb9ef4000}, {0xb9ef6000}, {0xb9ef8000}, {0xb9efa000}, {0xb9efc000}, {0xb9efe000}, {0xb9f00000}, {0xb9f02000}, {0xb9f04000}, {0xb9f06000}, {0xb9f08000}, {0xb9f0a000}, {0xb9f0c000}, {0xb9f0e000}, {0xb9f10000}, {0xb9f12000}, {0xb9f14000}, {0xb9f16000}, {0xb9f18000}, {0xb9f1a000}, {0xb9f1c000}, {0xb9f1e000}, {0xb9f20000}, {0xb9f22000}, {0xb9f24000}, {0xb9f26000}, {0xb9f28000}, {0xb9f2a000}, {0xb9f2c000}, {0xb9f2e000}, {0xb9f30000}, {0xb9f32000}, {0xb9f34000}, {0xb9f36000}, {0xb9f38000}, {0xb9f3a000}, {0xb9f3c000}, {0xb9f3e000}, {0xb9f40000}, {0xb9f42000}, {0xb9f44000}, {0xb9f46000}, {0xb9f48000}, {0xb9f4a000}, {0xb9f4c000}, {0xb9f4e000}, {0xb9f50000}, {0xb9f52000}, {0xb9f54000}, {0xb9f56000}, {0xb9f58000}, {0xb9f5a000}, {0xb9f5c000}, {0xb9f5e000}, {0xb9f60000}, {0xb9f62000}, {0xb9f64000}, {0xb9f66000}, {0xb9f68000}, {0xb9f6a000}, {0xb9f6c000}, {0xb9f6e000}, {0xb9f70000}, {0xb9f72000}, {0xb9f74000}, {0xb9f76000}, {0xb9f78000}, {0xb9f7a000}, {0xb9f7c000}, {0xb9f7e000}, {0xb9f80000}, {0xb9f82000}, {0xb9f84000}, {0xb9f86000}, {0xb9f88000}, {0xb9f8a000}, {0xb9f8c000}, {0xb9f8e000}, {0xb9f90000}, {0xb9f92000}, {0xb9f94000}, {0xb9f96000}, {0xb9f98000}, {0xb9f9a000}, {0xb9f9c000}, {0xb9f9e000}, {0xb9fa0000}, {0xb9fa2000}, {0xb9fa4000}, {0xb9fa6000}, {0xb9fa8000}, {0xb9faa000}, {0xb9fac000}, {0xb9fae000}, {0xb9fb0000}, {0xb9fb2000}, {0xb9fb4000}, {0xb9fb6000}, {0xb9fb8000}, {0xb9fba000}, {0xb9fbc000}, {0xb9fbe000}, {0xb9fc0000}, {0xb9fc2000}, {0xb9fc4000}, {0xb9fc6000}, {0xb9fc8000}, {0xb9fca000}, {0xb9fcc000}, {0xb9fce000}, {0xb9fd0000}, {0xb9fd2000}, {0xb9fd4000}, {0xb9fd6000}, {0xb9fd8000}, {0xb9fda000}, {0xb9fdc000}, {0xb9fde000}, {0xb9fe0000}, {0xb9fe2000}, {0xb9fe4000}, {0xb9fe6000}, {0xb9fe8000}, {0xb9fea000}, {0xb9fec000}, {0xb9fee000}, {0xb9ff0000}, {0xb9ff2000}, {0xb9ff4000}, {0xb9ff6000}, {0xb9ff8000}, {0xb9ffa000}, {0xb9ffc000}, {0xb9ffe000}, {0xba000000}, {0xba002000}, {0xba004000}, {0xba006000}, {0xba008000}, {0xba00a000}, {0xba00c000}, {0xba00e000}, {0xba010000}, {0xba012000}, {0xba014000}, {0xba016000}, {0xba018000}, {0xba01a000}, {0xba01c000}, {0xba01e000}, {0xba020000}, {0xba022000}, {0xba024000}, {0xba026000}, {0xba028000}, {0xba02a000}, {0xba02c000}, {0xba02e000}, {0xba030000}, {0xba032000}, {0xba034000}, {0xba036000}, {0xba038000}, {0xba03a000}, {0xba03c000}, {0xba03e000}, {0xba040000}, {0xba042000}, {0xba044000}, {0xba046000}, {0xba048000}, {0xba04a000}, {0xba04c000}, {0xba04e000}, {0xba050000}, {0xba052000}, {0xba054000}, {0xba056000}, {0xba058000}, {0xba05a000}, {0xba05c000}, {0xba05e000}, {0xba060000}, {0xba062000}, {0xba064000}, {0xba066000}, {0xba068000}, {0xba06a000}, {0xba06c000}, {0xba06e000}, {0xba070000}, {0xba072000}, {0xba074000}, {0xba076000}, {0xba078000}, {0xba07a000}, {0xba07c000}, {0xba07e000}, {0xba080000}, {0xba082000}, {0xba084000}, {0xba086000}, {0xba088000}, {0xba08a000}, {0xba08c000}, {0xba08e000}, {0xba090000}, {0xba092000}, {0xba094000}, {0xba096000}, {0xba098000}, {0xba09a000}, {0xba09c000}, {0xba09e000}, {0xba0a0000}, {0xba0a2000}, {0xba0a4000}, {0xba0a6000}, {0xba0a8000}, {0xba0aa000}, {0xba0ac000}, {0xba0ae000}, {0xba0b0000}, {0xba0b2000}, {0xba0b4000}, {0xba0b6000}, {0xba0b8000}, {0xba0ba000}, {0xba0bc000}, {0xba0be000}, {0xba0c0000}, {0xba0c2000}, {0xba0c4000}, {0xba0c6000}, {0xba0c8000}, {0xba0ca000}, {0xba0cc000}, {0xba0ce000}, {0xba0d0000}, {0xba0d2000}, {0xba0d4000}, {0xba0d6000}, {0xba0d8000}, {0xba0da000}, {0xba0dc000}, {0xba0de000}, {0xba0e0000}, {0xba0e2000}, {0xba0e4000}, {0xba0e6000}, {0xba0e8000}, {0xba0ea000}, {0xba0ec000}, {0xba0ee000}, {0xba0f0000}, {0xba0f2000}, {0xba0f4000}, {0xba0f6000}, {0xba0f8000}, {0xba0fa000}, {0xba0fc000}, {0xba0fe000}, {0xba100000}, {0xba102000}, {0xba104000}, {0xba106000}, {0xba108000}, {0xba10a000}, {0xba10c000}, {0xba10e000}, {0xba110000}, {0xba112000}, {0xba114000}, {0xba116000}, {0xba118000}, {0xba11a000}, {0xba11c000}, {0xba11e000}, {0xba120000}, {0xba122000}, {0xba124000}, {0xba126000}, {0xba128000}, {0xba12a000}, {0xba12c000}, {0xba12e000}, {0xba130000}, {0xba132000}, {0xba134000}, {0xba136000}, {0xba138000}, {0xba13a000}, {0xba13c000}, {0xba13e000}, {0xba140000}, {0xba142000}, {0xba144000}, {0xba146000}, {0xba148000}, {0xba14a000}, {0xba14c000}, {0xba14e000}, {0xba150000}, {0xba152000}, {0xba154000}, {0xba156000}, {0xba158000}, {0xba15a000}, {0xba15c000}, {0xba15e000}, {0xba160000}, {0xba162000}, {0xba164000}, {0xba166000}, {0xba168000}, {0xba16a000}, {0xba16c000}, {0xba16e000}, {0xba170000}, {0xba172000}, {0xba174000}, {0xba176000}, {0xba178000}, {0xba17a000}, {0xba17c000}, {0xba17e000}, {0xba180000}, {0xba182000}, {0xba184000}, {0xba186000}, {0xba188000}, {0xba18a000}, {0xba18c000}, {0xba18e000}, {0xba190000}, {0xba192000}, {0xba194000}, {0xba196000}, {0xba198000}, {0xba19a000}, {0xba19c000}, {0xba19e000}, {0xba1a0000}, {0xba1a2000}, {0xba1a4000}, {0xba1a6000}, {0xba1a8000}, {0xba1aa000}, {0xba1ac000}, {0xba1ae000}, {0xba1b0000}, {0xba1b2000}, {0xba1b4000}, {0xba1b6000}, {0xba1b8000}, {0xba1ba000}, {0xba1bc000}, {0xba1be000}, {0xba1c0000}, {0xba1c2000}, {0xba1c4000}, {0xba1c6000}, {0xba1c8000}, {0xba1ca000}, {0xba1cc000}, {0xba1ce000}, {0xba1d0000}, {0xba1d2000}, {0xba1d4000}, {0xba1d6000}, {0xba1d8000}, {0xba1da000}, {0xba1dc000}, {0xba1de000}, {0xba1e0000}, {0xba1e2000}, {0xba1e4000}, {0xba1e6000}, {0xba1e8000}, {0xba1ea000}, {0xba1ec000}, {0xba1ee000}, {0xba1f0000}, {0xba1f2000}, {0xba1f4000}, {0xba1f6000}, {0xba1f8000}, {0xba1fa000}, {0xba1fc000}, {0xba1fe000}, {0xba200000}, {0xba202000}, {0xba204000}, {0xba206000}, {0xba208000}, {0xba20a000}, {0xba20c000}, {0xba20e000}, {0xba210000}, {0xba212000}, {0xba214000}, {0xba216000}, {0xba218000}, {0xba21a000}, {0xba21c000}, {0xba21e000}, {0xba220000}, {0xba222000}, {0xba224000}, {0xba226000}, {0xba228000}, {0xba22a000}, {0xba22c000}, {0xba22e000}, {0xba230000}, {0xba232000}, {0xba234000}, {0xba236000}, {0xba238000}, {0xba23a000}, {0xba23c000}, {0xba23e000}, {0xba240000}, {0xba242000}, {0xba244000}, {0xba246000}, {0xba248000}, {0xba24a000}, {0xba24c000}, {0xba24e000}, {0xba250000}, {0xba252000}, {0xba254000}, {0xba256000}, {0xba258000}, {0xba25a000}, {0xba25c000}, {0xba25e000}, {0xba260000}, {0xba262000}, {0xba264000}, {0xba266000}, {0xba268000}, {0xba26a000}, {0xba26c000}, {0xba26e000}, {0xba270000}, {0xba272000}, {0xba274000}, {0xba276000}, {0xba278000}, {0xba27a000}, {0xba27c000}, {0xba27e000}, {0xba280000}, {0xba282000}, {0xba284000}, {0xba286000}, {0xba288000}, {0xba28a000}, {0xba28c000}, {0xba28e000}, {0xba290000}, {0xba292000}, {0xba294000}, {0xba296000}, {0xba298000}, {0xba29a000}, {0xba29c000}, {0xba29e000}, {0xba2a0000}, {0xba2a2000}, {0xba2a4000}, {0xba2a6000}, {0xba2a8000}, {0xba2aa000}, {0xba2ac000}, {0xba2ae000}, {0xba2b0000}, {0xba2b2000}, {0xba2b4000}, {0xba2b6000}, {0xba2b8000}, {0xba2ba000}, {0xba2bc000}, {0xba2be000}, {0xba2c0000}, {0xba2c2000}, {0xba2c4000}, {0xba2c6000}, {0xba2c8000}, {0xba2ca000}, {0xba2cc000}, {0xba2ce000}, {0xba2d0000}, {0xba2d2000}, {0xba2d4000}, {0xba2d6000}, {0xba2d8000}, {0xba2da000}, {0xba2dc000}, {0xba2de000}, {0xba2e0000}, {0xba2e2000}, {0xba2e4000}, {0xba2e6000}, {0xba2e8000}, {0xba2ea000}, {0xba2ec000}, {0xba2ee000}, {0xba2f0000}, {0xba2f2000}, {0xba2f4000}, {0xba2f6000}, {0xba2f8000}, {0xba2fa000}, {0xba2fc000}, {0xba2fe000}, {0xba300000}, {0xba302000}, {0xba304000}, {0xba306000}, {0xba308000}, {0xba30a000}, {0xba30c000}, {0xba30e000}, {0xba310000}, {0xba312000}, {0xba314000}, {0xba316000}, {0xba318000}, {0xba31a000}, {0xba31c000}, {0xba31e000}, {0xba320000}, {0xba322000}, {0xba324000}, {0xba326000}, {0xba328000}, {0xba32a000}, {0xba32c000}, {0xba32e000}, {0xba330000}, {0xba332000}, {0xba334000}, {0xba336000}, {0xba338000}, {0xba33a000}, {0xba33c000}, {0xba33e000}, {0xba340000}, {0xba342000}, {0xba344000}, {0xba346000}, {0xba348000}, {0xba34a000}, {0xba34c000}, {0xba34e000}, {0xba350000}, {0xba352000}, {0xba354000}, {0xba356000}, {0xba358000}, {0xba35a000}, {0xba35c000}, {0xba35e000}, {0xba360000}, {0xba362000}, {0xba364000}, {0xba366000}, {0xba368000}, {0xba36a000}, {0xba36c000}, {0xba36e000}, {0xba370000}, {0xba372000}, {0xba374000}, {0xba376000}, {0xba378000}, {0xba37a000}, {0xba37c000}, {0xba37e000}, {0xba380000}, {0xba382000}, {0xba384000}, {0xba386000}, {0xba388000}, {0xba38a000}, {0xba38c000}, {0xba38e000}, {0xba390000}, {0xba392000}, {0xba394000}, {0xba396000}, {0xba398000}, {0xba39a000}, {0xba39c000}, {0xba39e000}, {0xba3a0000}, {0xba3a2000}, {0xba3a4000}, {0xba3a6000}, {0xba3a8000}, {0xba3aa000}, {0xba3ac000}, {0xba3ae000}, {0xba3b0000}, {0xba3b2000}, {0xba3b4000}, {0xba3b6000}, {0xba3b8000}, {0xba3ba000}, {0xba3bc000}, {0xba3be000}, {0xba3c0000}, {0xba3c2000}, {0xba3c4000}, {0xba3c6000}, {0xba3c8000}, {0xba3ca000}, {0xba3cc000}, {0xba3ce000}, {0xba3d0000}, {0xba3d2000}, {0xba3d4000}, {0xba3d6000}, {0xba3d8000}, {0xba3da000}, {0xba3dc000}, {0xba3de000}, {0xba3e0000}, {0xba3e2000}, {0xba3e4000}, {0xba3e6000}, {0xba3e8000}, {0xba3ea000}, {0xba3ec000}, {0xba3ee000}, {0xba3f0000}, {0xba3f2000}, {0xba3f4000}, {0xba3f6000}, {0xba3f8000}, {0xba3fa000}, {0xba3fc000}, {0xba3fe000}, {0xba400000}, {0xba402000}, {0xba404000}, {0xba406000}, {0xba408000}, {0xba40a000}, {0xba40c000}, {0xba40e000}, {0xba410000}, {0xba412000}, {0xba414000}, {0xba416000}, {0xba418000}, {0xba41a000}, {0xba41c000}, {0xba41e000}, {0xba420000}, {0xba422000}, {0xba424000}, {0xba426000}, {0xba428000}, {0xba42a000}, {0xba42c000}, {0xba42e000}, {0xba430000}, {0xba432000}, {0xba434000}, {0xba436000}, {0xba438000}, {0xba43a000}, {0xba43c000}, {0xba43e000}, {0xba440000}, {0xba442000}, {0xba444000}, {0xba446000}, {0xba448000}, {0xba44a000}, {0xba44c000}, {0xba44e000}, {0xba450000}, {0xba452000}, {0xba454000}, {0xba456000}, {0xba458000}, {0xba45a000}, {0xba45c000}, {0xba45e000}, {0xba460000}, {0xba462000}, {0xba464000}, {0xba466000}, {0xba468000}, {0xba46a000}, {0xba46c000}, {0xba46e000}, {0xba470000}, {0xba472000}, {0xba474000}, {0xba476000}, {0xba478000}, {0xba47a000}, {0xba47c000}, {0xba47e000}, {0xba480000}, {0xba482000}, {0xba484000}, {0xba486000}, {0xba488000}, {0xba48a000}, {0xba48c000}, {0xba48e000}, {0xba490000}, {0xba492000}, {0xba494000}, {0xba496000}, {0xba498000}, {0xba49a000}, {0xba49c000}, {0xba49e000}, {0xba4a0000}, {0xba4a2000}, {0xba4a4000}, {0xba4a6000}, {0xba4a8000}, {0xba4aa000}, {0xba4ac000}, {0xba4ae000}, {0xba4b0000}, {0xba4b2000}, {0xba4b4000}, {0xba4b6000}, {0xba4b8000}, {0xba4ba000}, {0xba4bc000}, {0xba4be000}, {0xba4c0000}, {0xba4c2000}, {0xba4c4000}, {0xba4c6000}, {0xba4c8000}, {0xba4ca000}, {0xba4cc000}, {0xba4ce000}, {0xba4d0000}, {0xba4d2000}, {0xba4d4000}, {0xba4d6000}, {0xba4d8000}, {0xba4da000}, {0xba4dc000}, {0xba4de000}, {0xba4e0000}, {0xba4e2000}, {0xba4e4000}, {0xba4e6000}, {0xba4e8000}, {0xba4ea000}, {0xba4ec000}, {0xba4ee000}, {0xba4f0000}, {0xba4f2000}, {0xba4f4000}, {0xba4f6000}, {0xba4f8000}, {0xba4fa000}, {0xba4fc000}, {0xba4fe000}, {0xba500000}, {0xba502000}, {0xba504000}, {0xba506000}, {0xba508000}, {0xba50a000}, {0xba50c000}, {0xba50e000}, {0xba510000}, {0xba512000}, {0xba514000}, {0xba516000}, {0xba518000}, {0xba51a000}, {0xba51c000}, {0xba51e000}, {0xba520000}, {0xba522000}, {0xba524000}, {0xba526000}, {0xba528000}, {0xba52a000}, {0xba52c000}, {0xba52e000}, {0xba530000}, {0xba532000}, {0xba534000}, {0xba536000}, {0xba538000}, {0xba53a000}, {0xba53c000}, {0xba53e000}, {0xba540000}, {0xba542000}, {0xba544000}, {0xba546000}, {0xba548000}, {0xba54a000}, {0xba54c000}, {0xba54e000}, {0xba550000}, {0xba552000}, {0xba554000}, {0xba556000}, {0xba558000}, {0xba55a000}, {0xba55c000}, {0xba55e000}, {0xba560000}, {0xba562000}, {0xba564000}, {0xba566000}, {0xba568000}, {0xba56a000}, {0xba56c000}, {0xba56e000}, {0xba570000}, {0xba572000}, {0xba574000}, {0xba576000}, {0xba578000}, {0xba57a000}, {0xba57c000}, {0xba57e000}, {0xba580000}, {0xba582000}, {0xba584000}, {0xba586000}, {0xba588000}, {0xba58a000}, {0xba58c000}, {0xba58e000}, {0xba590000}, {0xba592000}, {0xba594000}, {0xba596000}, {0xba598000}, {0xba59a000}, {0xba59c000}, {0xba59e000}, {0xba5a0000}, {0xba5a2000}, {0xba5a4000}, {0xba5a6000}, {0xba5a8000}, {0xba5aa000}, {0xba5ac000}, {0xba5ae000}, {0xba5b0000}, {0xba5b2000}, {0xba5b4000}, {0xba5b6000}, {0xba5b8000}, {0xba5ba000}, {0xba5bc000}, {0xba5be000}, {0xba5c0000}, {0xba5c2000}, {0xba5c4000}, {0xba5c6000}, {0xba5c8000}, {0xba5ca000}, {0xba5cc000}, {0xba5ce000}, {0xba5d0000}, {0xba5d2000}, {0xba5d4000}, {0xba5d6000}, {0xba5d8000}, {0xba5da000}, {0xba5dc000}, {0xba5de000}, {0xba5e0000}, {0xba5e2000}, {0xba5e4000}, {0xba5e6000}, {0xba5e8000}, {0xba5ea000}, {0xba5ec000}, {0xba5ee000}, {0xba5f0000}, {0xba5f2000}, {0xba5f4000}, {0xba5f6000}, {0xba5f8000}, {0xba5fa000}, {0xba5fc000}, {0xba5fe000}, {0xba600000}, {0xba602000}, {0xba604000}, {0xba606000}, {0xba608000}, {0xba60a000}, {0xba60c000}, {0xba60e000}, {0xba610000}, {0xba612000}, {0xba614000}, {0xba616000}, {0xba618000}, {0xba61a000}, {0xba61c000}, {0xba61e000}, {0xba620000}, {0xba622000}, {0xba624000}, {0xba626000}, {0xba628000}, {0xba62a000}, {0xba62c000}, {0xba62e000}, {0xba630000}, {0xba632000}, {0xba634000}, {0xba636000}, {0xba638000}, {0xba63a000}, {0xba63c000}, {0xba63e000}, {0xba640000}, {0xba642000}, {0xba644000}, {0xba646000}, {0xba648000}, {0xba64a000}, {0xba64c000}, {0xba64e000}, {0xba650000}, {0xba652000}, {0xba654000}, {0xba656000}, {0xba658000}, {0xba65a000}, {0xba65c000}, {0xba65e000}, {0xba660000}, {0xba662000}, {0xba664000}, {0xba666000}, {0xba668000}, {0xba66a000}, {0xba66c000}, {0xba66e000}, {0xba670000}, {0xba672000}, {0xba674000}, {0xba676000}, {0xba678000}, {0xba67a000}, {0xba67c000}, {0xba67e000}, {0xba680000}, {0xba682000}, {0xba684000}, {0xba686000}, {0xba688000}, {0xba68a000}, {0xba68c000}, {0xba68e000}, {0xba690000}, {0xba692000}, {0xba694000}, {0xba696000}, {0xba698000}, {0xba69a000}, {0xba69c000}, {0xba69e000}, {0xba6a0000}, {0xba6a2000}, {0xba6a4000}, {0xba6a6000}, {0xba6a8000}, {0xba6aa000}, {0xba6ac000}, {0xba6ae000}, {0xba6b0000}, {0xba6b2000}, {0xba6b4000}, {0xba6b6000}, {0xba6b8000}, {0xba6ba000}, {0xba6bc000}, {0xba6be000}, {0xba6c0000}, {0xba6c2000}, {0xba6c4000}, {0xba6c6000}, {0xba6c8000}, {0xba6ca000}, {0xba6cc000}, {0xba6ce000}, {0xba6d0000}, {0xba6d2000}, {0xba6d4000}, {0xba6d6000}, {0xba6d8000}, {0xba6da000}, {0xba6dc000}, {0xba6de000}, {0xba6e0000}, {0xba6e2000}, {0xba6e4000}, {0xba6e6000}, {0xba6e8000}, {0xba6ea000}, {0xba6ec000}, {0xba6ee000}, {0xba6f0000}, {0xba6f2000}, {0xba6f4000}, {0xba6f6000}, {0xba6f8000}, {0xba6fa000}, {0xba6fc000}, {0xba6fe000}, {0xba700000}, {0xba702000}, {0xba704000}, {0xba706000}, {0xba708000}, {0xba70a000}, {0xba70c000}, {0xba70e000}, {0xba710000}, {0xba712000}, {0xba714000}, {0xba716000}, {0xba718000}, {0xba71a000}, {0xba71c000}, {0xba71e000}, {0xba720000}, {0xba722000}, {0xba724000}, {0xba726000}, {0xba728000}, {0xba72a000}, {0xba72c000}, {0xba72e000}, {0xba730000}, {0xba732000}, {0xba734000}, {0xba736000}, {0xba738000}, {0xba73a000}, {0xba73c000}, {0xba73e000}, {0xba740000}, {0xba742000}, {0xba744000}, {0xba746000}, {0xba748000}, {0xba74a000}, {0xba74c000}, {0xba74e000}, {0xba750000}, {0xba752000}, {0xba754000}, {0xba756000}, {0xba758000}, {0xba75a000}, {0xba75c000}, {0xba75e000}, {0xba760000}, {0xba762000}, {0xba764000}, {0xba766000}, {0xba768000}, {0xba76a000}, {0xba76c000}, {0xba76e000}, {0xba770000}, {0xba772000}, {0xba774000}, {0xba776000}, {0xba778000}, {0xba77a000}, {0xba77c000}, {0xba77e000}, {0xba780000}, {0xba782000}, {0xba784000}, {0xba786000}, {0xba788000}, {0xba78a000}, {0xba78c000}, {0xba78e000}, {0xba790000}, {0xba792000}, {0xba794000}, {0xba796000}, {0xba798000}, {0xba79a000}, {0xba79c000}, {0xba79e000}, {0xba7a0000}, {0xba7a2000}, {0xba7a4000}, {0xba7a6000}, {0xba7a8000}, {0xba7aa000}, {0xba7ac000}, {0xba7ae000}, {0xba7b0000}, {0xba7b2000}, {0xba7b4000}, {0xba7b6000}, {0xba7b8000}, {0xba7ba000}, {0xba7bc000}, {0xba7be000}, {0xba7c0000}, {0xba7c2000}, {0xba7c4000}, {0xba7c6000}, {0xba7c8000}, {0xba7ca000}, {0xba7cc000}, {0xba7ce000}, {0xba7d0000}, {0xba7d2000}, {0xba7d4000}, {0xba7d6000}, {0xba7d8000}, {0xba7da000}, {0xba7dc000}, {0xba7de000}, {0xba7e0000}, {0xba7e2000}, {0xba7e4000}, {0xba7e6000}, {0xba7e8000}, {0xba7ea000}, {0xba7ec000}, {0xba7ee000}, {0xba7f0000}, {0xba7f2000}, {0xba7f4000}, {0xba7f6000}, {0xba7f8000}, {0xba7fa000}, {0xba7fc000}, {0xba7fe000}, {0xba800000}, {0xba802000}, {0xba804000}, {0xba806000}, {0xba808000}, {0xba80a000}, {0xba80c000}, {0xba80e000}, {0xba810000}, {0xba812000}, {0xba814000}, {0xba816000}, {0xba818000}, {0xba81a000}, {0xba81c000}, {0xba81e000}, {0xba820000}, {0xba822000}, {0xba824000}, {0xba826000}, {0xba828000}, {0xba82a000}, {0xba82c000}, {0xba82e000}, {0xba830000}, {0xba832000}, {0xba834000}, {0xba836000}, {0xba838000}, {0xba83a000}, {0xba83c000}, {0xba83e000}, {0xba840000}, {0xba842000}, {0xba844000}, {0xba846000}, {0xba848000}, {0xba84a000}, {0xba84c000}, {0xba84e000}, {0xba850000}, {0xba852000}, {0xba854000}, {0xba856000}, {0xba858000}, {0xba85a000}, {0xba85c000}, {0xba85e000}, {0xba860000}, {0xba862000}, {0xba864000}, {0xba866000}, {0xba868000}, {0xba86a000}, {0xba86c000}, {0xba86e000}, {0xba870000}, {0xba872000}, {0xba874000}, {0xba876000}, {0xba878000}, {0xba87a000}, {0xba87c000}, {0xba87e000}, {0xba880000}, {0xba882000}, {0xba884000}, {0xba886000}, {0xba888000}, {0xba88a000}, {0xba88c000}, {0xba88e000}, {0xba890000}, {0xba892000}, {0xba894000}, {0xba896000}, {0xba898000}, {0xba89a000}, {0xba89c000}, {0xba89e000}, {0xba8a0000}, {0xba8a2000}, {0xba8a4000}, {0xba8a6000}, {0xba8a8000}, {0xba8aa000}, {0xba8ac000}, {0xba8ae000}, {0xba8b0000}, {0xba8b2000}, {0xba8b4000}, {0xba8b6000}, {0xba8b8000}, {0xba8ba000}, {0xba8bc000}, {0xba8be000}, {0xba8c0000}, {0xba8c2000}, {0xba8c4000}, {0xba8c6000}, {0xba8c8000}, {0xba8ca000}, {0xba8cc000}, {0xba8ce000}, {0xba8d0000}, {0xba8d2000}, {0xba8d4000}, {0xba8d6000}, {0xba8d8000}, {0xba8da000}, {0xba8dc000}, {0xba8de000}, {0xba8e0000}, {0xba8e2000}, {0xba8e4000}, {0xba8e6000}, {0xba8e8000}, {0xba8ea000}, {0xba8ec000}, {0xba8ee000}, {0xba8f0000}, {0xba8f2000}, {0xba8f4000}, {0xba8f6000}, {0xba8f8000}, {0xba8fa000}, {0xba8fc000}, {0xba8fe000}, {0xba900000}, {0xba902000}, {0xba904000}, {0xba906000}, {0xba908000}, {0xba90a000}, {0xba90c000}, {0xba90e000}, {0xba910000}, {0xba912000}, {0xba914000}, {0xba916000}, {0xba918000}, {0xba91a000}, {0xba91c000}, {0xba91e000}, {0xba920000}, {0xba922000}, {0xba924000}, {0xba926000}, {0xba928000}, {0xba92a000}, {0xba92c000}, {0xba92e000}, {0xba930000}, {0xba932000}, {0xba934000}, {0xba936000}, {0xba938000}, {0xba93a000}, {0xba93c000}, {0xba93e000}, {0xba940000}, {0xba942000}, {0xba944000}, {0xba946000}, {0xba948000}, {0xba94a000}, {0xba94c000}, {0xba94e000}, {0xba950000}, {0xba952000}, {0xba954000}, {0xba956000}, {0xba958000}, {0xba95a000}, {0xba95c000}, {0xba95e000}, {0xba960000}, {0xba962000}, {0xba964000}, {0xba966000}, {0xba968000}, {0xba96a000}, {0xba96c000}, {0xba96e000}, {0xba970000}, {0xba972000}, {0xba974000}, {0xba976000}, {0xba978000}, {0xba97a000}, {0xba97c000}, {0xba97e000}, {0xba980000}, {0xba982000}, {0xba984000}, {0xba986000}, {0xba988000}, {0xba98a000}, {0xba98c000}, {0xba98e000}, {0xba990000}, {0xba992000}, {0xba994000}, {0xba996000}, {0xba998000}, {0xba99a000}, {0xba99c000}, {0xba99e000}, {0xba9a0000}, {0xba9a2000}, {0xba9a4000}, {0xba9a6000}, {0xba9a8000}, {0xba9aa000}, {0xba9ac000}, {0xba9ae000}, {0xba9b0000}, {0xba9b2000}, {0xba9b4000}, {0xba9b6000}, {0xba9b8000}, {0xba9ba000}, {0xba9bc000}, {0xba9be000}, {0xba9c0000}, {0xba9c2000}, {0xba9c4000}, {0xba9c6000}, {0xba9c8000}, {0xba9ca000}, {0xba9cc000}, {0xba9ce000}, {0xba9d0000}, {0xba9d2000}, {0xba9d4000}, {0xba9d6000}, {0xba9d8000}, {0xba9da000}, {0xba9dc000}, {0xba9de000}, {0xba9e0000}, {0xba9e2000}, {0xba9e4000}, {0xba9e6000}, {0xba9e8000}, {0xba9ea000}, {0xba9ec000}, {0xba9ee000}, {0xba9f0000}, {0xba9f2000}, {0xba9f4000}, {0xba9f6000}, {0xba9f8000}, {0xba9fa000}, {0xba9fc000}, {0xba9fe000}, {0xbaa00000}, {0xbaa02000}, {0xbaa04000}, {0xbaa06000}, {0xbaa08000}, {0xbaa0a000}, {0xbaa0c000}, {0xbaa0e000}, {0xbaa10000}, {0xbaa12000}, {0xbaa14000}, {0xbaa16000}, {0xbaa18000}, {0xbaa1a000}, {0xbaa1c000}, {0xbaa1e000}, {0xbaa20000}, {0xbaa22000}, {0xbaa24000}, {0xbaa26000}, {0xbaa28000}, {0xbaa2a000}, {0xbaa2c000}, {0xbaa2e000}, {0xbaa30000}, {0xbaa32000}, {0xbaa34000}, {0xbaa36000}, {0xbaa38000}, {0xbaa3a000}, {0xbaa3c000}, {0xbaa3e000}, {0xbaa40000}, {0xbaa42000}, {0xbaa44000}, {0xbaa46000}, {0xbaa48000}, {0xbaa4a000}, {0xbaa4c000}, {0xbaa4e000}, {0xbaa50000}, {0xbaa52000}, {0xbaa54000}, {0xbaa56000}, {0xbaa58000}, {0xbaa5a000}, {0xbaa5c000}, {0xbaa5e000}, {0xbaa60000}, {0xbaa62000}, {0xbaa64000}, {0xbaa66000}, {0xbaa68000}, {0xbaa6a000}, {0xbaa6c000}, {0xbaa6e000}, {0xbaa70000}, {0xbaa72000}, {0xbaa74000}, {0xbaa76000}, {0xbaa78000}, {0xbaa7a000}, {0xbaa7c000}, {0xbaa7e000}, {0xbaa80000}, {0xbaa82000}, {0xbaa84000}, {0xbaa86000}, {0xbaa88000}, {0xbaa8a000}, {0xbaa8c000}, {0xbaa8e000}, {0xbaa90000}, {0xbaa92000}, {0xbaa94000}, {0xbaa96000}, {0xbaa98000}, {0xbaa9a000}, {0xbaa9c000}, {0xbaa9e000}, {0xbaaa0000}, {0xbaaa2000}, {0xbaaa4000}, {0xbaaa6000}, {0xbaaa8000}, {0xbaaaa000}, {0xbaaac000}, {0xbaaae000}, {0xbaab0000}, {0xbaab2000}, {0xbaab4000}, {0xbaab6000}, {0xbaab8000}, {0xbaaba000}, {0xbaabc000}, {0xbaabe000}, {0xbaac0000}, {0xbaac2000}, {0xbaac4000}, {0xbaac6000}, {0xbaac8000}, {0xbaaca000}, {0xbaacc000}, {0xbaace000}, {0xbaad0000}, {0xbaad2000}, {0xbaad4000}, {0xbaad6000}, {0xbaad8000}, {0xbaada000}, {0xbaadc000}, {0xbaade000}, {0xbaae0000}, {0xbaae2000}, {0xbaae4000}, {0xbaae6000}, {0xbaae8000}, {0xbaaea000}, {0xbaaec000}, {0xbaaee000}, {0xbaaf0000}, {0xbaaf2000}, {0xbaaf4000}, {0xbaaf6000}, {0xbaaf8000}, {0xbaafa000}, {0xbaafc000}, {0xbaafe000}, {0xbab00000}, {0xbab02000}, {0xbab04000}, {0xbab06000}, {0xbab08000}, {0xbab0a000}, {0xbab0c000}, {0xbab0e000}, {0xbab10000}, {0xbab12000}, {0xbab14000}, {0xbab16000}, {0xbab18000}, {0xbab1a000}, {0xbab1c000}, {0xbab1e000}, {0xbab20000}, {0xbab22000}, {0xbab24000}, {0xbab26000}, {0xbab28000}, {0xbab2a000}, {0xbab2c000}, {0xbab2e000}, {0xbab30000}, {0xbab32000}, {0xbab34000}, {0xbab36000}, {0xbab38000}, {0xbab3a000}, {0xbab3c000}, {0xbab3e000}, {0xbab40000}, {0xbab42000}, {0xbab44000}, {0xbab46000}, {0xbab48000}, {0xbab4a000}, {0xbab4c000}, {0xbab4e000}, {0xbab50000}, {0xbab52000}, {0xbab54000}, {0xbab56000}, {0xbab58000}, {0xbab5a000}, {0xbab5c000}, {0xbab5e000}, {0xbab60000}, {0xbab62000}, {0xbab64000}, {0xbab66000}, {0xbab68000}, {0xbab6a000}, {0xbab6c000}, {0xbab6e000}, {0xbab70000}, {0xbab72000}, {0xbab74000}, {0xbab76000}, {0xbab78000}, {0xbab7a000}, {0xbab7c000}, {0xbab7e000}, {0xbab80000}, {0xbab82000}, {0xbab84000}, {0xbab86000}, {0xbab88000}, {0xbab8a000}, {0xbab8c000}, {0xbab8e000}, {0xbab90000}, {0xbab92000}, {0xbab94000}, {0xbab96000}, {0xbab98000}, {0xbab9a000}, {0xbab9c000}, {0xbab9e000}, {0xbaba0000}, {0xbaba2000}, {0xbaba4000}, {0xbaba6000}, {0xbaba8000}, {0xbabaa000}, {0xbabac000}, {0xbabae000}, {0xbabb0000}, {0xbabb2000}, {0xbabb4000}, {0xbabb6000}, {0xbabb8000}, {0xbabba000}, {0xbabbc000}, {0xbabbe000}, {0xbabc0000}, {0xbabc2000}, {0xbabc4000}, {0xbabc6000}, {0xbabc8000}, {0xbabca000}, {0xbabcc000}, {0xbabce000}, {0xbabd0000}, {0xbabd2000}, {0xbabd4000}, {0xbabd6000}, {0xbabd8000}, {0xbabda000}, {0xbabdc000}, {0xbabde000}, {0xbabe0000}, {0xbabe2000}, {0xbabe4000}, {0xbabe6000}, {0xbabe8000}, {0xbabea000}, {0xbabec000}, {0xbabee000}, {0xbabf0000}, {0xbabf2000}, {0xbabf4000}, {0xbabf6000}, {0xbabf8000}, {0xbabfa000}, {0xbabfc000}, {0xbabfe000}, {0xbac00000}, {0xbac02000}, {0xbac04000}, {0xbac06000}, {0xbac08000}, {0xbac0a000}, {0xbac0c000}, {0xbac0e000}, {0xbac10000}, {0xbac12000}, {0xbac14000}, {0xbac16000}, {0xbac18000}, {0xbac1a000}, {0xbac1c000}, {0xbac1e000}, {0xbac20000}, {0xbac22000}, {0xbac24000}, {0xbac26000}, {0xbac28000}, {0xbac2a000}, {0xbac2c000}, {0xbac2e000}, {0xbac30000}, {0xbac32000}, {0xbac34000}, {0xbac36000}, {0xbac38000}, {0xbac3a000}, {0xbac3c000}, {0xbac3e000}, {0xbac40000}, {0xbac42000}, {0xbac44000}, {0xbac46000}, {0xbac48000}, {0xbac4a000}, {0xbac4c000}, {0xbac4e000}, {0xbac50000}, {0xbac52000}, {0xbac54000}, {0xbac56000}, {0xbac58000}, {0xbac5a000}, {0xbac5c000}, {0xbac5e000}, {0xbac60000}, {0xbac62000}, {0xbac64000}, {0xbac66000}, {0xbac68000}, {0xbac6a000}, {0xbac6c000}, {0xbac6e000}, {0xbac70000}, {0xbac72000}, {0xbac74000}, {0xbac76000}, {0xbac78000}, {0xbac7a000}, {0xbac7c000}, {0xbac7e000}, {0xbac80000}, {0xbac82000}, {0xbac84000}, {0xbac86000}, {0xbac88000}, {0xbac8a000}, {0xbac8c000}, {0xbac8e000}, {0xbac90000}, {0xbac92000}, {0xbac94000}, {0xbac96000}, {0xbac98000}, {0xbac9a000}, {0xbac9c000}, {0xbac9e000}, {0xbaca0000}, {0xbaca2000}, {0xbaca4000}, {0xbaca6000}, {0xbaca8000}, {0xbacaa000}, {0xbacac000}, {0xbacae000}, {0xbacb0000}, {0xbacb2000}, {0xbacb4000}, {0xbacb6000}, {0xbacb8000}, {0xbacba000}, {0xbacbc000}, {0xbacbe000}, {0xbacc0000}, {0xbacc2000}, {0xbacc4000}, {0xbacc6000}, {0xbacc8000}, {0xbacca000}, {0xbaccc000}, {0xbacce000}, {0xbacd0000}, {0xbacd2000}, {0xbacd4000}, {0xbacd6000}, {0xbacd8000}, {0xbacda000}, {0xbacdc000}, {0xbacde000}, {0xbace0000}, {0xbace2000}, {0xbace4000}, {0xbace6000}, {0xbace8000}, {0xbacea000}, {0xbacec000}, {0xbacee000}, {0xbacf0000}, {0xbacf2000}, {0xbacf4000}, {0xbacf6000}, {0xbacf8000}, {0xbacfa000}, {0xbacfc000}, {0xbacfe000}, {0xbad00000}, {0xbad02000}, {0xbad04000}, {0xbad06000}, {0xbad08000}, {0xbad0a000}, {0xbad0c000}, {0xbad0e000}, {0xbad10000}, {0xbad12000}, {0xbad14000}, {0xbad16000}, {0xbad18000}, {0xbad1a000}, {0xbad1c000}, {0xbad1e000}, {0xbad20000}, {0xbad22000}, {0xbad24000}, {0xbad26000}, {0xbad28000}, {0xbad2a000}, {0xbad2c000}, {0xbad2e000}, {0xbad30000}, {0xbad32000}, {0xbad34000}, {0xbad36000}, {0xbad38000}, {0xbad3a000}, {0xbad3c000}, {0xbad3e000}, {0xbad40000}, {0xbad42000}, {0xbad44000}, {0xbad46000}, {0xbad48000}, {0xbad4a000}, {0xbad4c000}, {0xbad4e000}, {0xbad50000}, {0xbad52000}, {0xbad54000}, {0xbad56000}, {0xbad58000}, {0xbad5a000}, {0xbad5c000}, {0xbad5e000}, {0xbad60000}, {0xbad62000}, {0xbad64000}, {0xbad66000}, {0xbad68000}, {0xbad6a000}, {0xbad6c000}, {0xbad6e000}, {0xbad70000}, {0xbad72000}, {0xbad74000}, {0xbad76000}, {0xbad78000}, {0xbad7a000}, {0xbad7c000}, {0xbad7e000}, {0xbad80000}, {0xbad82000}, {0xbad84000}, {0xbad86000}, {0xbad88000}, {0xbad8a000}, {0xbad8c000}, {0xbad8e000}, {0xbad90000}, {0xbad92000}, {0xbad94000}, {0xbad96000}, {0xbad98000}, {0xbad9a000}, {0xbad9c000}, {0xbad9e000}, {0xbada0000}, {0xbada2000}, {0xbada4000}, {0xbada6000}, {0xbada8000}, {0xbadaa000}, {0xbadac000}, {0xbadae000}, {0xbadb0000}, {0xbadb2000}, {0xbadb4000}, {0xbadb6000}, {0xbadb8000}, {0xbadba000}, {0xbadbc000}, {0xbadbe000}, {0xbadc0000}, {0xbadc2000}, {0xbadc4000}, {0xbadc6000}, {0xbadc8000}, {0xbadca000}, {0xbadcc000}, {0xbadce000}, {0xbadd0000}, {0xbadd2000}, {0xbadd4000}, {0xbadd6000}, {0xbadd8000}, {0xbadda000}, {0xbaddc000}, {0xbadde000}, {0xbade0000}, {0xbade2000}, {0xbade4000}, {0xbade6000}, {0xbade8000}, {0xbadea000}, {0xbadec000}, {0xbadee000}, {0xbadf0000}, {0xbadf2000}, {0xbadf4000}, {0xbadf6000}, {0xbadf8000}, {0xbadfa000}, {0xbadfc000}, {0xbadfe000}, {0xbae00000}, {0xbae02000}, {0xbae04000}, {0xbae06000}, {0xbae08000}, {0xbae0a000}, {0xbae0c000}, {0xbae0e000}, {0xbae10000}, {0xbae12000}, {0xbae14000}, {0xbae16000}, {0xbae18000}, {0xbae1a000}, {0xbae1c000}, {0xbae1e000}, {0xbae20000}, {0xbae22000}, {0xbae24000}, {0xbae26000}, {0xbae28000}, {0xbae2a000}, {0xbae2c000}, {0xbae2e000}, {0xbae30000}, {0xbae32000}, {0xbae34000}, {0xbae36000}, {0xbae38000}, {0xbae3a000}, {0xbae3c000}, {0xbae3e000}, {0xbae40000}, {0xbae42000}, {0xbae44000}, {0xbae46000}, {0xbae48000}, {0xbae4a000}, {0xbae4c000}, {0xbae4e000}, {0xbae50000}, {0xbae52000}, {0xbae54000}, {0xbae56000}, {0xbae58000}, {0xbae5a000}, {0xbae5c000}, {0xbae5e000}, {0xbae60000}, {0xbae62000}, {0xbae64000}, {0xbae66000}, {0xbae68000}, {0xbae6a000}, {0xbae6c000}, {0xbae6e000}, {0xbae70000}, {0xbae72000}, {0xbae74000}, {0xbae76000}, {0xbae78000}, {0xbae7a000}, {0xbae7c000}, {0xbae7e000}, {0xbae80000}, {0xbae82000}, {0xbae84000}, {0xbae86000}, {0xbae88000}, {0xbae8a000}, {0xbae8c000}, {0xbae8e000}, {0xbae90000}, {0xbae92000}, {0xbae94000}, {0xbae96000}, {0xbae98000}, {0xbae9a000}, {0xbae9c000}, {0xbae9e000}, {0xbaea0000}, {0xbaea2000}, {0xbaea4000}, {0xbaea6000}, {0xbaea8000}, {0xbaeaa000}, {0xbaeac000}, {0xbaeae000}, {0xbaeb0000}, {0xbaeb2000}, {0xbaeb4000}, {0xbaeb6000}, {0xbaeb8000}, {0xbaeba000}, {0xbaebc000}, {0xbaebe000}, {0xbaec0000}, {0xbaec2000}, {0xbaec4000}, {0xbaec6000}, {0xbaec8000}, {0xbaeca000}, {0xbaecc000}, {0xbaece000}, {0xbaed0000}, {0xbaed2000}, {0xbaed4000}, {0xbaed6000}, {0xbaed8000}, {0xbaeda000}, {0xbaedc000}, {0xbaede000}, {0xbaee0000}, {0xbaee2000}, {0xbaee4000}, {0xbaee6000}, {0xbaee8000}, {0xbaeea000}, {0xbaeec000}, {0xbaeee000}, {0xbaef0000}, {0xbaef2000}, {0xbaef4000}, {0xbaef6000}, {0xbaef8000}, {0xbaefa000}, {0xbaefc000}, {0xbaefe000}, {0xbaf00000}, {0xbaf02000}, {0xbaf04000}, {0xbaf06000}, {0xbaf08000}, {0xbaf0a000}, {0xbaf0c000}, {0xbaf0e000}, {0xbaf10000}, {0xbaf12000}, {0xbaf14000}, {0xbaf16000}, {0xbaf18000}, {0xbaf1a000}, {0xbaf1c000}, {0xbaf1e000}, {0xbaf20000}, {0xbaf22000}, {0xbaf24000}, {0xbaf26000}, {0xbaf28000}, {0xbaf2a000}, {0xbaf2c000}, {0xbaf2e000}, {0xbaf30000}, {0xbaf32000}, {0xbaf34000}, {0xbaf36000}, {0xbaf38000}, {0xbaf3a000}, {0xbaf3c000}, {0xbaf3e000}, {0xbaf40000}, {0xbaf42000}, {0xbaf44000}, {0xbaf46000}, {0xbaf48000}, {0xbaf4a000}, {0xbaf4c000}, {0xbaf4e000}, {0xbaf50000}, {0xbaf52000}, {0xbaf54000}, {0xbaf56000}, {0xbaf58000}, {0xbaf5a000}, {0xbaf5c000}, {0xbaf5e000}, {0xbaf60000}, {0xbaf62000}, {0xbaf64000}, {0xbaf66000}, {0xbaf68000}, {0xbaf6a000}, {0xbaf6c000}, {0xbaf6e000}, {0xbaf70000}, {0xbaf72000}, {0xbaf74000}, {0xbaf76000}, {0xbaf78000}, {0xbaf7a000}, {0xbaf7c000}, {0xbaf7e000}, {0xbaf80000}, {0xbaf82000}, {0xbaf84000}, {0xbaf86000}, {0xbaf88000}, {0xbaf8a000}, {0xbaf8c000}, {0xbaf8e000}, {0xbaf90000}, {0xbaf92000}, {0xbaf94000}, {0xbaf96000}, {0xbaf98000}, {0xbaf9a000}, {0xbaf9c000}, {0xbaf9e000}, {0xbafa0000}, {0xbafa2000}, {0xbafa4000}, {0xbafa6000}, {0xbafa8000}, {0xbafaa000}, {0xbafac000}, {0xbafae000}, {0xbafb0000}, {0xbafb2000}, {0xbafb4000}, {0xbafb6000}, {0xbafb8000}, {0xbafba000}, {0xbafbc000}, {0xbafbe000}, {0xbafc0000}, {0xbafc2000}, {0xbafc4000}, {0xbafc6000}, {0xbafc8000}, {0xbafca000}, {0xbafcc000}, {0xbafce000}, {0xbafd0000}, {0xbafd2000}, {0xbafd4000}, {0xbafd6000}, {0xbafd8000}, {0xbafda000}, {0xbafdc000}, {0xbafde000}, {0xbafe0000}, {0xbafe2000}, {0xbafe4000}, {0xbafe6000}, {0xbafe8000}, {0xbafea000}, {0xbafec000}, {0xbafee000}, {0xbaff0000}, {0xbaff2000}, {0xbaff4000}, {0xbaff6000}, {0xbaff8000}, {0xbaffa000}, {0xbaffc000}, {0xbaffe000}, {0xbb000000}, {0xbb002000}, {0xbb004000}, {0xbb006000}, {0xbb008000}, {0xbb00a000}, {0xbb00c000}, {0xbb00e000}, {0xbb010000}, {0xbb012000}, {0xbb014000}, {0xbb016000}, {0xbb018000}, {0xbb01a000}, {0xbb01c000}, {0xbb01e000}, {0xbb020000}, {0xbb022000}, {0xbb024000}, {0xbb026000}, {0xbb028000}, {0xbb02a000}, {0xbb02c000}, {0xbb02e000}, {0xbb030000}, {0xbb032000}, {0xbb034000}, {0xbb036000}, {0xbb038000}, {0xbb03a000}, {0xbb03c000}, {0xbb03e000}, {0xbb040000}, {0xbb042000}, {0xbb044000}, {0xbb046000}, {0xbb048000}, {0xbb04a000}, {0xbb04c000}, {0xbb04e000}, {0xbb050000}, {0xbb052000}, {0xbb054000}, {0xbb056000}, {0xbb058000}, {0xbb05a000}, {0xbb05c000}, {0xbb05e000}, {0xbb060000}, {0xbb062000}, {0xbb064000}, {0xbb066000}, {0xbb068000}, {0xbb06a000}, {0xbb06c000}, {0xbb06e000}, {0xbb070000}, {0xbb072000}, {0xbb074000}, {0xbb076000}, {0xbb078000}, {0xbb07a000}, {0xbb07c000}, {0xbb07e000}, {0xbb080000}, {0xbb082000}, {0xbb084000}, {0xbb086000}, {0xbb088000}, {0xbb08a000}, {0xbb08c000}, {0xbb08e000}, {0xbb090000}, {0xbb092000}, {0xbb094000}, {0xbb096000}, {0xbb098000}, {0xbb09a000}, {0xbb09c000}, {0xbb09e000}, {0xbb0a0000}, {0xbb0a2000}, {0xbb0a4000}, {0xbb0a6000}, {0xbb0a8000}, {0xbb0aa000}, {0xbb0ac000}, {0xbb0ae000}, {0xbb0b0000}, {0xbb0b2000}, {0xbb0b4000}, {0xbb0b6000}, {0xbb0b8000}, {0xbb0ba000}, {0xbb0bc000}, {0xbb0be000}, {0xbb0c0000}, {0xbb0c2000}, {0xbb0c4000}, {0xbb0c6000}, {0xbb0c8000}, {0xbb0ca000}, {0xbb0cc000}, {0xbb0ce000}, {0xbb0d0000}, {0xbb0d2000}, {0xbb0d4000}, {0xbb0d6000}, {0xbb0d8000}, {0xbb0da000}, {0xbb0dc000}, {0xbb0de000}, {0xbb0e0000}, {0xbb0e2000}, {0xbb0e4000}, {0xbb0e6000}, {0xbb0e8000}, {0xbb0ea000}, {0xbb0ec000}, {0xbb0ee000}, {0xbb0f0000}, {0xbb0f2000}, {0xbb0f4000}, {0xbb0f6000}, {0xbb0f8000}, {0xbb0fa000}, {0xbb0fc000}, {0xbb0fe000}, {0xbb100000}, {0xbb102000}, {0xbb104000}, {0xbb106000}, {0xbb108000}, {0xbb10a000}, {0xbb10c000}, {0xbb10e000}, {0xbb110000}, {0xbb112000}, {0xbb114000}, {0xbb116000}, {0xbb118000}, {0xbb11a000}, {0xbb11c000}, {0xbb11e000}, {0xbb120000}, {0xbb122000}, {0xbb124000}, {0xbb126000}, {0xbb128000}, {0xbb12a000}, {0xbb12c000}, {0xbb12e000}, {0xbb130000}, {0xbb132000}, {0xbb134000}, {0xbb136000}, {0xbb138000}, {0xbb13a000}, {0xbb13c000}, {0xbb13e000}, {0xbb140000}, {0xbb142000}, {0xbb144000}, {0xbb146000}, {0xbb148000}, {0xbb14a000}, {0xbb14c000}, {0xbb14e000}, {0xbb150000}, {0xbb152000}, {0xbb154000}, {0xbb156000}, {0xbb158000}, {0xbb15a000}, {0xbb15c000}, {0xbb15e000}, {0xbb160000}, {0xbb162000}, {0xbb164000}, {0xbb166000}, {0xbb168000}, {0xbb16a000}, {0xbb16c000}, {0xbb16e000}, {0xbb170000}, {0xbb172000}, {0xbb174000}, {0xbb176000}, {0xbb178000}, {0xbb17a000}, {0xbb17c000}, {0xbb17e000}, {0xbb180000}, {0xbb182000}, {0xbb184000}, {0xbb186000}, {0xbb188000}, {0xbb18a000}, {0xbb18c000}, {0xbb18e000}, {0xbb190000}, {0xbb192000}, {0xbb194000}, {0xbb196000}, {0xbb198000}, {0xbb19a000}, {0xbb19c000}, {0xbb19e000}, {0xbb1a0000}, {0xbb1a2000}, {0xbb1a4000}, {0xbb1a6000}, {0xbb1a8000}, {0xbb1aa000}, {0xbb1ac000}, {0xbb1ae000}, {0xbb1b0000}, {0xbb1b2000}, {0xbb1b4000}, {0xbb1b6000}, {0xbb1b8000}, {0xbb1ba000}, {0xbb1bc000}, {0xbb1be000}, {0xbb1c0000}, {0xbb1c2000}, {0xbb1c4000}, {0xbb1c6000}, {0xbb1c8000}, {0xbb1ca000}, {0xbb1cc000}, {0xbb1ce000}, {0xbb1d0000}, {0xbb1d2000}, {0xbb1d4000}, {0xbb1d6000}, {0xbb1d8000}, {0xbb1da000}, {0xbb1dc000}, {0xbb1de000}, {0xbb1e0000}, {0xbb1e2000}, {0xbb1e4000}, {0xbb1e6000}, {0xbb1e8000}, {0xbb1ea000}, {0xbb1ec000}, {0xbb1ee000}, {0xbb1f0000}, {0xbb1f2000}, {0xbb1f4000}, {0xbb1f6000}, {0xbb1f8000}, {0xbb1fa000}, {0xbb1fc000}, {0xbb1fe000}, {0xbb200000}, {0xbb202000}, {0xbb204000}, {0xbb206000}, {0xbb208000}, {0xbb20a000}, {0xbb20c000}, {0xbb20e000}, {0xbb210000}, {0xbb212000}, {0xbb214000}, {0xbb216000}, {0xbb218000}, {0xbb21a000}, {0xbb21c000}, {0xbb21e000}, {0xbb220000}, {0xbb222000}, {0xbb224000}, {0xbb226000}, {0xbb228000}, {0xbb22a000}, {0xbb22c000}, {0xbb22e000}, {0xbb230000}, {0xbb232000}, {0xbb234000}, {0xbb236000}, {0xbb238000}, {0xbb23a000}, {0xbb23c000}, {0xbb23e000}, {0xbb240000}, {0xbb242000}, {0xbb244000}, {0xbb246000}, {0xbb248000}, {0xbb24a000}, {0xbb24c000}, {0xbb24e000}, {0xbb250000}, {0xbb252000}, {0xbb254000}, {0xbb256000}, {0xbb258000}, {0xbb25a000}, {0xbb25c000}, {0xbb25e000}, {0xbb260000}, {0xbb262000}, {0xbb264000}, {0xbb266000}, {0xbb268000}, {0xbb26a000}, {0xbb26c000}, {0xbb26e000}, {0xbb270000}, {0xbb272000}, {0xbb274000}, {0xbb276000}, {0xbb278000}, {0xbb27a000}, {0xbb27c000}, {0xbb27e000}, {0xbb280000}, {0xbb282000}, {0xbb284000}, {0xbb286000}, {0xbb288000}, {0xbb28a000}, {0xbb28c000}, {0xbb28e000}, {0xbb290000}, {0xbb292000}, {0xbb294000}, {0xbb296000}, {0xbb298000}, {0xbb29a000}, {0xbb29c000}, {0xbb29e000}, {0xbb2a0000}, {0xbb2a2000}, {0xbb2a4000}, {0xbb2a6000}, {0xbb2a8000}, {0xbb2aa000}, {0xbb2ac000}, {0xbb2ae000}, {0xbb2b0000}, {0xbb2b2000}, {0xbb2b4000}, {0xbb2b6000}, {0xbb2b8000}, {0xbb2ba000}, {0xbb2bc000}, {0xbb2be000}, {0xbb2c0000}, {0xbb2c2000}, {0xbb2c4000}, {0xbb2c6000}, {0xbb2c8000}, {0xbb2ca000}, {0xbb2cc000}, {0xbb2ce000}, {0xbb2d0000}, {0xbb2d2000}, {0xbb2d4000}, {0xbb2d6000}, {0xbb2d8000}, {0xbb2da000}, {0xbb2dc000}, {0xbb2de000}, {0xbb2e0000}, {0xbb2e2000}, {0xbb2e4000}, {0xbb2e6000}, {0xbb2e8000}, {0xbb2ea000}, {0xbb2ec000}, {0xbb2ee000}, {0xbb2f0000}, {0xbb2f2000}, {0xbb2f4000}, {0xbb2f6000}, {0xbb2f8000}, {0xbb2fa000}, {0xbb2fc000}, {0xbb2fe000}, {0xbb300000}, {0xbb302000}, {0xbb304000}, {0xbb306000}, {0xbb308000}, {0xbb30a000}, {0xbb30c000}, {0xbb30e000}, {0xbb310000}, {0xbb312000}, {0xbb314000}, {0xbb316000}, {0xbb318000}, {0xbb31a000}, {0xbb31c000}, {0xbb31e000}, {0xbb320000}, {0xbb322000}, {0xbb324000}, {0xbb326000}, {0xbb328000}, {0xbb32a000}, {0xbb32c000}, {0xbb32e000}, {0xbb330000}, {0xbb332000}, {0xbb334000}, {0xbb336000}, {0xbb338000}, {0xbb33a000}, {0xbb33c000}, {0xbb33e000}, {0xbb340000}, {0xbb342000}, {0xbb344000}, {0xbb346000}, {0xbb348000}, {0xbb34a000}, {0xbb34c000}, {0xbb34e000}, {0xbb350000}, {0xbb352000}, {0xbb354000}, {0xbb356000}, {0xbb358000}, {0xbb35a000}, {0xbb35c000}, {0xbb35e000}, {0xbb360000}, {0xbb362000}, {0xbb364000}, {0xbb366000}, {0xbb368000}, {0xbb36a000}, {0xbb36c000}, {0xbb36e000}, {0xbb370000}, {0xbb372000}, {0xbb374000}, {0xbb376000}, {0xbb378000}, {0xbb37a000}, {0xbb37c000}, {0xbb37e000}, {0xbb380000}, {0xbb382000}, {0xbb384000}, {0xbb386000}, {0xbb388000}, {0xbb38a000}, {0xbb38c000}, {0xbb38e000}, {0xbb390000}, {0xbb392000}, {0xbb394000}, {0xbb396000}, {0xbb398000}, {0xbb39a000}, {0xbb39c000}, {0xbb39e000}, {0xbb3a0000}, {0xbb3a2000}, {0xbb3a4000}, {0xbb3a6000}, {0xbb3a8000}, {0xbb3aa000}, {0xbb3ac000}, {0xbb3ae000}, {0xbb3b0000}, {0xbb3b2000}, {0xbb3b4000}, {0xbb3b6000}, {0xbb3b8000}, {0xbb3ba000}, {0xbb3bc000}, {0xbb3be000}, {0xbb3c0000}, {0xbb3c2000}, {0xbb3c4000}, {0xbb3c6000}, {0xbb3c8000}, {0xbb3ca000}, {0xbb3cc000}, {0xbb3ce000}, {0xbb3d0000}, {0xbb3d2000}, {0xbb3d4000}, {0xbb3d6000}, {0xbb3d8000}, {0xbb3da000}, {0xbb3dc000}, {0xbb3de000}, {0xbb3e0000}, {0xbb3e2000}, {0xbb3e4000}, {0xbb3e6000}, {0xbb3e8000}, {0xbb3ea000}, {0xbb3ec000}, {0xbb3ee000}, {0xbb3f0000}, {0xbb3f2000}, {0xbb3f4000}, {0xbb3f6000}, {0xbb3f8000}, {0xbb3fa000}, {0xbb3fc000}, {0xbb3fe000}, {0xbb400000}, {0xbb402000}, {0xbb404000}, {0xbb406000}, {0xbb408000}, {0xbb40a000}, {0xbb40c000}, {0xbb40e000}, {0xbb410000}, {0xbb412000}, {0xbb414000}, {0xbb416000}, {0xbb418000}, {0xbb41a000}, {0xbb41c000}, {0xbb41e000}, {0xbb420000}, {0xbb422000}, {0xbb424000}, {0xbb426000}, {0xbb428000}, {0xbb42a000}, {0xbb42c000}, {0xbb42e000}, {0xbb430000}, {0xbb432000}, {0xbb434000}, {0xbb436000}, {0xbb438000}, {0xbb43a000}, {0xbb43c000}, {0xbb43e000}, {0xbb440000}, {0xbb442000}, {0xbb444000}, {0xbb446000}, {0xbb448000}, {0xbb44a000}, {0xbb44c000}, {0xbb44e000}, {0xbb450000}, {0xbb452000}, {0xbb454000}, {0xbb456000}, {0xbb458000}, {0xbb45a000}, {0xbb45c000}, {0xbb45e000}, {0xbb460000}, {0xbb462000}, {0xbb464000}, {0xbb466000}, {0xbb468000}, {0xbb46a000}, {0xbb46c000}, {0xbb46e000}, {0xbb470000}, {0xbb472000}, {0xbb474000}, {0xbb476000}, {0xbb478000}, {0xbb47a000}, {0xbb47c000}, {0xbb47e000}, {0xbb480000}, {0xbb482000}, {0xbb484000}, {0xbb486000}, {0xbb488000}, {0xbb48a000}, {0xbb48c000}, {0xbb48e000}, {0xbb490000}, {0xbb492000}, {0xbb494000}, {0xbb496000}, {0xbb498000}, {0xbb49a000}, {0xbb49c000}, {0xbb49e000}, {0xbb4a0000}, {0xbb4a2000}, {0xbb4a4000}, {0xbb4a6000}, {0xbb4a8000}, {0xbb4aa000}, {0xbb4ac000}, {0xbb4ae000}, {0xbb4b0000}, {0xbb4b2000}, {0xbb4b4000}, {0xbb4b6000}, {0xbb4b8000}, {0xbb4ba000}, {0xbb4bc000}, {0xbb4be000}, {0xbb4c0000}, {0xbb4c2000}, {0xbb4c4000}, {0xbb4c6000}, {0xbb4c8000}, {0xbb4ca000}, {0xbb4cc000}, {0xbb4ce000}, {0xbb4d0000}, {0xbb4d2000}, {0xbb4d4000}, {0xbb4d6000}, {0xbb4d8000}, {0xbb4da000}, {0xbb4dc000}, {0xbb4de000}, {0xbb4e0000}, {0xbb4e2000}, {0xbb4e4000}, {0xbb4e6000}, {0xbb4e8000}, {0xbb4ea000}, {0xbb4ec000}, {0xbb4ee000}, {0xbb4f0000}, {0xbb4f2000}, {0xbb4f4000}, {0xbb4f6000}, {0xbb4f8000}, {0xbb4fa000}, {0xbb4fc000}, {0xbb4fe000}, {0xbb500000}, {0xbb502000}, {0xbb504000}, {0xbb506000}, {0xbb508000}, {0xbb50a000}, {0xbb50c000}, {0xbb50e000}, {0xbb510000}, {0xbb512000}, {0xbb514000}, {0xbb516000}, {0xbb518000}, {0xbb51a000}, {0xbb51c000}, {0xbb51e000}, {0xbb520000}, {0xbb522000}, {0xbb524000}, {0xbb526000}, {0xbb528000}, {0xbb52a000}, {0xbb52c000}, {0xbb52e000}, {0xbb530000}, {0xbb532000}, {0xbb534000}, {0xbb536000}, {0xbb538000}, {0xbb53a000}, {0xbb53c000}, {0xbb53e000}, {0xbb540000}, {0xbb542000}, {0xbb544000}, {0xbb546000}, {0xbb548000}, {0xbb54a000}, {0xbb54c000}, {0xbb54e000}, {0xbb550000}, {0xbb552000}, {0xbb554000}, {0xbb556000}, {0xbb558000}, {0xbb55a000}, {0xbb55c000}, {0xbb55e000}, {0xbb560000}, {0xbb562000}, {0xbb564000}, {0xbb566000}, {0xbb568000}, {0xbb56a000}, {0xbb56c000}, {0xbb56e000}, {0xbb570000}, {0xbb572000}, {0xbb574000}, {0xbb576000}, {0xbb578000}, {0xbb57a000}, {0xbb57c000}, {0xbb57e000}, {0xbb580000}, {0xbb582000}, {0xbb584000}, {0xbb586000}, {0xbb588000}, {0xbb58a000}, {0xbb58c000}, {0xbb58e000}, {0xbb590000}, {0xbb592000}, {0xbb594000}, {0xbb596000}, {0xbb598000}, {0xbb59a000}, {0xbb59c000}, {0xbb59e000}, {0xbb5a0000}, {0xbb5a2000}, {0xbb5a4000}, {0xbb5a6000}, {0xbb5a8000}, {0xbb5aa000}, {0xbb5ac000}, {0xbb5ae000}, {0xbb5b0000}, {0xbb5b2000}, {0xbb5b4000}, {0xbb5b6000}, {0xbb5b8000}, {0xbb5ba000}, {0xbb5bc000}, {0xbb5be000}, {0xbb5c0000}, {0xbb5c2000}, {0xbb5c4000}, {0xbb5c6000}, {0xbb5c8000}, {0xbb5ca000}, {0xbb5cc000}, {0xbb5ce000}, {0xbb5d0000}, {0xbb5d2000}, {0xbb5d4000}, {0xbb5d6000}, {0xbb5d8000}, {0xbb5da000}, {0xbb5dc000}, {0xbb5de000}, {0xbb5e0000}, {0xbb5e2000}, {0xbb5e4000}, {0xbb5e6000}, {0xbb5e8000}, {0xbb5ea000}, {0xbb5ec000}, {0xbb5ee000}, {0xbb5f0000}, {0xbb5f2000}, {0xbb5f4000}, {0xbb5f6000}, {0xbb5f8000}, {0xbb5fa000}, {0xbb5fc000}, {0xbb5fe000}, {0xbb600000}, {0xbb602000}, {0xbb604000}, {0xbb606000}, {0xbb608000}, {0xbb60a000}, {0xbb60c000}, {0xbb60e000}, {0xbb610000}, {0xbb612000}, {0xbb614000}, {0xbb616000}, {0xbb618000}, {0xbb61a000}, {0xbb61c000}, {0xbb61e000}, {0xbb620000}, {0xbb622000}, {0xbb624000}, {0xbb626000}, {0xbb628000}, {0xbb62a000}, {0xbb62c000}, {0xbb62e000}, {0xbb630000}, {0xbb632000}, {0xbb634000}, {0xbb636000}, {0xbb638000}, {0xbb63a000}, {0xbb63c000}, {0xbb63e000}, {0xbb640000}, {0xbb642000}, {0xbb644000}, {0xbb646000}, {0xbb648000}, {0xbb64a000}, {0xbb64c000}, {0xbb64e000}, {0xbb650000}, {0xbb652000}, {0xbb654000}, {0xbb656000}, {0xbb658000}, {0xbb65a000}, {0xbb65c000}, {0xbb65e000}, {0xbb660000}, {0xbb662000}, {0xbb664000}, {0xbb666000}, {0xbb668000}, {0xbb66a000}, {0xbb66c000}, {0xbb66e000}, {0xbb670000}, {0xbb672000}, {0xbb674000}, {0xbb676000}, {0xbb678000}, {0xbb67a000}, {0xbb67c000}, {0xbb67e000}, {0xbb680000}, {0xbb682000}, {0xbb684000}, {0xbb686000}, {0xbb688000}, {0xbb68a000}, {0xbb68c000}, {0xbb68e000}, {0xbb690000}, {0xbb692000}, {0xbb694000}, {0xbb696000}, {0xbb698000}, {0xbb69a000}, {0xbb69c000}, {0xbb69e000}, {0xbb6a0000}, {0xbb6a2000}, {0xbb6a4000}, {0xbb6a6000}, {0xbb6a8000}, {0xbb6aa000}, {0xbb6ac000}, {0xbb6ae000}, {0xbb6b0000}, {0xbb6b2000}, {0xbb6b4000}, {0xbb6b6000}, {0xbb6b8000}, {0xbb6ba000}, {0xbb6bc000}, {0xbb6be000}, {0xbb6c0000}, {0xbb6c2000}, {0xbb6c4000}, {0xbb6c6000}, {0xbb6c8000}, {0xbb6ca000}, {0xbb6cc000}, {0xbb6ce000}, {0xbb6d0000}, {0xbb6d2000}, {0xbb6d4000}, {0xbb6d6000}, {0xbb6d8000}, {0xbb6da000}, {0xbb6dc000}, {0xbb6de000}, {0xbb6e0000}, {0xbb6e2000}, {0xbb6e4000}, {0xbb6e6000}, {0xbb6e8000}, {0xbb6ea000}, {0xbb6ec000}, {0xbb6ee000}, {0xbb6f0000}, {0xbb6f2000}, {0xbb6f4000}, {0xbb6f6000}, {0xbb6f8000}, {0xbb6fa000}, {0xbb6fc000}, {0xbb6fe000}, {0xbb700000}, {0xbb702000}, {0xbb704000}, {0xbb706000}, {0xbb708000}, {0xbb70a000}, {0xbb70c000}, {0xbb70e000}, {0xbb710000}, {0xbb712000}, {0xbb714000}, {0xbb716000}, {0xbb718000}, {0xbb71a000}, {0xbb71c000}, {0xbb71e000}, {0xbb720000}, {0xbb722000}, {0xbb724000}, {0xbb726000}, {0xbb728000}, {0xbb72a000}, {0xbb72c000}, {0xbb72e000}, {0xbb730000}, {0xbb732000}, {0xbb734000}, {0xbb736000}, {0xbb738000}, {0xbb73a000}, {0xbb73c000}, {0xbb73e000}, {0xbb740000}, {0xbb742000}, {0xbb744000}, {0xbb746000}, {0xbb748000}, {0xbb74a000}, {0xbb74c000}, {0xbb74e000}, {0xbb750000}, {0xbb752000}, {0xbb754000}, {0xbb756000}, {0xbb758000}, {0xbb75a000}, {0xbb75c000}, {0xbb75e000}, {0xbb760000}, {0xbb762000}, {0xbb764000}, {0xbb766000}, {0xbb768000}, {0xbb76a000}, {0xbb76c000}, {0xbb76e000}, {0xbb770000}, {0xbb772000}, {0xbb774000}, {0xbb776000}, {0xbb778000}, {0xbb77a000}, {0xbb77c000}, {0xbb77e000}, {0xbb780000}, {0xbb782000}, {0xbb784000}, {0xbb786000}, {0xbb788000}, {0xbb78a000}, {0xbb78c000}, {0xbb78e000}, {0xbb790000}, {0xbb792000}, {0xbb794000}, {0xbb796000}, {0xbb798000}, {0xbb79a000}, {0xbb79c000}, {0xbb79e000}, {0xbb7a0000}, {0xbb7a2000}, {0xbb7a4000}, {0xbb7a6000}, {0xbb7a8000}, {0xbb7aa000}, {0xbb7ac000}, {0xbb7ae000}, {0xbb7b0000}, {0xbb7b2000}, {0xbb7b4000}, {0xbb7b6000}, {0xbb7b8000}, {0xbb7ba000}, {0xbb7bc000}, {0xbb7be000}, {0xbb7c0000}, {0xbb7c2000}, {0xbb7c4000}, {0xbb7c6000}, {0xbb7c8000}, {0xbb7ca000}, {0xbb7cc000}, {0xbb7ce000}, {0xbb7d0000}, {0xbb7d2000}, {0xbb7d4000}, {0xbb7d6000}, {0xbb7d8000}, {0xbb7da000}, {0xbb7dc000}, {0xbb7de000}, {0xbb7e0000}, {0xbb7e2000}, {0xbb7e4000}, {0xbb7e6000}, {0xbb7e8000}, {0xbb7ea000}, {0xbb7ec000}, {0xbb7ee000}, {0xbb7f0000}, {0xbb7f2000}, {0xbb7f4000}, {0xbb7f6000}, {0xbb7f8000}, {0xbb7fa000}, {0xbb7fc000}, {0xbb7fe000}, {0xbb800000}, {0xbb802000}, {0xbb804000}, {0xbb806000}, {0xbb808000}, {0xbb80a000}, {0xbb80c000}, {0xbb80e000}, {0xbb810000}, {0xbb812000}, {0xbb814000}, {0xbb816000}, {0xbb818000}, {0xbb81a000}, {0xbb81c000}, {0xbb81e000}, {0xbb820000}, {0xbb822000}, {0xbb824000}, {0xbb826000}, {0xbb828000}, {0xbb82a000}, {0xbb82c000}, {0xbb82e000}, {0xbb830000}, {0xbb832000}, {0xbb834000}, {0xbb836000}, {0xbb838000}, {0xbb83a000}, {0xbb83c000}, {0xbb83e000}, {0xbb840000}, {0xbb842000}, {0xbb844000}, {0xbb846000}, {0xbb848000}, {0xbb84a000}, {0xbb84c000}, {0xbb84e000}, {0xbb850000}, {0xbb852000}, {0xbb854000}, {0xbb856000}, {0xbb858000}, {0xbb85a000}, {0xbb85c000}, {0xbb85e000}, {0xbb860000}, {0xbb862000}, {0xbb864000}, {0xbb866000}, {0xbb868000}, {0xbb86a000}, {0xbb86c000}, {0xbb86e000}, {0xbb870000}, {0xbb872000}, {0xbb874000}, {0xbb876000}, {0xbb878000}, {0xbb87a000}, {0xbb87c000}, {0xbb87e000}, {0xbb880000}, {0xbb882000}, {0xbb884000}, {0xbb886000}, {0xbb888000}, {0xbb88a000}, {0xbb88c000}, {0xbb88e000}, {0xbb890000}, {0xbb892000}, {0xbb894000}, {0xbb896000}, {0xbb898000}, {0xbb89a000}, {0xbb89c000}, {0xbb89e000}, {0xbb8a0000}, {0xbb8a2000}, {0xbb8a4000}, {0xbb8a6000}, {0xbb8a8000}, {0xbb8aa000}, {0xbb8ac000}, {0xbb8ae000}, {0xbb8b0000}, {0xbb8b2000}, {0xbb8b4000}, {0xbb8b6000}, {0xbb8b8000}, {0xbb8ba000}, {0xbb8bc000}, {0xbb8be000}, {0xbb8c0000}, {0xbb8c2000}, {0xbb8c4000}, {0xbb8c6000}, {0xbb8c8000}, {0xbb8ca000}, {0xbb8cc000}, {0xbb8ce000}, {0xbb8d0000}, {0xbb8d2000}, {0xbb8d4000}, {0xbb8d6000}, {0xbb8d8000}, {0xbb8da000}, {0xbb8dc000}, {0xbb8de000}, {0xbb8e0000}, {0xbb8e2000}, {0xbb8e4000}, {0xbb8e6000}, {0xbb8e8000}, {0xbb8ea000}, {0xbb8ec000}, {0xbb8ee000}, {0xbb8f0000}, {0xbb8f2000}, {0xbb8f4000}, {0xbb8f6000}, {0xbb8f8000}, {0xbb8fa000}, {0xbb8fc000}, {0xbb8fe000}, {0xbb900000}, {0xbb902000}, {0xbb904000}, {0xbb906000}, {0xbb908000}, {0xbb90a000}, {0xbb90c000}, {0xbb90e000}, {0xbb910000}, {0xbb912000}, {0xbb914000}, {0xbb916000}, {0xbb918000}, {0xbb91a000}, {0xbb91c000}, {0xbb91e000}, {0xbb920000}, {0xbb922000}, {0xbb924000}, {0xbb926000}, {0xbb928000}, {0xbb92a000}, {0xbb92c000}, {0xbb92e000}, {0xbb930000}, {0xbb932000}, {0xbb934000}, {0xbb936000}, {0xbb938000}, {0xbb93a000}, {0xbb93c000}, {0xbb93e000}, {0xbb940000}, {0xbb942000}, {0xbb944000}, {0xbb946000}, {0xbb948000}, {0xbb94a000}, {0xbb94c000}, {0xbb94e000}, {0xbb950000}, {0xbb952000}, {0xbb954000}, {0xbb956000}, {0xbb958000}, {0xbb95a000}, {0xbb95c000}, {0xbb95e000}, {0xbb960000}, {0xbb962000}, {0xbb964000}, {0xbb966000}, {0xbb968000}, {0xbb96a000}, {0xbb96c000}, {0xbb96e000}, {0xbb970000}, {0xbb972000}, {0xbb974000}, {0xbb976000}, {0xbb978000}, {0xbb97a000}, {0xbb97c000}, {0xbb97e000}, {0xbb980000}, {0xbb982000}, {0xbb984000}, {0xbb986000}, {0xbb988000}, {0xbb98a000}, {0xbb98c000}, {0xbb98e000}, {0xbb990000}, {0xbb992000}, {0xbb994000}, {0xbb996000}, {0xbb998000}, {0xbb99a000}, {0xbb99c000}, {0xbb99e000}, {0xbb9a0000}, {0xbb9a2000}, {0xbb9a4000}, {0xbb9a6000}, {0xbb9a8000}, {0xbb9aa000}, {0xbb9ac000}, {0xbb9ae000}, {0xbb9b0000}, {0xbb9b2000}, {0xbb9b4000}, {0xbb9b6000}, {0xbb9b8000}, {0xbb9ba000}, {0xbb9bc000}, {0xbb9be000}, {0xbb9c0000}, {0xbb9c2000}, {0xbb9c4000}, {0xbb9c6000}, {0xbb9c8000}, {0xbb9ca000}, {0xbb9cc000}, {0xbb9ce000}, {0xbb9d0000}, {0xbb9d2000}, {0xbb9d4000}, {0xbb9d6000}, {0xbb9d8000}, {0xbb9da000}, {0xbb9dc000}, {0xbb9de000}, {0xbb9e0000}, {0xbb9e2000}, {0xbb9e4000}, {0xbb9e6000}, {0xbb9e8000}, {0xbb9ea000}, {0xbb9ec000}, {0xbb9ee000}, {0xbb9f0000}, {0xbb9f2000}, {0xbb9f4000}, {0xbb9f6000}, {0xbb9f8000}, {0xbb9fa000}, {0xbb9fc000}, {0xbb9fe000}, {0xbba00000}, {0xbba02000}, {0xbba04000}, {0xbba06000}, {0xbba08000}, {0xbba0a000}, {0xbba0c000}, {0xbba0e000}, {0xbba10000}, {0xbba12000}, {0xbba14000}, {0xbba16000}, {0xbba18000}, {0xbba1a000}, {0xbba1c000}, {0xbba1e000}, {0xbba20000}, {0xbba22000}, {0xbba24000}, {0xbba26000}, {0xbba28000}, {0xbba2a000}, {0xbba2c000}, {0xbba2e000}, {0xbba30000}, {0xbba32000}, {0xbba34000}, {0xbba36000}, {0xbba38000}, {0xbba3a000}, {0xbba3c000}, {0xbba3e000}, {0xbba40000}, {0xbba42000}, {0xbba44000}, {0xbba46000}, {0xbba48000}, {0xbba4a000}, {0xbba4c000}, {0xbba4e000}, {0xbba50000}, {0xbba52000}, {0xbba54000}, {0xbba56000}, {0xbba58000}, {0xbba5a000}, {0xbba5c000}, {0xbba5e000}, {0xbba60000}, {0xbba62000}, {0xbba64000}, {0xbba66000}, {0xbba68000}, {0xbba6a000}, {0xbba6c000}, {0xbba6e000}, {0xbba70000}, {0xbba72000}, {0xbba74000}, {0xbba76000}, {0xbba78000}, {0xbba7a000}, {0xbba7c000}, {0xbba7e000}, {0xbba80000}, {0xbba82000}, {0xbba84000}, {0xbba86000}, {0xbba88000}, {0xbba8a000}, {0xbba8c000}, {0xbba8e000}, {0xbba90000}, {0xbba92000}, {0xbba94000}, {0xbba96000}, {0xbba98000}, {0xbba9a000}, {0xbba9c000}, {0xbba9e000}, {0xbbaa0000}, {0xbbaa2000}, {0xbbaa4000}, {0xbbaa6000}, {0xbbaa8000}, {0xbbaaa000}, {0xbbaac000}, {0xbbaae000}, {0xbbab0000}, {0xbbab2000}, {0xbbab4000}, {0xbbab6000}, {0xbbab8000}, {0xbbaba000}, {0xbbabc000}, {0xbbabe000}, {0xbbac0000}, {0xbbac2000}, {0xbbac4000}, {0xbbac6000}, {0xbbac8000}, {0xbbaca000}, {0xbbacc000}, {0xbbace000}, {0xbbad0000}, {0xbbad2000}, {0xbbad4000}, {0xbbad6000}, {0xbbad8000}, {0xbbada000}, {0xbbadc000}, {0xbbade000}, {0xbbae0000}, {0xbbae2000}, {0xbbae4000}, {0xbbae6000}, {0xbbae8000}, {0xbbaea000}, {0xbbaec000}, {0xbbaee000}, {0xbbaf0000}, {0xbbaf2000}, {0xbbaf4000}, {0xbbaf6000}, {0xbbaf8000}, {0xbbafa000}, {0xbbafc000}, {0xbbafe000}, {0xbbb00000}, {0xbbb02000}, {0xbbb04000}, {0xbbb06000}, {0xbbb08000}, {0xbbb0a000}, {0xbbb0c000}, {0xbbb0e000}, {0xbbb10000}, {0xbbb12000}, {0xbbb14000}, {0xbbb16000}, {0xbbb18000}, {0xbbb1a000}, {0xbbb1c000}, {0xbbb1e000}, {0xbbb20000}, {0xbbb22000}, {0xbbb24000}, {0xbbb26000}, {0xbbb28000}, {0xbbb2a000}, {0xbbb2c000}, {0xbbb2e000}, {0xbbb30000}, {0xbbb32000}, {0xbbb34000}, {0xbbb36000}, {0xbbb38000}, {0xbbb3a000}, {0xbbb3c000}, {0xbbb3e000}, {0xbbb40000}, {0xbbb42000}, {0xbbb44000}, {0xbbb46000}, {0xbbb48000}, {0xbbb4a000}, {0xbbb4c000}, {0xbbb4e000}, {0xbbb50000}, {0xbbb52000}, {0xbbb54000}, {0xbbb56000}, {0xbbb58000}, {0xbbb5a000}, {0xbbb5c000}, {0xbbb5e000}, {0xbbb60000}, {0xbbb62000}, {0xbbb64000}, {0xbbb66000}, {0xbbb68000}, {0xbbb6a000}, {0xbbb6c000}, {0xbbb6e000}, {0xbbb70000}, {0xbbb72000}, {0xbbb74000}, {0xbbb76000}, {0xbbb78000}, {0xbbb7a000}, {0xbbb7c000}, {0xbbb7e000}, {0xbbb80000}, {0xbbb82000}, {0xbbb84000}, {0xbbb86000}, {0xbbb88000}, {0xbbb8a000}, {0xbbb8c000}, {0xbbb8e000}, {0xbbb90000}, {0xbbb92000}, {0xbbb94000}, {0xbbb96000}, {0xbbb98000}, {0xbbb9a000}, {0xbbb9c000}, {0xbbb9e000}, {0xbbba0000}, {0xbbba2000}, {0xbbba4000}, {0xbbba6000}, {0xbbba8000}, {0xbbbaa000}, {0xbbbac000}, {0xbbbae000}, {0xbbbb0000}, {0xbbbb2000}, {0xbbbb4000}, {0xbbbb6000}, {0xbbbb8000}, {0xbbbba000}, {0xbbbbc000}, {0xbbbbe000}, {0xbbbc0000}, {0xbbbc2000}, {0xbbbc4000}, {0xbbbc6000}, {0xbbbc8000}, {0xbbbca000}, {0xbbbcc000}, {0xbbbce000}, {0xbbbd0000}, {0xbbbd2000}, {0xbbbd4000}, {0xbbbd6000}, {0xbbbd8000}, {0xbbbda000}, {0xbbbdc000}, {0xbbbde000}, {0xbbbe0000}, {0xbbbe2000}, {0xbbbe4000}, {0xbbbe6000}, {0xbbbe8000}, {0xbbbea000}, {0xbbbec000}, {0xbbbee000}, {0xbbbf0000}, {0xbbbf2000}, {0xbbbf4000}, {0xbbbf6000}, {0xbbbf8000}, {0xbbbfa000}, {0xbbbfc000}, {0xbbbfe000}, {0xbbc00000}, {0xbbc02000}, {0xbbc04000}, {0xbbc06000}, {0xbbc08000}, {0xbbc0a000}, {0xbbc0c000}, {0xbbc0e000}, {0xbbc10000}, {0xbbc12000}, {0xbbc14000}, {0xbbc16000}, {0xbbc18000}, {0xbbc1a000}, {0xbbc1c000}, {0xbbc1e000}, {0xbbc20000}, {0xbbc22000}, {0xbbc24000}, {0xbbc26000}, {0xbbc28000}, {0xbbc2a000}, {0xbbc2c000}, {0xbbc2e000}, {0xbbc30000}, {0xbbc32000}, {0xbbc34000}, {0xbbc36000}, {0xbbc38000}, {0xbbc3a000}, {0xbbc3c000}, {0xbbc3e000}, {0xbbc40000}, {0xbbc42000}, {0xbbc44000}, {0xbbc46000}, {0xbbc48000}, {0xbbc4a000}, {0xbbc4c000}, {0xbbc4e000}, {0xbbc50000}, {0xbbc52000}, {0xbbc54000}, {0xbbc56000}, {0xbbc58000}, {0xbbc5a000}, {0xbbc5c000}, {0xbbc5e000}, {0xbbc60000}, {0xbbc62000}, {0xbbc64000}, {0xbbc66000}, {0xbbc68000}, {0xbbc6a000}, {0xbbc6c000}, {0xbbc6e000}, {0xbbc70000}, {0xbbc72000}, {0xbbc74000}, {0xbbc76000}, {0xbbc78000}, {0xbbc7a000}, {0xbbc7c000}, {0xbbc7e000}, {0xbbc80000}, {0xbbc82000}, {0xbbc84000}, {0xbbc86000}, {0xbbc88000}, {0xbbc8a000}, {0xbbc8c000}, {0xbbc8e000}, {0xbbc90000}, {0xbbc92000}, {0xbbc94000}, {0xbbc96000}, {0xbbc98000}, {0xbbc9a000}, {0xbbc9c000}, {0xbbc9e000}, {0xbbca0000}, {0xbbca2000}, {0xbbca4000}, {0xbbca6000}, {0xbbca8000}, {0xbbcaa000}, {0xbbcac000}, {0xbbcae000}, {0xbbcb0000}, {0xbbcb2000}, {0xbbcb4000}, {0xbbcb6000}, {0xbbcb8000}, {0xbbcba000}, {0xbbcbc000}, {0xbbcbe000}, {0xbbcc0000}, {0xbbcc2000}, {0xbbcc4000}, {0xbbcc6000}, {0xbbcc8000}, {0xbbcca000}, {0xbbccc000}, {0xbbcce000}, {0xbbcd0000}, {0xbbcd2000}, {0xbbcd4000}, {0xbbcd6000}, {0xbbcd8000}, {0xbbcda000}, {0xbbcdc000}, {0xbbcde000}, {0xbbce0000}, {0xbbce2000}, {0xbbce4000}, {0xbbce6000}, {0xbbce8000}, {0xbbcea000}, {0xbbcec000}, {0xbbcee000}, {0xbbcf0000}, {0xbbcf2000}, {0xbbcf4000}, {0xbbcf6000}, {0xbbcf8000}, {0xbbcfa000}, {0xbbcfc000}, {0xbbcfe000}, {0xbbd00000}, {0xbbd02000}, {0xbbd04000}, {0xbbd06000}, {0xbbd08000}, {0xbbd0a000}, {0xbbd0c000}, {0xbbd0e000}, {0xbbd10000}, {0xbbd12000}, {0xbbd14000}, {0xbbd16000}, {0xbbd18000}, {0xbbd1a000}, {0xbbd1c000}, {0xbbd1e000}, {0xbbd20000}, {0xbbd22000}, {0xbbd24000}, {0xbbd26000}, {0xbbd28000}, {0xbbd2a000}, {0xbbd2c000}, {0xbbd2e000}, {0xbbd30000}, {0xbbd32000}, {0xbbd34000}, {0xbbd36000}, {0xbbd38000}, {0xbbd3a000}, {0xbbd3c000}, {0xbbd3e000}, {0xbbd40000}, {0xbbd42000}, {0xbbd44000}, {0xbbd46000}, {0xbbd48000}, {0xbbd4a000}, {0xbbd4c000}, {0xbbd4e000}, {0xbbd50000}, {0xbbd52000}, {0xbbd54000}, {0xbbd56000}, {0xbbd58000}, {0xbbd5a000}, {0xbbd5c000}, {0xbbd5e000}, {0xbbd60000}, {0xbbd62000}, {0xbbd64000}, {0xbbd66000}, {0xbbd68000}, {0xbbd6a000}, {0xbbd6c000}, {0xbbd6e000}, {0xbbd70000}, {0xbbd72000}, {0xbbd74000}, {0xbbd76000}, {0xbbd78000}, {0xbbd7a000}, {0xbbd7c000}, {0xbbd7e000}, {0xbbd80000}, {0xbbd82000}, {0xbbd84000}, {0xbbd86000}, {0xbbd88000}, {0xbbd8a000}, {0xbbd8c000}, {0xbbd8e000}, {0xbbd90000}, {0xbbd92000}, {0xbbd94000}, {0xbbd96000}, {0xbbd98000}, {0xbbd9a000}, {0xbbd9c000}, {0xbbd9e000}, {0xbbda0000}, {0xbbda2000}, {0xbbda4000}, {0xbbda6000}, {0xbbda8000}, {0xbbdaa000}, {0xbbdac000}, {0xbbdae000}, {0xbbdb0000}, {0xbbdb2000}, {0xbbdb4000}, {0xbbdb6000}, {0xbbdb8000}, {0xbbdba000}, {0xbbdbc000}, {0xbbdbe000}, {0xbbdc0000}, {0xbbdc2000}, {0xbbdc4000}, {0xbbdc6000}, {0xbbdc8000}, {0xbbdca000}, {0xbbdcc000}, {0xbbdce000}, {0xbbdd0000}, {0xbbdd2000}, {0xbbdd4000}, {0xbbdd6000}, {0xbbdd8000}, {0xbbdda000}, {0xbbddc000}, {0xbbdde000}, {0xbbde0000}, {0xbbde2000}, {0xbbde4000}, {0xbbde6000}, {0xbbde8000}, {0xbbdea000}, {0xbbdec000}, {0xbbdee000}, {0xbbdf0000}, {0xbbdf2000}, {0xbbdf4000}, {0xbbdf6000}, {0xbbdf8000}, {0xbbdfa000}, {0xbbdfc000}, {0xbbdfe000}, {0xbbe00000}, {0xbbe02000}, {0xbbe04000}, {0xbbe06000}, {0xbbe08000}, {0xbbe0a000}, {0xbbe0c000}, {0xbbe0e000}, {0xbbe10000}, {0xbbe12000}, {0xbbe14000}, {0xbbe16000}, {0xbbe18000}, {0xbbe1a000}, {0xbbe1c000}, {0xbbe1e000}, {0xbbe20000}, {0xbbe22000}, {0xbbe24000}, {0xbbe26000}, {0xbbe28000}, {0xbbe2a000}, {0xbbe2c000}, {0xbbe2e000}, {0xbbe30000}, {0xbbe32000}, {0xbbe34000}, {0xbbe36000}, {0xbbe38000}, {0xbbe3a000}, {0xbbe3c000}, {0xbbe3e000}, {0xbbe40000}, {0xbbe42000}, {0xbbe44000}, {0xbbe46000}, {0xbbe48000}, {0xbbe4a000}, {0xbbe4c000}, {0xbbe4e000}, {0xbbe50000}, {0xbbe52000}, {0xbbe54000}, {0xbbe56000}, {0xbbe58000}, {0xbbe5a000}, {0xbbe5c000}, {0xbbe5e000}, {0xbbe60000}, {0xbbe62000}, {0xbbe64000}, {0xbbe66000}, {0xbbe68000}, {0xbbe6a000}, {0xbbe6c000}, {0xbbe6e000}, {0xbbe70000}, {0xbbe72000}, {0xbbe74000}, {0xbbe76000}, {0xbbe78000}, {0xbbe7a000}, {0xbbe7c000}, {0xbbe7e000}, {0xbbe80000}, {0xbbe82000}, {0xbbe84000}, {0xbbe86000}, {0xbbe88000}, {0xbbe8a000}, {0xbbe8c000}, {0xbbe8e000}, {0xbbe90000}, {0xbbe92000}, {0xbbe94000}, {0xbbe96000}, {0xbbe98000}, {0xbbe9a000}, {0xbbe9c000}, {0xbbe9e000}, {0xbbea0000}, {0xbbea2000}, {0xbbea4000}, {0xbbea6000}, {0xbbea8000}, {0xbbeaa000}, {0xbbeac000}, {0xbbeae000}, {0xbbeb0000}, {0xbbeb2000}, {0xbbeb4000}, {0xbbeb6000}, {0xbbeb8000}, {0xbbeba000}, {0xbbebc000}, {0xbbebe000}, {0xbbec0000}, {0xbbec2000}, {0xbbec4000}, {0xbbec6000}, {0xbbec8000}, {0xbbeca000}, {0xbbecc000}, {0xbbece000}, {0xbbed0000}, {0xbbed2000}, {0xbbed4000}, {0xbbed6000}, {0xbbed8000}, {0xbbeda000}, {0xbbedc000}, {0xbbede000}, {0xbbee0000}, {0xbbee2000}, {0xbbee4000}, {0xbbee6000}, {0xbbee8000}, {0xbbeea000}, {0xbbeec000}, {0xbbeee000}, {0xbbef0000}, {0xbbef2000}, {0xbbef4000}, {0xbbef6000}, {0xbbef8000}, {0xbbefa000}, {0xbbefc000}, {0xbbefe000}, {0xbbf00000}, {0xbbf02000}, {0xbbf04000}, {0xbbf06000}, {0xbbf08000}, {0xbbf0a000}, {0xbbf0c000}, {0xbbf0e000}, {0xbbf10000}, {0xbbf12000}, {0xbbf14000}, {0xbbf16000}, {0xbbf18000}, {0xbbf1a000}, {0xbbf1c000}, {0xbbf1e000}, {0xbbf20000}, {0xbbf22000}, {0xbbf24000}, {0xbbf26000}, {0xbbf28000}, {0xbbf2a000}, {0xbbf2c000}, {0xbbf2e000}, {0xbbf30000}, {0xbbf32000}, {0xbbf34000}, {0xbbf36000}, {0xbbf38000}, {0xbbf3a000}, {0xbbf3c000}, {0xbbf3e000}, {0xbbf40000}, {0xbbf42000}, {0xbbf44000}, {0xbbf46000}, {0xbbf48000}, {0xbbf4a000}, {0xbbf4c000}, {0xbbf4e000}, {0xbbf50000}, {0xbbf52000}, {0xbbf54000}, {0xbbf56000}, {0xbbf58000}, {0xbbf5a000}, {0xbbf5c000}, {0xbbf5e000}, {0xbbf60000}, {0xbbf62000}, {0xbbf64000}, {0xbbf66000}, {0xbbf68000}, {0xbbf6a000}, {0xbbf6c000}, {0xbbf6e000}, {0xbbf70000}, {0xbbf72000}, {0xbbf74000}, {0xbbf76000}, {0xbbf78000}, {0xbbf7a000}, {0xbbf7c000}, {0xbbf7e000}, {0xbbf80000}, {0xbbf82000}, {0xbbf84000}, {0xbbf86000}, {0xbbf88000}, {0xbbf8a000}, {0xbbf8c000}, {0xbbf8e000}, {0xbbf90000}, {0xbbf92000}, {0xbbf94000}, {0xbbf96000}, {0xbbf98000}, {0xbbf9a000}, {0xbbf9c000}, {0xbbf9e000}, {0xbbfa0000}, {0xbbfa2000}, {0xbbfa4000}, {0xbbfa6000}, {0xbbfa8000}, {0xbbfaa000}, {0xbbfac000}, {0xbbfae000}, {0xbbfb0000}, {0xbbfb2000}, {0xbbfb4000}, {0xbbfb6000}, {0xbbfb8000}, {0xbbfba000}, {0xbbfbc000}, {0xbbfbe000}, {0xbbfc0000}, {0xbbfc2000}, {0xbbfc4000}, {0xbbfc6000}, {0xbbfc8000}, {0xbbfca000}, {0xbbfcc000}, {0xbbfce000}, {0xbbfd0000}, {0xbbfd2000}, {0xbbfd4000}, {0xbbfd6000}, {0xbbfd8000}, {0xbbfda000}, {0xbbfdc000}, {0xbbfde000}, {0xbbfe0000}, {0xbbfe2000}, {0xbbfe4000}, {0xbbfe6000}, {0xbbfe8000}, {0xbbfea000}, {0xbbfec000}, {0xbbfee000}, {0xbbff0000}, {0xbbff2000}, {0xbbff4000}, {0xbbff6000}, {0xbbff8000}, {0xbbffa000}, {0xbbffc000}, {0xbbffe000}, {0xbc000000}, {0xbc002000}, {0xbc004000}, {0xbc006000}, {0xbc008000}, {0xbc00a000}, {0xbc00c000}, {0xbc00e000}, {0xbc010000}, {0xbc012000}, {0xbc014000}, {0xbc016000}, {0xbc018000}, {0xbc01a000}, {0xbc01c000}, {0xbc01e000}, {0xbc020000}, {0xbc022000}, {0xbc024000}, {0xbc026000}, {0xbc028000}, {0xbc02a000}, {0xbc02c000}, {0xbc02e000}, {0xbc030000}, {0xbc032000}, {0xbc034000}, {0xbc036000}, {0xbc038000}, {0xbc03a000}, {0xbc03c000}, {0xbc03e000}, {0xbc040000}, {0xbc042000}, {0xbc044000}, {0xbc046000}, {0xbc048000}, {0xbc04a000}, {0xbc04c000}, {0xbc04e000}, {0xbc050000}, {0xbc052000}, {0xbc054000}, {0xbc056000}, {0xbc058000}, {0xbc05a000}, {0xbc05c000}, {0xbc05e000}, {0xbc060000}, {0xbc062000}, {0xbc064000}, {0xbc066000}, {0xbc068000}, {0xbc06a000}, {0xbc06c000}, {0xbc06e000}, {0xbc070000}, {0xbc072000}, {0xbc074000}, {0xbc076000}, {0xbc078000}, {0xbc07a000}, {0xbc07c000}, {0xbc07e000}, {0xbc080000}, {0xbc082000}, {0xbc084000}, {0xbc086000}, {0xbc088000}, {0xbc08a000}, {0xbc08c000}, {0xbc08e000}, {0xbc090000}, {0xbc092000}, {0xbc094000}, {0xbc096000}, {0xbc098000}, {0xbc09a000}, {0xbc09c000}, {0xbc09e000}, {0xbc0a0000}, {0xbc0a2000}, {0xbc0a4000}, {0xbc0a6000}, {0xbc0a8000}, {0xbc0aa000}, {0xbc0ac000}, {0xbc0ae000}, {0xbc0b0000}, {0xbc0b2000}, {0xbc0b4000}, {0xbc0b6000}, {0xbc0b8000}, {0xbc0ba000}, {0xbc0bc000}, {0xbc0be000}, {0xbc0c0000}, {0xbc0c2000}, {0xbc0c4000}, {0xbc0c6000}, {0xbc0c8000}, {0xbc0ca000}, {0xbc0cc000}, {0xbc0ce000}, {0xbc0d0000}, {0xbc0d2000}, {0xbc0d4000}, {0xbc0d6000}, {0xbc0d8000}, {0xbc0da000}, {0xbc0dc000}, {0xbc0de000}, {0xbc0e0000}, {0xbc0e2000}, {0xbc0e4000}, {0xbc0e6000}, {0xbc0e8000}, {0xbc0ea000}, {0xbc0ec000}, {0xbc0ee000}, {0xbc0f0000}, {0xbc0f2000}, {0xbc0f4000}, {0xbc0f6000}, {0xbc0f8000}, {0xbc0fa000}, {0xbc0fc000}, {0xbc0fe000}, {0xbc100000}, {0xbc102000}, {0xbc104000}, {0xbc106000}, {0xbc108000}, {0xbc10a000}, {0xbc10c000}, {0xbc10e000}, {0xbc110000}, {0xbc112000}, {0xbc114000}, {0xbc116000}, {0xbc118000}, {0xbc11a000}, {0xbc11c000}, {0xbc11e000}, {0xbc120000}, {0xbc122000}, {0xbc124000}, {0xbc126000}, {0xbc128000}, {0xbc12a000}, {0xbc12c000}, {0xbc12e000}, {0xbc130000}, {0xbc132000}, {0xbc134000}, {0xbc136000}, {0xbc138000}, {0xbc13a000}, {0xbc13c000}, {0xbc13e000}, {0xbc140000}, {0xbc142000}, {0xbc144000}, {0xbc146000}, {0xbc148000}, {0xbc14a000}, {0xbc14c000}, {0xbc14e000}, {0xbc150000}, {0xbc152000}, {0xbc154000}, {0xbc156000}, {0xbc158000}, {0xbc15a000}, {0xbc15c000}, {0xbc15e000}, {0xbc160000}, {0xbc162000}, {0xbc164000}, {0xbc166000}, {0xbc168000}, {0xbc16a000}, {0xbc16c000}, {0xbc16e000}, {0xbc170000}, {0xbc172000}, {0xbc174000}, {0xbc176000}, {0xbc178000}, {0xbc17a000}, {0xbc17c000}, {0xbc17e000}, {0xbc180000}, {0xbc182000}, {0xbc184000}, {0xbc186000}, {0xbc188000}, {0xbc18a000}, {0xbc18c000}, {0xbc18e000}, {0xbc190000}, {0xbc192000}, {0xbc194000}, {0xbc196000}, {0xbc198000}, {0xbc19a000}, {0xbc19c000}, {0xbc19e000}, {0xbc1a0000}, {0xbc1a2000}, {0xbc1a4000}, {0xbc1a6000}, {0xbc1a8000}, {0xbc1aa000}, {0xbc1ac000}, {0xbc1ae000}, {0xbc1b0000}, {0xbc1b2000}, {0xbc1b4000}, {0xbc1b6000}, {0xbc1b8000}, {0xbc1ba000}, {0xbc1bc000}, {0xbc1be000}, {0xbc1c0000}, {0xbc1c2000}, {0xbc1c4000}, {0xbc1c6000}, {0xbc1c8000}, {0xbc1ca000}, {0xbc1cc000}, {0xbc1ce000}, {0xbc1d0000}, {0xbc1d2000}, {0xbc1d4000}, {0xbc1d6000}, {0xbc1d8000}, {0xbc1da000}, {0xbc1dc000}, {0xbc1de000}, {0xbc1e0000}, {0xbc1e2000}, {0xbc1e4000}, {0xbc1e6000}, {0xbc1e8000}, {0xbc1ea000}, {0xbc1ec000}, {0xbc1ee000}, {0xbc1f0000}, {0xbc1f2000}, {0xbc1f4000}, {0xbc1f6000}, {0xbc1f8000}, {0xbc1fa000}, {0xbc1fc000}, {0xbc1fe000}, {0xbc200000}, {0xbc202000}, {0xbc204000}, {0xbc206000}, {0xbc208000}, {0xbc20a000}, {0xbc20c000}, {0xbc20e000}, {0xbc210000}, {0xbc212000}, {0xbc214000}, {0xbc216000}, {0xbc218000}, {0xbc21a000}, {0xbc21c000}, {0xbc21e000}, {0xbc220000}, {0xbc222000}, {0xbc224000}, {0xbc226000}, {0xbc228000}, {0xbc22a000}, {0xbc22c000}, {0xbc22e000}, {0xbc230000}, {0xbc232000}, {0xbc234000}, {0xbc236000}, {0xbc238000}, {0xbc23a000}, {0xbc23c000}, {0xbc23e000}, {0xbc240000}, {0xbc242000}, {0xbc244000}, {0xbc246000}, {0xbc248000}, {0xbc24a000}, {0xbc24c000}, {0xbc24e000}, {0xbc250000}, {0xbc252000}, {0xbc254000}, {0xbc256000}, {0xbc258000}, {0xbc25a000}, {0xbc25c000}, {0xbc25e000}, {0xbc260000}, {0xbc262000}, {0xbc264000}, {0xbc266000}, {0xbc268000}, {0xbc26a000}, {0xbc26c000}, {0xbc26e000}, {0xbc270000}, {0xbc272000}, {0xbc274000}, {0xbc276000}, {0xbc278000}, {0xbc27a000}, {0xbc27c000}, {0xbc27e000}, {0xbc280000}, {0xbc282000}, {0xbc284000}, {0xbc286000}, {0xbc288000}, {0xbc28a000}, {0xbc28c000}, {0xbc28e000}, {0xbc290000}, {0xbc292000}, {0xbc294000}, {0xbc296000}, {0xbc298000}, {0xbc29a000}, {0xbc29c000}, {0xbc29e000}, {0xbc2a0000}, {0xbc2a2000}, {0xbc2a4000}, {0xbc2a6000}, {0xbc2a8000}, {0xbc2aa000}, {0xbc2ac000}, {0xbc2ae000}, {0xbc2b0000}, {0xbc2b2000}, {0xbc2b4000}, {0xbc2b6000}, {0xbc2b8000}, {0xbc2ba000}, {0xbc2bc000}, {0xbc2be000}, {0xbc2c0000}, {0xbc2c2000}, {0xbc2c4000}, {0xbc2c6000}, {0xbc2c8000}, {0xbc2ca000}, {0xbc2cc000}, {0xbc2ce000}, {0xbc2d0000}, {0xbc2d2000}, {0xbc2d4000}, {0xbc2d6000}, {0xbc2d8000}, {0xbc2da000}, {0xbc2dc000}, {0xbc2de000}, {0xbc2e0000}, {0xbc2e2000}, {0xbc2e4000}, {0xbc2e6000}, {0xbc2e8000}, {0xbc2ea000}, {0xbc2ec000}, {0xbc2ee000}, {0xbc2f0000}, {0xbc2f2000}, {0xbc2f4000}, {0xbc2f6000}, {0xbc2f8000}, {0xbc2fa000}, {0xbc2fc000}, {0xbc2fe000}, {0xbc300000}, {0xbc302000}, {0xbc304000}, {0xbc306000}, {0xbc308000}, {0xbc30a000}, {0xbc30c000}, {0xbc30e000}, {0xbc310000}, {0xbc312000}, {0xbc314000}, {0xbc316000}, {0xbc318000}, {0xbc31a000}, {0xbc31c000}, {0xbc31e000}, {0xbc320000}, {0xbc322000}, {0xbc324000}, {0xbc326000}, {0xbc328000}, {0xbc32a000}, {0xbc32c000}, {0xbc32e000}, {0xbc330000}, {0xbc332000}, {0xbc334000}, {0xbc336000}, {0xbc338000}, {0xbc33a000}, {0xbc33c000}, {0xbc33e000}, {0xbc340000}, {0xbc342000}, {0xbc344000}, {0xbc346000}, {0xbc348000}, {0xbc34a000}, {0xbc34c000}, {0xbc34e000}, {0xbc350000}, {0xbc352000}, {0xbc354000}, {0xbc356000}, {0xbc358000}, {0xbc35a000}, {0xbc35c000}, {0xbc35e000}, {0xbc360000}, {0xbc362000}, {0xbc364000}, {0xbc366000}, {0xbc368000}, {0xbc36a000}, {0xbc36c000}, {0xbc36e000}, {0xbc370000}, {0xbc372000}, {0xbc374000}, {0xbc376000}, {0xbc378000}, {0xbc37a000}, {0xbc37c000}, {0xbc37e000}, {0xbc380000}, {0xbc382000}, {0xbc384000}, {0xbc386000}, {0xbc388000}, {0xbc38a000}, {0xbc38c000}, {0xbc38e000}, {0xbc390000}, {0xbc392000}, {0xbc394000}, {0xbc396000}, {0xbc398000}, {0xbc39a000}, {0xbc39c000}, {0xbc39e000}, {0xbc3a0000}, {0xbc3a2000}, {0xbc3a4000}, {0xbc3a6000}, {0xbc3a8000}, {0xbc3aa000}, {0xbc3ac000}, {0xbc3ae000}, {0xbc3b0000}, {0xbc3b2000}, {0xbc3b4000}, {0xbc3b6000}, {0xbc3b8000}, {0xbc3ba000}, {0xbc3bc000}, {0xbc3be000}, {0xbc3c0000}, {0xbc3c2000}, {0xbc3c4000}, {0xbc3c6000}, {0xbc3c8000}, {0xbc3ca000}, {0xbc3cc000}, {0xbc3ce000}, {0xbc3d0000}, {0xbc3d2000}, {0xbc3d4000}, {0xbc3d6000}, {0xbc3d8000}, {0xbc3da000}, {0xbc3dc000}, {0xbc3de000}, {0xbc3e0000}, {0xbc3e2000}, {0xbc3e4000}, {0xbc3e6000}, {0xbc3e8000}, {0xbc3ea000}, {0xbc3ec000}, {0xbc3ee000}, {0xbc3f0000}, {0xbc3f2000}, {0xbc3f4000}, {0xbc3f6000}, {0xbc3f8000}, {0xbc3fa000}, {0xbc3fc000}, {0xbc3fe000}, {0xbc400000}, {0xbc402000}, {0xbc404000}, {0xbc406000}, {0xbc408000}, {0xbc40a000}, {0xbc40c000}, {0xbc40e000}, {0xbc410000}, {0xbc412000}, {0xbc414000}, {0xbc416000}, {0xbc418000}, {0xbc41a000}, {0xbc41c000}, {0xbc41e000}, {0xbc420000}, {0xbc422000}, {0xbc424000}, {0xbc426000}, {0xbc428000}, {0xbc42a000}, {0xbc42c000}, {0xbc42e000}, {0xbc430000}, {0xbc432000}, {0xbc434000}, {0xbc436000}, {0xbc438000}, {0xbc43a000}, {0xbc43c000}, {0xbc43e000}, {0xbc440000}, {0xbc442000}, {0xbc444000}, {0xbc446000}, {0xbc448000}, {0xbc44a000}, {0xbc44c000}, {0xbc44e000}, {0xbc450000}, {0xbc452000}, {0xbc454000}, {0xbc456000}, {0xbc458000}, {0xbc45a000}, {0xbc45c000}, {0xbc45e000}, {0xbc460000}, {0xbc462000}, {0xbc464000}, {0xbc466000}, {0xbc468000}, {0xbc46a000}, {0xbc46c000}, {0xbc46e000}, {0xbc470000}, {0xbc472000}, {0xbc474000}, {0xbc476000}, {0xbc478000}, {0xbc47a000}, {0xbc47c000}, {0xbc47e000}, {0xbc480000}, {0xbc482000}, {0xbc484000}, {0xbc486000}, {0xbc488000}, {0xbc48a000}, {0xbc48c000}, {0xbc48e000}, {0xbc490000}, {0xbc492000}, {0xbc494000}, {0xbc496000}, {0xbc498000}, {0xbc49a000}, {0xbc49c000}, {0xbc49e000}, {0xbc4a0000}, {0xbc4a2000}, {0xbc4a4000}, {0xbc4a6000}, {0xbc4a8000}, {0xbc4aa000}, {0xbc4ac000}, {0xbc4ae000}, {0xbc4b0000}, {0xbc4b2000}, {0xbc4b4000}, {0xbc4b6000}, {0xbc4b8000}, {0xbc4ba000}, {0xbc4bc000}, {0xbc4be000}, {0xbc4c0000}, {0xbc4c2000}, {0xbc4c4000}, {0xbc4c6000}, {0xbc4c8000}, {0xbc4ca000}, {0xbc4cc000}, {0xbc4ce000}, {0xbc4d0000}, {0xbc4d2000}, {0xbc4d4000}, {0xbc4d6000}, {0xbc4d8000}, {0xbc4da000}, {0xbc4dc000}, {0xbc4de000}, {0xbc4e0000}, {0xbc4e2000}, {0xbc4e4000}, {0xbc4e6000}, {0xbc4e8000}, {0xbc4ea000}, {0xbc4ec000}, {0xbc4ee000}, {0xbc4f0000}, {0xbc4f2000}, {0xbc4f4000}, {0xbc4f6000}, {0xbc4f8000}, {0xbc4fa000}, {0xbc4fc000}, {0xbc4fe000}, {0xbc500000}, {0xbc502000}, {0xbc504000}, {0xbc506000}, {0xbc508000}, {0xbc50a000}, {0xbc50c000}, {0xbc50e000}, {0xbc510000}, {0xbc512000}, {0xbc514000}, {0xbc516000}, {0xbc518000}, {0xbc51a000}, {0xbc51c000}, {0xbc51e000}, {0xbc520000}, {0xbc522000}, {0xbc524000}, {0xbc526000}, {0xbc528000}, {0xbc52a000}, {0xbc52c000}, {0xbc52e000}, {0xbc530000}, {0xbc532000}, {0xbc534000}, {0xbc536000}, {0xbc538000}, {0xbc53a000}, {0xbc53c000}, {0xbc53e000}, {0xbc540000}, {0xbc542000}, {0xbc544000}, {0xbc546000}, {0xbc548000}, {0xbc54a000}, {0xbc54c000}, {0xbc54e000}, {0xbc550000}, {0xbc552000}, {0xbc554000}, {0xbc556000}, {0xbc558000}, {0xbc55a000}, {0xbc55c000}, {0xbc55e000}, {0xbc560000}, {0xbc562000}, {0xbc564000}, {0xbc566000}, {0xbc568000}, {0xbc56a000}, {0xbc56c000}, {0xbc56e000}, {0xbc570000}, {0xbc572000}, {0xbc574000}, {0xbc576000}, {0xbc578000}, {0xbc57a000}, {0xbc57c000}, {0xbc57e000}, {0xbc580000}, {0xbc582000}, {0xbc584000}, {0xbc586000}, {0xbc588000}, {0xbc58a000}, {0xbc58c000}, {0xbc58e000}, {0xbc590000}, {0xbc592000}, {0xbc594000}, {0xbc596000}, {0xbc598000}, {0xbc59a000}, {0xbc59c000}, {0xbc59e000}, {0xbc5a0000}, {0xbc5a2000}, {0xbc5a4000}, {0xbc5a6000}, {0xbc5a8000}, {0xbc5aa000}, {0xbc5ac000}, {0xbc5ae000}, {0xbc5b0000}, {0xbc5b2000}, {0xbc5b4000}, {0xbc5b6000}, {0xbc5b8000}, {0xbc5ba000}, {0xbc5bc000}, {0xbc5be000}, {0xbc5c0000}, {0xbc5c2000}, {0xbc5c4000}, {0xbc5c6000}, {0xbc5c8000}, {0xbc5ca000}, {0xbc5cc000}, {0xbc5ce000}, {0xbc5d0000}, {0xbc5d2000}, {0xbc5d4000}, {0xbc5d6000}, {0xbc5d8000}, {0xbc5da000}, {0xbc5dc000}, {0xbc5de000}, {0xbc5e0000}, {0xbc5e2000}, {0xbc5e4000}, {0xbc5e6000}, {0xbc5e8000}, {0xbc5ea000}, {0xbc5ec000}, {0xbc5ee000}, {0xbc5f0000}, {0xbc5f2000}, {0xbc5f4000}, {0xbc5f6000}, {0xbc5f8000}, {0xbc5fa000}, {0xbc5fc000}, {0xbc5fe000}, {0xbc600000}, {0xbc602000}, {0xbc604000}, {0xbc606000}, {0xbc608000}, {0xbc60a000}, {0xbc60c000}, {0xbc60e000}, {0xbc610000}, {0xbc612000}, {0xbc614000}, {0xbc616000}, {0xbc618000}, {0xbc61a000}, {0xbc61c000}, {0xbc61e000}, {0xbc620000}, {0xbc622000}, {0xbc624000}, {0xbc626000}, {0xbc628000}, {0xbc62a000}, {0xbc62c000}, {0xbc62e000}, {0xbc630000}, {0xbc632000}, {0xbc634000}, {0xbc636000}, {0xbc638000}, {0xbc63a000}, {0xbc63c000}, {0xbc63e000}, {0xbc640000}, {0xbc642000}, {0xbc644000}, {0xbc646000}, {0xbc648000}, {0xbc64a000}, {0xbc64c000}, {0xbc64e000}, {0xbc650000}, {0xbc652000}, {0xbc654000}, {0xbc656000}, {0xbc658000}, {0xbc65a000}, {0xbc65c000}, {0xbc65e000}, {0xbc660000}, {0xbc662000}, {0xbc664000}, {0xbc666000}, {0xbc668000}, {0xbc66a000}, {0xbc66c000}, {0xbc66e000}, {0xbc670000}, {0xbc672000}, {0xbc674000}, {0xbc676000}, {0xbc678000}, {0xbc67a000}, {0xbc67c000}, {0xbc67e000}, {0xbc680000}, {0xbc682000}, {0xbc684000}, {0xbc686000}, {0xbc688000}, {0xbc68a000}, {0xbc68c000}, {0xbc68e000}, {0xbc690000}, {0xbc692000}, {0xbc694000}, {0xbc696000}, {0xbc698000}, {0xbc69a000}, {0xbc69c000}, {0xbc69e000}, {0xbc6a0000}, {0xbc6a2000}, {0xbc6a4000}, {0xbc6a6000}, {0xbc6a8000}, {0xbc6aa000}, {0xbc6ac000}, {0xbc6ae000}, {0xbc6b0000}, {0xbc6b2000}, {0xbc6b4000}, {0xbc6b6000}, {0xbc6b8000}, {0xbc6ba000}, {0xbc6bc000}, {0xbc6be000}, {0xbc6c0000}, {0xbc6c2000}, {0xbc6c4000}, {0xbc6c6000}, {0xbc6c8000}, {0xbc6ca000}, {0xbc6cc000}, {0xbc6ce000}, {0xbc6d0000}, {0xbc6d2000}, {0xbc6d4000}, {0xbc6d6000}, {0xbc6d8000}, {0xbc6da000}, {0xbc6dc000}, {0xbc6de000}, {0xbc6e0000}, {0xbc6e2000}, {0xbc6e4000}, {0xbc6e6000}, {0xbc6e8000}, {0xbc6ea000}, {0xbc6ec000}, {0xbc6ee000}, {0xbc6f0000}, {0xbc6f2000}, {0xbc6f4000}, {0xbc6f6000}, {0xbc6f8000}, {0xbc6fa000}, {0xbc6fc000}, {0xbc6fe000}, {0xbc700000}, {0xbc702000}, {0xbc704000}, {0xbc706000}, {0xbc708000}, {0xbc70a000}, {0xbc70c000}, {0xbc70e000}, {0xbc710000}, {0xbc712000}, {0xbc714000}, {0xbc716000}, {0xbc718000}, {0xbc71a000}, {0xbc71c000}, {0xbc71e000}, {0xbc720000}, {0xbc722000}, {0xbc724000}, {0xbc726000}, {0xbc728000}, {0xbc72a000}, {0xbc72c000}, {0xbc72e000}, {0xbc730000}, {0xbc732000}, {0xbc734000}, {0xbc736000}, {0xbc738000}, {0xbc73a000}, {0xbc73c000}, {0xbc73e000}, {0xbc740000}, {0xbc742000}, {0xbc744000}, {0xbc746000}, {0xbc748000}, {0xbc74a000}, {0xbc74c000}, {0xbc74e000}, {0xbc750000}, {0xbc752000}, {0xbc754000}, {0xbc756000}, {0xbc758000}, {0xbc75a000}, {0xbc75c000}, {0xbc75e000}, {0xbc760000}, {0xbc762000}, {0xbc764000}, {0xbc766000}, {0xbc768000}, {0xbc76a000}, {0xbc76c000}, {0xbc76e000}, {0xbc770000}, {0xbc772000}, {0xbc774000}, {0xbc776000}, {0xbc778000}, {0xbc77a000}, {0xbc77c000}, {0xbc77e000}, {0xbc780000}, {0xbc782000}, {0xbc784000}, {0xbc786000}, {0xbc788000}, {0xbc78a000}, {0xbc78c000}, {0xbc78e000}, {0xbc790000}, {0xbc792000}, {0xbc794000}, {0xbc796000}, {0xbc798000}, {0xbc79a000}, {0xbc79c000}, {0xbc79e000}, {0xbc7a0000}, {0xbc7a2000}, {0xbc7a4000}, {0xbc7a6000}, {0xbc7a8000}, {0xbc7aa000}, {0xbc7ac000}, {0xbc7ae000}, {0xbc7b0000}, {0xbc7b2000}, {0xbc7b4000}, {0xbc7b6000}, {0xbc7b8000}, {0xbc7ba000}, {0xbc7bc000}, {0xbc7be000}, {0xbc7c0000}, {0xbc7c2000}, {0xbc7c4000}, {0xbc7c6000}, {0xbc7c8000}, {0xbc7ca000}, {0xbc7cc000}, {0xbc7ce000}, {0xbc7d0000}, {0xbc7d2000}, {0xbc7d4000}, {0xbc7d6000}, {0xbc7d8000}, {0xbc7da000}, {0xbc7dc000}, {0xbc7de000}, {0xbc7e0000}, {0xbc7e2000}, {0xbc7e4000}, {0xbc7e6000}, {0xbc7e8000}, {0xbc7ea000}, {0xbc7ec000}, {0xbc7ee000}, {0xbc7f0000}, {0xbc7f2000}, {0xbc7f4000}, {0xbc7f6000}, {0xbc7f8000}, {0xbc7fa000}, {0xbc7fc000}, {0xbc7fe000}, {0xbc800000}, {0xbc802000}, {0xbc804000}, {0xbc806000}, {0xbc808000}, {0xbc80a000}, {0xbc80c000}, {0xbc80e000}, {0xbc810000}, {0xbc812000}, {0xbc814000}, {0xbc816000}, {0xbc818000}, {0xbc81a000}, {0xbc81c000}, {0xbc81e000}, {0xbc820000}, {0xbc822000}, {0xbc824000}, {0xbc826000}, {0xbc828000}, {0xbc82a000}, {0xbc82c000}, {0xbc82e000}, {0xbc830000}, {0xbc832000}, {0xbc834000}, {0xbc836000}, {0xbc838000}, {0xbc83a000}, {0xbc83c000}, {0xbc83e000}, {0xbc840000}, {0xbc842000}, {0xbc844000}, {0xbc846000}, {0xbc848000}, {0xbc84a000}, {0xbc84c000}, {0xbc84e000}, {0xbc850000}, {0xbc852000}, {0xbc854000}, {0xbc856000}, {0xbc858000}, {0xbc85a000}, {0xbc85c000}, {0xbc85e000}, {0xbc860000}, {0xbc862000}, {0xbc864000}, {0xbc866000}, {0xbc868000}, {0xbc86a000}, {0xbc86c000}, {0xbc86e000}, {0xbc870000}, {0xbc872000}, {0xbc874000}, {0xbc876000}, {0xbc878000}, {0xbc87a000}, {0xbc87c000}, {0xbc87e000}, {0xbc880000}, {0xbc882000}, {0xbc884000}, {0xbc886000}, {0xbc888000}, {0xbc88a000}, {0xbc88c000}, {0xbc88e000}, {0xbc890000}, {0xbc892000}, {0xbc894000}, {0xbc896000}, {0xbc898000}, {0xbc89a000}, {0xbc89c000}, {0xbc89e000}, {0xbc8a0000}, {0xbc8a2000}, {0xbc8a4000}, {0xbc8a6000}, {0xbc8a8000}, {0xbc8aa000}, {0xbc8ac000}, {0xbc8ae000}, {0xbc8b0000}, {0xbc8b2000}, {0xbc8b4000}, {0xbc8b6000}, {0xbc8b8000}, {0xbc8ba000}, {0xbc8bc000}, {0xbc8be000}, {0xbc8c0000}, {0xbc8c2000}, {0xbc8c4000}, {0xbc8c6000}, {0xbc8c8000}, {0xbc8ca000}, {0xbc8cc000}, {0xbc8ce000}, {0xbc8d0000}, {0xbc8d2000}, {0xbc8d4000}, {0xbc8d6000}, {0xbc8d8000}, {0xbc8da000}, {0xbc8dc000}, {0xbc8de000}, {0xbc8e0000}, {0xbc8e2000}, {0xbc8e4000}, {0xbc8e6000}, {0xbc8e8000}, {0xbc8ea000}, {0xbc8ec000}, {0xbc8ee000}, {0xbc8f0000}, {0xbc8f2000}, {0xbc8f4000}, {0xbc8f6000}, {0xbc8f8000}, {0xbc8fa000}, {0xbc8fc000}, {0xbc8fe000}, {0xbc900000}, {0xbc902000}, {0xbc904000}, {0xbc906000}, {0xbc908000}, {0xbc90a000}, {0xbc90c000}, {0xbc90e000}, {0xbc910000}, {0xbc912000}, {0xbc914000}, {0xbc916000}, {0xbc918000}, {0xbc91a000}, {0xbc91c000}, {0xbc91e000}, {0xbc920000}, {0xbc922000}, {0xbc924000}, {0xbc926000}, {0xbc928000}, {0xbc92a000}, {0xbc92c000}, {0xbc92e000}, {0xbc930000}, {0xbc932000}, {0xbc934000}, {0xbc936000}, {0xbc938000}, {0xbc93a000}, {0xbc93c000}, {0xbc93e000}, {0xbc940000}, {0xbc942000}, {0xbc944000}, {0xbc946000}, {0xbc948000}, {0xbc94a000}, {0xbc94c000}, {0xbc94e000}, {0xbc950000}, {0xbc952000}, {0xbc954000}, {0xbc956000}, {0xbc958000}, {0xbc95a000}, {0xbc95c000}, {0xbc95e000}, {0xbc960000}, {0xbc962000}, {0xbc964000}, {0xbc966000}, {0xbc968000}, {0xbc96a000}, {0xbc96c000}, {0xbc96e000}, {0xbc970000}, {0xbc972000}, {0xbc974000}, {0xbc976000}, {0xbc978000}, {0xbc97a000}, {0xbc97c000}, {0xbc97e000}, {0xbc980000}, {0xbc982000}, {0xbc984000}, {0xbc986000}, {0xbc988000}, {0xbc98a000}, {0xbc98c000}, {0xbc98e000}, {0xbc990000}, {0xbc992000}, {0xbc994000}, {0xbc996000}, {0xbc998000}, {0xbc99a000}, {0xbc99c000}, {0xbc99e000}, {0xbc9a0000}, {0xbc9a2000}, {0xbc9a4000}, {0xbc9a6000}, {0xbc9a8000}, {0xbc9aa000}, {0xbc9ac000}, {0xbc9ae000}, {0xbc9b0000}, {0xbc9b2000}, {0xbc9b4000}, {0xbc9b6000}, {0xbc9b8000}, {0xbc9ba000}, {0xbc9bc000}, {0xbc9be000}, {0xbc9c0000}, {0xbc9c2000}, {0xbc9c4000}, {0xbc9c6000}, {0xbc9c8000}, {0xbc9ca000}, {0xbc9cc000}, {0xbc9ce000}, {0xbc9d0000}, {0xbc9d2000}, {0xbc9d4000}, {0xbc9d6000}, {0xbc9d8000}, {0xbc9da000}, {0xbc9dc000}, {0xbc9de000}, {0xbc9e0000}, {0xbc9e2000}, {0xbc9e4000}, {0xbc9e6000}, {0xbc9e8000}, {0xbc9ea000}, {0xbc9ec000}, {0xbc9ee000}, {0xbc9f0000}, {0xbc9f2000}, {0xbc9f4000}, {0xbc9f6000}, {0xbc9f8000}, {0xbc9fa000}, {0xbc9fc000}, {0xbc9fe000}, {0xbca00000}, {0xbca02000}, {0xbca04000}, {0xbca06000}, {0xbca08000}, {0xbca0a000}, {0xbca0c000}, {0xbca0e000}, {0xbca10000}, {0xbca12000}, {0xbca14000}, {0xbca16000}, {0xbca18000}, {0xbca1a000}, {0xbca1c000}, {0xbca1e000}, {0xbca20000}, {0xbca22000}, {0xbca24000}, {0xbca26000}, {0xbca28000}, {0xbca2a000}, {0xbca2c000}, {0xbca2e000}, {0xbca30000}, {0xbca32000}, {0xbca34000}, {0xbca36000}, {0xbca38000}, {0xbca3a000}, {0xbca3c000}, {0xbca3e000}, {0xbca40000}, {0xbca42000}, {0xbca44000}, {0xbca46000}, {0xbca48000}, {0xbca4a000}, {0xbca4c000}, {0xbca4e000}, {0xbca50000}, {0xbca52000}, {0xbca54000}, {0xbca56000}, {0xbca58000}, {0xbca5a000}, {0xbca5c000}, {0xbca5e000}, {0xbca60000}, {0xbca62000}, {0xbca64000}, {0xbca66000}, {0xbca68000}, {0xbca6a000}, {0xbca6c000}, {0xbca6e000}, {0xbca70000}, {0xbca72000}, {0xbca74000}, {0xbca76000}, {0xbca78000}, {0xbca7a000}, {0xbca7c000}, {0xbca7e000}, {0xbca80000}, {0xbca82000}, {0xbca84000}, {0xbca86000}, {0xbca88000}, {0xbca8a000}, {0xbca8c000}, {0xbca8e000}, {0xbca90000}, {0xbca92000}, {0xbca94000}, {0xbca96000}, {0xbca98000}, {0xbca9a000}, {0xbca9c000}, {0xbca9e000}, {0xbcaa0000}, {0xbcaa2000}, {0xbcaa4000}, {0xbcaa6000}, {0xbcaa8000}, {0xbcaaa000}, {0xbcaac000}, {0xbcaae000}, {0xbcab0000}, {0xbcab2000}, {0xbcab4000}, {0xbcab6000}, {0xbcab8000}, {0xbcaba000}, {0xbcabc000}, {0xbcabe000}, {0xbcac0000}, {0xbcac2000}, {0xbcac4000}, {0xbcac6000}, {0xbcac8000}, {0xbcaca000}, {0xbcacc000}, {0xbcace000}, {0xbcad0000}, {0xbcad2000}, {0xbcad4000}, {0xbcad6000}, {0xbcad8000}, {0xbcada000}, {0xbcadc000}, {0xbcade000}, {0xbcae0000}, {0xbcae2000}, {0xbcae4000}, {0xbcae6000}, {0xbcae8000}, {0xbcaea000}, {0xbcaec000}, {0xbcaee000}, {0xbcaf0000}, {0xbcaf2000}, {0xbcaf4000}, {0xbcaf6000}, {0xbcaf8000}, {0xbcafa000}, {0xbcafc000}, {0xbcafe000}, {0xbcb00000}, {0xbcb02000}, {0xbcb04000}, {0xbcb06000}, {0xbcb08000}, {0xbcb0a000}, {0xbcb0c000}, {0xbcb0e000}, {0xbcb10000}, {0xbcb12000}, {0xbcb14000}, {0xbcb16000}, {0xbcb18000}, {0xbcb1a000}, {0xbcb1c000}, {0xbcb1e000}, {0xbcb20000}, {0xbcb22000}, {0xbcb24000}, {0xbcb26000}, {0xbcb28000}, {0xbcb2a000}, {0xbcb2c000}, {0xbcb2e000}, {0xbcb30000}, {0xbcb32000}, {0xbcb34000}, {0xbcb36000}, {0xbcb38000}, {0xbcb3a000}, {0xbcb3c000}, {0xbcb3e000}, {0xbcb40000}, {0xbcb42000}, {0xbcb44000}, {0xbcb46000}, {0xbcb48000}, {0xbcb4a000}, {0xbcb4c000}, {0xbcb4e000}, {0xbcb50000}, {0xbcb52000}, {0xbcb54000}, {0xbcb56000}, {0xbcb58000}, {0xbcb5a000}, {0xbcb5c000}, {0xbcb5e000}, {0xbcb60000}, {0xbcb62000}, {0xbcb64000}, {0xbcb66000}, {0xbcb68000}, {0xbcb6a000}, {0xbcb6c000}, {0xbcb6e000}, {0xbcb70000}, {0xbcb72000}, {0xbcb74000}, {0xbcb76000}, {0xbcb78000}, {0xbcb7a000}, {0xbcb7c000}, {0xbcb7e000}, {0xbcb80000}, {0xbcb82000}, {0xbcb84000}, {0xbcb86000}, {0xbcb88000}, {0xbcb8a000}, {0xbcb8c000}, {0xbcb8e000}, {0xbcb90000}, {0xbcb92000}, {0xbcb94000}, {0xbcb96000}, {0xbcb98000}, {0xbcb9a000}, {0xbcb9c000}, {0xbcb9e000}, {0xbcba0000}, {0xbcba2000}, {0xbcba4000}, {0xbcba6000}, {0xbcba8000}, {0xbcbaa000}, {0xbcbac000}, {0xbcbae000}, {0xbcbb0000}, {0xbcbb2000}, {0xbcbb4000}, {0xbcbb6000}, {0xbcbb8000}, {0xbcbba000}, {0xbcbbc000}, {0xbcbbe000}, {0xbcbc0000}, {0xbcbc2000}, {0xbcbc4000}, {0xbcbc6000}, {0xbcbc8000}, {0xbcbca000}, {0xbcbcc000}, {0xbcbce000}, {0xbcbd0000}, {0xbcbd2000}, {0xbcbd4000}, {0xbcbd6000}, {0xbcbd8000}, {0xbcbda000}, {0xbcbdc000}, {0xbcbde000}, {0xbcbe0000}, {0xbcbe2000}, {0xbcbe4000}, {0xbcbe6000}, {0xbcbe8000}, {0xbcbea000}, {0xbcbec000}, {0xbcbee000}, {0xbcbf0000}, {0xbcbf2000}, {0xbcbf4000}, {0xbcbf6000}, {0xbcbf8000}, {0xbcbfa000}, {0xbcbfc000}, {0xbcbfe000}, {0xbcc00000}, {0xbcc02000}, {0xbcc04000}, {0xbcc06000}, {0xbcc08000}, {0xbcc0a000}, {0xbcc0c000}, {0xbcc0e000}, {0xbcc10000}, {0xbcc12000}, {0xbcc14000}, {0xbcc16000}, {0xbcc18000}, {0xbcc1a000}, {0xbcc1c000}, {0xbcc1e000}, {0xbcc20000}, {0xbcc22000}, {0xbcc24000}, {0xbcc26000}, {0xbcc28000}, {0xbcc2a000}, {0xbcc2c000}, {0xbcc2e000}, {0xbcc30000}, {0xbcc32000}, {0xbcc34000}, {0xbcc36000}, {0xbcc38000}, {0xbcc3a000}, {0xbcc3c000}, {0xbcc3e000}, {0xbcc40000}, {0xbcc42000}, {0xbcc44000}, {0xbcc46000}, {0xbcc48000}, {0xbcc4a000}, {0xbcc4c000}, {0xbcc4e000}, {0xbcc50000}, {0xbcc52000}, {0xbcc54000}, {0xbcc56000}, {0xbcc58000}, {0xbcc5a000}, {0xbcc5c000}, {0xbcc5e000}, {0xbcc60000}, {0xbcc62000}, {0xbcc64000}, {0xbcc66000}, {0xbcc68000}, {0xbcc6a000}, {0xbcc6c000}, {0xbcc6e000}, {0xbcc70000}, {0xbcc72000}, {0xbcc74000}, {0xbcc76000}, {0xbcc78000}, {0xbcc7a000}, {0xbcc7c000}, {0xbcc7e000}, {0xbcc80000}, {0xbcc82000}, {0xbcc84000}, {0xbcc86000}, {0xbcc88000}, {0xbcc8a000}, {0xbcc8c000}, {0xbcc8e000}, {0xbcc90000}, {0xbcc92000}, {0xbcc94000}, {0xbcc96000}, {0xbcc98000}, {0xbcc9a000}, {0xbcc9c000}, {0xbcc9e000}, {0xbcca0000}, {0xbcca2000}, {0xbcca4000}, {0xbcca6000}, {0xbcca8000}, {0xbccaa000}, {0xbccac000}, {0xbccae000}, {0xbccb0000}, {0xbccb2000}, {0xbccb4000}, {0xbccb6000}, {0xbccb8000}, {0xbccba000}, {0xbccbc000}, {0xbccbe000}, {0xbccc0000}, {0xbccc2000}, {0xbccc4000}, {0xbccc6000}, {0xbccc8000}, {0xbccca000}, {0xbcccc000}, {0xbccce000}, {0xbccd0000}, {0xbccd2000}, {0xbccd4000}, {0xbccd6000}, {0xbccd8000}, {0xbccda000}, {0xbccdc000}, {0xbccde000}, {0xbcce0000}, {0xbcce2000}, {0xbcce4000}, {0xbcce6000}, {0xbcce8000}, {0xbccea000}, {0xbccec000}, {0xbccee000}, {0xbccf0000}, {0xbccf2000}, {0xbccf4000}, {0xbccf6000}, {0xbccf8000}, {0xbccfa000}, {0xbccfc000}, {0xbccfe000}, {0xbcd00000}, {0xbcd02000}, {0xbcd04000}, {0xbcd06000}, {0xbcd08000}, {0xbcd0a000}, {0xbcd0c000}, {0xbcd0e000}, {0xbcd10000}, {0xbcd12000}, {0xbcd14000}, {0xbcd16000}, {0xbcd18000}, {0xbcd1a000}, {0xbcd1c000}, {0xbcd1e000}, {0xbcd20000}, {0xbcd22000}, {0xbcd24000}, {0xbcd26000}, {0xbcd28000}, {0xbcd2a000}, {0xbcd2c000}, {0xbcd2e000}, {0xbcd30000}, {0xbcd32000}, {0xbcd34000}, {0xbcd36000}, {0xbcd38000}, {0xbcd3a000}, {0xbcd3c000}, {0xbcd3e000}, {0xbcd40000}, {0xbcd42000}, {0xbcd44000}, {0xbcd46000}, {0xbcd48000}, {0xbcd4a000}, {0xbcd4c000}, {0xbcd4e000}, {0xbcd50000}, {0xbcd52000}, {0xbcd54000}, {0xbcd56000}, {0xbcd58000}, {0xbcd5a000}, {0xbcd5c000}, {0xbcd5e000}, {0xbcd60000}, {0xbcd62000}, {0xbcd64000}, {0xbcd66000}, {0xbcd68000}, {0xbcd6a000}, {0xbcd6c000}, {0xbcd6e000}, {0xbcd70000}, {0xbcd72000}, {0xbcd74000}, {0xbcd76000}, {0xbcd78000}, {0xbcd7a000}, {0xbcd7c000}, {0xbcd7e000}, {0xbcd80000}, {0xbcd82000}, {0xbcd84000}, {0xbcd86000}, {0xbcd88000}, {0xbcd8a000}, {0xbcd8c000}, {0xbcd8e000}, {0xbcd90000}, {0xbcd92000}, {0xbcd94000}, {0xbcd96000}, {0xbcd98000}, {0xbcd9a000}, {0xbcd9c000}, {0xbcd9e000}, {0xbcda0000}, {0xbcda2000}, {0xbcda4000}, {0xbcda6000}, {0xbcda8000}, {0xbcdaa000}, {0xbcdac000}, {0xbcdae000}, {0xbcdb0000}, {0xbcdb2000}, {0xbcdb4000}, {0xbcdb6000}, {0xbcdb8000}, {0xbcdba000}, {0xbcdbc000}, {0xbcdbe000}, {0xbcdc0000}, {0xbcdc2000}, {0xbcdc4000}, {0xbcdc6000}, {0xbcdc8000}, {0xbcdca000}, {0xbcdcc000}, {0xbcdce000}, {0xbcdd0000}, {0xbcdd2000}, {0xbcdd4000}, {0xbcdd6000}, {0xbcdd8000}, {0xbcdda000}, {0xbcddc000}, {0xbcdde000}, {0xbcde0000}, {0xbcde2000}, {0xbcde4000}, {0xbcde6000}, {0xbcde8000}, {0xbcdea000}, {0xbcdec000}, {0xbcdee000}, {0xbcdf0000}, {0xbcdf2000}, {0xbcdf4000}, {0xbcdf6000}, {0xbcdf8000}, {0xbcdfa000}, {0xbcdfc000}, {0xbcdfe000}, {0xbce00000}, {0xbce02000}, {0xbce04000}, {0xbce06000}, {0xbce08000}, {0xbce0a000}, {0xbce0c000}, {0xbce0e000}, {0xbce10000}, {0xbce12000}, {0xbce14000}, {0xbce16000}, {0xbce18000}, {0xbce1a000}, {0xbce1c000}, {0xbce1e000}, {0xbce20000}, {0xbce22000}, {0xbce24000}, {0xbce26000}, {0xbce28000}, {0xbce2a000}, {0xbce2c000}, {0xbce2e000}, {0xbce30000}, {0xbce32000}, {0xbce34000}, {0xbce36000}, {0xbce38000}, {0xbce3a000}, {0xbce3c000}, {0xbce3e000}, {0xbce40000}, {0xbce42000}, {0xbce44000}, {0xbce46000}, {0xbce48000}, {0xbce4a000}, {0xbce4c000}, {0xbce4e000}, {0xbce50000}, {0xbce52000}, {0xbce54000}, {0xbce56000}, {0xbce58000}, {0xbce5a000}, {0xbce5c000}, {0xbce5e000}, {0xbce60000}, {0xbce62000}, {0xbce64000}, {0xbce66000}, {0xbce68000}, {0xbce6a000}, {0xbce6c000}, {0xbce6e000}, {0xbce70000}, {0xbce72000}, {0xbce74000}, {0xbce76000}, {0xbce78000}, {0xbce7a000}, {0xbce7c000}, {0xbce7e000}, {0xbce80000}, {0xbce82000}, {0xbce84000}, {0xbce86000}, {0xbce88000}, {0xbce8a000}, {0xbce8c000}, {0xbce8e000}, {0xbce90000}, {0xbce92000}, {0xbce94000}, {0xbce96000}, {0xbce98000}, {0xbce9a000}, {0xbce9c000}, {0xbce9e000}, {0xbcea0000}, {0xbcea2000}, {0xbcea4000}, {0xbcea6000}, {0xbcea8000}, {0xbceaa000}, {0xbceac000}, {0xbceae000}, {0xbceb0000}, {0xbceb2000}, {0xbceb4000}, {0xbceb6000}, {0xbceb8000}, {0xbceba000}, {0xbcebc000}, {0xbcebe000}, {0xbcec0000}, {0xbcec2000}, {0xbcec4000}, {0xbcec6000}, {0xbcec8000}, {0xbceca000}, {0xbcecc000}, {0xbcece000}, {0xbced0000}, {0xbced2000}, {0xbced4000}, {0xbced6000}, {0xbced8000}, {0xbceda000}, {0xbcedc000}, {0xbcede000}, {0xbcee0000}, {0xbcee2000}, {0xbcee4000}, {0xbcee6000}, {0xbcee8000}, {0xbceea000}, {0xbceec000}, {0xbceee000}, {0xbcef0000}, {0xbcef2000}, {0xbcef4000}, {0xbcef6000}, {0xbcef8000}, {0xbcefa000}, {0xbcefc000}, {0xbcefe000}, {0xbcf00000}, {0xbcf02000}, {0xbcf04000}, {0xbcf06000}, {0xbcf08000}, {0xbcf0a000}, {0xbcf0c000}, {0xbcf0e000}, {0xbcf10000}, {0xbcf12000}, {0xbcf14000}, {0xbcf16000}, {0xbcf18000}, {0xbcf1a000}, {0xbcf1c000}, {0xbcf1e000}, {0xbcf20000}, {0xbcf22000}, {0xbcf24000}, {0xbcf26000}, {0xbcf28000}, {0xbcf2a000}, {0xbcf2c000}, {0xbcf2e000}, {0xbcf30000}, {0xbcf32000}, {0xbcf34000}, {0xbcf36000}, {0xbcf38000}, {0xbcf3a000}, {0xbcf3c000}, {0xbcf3e000}, {0xbcf40000}, {0xbcf42000}, {0xbcf44000}, {0xbcf46000}, {0xbcf48000}, {0xbcf4a000}, {0xbcf4c000}, {0xbcf4e000}, {0xbcf50000}, {0xbcf52000}, {0xbcf54000}, {0xbcf56000}, {0xbcf58000}, {0xbcf5a000}, {0xbcf5c000}, {0xbcf5e000}, {0xbcf60000}, {0xbcf62000}, {0xbcf64000}, {0xbcf66000}, {0xbcf68000}, {0xbcf6a000}, {0xbcf6c000}, {0xbcf6e000}, {0xbcf70000}, {0xbcf72000}, {0xbcf74000}, {0xbcf76000}, {0xbcf78000}, {0xbcf7a000}, {0xbcf7c000}, {0xbcf7e000}, {0xbcf80000}, {0xbcf82000}, {0xbcf84000}, {0xbcf86000}, {0xbcf88000}, {0xbcf8a000}, {0xbcf8c000}, {0xbcf8e000}, {0xbcf90000}, {0xbcf92000}, {0xbcf94000}, {0xbcf96000}, {0xbcf98000}, {0xbcf9a000}, {0xbcf9c000}, {0xbcf9e000}, {0xbcfa0000}, {0xbcfa2000}, {0xbcfa4000}, {0xbcfa6000}, {0xbcfa8000}, {0xbcfaa000}, {0xbcfac000}, {0xbcfae000}, {0xbcfb0000}, {0xbcfb2000}, {0xbcfb4000}, {0xbcfb6000}, {0xbcfb8000}, {0xbcfba000}, {0xbcfbc000}, {0xbcfbe000}, {0xbcfc0000}, {0xbcfc2000}, {0xbcfc4000}, {0xbcfc6000}, {0xbcfc8000}, {0xbcfca000}, {0xbcfcc000}, {0xbcfce000}, {0xbcfd0000}, {0xbcfd2000}, {0xbcfd4000}, {0xbcfd6000}, {0xbcfd8000}, {0xbcfda000}, {0xbcfdc000}, {0xbcfde000}, {0xbcfe0000}, {0xbcfe2000}, {0xbcfe4000}, {0xbcfe6000}, {0xbcfe8000}, {0xbcfea000}, {0xbcfec000}, {0xbcfee000}, {0xbcff0000}, {0xbcff2000}, {0xbcff4000}, {0xbcff6000}, {0xbcff8000}, {0xbcffa000}, {0xbcffc000}, {0xbcffe000}, {0xbd000000}, {0xbd002000}, {0xbd004000}, {0xbd006000}, {0xbd008000}, {0xbd00a000}, {0xbd00c000}, {0xbd00e000}, {0xbd010000}, {0xbd012000}, {0xbd014000}, {0xbd016000}, {0xbd018000}, {0xbd01a000}, {0xbd01c000}, {0xbd01e000}, {0xbd020000}, {0xbd022000}, {0xbd024000}, {0xbd026000}, {0xbd028000}, {0xbd02a000}, {0xbd02c000}, {0xbd02e000}, {0xbd030000}, {0xbd032000}, {0xbd034000}, {0xbd036000}, {0xbd038000}, {0xbd03a000}, {0xbd03c000}, {0xbd03e000}, {0xbd040000}, {0xbd042000}, {0xbd044000}, {0xbd046000}, {0xbd048000}, {0xbd04a000}, {0xbd04c000}, {0xbd04e000}, {0xbd050000}, {0xbd052000}, {0xbd054000}, {0xbd056000}, {0xbd058000}, {0xbd05a000}, {0xbd05c000}, {0xbd05e000}, {0xbd060000}, {0xbd062000}, {0xbd064000}, {0xbd066000}, {0xbd068000}, {0xbd06a000}, {0xbd06c000}, {0xbd06e000}, {0xbd070000}, {0xbd072000}, {0xbd074000}, {0xbd076000}, {0xbd078000}, {0xbd07a000}, {0xbd07c000}, {0xbd07e000}, {0xbd080000}, {0xbd082000}, {0xbd084000}, {0xbd086000}, {0xbd088000}, {0xbd08a000}, {0xbd08c000}, {0xbd08e000}, {0xbd090000}, {0xbd092000}, {0xbd094000}, {0xbd096000}, {0xbd098000}, {0xbd09a000}, {0xbd09c000}, {0xbd09e000}, {0xbd0a0000}, {0xbd0a2000}, {0xbd0a4000}, {0xbd0a6000}, {0xbd0a8000}, {0xbd0aa000}, {0xbd0ac000}, {0xbd0ae000}, {0xbd0b0000}, {0xbd0b2000}, {0xbd0b4000}, {0xbd0b6000}, {0xbd0b8000}, {0xbd0ba000}, {0xbd0bc000}, {0xbd0be000}, {0xbd0c0000}, {0xbd0c2000}, {0xbd0c4000}, {0xbd0c6000}, {0xbd0c8000}, {0xbd0ca000}, {0xbd0cc000}, {0xbd0ce000}, {0xbd0d0000}, {0xbd0d2000}, {0xbd0d4000}, {0xbd0d6000}, {0xbd0d8000}, {0xbd0da000}, {0xbd0dc000}, {0xbd0de000}, {0xbd0e0000}, {0xbd0e2000}, {0xbd0e4000}, {0xbd0e6000}, {0xbd0e8000}, {0xbd0ea000}, {0xbd0ec000}, {0xbd0ee000}, {0xbd0f0000}, {0xbd0f2000}, {0xbd0f4000}, {0xbd0f6000}, {0xbd0f8000}, {0xbd0fa000}, {0xbd0fc000}, {0xbd0fe000}, {0xbd100000}, {0xbd102000}, {0xbd104000}, {0xbd106000}, {0xbd108000}, {0xbd10a000}, {0xbd10c000}, {0xbd10e000}, {0xbd110000}, {0xbd112000}, {0xbd114000}, {0xbd116000}, {0xbd118000}, {0xbd11a000}, {0xbd11c000}, {0xbd11e000}, {0xbd120000}, {0xbd122000}, {0xbd124000}, {0xbd126000}, {0xbd128000}, {0xbd12a000}, {0xbd12c000}, {0xbd12e000}, {0xbd130000}, {0xbd132000}, {0xbd134000}, {0xbd136000}, {0xbd138000}, {0xbd13a000}, {0xbd13c000}, {0xbd13e000}, {0xbd140000}, {0xbd142000}, {0xbd144000}, {0xbd146000}, {0xbd148000}, {0xbd14a000}, {0xbd14c000}, {0xbd14e000}, {0xbd150000}, {0xbd152000}, {0xbd154000}, {0xbd156000}, {0xbd158000}, {0xbd15a000}, {0xbd15c000}, {0xbd15e000}, {0xbd160000}, {0xbd162000}, {0xbd164000}, {0xbd166000}, {0xbd168000}, {0xbd16a000}, {0xbd16c000}, {0xbd16e000}, {0xbd170000}, {0xbd172000}, {0xbd174000}, {0xbd176000}, {0xbd178000}, {0xbd17a000}, {0xbd17c000}, {0xbd17e000}, {0xbd180000}, {0xbd182000}, {0xbd184000}, {0xbd186000}, {0xbd188000}, {0xbd18a000}, {0xbd18c000}, {0xbd18e000}, {0xbd190000}, {0xbd192000}, {0xbd194000}, {0xbd196000}, {0xbd198000}, {0xbd19a000}, {0xbd19c000}, {0xbd19e000}, {0xbd1a0000}, {0xbd1a2000}, {0xbd1a4000}, {0xbd1a6000}, {0xbd1a8000}, {0xbd1aa000}, {0xbd1ac000}, {0xbd1ae000}, {0xbd1b0000}, {0xbd1b2000}, {0xbd1b4000}, {0xbd1b6000}, {0xbd1b8000}, {0xbd1ba000}, {0xbd1bc000}, {0xbd1be000}, {0xbd1c0000}, {0xbd1c2000}, {0xbd1c4000}, {0xbd1c6000}, {0xbd1c8000}, {0xbd1ca000}, {0xbd1cc000}, {0xbd1ce000}, {0xbd1d0000}, {0xbd1d2000}, {0xbd1d4000}, {0xbd1d6000}, {0xbd1d8000}, {0xbd1da000}, {0xbd1dc000}, {0xbd1de000}, {0xbd1e0000}, {0xbd1e2000}, {0xbd1e4000}, {0xbd1e6000}, {0xbd1e8000}, {0xbd1ea000}, {0xbd1ec000}, {0xbd1ee000}, {0xbd1f0000}, {0xbd1f2000}, {0xbd1f4000}, {0xbd1f6000}, {0xbd1f8000}, {0xbd1fa000}, {0xbd1fc000}, {0xbd1fe000}, {0xbd200000}, {0xbd202000}, {0xbd204000}, {0xbd206000}, {0xbd208000}, {0xbd20a000}, {0xbd20c000}, {0xbd20e000}, {0xbd210000}, {0xbd212000}, {0xbd214000}, {0xbd216000}, {0xbd218000}, {0xbd21a000}, {0xbd21c000}, {0xbd21e000}, {0xbd220000}, {0xbd222000}, {0xbd224000}, {0xbd226000}, {0xbd228000}, {0xbd22a000}, {0xbd22c000}, {0xbd22e000}, {0xbd230000}, {0xbd232000}, {0xbd234000}, {0xbd236000}, {0xbd238000}, {0xbd23a000}, {0xbd23c000}, {0xbd23e000}, {0xbd240000}, {0xbd242000}, {0xbd244000}, {0xbd246000}, {0xbd248000}, {0xbd24a000}, {0xbd24c000}, {0xbd24e000}, {0xbd250000}, {0xbd252000}, {0xbd254000}, {0xbd256000}, {0xbd258000}, {0xbd25a000}, {0xbd25c000}, {0xbd25e000}, {0xbd260000}, {0xbd262000}, {0xbd264000}, {0xbd266000}, {0xbd268000}, {0xbd26a000}, {0xbd26c000}, {0xbd26e000}, {0xbd270000}, {0xbd272000}, {0xbd274000}, {0xbd276000}, {0xbd278000}, {0xbd27a000}, {0xbd27c000}, {0xbd27e000}, {0xbd280000}, {0xbd282000}, {0xbd284000}, {0xbd286000}, {0xbd288000}, {0xbd28a000}, {0xbd28c000}, {0xbd28e000}, {0xbd290000}, {0xbd292000}, {0xbd294000}, {0xbd296000}, {0xbd298000}, {0xbd29a000}, {0xbd29c000}, {0xbd29e000}, {0xbd2a0000}, {0xbd2a2000}, {0xbd2a4000}, {0xbd2a6000}, {0xbd2a8000}, {0xbd2aa000}, {0xbd2ac000}, {0xbd2ae000}, {0xbd2b0000}, {0xbd2b2000}, {0xbd2b4000}, {0xbd2b6000}, {0xbd2b8000}, {0xbd2ba000}, {0xbd2bc000}, {0xbd2be000}, {0xbd2c0000}, {0xbd2c2000}, {0xbd2c4000}, {0xbd2c6000}, {0xbd2c8000}, {0xbd2ca000}, {0xbd2cc000}, {0xbd2ce000}, {0xbd2d0000}, {0xbd2d2000}, {0xbd2d4000}, {0xbd2d6000}, {0xbd2d8000}, {0xbd2da000}, {0xbd2dc000}, {0xbd2de000}, {0xbd2e0000}, {0xbd2e2000}, {0xbd2e4000}, {0xbd2e6000}, {0xbd2e8000}, {0xbd2ea000}, {0xbd2ec000}, {0xbd2ee000}, {0xbd2f0000}, {0xbd2f2000}, {0xbd2f4000}, {0xbd2f6000}, {0xbd2f8000}, {0xbd2fa000}, {0xbd2fc000}, {0xbd2fe000}, {0xbd300000}, {0xbd302000}, {0xbd304000}, {0xbd306000}, {0xbd308000}, {0xbd30a000}, {0xbd30c000}, {0xbd30e000}, {0xbd310000}, {0xbd312000}, {0xbd314000}, {0xbd316000}, {0xbd318000}, {0xbd31a000}, {0xbd31c000}, {0xbd31e000}, {0xbd320000}, {0xbd322000}, {0xbd324000}, {0xbd326000}, {0xbd328000}, {0xbd32a000}, {0xbd32c000}, {0xbd32e000}, {0xbd330000}, {0xbd332000}, {0xbd334000}, {0xbd336000}, {0xbd338000}, {0xbd33a000}, {0xbd33c000}, {0xbd33e000}, {0xbd340000}, {0xbd342000}, {0xbd344000}, {0xbd346000}, {0xbd348000}, {0xbd34a000}, {0xbd34c000}, {0xbd34e000}, {0xbd350000}, {0xbd352000}, {0xbd354000}, {0xbd356000}, {0xbd358000}, {0xbd35a000}, {0xbd35c000}, {0xbd35e000}, {0xbd360000}, {0xbd362000}, {0xbd364000}, {0xbd366000}, {0xbd368000}, {0xbd36a000}, {0xbd36c000}, {0xbd36e000}, {0xbd370000}, {0xbd372000}, {0xbd374000}, {0xbd376000}, {0xbd378000}, {0xbd37a000}, {0xbd37c000}, {0xbd37e000}, {0xbd380000}, {0xbd382000}, {0xbd384000}, {0xbd386000}, {0xbd388000}, {0xbd38a000}, {0xbd38c000}, {0xbd38e000}, {0xbd390000}, {0xbd392000}, {0xbd394000}, {0xbd396000}, {0xbd398000}, {0xbd39a000}, {0xbd39c000}, {0xbd39e000}, {0xbd3a0000}, {0xbd3a2000}, {0xbd3a4000}, {0xbd3a6000}, {0xbd3a8000}, {0xbd3aa000}, {0xbd3ac000}, {0xbd3ae000}, {0xbd3b0000}, {0xbd3b2000}, {0xbd3b4000}, {0xbd3b6000}, {0xbd3b8000}, {0xbd3ba000}, {0xbd3bc000}, {0xbd3be000}, {0xbd3c0000}, {0xbd3c2000}, {0xbd3c4000}, {0xbd3c6000}, {0xbd3c8000}, {0xbd3ca000}, {0xbd3cc000}, {0xbd3ce000}, {0xbd3d0000}, {0xbd3d2000}, {0xbd3d4000}, {0xbd3d6000}, {0xbd3d8000}, {0xbd3da000}, {0xbd3dc000}, {0xbd3de000}, {0xbd3e0000}, {0xbd3e2000}, {0xbd3e4000}, {0xbd3e6000}, {0xbd3e8000}, {0xbd3ea000}, {0xbd3ec000}, {0xbd3ee000}, {0xbd3f0000}, {0xbd3f2000}, {0xbd3f4000}, {0xbd3f6000}, {0xbd3f8000}, {0xbd3fa000}, {0xbd3fc000}, {0xbd3fe000}, {0xbd400000}, {0xbd402000}, {0xbd404000}, {0xbd406000}, {0xbd408000}, {0xbd40a000}, {0xbd40c000}, {0xbd40e000}, {0xbd410000}, {0xbd412000}, {0xbd414000}, {0xbd416000}, {0xbd418000}, {0xbd41a000}, {0xbd41c000}, {0xbd41e000}, {0xbd420000}, {0xbd422000}, {0xbd424000}, {0xbd426000}, {0xbd428000}, {0xbd42a000}, {0xbd42c000}, {0xbd42e000}, {0xbd430000}, {0xbd432000}, {0xbd434000}, {0xbd436000}, {0xbd438000}, {0xbd43a000}, {0xbd43c000}, {0xbd43e000}, {0xbd440000}, {0xbd442000}, {0xbd444000}, {0xbd446000}, {0xbd448000}, {0xbd44a000}, {0xbd44c000}, {0xbd44e000}, {0xbd450000}, {0xbd452000}, {0xbd454000}, {0xbd456000}, {0xbd458000}, {0xbd45a000}, {0xbd45c000}, {0xbd45e000}, {0xbd460000}, {0xbd462000}, {0xbd464000}, {0xbd466000}, {0xbd468000}, {0xbd46a000}, {0xbd46c000}, {0xbd46e000}, {0xbd470000}, {0xbd472000}, {0xbd474000}, {0xbd476000}, {0xbd478000}, {0xbd47a000}, {0xbd47c000}, {0xbd47e000}, {0xbd480000}, {0xbd482000}, {0xbd484000}, {0xbd486000}, {0xbd488000}, {0xbd48a000}, {0xbd48c000}, {0xbd48e000}, {0xbd490000}, {0xbd492000}, {0xbd494000}, {0xbd496000}, {0xbd498000}, {0xbd49a000}, {0xbd49c000}, {0xbd49e000}, {0xbd4a0000}, {0xbd4a2000}, {0xbd4a4000}, {0xbd4a6000}, {0xbd4a8000}, {0xbd4aa000}, {0xbd4ac000}, {0xbd4ae000}, {0xbd4b0000}, {0xbd4b2000}, {0xbd4b4000}, {0xbd4b6000}, {0xbd4b8000}, {0xbd4ba000}, {0xbd4bc000}, {0xbd4be000}, {0xbd4c0000}, {0xbd4c2000}, {0xbd4c4000}, {0xbd4c6000}, {0xbd4c8000}, {0xbd4ca000}, {0xbd4cc000}, {0xbd4ce000}, {0xbd4d0000}, {0xbd4d2000}, {0xbd4d4000}, {0xbd4d6000}, {0xbd4d8000}, {0xbd4da000}, {0xbd4dc000}, {0xbd4de000}, {0xbd4e0000}, {0xbd4e2000}, {0xbd4e4000}, {0xbd4e6000}, {0xbd4e8000}, {0xbd4ea000}, {0xbd4ec000}, {0xbd4ee000}, {0xbd4f0000}, {0xbd4f2000}, {0xbd4f4000}, {0xbd4f6000}, {0xbd4f8000}, {0xbd4fa000}, {0xbd4fc000}, {0xbd4fe000}, {0xbd500000}, {0xbd502000}, {0xbd504000}, {0xbd506000}, {0xbd508000}, {0xbd50a000}, {0xbd50c000}, {0xbd50e000}, {0xbd510000}, {0xbd512000}, {0xbd514000}, {0xbd516000}, {0xbd518000}, {0xbd51a000}, {0xbd51c000}, {0xbd51e000}, {0xbd520000}, {0xbd522000}, {0xbd524000}, {0xbd526000}, {0xbd528000}, {0xbd52a000}, {0xbd52c000}, {0xbd52e000}, {0xbd530000}, {0xbd532000}, {0xbd534000}, {0xbd536000}, {0xbd538000}, {0xbd53a000}, {0xbd53c000}, {0xbd53e000}, {0xbd540000}, {0xbd542000}, {0xbd544000}, {0xbd546000}, {0xbd548000}, {0xbd54a000}, {0xbd54c000}, {0xbd54e000}, {0xbd550000}, {0xbd552000}, {0xbd554000}, {0xbd556000}, {0xbd558000}, {0xbd55a000}, {0xbd55c000}, {0xbd55e000}, {0xbd560000}, {0xbd562000}, {0xbd564000}, {0xbd566000}, {0xbd568000}, {0xbd56a000}, {0xbd56c000}, {0xbd56e000}, {0xbd570000}, {0xbd572000}, {0xbd574000}, {0xbd576000}, {0xbd578000}, {0xbd57a000}, {0xbd57c000}, {0xbd57e000}, {0xbd580000}, {0xbd582000}, {0xbd584000}, {0xbd586000}, {0xbd588000}, {0xbd58a000}, {0xbd58c000}, {0xbd58e000}, {0xbd590000}, {0xbd592000}, {0xbd594000}, {0xbd596000}, {0xbd598000}, {0xbd59a000}, {0xbd59c000}, {0xbd59e000}, {0xbd5a0000}, {0xbd5a2000}, {0xbd5a4000}, {0xbd5a6000}, {0xbd5a8000}, {0xbd5aa000}, {0xbd5ac000}, {0xbd5ae000}, {0xbd5b0000}, {0xbd5b2000}, {0xbd5b4000}, {0xbd5b6000}, {0xbd5b8000}, {0xbd5ba000}, {0xbd5bc000}, {0xbd5be000}, {0xbd5c0000}, {0xbd5c2000}, {0xbd5c4000}, {0xbd5c6000}, {0xbd5c8000}, {0xbd5ca000}, {0xbd5cc000}, {0xbd5ce000}, {0xbd5d0000}, {0xbd5d2000}, {0xbd5d4000}, {0xbd5d6000}, {0xbd5d8000}, {0xbd5da000}, {0xbd5dc000}, {0xbd5de000}, {0xbd5e0000}, {0xbd5e2000}, {0xbd5e4000}, {0xbd5e6000}, {0xbd5e8000}, {0xbd5ea000}, {0xbd5ec000}, {0xbd5ee000}, {0xbd5f0000}, {0xbd5f2000}, {0xbd5f4000}, {0xbd5f6000}, {0xbd5f8000}, {0xbd5fa000}, {0xbd5fc000}, {0xbd5fe000}, {0xbd600000}, {0xbd602000}, {0xbd604000}, {0xbd606000}, {0xbd608000}, {0xbd60a000}, {0xbd60c000}, {0xbd60e000}, {0xbd610000}, {0xbd612000}, {0xbd614000}, {0xbd616000}, {0xbd618000}, {0xbd61a000}, {0xbd61c000}, {0xbd61e000}, {0xbd620000}, {0xbd622000}, {0xbd624000}, {0xbd626000}, {0xbd628000}, {0xbd62a000}, {0xbd62c000}, {0xbd62e000}, {0xbd630000}, {0xbd632000}, {0xbd634000}, {0xbd636000}, {0xbd638000}, {0xbd63a000}, {0xbd63c000}, {0xbd63e000}, {0xbd640000}, {0xbd642000}, {0xbd644000}, {0xbd646000}, {0xbd648000}, {0xbd64a000}, {0xbd64c000}, {0xbd64e000}, {0xbd650000}, {0xbd652000}, {0xbd654000}, {0xbd656000}, {0xbd658000}, {0xbd65a000}, {0xbd65c000}, {0xbd65e000}, {0xbd660000}, {0xbd662000}, {0xbd664000}, {0xbd666000}, {0xbd668000}, {0xbd66a000}, {0xbd66c000}, {0xbd66e000}, {0xbd670000}, {0xbd672000}, {0xbd674000}, {0xbd676000}, {0xbd678000}, {0xbd67a000}, {0xbd67c000}, {0xbd67e000}, {0xbd680000}, {0xbd682000}, {0xbd684000}, {0xbd686000}, {0xbd688000}, {0xbd68a000}, {0xbd68c000}, {0xbd68e000}, {0xbd690000}, {0xbd692000}, {0xbd694000}, {0xbd696000}, {0xbd698000}, {0xbd69a000}, {0xbd69c000}, {0xbd69e000}, {0xbd6a0000}, {0xbd6a2000}, {0xbd6a4000}, {0xbd6a6000}, {0xbd6a8000}, {0xbd6aa000}, {0xbd6ac000}, {0xbd6ae000}, {0xbd6b0000}, {0xbd6b2000}, {0xbd6b4000}, {0xbd6b6000}, {0xbd6b8000}, {0xbd6ba000}, {0xbd6bc000}, {0xbd6be000}, {0xbd6c0000}, {0xbd6c2000}, {0xbd6c4000}, {0xbd6c6000}, {0xbd6c8000}, {0xbd6ca000}, {0xbd6cc000}, {0xbd6ce000}, {0xbd6d0000}, {0xbd6d2000}, {0xbd6d4000}, {0xbd6d6000}, {0xbd6d8000}, {0xbd6da000}, {0xbd6dc000}, {0xbd6de000}, {0xbd6e0000}, {0xbd6e2000}, {0xbd6e4000}, {0xbd6e6000}, {0xbd6e8000}, {0xbd6ea000}, {0xbd6ec000}, {0xbd6ee000}, {0xbd6f0000}, {0xbd6f2000}, {0xbd6f4000}, {0xbd6f6000}, {0xbd6f8000}, {0xbd6fa000}, {0xbd6fc000}, {0xbd6fe000}, {0xbd700000}, {0xbd702000}, {0xbd704000}, {0xbd706000}, {0xbd708000}, {0xbd70a000}, {0xbd70c000}, {0xbd70e000}, {0xbd710000}, {0xbd712000}, {0xbd714000}, {0xbd716000}, {0xbd718000}, {0xbd71a000}, {0xbd71c000}, {0xbd71e000}, {0xbd720000}, {0xbd722000}, {0xbd724000}, {0xbd726000}, {0xbd728000}, {0xbd72a000}, {0xbd72c000}, {0xbd72e000}, {0xbd730000}, {0xbd732000}, {0xbd734000}, {0xbd736000}, {0xbd738000}, {0xbd73a000}, {0xbd73c000}, {0xbd73e000}, {0xbd740000}, {0xbd742000}, {0xbd744000}, {0xbd746000}, {0xbd748000}, {0xbd74a000}, {0xbd74c000}, {0xbd74e000}, {0xbd750000}, {0xbd752000}, {0xbd754000}, {0xbd756000}, {0xbd758000}, {0xbd75a000}, {0xbd75c000}, {0xbd75e000}, {0xbd760000}, {0xbd762000}, {0xbd764000}, {0xbd766000}, {0xbd768000}, {0xbd76a000}, {0xbd76c000}, {0xbd76e000}, {0xbd770000}, {0xbd772000}, {0xbd774000}, {0xbd776000}, {0xbd778000}, {0xbd77a000}, {0xbd77c000}, {0xbd77e000}, {0xbd780000}, {0xbd782000}, {0xbd784000}, {0xbd786000}, {0xbd788000}, {0xbd78a000}, {0xbd78c000}, {0xbd78e000}, {0xbd790000}, {0xbd792000}, {0xbd794000}, {0xbd796000}, {0xbd798000}, {0xbd79a000}, {0xbd79c000}, {0xbd79e000}, {0xbd7a0000}, {0xbd7a2000}, {0xbd7a4000}, {0xbd7a6000}, {0xbd7a8000}, {0xbd7aa000}, {0xbd7ac000}, {0xbd7ae000}, {0xbd7b0000}, {0xbd7b2000}, {0xbd7b4000}, {0xbd7b6000}, {0xbd7b8000}, {0xbd7ba000}, {0xbd7bc000}, {0xbd7be000}, {0xbd7c0000}, {0xbd7c2000}, {0xbd7c4000}, {0xbd7c6000}, {0xbd7c8000}, {0xbd7ca000}, {0xbd7cc000}, {0xbd7ce000}, {0xbd7d0000}, {0xbd7d2000}, {0xbd7d4000}, {0xbd7d6000}, {0xbd7d8000}, {0xbd7da000}, {0xbd7dc000}, {0xbd7de000}, {0xbd7e0000}, {0xbd7e2000}, {0xbd7e4000}, {0xbd7e6000}, {0xbd7e8000}, {0xbd7ea000}, {0xbd7ec000}, {0xbd7ee000}, {0xbd7f0000}, {0xbd7f2000}, {0xbd7f4000}, {0xbd7f6000}, {0xbd7f8000}, {0xbd7fa000}, {0xbd7fc000}, {0xbd7fe000}, {0xbd800000}, {0xbd802000}, {0xbd804000}, {0xbd806000}, {0xbd808000}, {0xbd80a000}, {0xbd80c000}, {0xbd80e000}, {0xbd810000}, {0xbd812000}, {0xbd814000}, {0xbd816000}, {0xbd818000}, {0xbd81a000}, {0xbd81c000}, {0xbd81e000}, {0xbd820000}, {0xbd822000}, {0xbd824000}, {0xbd826000}, {0xbd828000}, {0xbd82a000}, {0xbd82c000}, {0xbd82e000}, {0xbd830000}, {0xbd832000}, {0xbd834000}, {0xbd836000}, {0xbd838000}, {0xbd83a000}, {0xbd83c000}, {0xbd83e000}, {0xbd840000}, {0xbd842000}, {0xbd844000}, {0xbd846000}, {0xbd848000}, {0xbd84a000}, {0xbd84c000}, {0xbd84e000}, {0xbd850000}, {0xbd852000}, {0xbd854000}, {0xbd856000}, {0xbd858000}, {0xbd85a000}, {0xbd85c000}, {0xbd85e000}, {0xbd860000}, {0xbd862000}, {0xbd864000}, {0xbd866000}, {0xbd868000}, {0xbd86a000}, {0xbd86c000}, {0xbd86e000}, {0xbd870000}, {0xbd872000}, {0xbd874000}, {0xbd876000}, {0xbd878000}, {0xbd87a000}, {0xbd87c000}, {0xbd87e000}, {0xbd880000}, {0xbd882000}, {0xbd884000}, {0xbd886000}, {0xbd888000}, {0xbd88a000}, {0xbd88c000}, {0xbd88e000}, {0xbd890000}, {0xbd892000}, {0xbd894000}, {0xbd896000}, {0xbd898000}, {0xbd89a000}, {0xbd89c000}, {0xbd89e000}, {0xbd8a0000}, {0xbd8a2000}, {0xbd8a4000}, {0xbd8a6000}, {0xbd8a8000}, {0xbd8aa000}, {0xbd8ac000}, {0xbd8ae000}, {0xbd8b0000}, {0xbd8b2000}, {0xbd8b4000}, {0xbd8b6000}, {0xbd8b8000}, {0xbd8ba000}, {0xbd8bc000}, {0xbd8be000}, {0xbd8c0000}, {0xbd8c2000}, {0xbd8c4000}, {0xbd8c6000}, {0xbd8c8000}, {0xbd8ca000}, {0xbd8cc000}, {0xbd8ce000}, {0xbd8d0000}, {0xbd8d2000}, {0xbd8d4000}, {0xbd8d6000}, {0xbd8d8000}, {0xbd8da000}, {0xbd8dc000}, {0xbd8de000}, {0xbd8e0000}, {0xbd8e2000}, {0xbd8e4000}, {0xbd8e6000}, {0xbd8e8000}, {0xbd8ea000}, {0xbd8ec000}, {0xbd8ee000}, {0xbd8f0000}, {0xbd8f2000}, {0xbd8f4000}, {0xbd8f6000}, {0xbd8f8000}, {0xbd8fa000}, {0xbd8fc000}, {0xbd8fe000}, {0xbd900000}, {0xbd902000}, {0xbd904000}, {0xbd906000}, {0xbd908000}, {0xbd90a000}, {0xbd90c000}, {0xbd90e000}, {0xbd910000}, {0xbd912000}, {0xbd914000}, {0xbd916000}, {0xbd918000}, {0xbd91a000}, {0xbd91c000}, {0xbd91e000}, {0xbd920000}, {0xbd922000}, {0xbd924000}, {0xbd926000}, {0xbd928000}, {0xbd92a000}, {0xbd92c000}, {0xbd92e000}, {0xbd930000}, {0xbd932000}, {0xbd934000}, {0xbd936000}, {0xbd938000}, {0xbd93a000}, {0xbd93c000}, {0xbd93e000}, {0xbd940000}, {0xbd942000}, {0xbd944000}, {0xbd946000}, {0xbd948000}, {0xbd94a000}, {0xbd94c000}, {0xbd94e000}, {0xbd950000}, {0xbd952000}, {0xbd954000}, {0xbd956000}, {0xbd958000}, {0xbd95a000}, {0xbd95c000}, {0xbd95e000}, {0xbd960000}, {0xbd962000}, {0xbd964000}, {0xbd966000}, {0xbd968000}, {0xbd96a000}, {0xbd96c000}, {0xbd96e000}, {0xbd970000}, {0xbd972000}, {0xbd974000}, {0xbd976000}, {0xbd978000}, {0xbd97a000}, {0xbd97c000}, {0xbd97e000}, {0xbd980000}, {0xbd982000}, {0xbd984000}, {0xbd986000}, {0xbd988000}, {0xbd98a000}, {0xbd98c000}, {0xbd98e000}, {0xbd990000}, {0xbd992000}, {0xbd994000}, {0xbd996000}, {0xbd998000}, {0xbd99a000}, {0xbd99c000}, {0xbd99e000}, {0xbd9a0000}, {0xbd9a2000}, {0xbd9a4000}, {0xbd9a6000}, {0xbd9a8000}, {0xbd9aa000}, {0xbd9ac000}, {0xbd9ae000}, {0xbd9b0000}, {0xbd9b2000}, {0xbd9b4000}, {0xbd9b6000}, {0xbd9b8000}, {0xbd9ba000}, {0xbd9bc000}, {0xbd9be000}, {0xbd9c0000}, {0xbd9c2000}, {0xbd9c4000}, {0xbd9c6000}, {0xbd9c8000}, {0xbd9ca000}, {0xbd9cc000}, {0xbd9ce000}, {0xbd9d0000}, {0xbd9d2000}, {0xbd9d4000}, {0xbd9d6000}, {0xbd9d8000}, {0xbd9da000}, {0xbd9dc000}, {0xbd9de000}, {0xbd9e0000}, {0xbd9e2000}, {0xbd9e4000}, {0xbd9e6000}, {0xbd9e8000}, {0xbd9ea000}, {0xbd9ec000}, {0xbd9ee000}, {0xbd9f0000}, {0xbd9f2000}, {0xbd9f4000}, {0xbd9f6000}, {0xbd9f8000}, {0xbd9fa000}, {0xbd9fc000}, {0xbd9fe000}, {0xbda00000}, {0xbda02000}, {0xbda04000}, {0xbda06000}, {0xbda08000}, {0xbda0a000}, {0xbda0c000}, {0xbda0e000}, {0xbda10000}, {0xbda12000}, {0xbda14000}, {0xbda16000}, {0xbda18000}, {0xbda1a000}, {0xbda1c000}, {0xbda1e000}, {0xbda20000}, {0xbda22000}, {0xbda24000}, {0xbda26000}, {0xbda28000}, {0xbda2a000}, {0xbda2c000}, {0xbda2e000}, {0xbda30000}, {0xbda32000}, {0xbda34000}, {0xbda36000}, {0xbda38000}, {0xbda3a000}, {0xbda3c000}, {0xbda3e000}, {0xbda40000}, {0xbda42000}, {0xbda44000}, {0xbda46000}, {0xbda48000}, {0xbda4a000}, {0xbda4c000}, {0xbda4e000}, {0xbda50000}, {0xbda52000}, {0xbda54000}, {0xbda56000}, {0xbda58000}, {0xbda5a000}, {0xbda5c000}, {0xbda5e000}, {0xbda60000}, {0xbda62000}, {0xbda64000}, {0xbda66000}, {0xbda68000}, {0xbda6a000}, {0xbda6c000}, {0xbda6e000}, {0xbda70000}, {0xbda72000}, {0xbda74000}, {0xbda76000}, {0xbda78000}, {0xbda7a000}, {0xbda7c000}, {0xbda7e000}, {0xbda80000}, {0xbda82000}, {0xbda84000}, {0xbda86000}, {0xbda88000}, {0xbda8a000}, {0xbda8c000}, {0xbda8e000}, {0xbda90000}, {0xbda92000}, {0xbda94000}, {0xbda96000}, {0xbda98000}, {0xbda9a000}, {0xbda9c000}, {0xbda9e000}, {0xbdaa0000}, {0xbdaa2000}, {0xbdaa4000}, {0xbdaa6000}, {0xbdaa8000}, {0xbdaaa000}, {0xbdaac000}, {0xbdaae000}, {0xbdab0000}, {0xbdab2000}, {0xbdab4000}, {0xbdab6000}, {0xbdab8000}, {0xbdaba000}, {0xbdabc000}, {0xbdabe000}, {0xbdac0000}, {0xbdac2000}, {0xbdac4000}, {0xbdac6000}, {0xbdac8000}, {0xbdaca000}, {0xbdacc000}, {0xbdace000}, {0xbdad0000}, {0xbdad2000}, {0xbdad4000}, {0xbdad6000}, {0xbdad8000}, {0xbdada000}, {0xbdadc000}, {0xbdade000}, {0xbdae0000}, {0xbdae2000}, {0xbdae4000}, {0xbdae6000}, {0xbdae8000}, {0xbdaea000}, {0xbdaec000}, {0xbdaee000}, {0xbdaf0000}, {0xbdaf2000}, {0xbdaf4000}, {0xbdaf6000}, {0xbdaf8000}, {0xbdafa000}, {0xbdafc000}, {0xbdafe000}, {0xbdb00000}, {0xbdb02000}, {0xbdb04000}, {0xbdb06000}, {0xbdb08000}, {0xbdb0a000}, {0xbdb0c000}, {0xbdb0e000}, {0xbdb10000}, {0xbdb12000}, {0xbdb14000}, {0xbdb16000}, {0xbdb18000}, {0xbdb1a000}, {0xbdb1c000}, {0xbdb1e000}, {0xbdb20000}, {0xbdb22000}, {0xbdb24000}, {0xbdb26000}, {0xbdb28000}, {0xbdb2a000}, {0xbdb2c000}, {0xbdb2e000}, {0xbdb30000}, {0xbdb32000}, {0xbdb34000}, {0xbdb36000}, {0xbdb38000}, {0xbdb3a000}, {0xbdb3c000}, {0xbdb3e000}, {0xbdb40000}, {0xbdb42000}, {0xbdb44000}, {0xbdb46000}, {0xbdb48000}, {0xbdb4a000}, {0xbdb4c000}, {0xbdb4e000}, {0xbdb50000}, {0xbdb52000}, {0xbdb54000}, {0xbdb56000}, {0xbdb58000}, {0xbdb5a000}, {0xbdb5c000}, {0xbdb5e000}, {0xbdb60000}, {0xbdb62000}, {0xbdb64000}, {0xbdb66000}, {0xbdb68000}, {0xbdb6a000}, {0xbdb6c000}, {0xbdb6e000}, {0xbdb70000}, {0xbdb72000}, {0xbdb74000}, {0xbdb76000}, {0xbdb78000}, {0xbdb7a000}, {0xbdb7c000}, {0xbdb7e000}, {0xbdb80000}, {0xbdb82000}, {0xbdb84000}, {0xbdb86000}, {0xbdb88000}, {0xbdb8a000}, {0xbdb8c000}, {0xbdb8e000}, {0xbdb90000}, {0xbdb92000}, {0xbdb94000}, {0xbdb96000}, {0xbdb98000}, {0xbdb9a000}, {0xbdb9c000}, {0xbdb9e000}, {0xbdba0000}, {0xbdba2000}, {0xbdba4000}, {0xbdba6000}, {0xbdba8000}, {0xbdbaa000}, {0xbdbac000}, {0xbdbae000}, {0xbdbb0000}, {0xbdbb2000}, {0xbdbb4000}, {0xbdbb6000}, {0xbdbb8000}, {0xbdbba000}, {0xbdbbc000}, {0xbdbbe000}, {0xbdbc0000}, {0xbdbc2000}, {0xbdbc4000}, {0xbdbc6000}, {0xbdbc8000}, {0xbdbca000}, {0xbdbcc000}, {0xbdbce000}, {0xbdbd0000}, {0xbdbd2000}, {0xbdbd4000}, {0xbdbd6000}, {0xbdbd8000}, {0xbdbda000}, {0xbdbdc000}, {0xbdbde000}, {0xbdbe0000}, {0xbdbe2000}, {0xbdbe4000}, {0xbdbe6000}, {0xbdbe8000}, {0xbdbea000}, {0xbdbec000}, {0xbdbee000}, {0xbdbf0000}, {0xbdbf2000}, {0xbdbf4000}, {0xbdbf6000}, {0xbdbf8000}, {0xbdbfa000}, {0xbdbfc000}, {0xbdbfe000}, {0xbdc00000}, {0xbdc02000}, {0xbdc04000}, {0xbdc06000}, {0xbdc08000}, {0xbdc0a000}, {0xbdc0c000}, {0xbdc0e000}, {0xbdc10000}, {0xbdc12000}, {0xbdc14000}, {0xbdc16000}, {0xbdc18000}, {0xbdc1a000}, {0xbdc1c000}, {0xbdc1e000}, {0xbdc20000}, {0xbdc22000}, {0xbdc24000}, {0xbdc26000}, {0xbdc28000}, {0xbdc2a000}, {0xbdc2c000}, {0xbdc2e000}, {0xbdc30000}, {0xbdc32000}, {0xbdc34000}, {0xbdc36000}, {0xbdc38000}, {0xbdc3a000}, {0xbdc3c000}, {0xbdc3e000}, {0xbdc40000}, {0xbdc42000}, {0xbdc44000}, {0xbdc46000}, {0xbdc48000}, {0xbdc4a000}, {0xbdc4c000}, {0xbdc4e000}, {0xbdc50000}, {0xbdc52000}, {0xbdc54000}, {0xbdc56000}, {0xbdc58000}, {0xbdc5a000}, {0xbdc5c000}, {0xbdc5e000}, {0xbdc60000}, {0xbdc62000}, {0xbdc64000}, {0xbdc66000}, {0xbdc68000}, {0xbdc6a000}, {0xbdc6c000}, {0xbdc6e000}, {0xbdc70000}, {0xbdc72000}, {0xbdc74000}, {0xbdc76000}, {0xbdc78000}, {0xbdc7a000}, {0xbdc7c000}, {0xbdc7e000}, {0xbdc80000}, {0xbdc82000}, {0xbdc84000}, {0xbdc86000}, {0xbdc88000}, {0xbdc8a000}, {0xbdc8c000}, {0xbdc8e000}, {0xbdc90000}, {0xbdc92000}, {0xbdc94000}, {0xbdc96000}, {0xbdc98000}, {0xbdc9a000}, {0xbdc9c000}, {0xbdc9e000}, {0xbdca0000}, {0xbdca2000}, {0xbdca4000}, {0xbdca6000}, {0xbdca8000}, {0xbdcaa000}, {0xbdcac000}, {0xbdcae000}, {0xbdcb0000}, {0xbdcb2000}, {0xbdcb4000}, {0xbdcb6000}, {0xbdcb8000}, {0xbdcba000}, {0xbdcbc000}, {0xbdcbe000}, {0xbdcc0000}, {0xbdcc2000}, {0xbdcc4000}, {0xbdcc6000}, {0xbdcc8000}, {0xbdcca000}, {0xbdccc000}, {0xbdcce000}, {0xbdcd0000}, {0xbdcd2000}, {0xbdcd4000}, {0xbdcd6000}, {0xbdcd8000}, {0xbdcda000}, {0xbdcdc000}, {0xbdcde000}, {0xbdce0000}, {0xbdce2000}, {0xbdce4000}, {0xbdce6000}, {0xbdce8000}, {0xbdcea000}, {0xbdcec000}, {0xbdcee000}, {0xbdcf0000}, {0xbdcf2000}, {0xbdcf4000}, {0xbdcf6000}, {0xbdcf8000}, {0xbdcfa000}, {0xbdcfc000}, {0xbdcfe000}, {0xbdd00000}, {0xbdd02000}, {0xbdd04000}, {0xbdd06000}, {0xbdd08000}, {0xbdd0a000}, {0xbdd0c000}, {0xbdd0e000}, {0xbdd10000}, {0xbdd12000}, {0xbdd14000}, {0xbdd16000}, {0xbdd18000}, {0xbdd1a000}, {0xbdd1c000}, {0xbdd1e000}, {0xbdd20000}, {0xbdd22000}, {0xbdd24000}, {0xbdd26000}, {0xbdd28000}, {0xbdd2a000}, {0xbdd2c000}, {0xbdd2e000}, {0xbdd30000}, {0xbdd32000}, {0xbdd34000}, {0xbdd36000}, {0xbdd38000}, {0xbdd3a000}, {0xbdd3c000}, {0xbdd3e000}, {0xbdd40000}, {0xbdd42000}, {0xbdd44000}, {0xbdd46000}, {0xbdd48000}, {0xbdd4a000}, {0xbdd4c000}, {0xbdd4e000}, {0xbdd50000}, {0xbdd52000}, {0xbdd54000}, {0xbdd56000}, {0xbdd58000}, {0xbdd5a000}, {0xbdd5c000}, {0xbdd5e000}, {0xbdd60000}, {0xbdd62000}, {0xbdd64000}, {0xbdd66000}, {0xbdd68000}, {0xbdd6a000}, {0xbdd6c000}, {0xbdd6e000}, {0xbdd70000}, {0xbdd72000}, {0xbdd74000}, {0xbdd76000}, {0xbdd78000}, {0xbdd7a000}, {0xbdd7c000}, {0xbdd7e000}, {0xbdd80000}, {0xbdd82000}, {0xbdd84000}, {0xbdd86000}, {0xbdd88000}, {0xbdd8a000}, {0xbdd8c000}, {0xbdd8e000}, {0xbdd90000}, {0xbdd92000}, {0xbdd94000}, {0xbdd96000}, {0xbdd98000}, {0xbdd9a000}, {0xbdd9c000}, {0xbdd9e000}, {0xbdda0000}, {0xbdda2000}, {0xbdda4000}, {0xbdda6000}, {0xbdda8000}, {0xbddaa000}, {0xbddac000}, {0xbddae000}, {0xbddb0000}, {0xbddb2000}, {0xbddb4000}, {0xbddb6000}, {0xbddb8000}, {0xbddba000}, {0xbddbc000}, {0xbddbe000}, {0xbddc0000}, {0xbddc2000}, {0xbddc4000}, {0xbddc6000}, {0xbddc8000}, {0xbddca000}, {0xbddcc000}, {0xbddce000}, {0xbddd0000}, {0xbddd2000}, {0xbddd4000}, {0xbddd6000}, {0xbddd8000}, {0xbddda000}, {0xbdddc000}, {0xbddde000}, {0xbdde0000}, {0xbdde2000}, {0xbdde4000}, {0xbdde6000}, {0xbdde8000}, {0xbddea000}, {0xbddec000}, {0xbddee000}, {0xbddf0000}, {0xbddf2000}, {0xbddf4000}, {0xbddf6000}, {0xbddf8000}, {0xbddfa000}, {0xbddfc000}, {0xbddfe000}, {0xbde00000}, {0xbde02000}, {0xbde04000}, {0xbde06000}, {0xbde08000}, {0xbde0a000}, {0xbde0c000}, {0xbde0e000}, {0xbde10000}, {0xbde12000}, {0xbde14000}, {0xbde16000}, {0xbde18000}, {0xbde1a000}, {0xbde1c000}, {0xbde1e000}, {0xbde20000}, {0xbde22000}, {0xbde24000}, {0xbde26000}, {0xbde28000}, {0xbde2a000}, {0xbde2c000}, {0xbde2e000}, {0xbde30000}, {0xbde32000}, {0xbde34000}, {0xbde36000}, {0xbde38000}, {0xbde3a000}, {0xbde3c000}, {0xbde3e000}, {0xbde40000}, {0xbde42000}, {0xbde44000}, {0xbde46000}, {0xbde48000}, {0xbde4a000}, {0xbde4c000}, {0xbde4e000}, {0xbde50000}, {0xbde52000}, {0xbde54000}, {0xbde56000}, {0xbde58000}, {0xbde5a000}, {0xbde5c000}, {0xbde5e000}, {0xbde60000}, {0xbde62000}, {0xbde64000}, {0xbde66000}, {0xbde68000}, {0xbde6a000}, {0xbde6c000}, {0xbde6e000}, {0xbde70000}, {0xbde72000}, {0xbde74000}, {0xbde76000}, {0xbde78000}, {0xbde7a000}, {0xbde7c000}, {0xbde7e000}, {0xbde80000}, {0xbde82000}, {0xbde84000}, {0xbde86000}, {0xbde88000}, {0xbde8a000}, {0xbde8c000}, {0xbde8e000}, {0xbde90000}, {0xbde92000}, {0xbde94000}, {0xbde96000}, {0xbde98000}, {0xbde9a000}, {0xbde9c000}, {0xbde9e000}, {0xbdea0000}, {0xbdea2000}, {0xbdea4000}, {0xbdea6000}, {0xbdea8000}, {0xbdeaa000}, {0xbdeac000}, {0xbdeae000}, {0xbdeb0000}, {0xbdeb2000}, {0xbdeb4000}, {0xbdeb6000}, {0xbdeb8000}, {0xbdeba000}, {0xbdebc000}, {0xbdebe000}, {0xbdec0000}, {0xbdec2000}, {0xbdec4000}, {0xbdec6000}, {0xbdec8000}, {0xbdeca000}, {0xbdecc000}, {0xbdece000}, {0xbded0000}, {0xbded2000}, {0xbded4000}, {0xbded6000}, {0xbded8000}, {0xbdeda000}, {0xbdedc000}, {0xbdede000}, {0xbdee0000}, {0xbdee2000}, {0xbdee4000}, {0xbdee6000}, {0xbdee8000}, {0xbdeea000}, {0xbdeec000}, {0xbdeee000}, {0xbdef0000}, {0xbdef2000}, {0xbdef4000}, {0xbdef6000}, {0xbdef8000}, {0xbdefa000}, {0xbdefc000}, {0xbdefe000}, {0xbdf00000}, {0xbdf02000}, {0xbdf04000}, {0xbdf06000}, {0xbdf08000}, {0xbdf0a000}, {0xbdf0c000}, {0xbdf0e000}, {0xbdf10000}, {0xbdf12000}, {0xbdf14000}, {0xbdf16000}, {0xbdf18000}, {0xbdf1a000}, {0xbdf1c000}, {0xbdf1e000}, {0xbdf20000}, {0xbdf22000}, {0xbdf24000}, {0xbdf26000}, {0xbdf28000}, {0xbdf2a000}, {0xbdf2c000}, {0xbdf2e000}, {0xbdf30000}, {0xbdf32000}, {0xbdf34000}, {0xbdf36000}, {0xbdf38000}, {0xbdf3a000}, {0xbdf3c000}, {0xbdf3e000}, {0xbdf40000}, {0xbdf42000}, {0xbdf44000}, {0xbdf46000}, {0xbdf48000}, {0xbdf4a000}, {0xbdf4c000}, {0xbdf4e000}, {0xbdf50000}, {0xbdf52000}, {0xbdf54000}, {0xbdf56000}, {0xbdf58000}, {0xbdf5a000}, {0xbdf5c000}, {0xbdf5e000}, {0xbdf60000}, {0xbdf62000}, {0xbdf64000}, {0xbdf66000}, {0xbdf68000}, {0xbdf6a000}, {0xbdf6c000}, {0xbdf6e000}, {0xbdf70000}, {0xbdf72000}, {0xbdf74000}, {0xbdf76000}, {0xbdf78000}, {0xbdf7a000}, {0xbdf7c000}, {0xbdf7e000}, {0xbdf80000}, {0xbdf82000}, {0xbdf84000}, {0xbdf86000}, {0xbdf88000}, {0xbdf8a000}, {0xbdf8c000}, {0xbdf8e000}, {0xbdf90000}, {0xbdf92000}, {0xbdf94000}, {0xbdf96000}, {0xbdf98000}, {0xbdf9a000}, {0xbdf9c000}, {0xbdf9e000}, {0xbdfa0000}, {0xbdfa2000}, {0xbdfa4000}, {0xbdfa6000}, {0xbdfa8000}, {0xbdfaa000}, {0xbdfac000}, {0xbdfae000}, {0xbdfb0000}, {0xbdfb2000}, {0xbdfb4000}, {0xbdfb6000}, {0xbdfb8000}, {0xbdfba000}, {0xbdfbc000}, {0xbdfbe000}, {0xbdfc0000}, {0xbdfc2000}, {0xbdfc4000}, {0xbdfc6000}, {0xbdfc8000}, {0xbdfca000}, {0xbdfcc000}, {0xbdfce000}, {0xbdfd0000}, {0xbdfd2000}, {0xbdfd4000}, {0xbdfd6000}, {0xbdfd8000}, {0xbdfda000}, {0xbdfdc000}, {0xbdfde000}, {0xbdfe0000}, {0xbdfe2000}, {0xbdfe4000}, {0xbdfe6000}, {0xbdfe8000}, {0xbdfea000}, {0xbdfec000}, {0xbdfee000}, {0xbdff0000}, {0xbdff2000}, {0xbdff4000}, {0xbdff6000}, {0xbdff8000}, {0xbdffa000}, {0xbdffc000}, {0xbdffe000}, {0xbe000000}, {0xbe002000}, {0xbe004000}, {0xbe006000}, {0xbe008000}, {0xbe00a000}, {0xbe00c000}, {0xbe00e000}, {0xbe010000}, {0xbe012000}, {0xbe014000}, {0xbe016000}, {0xbe018000}, {0xbe01a000}, {0xbe01c000}, {0xbe01e000}, {0xbe020000}, {0xbe022000}, {0xbe024000}, {0xbe026000}, {0xbe028000}, {0xbe02a000}, {0xbe02c000}, {0xbe02e000}, {0xbe030000}, {0xbe032000}, {0xbe034000}, {0xbe036000}, {0xbe038000}, {0xbe03a000}, {0xbe03c000}, {0xbe03e000}, {0xbe040000}, {0xbe042000}, {0xbe044000}, {0xbe046000}, {0xbe048000}, {0xbe04a000}, {0xbe04c000}, {0xbe04e000}, {0xbe050000}, {0xbe052000}, {0xbe054000}, {0xbe056000}, {0xbe058000}, {0xbe05a000}, {0xbe05c000}, {0xbe05e000}, {0xbe060000}, {0xbe062000}, {0xbe064000}, {0xbe066000}, {0xbe068000}, {0xbe06a000}, {0xbe06c000}, {0xbe06e000}, {0xbe070000}, {0xbe072000}, {0xbe074000}, {0xbe076000}, {0xbe078000}, {0xbe07a000}, {0xbe07c000}, {0xbe07e000}, {0xbe080000}, {0xbe082000}, {0xbe084000}, {0xbe086000}, {0xbe088000}, {0xbe08a000}, {0xbe08c000}, {0xbe08e000}, {0xbe090000}, {0xbe092000}, {0xbe094000}, {0xbe096000}, {0xbe098000}, {0xbe09a000}, {0xbe09c000}, {0xbe09e000}, {0xbe0a0000}, {0xbe0a2000}, {0xbe0a4000}, {0xbe0a6000}, {0xbe0a8000}, {0xbe0aa000}, {0xbe0ac000}, {0xbe0ae000}, {0xbe0b0000}, {0xbe0b2000}, {0xbe0b4000}, {0xbe0b6000}, {0xbe0b8000}, {0xbe0ba000}, {0xbe0bc000}, {0xbe0be000}, {0xbe0c0000}, {0xbe0c2000}, {0xbe0c4000}, {0xbe0c6000}, {0xbe0c8000}, {0xbe0ca000}, {0xbe0cc000}, {0xbe0ce000}, {0xbe0d0000}, {0xbe0d2000}, {0xbe0d4000}, {0xbe0d6000}, {0xbe0d8000}, {0xbe0da000}, {0xbe0dc000}, {0xbe0de000}, {0xbe0e0000}, {0xbe0e2000}, {0xbe0e4000}, {0xbe0e6000}, {0xbe0e8000}, {0xbe0ea000}, {0xbe0ec000}, {0xbe0ee000}, {0xbe0f0000}, {0xbe0f2000}, {0xbe0f4000}, {0xbe0f6000}, {0xbe0f8000}, {0xbe0fa000}, {0xbe0fc000}, {0xbe0fe000}, {0xbe100000}, {0xbe102000}, {0xbe104000}, {0xbe106000}, {0xbe108000}, {0xbe10a000}, {0xbe10c000}, {0xbe10e000}, {0xbe110000}, {0xbe112000}, {0xbe114000}, {0xbe116000}, {0xbe118000}, {0xbe11a000}, {0xbe11c000}, {0xbe11e000}, {0xbe120000}, {0xbe122000}, {0xbe124000}, {0xbe126000}, {0xbe128000}, {0xbe12a000}, {0xbe12c000}, {0xbe12e000}, {0xbe130000}, {0xbe132000}, {0xbe134000}, {0xbe136000}, {0xbe138000}, {0xbe13a000}, {0xbe13c000}, {0xbe13e000}, {0xbe140000}, {0xbe142000}, {0xbe144000}, {0xbe146000}, {0xbe148000}, {0xbe14a000}, {0xbe14c000}, {0xbe14e000}, {0xbe150000}, {0xbe152000}, {0xbe154000}, {0xbe156000}, {0xbe158000}, {0xbe15a000}, {0xbe15c000}, {0xbe15e000}, {0xbe160000}, {0xbe162000}, {0xbe164000}, {0xbe166000}, {0xbe168000}, {0xbe16a000}, {0xbe16c000}, {0xbe16e000}, {0xbe170000}, {0xbe172000}, {0xbe174000}, {0xbe176000}, {0xbe178000}, {0xbe17a000}, {0xbe17c000}, {0xbe17e000}, {0xbe180000}, {0xbe182000}, {0xbe184000}, {0xbe186000}, {0xbe188000}, {0xbe18a000}, {0xbe18c000}, {0xbe18e000}, {0xbe190000}, {0xbe192000}, {0xbe194000}, {0xbe196000}, {0xbe198000}, {0xbe19a000}, {0xbe19c000}, {0xbe19e000}, {0xbe1a0000}, {0xbe1a2000}, {0xbe1a4000}, {0xbe1a6000}, {0xbe1a8000}, {0xbe1aa000}, {0xbe1ac000}, {0xbe1ae000}, {0xbe1b0000}, {0xbe1b2000}, {0xbe1b4000}, {0xbe1b6000}, {0xbe1b8000}, {0xbe1ba000}, {0xbe1bc000}, {0xbe1be000}, {0xbe1c0000}, {0xbe1c2000}, {0xbe1c4000}, {0xbe1c6000}, {0xbe1c8000}, {0xbe1ca000}, {0xbe1cc000}, {0xbe1ce000}, {0xbe1d0000}, {0xbe1d2000}, {0xbe1d4000}, {0xbe1d6000}, {0xbe1d8000}, {0xbe1da000}, {0xbe1dc000}, {0xbe1de000}, {0xbe1e0000}, {0xbe1e2000}, {0xbe1e4000}, {0xbe1e6000}, {0xbe1e8000}, {0xbe1ea000}, {0xbe1ec000}, {0xbe1ee000}, {0xbe1f0000}, {0xbe1f2000}, {0xbe1f4000}, {0xbe1f6000}, {0xbe1f8000}, {0xbe1fa000}, {0xbe1fc000}, {0xbe1fe000}, {0xbe200000}, {0xbe202000}, {0xbe204000}, {0xbe206000}, {0xbe208000}, {0xbe20a000}, {0xbe20c000}, {0xbe20e000}, {0xbe210000}, {0xbe212000}, {0xbe214000}, {0xbe216000}, {0xbe218000}, {0xbe21a000}, {0xbe21c000}, {0xbe21e000}, {0xbe220000}, {0xbe222000}, {0xbe224000}, {0xbe226000}, {0xbe228000}, {0xbe22a000}, {0xbe22c000}, {0xbe22e000}, {0xbe230000}, {0xbe232000}, {0xbe234000}, {0xbe236000}, {0xbe238000}, {0xbe23a000}, {0xbe23c000}, {0xbe23e000}, {0xbe240000}, {0xbe242000}, {0xbe244000}, {0xbe246000}, {0xbe248000}, {0xbe24a000}, {0xbe24c000}, {0xbe24e000}, {0xbe250000}, {0xbe252000}, {0xbe254000}, {0xbe256000}, {0xbe258000}, {0xbe25a000}, {0xbe25c000}, {0xbe25e000}, {0xbe260000}, {0xbe262000}, {0xbe264000}, {0xbe266000}, {0xbe268000}, {0xbe26a000}, {0xbe26c000}, {0xbe26e000}, {0xbe270000}, {0xbe272000}, {0xbe274000}, {0xbe276000}, {0xbe278000}, {0xbe27a000}, {0xbe27c000}, {0xbe27e000}, {0xbe280000}, {0xbe282000}, {0xbe284000}, {0xbe286000}, {0xbe288000}, {0xbe28a000}, {0xbe28c000}, {0xbe28e000}, {0xbe290000}, {0xbe292000}, {0xbe294000}, {0xbe296000}, {0xbe298000}, {0xbe29a000}, {0xbe29c000}, {0xbe29e000}, {0xbe2a0000}, {0xbe2a2000}, {0xbe2a4000}, {0xbe2a6000}, {0xbe2a8000}, {0xbe2aa000}, {0xbe2ac000}, {0xbe2ae000}, {0xbe2b0000}, {0xbe2b2000}, {0xbe2b4000}, {0xbe2b6000}, {0xbe2b8000}, {0xbe2ba000}, {0xbe2bc000}, {0xbe2be000}, {0xbe2c0000}, {0xbe2c2000}, {0xbe2c4000}, {0xbe2c6000}, {0xbe2c8000}, {0xbe2ca000}, {0xbe2cc000}, {0xbe2ce000}, {0xbe2d0000}, {0xbe2d2000}, {0xbe2d4000}, {0xbe2d6000}, {0xbe2d8000}, {0xbe2da000}, {0xbe2dc000}, {0xbe2de000}, {0xbe2e0000}, {0xbe2e2000}, {0xbe2e4000}, {0xbe2e6000}, {0xbe2e8000}, {0xbe2ea000}, {0xbe2ec000}, {0xbe2ee000}, {0xbe2f0000}, {0xbe2f2000}, {0xbe2f4000}, {0xbe2f6000}, {0xbe2f8000}, {0xbe2fa000}, {0xbe2fc000}, {0xbe2fe000}, {0xbe300000}, {0xbe302000}, {0xbe304000}, {0xbe306000}, {0xbe308000}, {0xbe30a000}, {0xbe30c000}, {0xbe30e000}, {0xbe310000}, {0xbe312000}, {0xbe314000}, {0xbe316000}, {0xbe318000}, {0xbe31a000}, {0xbe31c000}, {0xbe31e000}, {0xbe320000}, {0xbe322000}, {0xbe324000}, {0xbe326000}, {0xbe328000}, {0xbe32a000}, {0xbe32c000}, {0xbe32e000}, {0xbe330000}, {0xbe332000}, {0xbe334000}, {0xbe336000}, {0xbe338000}, {0xbe33a000}, {0xbe33c000}, {0xbe33e000}, {0xbe340000}, {0xbe342000}, {0xbe344000}, {0xbe346000}, {0xbe348000}, {0xbe34a000}, {0xbe34c000}, {0xbe34e000}, {0xbe350000}, {0xbe352000}, {0xbe354000}, {0xbe356000}, {0xbe358000}, {0xbe35a000}, {0xbe35c000}, {0xbe35e000}, {0xbe360000}, {0xbe362000}, {0xbe364000}, {0xbe366000}, {0xbe368000}, {0xbe36a000}, {0xbe36c000}, {0xbe36e000}, {0xbe370000}, {0xbe372000}, {0xbe374000}, {0xbe376000}, {0xbe378000}, {0xbe37a000}, {0xbe37c000}, {0xbe37e000}, {0xbe380000}, {0xbe382000}, {0xbe384000}, {0xbe386000}, {0xbe388000}, {0xbe38a000}, {0xbe38c000}, {0xbe38e000}, {0xbe390000}, {0xbe392000}, {0xbe394000}, {0xbe396000}, {0xbe398000}, {0xbe39a000}, {0xbe39c000}, {0xbe39e000}, {0xbe3a0000}, {0xbe3a2000}, {0xbe3a4000}, {0xbe3a6000}, {0xbe3a8000}, {0xbe3aa000}, {0xbe3ac000}, {0xbe3ae000}, {0xbe3b0000}, {0xbe3b2000}, {0xbe3b4000}, {0xbe3b6000}, {0xbe3b8000}, {0xbe3ba000}, {0xbe3bc000}, {0xbe3be000}, {0xbe3c0000}, {0xbe3c2000}, {0xbe3c4000}, {0xbe3c6000}, {0xbe3c8000}, {0xbe3ca000}, {0xbe3cc000}, {0xbe3ce000}, {0xbe3d0000}, {0xbe3d2000}, {0xbe3d4000}, {0xbe3d6000}, {0xbe3d8000}, {0xbe3da000}, {0xbe3dc000}, {0xbe3de000}, {0xbe3e0000}, {0xbe3e2000}, {0xbe3e4000}, {0xbe3e6000}, {0xbe3e8000}, {0xbe3ea000}, {0xbe3ec000}, {0xbe3ee000}, {0xbe3f0000}, {0xbe3f2000}, {0xbe3f4000}, {0xbe3f6000}, {0xbe3f8000}, {0xbe3fa000}, {0xbe3fc000}, {0xbe3fe000}, {0xbe400000}, {0xbe402000}, {0xbe404000}, {0xbe406000}, {0xbe408000}, {0xbe40a000}, {0xbe40c000}, {0xbe40e000}, {0xbe410000}, {0xbe412000}, {0xbe414000}, {0xbe416000}, {0xbe418000}, {0xbe41a000}, {0xbe41c000}, {0xbe41e000}, {0xbe420000}, {0xbe422000}, {0xbe424000}, {0xbe426000}, {0xbe428000}, {0xbe42a000}, {0xbe42c000}, {0xbe42e000}, {0xbe430000}, {0xbe432000}, {0xbe434000}, {0xbe436000}, {0xbe438000}, {0xbe43a000}, {0xbe43c000}, {0xbe43e000}, {0xbe440000}, {0xbe442000}, {0xbe444000}, {0xbe446000}, {0xbe448000}, {0xbe44a000}, {0xbe44c000}, {0xbe44e000}, {0xbe450000}, {0xbe452000}, {0xbe454000}, {0xbe456000}, {0xbe458000}, {0xbe45a000}, {0xbe45c000}, {0xbe45e000}, {0xbe460000}, {0xbe462000}, {0xbe464000}, {0xbe466000}, {0xbe468000}, {0xbe46a000}, {0xbe46c000}, {0xbe46e000}, {0xbe470000}, {0xbe472000}, {0xbe474000}, {0xbe476000}, {0xbe478000}, {0xbe47a000}, {0xbe47c000}, {0xbe47e000}, {0xbe480000}, {0xbe482000}, {0xbe484000}, {0xbe486000}, {0xbe488000}, {0xbe48a000}, {0xbe48c000}, {0xbe48e000}, {0xbe490000}, {0xbe492000}, {0xbe494000}, {0xbe496000}, {0xbe498000}, {0xbe49a000}, {0xbe49c000}, {0xbe49e000}, {0xbe4a0000}, {0xbe4a2000}, {0xbe4a4000}, {0xbe4a6000}, {0xbe4a8000}, {0xbe4aa000}, {0xbe4ac000}, {0xbe4ae000}, {0xbe4b0000}, {0xbe4b2000}, {0xbe4b4000}, {0xbe4b6000}, {0xbe4b8000}, {0xbe4ba000}, {0xbe4bc000}, {0xbe4be000}, {0xbe4c0000}, {0xbe4c2000}, {0xbe4c4000}, {0xbe4c6000}, {0xbe4c8000}, {0xbe4ca000}, {0xbe4cc000}, {0xbe4ce000}, {0xbe4d0000}, {0xbe4d2000}, {0xbe4d4000}, {0xbe4d6000}, {0xbe4d8000}, {0xbe4da000}, {0xbe4dc000}, {0xbe4de000}, {0xbe4e0000}, {0xbe4e2000}, {0xbe4e4000}, {0xbe4e6000}, {0xbe4e8000}, {0xbe4ea000}, {0xbe4ec000}, {0xbe4ee000}, {0xbe4f0000}, {0xbe4f2000}, {0xbe4f4000}, {0xbe4f6000}, {0xbe4f8000}, {0xbe4fa000}, {0xbe4fc000}, {0xbe4fe000}, {0xbe500000}, {0xbe502000}, {0xbe504000}, {0xbe506000}, {0xbe508000}, {0xbe50a000}, {0xbe50c000}, {0xbe50e000}, {0xbe510000}, {0xbe512000}, {0xbe514000}, {0xbe516000}, {0xbe518000}, {0xbe51a000}, {0xbe51c000}, {0xbe51e000}, {0xbe520000}, {0xbe522000}, {0xbe524000}, {0xbe526000}, {0xbe528000}, {0xbe52a000}, {0xbe52c000}, {0xbe52e000}, {0xbe530000}, {0xbe532000}, {0xbe534000}, {0xbe536000}, {0xbe538000}, {0xbe53a000}, {0xbe53c000}, {0xbe53e000}, {0xbe540000}, {0xbe542000}, {0xbe544000}, {0xbe546000}, {0xbe548000}, {0xbe54a000}, {0xbe54c000}, {0xbe54e000}, {0xbe550000}, {0xbe552000}, {0xbe554000}, {0xbe556000}, {0xbe558000}, {0xbe55a000}, {0xbe55c000}, {0xbe55e000}, {0xbe560000}, {0xbe562000}, {0xbe564000}, {0xbe566000}, {0xbe568000}, {0xbe56a000}, {0xbe56c000}, {0xbe56e000}, {0xbe570000}, {0xbe572000}, {0xbe574000}, {0xbe576000}, {0xbe578000}, {0xbe57a000}, {0xbe57c000}, {0xbe57e000}, {0xbe580000}, {0xbe582000}, {0xbe584000}, {0xbe586000}, {0xbe588000}, {0xbe58a000}, {0xbe58c000}, {0xbe58e000}, {0xbe590000}, {0xbe592000}, {0xbe594000}, {0xbe596000}, {0xbe598000}, {0xbe59a000}, {0xbe59c000}, {0xbe59e000}, {0xbe5a0000}, {0xbe5a2000}, {0xbe5a4000}, {0xbe5a6000}, {0xbe5a8000}, {0xbe5aa000}, {0xbe5ac000}, {0xbe5ae000}, {0xbe5b0000}, {0xbe5b2000}, {0xbe5b4000}, {0xbe5b6000}, {0xbe5b8000}, {0xbe5ba000}, {0xbe5bc000}, {0xbe5be000}, {0xbe5c0000}, {0xbe5c2000}, {0xbe5c4000}, {0xbe5c6000}, {0xbe5c8000}, {0xbe5ca000}, {0xbe5cc000}, {0xbe5ce000}, {0xbe5d0000}, {0xbe5d2000}, {0xbe5d4000}, {0xbe5d6000}, {0xbe5d8000}, {0xbe5da000}, {0xbe5dc000}, {0xbe5de000}, {0xbe5e0000}, {0xbe5e2000}, {0xbe5e4000}, {0xbe5e6000}, {0xbe5e8000}, {0xbe5ea000}, {0xbe5ec000}, {0xbe5ee000}, {0xbe5f0000}, {0xbe5f2000}, {0xbe5f4000}, {0xbe5f6000}, {0xbe5f8000}, {0xbe5fa000}, {0xbe5fc000}, {0xbe5fe000}, {0xbe600000}, {0xbe602000}, {0xbe604000}, {0xbe606000}, {0xbe608000}, {0xbe60a000}, {0xbe60c000}, {0xbe60e000}, {0xbe610000}, {0xbe612000}, {0xbe614000}, {0xbe616000}, {0xbe618000}, {0xbe61a000}, {0xbe61c000}, {0xbe61e000}, {0xbe620000}, {0xbe622000}, {0xbe624000}, {0xbe626000}, {0xbe628000}, {0xbe62a000}, {0xbe62c000}, {0xbe62e000}, {0xbe630000}, {0xbe632000}, {0xbe634000}, {0xbe636000}, {0xbe638000}, {0xbe63a000}, {0xbe63c000}, {0xbe63e000}, {0xbe640000}, {0xbe642000}, {0xbe644000}, {0xbe646000}, {0xbe648000}, {0xbe64a000}, {0xbe64c000}, {0xbe64e000}, {0xbe650000}, {0xbe652000}, {0xbe654000}, {0xbe656000}, {0xbe658000}, {0xbe65a000}, {0xbe65c000}, {0xbe65e000}, {0xbe660000}, {0xbe662000}, {0xbe664000}, {0xbe666000}, {0xbe668000}, {0xbe66a000}, {0xbe66c000}, {0xbe66e000}, {0xbe670000}, {0xbe672000}, {0xbe674000}, {0xbe676000}, {0xbe678000}, {0xbe67a000}, {0xbe67c000}, {0xbe67e000}, {0xbe680000}, {0xbe682000}, {0xbe684000}, {0xbe686000}, {0xbe688000}, {0xbe68a000}, {0xbe68c000}, {0xbe68e000}, {0xbe690000}, {0xbe692000}, {0xbe694000}, {0xbe696000}, {0xbe698000}, {0xbe69a000}, {0xbe69c000}, {0xbe69e000}, {0xbe6a0000}, {0xbe6a2000}, {0xbe6a4000}, {0xbe6a6000}, {0xbe6a8000}, {0xbe6aa000}, {0xbe6ac000}, {0xbe6ae000}, {0xbe6b0000}, {0xbe6b2000}, {0xbe6b4000}, {0xbe6b6000}, {0xbe6b8000}, {0xbe6ba000}, {0xbe6bc000}, {0xbe6be000}, {0xbe6c0000}, {0xbe6c2000}, {0xbe6c4000}, {0xbe6c6000}, {0xbe6c8000}, {0xbe6ca000}, {0xbe6cc000}, {0xbe6ce000}, {0xbe6d0000}, {0xbe6d2000}, {0xbe6d4000}, {0xbe6d6000}, {0xbe6d8000}, {0xbe6da000}, {0xbe6dc000}, {0xbe6de000}, {0xbe6e0000}, {0xbe6e2000}, {0xbe6e4000}, {0xbe6e6000}, {0xbe6e8000}, {0xbe6ea000}, {0xbe6ec000}, {0xbe6ee000}, {0xbe6f0000}, {0xbe6f2000}, {0xbe6f4000}, {0xbe6f6000}, {0xbe6f8000}, {0xbe6fa000}, {0xbe6fc000}, {0xbe6fe000}, {0xbe700000}, {0xbe702000}, {0xbe704000}, {0xbe706000}, {0xbe708000}, {0xbe70a000}, {0xbe70c000}, {0xbe70e000}, {0xbe710000}, {0xbe712000}, {0xbe714000}, {0xbe716000}, {0xbe718000}, {0xbe71a000}, {0xbe71c000}, {0xbe71e000}, {0xbe720000}, {0xbe722000}, {0xbe724000}, {0xbe726000}, {0xbe728000}, {0xbe72a000}, {0xbe72c000}, {0xbe72e000}, {0xbe730000}, {0xbe732000}, {0xbe734000}, {0xbe736000}, {0xbe738000}, {0xbe73a000}, {0xbe73c000}, {0xbe73e000}, {0xbe740000}, {0xbe742000}, {0xbe744000}, {0xbe746000}, {0xbe748000}, {0xbe74a000}, {0xbe74c000}, {0xbe74e000}, {0xbe750000}, {0xbe752000}, {0xbe754000}, {0xbe756000}, {0xbe758000}, {0xbe75a000}, {0xbe75c000}, {0xbe75e000}, {0xbe760000}, {0xbe762000}, {0xbe764000}, {0xbe766000}, {0xbe768000}, {0xbe76a000}, {0xbe76c000}, {0xbe76e000}, {0xbe770000}, {0xbe772000}, {0xbe774000}, {0xbe776000}, {0xbe778000}, {0xbe77a000}, {0xbe77c000}, {0xbe77e000}, {0xbe780000}, {0xbe782000}, {0xbe784000}, {0xbe786000}, {0xbe788000}, {0xbe78a000}, {0xbe78c000}, {0xbe78e000}, {0xbe790000}, {0xbe792000}, {0xbe794000}, {0xbe796000}, {0xbe798000}, {0xbe79a000}, {0xbe79c000}, {0xbe79e000}, {0xbe7a0000}, {0xbe7a2000}, {0xbe7a4000}, {0xbe7a6000}, {0xbe7a8000}, {0xbe7aa000}, {0xbe7ac000}, {0xbe7ae000}, {0xbe7b0000}, {0xbe7b2000}, {0xbe7b4000}, {0xbe7b6000}, {0xbe7b8000}, {0xbe7ba000}, {0xbe7bc000}, {0xbe7be000}, {0xbe7c0000}, {0xbe7c2000}, {0xbe7c4000}, {0xbe7c6000}, {0xbe7c8000}, {0xbe7ca000}, {0xbe7cc000}, {0xbe7ce000}, {0xbe7d0000}, {0xbe7d2000}, {0xbe7d4000}, {0xbe7d6000}, {0xbe7d8000}, {0xbe7da000}, {0xbe7dc000}, {0xbe7de000}, {0xbe7e0000}, {0xbe7e2000}, {0xbe7e4000}, {0xbe7e6000}, {0xbe7e8000}, {0xbe7ea000}, {0xbe7ec000}, {0xbe7ee000}, {0xbe7f0000}, {0xbe7f2000}, {0xbe7f4000}, {0xbe7f6000}, {0xbe7f8000}, {0xbe7fa000}, {0xbe7fc000}, {0xbe7fe000}, {0xbe800000}, {0xbe802000}, {0xbe804000}, {0xbe806000}, {0xbe808000}, {0xbe80a000}, {0xbe80c000}, {0xbe80e000}, {0xbe810000}, {0xbe812000}, {0xbe814000}, {0xbe816000}, {0xbe818000}, {0xbe81a000}, {0xbe81c000}, {0xbe81e000}, {0xbe820000}, {0xbe822000}, {0xbe824000}, {0xbe826000}, {0xbe828000}, {0xbe82a000}, {0xbe82c000}, {0xbe82e000}, {0xbe830000}, {0xbe832000}, {0xbe834000}, {0xbe836000}, {0xbe838000}, {0xbe83a000}, {0xbe83c000}, {0xbe83e000}, {0xbe840000}, {0xbe842000}, {0xbe844000}, {0xbe846000}, {0xbe848000}, {0xbe84a000}, {0xbe84c000}, {0xbe84e000}, {0xbe850000}, {0xbe852000}, {0xbe854000}, {0xbe856000}, {0xbe858000}, {0xbe85a000}, {0xbe85c000}, {0xbe85e000}, {0xbe860000}, {0xbe862000}, {0xbe864000}, {0xbe866000}, {0xbe868000}, {0xbe86a000}, {0xbe86c000}, {0xbe86e000}, {0xbe870000}, {0xbe872000}, {0xbe874000}, {0xbe876000}, {0xbe878000}, {0xbe87a000}, {0xbe87c000}, {0xbe87e000}, {0xbe880000}, {0xbe882000}, {0xbe884000}, {0xbe886000}, {0xbe888000}, {0xbe88a000}, {0xbe88c000}, {0xbe88e000}, {0xbe890000}, {0xbe892000}, {0xbe894000}, {0xbe896000}, {0xbe898000}, {0xbe89a000}, {0xbe89c000}, {0xbe89e000}, {0xbe8a0000}, {0xbe8a2000}, {0xbe8a4000}, {0xbe8a6000}, {0xbe8a8000}, {0xbe8aa000}, {0xbe8ac000}, {0xbe8ae000}, {0xbe8b0000}, {0xbe8b2000}, {0xbe8b4000}, {0xbe8b6000}, {0xbe8b8000}, {0xbe8ba000}, {0xbe8bc000}, {0xbe8be000}, {0xbe8c0000}, {0xbe8c2000}, {0xbe8c4000}, {0xbe8c6000}, {0xbe8c8000}, {0xbe8ca000}, {0xbe8cc000}, {0xbe8ce000}, {0xbe8d0000}, {0xbe8d2000}, {0xbe8d4000}, {0xbe8d6000}, {0xbe8d8000}, {0xbe8da000}, {0xbe8dc000}, {0xbe8de000}, {0xbe8e0000}, {0xbe8e2000}, {0xbe8e4000}, {0xbe8e6000}, {0xbe8e8000}, {0xbe8ea000}, {0xbe8ec000}, {0xbe8ee000}, {0xbe8f0000}, {0xbe8f2000}, {0xbe8f4000}, {0xbe8f6000}, {0xbe8f8000}, {0xbe8fa000}, {0xbe8fc000}, {0xbe8fe000}, {0xbe900000}, {0xbe902000}, {0xbe904000}, {0xbe906000}, {0xbe908000}, {0xbe90a000}, {0xbe90c000}, {0xbe90e000}, {0xbe910000}, {0xbe912000}, {0xbe914000}, {0xbe916000}, {0xbe918000}, {0xbe91a000}, {0xbe91c000}, {0xbe91e000}, {0xbe920000}, {0xbe922000}, {0xbe924000}, {0xbe926000}, {0xbe928000}, {0xbe92a000}, {0xbe92c000}, {0xbe92e000}, {0xbe930000}, {0xbe932000}, {0xbe934000}, {0xbe936000}, {0xbe938000}, {0xbe93a000}, {0xbe93c000}, {0xbe93e000}, {0xbe940000}, {0xbe942000}, {0xbe944000}, {0xbe946000}, {0xbe948000}, {0xbe94a000}, {0xbe94c000}, {0xbe94e000}, {0xbe950000}, {0xbe952000}, {0xbe954000}, {0xbe956000}, {0xbe958000}, {0xbe95a000}, {0xbe95c000}, {0xbe95e000}, {0xbe960000}, {0xbe962000}, {0xbe964000}, {0xbe966000}, {0xbe968000}, {0xbe96a000}, {0xbe96c000}, {0xbe96e000}, {0xbe970000}, {0xbe972000}, {0xbe974000}, {0xbe976000}, {0xbe978000}, {0xbe97a000}, {0xbe97c000}, {0xbe97e000}, {0xbe980000}, {0xbe982000}, {0xbe984000}, {0xbe986000}, {0xbe988000}, {0xbe98a000}, {0xbe98c000}, {0xbe98e000}, {0xbe990000}, {0xbe992000}, {0xbe994000}, {0xbe996000}, {0xbe998000}, {0xbe99a000}, {0xbe99c000}, {0xbe99e000}, {0xbe9a0000}, {0xbe9a2000}, {0xbe9a4000}, {0xbe9a6000}, {0xbe9a8000}, {0xbe9aa000}, {0xbe9ac000}, {0xbe9ae000}, {0xbe9b0000}, {0xbe9b2000}, {0xbe9b4000}, {0xbe9b6000}, {0xbe9b8000}, {0xbe9ba000}, {0xbe9bc000}, {0xbe9be000}, {0xbe9c0000}, {0xbe9c2000}, {0xbe9c4000}, {0xbe9c6000}, {0xbe9c8000}, {0xbe9ca000}, {0xbe9cc000}, {0xbe9ce000}, {0xbe9d0000}, {0xbe9d2000}, {0xbe9d4000}, {0xbe9d6000}, {0xbe9d8000}, {0xbe9da000}, {0xbe9dc000}, {0xbe9de000}, {0xbe9e0000}, {0xbe9e2000}, {0xbe9e4000}, {0xbe9e6000}, {0xbe9e8000}, {0xbe9ea000}, {0xbe9ec000}, {0xbe9ee000}, {0xbe9f0000}, {0xbe9f2000}, {0xbe9f4000}, {0xbe9f6000}, {0xbe9f8000}, {0xbe9fa000}, {0xbe9fc000}, {0xbe9fe000}, {0xbea00000}, {0xbea02000}, {0xbea04000}, {0xbea06000}, {0xbea08000}, {0xbea0a000}, {0xbea0c000}, {0xbea0e000}, {0xbea10000}, {0xbea12000}, {0xbea14000}, {0xbea16000}, {0xbea18000}, {0xbea1a000}, {0xbea1c000}, {0xbea1e000}, {0xbea20000}, {0xbea22000}, {0xbea24000}, {0xbea26000}, {0xbea28000}, {0xbea2a000}, {0xbea2c000}, {0xbea2e000}, {0xbea30000}, {0xbea32000}, {0xbea34000}, {0xbea36000}, {0xbea38000}, {0xbea3a000}, {0xbea3c000}, {0xbea3e000}, {0xbea40000}, {0xbea42000}, {0xbea44000}, {0xbea46000}, {0xbea48000}, {0xbea4a000}, {0xbea4c000}, {0xbea4e000}, {0xbea50000}, {0xbea52000}, {0xbea54000}, {0xbea56000}, {0xbea58000}, {0xbea5a000}, {0xbea5c000}, {0xbea5e000}, {0xbea60000}, {0xbea62000}, {0xbea64000}, {0xbea66000}, {0xbea68000}, {0xbea6a000}, {0xbea6c000}, {0xbea6e000}, {0xbea70000}, {0xbea72000}, {0xbea74000}, {0xbea76000}, {0xbea78000}, {0xbea7a000}, {0xbea7c000}, {0xbea7e000}, {0xbea80000}, {0xbea82000}, {0xbea84000}, {0xbea86000}, {0xbea88000}, {0xbea8a000}, {0xbea8c000}, {0xbea8e000}, {0xbea90000}, {0xbea92000}, {0xbea94000}, {0xbea96000}, {0xbea98000}, {0xbea9a000}, {0xbea9c000}, {0xbea9e000}, {0xbeaa0000}, {0xbeaa2000}, {0xbeaa4000}, {0xbeaa6000}, {0xbeaa8000}, {0xbeaaa000}, {0xbeaac000}, {0xbeaae000}, {0xbeab0000}, {0xbeab2000}, {0xbeab4000}, {0xbeab6000}, {0xbeab8000}, {0xbeaba000}, {0xbeabc000}, {0xbeabe000}, {0xbeac0000}, {0xbeac2000}, {0xbeac4000}, {0xbeac6000}, {0xbeac8000}, {0xbeaca000}, {0xbeacc000}, {0xbeace000}, {0xbead0000}, {0xbead2000}, {0xbead4000}, {0xbead6000}, {0xbead8000}, {0xbeada000}, {0xbeadc000}, {0xbeade000}, {0xbeae0000}, {0xbeae2000}, {0xbeae4000}, {0xbeae6000}, {0xbeae8000}, {0xbeaea000}, {0xbeaec000}, {0xbeaee000}, {0xbeaf0000}, {0xbeaf2000}, {0xbeaf4000}, {0xbeaf6000}, {0xbeaf8000}, {0xbeafa000}, {0xbeafc000}, {0xbeafe000}, {0xbeb00000}, {0xbeb02000}, {0xbeb04000}, {0xbeb06000}, {0xbeb08000}, {0xbeb0a000}, {0xbeb0c000}, {0xbeb0e000}, {0xbeb10000}, {0xbeb12000}, {0xbeb14000}, {0xbeb16000}, {0xbeb18000}, {0xbeb1a000}, {0xbeb1c000}, {0xbeb1e000}, {0xbeb20000}, {0xbeb22000}, {0xbeb24000}, {0xbeb26000}, {0xbeb28000}, {0xbeb2a000}, {0xbeb2c000}, {0xbeb2e000}, {0xbeb30000}, {0xbeb32000}, {0xbeb34000}, {0xbeb36000}, {0xbeb38000}, {0xbeb3a000}, {0xbeb3c000}, {0xbeb3e000}, {0xbeb40000}, {0xbeb42000}, {0xbeb44000}, {0xbeb46000}, {0xbeb48000}, {0xbeb4a000}, {0xbeb4c000}, {0xbeb4e000}, {0xbeb50000}, {0xbeb52000}, {0xbeb54000}, {0xbeb56000}, {0xbeb58000}, {0xbeb5a000}, {0xbeb5c000}, {0xbeb5e000}, {0xbeb60000}, {0xbeb62000}, {0xbeb64000}, {0xbeb66000}, {0xbeb68000}, {0xbeb6a000}, {0xbeb6c000}, {0xbeb6e000}, {0xbeb70000}, {0xbeb72000}, {0xbeb74000}, {0xbeb76000}, {0xbeb78000}, {0xbeb7a000}, {0xbeb7c000}, {0xbeb7e000}, {0xbeb80000}, {0xbeb82000}, {0xbeb84000}, {0xbeb86000}, {0xbeb88000}, {0xbeb8a000}, {0xbeb8c000}, {0xbeb8e000}, {0xbeb90000}, {0xbeb92000}, {0xbeb94000}, {0xbeb96000}, {0xbeb98000}, {0xbeb9a000}, {0xbeb9c000}, {0xbeb9e000}, {0xbeba0000}, {0xbeba2000}, {0xbeba4000}, {0xbeba6000}, {0xbeba8000}, {0xbebaa000}, {0xbebac000}, {0xbebae000}, {0xbebb0000}, {0xbebb2000}, {0xbebb4000}, {0xbebb6000}, {0xbebb8000}, {0xbebba000}, {0xbebbc000}, {0xbebbe000}, {0xbebc0000}, {0xbebc2000}, {0xbebc4000}, {0xbebc6000}, {0xbebc8000}, {0xbebca000}, {0xbebcc000}, {0xbebce000}, {0xbebd0000}, {0xbebd2000}, {0xbebd4000}, {0xbebd6000}, {0xbebd8000}, {0xbebda000}, {0xbebdc000}, {0xbebde000}, {0xbebe0000}, {0xbebe2000}, {0xbebe4000}, {0xbebe6000}, {0xbebe8000}, {0xbebea000}, {0xbebec000}, {0xbebee000}, {0xbebf0000}, {0xbebf2000}, {0xbebf4000}, {0xbebf6000}, {0xbebf8000}, {0xbebfa000}, {0xbebfc000}, {0xbebfe000}, {0xbec00000}, {0xbec02000}, {0xbec04000}, {0xbec06000}, {0xbec08000}, {0xbec0a000}, {0xbec0c000}, {0xbec0e000}, {0xbec10000}, {0xbec12000}, {0xbec14000}, {0xbec16000}, {0xbec18000}, {0xbec1a000}, {0xbec1c000}, {0xbec1e000}, {0xbec20000}, {0xbec22000}, {0xbec24000}, {0xbec26000}, {0xbec28000}, {0xbec2a000}, {0xbec2c000}, {0xbec2e000}, {0xbec30000}, {0xbec32000}, {0xbec34000}, {0xbec36000}, {0xbec38000}, {0xbec3a000}, {0xbec3c000}, {0xbec3e000}, {0xbec40000}, {0xbec42000}, {0xbec44000}, {0xbec46000}, {0xbec48000}, {0xbec4a000}, {0xbec4c000}, {0xbec4e000}, {0xbec50000}, {0xbec52000}, {0xbec54000}, {0xbec56000}, {0xbec58000}, {0xbec5a000}, {0xbec5c000}, {0xbec5e000}, {0xbec60000}, {0xbec62000}, {0xbec64000}, {0xbec66000}, {0xbec68000}, {0xbec6a000}, {0xbec6c000}, {0xbec6e000}, {0xbec70000}, {0xbec72000}, {0xbec74000}, {0xbec76000}, {0xbec78000}, {0xbec7a000}, {0xbec7c000}, {0xbec7e000}, {0xbec80000}, {0xbec82000}, {0xbec84000}, {0xbec86000}, {0xbec88000}, {0xbec8a000}, {0xbec8c000}, {0xbec8e000}, {0xbec90000}, {0xbec92000}, {0xbec94000}, {0xbec96000}, {0xbec98000}, {0xbec9a000}, {0xbec9c000}, {0xbec9e000}, {0xbeca0000}, {0xbeca2000}, {0xbeca4000}, {0xbeca6000}, {0xbeca8000}, {0xbecaa000}, {0xbecac000}, {0xbecae000}, {0xbecb0000}, {0xbecb2000}, {0xbecb4000}, {0xbecb6000}, {0xbecb8000}, {0xbecba000}, {0xbecbc000}, {0xbecbe000}, {0xbecc0000}, {0xbecc2000}, {0xbecc4000}, {0xbecc6000}, {0xbecc8000}, {0xbecca000}, {0xbeccc000}, {0xbecce000}, {0xbecd0000}, {0xbecd2000}, {0xbecd4000}, {0xbecd6000}, {0xbecd8000}, {0xbecda000}, {0xbecdc000}, {0xbecde000}, {0xbece0000}, {0xbece2000}, {0xbece4000}, {0xbece6000}, {0xbece8000}, {0xbecea000}, {0xbecec000}, {0xbecee000}, {0xbecf0000}, {0xbecf2000}, {0xbecf4000}, {0xbecf6000}, {0xbecf8000}, {0xbecfa000}, {0xbecfc000}, {0xbecfe000}, {0xbed00000}, {0xbed02000}, {0xbed04000}, {0xbed06000}, {0xbed08000}, {0xbed0a000}, {0xbed0c000}, {0xbed0e000}, {0xbed10000}, {0xbed12000}, {0xbed14000}, {0xbed16000}, {0xbed18000}, {0xbed1a000}, {0xbed1c000}, {0xbed1e000}, {0xbed20000}, {0xbed22000}, {0xbed24000}, {0xbed26000}, {0xbed28000}, {0xbed2a000}, {0xbed2c000}, {0xbed2e000}, {0xbed30000}, {0xbed32000}, {0xbed34000}, {0xbed36000}, {0xbed38000}, {0xbed3a000}, {0xbed3c000}, {0xbed3e000}, {0xbed40000}, {0xbed42000}, {0xbed44000}, {0xbed46000}, {0xbed48000}, {0xbed4a000}, {0xbed4c000}, {0xbed4e000}, {0xbed50000}, {0xbed52000}, {0xbed54000}, {0xbed56000}, {0xbed58000}, {0xbed5a000}, {0xbed5c000}, {0xbed5e000}, {0xbed60000}, {0xbed62000}, {0xbed64000}, {0xbed66000}, {0xbed68000}, {0xbed6a000}, {0xbed6c000}, {0xbed6e000}, {0xbed70000}, {0xbed72000}, {0xbed74000}, {0xbed76000}, {0xbed78000}, {0xbed7a000}, {0xbed7c000}, {0xbed7e000}, {0xbed80000}, {0xbed82000}, {0xbed84000}, {0xbed86000}, {0xbed88000}, {0xbed8a000}, {0xbed8c000}, {0xbed8e000}, {0xbed90000}, {0xbed92000}, {0xbed94000}, {0xbed96000}, {0xbed98000}, {0xbed9a000}, {0xbed9c000}, {0xbed9e000}, {0xbeda0000}, {0xbeda2000}, {0xbeda4000}, {0xbeda6000}, {0xbeda8000}, {0xbedaa000}, {0xbedac000}, {0xbedae000}, {0xbedb0000}, {0xbedb2000}, {0xbedb4000}, {0xbedb6000}, {0xbedb8000}, {0xbedba000}, {0xbedbc000}, {0xbedbe000}, {0xbedc0000}, {0xbedc2000}, {0xbedc4000}, {0xbedc6000}, {0xbedc8000}, {0xbedca000}, {0xbedcc000}, {0xbedce000}, {0xbedd0000}, {0xbedd2000}, {0xbedd4000}, {0xbedd6000}, {0xbedd8000}, {0xbedda000}, {0xbeddc000}, {0xbedde000}, {0xbede0000}, {0xbede2000}, {0xbede4000}, {0xbede6000}, {0xbede8000}, {0xbedea000}, {0xbedec000}, {0xbedee000}, {0xbedf0000}, {0xbedf2000}, {0xbedf4000}, {0xbedf6000}, {0xbedf8000}, {0xbedfa000}, {0xbedfc000}, {0xbedfe000}, {0xbee00000}, {0xbee02000}, {0xbee04000}, {0xbee06000}, {0xbee08000}, {0xbee0a000}, {0xbee0c000}, {0xbee0e000}, {0xbee10000}, {0xbee12000}, {0xbee14000}, {0xbee16000}, {0xbee18000}, {0xbee1a000}, {0xbee1c000}, {0xbee1e000}, {0xbee20000}, {0xbee22000}, {0xbee24000}, {0xbee26000}, {0xbee28000}, {0xbee2a000}, {0xbee2c000}, {0xbee2e000}, {0xbee30000}, {0xbee32000}, {0xbee34000}, {0xbee36000}, {0xbee38000}, {0xbee3a000}, {0xbee3c000}, {0xbee3e000}, {0xbee40000}, {0xbee42000}, {0xbee44000}, {0xbee46000}, {0xbee48000}, {0xbee4a000}, {0xbee4c000}, {0xbee4e000}, {0xbee50000}, {0xbee52000}, {0xbee54000}, {0xbee56000}, {0xbee58000}, {0xbee5a000}, {0xbee5c000}, {0xbee5e000}, {0xbee60000}, {0xbee62000}, {0xbee64000}, {0xbee66000}, {0xbee68000}, {0xbee6a000}, {0xbee6c000}, {0xbee6e000}, {0xbee70000}, {0xbee72000}, {0xbee74000}, {0xbee76000}, {0xbee78000}, {0xbee7a000}, {0xbee7c000}, {0xbee7e000}, {0xbee80000}, {0xbee82000}, {0xbee84000}, {0xbee86000}, {0xbee88000}, {0xbee8a000}, {0xbee8c000}, {0xbee8e000}, {0xbee90000}, {0xbee92000}, {0xbee94000}, {0xbee96000}, {0xbee98000}, {0xbee9a000}, {0xbee9c000}, {0xbee9e000}, {0xbeea0000}, {0xbeea2000}, {0xbeea4000}, {0xbeea6000}, {0xbeea8000}, {0xbeeaa000}, {0xbeeac000}, {0xbeeae000}, {0xbeeb0000}, {0xbeeb2000}, {0xbeeb4000}, {0xbeeb6000}, {0xbeeb8000}, {0xbeeba000}, {0xbeebc000}, {0xbeebe000}, {0xbeec0000}, {0xbeec2000}, {0xbeec4000}, {0xbeec6000}, {0xbeec8000}, {0xbeeca000}, {0xbeecc000}, {0xbeece000}, {0xbeed0000}, {0xbeed2000}, {0xbeed4000}, {0xbeed6000}, {0xbeed8000}, {0xbeeda000}, {0xbeedc000}, {0xbeede000}, {0xbeee0000}, {0xbeee2000}, {0xbeee4000}, {0xbeee6000}, {0xbeee8000}, {0xbeeea000}, {0xbeeec000}, {0xbeeee000}, {0xbeef0000}, {0xbeef2000}, {0xbeef4000}, {0xbeef6000}, {0xbeef8000}, {0xbeefa000}, {0xbeefc000}, {0xbeefe000}, {0xbef00000}, {0xbef02000}, {0xbef04000}, {0xbef06000}, {0xbef08000}, {0xbef0a000}, {0xbef0c000}, {0xbef0e000}, {0xbef10000}, {0xbef12000}, {0xbef14000}, {0xbef16000}, {0xbef18000}, {0xbef1a000}, {0xbef1c000}, {0xbef1e000}, {0xbef20000}, {0xbef22000}, {0xbef24000}, {0xbef26000}, {0xbef28000}, {0xbef2a000}, {0xbef2c000}, {0xbef2e000}, {0xbef30000}, {0xbef32000}, {0xbef34000}, {0xbef36000}, {0xbef38000}, {0xbef3a000}, {0xbef3c000}, {0xbef3e000}, {0xbef40000}, {0xbef42000}, {0xbef44000}, {0xbef46000}, {0xbef48000}, {0xbef4a000}, {0xbef4c000}, {0xbef4e000}, {0xbef50000}, {0xbef52000}, {0xbef54000}, {0xbef56000}, {0xbef58000}, {0xbef5a000}, {0xbef5c000}, {0xbef5e000}, {0xbef60000}, {0xbef62000}, {0xbef64000}, {0xbef66000}, {0xbef68000}, {0xbef6a000}, {0xbef6c000}, {0xbef6e000}, {0xbef70000}, {0xbef72000}, {0xbef74000}, {0xbef76000}, {0xbef78000}, {0xbef7a000}, {0xbef7c000}, {0xbef7e000}, {0xbef80000}, {0xbef82000}, {0xbef84000}, {0xbef86000}, {0xbef88000}, {0xbef8a000}, {0xbef8c000}, {0xbef8e000}, {0xbef90000}, {0xbef92000}, {0xbef94000}, {0xbef96000}, {0xbef98000}, {0xbef9a000}, {0xbef9c000}, {0xbef9e000}, {0xbefa0000}, {0xbefa2000}, {0xbefa4000}, {0xbefa6000}, {0xbefa8000}, {0xbefaa000}, {0xbefac000}, {0xbefae000}, {0xbefb0000}, {0xbefb2000}, {0xbefb4000}, {0xbefb6000}, {0xbefb8000}, {0xbefba000}, {0xbefbc000}, {0xbefbe000}, {0xbefc0000}, {0xbefc2000}, {0xbefc4000}, {0xbefc6000}, {0xbefc8000}, {0xbefca000}, {0xbefcc000}, {0xbefce000}, {0xbefd0000}, {0xbefd2000}, {0xbefd4000}, {0xbefd6000}, {0xbefd8000}, {0xbefda000}, {0xbefdc000}, {0xbefde000}, {0xbefe0000}, {0xbefe2000}, {0xbefe4000}, {0xbefe6000}, {0xbefe8000}, {0xbefea000}, {0xbefec000}, {0xbefee000}, {0xbeff0000}, {0xbeff2000}, {0xbeff4000}, {0xbeff6000}, {0xbeff8000}, {0xbeffa000}, {0xbeffc000}, {0xbeffe000}, {0xbf000000}, {0xbf002000}, {0xbf004000}, {0xbf006000}, {0xbf008000}, {0xbf00a000}, {0xbf00c000}, {0xbf00e000}, {0xbf010000}, {0xbf012000}, {0xbf014000}, {0xbf016000}, {0xbf018000}, {0xbf01a000}, {0xbf01c000}, {0xbf01e000}, {0xbf020000}, {0xbf022000}, {0xbf024000}, {0xbf026000}, {0xbf028000}, {0xbf02a000}, {0xbf02c000}, {0xbf02e000}, {0xbf030000}, {0xbf032000}, {0xbf034000}, {0xbf036000}, {0xbf038000}, {0xbf03a000}, {0xbf03c000}, {0xbf03e000}, {0xbf040000}, {0xbf042000}, {0xbf044000}, {0xbf046000}, {0xbf048000}, {0xbf04a000}, {0xbf04c000}, {0xbf04e000}, {0xbf050000}, {0xbf052000}, {0xbf054000}, {0xbf056000}, {0xbf058000}, {0xbf05a000}, {0xbf05c000}, {0xbf05e000}, {0xbf060000}, {0xbf062000}, {0xbf064000}, {0xbf066000}, {0xbf068000}, {0xbf06a000}, {0xbf06c000}, {0xbf06e000}, {0xbf070000}, {0xbf072000}, {0xbf074000}, {0xbf076000}, {0xbf078000}, {0xbf07a000}, {0xbf07c000}, {0xbf07e000}, {0xbf080000}, {0xbf082000}, {0xbf084000}, {0xbf086000}, {0xbf088000}, {0xbf08a000}, {0xbf08c000}, {0xbf08e000}, {0xbf090000}, {0xbf092000}, {0xbf094000}, {0xbf096000}, {0xbf098000}, {0xbf09a000}, {0xbf09c000}, {0xbf09e000}, {0xbf0a0000}, {0xbf0a2000}, {0xbf0a4000}, {0xbf0a6000}, {0xbf0a8000}, {0xbf0aa000}, {0xbf0ac000}, {0xbf0ae000}, {0xbf0b0000}, {0xbf0b2000}, {0xbf0b4000}, {0xbf0b6000}, {0xbf0b8000}, {0xbf0ba000}, {0xbf0bc000}, {0xbf0be000}, {0xbf0c0000}, {0xbf0c2000}, {0xbf0c4000}, {0xbf0c6000}, {0xbf0c8000}, {0xbf0ca000}, {0xbf0cc000}, {0xbf0ce000}, {0xbf0d0000}, {0xbf0d2000}, {0xbf0d4000}, {0xbf0d6000}, {0xbf0d8000}, {0xbf0da000}, {0xbf0dc000}, {0xbf0de000}, {0xbf0e0000}, {0xbf0e2000}, {0xbf0e4000}, {0xbf0e6000}, {0xbf0e8000}, {0xbf0ea000}, {0xbf0ec000}, {0xbf0ee000}, {0xbf0f0000}, {0xbf0f2000}, {0xbf0f4000}, {0xbf0f6000}, {0xbf0f8000}, {0xbf0fa000}, {0xbf0fc000}, {0xbf0fe000}, {0xbf100000}, {0xbf102000}, {0xbf104000}, {0xbf106000}, {0xbf108000}, {0xbf10a000}, {0xbf10c000}, {0xbf10e000}, {0xbf110000}, {0xbf112000}, {0xbf114000}, {0xbf116000}, {0xbf118000}, {0xbf11a000}, {0xbf11c000}, {0xbf11e000}, {0xbf120000}, {0xbf122000}, {0xbf124000}, {0xbf126000}, {0xbf128000}, {0xbf12a000}, {0xbf12c000}, {0xbf12e000}, {0xbf130000}, {0xbf132000}, {0xbf134000}, {0xbf136000}, {0xbf138000}, {0xbf13a000}, {0xbf13c000}, {0xbf13e000}, {0xbf140000}, {0xbf142000}, {0xbf144000}, {0xbf146000}, {0xbf148000}, {0xbf14a000}, {0xbf14c000}, {0xbf14e000}, {0xbf150000}, {0xbf152000}, {0xbf154000}, {0xbf156000}, {0xbf158000}, {0xbf15a000}, {0xbf15c000}, {0xbf15e000}, {0xbf160000}, {0xbf162000}, {0xbf164000}, {0xbf166000}, {0xbf168000}, {0xbf16a000}, {0xbf16c000}, {0xbf16e000}, {0xbf170000}, {0xbf172000}, {0xbf174000}, {0xbf176000}, {0xbf178000}, {0xbf17a000}, {0xbf17c000}, {0xbf17e000}, {0xbf180000}, {0xbf182000}, {0xbf184000}, {0xbf186000}, {0xbf188000}, {0xbf18a000}, {0xbf18c000}, {0xbf18e000}, {0xbf190000}, {0xbf192000}, {0xbf194000}, {0xbf196000}, {0xbf198000}, {0xbf19a000}, {0xbf19c000}, {0xbf19e000}, {0xbf1a0000}, {0xbf1a2000}, {0xbf1a4000}, {0xbf1a6000}, {0xbf1a8000}, {0xbf1aa000}, {0xbf1ac000}, {0xbf1ae000}, {0xbf1b0000}, {0xbf1b2000}, {0xbf1b4000}, {0xbf1b6000}, {0xbf1b8000}, {0xbf1ba000}, {0xbf1bc000}, {0xbf1be000}, {0xbf1c0000}, {0xbf1c2000}, {0xbf1c4000}, {0xbf1c6000}, {0xbf1c8000}, {0xbf1ca000}, {0xbf1cc000}, {0xbf1ce000}, {0xbf1d0000}, {0xbf1d2000}, {0xbf1d4000}, {0xbf1d6000}, {0xbf1d8000}, {0xbf1da000}, {0xbf1dc000}, {0xbf1de000}, {0xbf1e0000}, {0xbf1e2000}, {0xbf1e4000}, {0xbf1e6000}, {0xbf1e8000}, {0xbf1ea000}, {0xbf1ec000}, {0xbf1ee000}, {0xbf1f0000}, {0xbf1f2000}, {0xbf1f4000}, {0xbf1f6000}, {0xbf1f8000}, {0xbf1fa000}, {0xbf1fc000}, {0xbf1fe000}, {0xbf200000}, {0xbf202000}, {0xbf204000}, {0xbf206000}, {0xbf208000}, {0xbf20a000}, {0xbf20c000}, {0xbf20e000}, {0xbf210000}, {0xbf212000}, {0xbf214000}, {0xbf216000}, {0xbf218000}, {0xbf21a000}, {0xbf21c000}, {0xbf21e000}, {0xbf220000}, {0xbf222000}, {0xbf224000}, {0xbf226000}, {0xbf228000}, {0xbf22a000}, {0xbf22c000}, {0xbf22e000}, {0xbf230000}, {0xbf232000}, {0xbf234000}, {0xbf236000}, {0xbf238000}, {0xbf23a000}, {0xbf23c000}, {0xbf23e000}, {0xbf240000}, {0xbf242000}, {0xbf244000}, {0xbf246000}, {0xbf248000}, {0xbf24a000}, {0xbf24c000}, {0xbf24e000}, {0xbf250000}, {0xbf252000}, {0xbf254000}, {0xbf256000}, {0xbf258000}, {0xbf25a000}, {0xbf25c000}, {0xbf25e000}, {0xbf260000}, {0xbf262000}, {0xbf264000}, {0xbf266000}, {0xbf268000}, {0xbf26a000}, {0xbf26c000}, {0xbf26e000}, {0xbf270000}, {0xbf272000}, {0xbf274000}, {0xbf276000}, {0xbf278000}, {0xbf27a000}, {0xbf27c000}, {0xbf27e000}, {0xbf280000}, {0xbf282000}, {0xbf284000}, {0xbf286000}, {0xbf288000}, {0xbf28a000}, {0xbf28c000}, {0xbf28e000}, {0xbf290000}, {0xbf292000}, {0xbf294000}, {0xbf296000}, {0xbf298000}, {0xbf29a000}, {0xbf29c000}, {0xbf29e000}, {0xbf2a0000}, {0xbf2a2000}, {0xbf2a4000}, {0xbf2a6000}, {0xbf2a8000}, {0xbf2aa000}, {0xbf2ac000}, {0xbf2ae000}, {0xbf2b0000}, {0xbf2b2000}, {0xbf2b4000}, {0xbf2b6000}, {0xbf2b8000}, {0xbf2ba000}, {0xbf2bc000}, {0xbf2be000}, {0xbf2c0000}, {0xbf2c2000}, {0xbf2c4000}, {0xbf2c6000}, {0xbf2c8000}, {0xbf2ca000}, {0xbf2cc000}, {0xbf2ce000}, {0xbf2d0000}, {0xbf2d2000}, {0xbf2d4000}, {0xbf2d6000}, {0xbf2d8000}, {0xbf2da000}, {0xbf2dc000}, {0xbf2de000}, {0xbf2e0000}, {0xbf2e2000}, {0xbf2e4000}, {0xbf2e6000}, {0xbf2e8000}, {0xbf2ea000}, {0xbf2ec000}, {0xbf2ee000}, {0xbf2f0000}, {0xbf2f2000}, {0xbf2f4000}, {0xbf2f6000}, {0xbf2f8000}, {0xbf2fa000}, {0xbf2fc000}, {0xbf2fe000}, {0xbf300000}, {0xbf302000}, {0xbf304000}, {0xbf306000}, {0xbf308000}, {0xbf30a000}, {0xbf30c000}, {0xbf30e000}, {0xbf310000}, {0xbf312000}, {0xbf314000}, {0xbf316000}, {0xbf318000}, {0xbf31a000}, {0xbf31c000}, {0xbf31e000}, {0xbf320000}, {0xbf322000}, {0xbf324000}, {0xbf326000}, {0xbf328000}, {0xbf32a000}, {0xbf32c000}, {0xbf32e000}, {0xbf330000}, {0xbf332000}, {0xbf334000}, {0xbf336000}, {0xbf338000}, {0xbf33a000}, {0xbf33c000}, {0xbf33e000}, {0xbf340000}, {0xbf342000}, {0xbf344000}, {0xbf346000}, {0xbf348000}, {0xbf34a000}, {0xbf34c000}, {0xbf34e000}, {0xbf350000}, {0xbf352000}, {0xbf354000}, {0xbf356000}, {0xbf358000}, {0xbf35a000}, {0xbf35c000}, {0xbf35e000}, {0xbf360000}, {0xbf362000}, {0xbf364000}, {0xbf366000}, {0xbf368000}, {0xbf36a000}, {0xbf36c000}, {0xbf36e000}, {0xbf370000}, {0xbf372000}, {0xbf374000}, {0xbf376000}, {0xbf378000}, {0xbf37a000}, {0xbf37c000}, {0xbf37e000}, {0xbf380000}, {0xbf382000}, {0xbf384000}, {0xbf386000}, {0xbf388000}, {0xbf38a000}, {0xbf38c000}, {0xbf38e000}, {0xbf390000}, {0xbf392000}, {0xbf394000}, {0xbf396000}, {0xbf398000}, {0xbf39a000}, {0xbf39c000}, {0xbf39e000}, {0xbf3a0000}, {0xbf3a2000}, {0xbf3a4000}, {0xbf3a6000}, {0xbf3a8000}, {0xbf3aa000}, {0xbf3ac000}, {0xbf3ae000}, {0xbf3b0000}, {0xbf3b2000}, {0xbf3b4000}, {0xbf3b6000}, {0xbf3b8000}, {0xbf3ba000}, {0xbf3bc000}, {0xbf3be000}, {0xbf3c0000}, {0xbf3c2000}, {0xbf3c4000}, {0xbf3c6000}, {0xbf3c8000}, {0xbf3ca000}, {0xbf3cc000}, {0xbf3ce000}, {0xbf3d0000}, {0xbf3d2000}, {0xbf3d4000}, {0xbf3d6000}, {0xbf3d8000}, {0xbf3da000}, {0xbf3dc000}, {0xbf3de000}, {0xbf3e0000}, {0xbf3e2000}, {0xbf3e4000}, {0xbf3e6000}, {0xbf3e8000}, {0xbf3ea000}, {0xbf3ec000}, {0xbf3ee000}, {0xbf3f0000}, {0xbf3f2000}, {0xbf3f4000}, {0xbf3f6000}, {0xbf3f8000}, {0xbf3fa000}, {0xbf3fc000}, {0xbf3fe000}, {0xbf400000}, {0xbf402000}, {0xbf404000}, {0xbf406000}, {0xbf408000}, {0xbf40a000}, {0xbf40c000}, {0xbf40e000}, {0xbf410000}, {0xbf412000}, {0xbf414000}, {0xbf416000}, {0xbf418000}, {0xbf41a000}, {0xbf41c000}, {0xbf41e000}, {0xbf420000}, {0xbf422000}, {0xbf424000}, {0xbf426000}, {0xbf428000}, {0xbf42a000}, {0xbf42c000}, {0xbf42e000}, {0xbf430000}, {0xbf432000}, {0xbf434000}, {0xbf436000}, {0xbf438000}, {0xbf43a000}, {0xbf43c000}, {0xbf43e000}, {0xbf440000}, {0xbf442000}, {0xbf444000}, {0xbf446000}, {0xbf448000}, {0xbf44a000}, {0xbf44c000}, {0xbf44e000}, {0xbf450000}, {0xbf452000}, {0xbf454000}, {0xbf456000}, {0xbf458000}, {0xbf45a000}, {0xbf45c000}, {0xbf45e000}, {0xbf460000}, {0xbf462000}, {0xbf464000}, {0xbf466000}, {0xbf468000}, {0xbf46a000}, {0xbf46c000}, {0xbf46e000}, {0xbf470000}, {0xbf472000}, {0xbf474000}, {0xbf476000}, {0xbf478000}, {0xbf47a000}, {0xbf47c000}, {0xbf47e000}, {0xbf480000}, {0xbf482000}, {0xbf484000}, {0xbf486000}, {0xbf488000}, {0xbf48a000}, {0xbf48c000}, {0xbf48e000}, {0xbf490000}, {0xbf492000}, {0xbf494000}, {0xbf496000}, {0xbf498000}, {0xbf49a000}, {0xbf49c000}, {0xbf49e000}, {0xbf4a0000}, {0xbf4a2000}, {0xbf4a4000}, {0xbf4a6000}, {0xbf4a8000}, {0xbf4aa000}, {0xbf4ac000}, {0xbf4ae000}, {0xbf4b0000}, {0xbf4b2000}, {0xbf4b4000}, {0xbf4b6000}, {0xbf4b8000}, {0xbf4ba000}, {0xbf4bc000}, {0xbf4be000}, {0xbf4c0000}, {0xbf4c2000}, {0xbf4c4000}, {0xbf4c6000}, {0xbf4c8000}, {0xbf4ca000}, {0xbf4cc000}, {0xbf4ce000}, {0xbf4d0000}, {0xbf4d2000}, {0xbf4d4000}, {0xbf4d6000}, {0xbf4d8000}, {0xbf4da000}, {0xbf4dc000}, {0xbf4de000}, {0xbf4e0000}, {0xbf4e2000}, {0xbf4e4000}, {0xbf4e6000}, {0xbf4e8000}, {0xbf4ea000}, {0xbf4ec000}, {0xbf4ee000}, {0xbf4f0000}, {0xbf4f2000}, {0xbf4f4000}, {0xbf4f6000}, {0xbf4f8000}, {0xbf4fa000}, {0xbf4fc000}, {0xbf4fe000}, {0xbf500000}, {0xbf502000}, {0xbf504000}, {0xbf506000}, {0xbf508000}, {0xbf50a000}, {0xbf50c000}, {0xbf50e000}, {0xbf510000}, {0xbf512000}, {0xbf514000}, {0xbf516000}, {0xbf518000}, {0xbf51a000}, {0xbf51c000}, {0xbf51e000}, {0xbf520000}, {0xbf522000}, {0xbf524000}, {0xbf526000}, {0xbf528000}, {0xbf52a000}, {0xbf52c000}, {0xbf52e000}, {0xbf530000}, {0xbf532000}, {0xbf534000}, {0xbf536000}, {0xbf538000}, {0xbf53a000}, {0xbf53c000}, {0xbf53e000}, {0xbf540000}, {0xbf542000}, {0xbf544000}, {0xbf546000}, {0xbf548000}, {0xbf54a000}, {0xbf54c000}, {0xbf54e000}, {0xbf550000}, {0xbf552000}, {0xbf554000}, {0xbf556000}, {0xbf558000}, {0xbf55a000}, {0xbf55c000}, {0xbf55e000}, {0xbf560000}, {0xbf562000}, {0xbf564000}, {0xbf566000}, {0xbf568000}, {0xbf56a000}, {0xbf56c000}, {0xbf56e000}, {0xbf570000}, {0xbf572000}, {0xbf574000}, {0xbf576000}, {0xbf578000}, {0xbf57a000}, {0xbf57c000}, {0xbf57e000}, {0xbf580000}, {0xbf582000}, {0xbf584000}, {0xbf586000}, {0xbf588000}, {0xbf58a000}, {0xbf58c000}, {0xbf58e000}, {0xbf590000}, {0xbf592000}, {0xbf594000}, {0xbf596000}, {0xbf598000}, {0xbf59a000}, {0xbf59c000}, {0xbf59e000}, {0xbf5a0000}, {0xbf5a2000}, {0xbf5a4000}, {0xbf5a6000}, {0xbf5a8000}, {0xbf5aa000}, {0xbf5ac000}, {0xbf5ae000}, {0xbf5b0000}, {0xbf5b2000}, {0xbf5b4000}, {0xbf5b6000}, {0xbf5b8000}, {0xbf5ba000}, {0xbf5bc000}, {0xbf5be000}, {0xbf5c0000}, {0xbf5c2000}, {0xbf5c4000}, {0xbf5c6000}, {0xbf5c8000}, {0xbf5ca000}, {0xbf5cc000}, {0xbf5ce000}, {0xbf5d0000}, {0xbf5d2000}, {0xbf5d4000}, {0xbf5d6000}, {0xbf5d8000}, {0xbf5da000}, {0xbf5dc000}, {0xbf5de000}, {0xbf5e0000}, {0xbf5e2000}, {0xbf5e4000}, {0xbf5e6000}, {0xbf5e8000}, {0xbf5ea000}, {0xbf5ec000}, {0xbf5ee000}, {0xbf5f0000}, {0xbf5f2000}, {0xbf5f4000}, {0xbf5f6000}, {0xbf5f8000}, {0xbf5fa000}, {0xbf5fc000}, {0xbf5fe000}, {0xbf600000}, {0xbf602000}, {0xbf604000}, {0xbf606000}, {0xbf608000}, {0xbf60a000}, {0xbf60c000}, {0xbf60e000}, {0xbf610000}, {0xbf612000}, {0xbf614000}, {0xbf616000}, {0xbf618000}, {0xbf61a000}, {0xbf61c000}, {0xbf61e000}, {0xbf620000}, {0xbf622000}, {0xbf624000}, {0xbf626000}, {0xbf628000}, {0xbf62a000}, {0xbf62c000}, {0xbf62e000}, {0xbf630000}, {0xbf632000}, {0xbf634000}, {0xbf636000}, {0xbf638000}, {0xbf63a000}, {0xbf63c000}, {0xbf63e000}, {0xbf640000}, {0xbf642000}, {0xbf644000}, {0xbf646000}, {0xbf648000}, {0xbf64a000}, {0xbf64c000}, {0xbf64e000}, {0xbf650000}, {0xbf652000}, {0xbf654000}, {0xbf656000}, {0xbf658000}, {0xbf65a000}, {0xbf65c000}, {0xbf65e000}, {0xbf660000}, {0xbf662000}, {0xbf664000}, {0xbf666000}, {0xbf668000}, {0xbf66a000}, {0xbf66c000}, {0xbf66e000}, {0xbf670000}, {0xbf672000}, {0xbf674000}, {0xbf676000}, {0xbf678000}, {0xbf67a000}, {0xbf67c000}, {0xbf67e000}, {0xbf680000}, {0xbf682000}, {0xbf684000}, {0xbf686000}, {0xbf688000}, {0xbf68a000}, {0xbf68c000}, {0xbf68e000}, {0xbf690000}, {0xbf692000}, {0xbf694000}, {0xbf696000}, {0xbf698000}, {0xbf69a000}, {0xbf69c000}, {0xbf69e000}, {0xbf6a0000}, {0xbf6a2000}, {0xbf6a4000}, {0xbf6a6000}, {0xbf6a8000}, {0xbf6aa000}, {0xbf6ac000}, {0xbf6ae000}, {0xbf6b0000}, {0xbf6b2000}, {0xbf6b4000}, {0xbf6b6000}, {0xbf6b8000}, {0xbf6ba000}, {0xbf6bc000}, {0xbf6be000}, {0xbf6c0000}, {0xbf6c2000}, {0xbf6c4000}, {0xbf6c6000}, {0xbf6c8000}, {0xbf6ca000}, {0xbf6cc000}, {0xbf6ce000}, {0xbf6d0000}, {0xbf6d2000}, {0xbf6d4000}, {0xbf6d6000}, {0xbf6d8000}, {0xbf6da000}, {0xbf6dc000}, {0xbf6de000}, {0xbf6e0000}, {0xbf6e2000}, {0xbf6e4000}, {0xbf6e6000}, {0xbf6e8000}, {0xbf6ea000}, {0xbf6ec000}, {0xbf6ee000}, {0xbf6f0000}, {0xbf6f2000}, {0xbf6f4000}, {0xbf6f6000}, {0xbf6f8000}, {0xbf6fa000}, {0xbf6fc000}, {0xbf6fe000}, {0xbf700000}, {0xbf702000}, {0xbf704000}, {0xbf706000}, {0xbf708000}, {0xbf70a000}, {0xbf70c000}, {0xbf70e000}, {0xbf710000}, {0xbf712000}, {0xbf714000}, {0xbf716000}, {0xbf718000}, {0xbf71a000}, {0xbf71c000}, {0xbf71e000}, {0xbf720000}, {0xbf722000}, {0xbf724000}, {0xbf726000}, {0xbf728000}, {0xbf72a000}, {0xbf72c000}, {0xbf72e000}, {0xbf730000}, {0xbf732000}, {0xbf734000}, {0xbf736000}, {0xbf738000}, {0xbf73a000}, {0xbf73c000}, {0xbf73e000}, {0xbf740000}, {0xbf742000}, {0xbf744000}, {0xbf746000}, {0xbf748000}, {0xbf74a000}, {0xbf74c000}, {0xbf74e000}, {0xbf750000}, {0xbf752000}, {0xbf754000}, {0xbf756000}, {0xbf758000}, {0xbf75a000}, {0xbf75c000}, {0xbf75e000}, {0xbf760000}, {0xbf762000}, {0xbf764000}, {0xbf766000}, {0xbf768000}, {0xbf76a000}, {0xbf76c000}, {0xbf76e000}, {0xbf770000}, {0xbf772000}, {0xbf774000}, {0xbf776000}, {0xbf778000}, {0xbf77a000}, {0xbf77c000}, {0xbf77e000}, {0xbf780000}, {0xbf782000}, {0xbf784000}, {0xbf786000}, {0xbf788000}, {0xbf78a000}, {0xbf78c000}, {0xbf78e000}, {0xbf790000}, {0xbf792000}, {0xbf794000}, {0xbf796000}, {0xbf798000}, {0xbf79a000}, {0xbf79c000}, {0xbf79e000}, {0xbf7a0000}, {0xbf7a2000}, {0xbf7a4000}, {0xbf7a6000}, {0xbf7a8000}, {0xbf7aa000}, {0xbf7ac000}, {0xbf7ae000}, {0xbf7b0000}, {0xbf7b2000}, {0xbf7b4000}, {0xbf7b6000}, {0xbf7b8000}, {0xbf7ba000}, {0xbf7bc000}, {0xbf7be000}, {0xbf7c0000}, {0xbf7c2000}, {0xbf7c4000}, {0xbf7c6000}, {0xbf7c8000}, {0xbf7ca000}, {0xbf7cc000}, {0xbf7ce000}, {0xbf7d0000}, {0xbf7d2000}, {0xbf7d4000}, {0xbf7d6000}, {0xbf7d8000}, {0xbf7da000}, {0xbf7dc000}, {0xbf7de000}, {0xbf7e0000}, {0xbf7e2000}, {0xbf7e4000}, {0xbf7e6000}, {0xbf7e8000}, {0xbf7ea000}, {0xbf7ec000}, {0xbf7ee000}, {0xbf7f0000}, {0xbf7f2000}, {0xbf7f4000}, {0xbf7f6000}, {0xbf7f8000}, {0xbf7fa000}, {0xbf7fc000}, {0xbf7fe000}, {0xbf800000}, {0xbf802000}, {0xbf804000}, {0xbf806000}, {0xbf808000}, {0xbf80a000}, {0xbf80c000}, {0xbf80e000}, {0xbf810000}, {0xbf812000}, {0xbf814000}, {0xbf816000}, {0xbf818000}, {0xbf81a000}, {0xbf81c000}, {0xbf81e000}, {0xbf820000}, {0xbf822000}, {0xbf824000}, {0xbf826000}, {0xbf828000}, {0xbf82a000}, {0xbf82c000}, {0xbf82e000}, {0xbf830000}, {0xbf832000}, {0xbf834000}, {0xbf836000}, {0xbf838000}, {0xbf83a000}, {0xbf83c000}, {0xbf83e000}, {0xbf840000}, {0xbf842000}, {0xbf844000}, {0xbf846000}, {0xbf848000}, {0xbf84a000}, {0xbf84c000}, {0xbf84e000}, {0xbf850000}, {0xbf852000}, {0xbf854000}, {0xbf856000}, {0xbf858000}, {0xbf85a000}, {0xbf85c000}, {0xbf85e000}, {0xbf860000}, {0xbf862000}, {0xbf864000}, {0xbf866000}, {0xbf868000}, {0xbf86a000}, {0xbf86c000}, {0xbf86e000}, {0xbf870000}, {0xbf872000}, {0xbf874000}, {0xbf876000}, {0xbf878000}, {0xbf87a000}, {0xbf87c000}, {0xbf87e000}, {0xbf880000}, {0xbf882000}, {0xbf884000}, {0xbf886000}, {0xbf888000}, {0xbf88a000}, {0xbf88c000}, {0xbf88e000}, {0xbf890000}, {0xbf892000}, {0xbf894000}, {0xbf896000}, {0xbf898000}, {0xbf89a000}, {0xbf89c000}, {0xbf89e000}, {0xbf8a0000}, {0xbf8a2000}, {0xbf8a4000}, {0xbf8a6000}, {0xbf8a8000}, {0xbf8aa000}, {0xbf8ac000}, {0xbf8ae000}, {0xbf8b0000}, {0xbf8b2000}, {0xbf8b4000}, {0xbf8b6000}, {0xbf8b8000}, {0xbf8ba000}, {0xbf8bc000}, {0xbf8be000}, {0xbf8c0000}, {0xbf8c2000}, {0xbf8c4000}, {0xbf8c6000}, {0xbf8c8000}, {0xbf8ca000}, {0xbf8cc000}, {0xbf8ce000}, {0xbf8d0000}, {0xbf8d2000}, {0xbf8d4000}, {0xbf8d6000}, {0xbf8d8000}, {0xbf8da000}, {0xbf8dc000}, {0xbf8de000}, {0xbf8e0000}, {0xbf8e2000}, {0xbf8e4000}, {0xbf8e6000}, {0xbf8e8000}, {0xbf8ea000}, {0xbf8ec000}, {0xbf8ee000}, {0xbf8f0000}, {0xbf8f2000}, {0xbf8f4000}, {0xbf8f6000}, {0xbf8f8000}, {0xbf8fa000}, {0xbf8fc000}, {0xbf8fe000}, {0xbf900000}, {0xbf902000}, {0xbf904000}, {0xbf906000}, {0xbf908000}, {0xbf90a000}, {0xbf90c000}, {0xbf90e000}, {0xbf910000}, {0xbf912000}, {0xbf914000}, {0xbf916000}, {0xbf918000}, {0xbf91a000}, {0xbf91c000}, {0xbf91e000}, {0xbf920000}, {0xbf922000}, {0xbf924000}, {0xbf926000}, {0xbf928000}, {0xbf92a000}, {0xbf92c000}, {0xbf92e000}, {0xbf930000}, {0xbf932000}, {0xbf934000}, {0xbf936000}, {0xbf938000}, {0xbf93a000}, {0xbf93c000}, {0xbf93e000}, {0xbf940000}, {0xbf942000}, {0xbf944000}, {0xbf946000}, {0xbf948000}, {0xbf94a000}, {0xbf94c000}, {0xbf94e000}, {0xbf950000}, {0xbf952000}, {0xbf954000}, {0xbf956000}, {0xbf958000}, {0xbf95a000}, {0xbf95c000}, {0xbf95e000}, {0xbf960000}, {0xbf962000}, {0xbf964000}, {0xbf966000}, {0xbf968000}, {0xbf96a000}, {0xbf96c000}, {0xbf96e000}, {0xbf970000}, {0xbf972000}, {0xbf974000}, {0xbf976000}, {0xbf978000}, {0xbf97a000}, {0xbf97c000}, {0xbf97e000}, {0xbf980000}, {0xbf982000}, {0xbf984000}, {0xbf986000}, {0xbf988000}, {0xbf98a000}, {0xbf98c000}, {0xbf98e000}, {0xbf990000}, {0xbf992000}, {0xbf994000}, {0xbf996000}, {0xbf998000}, {0xbf99a000}, {0xbf99c000}, {0xbf99e000}, {0xbf9a0000}, {0xbf9a2000}, {0xbf9a4000}, {0xbf9a6000}, {0xbf9a8000}, {0xbf9aa000}, {0xbf9ac000}, {0xbf9ae000}, {0xbf9b0000}, {0xbf9b2000}, {0xbf9b4000}, {0xbf9b6000}, {0xbf9b8000}, {0xbf9ba000}, {0xbf9bc000}, {0xbf9be000}, {0xbf9c0000}, {0xbf9c2000}, {0xbf9c4000}, {0xbf9c6000}, {0xbf9c8000}, {0xbf9ca000}, {0xbf9cc000}, {0xbf9ce000}, {0xbf9d0000}, {0xbf9d2000}, {0xbf9d4000}, {0xbf9d6000}, {0xbf9d8000}, {0xbf9da000}, {0xbf9dc000}, {0xbf9de000}, {0xbf9e0000}, {0xbf9e2000}, {0xbf9e4000}, {0xbf9e6000}, {0xbf9e8000}, {0xbf9ea000}, {0xbf9ec000}, {0xbf9ee000}, {0xbf9f0000}, {0xbf9f2000}, {0xbf9f4000}, {0xbf9f6000}, {0xbf9f8000}, {0xbf9fa000}, {0xbf9fc000}, {0xbf9fe000}, {0xbfa00000}, {0xbfa02000}, {0xbfa04000}, {0xbfa06000}, {0xbfa08000}, {0xbfa0a000}, {0xbfa0c000}, {0xbfa0e000}, {0xbfa10000}, {0xbfa12000}, {0xbfa14000}, {0xbfa16000}, {0xbfa18000}, {0xbfa1a000}, {0xbfa1c000}, {0xbfa1e000}, {0xbfa20000}, {0xbfa22000}, {0xbfa24000}, {0xbfa26000}, {0xbfa28000}, {0xbfa2a000}, {0xbfa2c000}, {0xbfa2e000}, {0xbfa30000}, {0xbfa32000}, {0xbfa34000}, {0xbfa36000}, {0xbfa38000}, {0xbfa3a000}, {0xbfa3c000}, {0xbfa3e000}, {0xbfa40000}, {0xbfa42000}, {0xbfa44000}, {0xbfa46000}, {0xbfa48000}, {0xbfa4a000}, {0xbfa4c000}, {0xbfa4e000}, {0xbfa50000}, {0xbfa52000}, {0xbfa54000}, {0xbfa56000}, {0xbfa58000}, {0xbfa5a000}, {0xbfa5c000}, {0xbfa5e000}, {0xbfa60000}, {0xbfa62000}, {0xbfa64000}, {0xbfa66000}, {0xbfa68000}, {0xbfa6a000}, {0xbfa6c000}, {0xbfa6e000}, {0xbfa70000}, {0xbfa72000}, {0xbfa74000}, {0xbfa76000}, {0xbfa78000}, {0xbfa7a000}, {0xbfa7c000}, {0xbfa7e000}, {0xbfa80000}, {0xbfa82000}, {0xbfa84000}, {0xbfa86000}, {0xbfa88000}, {0xbfa8a000}, {0xbfa8c000}, {0xbfa8e000}, {0xbfa90000}, {0xbfa92000}, {0xbfa94000}, {0xbfa96000}, {0xbfa98000}, {0xbfa9a000}, {0xbfa9c000}, {0xbfa9e000}, {0xbfaa0000}, {0xbfaa2000}, {0xbfaa4000}, {0xbfaa6000}, {0xbfaa8000}, {0xbfaaa000}, {0xbfaac000}, {0xbfaae000}, {0xbfab0000}, {0xbfab2000}, {0xbfab4000}, {0xbfab6000}, {0xbfab8000}, {0xbfaba000}, {0xbfabc000}, {0xbfabe000}, {0xbfac0000}, {0xbfac2000}, {0xbfac4000}, {0xbfac6000}, {0xbfac8000}, {0xbfaca000}, {0xbfacc000}, {0xbface000}, {0xbfad0000}, {0xbfad2000}, {0xbfad4000}, {0xbfad6000}, {0xbfad8000}, {0xbfada000}, {0xbfadc000}, {0xbfade000}, {0xbfae0000}, {0xbfae2000}, {0xbfae4000}, {0xbfae6000}, {0xbfae8000}, {0xbfaea000}, {0xbfaec000}, {0xbfaee000}, {0xbfaf0000}, {0xbfaf2000}, {0xbfaf4000}, {0xbfaf6000}, {0xbfaf8000}, {0xbfafa000}, {0xbfafc000}, {0xbfafe000}, {0xbfb00000}, {0xbfb02000}, {0xbfb04000}, {0xbfb06000}, {0xbfb08000}, {0xbfb0a000}, {0xbfb0c000}, {0xbfb0e000}, {0xbfb10000}, {0xbfb12000}, {0xbfb14000}, {0xbfb16000}, {0xbfb18000}, {0xbfb1a000}, {0xbfb1c000}, {0xbfb1e000}, {0xbfb20000}, {0xbfb22000}, {0xbfb24000}, {0xbfb26000}, {0xbfb28000}, {0xbfb2a000}, {0xbfb2c000}, {0xbfb2e000}, {0xbfb30000}, {0xbfb32000}, {0xbfb34000}, {0xbfb36000}, {0xbfb38000}, {0xbfb3a000}, {0xbfb3c000}, {0xbfb3e000}, {0xbfb40000}, {0xbfb42000}, {0xbfb44000}, {0xbfb46000}, {0xbfb48000}, {0xbfb4a000}, {0xbfb4c000}, {0xbfb4e000}, {0xbfb50000}, {0xbfb52000}, {0xbfb54000}, {0xbfb56000}, {0xbfb58000}, {0xbfb5a000}, {0xbfb5c000}, {0xbfb5e000}, {0xbfb60000}, {0xbfb62000}, {0xbfb64000}, {0xbfb66000}, {0xbfb68000}, {0xbfb6a000}, {0xbfb6c000}, {0xbfb6e000}, {0xbfb70000}, {0xbfb72000}, {0xbfb74000}, {0xbfb76000}, {0xbfb78000}, {0xbfb7a000}, {0xbfb7c000}, {0xbfb7e000}, {0xbfb80000}, {0xbfb82000}, {0xbfb84000}, {0xbfb86000}, {0xbfb88000}, {0xbfb8a000}, {0xbfb8c000}, {0xbfb8e000}, {0xbfb90000}, {0xbfb92000}, {0xbfb94000}, {0xbfb96000}, {0xbfb98000}, {0xbfb9a000}, {0xbfb9c000}, {0xbfb9e000}, {0xbfba0000}, {0xbfba2000}, {0xbfba4000}, {0xbfba6000}, {0xbfba8000}, {0xbfbaa000}, {0xbfbac000}, {0xbfbae000}, {0xbfbb0000}, {0xbfbb2000}, {0xbfbb4000}, {0xbfbb6000}, {0xbfbb8000}, {0xbfbba000}, {0xbfbbc000}, {0xbfbbe000}, {0xbfbc0000}, {0xbfbc2000}, {0xbfbc4000}, {0xbfbc6000}, {0xbfbc8000}, {0xbfbca000}, {0xbfbcc000}, {0xbfbce000}, {0xbfbd0000}, {0xbfbd2000}, {0xbfbd4000}, {0xbfbd6000}, {0xbfbd8000}, {0xbfbda000}, {0xbfbdc000}, {0xbfbde000}, {0xbfbe0000}, {0xbfbe2000}, {0xbfbe4000}, {0xbfbe6000}, {0xbfbe8000}, {0xbfbea000}, {0xbfbec000}, {0xbfbee000}, {0xbfbf0000}, {0xbfbf2000}, {0xbfbf4000}, {0xbfbf6000}, {0xbfbf8000}, {0xbfbfa000}, {0xbfbfc000}, {0xbfbfe000}, {0xbfc00000}, {0xbfc02000}, {0xbfc04000}, {0xbfc06000}, {0xbfc08000}, {0xbfc0a000}, {0xbfc0c000}, {0xbfc0e000}, {0xbfc10000}, {0xbfc12000}, {0xbfc14000}, {0xbfc16000}, {0xbfc18000}, {0xbfc1a000}, {0xbfc1c000}, {0xbfc1e000}, {0xbfc20000}, {0xbfc22000}, {0xbfc24000}, {0xbfc26000}, {0xbfc28000}, {0xbfc2a000}, {0xbfc2c000}, {0xbfc2e000}, {0xbfc30000}, {0xbfc32000}, {0xbfc34000}, {0xbfc36000}, {0xbfc38000}, {0xbfc3a000}, {0xbfc3c000}, {0xbfc3e000}, {0xbfc40000}, {0xbfc42000}, {0xbfc44000}, {0xbfc46000}, {0xbfc48000}, {0xbfc4a000}, {0xbfc4c000}, {0xbfc4e000}, {0xbfc50000}, {0xbfc52000}, {0xbfc54000}, {0xbfc56000}, {0xbfc58000}, {0xbfc5a000}, {0xbfc5c000}, {0xbfc5e000}, {0xbfc60000}, {0xbfc62000}, {0xbfc64000}, {0xbfc66000}, {0xbfc68000}, {0xbfc6a000}, {0xbfc6c000}, {0xbfc6e000}, {0xbfc70000}, {0xbfc72000}, {0xbfc74000}, {0xbfc76000}, {0xbfc78000}, {0xbfc7a000}, {0xbfc7c000}, {0xbfc7e000}, {0xbfc80000}, {0xbfc82000}, {0xbfc84000}, {0xbfc86000}, {0xbfc88000}, {0xbfc8a000}, {0xbfc8c000}, {0xbfc8e000}, {0xbfc90000}, {0xbfc92000}, {0xbfc94000}, {0xbfc96000}, {0xbfc98000}, {0xbfc9a000}, {0xbfc9c000}, {0xbfc9e000}, {0xbfca0000}, {0xbfca2000}, {0xbfca4000}, {0xbfca6000}, {0xbfca8000}, {0xbfcaa000}, {0xbfcac000}, {0xbfcae000}, {0xbfcb0000}, {0xbfcb2000}, {0xbfcb4000}, {0xbfcb6000}, {0xbfcb8000}, {0xbfcba000}, {0xbfcbc000}, {0xbfcbe000}, {0xbfcc0000}, {0xbfcc2000}, {0xbfcc4000}, {0xbfcc6000}, {0xbfcc8000}, {0xbfcca000}, {0xbfccc000}, {0xbfcce000}, {0xbfcd0000}, {0xbfcd2000}, {0xbfcd4000}, {0xbfcd6000}, {0xbfcd8000}, {0xbfcda000}, {0xbfcdc000}, {0xbfcde000}, {0xbfce0000}, {0xbfce2000}, {0xbfce4000}, {0xbfce6000}, {0xbfce8000}, {0xbfcea000}, {0xbfcec000}, {0xbfcee000}, {0xbfcf0000}, {0xbfcf2000}, {0xbfcf4000}, {0xbfcf6000}, {0xbfcf8000}, {0xbfcfa000}, {0xbfcfc000}, {0xbfcfe000}, {0xbfd00000}, {0xbfd02000}, {0xbfd04000}, {0xbfd06000}, {0xbfd08000}, {0xbfd0a000}, {0xbfd0c000}, {0xbfd0e000}, {0xbfd10000}, {0xbfd12000}, {0xbfd14000}, {0xbfd16000}, {0xbfd18000}, {0xbfd1a000}, {0xbfd1c000}, {0xbfd1e000}, {0xbfd20000}, {0xbfd22000}, {0xbfd24000}, {0xbfd26000}, {0xbfd28000}, {0xbfd2a000}, {0xbfd2c000}, {0xbfd2e000}, {0xbfd30000}, {0xbfd32000}, {0xbfd34000}, {0xbfd36000}, {0xbfd38000}, {0xbfd3a000}, {0xbfd3c000}, {0xbfd3e000}, {0xbfd40000}, {0xbfd42000}, {0xbfd44000}, {0xbfd46000}, {0xbfd48000}, {0xbfd4a000}, {0xbfd4c000}, {0xbfd4e000}, {0xbfd50000}, {0xbfd52000}, {0xbfd54000}, {0xbfd56000}, {0xbfd58000}, {0xbfd5a000}, {0xbfd5c000}, {0xbfd5e000}, {0xbfd60000}, {0xbfd62000}, {0xbfd64000}, {0xbfd66000}, {0xbfd68000}, {0xbfd6a000}, {0xbfd6c000}, {0xbfd6e000}, {0xbfd70000}, {0xbfd72000}, {0xbfd74000}, {0xbfd76000}, {0xbfd78000}, {0xbfd7a000}, {0xbfd7c000}, {0xbfd7e000}, {0xbfd80000}, {0xbfd82000}, {0xbfd84000}, {0xbfd86000}, {0xbfd88000}, {0xbfd8a000}, {0xbfd8c000}, {0xbfd8e000}, {0xbfd90000}, {0xbfd92000}, {0xbfd94000}, {0xbfd96000}, {0xbfd98000}, {0xbfd9a000}, {0xbfd9c000}, {0xbfd9e000}, {0xbfda0000}, {0xbfda2000}, {0xbfda4000}, {0xbfda6000}, {0xbfda8000}, {0xbfdaa000}, {0xbfdac000}, {0xbfdae000}, {0xbfdb0000}, {0xbfdb2000}, {0xbfdb4000}, {0xbfdb6000}, {0xbfdb8000}, {0xbfdba000}, {0xbfdbc000}, {0xbfdbe000}, {0xbfdc0000}, {0xbfdc2000}, {0xbfdc4000}, {0xbfdc6000}, {0xbfdc8000}, {0xbfdca000}, {0xbfdcc000}, {0xbfdce000}, {0xbfdd0000}, {0xbfdd2000}, {0xbfdd4000}, {0xbfdd6000}, {0xbfdd8000}, {0xbfdda000}, {0xbfddc000}, {0xbfdde000}, {0xbfde0000}, {0xbfde2000}, {0xbfde4000}, {0xbfde6000}, {0xbfde8000}, {0xbfdea000}, {0xbfdec000}, {0xbfdee000}, {0xbfdf0000}, {0xbfdf2000}, {0xbfdf4000}, {0xbfdf6000}, {0xbfdf8000}, {0xbfdfa000}, {0xbfdfc000}, {0xbfdfe000}, {0xbfe00000}, {0xbfe02000}, {0xbfe04000}, {0xbfe06000}, {0xbfe08000}, {0xbfe0a000}, {0xbfe0c000}, {0xbfe0e000}, {0xbfe10000}, {0xbfe12000}, {0xbfe14000}, {0xbfe16000}, {0xbfe18000}, {0xbfe1a000}, {0xbfe1c000}, {0xbfe1e000}, {0xbfe20000}, {0xbfe22000}, {0xbfe24000}, {0xbfe26000}, {0xbfe28000}, {0xbfe2a000}, {0xbfe2c000}, {0xbfe2e000}, {0xbfe30000}, {0xbfe32000}, {0xbfe34000}, {0xbfe36000}, {0xbfe38000}, {0xbfe3a000}, {0xbfe3c000}, {0xbfe3e000}, {0xbfe40000}, {0xbfe42000}, {0xbfe44000}, {0xbfe46000}, {0xbfe48000}, {0xbfe4a000}, {0xbfe4c000}, {0xbfe4e000}, {0xbfe50000}, {0xbfe52000}, {0xbfe54000}, {0xbfe56000}, {0xbfe58000}, {0xbfe5a000}, {0xbfe5c000}, {0xbfe5e000}, {0xbfe60000}, {0xbfe62000}, {0xbfe64000}, {0xbfe66000}, {0xbfe68000}, {0xbfe6a000}, {0xbfe6c000}, {0xbfe6e000}, {0xbfe70000}, {0xbfe72000}, {0xbfe74000}, {0xbfe76000}, {0xbfe78000}, {0xbfe7a000}, {0xbfe7c000}, {0xbfe7e000}, {0xbfe80000}, {0xbfe82000}, {0xbfe84000}, {0xbfe86000}, {0xbfe88000}, {0xbfe8a000}, {0xbfe8c000}, {0xbfe8e000}, {0xbfe90000}, {0xbfe92000}, {0xbfe94000}, {0xbfe96000}, {0xbfe98000}, {0xbfe9a000}, {0xbfe9c000}, {0xbfe9e000}, {0xbfea0000}, {0xbfea2000}, {0xbfea4000}, {0xbfea6000}, {0xbfea8000}, {0xbfeaa000}, {0xbfeac000}, {0xbfeae000}, {0xbfeb0000}, {0xbfeb2000}, {0xbfeb4000}, {0xbfeb6000}, {0xbfeb8000}, {0xbfeba000}, {0xbfebc000}, {0xbfebe000}, {0xbfec0000}, {0xbfec2000}, {0xbfec4000}, {0xbfec6000}, {0xbfec8000}, {0xbfeca000}, {0xbfecc000}, {0xbfece000}, {0xbfed0000}, {0xbfed2000}, {0xbfed4000}, {0xbfed6000}, {0xbfed8000}, {0xbfeda000}, {0xbfedc000}, {0xbfede000}, {0xbfee0000}, {0xbfee2000}, {0xbfee4000}, {0xbfee6000}, {0xbfee8000}, {0xbfeea000}, {0xbfeec000}, {0xbfeee000}, {0xbfef0000}, {0xbfef2000}, {0xbfef4000}, {0xbfef6000}, {0xbfef8000}, {0xbfefa000}, {0xbfefc000}, {0xbfefe000}, {0xbff00000}, {0xbff02000}, {0xbff04000}, {0xbff06000}, {0xbff08000}, {0xbff0a000}, {0xbff0c000}, {0xbff0e000}, {0xbff10000}, {0xbff12000}, {0xbff14000}, {0xbff16000}, {0xbff18000}, {0xbff1a000}, {0xbff1c000}, {0xbff1e000}, {0xbff20000}, {0xbff22000}, {0xbff24000}, {0xbff26000}, {0xbff28000}, {0xbff2a000}, {0xbff2c000}, {0xbff2e000}, {0xbff30000}, {0xbff32000}, {0xbff34000}, {0xbff36000}, {0xbff38000}, {0xbff3a000}, {0xbff3c000}, {0xbff3e000}, {0xbff40000}, {0xbff42000}, {0xbff44000}, {0xbff46000}, {0xbff48000}, {0xbff4a000}, {0xbff4c000}, {0xbff4e000}, {0xbff50000}, {0xbff52000}, {0xbff54000}, {0xbff56000}, {0xbff58000}, {0xbff5a000}, {0xbff5c000}, {0xbff5e000}, {0xbff60000}, {0xbff62000}, {0xbff64000}, {0xbff66000}, {0xbff68000}, {0xbff6a000}, {0xbff6c000}, {0xbff6e000}, {0xbff70000}, {0xbff72000}, {0xbff74000}, {0xbff76000}, {0xbff78000}, {0xbff7a000}, {0xbff7c000}, {0xbff7e000}, {0xbff80000}, {0xbff82000}, {0xbff84000}, {0xbff86000}, {0xbff88000}, {0xbff8a000}, {0xbff8c000}, {0xbff8e000}, {0xbff90000}, {0xbff92000}, {0xbff94000}, {0xbff96000}, {0xbff98000}, {0xbff9a000}, {0xbff9c000}, {0xbff9e000}, {0xbffa0000}, {0xbffa2000}, {0xbffa4000}, {0xbffa6000}, {0xbffa8000}, {0xbffaa000}, {0xbffac000}, {0xbffae000}, {0xbffb0000}, {0xbffb2000}, {0xbffb4000}, {0xbffb6000}, {0xbffb8000}, {0xbffba000}, {0xbffbc000}, {0xbffbe000}, {0xbffc0000}, {0xbffc2000}, {0xbffc4000}, {0xbffc6000}, {0xbffc8000}, {0xbffca000}, {0xbffcc000}, {0xbffce000}, {0xbffd0000}, {0xbffd2000}, {0xbffd4000}, {0xbffd6000}, {0xbffd8000}, {0xbffda000}, {0xbffdc000}, {0xbffde000}, {0xbffe0000}, {0xbffe2000}, {0xbffe4000}, {0xbffe6000}, {0xbffe8000}, {0xbffea000}, {0xbffec000}, {0xbffee000}, {0xbfff0000}, {0xbfff2000}, {0xbfff4000}, {0xbfff6000}, {0xbfff8000}, {0xbfffa000}, {0xbfffc000}, {0xbfffe000}, {0xc0000000}, {0xc0002000}, {0xc0004000}, {0xc0006000}, {0xc0008000}, {0xc000a000}, {0xc000c000}, {0xc000e000}, {0xc0010000}, {0xc0012000}, {0xc0014000}, {0xc0016000}, {0xc0018000}, {0xc001a000}, {0xc001c000}, {0xc001e000}, {0xc0020000}, {0xc0022000}, {0xc0024000}, {0xc0026000}, {0xc0028000}, {0xc002a000}, {0xc002c000}, {0xc002e000}, {0xc0030000}, {0xc0032000}, {0xc0034000}, {0xc0036000}, {0xc0038000}, {0xc003a000}, {0xc003c000}, {0xc003e000}, {0xc0040000}, {0xc0042000}, {0xc0044000}, {0xc0046000}, {0xc0048000}, {0xc004a000}, {0xc004c000}, {0xc004e000}, {0xc0050000}, {0xc0052000}, {0xc0054000}, {0xc0056000}, {0xc0058000}, {0xc005a000}, {0xc005c000}, {0xc005e000}, {0xc0060000}, {0xc0062000}, {0xc0064000}, {0xc0066000}, {0xc0068000}, {0xc006a000}, {0xc006c000}, {0xc006e000}, {0xc0070000}, {0xc0072000}, {0xc0074000}, {0xc0076000}, {0xc0078000}, {0xc007a000}, {0xc007c000}, {0xc007e000}, {0xc0080000}, {0xc0082000}, {0xc0084000}, {0xc0086000}, {0xc0088000}, {0xc008a000}, {0xc008c000}, {0xc008e000}, {0xc0090000}, {0xc0092000}, {0xc0094000}, {0xc0096000}, {0xc0098000}, {0xc009a000}, {0xc009c000}, {0xc009e000}, {0xc00a0000}, {0xc00a2000}, {0xc00a4000}, {0xc00a6000}, {0xc00a8000}, {0xc00aa000}, {0xc00ac000}, {0xc00ae000}, {0xc00b0000}, {0xc00b2000}, {0xc00b4000}, {0xc00b6000}, {0xc00b8000}, {0xc00ba000}, {0xc00bc000}, {0xc00be000}, {0xc00c0000}, {0xc00c2000}, {0xc00c4000}, {0xc00c6000}, {0xc00c8000}, {0xc00ca000}, {0xc00cc000}, {0xc00ce000}, {0xc00d0000}, {0xc00d2000}, {0xc00d4000}, {0xc00d6000}, {0xc00d8000}, {0xc00da000}, {0xc00dc000}, {0xc00de000}, {0xc00e0000}, {0xc00e2000}, {0xc00e4000}, {0xc00e6000}, {0xc00e8000}, {0xc00ea000}, {0xc00ec000}, {0xc00ee000}, {0xc00f0000}, {0xc00f2000}, {0xc00f4000}, {0xc00f6000}, {0xc00f8000}, {0xc00fa000}, {0xc00fc000}, {0xc00fe000}, {0xc0100000}, {0xc0102000}, {0xc0104000}, {0xc0106000}, {0xc0108000}, {0xc010a000}, {0xc010c000}, {0xc010e000}, {0xc0110000}, {0xc0112000}, {0xc0114000}, {0xc0116000}, {0xc0118000}, {0xc011a000}, {0xc011c000}, {0xc011e000}, {0xc0120000}, {0xc0122000}, {0xc0124000}, {0xc0126000}, {0xc0128000}, {0xc012a000}, {0xc012c000}, {0xc012e000}, {0xc0130000}, {0xc0132000}, {0xc0134000}, {0xc0136000}, {0xc0138000}, {0xc013a000}, {0xc013c000}, {0xc013e000}, {0xc0140000}, {0xc0142000}, {0xc0144000}, {0xc0146000}, {0xc0148000}, {0xc014a000}, {0xc014c000}, {0xc014e000}, {0xc0150000}, {0xc0152000}, {0xc0154000}, {0xc0156000}, {0xc0158000}, {0xc015a000}, {0xc015c000}, {0xc015e000}, {0xc0160000}, {0xc0162000}, {0xc0164000}, {0xc0166000}, {0xc0168000}, {0xc016a000}, {0xc016c000}, {0xc016e000}, {0xc0170000}, {0xc0172000}, {0xc0174000}, {0xc0176000}, {0xc0178000}, {0xc017a000}, {0xc017c000}, {0xc017e000}, {0xc0180000}, {0xc0182000}, {0xc0184000}, {0xc0186000}, {0xc0188000}, {0xc018a000}, {0xc018c000}, {0xc018e000}, {0xc0190000}, {0xc0192000}, {0xc0194000}, {0xc0196000}, {0xc0198000}, {0xc019a000}, {0xc019c000}, {0xc019e000}, {0xc01a0000}, {0xc01a2000}, {0xc01a4000}, {0xc01a6000}, {0xc01a8000}, {0xc01aa000}, {0xc01ac000}, {0xc01ae000}, {0xc01b0000}, {0xc01b2000}, {0xc01b4000}, {0xc01b6000}, {0xc01b8000}, {0xc01ba000}, {0xc01bc000}, {0xc01be000}, {0xc01c0000}, {0xc01c2000}, {0xc01c4000}, {0xc01c6000}, {0xc01c8000}, {0xc01ca000}, {0xc01cc000}, {0xc01ce000}, {0xc01d0000}, {0xc01d2000}, {0xc01d4000}, {0xc01d6000}, {0xc01d8000}, {0xc01da000}, {0xc01dc000}, {0xc01de000}, {0xc01e0000}, {0xc01e2000}, {0xc01e4000}, {0xc01e6000}, {0xc01e8000}, {0xc01ea000}, {0xc01ec000}, {0xc01ee000}, {0xc01f0000}, {0xc01f2000}, {0xc01f4000}, {0xc01f6000}, {0xc01f8000}, {0xc01fa000}, {0xc01fc000}, {0xc01fe000}, {0xc0200000}, {0xc0202000}, {0xc0204000}, {0xc0206000}, {0xc0208000}, {0xc020a000}, {0xc020c000}, {0xc020e000}, {0xc0210000}, {0xc0212000}, {0xc0214000}, {0xc0216000}, {0xc0218000}, {0xc021a000}, {0xc021c000}, {0xc021e000}, {0xc0220000}, {0xc0222000}, {0xc0224000}, {0xc0226000}, {0xc0228000}, {0xc022a000}, {0xc022c000}, {0xc022e000}, {0xc0230000}, {0xc0232000}, {0xc0234000}, {0xc0236000}, {0xc0238000}, {0xc023a000}, {0xc023c000}, {0xc023e000}, {0xc0240000}, {0xc0242000}, {0xc0244000}, {0xc0246000}, {0xc0248000}, {0xc024a000}, {0xc024c000}, {0xc024e000}, {0xc0250000}, {0xc0252000}, {0xc0254000}, {0xc0256000}, {0xc0258000}, {0xc025a000}, {0xc025c000}, {0xc025e000}, {0xc0260000}, {0xc0262000}, {0xc0264000}, {0xc0266000}, {0xc0268000}, {0xc026a000}, {0xc026c000}, {0xc026e000}, {0xc0270000}, {0xc0272000}, {0xc0274000}, {0xc0276000}, {0xc0278000}, {0xc027a000}, {0xc027c000}, {0xc027e000}, {0xc0280000}, {0xc0282000}, {0xc0284000}, {0xc0286000}, {0xc0288000}, {0xc028a000}, {0xc028c000}, {0xc028e000}, {0xc0290000}, {0xc0292000}, {0xc0294000}, {0xc0296000}, {0xc0298000}, {0xc029a000}, {0xc029c000}, {0xc029e000}, {0xc02a0000}, {0xc02a2000}, {0xc02a4000}, {0xc02a6000}, {0xc02a8000}, {0xc02aa000}, {0xc02ac000}, {0xc02ae000}, {0xc02b0000}, {0xc02b2000}, {0xc02b4000}, {0xc02b6000}, {0xc02b8000}, {0xc02ba000}, {0xc02bc000}, {0xc02be000}, {0xc02c0000}, {0xc02c2000}, {0xc02c4000}, {0xc02c6000}, {0xc02c8000}, {0xc02ca000}, {0xc02cc000}, {0xc02ce000}, {0xc02d0000}, {0xc02d2000}, {0xc02d4000}, {0xc02d6000}, {0xc02d8000}, {0xc02da000}, {0xc02dc000}, {0xc02de000}, {0xc02e0000}, {0xc02e2000}, {0xc02e4000}, {0xc02e6000}, {0xc02e8000}, {0xc02ea000}, {0xc02ec000}, {0xc02ee000}, {0xc02f0000}, {0xc02f2000}, {0xc02f4000}, {0xc02f6000}, {0xc02f8000}, {0xc02fa000}, {0xc02fc000}, {0xc02fe000}, {0xc0300000}, {0xc0302000}, {0xc0304000}, {0xc0306000}, {0xc0308000}, {0xc030a000}, {0xc030c000}, {0xc030e000}, {0xc0310000}, {0xc0312000}, {0xc0314000}, {0xc0316000}, {0xc0318000}, {0xc031a000}, {0xc031c000}, {0xc031e000}, {0xc0320000}, {0xc0322000}, {0xc0324000}, {0xc0326000}, {0xc0328000}, {0xc032a000}, {0xc032c000}, {0xc032e000}, {0xc0330000}, {0xc0332000}, {0xc0334000}, {0xc0336000}, {0xc0338000}, {0xc033a000}, {0xc033c000}, {0xc033e000}, {0xc0340000}, {0xc0342000}, {0xc0344000}, {0xc0346000}, {0xc0348000}, {0xc034a000}, {0xc034c000}, {0xc034e000}, {0xc0350000}, {0xc0352000}, {0xc0354000}, {0xc0356000}, {0xc0358000}, {0xc035a000}, {0xc035c000}, {0xc035e000}, {0xc0360000}, {0xc0362000}, {0xc0364000}, {0xc0366000}, {0xc0368000}, {0xc036a000}, {0xc036c000}, {0xc036e000}, {0xc0370000}, {0xc0372000}, {0xc0374000}, {0xc0376000}, {0xc0378000}, {0xc037a000}, {0xc037c000}, {0xc037e000}, {0xc0380000}, {0xc0382000}, {0xc0384000}, {0xc0386000}, {0xc0388000}, {0xc038a000}, {0xc038c000}, {0xc038e000}, {0xc0390000}, {0xc0392000}, {0xc0394000}, {0xc0396000}, {0xc0398000}, {0xc039a000}, {0xc039c000}, {0xc039e000}, {0xc03a0000}, {0xc03a2000}, {0xc03a4000}, {0xc03a6000}, {0xc03a8000}, {0xc03aa000}, {0xc03ac000}, {0xc03ae000}, {0xc03b0000}, {0xc03b2000}, {0xc03b4000}, {0xc03b6000}, {0xc03b8000}, {0xc03ba000}, {0xc03bc000}, {0xc03be000}, {0xc03c0000}, {0xc03c2000}, {0xc03c4000}, {0xc03c6000}, {0xc03c8000}, {0xc03ca000}, {0xc03cc000}, {0xc03ce000}, {0xc03d0000}, {0xc03d2000}, {0xc03d4000}, {0xc03d6000}, {0xc03d8000}, {0xc03da000}, {0xc03dc000}, {0xc03de000}, {0xc03e0000}, {0xc03e2000}, {0xc03e4000}, {0xc03e6000}, {0xc03e8000}, {0xc03ea000}, {0xc03ec000}, {0xc03ee000}, {0xc03f0000}, {0xc03f2000}, {0xc03f4000}, {0xc03f6000}, {0xc03f8000}, {0xc03fa000}, {0xc03fc000}, {0xc03fe000}, {0xc0400000}, {0xc0402000}, {0xc0404000}, {0xc0406000}, {0xc0408000}, {0xc040a000}, {0xc040c000}, {0xc040e000}, {0xc0410000}, {0xc0412000}, {0xc0414000}, {0xc0416000}, {0xc0418000}, {0xc041a000}, {0xc041c000}, {0xc041e000}, {0xc0420000}, {0xc0422000}, {0xc0424000}, {0xc0426000}, {0xc0428000}, {0xc042a000}, {0xc042c000}, {0xc042e000}, {0xc0430000}, {0xc0432000}, {0xc0434000}, {0xc0436000}, {0xc0438000}, {0xc043a000}, {0xc043c000}, {0xc043e000}, {0xc0440000}, {0xc0442000}, {0xc0444000}, {0xc0446000}, {0xc0448000}, {0xc044a000}, {0xc044c000}, {0xc044e000}, {0xc0450000}, {0xc0452000}, {0xc0454000}, {0xc0456000}, {0xc0458000}, {0xc045a000}, {0xc045c000}, {0xc045e000}, {0xc0460000}, {0xc0462000}, {0xc0464000}, {0xc0466000}, {0xc0468000}, {0xc046a000}, {0xc046c000}, {0xc046e000}, {0xc0470000}, {0xc0472000}, {0xc0474000}, {0xc0476000}, {0xc0478000}, {0xc047a000}, {0xc047c000}, {0xc047e000}, {0xc0480000}, {0xc0482000}, {0xc0484000}, {0xc0486000}, {0xc0488000}, {0xc048a000}, {0xc048c000}, {0xc048e000}, {0xc0490000}, {0xc0492000}, {0xc0494000}, {0xc0496000}, {0xc0498000}, {0xc049a000}, {0xc049c000}, {0xc049e000}, {0xc04a0000}, {0xc04a2000}, {0xc04a4000}, {0xc04a6000}, {0xc04a8000}, {0xc04aa000}, {0xc04ac000}, {0xc04ae000}, {0xc04b0000}, {0xc04b2000}, {0xc04b4000}, {0xc04b6000}, {0xc04b8000}, {0xc04ba000}, {0xc04bc000}, {0xc04be000}, {0xc04c0000}, {0xc04c2000}, {0xc04c4000}, {0xc04c6000}, {0xc04c8000}, {0xc04ca000}, {0xc04cc000}, {0xc04ce000}, {0xc04d0000}, {0xc04d2000}, {0xc04d4000}, {0xc04d6000}, {0xc04d8000}, {0xc04da000}, {0xc04dc000}, {0xc04de000}, {0xc04e0000}, {0xc04e2000}, {0xc04e4000}, {0xc04e6000}, {0xc04e8000}, {0xc04ea000}, {0xc04ec000}, {0xc04ee000}, {0xc04f0000}, {0xc04f2000}, {0xc04f4000}, {0xc04f6000}, {0xc04f8000}, {0xc04fa000}, {0xc04fc000}, {0xc04fe000}, {0xc0500000}, {0xc0502000}, {0xc0504000}, {0xc0506000}, {0xc0508000}, {0xc050a000}, {0xc050c000}, {0xc050e000}, {0xc0510000}, {0xc0512000}, {0xc0514000}, {0xc0516000}, {0xc0518000}, {0xc051a000}, {0xc051c000}, {0xc051e000}, {0xc0520000}, {0xc0522000}, {0xc0524000}, {0xc0526000}, {0xc0528000}, {0xc052a000}, {0xc052c000}, {0xc052e000}, {0xc0530000}, {0xc0532000}, {0xc0534000}, {0xc0536000}, {0xc0538000}, {0xc053a000}, {0xc053c000}, {0xc053e000}, {0xc0540000}, {0xc0542000}, {0xc0544000}, {0xc0546000}, {0xc0548000}, {0xc054a000}, {0xc054c000}, {0xc054e000}, {0xc0550000}, {0xc0552000}, {0xc0554000}, {0xc0556000}, {0xc0558000}, {0xc055a000}, {0xc055c000}, {0xc055e000}, {0xc0560000}, {0xc0562000}, {0xc0564000}, {0xc0566000}, {0xc0568000}, {0xc056a000}, {0xc056c000}, {0xc056e000}, {0xc0570000}, {0xc0572000}, {0xc0574000}, {0xc0576000}, {0xc0578000}, {0xc057a000}, {0xc057c000}, {0xc057e000}, {0xc0580000}, {0xc0582000}, {0xc0584000}, {0xc0586000}, {0xc0588000}, {0xc058a000}, {0xc058c000}, {0xc058e000}, {0xc0590000}, {0xc0592000}, {0xc0594000}, {0xc0596000}, {0xc0598000}, {0xc059a000}, {0xc059c000}, {0xc059e000}, {0xc05a0000}, {0xc05a2000}, {0xc05a4000}, {0xc05a6000}, {0xc05a8000}, {0xc05aa000}, {0xc05ac000}, {0xc05ae000}, {0xc05b0000}, {0xc05b2000}, {0xc05b4000}, {0xc05b6000}, {0xc05b8000}, {0xc05ba000}, {0xc05bc000}, {0xc05be000}, {0xc05c0000}, {0xc05c2000}, {0xc05c4000}, {0xc05c6000}, {0xc05c8000}, {0xc05ca000}, {0xc05cc000}, {0xc05ce000}, {0xc05d0000}, {0xc05d2000}, {0xc05d4000}, {0xc05d6000}, {0xc05d8000}, {0xc05da000}, {0xc05dc000}, {0xc05de000}, {0xc05e0000}, {0xc05e2000}, {0xc05e4000}, {0xc05e6000}, {0xc05e8000}, {0xc05ea000}, {0xc05ec000}, {0xc05ee000}, {0xc05f0000}, {0xc05f2000}, {0xc05f4000}, {0xc05f6000}, {0xc05f8000}, {0xc05fa000}, {0xc05fc000}, {0xc05fe000}, {0xc0600000}, {0xc0602000}, {0xc0604000}, {0xc0606000}, {0xc0608000}, {0xc060a000}, {0xc060c000}, {0xc060e000}, {0xc0610000}, {0xc0612000}, {0xc0614000}, {0xc0616000}, {0xc0618000}, {0xc061a000}, {0xc061c000}, {0xc061e000}, {0xc0620000}, {0xc0622000}, {0xc0624000}, {0xc0626000}, {0xc0628000}, {0xc062a000}, {0xc062c000}, {0xc062e000}, {0xc0630000}, {0xc0632000}, {0xc0634000}, {0xc0636000}, {0xc0638000}, {0xc063a000}, {0xc063c000}, {0xc063e000}, {0xc0640000}, {0xc0642000}, {0xc0644000}, {0xc0646000}, {0xc0648000}, {0xc064a000}, {0xc064c000}, {0xc064e000}, {0xc0650000}, {0xc0652000}, {0xc0654000}, {0xc0656000}, {0xc0658000}, {0xc065a000}, {0xc065c000}, {0xc065e000}, {0xc0660000}, {0xc0662000}, {0xc0664000}, {0xc0666000}, {0xc0668000}, {0xc066a000}, {0xc066c000}, {0xc066e000}, {0xc0670000}, {0xc0672000}, {0xc0674000}, {0xc0676000}, {0xc0678000}, {0xc067a000}, {0xc067c000}, {0xc067e000}, {0xc0680000}, {0xc0682000}, {0xc0684000}, {0xc0686000}, {0xc0688000}, {0xc068a000}, {0xc068c000}, {0xc068e000}, {0xc0690000}, {0xc0692000}, {0xc0694000}, {0xc0696000}, {0xc0698000}, {0xc069a000}, {0xc069c000}, {0xc069e000}, {0xc06a0000}, {0xc06a2000}, {0xc06a4000}, {0xc06a6000}, {0xc06a8000}, {0xc06aa000}, {0xc06ac000}, {0xc06ae000}, {0xc06b0000}, {0xc06b2000}, {0xc06b4000}, {0xc06b6000}, {0xc06b8000}, {0xc06ba000}, {0xc06bc000}, {0xc06be000}, {0xc06c0000}, {0xc06c2000}, {0xc06c4000}, {0xc06c6000}, {0xc06c8000}, {0xc06ca000}, {0xc06cc000}, {0xc06ce000}, {0xc06d0000}, {0xc06d2000}, {0xc06d4000}, {0xc06d6000}, {0xc06d8000}, {0xc06da000}, {0xc06dc000}, {0xc06de000}, {0xc06e0000}, {0xc06e2000}, {0xc06e4000}, {0xc06e6000}, {0xc06e8000}, {0xc06ea000}, {0xc06ec000}, {0xc06ee000}, {0xc06f0000}, {0xc06f2000}, {0xc06f4000}, {0xc06f6000}, {0xc06f8000}, {0xc06fa000}, {0xc06fc000}, {0xc06fe000}, {0xc0700000}, {0xc0702000}, {0xc0704000}, {0xc0706000}, {0xc0708000}, {0xc070a000}, {0xc070c000}, {0xc070e000}, {0xc0710000}, {0xc0712000}, {0xc0714000}, {0xc0716000}, {0xc0718000}, {0xc071a000}, {0xc071c000}, {0xc071e000}, {0xc0720000}, {0xc0722000}, {0xc0724000}, {0xc0726000}, {0xc0728000}, {0xc072a000}, {0xc072c000}, {0xc072e000}, {0xc0730000}, {0xc0732000}, {0xc0734000}, {0xc0736000}, {0xc0738000}, {0xc073a000}, {0xc073c000}, {0xc073e000}, {0xc0740000}, {0xc0742000}, {0xc0744000}, {0xc0746000}, {0xc0748000}, {0xc074a000}, {0xc074c000}, {0xc074e000}, {0xc0750000}, {0xc0752000}, {0xc0754000}, {0xc0756000}, {0xc0758000}, {0xc075a000}, {0xc075c000}, {0xc075e000}, {0xc0760000}, {0xc0762000}, {0xc0764000}, {0xc0766000}, {0xc0768000}, {0xc076a000}, {0xc076c000}, {0xc076e000}, {0xc0770000}, {0xc0772000}, {0xc0774000}, {0xc0776000}, {0xc0778000}, {0xc077a000}, {0xc077c000}, {0xc077e000}, {0xc0780000}, {0xc0782000}, {0xc0784000}, {0xc0786000}, {0xc0788000}, {0xc078a000}, {0xc078c000}, {0xc078e000}, {0xc0790000}, {0xc0792000}, {0xc0794000}, {0xc0796000}, {0xc0798000}, {0xc079a000}, {0xc079c000}, {0xc079e000}, {0xc07a0000}, {0xc07a2000}, {0xc07a4000}, {0xc07a6000}, {0xc07a8000}, {0xc07aa000}, {0xc07ac000}, {0xc07ae000}, {0xc07b0000}, {0xc07b2000}, {0xc07b4000}, {0xc07b6000}, {0xc07b8000}, {0xc07ba000}, {0xc07bc000}, {0xc07be000}, {0xc07c0000}, {0xc07c2000}, {0xc07c4000}, {0xc07c6000}, {0xc07c8000}, {0xc07ca000}, {0xc07cc000}, {0xc07ce000}, {0xc07d0000}, {0xc07d2000}, {0xc07d4000}, {0xc07d6000}, {0xc07d8000}, {0xc07da000}, {0xc07dc000}, {0xc07de000}, {0xc07e0000}, {0xc07e2000}, {0xc07e4000}, {0xc07e6000}, {0xc07e8000}, {0xc07ea000}, {0xc07ec000}, {0xc07ee000}, {0xc07f0000}, {0xc07f2000}, {0xc07f4000}, {0xc07f6000}, {0xc07f8000}, {0xc07fa000}, {0xc07fc000}, {0xc07fe000}, {0xc0800000}, {0xc0802000}, {0xc0804000}, {0xc0806000}, {0xc0808000}, {0xc080a000}, {0xc080c000}, {0xc080e000}, {0xc0810000}, {0xc0812000}, {0xc0814000}, {0xc0816000}, {0xc0818000}, {0xc081a000}, {0xc081c000}, {0xc081e000}, {0xc0820000}, {0xc0822000}, {0xc0824000}, {0xc0826000}, {0xc0828000}, {0xc082a000}, {0xc082c000}, {0xc082e000}, {0xc0830000}, {0xc0832000}, {0xc0834000}, {0xc0836000}, {0xc0838000}, {0xc083a000}, {0xc083c000}, {0xc083e000}, {0xc0840000}, {0xc0842000}, {0xc0844000}, {0xc0846000}, {0xc0848000}, {0xc084a000}, {0xc084c000}, {0xc084e000}, {0xc0850000}, {0xc0852000}, {0xc0854000}, {0xc0856000}, {0xc0858000}, {0xc085a000}, {0xc085c000}, {0xc085e000}, {0xc0860000}, {0xc0862000}, {0xc0864000}, {0xc0866000}, {0xc0868000}, {0xc086a000}, {0xc086c000}, {0xc086e000}, {0xc0870000}, {0xc0872000}, {0xc0874000}, {0xc0876000}, {0xc0878000}, {0xc087a000}, {0xc087c000}, {0xc087e000}, {0xc0880000}, {0xc0882000}, {0xc0884000}, {0xc0886000}, {0xc0888000}, {0xc088a000}, {0xc088c000}, {0xc088e000}, {0xc0890000}, {0xc0892000}, {0xc0894000}, {0xc0896000}, {0xc0898000}, {0xc089a000}, {0xc089c000}, {0xc089e000}, {0xc08a0000}, {0xc08a2000}, {0xc08a4000}, {0xc08a6000}, {0xc08a8000}, {0xc08aa000}, {0xc08ac000}, {0xc08ae000}, {0xc08b0000}, {0xc08b2000}, {0xc08b4000}, {0xc08b6000}, {0xc08b8000}, {0xc08ba000}, {0xc08bc000}, {0xc08be000}, {0xc08c0000}, {0xc08c2000}, {0xc08c4000}, {0xc08c6000}, {0xc08c8000}, {0xc08ca000}, {0xc08cc000}, {0xc08ce000}, {0xc08d0000}, {0xc08d2000}, {0xc08d4000}, {0xc08d6000}, {0xc08d8000}, {0xc08da000}, {0xc08dc000}, {0xc08de000}, {0xc08e0000}, {0xc08e2000}, {0xc08e4000}, {0xc08e6000}, {0xc08e8000}, {0xc08ea000}, {0xc08ec000}, {0xc08ee000}, {0xc08f0000}, {0xc08f2000}, {0xc08f4000}, {0xc08f6000}, {0xc08f8000}, {0xc08fa000}, {0xc08fc000}, {0xc08fe000}, {0xc0900000}, {0xc0902000}, {0xc0904000}, {0xc0906000}, {0xc0908000}, {0xc090a000}, {0xc090c000}, {0xc090e000}, {0xc0910000}, {0xc0912000}, {0xc0914000}, {0xc0916000}, {0xc0918000}, {0xc091a000}, {0xc091c000}, {0xc091e000}, {0xc0920000}, {0xc0922000}, {0xc0924000}, {0xc0926000}, {0xc0928000}, {0xc092a000}, {0xc092c000}, {0xc092e000}, {0xc0930000}, {0xc0932000}, {0xc0934000}, {0xc0936000}, {0xc0938000}, {0xc093a000}, {0xc093c000}, {0xc093e000}, {0xc0940000}, {0xc0942000}, {0xc0944000}, {0xc0946000}, {0xc0948000}, {0xc094a000}, {0xc094c000}, {0xc094e000}, {0xc0950000}, {0xc0952000}, {0xc0954000}, {0xc0956000}, {0xc0958000}, {0xc095a000}, {0xc095c000}, {0xc095e000}, {0xc0960000}, {0xc0962000}, {0xc0964000}, {0xc0966000}, {0xc0968000}, {0xc096a000}, {0xc096c000}, {0xc096e000}, {0xc0970000}, {0xc0972000}, {0xc0974000}, {0xc0976000}, {0xc0978000}, {0xc097a000}, {0xc097c000}, {0xc097e000}, {0xc0980000}, {0xc0982000}, {0xc0984000}, {0xc0986000}, {0xc0988000}, {0xc098a000}, {0xc098c000}, {0xc098e000}, {0xc0990000}, {0xc0992000}, {0xc0994000}, {0xc0996000}, {0xc0998000}, {0xc099a000}, {0xc099c000}, {0xc099e000}, {0xc09a0000}, {0xc09a2000}, {0xc09a4000}, {0xc09a6000}, {0xc09a8000}, {0xc09aa000}, {0xc09ac000}, {0xc09ae000}, {0xc09b0000}, {0xc09b2000}, {0xc09b4000}, {0xc09b6000}, {0xc09b8000}, {0xc09ba000}, {0xc09bc000}, {0xc09be000}, {0xc09c0000}, {0xc09c2000}, {0xc09c4000}, {0xc09c6000}, {0xc09c8000}, {0xc09ca000}, {0xc09cc000}, {0xc09ce000}, {0xc09d0000}, {0xc09d2000}, {0xc09d4000}, {0xc09d6000}, {0xc09d8000}, {0xc09da000}, {0xc09dc000}, {0xc09de000}, {0xc09e0000}, {0xc09e2000}, {0xc09e4000}, {0xc09e6000}, {0xc09e8000}, {0xc09ea000}, {0xc09ec000}, {0xc09ee000}, {0xc09f0000}, {0xc09f2000}, {0xc09f4000}, {0xc09f6000}, {0xc09f8000}, {0xc09fa000}, {0xc09fc000}, {0xc09fe000}, {0xc0a00000}, {0xc0a02000}, {0xc0a04000}, {0xc0a06000}, {0xc0a08000}, {0xc0a0a000}, {0xc0a0c000}, {0xc0a0e000}, {0xc0a10000}, {0xc0a12000}, {0xc0a14000}, {0xc0a16000}, {0xc0a18000}, {0xc0a1a000}, {0xc0a1c000}, {0xc0a1e000}, {0xc0a20000}, {0xc0a22000}, {0xc0a24000}, {0xc0a26000}, {0xc0a28000}, {0xc0a2a000}, {0xc0a2c000}, {0xc0a2e000}, {0xc0a30000}, {0xc0a32000}, {0xc0a34000}, {0xc0a36000}, {0xc0a38000}, {0xc0a3a000}, {0xc0a3c000}, {0xc0a3e000}, {0xc0a40000}, {0xc0a42000}, {0xc0a44000}, {0xc0a46000}, {0xc0a48000}, {0xc0a4a000}, {0xc0a4c000}, {0xc0a4e000}, {0xc0a50000}, {0xc0a52000}, {0xc0a54000}, {0xc0a56000}, {0xc0a58000}, {0xc0a5a000}, {0xc0a5c000}, {0xc0a5e000}, {0xc0a60000}, {0xc0a62000}, {0xc0a64000}, {0xc0a66000}, {0xc0a68000}, {0xc0a6a000}, {0xc0a6c000}, {0xc0a6e000}, {0xc0a70000}, {0xc0a72000}, {0xc0a74000}, {0xc0a76000}, {0xc0a78000}, {0xc0a7a000}, {0xc0a7c000}, {0xc0a7e000}, {0xc0a80000}, {0xc0a82000}, {0xc0a84000}, {0xc0a86000}, {0xc0a88000}, {0xc0a8a000}, {0xc0a8c000}, {0xc0a8e000}, {0xc0a90000}, {0xc0a92000}, {0xc0a94000}, {0xc0a96000}, {0xc0a98000}, {0xc0a9a000}, {0xc0a9c000}, {0xc0a9e000}, {0xc0aa0000}, {0xc0aa2000}, {0xc0aa4000}, {0xc0aa6000}, {0xc0aa8000}, {0xc0aaa000}, {0xc0aac000}, {0xc0aae000}, {0xc0ab0000}, {0xc0ab2000}, {0xc0ab4000}, {0xc0ab6000}, {0xc0ab8000}, {0xc0aba000}, {0xc0abc000}, {0xc0abe000}, {0xc0ac0000}, {0xc0ac2000}, {0xc0ac4000}, {0xc0ac6000}, {0xc0ac8000}, {0xc0aca000}, {0xc0acc000}, {0xc0ace000}, {0xc0ad0000}, {0xc0ad2000}, {0xc0ad4000}, {0xc0ad6000}, {0xc0ad8000}, {0xc0ada000}, {0xc0adc000}, {0xc0ade000}, {0xc0ae0000}, {0xc0ae2000}, {0xc0ae4000}, {0xc0ae6000}, {0xc0ae8000}, {0xc0aea000}, {0xc0aec000}, {0xc0aee000}, {0xc0af0000}, {0xc0af2000}, {0xc0af4000}, {0xc0af6000}, {0xc0af8000}, {0xc0afa000}, {0xc0afc000}, {0xc0afe000}, {0xc0b00000}, {0xc0b02000}, {0xc0b04000}, {0xc0b06000}, {0xc0b08000}, {0xc0b0a000}, {0xc0b0c000}, {0xc0b0e000}, {0xc0b10000}, {0xc0b12000}, {0xc0b14000}, {0xc0b16000}, {0xc0b18000}, {0xc0b1a000}, {0xc0b1c000}, {0xc0b1e000}, {0xc0b20000}, {0xc0b22000}, {0xc0b24000}, {0xc0b26000}, {0xc0b28000}, {0xc0b2a000}, {0xc0b2c000}, {0xc0b2e000}, {0xc0b30000}, {0xc0b32000}, {0xc0b34000}, {0xc0b36000}, {0xc0b38000}, {0xc0b3a000}, {0xc0b3c000}, {0xc0b3e000}, {0xc0b40000}, {0xc0b42000}, {0xc0b44000}, {0xc0b46000}, {0xc0b48000}, {0xc0b4a000}, {0xc0b4c000}, {0xc0b4e000}, {0xc0b50000}, {0xc0b52000}, {0xc0b54000}, {0xc0b56000}, {0xc0b58000}, {0xc0b5a000}, {0xc0b5c000}, {0xc0b5e000}, {0xc0b60000}, {0xc0b62000}, {0xc0b64000}, {0xc0b66000}, {0xc0b68000}, {0xc0b6a000}, {0xc0b6c000}, {0xc0b6e000}, {0xc0b70000}, {0xc0b72000}, {0xc0b74000}, {0xc0b76000}, {0xc0b78000}, {0xc0b7a000}, {0xc0b7c000}, {0xc0b7e000}, {0xc0b80000}, {0xc0b82000}, {0xc0b84000}, {0xc0b86000}, {0xc0b88000}, {0xc0b8a000}, {0xc0b8c000}, {0xc0b8e000}, {0xc0b90000}, {0xc0b92000}, {0xc0b94000}, {0xc0b96000}, {0xc0b98000}, {0xc0b9a000}, {0xc0b9c000}, {0xc0b9e000}, {0xc0ba0000}, {0xc0ba2000}, {0xc0ba4000}, {0xc0ba6000}, {0xc0ba8000}, {0xc0baa000}, {0xc0bac000}, {0xc0bae000}, {0xc0bb0000}, {0xc0bb2000}, {0xc0bb4000}, {0xc0bb6000}, {0xc0bb8000}, {0xc0bba000}, {0xc0bbc000}, {0xc0bbe000}, {0xc0bc0000}, {0xc0bc2000}, {0xc0bc4000}, {0xc0bc6000}, {0xc0bc8000}, {0xc0bca000}, {0xc0bcc000}, {0xc0bce000}, {0xc0bd0000}, {0xc0bd2000}, {0xc0bd4000}, {0xc0bd6000}, {0xc0bd8000}, {0xc0bda000}, {0xc0bdc000}, {0xc0bde000}, {0xc0be0000}, {0xc0be2000}, {0xc0be4000}, {0xc0be6000}, {0xc0be8000}, {0xc0bea000}, {0xc0bec000}, {0xc0bee000}, {0xc0bf0000}, {0xc0bf2000}, {0xc0bf4000}, {0xc0bf6000}, {0xc0bf8000}, {0xc0bfa000}, {0xc0bfc000}, {0xc0bfe000}, {0xc0c00000}, {0xc0c02000}, {0xc0c04000}, {0xc0c06000}, {0xc0c08000}, {0xc0c0a000}, {0xc0c0c000}, {0xc0c0e000}, {0xc0c10000}, {0xc0c12000}, {0xc0c14000}, {0xc0c16000}, {0xc0c18000}, {0xc0c1a000}, {0xc0c1c000}, {0xc0c1e000}, {0xc0c20000}, {0xc0c22000}, {0xc0c24000}, {0xc0c26000}, {0xc0c28000}, {0xc0c2a000}, {0xc0c2c000}, {0xc0c2e000}, {0xc0c30000}, {0xc0c32000}, {0xc0c34000}, {0xc0c36000}, {0xc0c38000}, {0xc0c3a000}, {0xc0c3c000}, {0xc0c3e000}, {0xc0c40000}, {0xc0c42000}, {0xc0c44000}, {0xc0c46000}, {0xc0c48000}, {0xc0c4a000}, {0xc0c4c000}, {0xc0c4e000}, {0xc0c50000}, {0xc0c52000}, {0xc0c54000}, {0xc0c56000}, {0xc0c58000}, {0xc0c5a000}, {0xc0c5c000}, {0xc0c5e000}, {0xc0c60000}, {0xc0c62000}, {0xc0c64000}, {0xc0c66000}, {0xc0c68000}, {0xc0c6a000}, {0xc0c6c000}, {0xc0c6e000}, {0xc0c70000}, {0xc0c72000}, {0xc0c74000}, {0xc0c76000}, {0xc0c78000}, {0xc0c7a000}, {0xc0c7c000}, {0xc0c7e000}, {0xc0c80000}, {0xc0c82000}, {0xc0c84000}, {0xc0c86000}, {0xc0c88000}, {0xc0c8a000}, {0xc0c8c000}, {0xc0c8e000}, {0xc0c90000}, {0xc0c92000}, {0xc0c94000}, {0xc0c96000}, {0xc0c98000}, {0xc0c9a000}, {0xc0c9c000}, {0xc0c9e000}, {0xc0ca0000}, {0xc0ca2000}, {0xc0ca4000}, {0xc0ca6000}, {0xc0ca8000}, {0xc0caa000}, {0xc0cac000}, {0xc0cae000}, {0xc0cb0000}, {0xc0cb2000}, {0xc0cb4000}, {0xc0cb6000}, {0xc0cb8000}, {0xc0cba000}, {0xc0cbc000}, {0xc0cbe000}, {0xc0cc0000}, {0xc0cc2000}, {0xc0cc4000}, {0xc0cc6000}, {0xc0cc8000}, {0xc0cca000}, {0xc0ccc000}, {0xc0cce000}, {0xc0cd0000}, {0xc0cd2000}, {0xc0cd4000}, {0xc0cd6000}, {0xc0cd8000}, {0xc0cda000}, {0xc0cdc000}, {0xc0cde000}, {0xc0ce0000}, {0xc0ce2000}, {0xc0ce4000}, {0xc0ce6000}, {0xc0ce8000}, {0xc0cea000}, {0xc0cec000}, {0xc0cee000}, {0xc0cf0000}, {0xc0cf2000}, {0xc0cf4000}, {0xc0cf6000}, {0xc0cf8000}, {0xc0cfa000}, {0xc0cfc000}, {0xc0cfe000}, {0xc0d00000}, {0xc0d02000}, {0xc0d04000}, {0xc0d06000}, {0xc0d08000}, {0xc0d0a000}, {0xc0d0c000}, {0xc0d0e000}, {0xc0d10000}, {0xc0d12000}, {0xc0d14000}, {0xc0d16000}, {0xc0d18000}, {0xc0d1a000}, {0xc0d1c000}, {0xc0d1e000}, {0xc0d20000}, {0xc0d22000}, {0xc0d24000}, {0xc0d26000}, {0xc0d28000}, {0xc0d2a000}, {0xc0d2c000}, {0xc0d2e000}, {0xc0d30000}, {0xc0d32000}, {0xc0d34000}, {0xc0d36000}, {0xc0d38000}, {0xc0d3a000}, {0xc0d3c000}, {0xc0d3e000}, {0xc0d40000}, {0xc0d42000}, {0xc0d44000}, {0xc0d46000}, {0xc0d48000}, {0xc0d4a000}, {0xc0d4c000}, {0xc0d4e000}, {0xc0d50000}, {0xc0d52000}, {0xc0d54000}, {0xc0d56000}, {0xc0d58000}, {0xc0d5a000}, {0xc0d5c000}, {0xc0d5e000}, {0xc0d60000}, {0xc0d62000}, {0xc0d64000}, {0xc0d66000}, {0xc0d68000}, {0xc0d6a000}, {0xc0d6c000}, {0xc0d6e000}, {0xc0d70000}, {0xc0d72000}, {0xc0d74000}, {0xc0d76000}, {0xc0d78000}, {0xc0d7a000}, {0xc0d7c000}, {0xc0d7e000}, {0xc0d80000}, {0xc0d82000}, {0xc0d84000}, {0xc0d86000}, {0xc0d88000}, {0xc0d8a000}, {0xc0d8c000}, {0xc0d8e000}, {0xc0d90000}, {0xc0d92000}, {0xc0d94000}, {0xc0d96000}, {0xc0d98000}, {0xc0d9a000}, {0xc0d9c000}, {0xc0d9e000}, {0xc0da0000}, {0xc0da2000}, {0xc0da4000}, {0xc0da6000}, {0xc0da8000}, {0xc0daa000}, {0xc0dac000}, {0xc0dae000}, {0xc0db0000}, {0xc0db2000}, {0xc0db4000}, {0xc0db6000}, {0xc0db8000}, {0xc0dba000}, {0xc0dbc000}, {0xc0dbe000}, {0xc0dc0000}, {0xc0dc2000}, {0xc0dc4000}, {0xc0dc6000}, {0xc0dc8000}, {0xc0dca000}, {0xc0dcc000}, {0xc0dce000}, {0xc0dd0000}, {0xc0dd2000}, {0xc0dd4000}, {0xc0dd6000}, {0xc0dd8000}, {0xc0dda000}, {0xc0ddc000}, {0xc0dde000}, {0xc0de0000}, {0xc0de2000}, {0xc0de4000}, {0xc0de6000}, {0xc0de8000}, {0xc0dea000}, {0xc0dec000}, {0xc0dee000}, {0xc0df0000}, {0xc0df2000}, {0xc0df4000}, {0xc0df6000}, {0xc0df8000}, {0xc0dfa000}, {0xc0dfc000}, {0xc0dfe000}, {0xc0e00000}, {0xc0e02000}, {0xc0e04000}, {0xc0e06000}, {0xc0e08000}, {0xc0e0a000}, {0xc0e0c000}, {0xc0e0e000}, {0xc0e10000}, {0xc0e12000}, {0xc0e14000}, {0xc0e16000}, {0xc0e18000}, {0xc0e1a000}, {0xc0e1c000}, {0xc0e1e000}, {0xc0e20000}, {0xc0e22000}, {0xc0e24000}, {0xc0e26000}, {0xc0e28000}, {0xc0e2a000}, {0xc0e2c000}, {0xc0e2e000}, {0xc0e30000}, {0xc0e32000}, {0xc0e34000}, {0xc0e36000}, {0xc0e38000}, {0xc0e3a000}, {0xc0e3c000}, {0xc0e3e000}, {0xc0e40000}, {0xc0e42000}, {0xc0e44000}, {0xc0e46000}, {0xc0e48000}, {0xc0e4a000}, {0xc0e4c000}, {0xc0e4e000}, {0xc0e50000}, {0xc0e52000}, {0xc0e54000}, {0xc0e56000}, {0xc0e58000}, {0xc0e5a000}, {0xc0e5c000}, {0xc0e5e000}, {0xc0e60000}, {0xc0e62000}, {0xc0e64000}, {0xc0e66000}, {0xc0e68000}, {0xc0e6a000}, {0xc0e6c000}, {0xc0e6e000}, {0xc0e70000}, {0xc0e72000}, {0xc0e74000}, {0xc0e76000}, {0xc0e78000}, {0xc0e7a000}, {0xc0e7c000}, {0xc0e7e000}, {0xc0e80000}, {0xc0e82000}, {0xc0e84000}, {0xc0e86000}, {0xc0e88000}, {0xc0e8a000}, {0xc0e8c000}, {0xc0e8e000}, {0xc0e90000}, {0xc0e92000}, {0xc0e94000}, {0xc0e96000}, {0xc0e98000}, {0xc0e9a000}, {0xc0e9c000}, {0xc0e9e000}, {0xc0ea0000}, {0xc0ea2000}, {0xc0ea4000}, {0xc0ea6000}, {0xc0ea8000}, {0xc0eaa000}, {0xc0eac000}, {0xc0eae000}, {0xc0eb0000}, {0xc0eb2000}, {0xc0eb4000}, {0xc0eb6000}, {0xc0eb8000}, {0xc0eba000}, {0xc0ebc000}, {0xc0ebe000}, {0xc0ec0000}, {0xc0ec2000}, {0xc0ec4000}, {0xc0ec6000}, {0xc0ec8000}, {0xc0eca000}, {0xc0ecc000}, {0xc0ece000}, {0xc0ed0000}, {0xc0ed2000}, {0xc0ed4000}, {0xc0ed6000}, {0xc0ed8000}, {0xc0eda000}, {0xc0edc000}, {0xc0ede000}, {0xc0ee0000}, {0xc0ee2000}, {0xc0ee4000}, {0xc0ee6000}, {0xc0ee8000}, {0xc0eea000}, {0xc0eec000}, {0xc0eee000}, {0xc0ef0000}, {0xc0ef2000}, {0xc0ef4000}, {0xc0ef6000}, {0xc0ef8000}, {0xc0efa000}, {0xc0efc000}, {0xc0efe000}, {0xc0f00000}, {0xc0f02000}, {0xc0f04000}, {0xc0f06000}, {0xc0f08000}, {0xc0f0a000}, {0xc0f0c000}, {0xc0f0e000}, {0xc0f10000}, {0xc0f12000}, {0xc0f14000}, {0xc0f16000}, {0xc0f18000}, {0xc0f1a000}, {0xc0f1c000}, {0xc0f1e000}, {0xc0f20000}, {0xc0f22000}, {0xc0f24000}, {0xc0f26000}, {0xc0f28000}, {0xc0f2a000}, {0xc0f2c000}, {0xc0f2e000}, {0xc0f30000}, {0xc0f32000}, {0xc0f34000}, {0xc0f36000}, {0xc0f38000}, {0xc0f3a000}, {0xc0f3c000}, {0xc0f3e000}, {0xc0f40000}, {0xc0f42000}, {0xc0f44000}, {0xc0f46000}, {0xc0f48000}, {0xc0f4a000}, {0xc0f4c000}, {0xc0f4e000}, {0xc0f50000}, {0xc0f52000}, {0xc0f54000}, {0xc0f56000}, {0xc0f58000}, {0xc0f5a000}, {0xc0f5c000}, {0xc0f5e000}, {0xc0f60000}, {0xc0f62000}, {0xc0f64000}, {0xc0f66000}, {0xc0f68000}, {0xc0f6a000}, {0xc0f6c000}, {0xc0f6e000}, {0xc0f70000}, {0xc0f72000}, {0xc0f74000}, {0xc0f76000}, {0xc0f78000}, {0xc0f7a000}, {0xc0f7c000}, {0xc0f7e000}, {0xc0f80000}, {0xc0f82000}, {0xc0f84000}, {0xc0f86000}, {0xc0f88000}, {0xc0f8a000}, {0xc0f8c000}, {0xc0f8e000}, {0xc0f90000}, {0xc0f92000}, {0xc0f94000}, {0xc0f96000}, {0xc0f98000}, {0xc0f9a000}, {0xc0f9c000}, {0xc0f9e000}, {0xc0fa0000}, {0xc0fa2000}, {0xc0fa4000}, {0xc0fa6000}, {0xc0fa8000}, {0xc0faa000}, {0xc0fac000}, {0xc0fae000}, {0xc0fb0000}, {0xc0fb2000}, {0xc0fb4000}, {0xc0fb6000}, {0xc0fb8000}, {0xc0fba000}, {0xc0fbc000}, {0xc0fbe000}, {0xc0fc0000}, {0xc0fc2000}, {0xc0fc4000}, {0xc0fc6000}, {0xc0fc8000}, {0xc0fca000}, {0xc0fcc000}, {0xc0fce000}, {0xc0fd0000}, {0xc0fd2000}, {0xc0fd4000}, {0xc0fd6000}, {0xc0fd8000}, {0xc0fda000}, {0xc0fdc000}, {0xc0fde000}, {0xc0fe0000}, {0xc0fe2000}, {0xc0fe4000}, {0xc0fe6000}, {0xc0fe8000}, {0xc0fea000}, {0xc0fec000}, {0xc0fee000}, {0xc0ff0000}, {0xc0ff2000}, {0xc0ff4000}, {0xc0ff6000}, {0xc0ff8000}, {0xc0ffa000}, {0xc0ffc000}, {0xc0ffe000}, {0xc1000000}, {0xc1002000}, {0xc1004000}, {0xc1006000}, {0xc1008000}, {0xc100a000}, {0xc100c000}, {0xc100e000}, {0xc1010000}, {0xc1012000}, {0xc1014000}, {0xc1016000}, {0xc1018000}, {0xc101a000}, {0xc101c000}, {0xc101e000}, {0xc1020000}, {0xc1022000}, {0xc1024000}, {0xc1026000}, {0xc1028000}, {0xc102a000}, {0xc102c000}, {0xc102e000}, {0xc1030000}, {0xc1032000}, {0xc1034000}, {0xc1036000}, {0xc1038000}, {0xc103a000}, {0xc103c000}, {0xc103e000}, {0xc1040000}, {0xc1042000}, {0xc1044000}, {0xc1046000}, {0xc1048000}, {0xc104a000}, {0xc104c000}, {0xc104e000}, {0xc1050000}, {0xc1052000}, {0xc1054000}, {0xc1056000}, {0xc1058000}, {0xc105a000}, {0xc105c000}, {0xc105e000}, {0xc1060000}, {0xc1062000}, {0xc1064000}, {0xc1066000}, {0xc1068000}, {0xc106a000}, {0xc106c000}, {0xc106e000}, {0xc1070000}, {0xc1072000}, {0xc1074000}, {0xc1076000}, {0xc1078000}, {0xc107a000}, {0xc107c000}, {0xc107e000}, {0xc1080000}, {0xc1082000}, {0xc1084000}, {0xc1086000}, {0xc1088000}, {0xc108a000}, {0xc108c000}, {0xc108e000}, {0xc1090000}, {0xc1092000}, {0xc1094000}, {0xc1096000}, {0xc1098000}, {0xc109a000}, {0xc109c000}, {0xc109e000}, {0xc10a0000}, {0xc10a2000}, {0xc10a4000}, {0xc10a6000}, {0xc10a8000}, {0xc10aa000}, {0xc10ac000}, {0xc10ae000}, {0xc10b0000}, {0xc10b2000}, {0xc10b4000}, {0xc10b6000}, {0xc10b8000}, {0xc10ba000}, {0xc10bc000}, {0xc10be000}, {0xc10c0000}, {0xc10c2000}, {0xc10c4000}, {0xc10c6000}, {0xc10c8000}, {0xc10ca000}, {0xc10cc000}, {0xc10ce000}, {0xc10d0000}, {0xc10d2000}, {0xc10d4000}, {0xc10d6000}, {0xc10d8000}, {0xc10da000}, {0xc10dc000}, {0xc10de000}, {0xc10e0000}, {0xc10e2000}, {0xc10e4000}, {0xc10e6000}, {0xc10e8000}, {0xc10ea000}, {0xc10ec000}, {0xc10ee000}, {0xc10f0000}, {0xc10f2000}, {0xc10f4000}, {0xc10f6000}, {0xc10f8000}, {0xc10fa000}, {0xc10fc000}, {0xc10fe000}, {0xc1100000}, {0xc1102000}, {0xc1104000}, {0xc1106000}, {0xc1108000}, {0xc110a000}, {0xc110c000}, {0xc110e000}, {0xc1110000}, {0xc1112000}, {0xc1114000}, {0xc1116000}, {0xc1118000}, {0xc111a000}, {0xc111c000}, {0xc111e000}, {0xc1120000}, {0xc1122000}, {0xc1124000}, {0xc1126000}, {0xc1128000}, {0xc112a000}, {0xc112c000}, {0xc112e000}, {0xc1130000}, {0xc1132000}, {0xc1134000}, {0xc1136000}, {0xc1138000}, {0xc113a000}, {0xc113c000}, {0xc113e000}, {0xc1140000}, {0xc1142000}, {0xc1144000}, {0xc1146000}, {0xc1148000}, {0xc114a000}, {0xc114c000}, {0xc114e000}, {0xc1150000}, {0xc1152000}, {0xc1154000}, {0xc1156000}, {0xc1158000}, {0xc115a000}, {0xc115c000}, {0xc115e000}, {0xc1160000}, {0xc1162000}, {0xc1164000}, {0xc1166000}, {0xc1168000}, {0xc116a000}, {0xc116c000}, {0xc116e000}, {0xc1170000}, {0xc1172000}, {0xc1174000}, {0xc1176000}, {0xc1178000}, {0xc117a000}, {0xc117c000}, {0xc117e000}, {0xc1180000}, {0xc1182000}, {0xc1184000}, {0xc1186000}, {0xc1188000}, {0xc118a000}, {0xc118c000}, {0xc118e000}, {0xc1190000}, {0xc1192000}, {0xc1194000}, {0xc1196000}, {0xc1198000}, {0xc119a000}, {0xc119c000}, {0xc119e000}, {0xc11a0000}, {0xc11a2000}, {0xc11a4000}, {0xc11a6000}, {0xc11a8000}, {0xc11aa000}, {0xc11ac000}, {0xc11ae000}, {0xc11b0000}, {0xc11b2000}, {0xc11b4000}, {0xc11b6000}, {0xc11b8000}, {0xc11ba000}, {0xc11bc000}, {0xc11be000}, {0xc11c0000}, {0xc11c2000}, {0xc11c4000}, {0xc11c6000}, {0xc11c8000}, {0xc11ca000}, {0xc11cc000}, {0xc11ce000}, {0xc11d0000}, {0xc11d2000}, {0xc11d4000}, {0xc11d6000}, {0xc11d8000}, {0xc11da000}, {0xc11dc000}, {0xc11de000}, {0xc11e0000}, {0xc11e2000}, {0xc11e4000}, {0xc11e6000}, {0xc11e8000}, {0xc11ea000}, {0xc11ec000}, {0xc11ee000}, {0xc11f0000}, {0xc11f2000}, {0xc11f4000}, {0xc11f6000}, {0xc11f8000}, {0xc11fa000}, {0xc11fc000}, {0xc11fe000}, {0xc1200000}, {0xc1202000}, {0xc1204000}, {0xc1206000}, {0xc1208000}, {0xc120a000}, {0xc120c000}, {0xc120e000}, {0xc1210000}, {0xc1212000}, {0xc1214000}, {0xc1216000}, {0xc1218000}, {0xc121a000}, {0xc121c000}, {0xc121e000}, {0xc1220000}, {0xc1222000}, {0xc1224000}, {0xc1226000}, {0xc1228000}, {0xc122a000}, {0xc122c000}, {0xc122e000}, {0xc1230000}, {0xc1232000}, {0xc1234000}, {0xc1236000}, {0xc1238000}, {0xc123a000}, {0xc123c000}, {0xc123e000}, {0xc1240000}, {0xc1242000}, {0xc1244000}, {0xc1246000}, {0xc1248000}, {0xc124a000}, {0xc124c000}, {0xc124e000}, {0xc1250000}, {0xc1252000}, {0xc1254000}, {0xc1256000}, {0xc1258000}, {0xc125a000}, {0xc125c000}, {0xc125e000}, {0xc1260000}, {0xc1262000}, {0xc1264000}, {0xc1266000}, {0xc1268000}, {0xc126a000}, {0xc126c000}, {0xc126e000}, {0xc1270000}, {0xc1272000}, {0xc1274000}, {0xc1276000}, {0xc1278000}, {0xc127a000}, {0xc127c000}, {0xc127e000}, {0xc1280000}, {0xc1282000}, {0xc1284000}, {0xc1286000}, {0xc1288000}, {0xc128a000}, {0xc128c000}, {0xc128e000}, {0xc1290000}, {0xc1292000}, {0xc1294000}, {0xc1296000}, {0xc1298000}, {0xc129a000}, {0xc129c000}, {0xc129e000}, {0xc12a0000}, {0xc12a2000}, {0xc12a4000}, {0xc12a6000}, {0xc12a8000}, {0xc12aa000}, {0xc12ac000}, {0xc12ae000}, {0xc12b0000}, {0xc12b2000}, {0xc12b4000}, {0xc12b6000}, {0xc12b8000}, {0xc12ba000}, {0xc12bc000}, {0xc12be000}, {0xc12c0000}, {0xc12c2000}, {0xc12c4000}, {0xc12c6000}, {0xc12c8000}, {0xc12ca000}, {0xc12cc000}, {0xc12ce000}, {0xc12d0000}, {0xc12d2000}, {0xc12d4000}, {0xc12d6000}, {0xc12d8000}, {0xc12da000}, {0xc12dc000}, {0xc12de000}, {0xc12e0000}, {0xc12e2000}, {0xc12e4000}, {0xc12e6000}, {0xc12e8000}, {0xc12ea000}, {0xc12ec000}, {0xc12ee000}, {0xc12f0000}, {0xc12f2000}, {0xc12f4000}, {0xc12f6000}, {0xc12f8000}, {0xc12fa000}, {0xc12fc000}, {0xc12fe000}, {0xc1300000}, {0xc1302000}, {0xc1304000}, {0xc1306000}, {0xc1308000}, {0xc130a000}, {0xc130c000}, {0xc130e000}, {0xc1310000}, {0xc1312000}, {0xc1314000}, {0xc1316000}, {0xc1318000}, {0xc131a000}, {0xc131c000}, {0xc131e000}, {0xc1320000}, {0xc1322000}, {0xc1324000}, {0xc1326000}, {0xc1328000}, {0xc132a000}, {0xc132c000}, {0xc132e000}, {0xc1330000}, {0xc1332000}, {0xc1334000}, {0xc1336000}, {0xc1338000}, {0xc133a000}, {0xc133c000}, {0xc133e000}, {0xc1340000}, {0xc1342000}, {0xc1344000}, {0xc1346000}, {0xc1348000}, {0xc134a000}, {0xc134c000}, {0xc134e000}, {0xc1350000}, {0xc1352000}, {0xc1354000}, {0xc1356000}, {0xc1358000}, {0xc135a000}, {0xc135c000}, {0xc135e000}, {0xc1360000}, {0xc1362000}, {0xc1364000}, {0xc1366000}, {0xc1368000}, {0xc136a000}, {0xc136c000}, {0xc136e000}, {0xc1370000}, {0xc1372000}, {0xc1374000}, {0xc1376000}, {0xc1378000}, {0xc137a000}, {0xc137c000}, {0xc137e000}, {0xc1380000}, {0xc1382000}, {0xc1384000}, {0xc1386000}, {0xc1388000}, {0xc138a000}, {0xc138c000}, {0xc138e000}, {0xc1390000}, {0xc1392000}, {0xc1394000}, {0xc1396000}, {0xc1398000}, {0xc139a000}, {0xc139c000}, {0xc139e000}, {0xc13a0000}, {0xc13a2000}, {0xc13a4000}, {0xc13a6000}, {0xc13a8000}, {0xc13aa000}, {0xc13ac000}, {0xc13ae000}, {0xc13b0000}, {0xc13b2000}, {0xc13b4000}, {0xc13b6000}, {0xc13b8000}, {0xc13ba000}, {0xc13bc000}, {0xc13be000}, {0xc13c0000}, {0xc13c2000}, {0xc13c4000}, {0xc13c6000}, {0xc13c8000}, {0xc13ca000}, {0xc13cc000}, {0xc13ce000}, {0xc13d0000}, {0xc13d2000}, {0xc13d4000}, {0xc13d6000}, {0xc13d8000}, {0xc13da000}, {0xc13dc000}, {0xc13de000}, {0xc13e0000}, {0xc13e2000}, {0xc13e4000}, {0xc13e6000}, {0xc13e8000}, {0xc13ea000}, {0xc13ec000}, {0xc13ee000}, {0xc13f0000}, {0xc13f2000}, {0xc13f4000}, {0xc13f6000}, {0xc13f8000}, {0xc13fa000}, {0xc13fc000}, {0xc13fe000}, {0xc1400000}, {0xc1402000}, {0xc1404000}, {0xc1406000}, {0xc1408000}, {0xc140a000}, {0xc140c000}, {0xc140e000}, {0xc1410000}, {0xc1412000}, {0xc1414000}, {0xc1416000}, {0xc1418000}, {0xc141a000}, {0xc141c000}, {0xc141e000}, {0xc1420000}, {0xc1422000}, {0xc1424000}, {0xc1426000}, {0xc1428000}, {0xc142a000}, {0xc142c000}, {0xc142e000}, {0xc1430000}, {0xc1432000}, {0xc1434000}, {0xc1436000}, {0xc1438000}, {0xc143a000}, {0xc143c000}, {0xc143e000}, {0xc1440000}, {0xc1442000}, {0xc1444000}, {0xc1446000}, {0xc1448000}, {0xc144a000}, {0xc144c000}, {0xc144e000}, {0xc1450000}, {0xc1452000}, {0xc1454000}, {0xc1456000}, {0xc1458000}, {0xc145a000}, {0xc145c000}, {0xc145e000}, {0xc1460000}, {0xc1462000}, {0xc1464000}, {0xc1466000}, {0xc1468000}, {0xc146a000}, {0xc146c000}, {0xc146e000}, {0xc1470000}, {0xc1472000}, {0xc1474000}, {0xc1476000}, {0xc1478000}, {0xc147a000}, {0xc147c000}, {0xc147e000}, {0xc1480000}, {0xc1482000}, {0xc1484000}, {0xc1486000}, {0xc1488000}, {0xc148a000}, {0xc148c000}, {0xc148e000}, {0xc1490000}, {0xc1492000}, {0xc1494000}, {0xc1496000}, {0xc1498000}, {0xc149a000}, {0xc149c000}, {0xc149e000}, {0xc14a0000}, {0xc14a2000}, {0xc14a4000}, {0xc14a6000}, {0xc14a8000}, {0xc14aa000}, {0xc14ac000}, {0xc14ae000}, {0xc14b0000}, {0xc14b2000}, {0xc14b4000}, {0xc14b6000}, {0xc14b8000}, {0xc14ba000}, {0xc14bc000}, {0xc14be000}, {0xc14c0000}, {0xc14c2000}, {0xc14c4000}, {0xc14c6000}, {0xc14c8000}, {0xc14ca000}, {0xc14cc000}, {0xc14ce000}, {0xc14d0000}, {0xc14d2000}, {0xc14d4000}, {0xc14d6000}, {0xc14d8000}, {0xc14da000}, {0xc14dc000}, {0xc14de000}, {0xc14e0000}, {0xc14e2000}, {0xc14e4000}, {0xc14e6000}, {0xc14e8000}, {0xc14ea000}, {0xc14ec000}, {0xc14ee000}, {0xc14f0000}, {0xc14f2000}, {0xc14f4000}, {0xc14f6000}, {0xc14f8000}, {0xc14fa000}, {0xc14fc000}, {0xc14fe000}, {0xc1500000}, {0xc1502000}, {0xc1504000}, {0xc1506000}, {0xc1508000}, {0xc150a000}, {0xc150c000}, {0xc150e000}, {0xc1510000}, {0xc1512000}, {0xc1514000}, {0xc1516000}, {0xc1518000}, {0xc151a000}, {0xc151c000}, {0xc151e000}, {0xc1520000}, {0xc1522000}, {0xc1524000}, {0xc1526000}, {0xc1528000}, {0xc152a000}, {0xc152c000}, {0xc152e000}, {0xc1530000}, {0xc1532000}, {0xc1534000}, {0xc1536000}, {0xc1538000}, {0xc153a000}, {0xc153c000}, {0xc153e000}, {0xc1540000}, {0xc1542000}, {0xc1544000}, {0xc1546000}, {0xc1548000}, {0xc154a000}, {0xc154c000}, {0xc154e000}, {0xc1550000}, {0xc1552000}, {0xc1554000}, {0xc1556000}, {0xc1558000}, {0xc155a000}, {0xc155c000}, {0xc155e000}, {0xc1560000}, {0xc1562000}, {0xc1564000}, {0xc1566000}, {0xc1568000}, {0xc156a000}, {0xc156c000}, {0xc156e000}, {0xc1570000}, {0xc1572000}, {0xc1574000}, {0xc1576000}, {0xc1578000}, {0xc157a000}, {0xc157c000}, {0xc157e000}, {0xc1580000}, {0xc1582000}, {0xc1584000}, {0xc1586000}, {0xc1588000}, {0xc158a000}, {0xc158c000}, {0xc158e000}, {0xc1590000}, {0xc1592000}, {0xc1594000}, {0xc1596000}, {0xc1598000}, {0xc159a000}, {0xc159c000}, {0xc159e000}, {0xc15a0000}, {0xc15a2000}, {0xc15a4000}, {0xc15a6000}, {0xc15a8000}, {0xc15aa000}, {0xc15ac000}, {0xc15ae000}, {0xc15b0000}, {0xc15b2000}, {0xc15b4000}, {0xc15b6000}, {0xc15b8000}, {0xc15ba000}, {0xc15bc000}, {0xc15be000}, {0xc15c0000}, {0xc15c2000}, {0xc15c4000}, {0xc15c6000}, {0xc15c8000}, {0xc15ca000}, {0xc15cc000}, {0xc15ce000}, {0xc15d0000}, {0xc15d2000}, {0xc15d4000}, {0xc15d6000}, {0xc15d8000}, {0xc15da000}, {0xc15dc000}, {0xc15de000}, {0xc15e0000}, {0xc15e2000}, {0xc15e4000}, {0xc15e6000}, {0xc15e8000}, {0xc15ea000}, {0xc15ec000}, {0xc15ee000}, {0xc15f0000}, {0xc15f2000}, {0xc15f4000}, {0xc15f6000}, {0xc15f8000}, {0xc15fa000}, {0xc15fc000}, {0xc15fe000}, {0xc1600000}, {0xc1602000}, {0xc1604000}, {0xc1606000}, {0xc1608000}, {0xc160a000}, {0xc160c000}, {0xc160e000}, {0xc1610000}, {0xc1612000}, {0xc1614000}, {0xc1616000}, {0xc1618000}, {0xc161a000}, {0xc161c000}, {0xc161e000}, {0xc1620000}, {0xc1622000}, {0xc1624000}, {0xc1626000}, {0xc1628000}, {0xc162a000}, {0xc162c000}, {0xc162e000}, {0xc1630000}, {0xc1632000}, {0xc1634000}, {0xc1636000}, {0xc1638000}, {0xc163a000}, {0xc163c000}, {0xc163e000}, {0xc1640000}, {0xc1642000}, {0xc1644000}, {0xc1646000}, {0xc1648000}, {0xc164a000}, {0xc164c000}, {0xc164e000}, {0xc1650000}, {0xc1652000}, {0xc1654000}, {0xc1656000}, {0xc1658000}, {0xc165a000}, {0xc165c000}, {0xc165e000}, {0xc1660000}, {0xc1662000}, {0xc1664000}, {0xc1666000}, {0xc1668000}, {0xc166a000}, {0xc166c000}, {0xc166e000}, {0xc1670000}, {0xc1672000}, {0xc1674000}, {0xc1676000}, {0xc1678000}, {0xc167a000}, {0xc167c000}, {0xc167e000}, {0xc1680000}, {0xc1682000}, {0xc1684000}, {0xc1686000}, {0xc1688000}, {0xc168a000}, {0xc168c000}, {0xc168e000}, {0xc1690000}, {0xc1692000}, {0xc1694000}, {0xc1696000}, {0xc1698000}, {0xc169a000}, {0xc169c000}, {0xc169e000}, {0xc16a0000}, {0xc16a2000}, {0xc16a4000}, {0xc16a6000}, {0xc16a8000}, {0xc16aa000}, {0xc16ac000}, {0xc16ae000}, {0xc16b0000}, {0xc16b2000}, {0xc16b4000}, {0xc16b6000}, {0xc16b8000}, {0xc16ba000}, {0xc16bc000}, {0xc16be000}, {0xc16c0000}, {0xc16c2000}, {0xc16c4000}, {0xc16c6000}, {0xc16c8000}, {0xc16ca000}, {0xc16cc000}, {0xc16ce000}, {0xc16d0000}, {0xc16d2000}, {0xc16d4000}, {0xc16d6000}, {0xc16d8000}, {0xc16da000}, {0xc16dc000}, {0xc16de000}, {0xc16e0000}, {0xc16e2000}, {0xc16e4000}, {0xc16e6000}, {0xc16e8000}, {0xc16ea000}, {0xc16ec000}, {0xc16ee000}, {0xc16f0000}, {0xc16f2000}, {0xc16f4000}, {0xc16f6000}, {0xc16f8000}, {0xc16fa000}, {0xc16fc000}, {0xc16fe000}, {0xc1700000}, {0xc1702000}, {0xc1704000}, {0xc1706000}, {0xc1708000}, {0xc170a000}, {0xc170c000}, {0xc170e000}, {0xc1710000}, {0xc1712000}, {0xc1714000}, {0xc1716000}, {0xc1718000}, {0xc171a000}, {0xc171c000}, {0xc171e000}, {0xc1720000}, {0xc1722000}, {0xc1724000}, {0xc1726000}, {0xc1728000}, {0xc172a000}, {0xc172c000}, {0xc172e000}, {0xc1730000}, {0xc1732000}, {0xc1734000}, {0xc1736000}, {0xc1738000}, {0xc173a000}, {0xc173c000}, {0xc173e000}, {0xc1740000}, {0xc1742000}, {0xc1744000}, {0xc1746000}, {0xc1748000}, {0xc174a000}, {0xc174c000}, {0xc174e000}, {0xc1750000}, {0xc1752000}, {0xc1754000}, {0xc1756000}, {0xc1758000}, {0xc175a000}, {0xc175c000}, {0xc175e000}, {0xc1760000}, {0xc1762000}, {0xc1764000}, {0xc1766000}, {0xc1768000}, {0xc176a000}, {0xc176c000}, {0xc176e000}, {0xc1770000}, {0xc1772000}, {0xc1774000}, {0xc1776000}, {0xc1778000}, {0xc177a000}, {0xc177c000}, {0xc177e000}, {0xc1780000}, {0xc1782000}, {0xc1784000}, {0xc1786000}, {0xc1788000}, {0xc178a000}, {0xc178c000}, {0xc178e000}, {0xc1790000}, {0xc1792000}, {0xc1794000}, {0xc1796000}, {0xc1798000}, {0xc179a000}, {0xc179c000}, {0xc179e000}, {0xc17a0000}, {0xc17a2000}, {0xc17a4000}, {0xc17a6000}, {0xc17a8000}, {0xc17aa000}, {0xc17ac000}, {0xc17ae000}, {0xc17b0000}, {0xc17b2000}, {0xc17b4000}, {0xc17b6000}, {0xc17b8000}, {0xc17ba000}, {0xc17bc000}, {0xc17be000}, {0xc17c0000}, {0xc17c2000}, {0xc17c4000}, {0xc17c6000}, {0xc17c8000}, {0xc17ca000}, {0xc17cc000}, {0xc17ce000}, {0xc17d0000}, {0xc17d2000}, {0xc17d4000}, {0xc17d6000}, {0xc17d8000}, {0xc17da000}, {0xc17dc000}, {0xc17de000}, {0xc17e0000}, {0xc17e2000}, {0xc17e4000}, {0xc17e6000}, {0xc17e8000}, {0xc17ea000}, {0xc17ec000}, {0xc17ee000}, {0xc17f0000}, {0xc17f2000}, {0xc17f4000}, {0xc17f6000}, {0xc17f8000}, {0xc17fa000}, {0xc17fc000}, {0xc17fe000}, {0xc1800000}, {0xc1802000}, {0xc1804000}, {0xc1806000}, {0xc1808000}, {0xc180a000}, {0xc180c000}, {0xc180e000}, {0xc1810000}, {0xc1812000}, {0xc1814000}, {0xc1816000}, {0xc1818000}, {0xc181a000}, {0xc181c000}, {0xc181e000}, {0xc1820000}, {0xc1822000}, {0xc1824000}, {0xc1826000}, {0xc1828000}, {0xc182a000}, {0xc182c000}, {0xc182e000}, {0xc1830000}, {0xc1832000}, {0xc1834000}, {0xc1836000}, {0xc1838000}, {0xc183a000}, {0xc183c000}, {0xc183e000}, {0xc1840000}, {0xc1842000}, {0xc1844000}, {0xc1846000}, {0xc1848000}, {0xc184a000}, {0xc184c000}, {0xc184e000}, {0xc1850000}, {0xc1852000}, {0xc1854000}, {0xc1856000}, {0xc1858000}, {0xc185a000}, {0xc185c000}, {0xc185e000}, {0xc1860000}, {0xc1862000}, {0xc1864000}, {0xc1866000}, {0xc1868000}, {0xc186a000}, {0xc186c000}, {0xc186e000}, {0xc1870000}, {0xc1872000}, {0xc1874000}, {0xc1876000}, {0xc1878000}, {0xc187a000}, {0xc187c000}, {0xc187e000}, {0xc1880000}, {0xc1882000}, {0xc1884000}, {0xc1886000}, {0xc1888000}, {0xc188a000}, {0xc188c000}, {0xc188e000}, {0xc1890000}, {0xc1892000}, {0xc1894000}, {0xc1896000}, {0xc1898000}, {0xc189a000}, {0xc189c000}, {0xc189e000}, {0xc18a0000}, {0xc18a2000}, {0xc18a4000}, {0xc18a6000}, {0xc18a8000}, {0xc18aa000}, {0xc18ac000}, {0xc18ae000}, {0xc18b0000}, {0xc18b2000}, {0xc18b4000}, {0xc18b6000}, {0xc18b8000}, {0xc18ba000}, {0xc18bc000}, {0xc18be000}, {0xc18c0000}, {0xc18c2000}, {0xc18c4000}, {0xc18c6000}, {0xc18c8000}, {0xc18ca000}, {0xc18cc000}, {0xc18ce000}, {0xc18d0000}, {0xc18d2000}, {0xc18d4000}, {0xc18d6000}, {0xc18d8000}, {0xc18da000}, {0xc18dc000}, {0xc18de000}, {0xc18e0000}, {0xc18e2000}, {0xc18e4000}, {0xc18e6000}, {0xc18e8000}, {0xc18ea000}, {0xc18ec000}, {0xc18ee000}, {0xc18f0000}, {0xc18f2000}, {0xc18f4000}, {0xc18f6000}, {0xc18f8000}, {0xc18fa000}, {0xc18fc000}, {0xc18fe000}, {0xc1900000}, {0xc1902000}, {0xc1904000}, {0xc1906000}, {0xc1908000}, {0xc190a000}, {0xc190c000}, {0xc190e000}, {0xc1910000}, {0xc1912000}, {0xc1914000}, {0xc1916000}, {0xc1918000}, {0xc191a000}, {0xc191c000}, {0xc191e000}, {0xc1920000}, {0xc1922000}, {0xc1924000}, {0xc1926000}, {0xc1928000}, {0xc192a000}, {0xc192c000}, {0xc192e000}, {0xc1930000}, {0xc1932000}, {0xc1934000}, {0xc1936000}, {0xc1938000}, {0xc193a000}, {0xc193c000}, {0xc193e000}, {0xc1940000}, {0xc1942000}, {0xc1944000}, {0xc1946000}, {0xc1948000}, {0xc194a000}, {0xc194c000}, {0xc194e000}, {0xc1950000}, {0xc1952000}, {0xc1954000}, {0xc1956000}, {0xc1958000}, {0xc195a000}, {0xc195c000}, {0xc195e000}, {0xc1960000}, {0xc1962000}, {0xc1964000}, {0xc1966000}, {0xc1968000}, {0xc196a000}, {0xc196c000}, {0xc196e000}, {0xc1970000}, {0xc1972000}, {0xc1974000}, {0xc1976000}, {0xc1978000}, {0xc197a000}, {0xc197c000}, {0xc197e000}, {0xc1980000}, {0xc1982000}, {0xc1984000}, {0xc1986000}, {0xc1988000}, {0xc198a000}, {0xc198c000}, {0xc198e000}, {0xc1990000}, {0xc1992000}, {0xc1994000}, {0xc1996000}, {0xc1998000}, {0xc199a000}, {0xc199c000}, {0xc199e000}, {0xc19a0000}, {0xc19a2000}, {0xc19a4000}, {0xc19a6000}, {0xc19a8000}, {0xc19aa000}, {0xc19ac000}, {0xc19ae000}, {0xc19b0000}, {0xc19b2000}, {0xc19b4000}, {0xc19b6000}, {0xc19b8000}, {0xc19ba000}, {0xc19bc000}, {0xc19be000}, {0xc19c0000}, {0xc19c2000}, {0xc19c4000}, {0xc19c6000}, {0xc19c8000}, {0xc19ca000}, {0xc19cc000}, {0xc19ce000}, {0xc19d0000}, {0xc19d2000}, {0xc19d4000}, {0xc19d6000}, {0xc19d8000}, {0xc19da000}, {0xc19dc000}, {0xc19de000}, {0xc19e0000}, {0xc19e2000}, {0xc19e4000}, {0xc19e6000}, {0xc19e8000}, {0xc19ea000}, {0xc19ec000}, {0xc19ee000}, {0xc19f0000}, {0xc19f2000}, {0xc19f4000}, {0xc19f6000}, {0xc19f8000}, {0xc19fa000}, {0xc19fc000}, {0xc19fe000}, {0xc1a00000}, {0xc1a02000}, {0xc1a04000}, {0xc1a06000}, {0xc1a08000}, {0xc1a0a000}, {0xc1a0c000}, {0xc1a0e000}, {0xc1a10000}, {0xc1a12000}, {0xc1a14000}, {0xc1a16000}, {0xc1a18000}, {0xc1a1a000}, {0xc1a1c000}, {0xc1a1e000}, {0xc1a20000}, {0xc1a22000}, {0xc1a24000}, {0xc1a26000}, {0xc1a28000}, {0xc1a2a000}, {0xc1a2c000}, {0xc1a2e000}, {0xc1a30000}, {0xc1a32000}, {0xc1a34000}, {0xc1a36000}, {0xc1a38000}, {0xc1a3a000}, {0xc1a3c000}, {0xc1a3e000}, {0xc1a40000}, {0xc1a42000}, {0xc1a44000}, {0xc1a46000}, {0xc1a48000}, {0xc1a4a000}, {0xc1a4c000}, {0xc1a4e000}, {0xc1a50000}, {0xc1a52000}, {0xc1a54000}, {0xc1a56000}, {0xc1a58000}, {0xc1a5a000}, {0xc1a5c000}, {0xc1a5e000}, {0xc1a60000}, {0xc1a62000}, {0xc1a64000}, {0xc1a66000}, {0xc1a68000}, {0xc1a6a000}, {0xc1a6c000}, {0xc1a6e000}, {0xc1a70000}, {0xc1a72000}, {0xc1a74000}, {0xc1a76000}, {0xc1a78000}, {0xc1a7a000}, {0xc1a7c000}, {0xc1a7e000}, {0xc1a80000}, {0xc1a82000}, {0xc1a84000}, {0xc1a86000}, {0xc1a88000}, {0xc1a8a000}, {0xc1a8c000}, {0xc1a8e000}, {0xc1a90000}, {0xc1a92000}, {0xc1a94000}, {0xc1a96000}, {0xc1a98000}, {0xc1a9a000}, {0xc1a9c000}, {0xc1a9e000}, {0xc1aa0000}, {0xc1aa2000}, {0xc1aa4000}, {0xc1aa6000}, {0xc1aa8000}, {0xc1aaa000}, {0xc1aac000}, {0xc1aae000}, {0xc1ab0000}, {0xc1ab2000}, {0xc1ab4000}, {0xc1ab6000}, {0xc1ab8000}, {0xc1aba000}, {0xc1abc000}, {0xc1abe000}, {0xc1ac0000}, {0xc1ac2000}, {0xc1ac4000}, {0xc1ac6000}, {0xc1ac8000}, {0xc1aca000}, {0xc1acc000}, {0xc1ace000}, {0xc1ad0000}, {0xc1ad2000}, {0xc1ad4000}, {0xc1ad6000}, {0xc1ad8000}, {0xc1ada000}, {0xc1adc000}, {0xc1ade000}, {0xc1ae0000}, {0xc1ae2000}, {0xc1ae4000}, {0xc1ae6000}, {0xc1ae8000}, {0xc1aea000}, {0xc1aec000}, {0xc1aee000}, {0xc1af0000}, {0xc1af2000}, {0xc1af4000}, {0xc1af6000}, {0xc1af8000}, {0xc1afa000}, {0xc1afc000}, {0xc1afe000}, {0xc1b00000}, {0xc1b02000}, {0xc1b04000}, {0xc1b06000}, {0xc1b08000}, {0xc1b0a000}, {0xc1b0c000}, {0xc1b0e000}, {0xc1b10000}, {0xc1b12000}, {0xc1b14000}, {0xc1b16000}, {0xc1b18000}, {0xc1b1a000}, {0xc1b1c000}, {0xc1b1e000}, {0xc1b20000}, {0xc1b22000}, {0xc1b24000}, {0xc1b26000}, {0xc1b28000}, {0xc1b2a000}, {0xc1b2c000}, {0xc1b2e000}, {0xc1b30000}, {0xc1b32000}, {0xc1b34000}, {0xc1b36000}, {0xc1b38000}, {0xc1b3a000}, {0xc1b3c000}, {0xc1b3e000}, {0xc1b40000}, {0xc1b42000}, {0xc1b44000}, {0xc1b46000}, {0xc1b48000}, {0xc1b4a000}, {0xc1b4c000}, {0xc1b4e000}, {0xc1b50000}, {0xc1b52000}, {0xc1b54000}, {0xc1b56000}, {0xc1b58000}, {0xc1b5a000}, {0xc1b5c000}, {0xc1b5e000}, {0xc1b60000}, {0xc1b62000}, {0xc1b64000}, {0xc1b66000}, {0xc1b68000}, {0xc1b6a000}, {0xc1b6c000}, {0xc1b6e000}, {0xc1b70000}, {0xc1b72000}, {0xc1b74000}, {0xc1b76000}, {0xc1b78000}, {0xc1b7a000}, {0xc1b7c000}, {0xc1b7e000}, {0xc1b80000}, {0xc1b82000}, {0xc1b84000}, {0xc1b86000}, {0xc1b88000}, {0xc1b8a000}, {0xc1b8c000}, {0xc1b8e000}, {0xc1b90000}, {0xc1b92000}, {0xc1b94000}, {0xc1b96000}, {0xc1b98000}, {0xc1b9a000}, {0xc1b9c000}, {0xc1b9e000}, {0xc1ba0000}, {0xc1ba2000}, {0xc1ba4000}, {0xc1ba6000}, {0xc1ba8000}, {0xc1baa000}, {0xc1bac000}, {0xc1bae000}, {0xc1bb0000}, {0xc1bb2000}, {0xc1bb4000}, {0xc1bb6000}, {0xc1bb8000}, {0xc1bba000}, {0xc1bbc000}, {0xc1bbe000}, {0xc1bc0000}, {0xc1bc2000}, {0xc1bc4000}, {0xc1bc6000}, {0xc1bc8000}, {0xc1bca000}, {0xc1bcc000}, {0xc1bce000}, {0xc1bd0000}, {0xc1bd2000}, {0xc1bd4000}, {0xc1bd6000}, {0xc1bd8000}, {0xc1bda000}, {0xc1bdc000}, {0xc1bde000}, {0xc1be0000}, {0xc1be2000}, {0xc1be4000}, {0xc1be6000}, {0xc1be8000}, {0xc1bea000}, {0xc1bec000}, {0xc1bee000}, {0xc1bf0000}, {0xc1bf2000}, {0xc1bf4000}, {0xc1bf6000}, {0xc1bf8000}, {0xc1bfa000}, {0xc1bfc000}, {0xc1bfe000}, {0xc1c00000}, {0xc1c02000}, {0xc1c04000}, {0xc1c06000}, {0xc1c08000}, {0xc1c0a000}, {0xc1c0c000}, {0xc1c0e000}, {0xc1c10000}, {0xc1c12000}, {0xc1c14000}, {0xc1c16000}, {0xc1c18000}, {0xc1c1a000}, {0xc1c1c000}, {0xc1c1e000}, {0xc1c20000}, {0xc1c22000}, {0xc1c24000}, {0xc1c26000}, {0xc1c28000}, {0xc1c2a000}, {0xc1c2c000}, {0xc1c2e000}, {0xc1c30000}, {0xc1c32000}, {0xc1c34000}, {0xc1c36000}, {0xc1c38000}, {0xc1c3a000}, {0xc1c3c000}, {0xc1c3e000}, {0xc1c40000}, {0xc1c42000}, {0xc1c44000}, {0xc1c46000}, {0xc1c48000}, {0xc1c4a000}, {0xc1c4c000}, {0xc1c4e000}, {0xc1c50000}, {0xc1c52000}, {0xc1c54000}, {0xc1c56000}, {0xc1c58000}, {0xc1c5a000}, {0xc1c5c000}, {0xc1c5e000}, {0xc1c60000}, {0xc1c62000}, {0xc1c64000}, {0xc1c66000}, {0xc1c68000}, {0xc1c6a000}, {0xc1c6c000}, {0xc1c6e000}, {0xc1c70000}, {0xc1c72000}, {0xc1c74000}, {0xc1c76000}, {0xc1c78000}, {0xc1c7a000}, {0xc1c7c000}, {0xc1c7e000}, {0xc1c80000}, {0xc1c82000}, {0xc1c84000}, {0xc1c86000}, {0xc1c88000}, {0xc1c8a000}, {0xc1c8c000}, {0xc1c8e000}, {0xc1c90000}, {0xc1c92000}, {0xc1c94000}, {0xc1c96000}, {0xc1c98000}, {0xc1c9a000}, {0xc1c9c000}, {0xc1c9e000}, {0xc1ca0000}, {0xc1ca2000}, {0xc1ca4000}, {0xc1ca6000}, {0xc1ca8000}, {0xc1caa000}, {0xc1cac000}, {0xc1cae000}, {0xc1cb0000}, {0xc1cb2000}, {0xc1cb4000}, {0xc1cb6000}, {0xc1cb8000}, {0xc1cba000}, {0xc1cbc000}, {0xc1cbe000}, {0xc1cc0000}, {0xc1cc2000}, {0xc1cc4000}, {0xc1cc6000}, {0xc1cc8000}, {0xc1cca000}, {0xc1ccc000}, {0xc1cce000}, {0xc1cd0000}, {0xc1cd2000}, {0xc1cd4000}, {0xc1cd6000}, {0xc1cd8000}, {0xc1cda000}, {0xc1cdc000}, {0xc1cde000}, {0xc1ce0000}, {0xc1ce2000}, {0xc1ce4000}, {0xc1ce6000}, {0xc1ce8000}, {0xc1cea000}, {0xc1cec000}, {0xc1cee000}, {0xc1cf0000}, {0xc1cf2000}, {0xc1cf4000}, {0xc1cf6000}, {0xc1cf8000}, {0xc1cfa000}, {0xc1cfc000}, {0xc1cfe000}, {0xc1d00000}, {0xc1d02000}, {0xc1d04000}, {0xc1d06000}, {0xc1d08000}, {0xc1d0a000}, {0xc1d0c000}, {0xc1d0e000}, {0xc1d10000}, {0xc1d12000}, {0xc1d14000}, {0xc1d16000}, {0xc1d18000}, {0xc1d1a000}, {0xc1d1c000}, {0xc1d1e000}, {0xc1d20000}, {0xc1d22000}, {0xc1d24000}, {0xc1d26000}, {0xc1d28000}, {0xc1d2a000}, {0xc1d2c000}, {0xc1d2e000}, {0xc1d30000}, {0xc1d32000}, {0xc1d34000}, {0xc1d36000}, {0xc1d38000}, {0xc1d3a000}, {0xc1d3c000}, {0xc1d3e000}, {0xc1d40000}, {0xc1d42000}, {0xc1d44000}, {0xc1d46000}, {0xc1d48000}, {0xc1d4a000}, {0xc1d4c000}, {0xc1d4e000}, {0xc1d50000}, {0xc1d52000}, {0xc1d54000}, {0xc1d56000}, {0xc1d58000}, {0xc1d5a000}, {0xc1d5c000}, {0xc1d5e000}, {0xc1d60000}, {0xc1d62000}, {0xc1d64000}, {0xc1d66000}, {0xc1d68000}, {0xc1d6a000}, {0xc1d6c000}, {0xc1d6e000}, {0xc1d70000}, {0xc1d72000}, {0xc1d74000}, {0xc1d76000}, {0xc1d78000}, {0xc1d7a000}, {0xc1d7c000}, {0xc1d7e000}, {0xc1d80000}, {0xc1d82000}, {0xc1d84000}, {0xc1d86000}, {0xc1d88000}, {0xc1d8a000}, {0xc1d8c000}, {0xc1d8e000}, {0xc1d90000}, {0xc1d92000}, {0xc1d94000}, {0xc1d96000}, {0xc1d98000}, {0xc1d9a000}, {0xc1d9c000}, {0xc1d9e000}, {0xc1da0000}, {0xc1da2000}, {0xc1da4000}, {0xc1da6000}, {0xc1da8000}, {0xc1daa000}, {0xc1dac000}, {0xc1dae000}, {0xc1db0000}, {0xc1db2000}, {0xc1db4000}, {0xc1db6000}, {0xc1db8000}, {0xc1dba000}, {0xc1dbc000}, {0xc1dbe000}, {0xc1dc0000}, {0xc1dc2000}, {0xc1dc4000}, {0xc1dc6000}, {0xc1dc8000}, {0xc1dca000}, {0xc1dcc000}, {0xc1dce000}, {0xc1dd0000}, {0xc1dd2000}, {0xc1dd4000}, {0xc1dd6000}, {0xc1dd8000}, {0xc1dda000}, {0xc1ddc000}, {0xc1dde000}, {0xc1de0000}, {0xc1de2000}, {0xc1de4000}, {0xc1de6000}, {0xc1de8000}, {0xc1dea000}, {0xc1dec000}, {0xc1dee000}, {0xc1df0000}, {0xc1df2000}, {0xc1df4000}, {0xc1df6000}, {0xc1df8000}, {0xc1dfa000}, {0xc1dfc000}, {0xc1dfe000}, {0xc1e00000}, {0xc1e02000}, {0xc1e04000}, {0xc1e06000}, {0xc1e08000}, {0xc1e0a000}, {0xc1e0c000}, {0xc1e0e000}, {0xc1e10000}, {0xc1e12000}, {0xc1e14000}, {0xc1e16000}, {0xc1e18000}, {0xc1e1a000}, {0xc1e1c000}, {0xc1e1e000}, {0xc1e20000}, {0xc1e22000}, {0xc1e24000}, {0xc1e26000}, {0xc1e28000}, {0xc1e2a000}, {0xc1e2c000}, {0xc1e2e000}, {0xc1e30000}, {0xc1e32000}, {0xc1e34000}, {0xc1e36000}, {0xc1e38000}, {0xc1e3a000}, {0xc1e3c000}, {0xc1e3e000}, {0xc1e40000}, {0xc1e42000}, {0xc1e44000}, {0xc1e46000}, {0xc1e48000}, {0xc1e4a000}, {0xc1e4c000}, {0xc1e4e000}, {0xc1e50000}, {0xc1e52000}, {0xc1e54000}, {0xc1e56000}, {0xc1e58000}, {0xc1e5a000}, {0xc1e5c000}, {0xc1e5e000}, {0xc1e60000}, {0xc1e62000}, {0xc1e64000}, {0xc1e66000}, {0xc1e68000}, {0xc1e6a000}, {0xc1e6c000}, {0xc1e6e000}, {0xc1e70000}, {0xc1e72000}, {0xc1e74000}, {0xc1e76000}, {0xc1e78000}, {0xc1e7a000}, {0xc1e7c000}, {0xc1e7e000}, {0xc1e80000}, {0xc1e82000}, {0xc1e84000}, {0xc1e86000}, {0xc1e88000}, {0xc1e8a000}, {0xc1e8c000}, {0xc1e8e000}, {0xc1e90000}, {0xc1e92000}, {0xc1e94000}, {0xc1e96000}, {0xc1e98000}, {0xc1e9a000}, {0xc1e9c000}, {0xc1e9e000}, {0xc1ea0000}, {0xc1ea2000}, {0xc1ea4000}, {0xc1ea6000}, {0xc1ea8000}, {0xc1eaa000}, {0xc1eac000}, {0xc1eae000}, {0xc1eb0000}, {0xc1eb2000}, {0xc1eb4000}, {0xc1eb6000}, {0xc1eb8000}, {0xc1eba000}, {0xc1ebc000}, {0xc1ebe000}, {0xc1ec0000}, {0xc1ec2000}, {0xc1ec4000}, {0xc1ec6000}, {0xc1ec8000}, {0xc1eca000}, {0xc1ecc000}, {0xc1ece000}, {0xc1ed0000}, {0xc1ed2000}, {0xc1ed4000}, {0xc1ed6000}, {0xc1ed8000}, {0xc1eda000}, {0xc1edc000}, {0xc1ede000}, {0xc1ee0000}, {0xc1ee2000}, {0xc1ee4000}, {0xc1ee6000}, {0xc1ee8000}, {0xc1eea000}, {0xc1eec000}, {0xc1eee000}, {0xc1ef0000}, {0xc1ef2000}, {0xc1ef4000}, {0xc1ef6000}, {0xc1ef8000}, {0xc1efa000}, {0xc1efc000}, {0xc1efe000}, {0xc1f00000}, {0xc1f02000}, {0xc1f04000}, {0xc1f06000}, {0xc1f08000}, {0xc1f0a000}, {0xc1f0c000}, {0xc1f0e000}, {0xc1f10000}, {0xc1f12000}, {0xc1f14000}, {0xc1f16000}, {0xc1f18000}, {0xc1f1a000}, {0xc1f1c000}, {0xc1f1e000}, {0xc1f20000}, {0xc1f22000}, {0xc1f24000}, {0xc1f26000}, {0xc1f28000}, {0xc1f2a000}, {0xc1f2c000}, {0xc1f2e000}, {0xc1f30000}, {0xc1f32000}, {0xc1f34000}, {0xc1f36000}, {0xc1f38000}, {0xc1f3a000}, {0xc1f3c000}, {0xc1f3e000}, {0xc1f40000}, {0xc1f42000}, {0xc1f44000}, {0xc1f46000}, {0xc1f48000}, {0xc1f4a000}, {0xc1f4c000}, {0xc1f4e000}, {0xc1f50000}, {0xc1f52000}, {0xc1f54000}, {0xc1f56000}, {0xc1f58000}, {0xc1f5a000}, {0xc1f5c000}, {0xc1f5e000}, {0xc1f60000}, {0xc1f62000}, {0xc1f64000}, {0xc1f66000}, {0xc1f68000}, {0xc1f6a000}, {0xc1f6c000}, {0xc1f6e000}, {0xc1f70000}, {0xc1f72000}, {0xc1f74000}, {0xc1f76000}, {0xc1f78000}, {0xc1f7a000}, {0xc1f7c000}, {0xc1f7e000}, {0xc1f80000}, {0xc1f82000}, {0xc1f84000}, {0xc1f86000}, {0xc1f88000}, {0xc1f8a000}, {0xc1f8c000}, {0xc1f8e000}, {0xc1f90000}, {0xc1f92000}, {0xc1f94000}, {0xc1f96000}, {0xc1f98000}, {0xc1f9a000}, {0xc1f9c000}, {0xc1f9e000}, {0xc1fa0000}, {0xc1fa2000}, {0xc1fa4000}, {0xc1fa6000}, {0xc1fa8000}, {0xc1faa000}, {0xc1fac000}, {0xc1fae000}, {0xc1fb0000}, {0xc1fb2000}, {0xc1fb4000}, {0xc1fb6000}, {0xc1fb8000}, {0xc1fba000}, {0xc1fbc000}, {0xc1fbe000}, {0xc1fc0000}, {0xc1fc2000}, {0xc1fc4000}, {0xc1fc6000}, {0xc1fc8000}, {0xc1fca000}, {0xc1fcc000}, {0xc1fce000}, {0xc1fd0000}, {0xc1fd2000}, {0xc1fd4000}, {0xc1fd6000}, {0xc1fd8000}, {0xc1fda000}, {0xc1fdc000}, {0xc1fde000}, {0xc1fe0000}, {0xc1fe2000}, {0xc1fe4000}, {0xc1fe6000}, {0xc1fe8000}, {0xc1fea000}, {0xc1fec000}, {0xc1fee000}, {0xc1ff0000}, {0xc1ff2000}, {0xc1ff4000}, {0xc1ff6000}, {0xc1ff8000}, {0xc1ffa000}, {0xc1ffc000}, {0xc1ffe000}, {0xc2000000}, {0xc2002000}, {0xc2004000}, {0xc2006000}, {0xc2008000}, {0xc200a000}, {0xc200c000}, {0xc200e000}, {0xc2010000}, {0xc2012000}, {0xc2014000}, {0xc2016000}, {0xc2018000}, {0xc201a000}, {0xc201c000}, {0xc201e000}, {0xc2020000}, {0xc2022000}, {0xc2024000}, {0xc2026000}, {0xc2028000}, {0xc202a000}, {0xc202c000}, {0xc202e000}, {0xc2030000}, {0xc2032000}, {0xc2034000}, {0xc2036000}, {0xc2038000}, {0xc203a000}, {0xc203c000}, {0xc203e000}, {0xc2040000}, {0xc2042000}, {0xc2044000}, {0xc2046000}, {0xc2048000}, {0xc204a000}, {0xc204c000}, {0xc204e000}, {0xc2050000}, {0xc2052000}, {0xc2054000}, {0xc2056000}, {0xc2058000}, {0xc205a000}, {0xc205c000}, {0xc205e000}, {0xc2060000}, {0xc2062000}, {0xc2064000}, {0xc2066000}, {0xc2068000}, {0xc206a000}, {0xc206c000}, {0xc206e000}, {0xc2070000}, {0xc2072000}, {0xc2074000}, {0xc2076000}, {0xc2078000}, {0xc207a000}, {0xc207c000}, {0xc207e000}, {0xc2080000}, {0xc2082000}, {0xc2084000}, {0xc2086000}, {0xc2088000}, {0xc208a000}, {0xc208c000}, {0xc208e000}, {0xc2090000}, {0xc2092000}, {0xc2094000}, {0xc2096000}, {0xc2098000}, {0xc209a000}, {0xc209c000}, {0xc209e000}, {0xc20a0000}, {0xc20a2000}, {0xc20a4000}, {0xc20a6000}, {0xc20a8000}, {0xc20aa000}, {0xc20ac000}, {0xc20ae000}, {0xc20b0000}, {0xc20b2000}, {0xc20b4000}, {0xc20b6000}, {0xc20b8000}, {0xc20ba000}, {0xc20bc000}, {0xc20be000}, {0xc20c0000}, {0xc20c2000}, {0xc20c4000}, {0xc20c6000}, {0xc20c8000}, {0xc20ca000}, {0xc20cc000}, {0xc20ce000}, {0xc20d0000}, {0xc20d2000}, {0xc20d4000}, {0xc20d6000}, {0xc20d8000}, {0xc20da000}, {0xc20dc000}, {0xc20de000}, {0xc20e0000}, {0xc20e2000}, {0xc20e4000}, {0xc20e6000}, {0xc20e8000}, {0xc20ea000}, {0xc20ec000}, {0xc20ee000}, {0xc20f0000}, {0xc20f2000}, {0xc20f4000}, {0xc20f6000}, {0xc20f8000}, {0xc20fa000}, {0xc20fc000}, {0xc20fe000}, {0xc2100000}, {0xc2102000}, {0xc2104000}, {0xc2106000}, {0xc2108000}, {0xc210a000}, {0xc210c000}, {0xc210e000}, {0xc2110000}, {0xc2112000}, {0xc2114000}, {0xc2116000}, {0xc2118000}, {0xc211a000}, {0xc211c000}, {0xc211e000}, {0xc2120000}, {0xc2122000}, {0xc2124000}, {0xc2126000}, {0xc2128000}, {0xc212a000}, {0xc212c000}, {0xc212e000}, {0xc2130000}, {0xc2132000}, {0xc2134000}, {0xc2136000}, {0xc2138000}, {0xc213a000}, {0xc213c000}, {0xc213e000}, {0xc2140000}, {0xc2142000}, {0xc2144000}, {0xc2146000}, {0xc2148000}, {0xc214a000}, {0xc214c000}, {0xc214e000}, {0xc2150000}, {0xc2152000}, {0xc2154000}, {0xc2156000}, {0xc2158000}, {0xc215a000}, {0xc215c000}, {0xc215e000}, {0xc2160000}, {0xc2162000}, {0xc2164000}, {0xc2166000}, {0xc2168000}, {0xc216a000}, {0xc216c000}, {0xc216e000}, {0xc2170000}, {0xc2172000}, {0xc2174000}, {0xc2176000}, {0xc2178000}, {0xc217a000}, {0xc217c000}, {0xc217e000}, {0xc2180000}, {0xc2182000}, {0xc2184000}, {0xc2186000}, {0xc2188000}, {0xc218a000}, {0xc218c000}, {0xc218e000}, {0xc2190000}, {0xc2192000}, {0xc2194000}, {0xc2196000}, {0xc2198000}, {0xc219a000}, {0xc219c000}, {0xc219e000}, {0xc21a0000}, {0xc21a2000}, {0xc21a4000}, {0xc21a6000}, {0xc21a8000}, {0xc21aa000}, {0xc21ac000}, {0xc21ae000}, {0xc21b0000}, {0xc21b2000}, {0xc21b4000}, {0xc21b6000}, {0xc21b8000}, {0xc21ba000}, {0xc21bc000}, {0xc21be000}, {0xc21c0000}, {0xc21c2000}, {0xc21c4000}, {0xc21c6000}, {0xc21c8000}, {0xc21ca000}, {0xc21cc000}, {0xc21ce000}, {0xc21d0000}, {0xc21d2000}, {0xc21d4000}, {0xc21d6000}, {0xc21d8000}, {0xc21da000}, {0xc21dc000}, {0xc21de000}, {0xc21e0000}, {0xc21e2000}, {0xc21e4000}, {0xc21e6000}, {0xc21e8000}, {0xc21ea000}, {0xc21ec000}, {0xc21ee000}, {0xc21f0000}, {0xc21f2000}, {0xc21f4000}, {0xc21f6000}, {0xc21f8000}, {0xc21fa000}, {0xc21fc000}, {0xc21fe000}, {0xc2200000}, {0xc2202000}, {0xc2204000}, {0xc2206000}, {0xc2208000}, {0xc220a000}, {0xc220c000}, {0xc220e000}, {0xc2210000}, {0xc2212000}, {0xc2214000}, {0xc2216000}, {0xc2218000}, {0xc221a000}, {0xc221c000}, {0xc221e000}, {0xc2220000}, {0xc2222000}, {0xc2224000}, {0xc2226000}, {0xc2228000}, {0xc222a000}, {0xc222c000}, {0xc222e000}, {0xc2230000}, {0xc2232000}, {0xc2234000}, {0xc2236000}, {0xc2238000}, {0xc223a000}, {0xc223c000}, {0xc223e000}, {0xc2240000}, {0xc2242000}, {0xc2244000}, {0xc2246000}, {0xc2248000}, {0xc224a000}, {0xc224c000}, {0xc224e000}, {0xc2250000}, {0xc2252000}, {0xc2254000}, {0xc2256000}, {0xc2258000}, {0xc225a000}, {0xc225c000}, {0xc225e000}, {0xc2260000}, {0xc2262000}, {0xc2264000}, {0xc2266000}, {0xc2268000}, {0xc226a000}, {0xc226c000}, {0xc226e000}, {0xc2270000}, {0xc2272000}, {0xc2274000}, {0xc2276000}, {0xc2278000}, {0xc227a000}, {0xc227c000}, {0xc227e000}, {0xc2280000}, {0xc2282000}, {0xc2284000}, {0xc2286000}, {0xc2288000}, {0xc228a000}, {0xc228c000}, {0xc228e000}, {0xc2290000}, {0xc2292000}, {0xc2294000}, {0xc2296000}, {0xc2298000}, {0xc229a000}, {0xc229c000}, {0xc229e000}, {0xc22a0000}, {0xc22a2000}, {0xc22a4000}, {0xc22a6000}, {0xc22a8000}, {0xc22aa000}, {0xc22ac000}, {0xc22ae000}, {0xc22b0000}, {0xc22b2000}, {0xc22b4000}, {0xc22b6000}, {0xc22b8000}, {0xc22ba000}, {0xc22bc000}, {0xc22be000}, {0xc22c0000}, {0xc22c2000}, {0xc22c4000}, {0xc22c6000}, {0xc22c8000}, {0xc22ca000}, {0xc22cc000}, {0xc22ce000}, {0xc22d0000}, {0xc22d2000}, {0xc22d4000}, {0xc22d6000}, {0xc22d8000}, {0xc22da000}, {0xc22dc000}, {0xc22de000}, {0xc22e0000}, {0xc22e2000}, {0xc22e4000}, {0xc22e6000}, {0xc22e8000}, {0xc22ea000}, {0xc22ec000}, {0xc22ee000}, {0xc22f0000}, {0xc22f2000}, {0xc22f4000}, {0xc22f6000}, {0xc22f8000}, {0xc22fa000}, {0xc22fc000}, {0xc22fe000}, {0xc2300000}, {0xc2302000}, {0xc2304000}, {0xc2306000}, {0xc2308000}, {0xc230a000}, {0xc230c000}, {0xc230e000}, {0xc2310000}, {0xc2312000}, {0xc2314000}, {0xc2316000}, {0xc2318000}, {0xc231a000}, {0xc231c000}, {0xc231e000}, {0xc2320000}, {0xc2322000}, {0xc2324000}, {0xc2326000}, {0xc2328000}, {0xc232a000}, {0xc232c000}, {0xc232e000}, {0xc2330000}, {0xc2332000}, {0xc2334000}, {0xc2336000}, {0xc2338000}, {0xc233a000}, {0xc233c000}, {0xc233e000}, {0xc2340000}, {0xc2342000}, {0xc2344000}, {0xc2346000}, {0xc2348000}, {0xc234a000}, {0xc234c000}, {0xc234e000}, {0xc2350000}, {0xc2352000}, {0xc2354000}, {0xc2356000}, {0xc2358000}, {0xc235a000}, {0xc235c000}, {0xc235e000}, {0xc2360000}, {0xc2362000}, {0xc2364000}, {0xc2366000}, {0xc2368000}, {0xc236a000}, {0xc236c000}, {0xc236e000}, {0xc2370000}, {0xc2372000}, {0xc2374000}, {0xc2376000}, {0xc2378000}, {0xc237a000}, {0xc237c000}, {0xc237e000}, {0xc2380000}, {0xc2382000}, {0xc2384000}, {0xc2386000}, {0xc2388000}, {0xc238a000}, {0xc238c000}, {0xc238e000}, {0xc2390000}, {0xc2392000}, {0xc2394000}, {0xc2396000}, {0xc2398000}, {0xc239a000}, {0xc239c000}, {0xc239e000}, {0xc23a0000}, {0xc23a2000}, {0xc23a4000}, {0xc23a6000}, {0xc23a8000}, {0xc23aa000}, {0xc23ac000}, {0xc23ae000}, {0xc23b0000}, {0xc23b2000}, {0xc23b4000}, {0xc23b6000}, {0xc23b8000}, {0xc23ba000}, {0xc23bc000}, {0xc23be000}, {0xc23c0000}, {0xc23c2000}, {0xc23c4000}, {0xc23c6000}, {0xc23c8000}, {0xc23ca000}, {0xc23cc000}, {0xc23ce000}, {0xc23d0000}, {0xc23d2000}, {0xc23d4000}, {0xc23d6000}, {0xc23d8000}, {0xc23da000}, {0xc23dc000}, {0xc23de000}, {0xc23e0000}, {0xc23e2000}, {0xc23e4000}, {0xc23e6000}, {0xc23e8000}, {0xc23ea000}, {0xc23ec000}, {0xc23ee000}, {0xc23f0000}, {0xc23f2000}, {0xc23f4000}, {0xc23f6000}, {0xc23f8000}, {0xc23fa000}, {0xc23fc000}, {0xc23fe000}, {0xc2400000}, {0xc2402000}, {0xc2404000}, {0xc2406000}, {0xc2408000}, {0xc240a000}, {0xc240c000}, {0xc240e000}, {0xc2410000}, {0xc2412000}, {0xc2414000}, {0xc2416000}, {0xc2418000}, {0xc241a000}, {0xc241c000}, {0xc241e000}, {0xc2420000}, {0xc2422000}, {0xc2424000}, {0xc2426000}, {0xc2428000}, {0xc242a000}, {0xc242c000}, {0xc242e000}, {0xc2430000}, {0xc2432000}, {0xc2434000}, {0xc2436000}, {0xc2438000}, {0xc243a000}, {0xc243c000}, {0xc243e000}, {0xc2440000}, {0xc2442000}, {0xc2444000}, {0xc2446000}, {0xc2448000}, {0xc244a000}, {0xc244c000}, {0xc244e000}, {0xc2450000}, {0xc2452000}, {0xc2454000}, {0xc2456000}, {0xc2458000}, {0xc245a000}, {0xc245c000}, {0xc245e000}, {0xc2460000}, {0xc2462000}, {0xc2464000}, {0xc2466000}, {0xc2468000}, {0xc246a000}, {0xc246c000}, {0xc246e000}, {0xc2470000}, {0xc2472000}, {0xc2474000}, {0xc2476000}, {0xc2478000}, {0xc247a000}, {0xc247c000}, {0xc247e000}, {0xc2480000}, {0xc2482000}, {0xc2484000}, {0xc2486000}, {0xc2488000}, {0xc248a000}, {0xc248c000}, {0xc248e000}, {0xc2490000}, {0xc2492000}, {0xc2494000}, {0xc2496000}, {0xc2498000}, {0xc249a000}, {0xc249c000}, {0xc249e000}, {0xc24a0000}, {0xc24a2000}, {0xc24a4000}, {0xc24a6000}, {0xc24a8000}, {0xc24aa000}, {0xc24ac000}, {0xc24ae000}, {0xc24b0000}, {0xc24b2000}, {0xc24b4000}, {0xc24b6000}, {0xc24b8000}, {0xc24ba000}, {0xc24bc000}, {0xc24be000}, {0xc24c0000}, {0xc24c2000}, {0xc24c4000}, {0xc24c6000}, {0xc24c8000}, {0xc24ca000}, {0xc24cc000}, {0xc24ce000}, {0xc24d0000}, {0xc24d2000}, {0xc24d4000}, {0xc24d6000}, {0xc24d8000}, {0xc24da000}, {0xc24dc000}, {0xc24de000}, {0xc24e0000}, {0xc24e2000}, {0xc24e4000}, {0xc24e6000}, {0xc24e8000}, {0xc24ea000}, {0xc24ec000}, {0xc24ee000}, {0xc24f0000}, {0xc24f2000}, {0xc24f4000}, {0xc24f6000}, {0xc24f8000}, {0xc24fa000}, {0xc24fc000}, {0xc24fe000}, {0xc2500000}, {0xc2502000}, {0xc2504000}, {0xc2506000}, {0xc2508000}, {0xc250a000}, {0xc250c000}, {0xc250e000}, {0xc2510000}, {0xc2512000}, {0xc2514000}, {0xc2516000}, {0xc2518000}, {0xc251a000}, {0xc251c000}, {0xc251e000}, {0xc2520000}, {0xc2522000}, {0xc2524000}, {0xc2526000}, {0xc2528000}, {0xc252a000}, {0xc252c000}, {0xc252e000}, {0xc2530000}, {0xc2532000}, {0xc2534000}, {0xc2536000}, {0xc2538000}, {0xc253a000}, {0xc253c000}, {0xc253e000}, {0xc2540000}, {0xc2542000}, {0xc2544000}, {0xc2546000}, {0xc2548000}, {0xc254a000}, {0xc254c000}, {0xc254e000}, {0xc2550000}, {0xc2552000}, {0xc2554000}, {0xc2556000}, {0xc2558000}, {0xc255a000}, {0xc255c000}, {0xc255e000}, {0xc2560000}, {0xc2562000}, {0xc2564000}, {0xc2566000}, {0xc2568000}, {0xc256a000}, {0xc256c000}, {0xc256e000}, {0xc2570000}, {0xc2572000}, {0xc2574000}, {0xc2576000}, {0xc2578000}, {0xc257a000}, {0xc257c000}, {0xc257e000}, {0xc2580000}, {0xc2582000}, {0xc2584000}, {0xc2586000}, {0xc2588000}, {0xc258a000}, {0xc258c000}, {0xc258e000}, {0xc2590000}, {0xc2592000}, {0xc2594000}, {0xc2596000}, {0xc2598000}, {0xc259a000}, {0xc259c000}, {0xc259e000}, {0xc25a0000}, {0xc25a2000}, {0xc25a4000}, {0xc25a6000}, {0xc25a8000}, {0xc25aa000}, {0xc25ac000}, {0xc25ae000}, {0xc25b0000}, {0xc25b2000}, {0xc25b4000}, {0xc25b6000}, {0xc25b8000}, {0xc25ba000}, {0xc25bc000}, {0xc25be000}, {0xc25c0000}, {0xc25c2000}, {0xc25c4000}, {0xc25c6000}, {0xc25c8000}, {0xc25ca000}, {0xc25cc000}, {0xc25ce000}, {0xc25d0000}, {0xc25d2000}, {0xc25d4000}, {0xc25d6000}, {0xc25d8000}, {0xc25da000}, {0xc25dc000}, {0xc25de000}, {0xc25e0000}, {0xc25e2000}, {0xc25e4000}, {0xc25e6000}, {0xc25e8000}, {0xc25ea000}, {0xc25ec000}, {0xc25ee000}, {0xc25f0000}, {0xc25f2000}, {0xc25f4000}, {0xc25f6000}, {0xc25f8000}, {0xc25fa000}, {0xc25fc000}, {0xc25fe000}, {0xc2600000}, {0xc2602000}, {0xc2604000}, {0xc2606000}, {0xc2608000}, {0xc260a000}, {0xc260c000}, {0xc260e000}, {0xc2610000}, {0xc2612000}, {0xc2614000}, {0xc2616000}, {0xc2618000}, {0xc261a000}, {0xc261c000}, {0xc261e000}, {0xc2620000}, {0xc2622000}, {0xc2624000}, {0xc2626000}, {0xc2628000}, {0xc262a000}, {0xc262c000}, {0xc262e000}, {0xc2630000}, {0xc2632000}, {0xc2634000}, {0xc2636000}, {0xc2638000}, {0xc263a000}, {0xc263c000}, {0xc263e000}, {0xc2640000}, {0xc2642000}, {0xc2644000}, {0xc2646000}, {0xc2648000}, {0xc264a000}, {0xc264c000}, {0xc264e000}, {0xc2650000}, {0xc2652000}, {0xc2654000}, {0xc2656000}, {0xc2658000}, {0xc265a000}, {0xc265c000}, {0xc265e000}, {0xc2660000}, {0xc2662000}, {0xc2664000}, {0xc2666000}, {0xc2668000}, {0xc266a000}, {0xc266c000}, {0xc266e000}, {0xc2670000}, {0xc2672000}, {0xc2674000}, {0xc2676000}, {0xc2678000}, {0xc267a000}, {0xc267c000}, {0xc267e000}, {0xc2680000}, {0xc2682000}, {0xc2684000}, {0xc2686000}, {0xc2688000}, {0xc268a000}, {0xc268c000}, {0xc268e000}, {0xc2690000}, {0xc2692000}, {0xc2694000}, {0xc2696000}, {0xc2698000}, {0xc269a000}, {0xc269c000}, {0xc269e000}, {0xc26a0000}, {0xc26a2000}, {0xc26a4000}, {0xc26a6000}, {0xc26a8000}, {0xc26aa000}, {0xc26ac000}, {0xc26ae000}, {0xc26b0000}, {0xc26b2000}, {0xc26b4000}, {0xc26b6000}, {0xc26b8000}, {0xc26ba000}, {0xc26bc000}, {0xc26be000}, {0xc26c0000}, {0xc26c2000}, {0xc26c4000}, {0xc26c6000}, {0xc26c8000}, {0xc26ca000}, {0xc26cc000}, {0xc26ce000}, {0xc26d0000}, {0xc26d2000}, {0xc26d4000}, {0xc26d6000}, {0xc26d8000}, {0xc26da000}, {0xc26dc000}, {0xc26de000}, {0xc26e0000}, {0xc26e2000}, {0xc26e4000}, {0xc26e6000}, {0xc26e8000}, {0xc26ea000}, {0xc26ec000}, {0xc26ee000}, {0xc26f0000}, {0xc26f2000}, {0xc26f4000}, {0xc26f6000}, {0xc26f8000}, {0xc26fa000}, {0xc26fc000}, {0xc26fe000}, {0xc2700000}, {0xc2702000}, {0xc2704000}, {0xc2706000}, {0xc2708000}, {0xc270a000}, {0xc270c000}, {0xc270e000}, {0xc2710000}, {0xc2712000}, {0xc2714000}, {0xc2716000}, {0xc2718000}, {0xc271a000}, {0xc271c000}, {0xc271e000}, {0xc2720000}, {0xc2722000}, {0xc2724000}, {0xc2726000}, {0xc2728000}, {0xc272a000}, {0xc272c000}, {0xc272e000}, {0xc2730000}, {0xc2732000}, {0xc2734000}, {0xc2736000}, {0xc2738000}, {0xc273a000}, {0xc273c000}, {0xc273e000}, {0xc2740000}, {0xc2742000}, {0xc2744000}, {0xc2746000}, {0xc2748000}, {0xc274a000}, {0xc274c000}, {0xc274e000}, {0xc2750000}, {0xc2752000}, {0xc2754000}, {0xc2756000}, {0xc2758000}, {0xc275a000}, {0xc275c000}, {0xc275e000}, {0xc2760000}, {0xc2762000}, {0xc2764000}, {0xc2766000}, {0xc2768000}, {0xc276a000}, {0xc276c000}, {0xc276e000}, {0xc2770000}, {0xc2772000}, {0xc2774000}, {0xc2776000}, {0xc2778000}, {0xc277a000}, {0xc277c000}, {0xc277e000}, {0xc2780000}, {0xc2782000}, {0xc2784000}, {0xc2786000}, {0xc2788000}, {0xc278a000}, {0xc278c000}, {0xc278e000}, {0xc2790000}, {0xc2792000}, {0xc2794000}, {0xc2796000}, {0xc2798000}, {0xc279a000}, {0xc279c000}, {0xc279e000}, {0xc27a0000}, {0xc27a2000}, {0xc27a4000}, {0xc27a6000}, {0xc27a8000}, {0xc27aa000}, {0xc27ac000}, {0xc27ae000}, {0xc27b0000}, {0xc27b2000}, {0xc27b4000}, {0xc27b6000}, {0xc27b8000}, {0xc27ba000}, {0xc27bc000}, {0xc27be000}, {0xc27c0000}, {0xc27c2000}, {0xc27c4000}, {0xc27c6000}, {0xc27c8000}, {0xc27ca000}, {0xc27cc000}, {0xc27ce000}, {0xc27d0000}, {0xc27d2000}, {0xc27d4000}, {0xc27d6000}, {0xc27d8000}, {0xc27da000}, {0xc27dc000}, {0xc27de000}, {0xc27e0000}, {0xc27e2000}, {0xc27e4000}, {0xc27e6000}, {0xc27e8000}, {0xc27ea000}, {0xc27ec000}, {0xc27ee000}, {0xc27f0000}, {0xc27f2000}, {0xc27f4000}, {0xc27f6000}, {0xc27f8000}, {0xc27fa000}, {0xc27fc000}, {0xc27fe000}, {0xc2800000}, {0xc2802000}, {0xc2804000}, {0xc2806000}, {0xc2808000}, {0xc280a000}, {0xc280c000}, {0xc280e000}, {0xc2810000}, {0xc2812000}, {0xc2814000}, {0xc2816000}, {0xc2818000}, {0xc281a000}, {0xc281c000}, {0xc281e000}, {0xc2820000}, {0xc2822000}, {0xc2824000}, {0xc2826000}, {0xc2828000}, {0xc282a000}, {0xc282c000}, {0xc282e000}, {0xc2830000}, {0xc2832000}, {0xc2834000}, {0xc2836000}, {0xc2838000}, {0xc283a000}, {0xc283c000}, {0xc283e000}, {0xc2840000}, {0xc2842000}, {0xc2844000}, {0xc2846000}, {0xc2848000}, {0xc284a000}, {0xc284c000}, {0xc284e000}, {0xc2850000}, {0xc2852000}, {0xc2854000}, {0xc2856000}, {0xc2858000}, {0xc285a000}, {0xc285c000}, {0xc285e000}, {0xc2860000}, {0xc2862000}, {0xc2864000}, {0xc2866000}, {0xc2868000}, {0xc286a000}, {0xc286c000}, {0xc286e000}, {0xc2870000}, {0xc2872000}, {0xc2874000}, {0xc2876000}, {0xc2878000}, {0xc287a000}, {0xc287c000}, {0xc287e000}, {0xc2880000}, {0xc2882000}, {0xc2884000}, {0xc2886000}, {0xc2888000}, {0xc288a000}, {0xc288c000}, {0xc288e000}, {0xc2890000}, {0xc2892000}, {0xc2894000}, {0xc2896000}, {0xc2898000}, {0xc289a000}, {0xc289c000}, {0xc289e000}, {0xc28a0000}, {0xc28a2000}, {0xc28a4000}, {0xc28a6000}, {0xc28a8000}, {0xc28aa000}, {0xc28ac000}, {0xc28ae000}, {0xc28b0000}, {0xc28b2000}, {0xc28b4000}, {0xc28b6000}, {0xc28b8000}, {0xc28ba000}, {0xc28bc000}, {0xc28be000}, {0xc28c0000}, {0xc28c2000}, {0xc28c4000}, {0xc28c6000}, {0xc28c8000}, {0xc28ca000}, {0xc28cc000}, {0xc28ce000}, {0xc28d0000}, {0xc28d2000}, {0xc28d4000}, {0xc28d6000}, {0xc28d8000}, {0xc28da000}, {0xc28dc000}, {0xc28de000}, {0xc28e0000}, {0xc28e2000}, {0xc28e4000}, {0xc28e6000}, {0xc28e8000}, {0xc28ea000}, {0xc28ec000}, {0xc28ee000}, {0xc28f0000}, {0xc28f2000}, {0xc28f4000}, {0xc28f6000}, {0xc28f8000}, {0xc28fa000}, {0xc28fc000}, {0xc28fe000}, {0xc2900000}, {0xc2902000}, {0xc2904000}, {0xc2906000}, {0xc2908000}, {0xc290a000}, {0xc290c000}, {0xc290e000}, {0xc2910000}, {0xc2912000}, {0xc2914000}, {0xc2916000}, {0xc2918000}, {0xc291a000}, {0xc291c000}, {0xc291e000}, {0xc2920000}, {0xc2922000}, {0xc2924000}, {0xc2926000}, {0xc2928000}, {0xc292a000}, {0xc292c000}, {0xc292e000}, {0xc2930000}, {0xc2932000}, {0xc2934000}, {0xc2936000}, {0xc2938000}, {0xc293a000}, {0xc293c000}, {0xc293e000}, {0xc2940000}, {0xc2942000}, {0xc2944000}, {0xc2946000}, {0xc2948000}, {0xc294a000}, {0xc294c000}, {0xc294e000}, {0xc2950000}, {0xc2952000}, {0xc2954000}, {0xc2956000}, {0xc2958000}, {0xc295a000}, {0xc295c000}, {0xc295e000}, {0xc2960000}, {0xc2962000}, {0xc2964000}, {0xc2966000}, {0xc2968000}, {0xc296a000}, {0xc296c000}, {0xc296e000}, {0xc2970000}, {0xc2972000}, {0xc2974000}, {0xc2976000}, {0xc2978000}, {0xc297a000}, {0xc297c000}, {0xc297e000}, {0xc2980000}, {0xc2982000}, {0xc2984000}, {0xc2986000}, {0xc2988000}, {0xc298a000}, {0xc298c000}, {0xc298e000}, {0xc2990000}, {0xc2992000}, {0xc2994000}, {0xc2996000}, {0xc2998000}, {0xc299a000}, {0xc299c000}, {0xc299e000}, {0xc29a0000}, {0xc29a2000}, {0xc29a4000}, {0xc29a6000}, {0xc29a8000}, {0xc29aa000}, {0xc29ac000}, {0xc29ae000}, {0xc29b0000}, {0xc29b2000}, {0xc29b4000}, {0xc29b6000}, {0xc29b8000}, {0xc29ba000}, {0xc29bc000}, {0xc29be000}, {0xc29c0000}, {0xc29c2000}, {0xc29c4000}, {0xc29c6000}, {0xc29c8000}, {0xc29ca000}, {0xc29cc000}, {0xc29ce000}, {0xc29d0000}, {0xc29d2000}, {0xc29d4000}, {0xc29d6000}, {0xc29d8000}, {0xc29da000}, {0xc29dc000}, {0xc29de000}, {0xc29e0000}, {0xc29e2000}, {0xc29e4000}, {0xc29e6000}, {0xc29e8000}, {0xc29ea000}, {0xc29ec000}, {0xc29ee000}, {0xc29f0000}, {0xc29f2000}, {0xc29f4000}, {0xc29f6000}, {0xc29f8000}, {0xc29fa000}, {0xc29fc000}, {0xc29fe000}, {0xc2a00000}, {0xc2a02000}, {0xc2a04000}, {0xc2a06000}, {0xc2a08000}, {0xc2a0a000}, {0xc2a0c000}, {0xc2a0e000}, {0xc2a10000}, {0xc2a12000}, {0xc2a14000}, {0xc2a16000}, {0xc2a18000}, {0xc2a1a000}, {0xc2a1c000}, {0xc2a1e000}, {0xc2a20000}, {0xc2a22000}, {0xc2a24000}, {0xc2a26000}, {0xc2a28000}, {0xc2a2a000}, {0xc2a2c000}, {0xc2a2e000}, {0xc2a30000}, {0xc2a32000}, {0xc2a34000}, {0xc2a36000}, {0xc2a38000}, {0xc2a3a000}, {0xc2a3c000}, {0xc2a3e000}, {0xc2a40000}, {0xc2a42000}, {0xc2a44000}, {0xc2a46000}, {0xc2a48000}, {0xc2a4a000}, {0xc2a4c000}, {0xc2a4e000}, {0xc2a50000}, {0xc2a52000}, {0xc2a54000}, {0xc2a56000}, {0xc2a58000}, {0xc2a5a000}, {0xc2a5c000}, {0xc2a5e000}, {0xc2a60000}, {0xc2a62000}, {0xc2a64000}, {0xc2a66000}, {0xc2a68000}, {0xc2a6a000}, {0xc2a6c000}, {0xc2a6e000}, {0xc2a70000}, {0xc2a72000}, {0xc2a74000}, {0xc2a76000}, {0xc2a78000}, {0xc2a7a000}, {0xc2a7c000}, {0xc2a7e000}, {0xc2a80000}, {0xc2a82000}, {0xc2a84000}, {0xc2a86000}, {0xc2a88000}, {0xc2a8a000}, {0xc2a8c000}, {0xc2a8e000}, {0xc2a90000}, {0xc2a92000}, {0xc2a94000}, {0xc2a96000}, {0xc2a98000}, {0xc2a9a000}, {0xc2a9c000}, {0xc2a9e000}, {0xc2aa0000}, {0xc2aa2000}, {0xc2aa4000}, {0xc2aa6000}, {0xc2aa8000}, {0xc2aaa000}, {0xc2aac000}, {0xc2aae000}, {0xc2ab0000}, {0xc2ab2000}, {0xc2ab4000}, {0xc2ab6000}, {0xc2ab8000}, {0xc2aba000}, {0xc2abc000}, {0xc2abe000}, {0xc2ac0000}, {0xc2ac2000}, {0xc2ac4000}, {0xc2ac6000}, {0xc2ac8000}, {0xc2aca000}, {0xc2acc000}, {0xc2ace000}, {0xc2ad0000}, {0xc2ad2000}, {0xc2ad4000}, {0xc2ad6000}, {0xc2ad8000}, {0xc2ada000}, {0xc2adc000}, {0xc2ade000}, {0xc2ae0000}, {0xc2ae2000}, {0xc2ae4000}, {0xc2ae6000}, {0xc2ae8000}, {0xc2aea000}, {0xc2aec000}, {0xc2aee000}, {0xc2af0000}, {0xc2af2000}, {0xc2af4000}, {0xc2af6000}, {0xc2af8000}, {0xc2afa000}, {0xc2afc000}, {0xc2afe000}, {0xc2b00000}, {0xc2b02000}, {0xc2b04000}, {0xc2b06000}, {0xc2b08000}, {0xc2b0a000}, {0xc2b0c000}, {0xc2b0e000}, {0xc2b10000}, {0xc2b12000}, {0xc2b14000}, {0xc2b16000}, {0xc2b18000}, {0xc2b1a000}, {0xc2b1c000}, {0xc2b1e000}, {0xc2b20000}, {0xc2b22000}, {0xc2b24000}, {0xc2b26000}, {0xc2b28000}, {0xc2b2a000}, {0xc2b2c000}, {0xc2b2e000}, {0xc2b30000}, {0xc2b32000}, {0xc2b34000}, {0xc2b36000}, {0xc2b38000}, {0xc2b3a000}, {0xc2b3c000}, {0xc2b3e000}, {0xc2b40000}, {0xc2b42000}, {0xc2b44000}, {0xc2b46000}, {0xc2b48000}, {0xc2b4a000}, {0xc2b4c000}, {0xc2b4e000}, {0xc2b50000}, {0xc2b52000}, {0xc2b54000}, {0xc2b56000}, {0xc2b58000}, {0xc2b5a000}, {0xc2b5c000}, {0xc2b5e000}, {0xc2b60000}, {0xc2b62000}, {0xc2b64000}, {0xc2b66000}, {0xc2b68000}, {0xc2b6a000}, {0xc2b6c000}, {0xc2b6e000}, {0xc2b70000}, {0xc2b72000}, {0xc2b74000}, {0xc2b76000}, {0xc2b78000}, {0xc2b7a000}, {0xc2b7c000}, {0xc2b7e000}, {0xc2b80000}, {0xc2b82000}, {0xc2b84000}, {0xc2b86000}, {0xc2b88000}, {0xc2b8a000}, {0xc2b8c000}, {0xc2b8e000}, {0xc2b90000}, {0xc2b92000}, {0xc2b94000}, {0xc2b96000}, {0xc2b98000}, {0xc2b9a000}, {0xc2b9c000}, {0xc2b9e000}, {0xc2ba0000}, {0xc2ba2000}, {0xc2ba4000}, {0xc2ba6000}, {0xc2ba8000}, {0xc2baa000}, {0xc2bac000}, {0xc2bae000}, {0xc2bb0000}, {0xc2bb2000}, {0xc2bb4000}, {0xc2bb6000}, {0xc2bb8000}, {0xc2bba000}, {0xc2bbc000}, {0xc2bbe000}, {0xc2bc0000}, {0xc2bc2000}, {0xc2bc4000}, {0xc2bc6000}, {0xc2bc8000}, {0xc2bca000}, {0xc2bcc000}, {0xc2bce000}, {0xc2bd0000}, {0xc2bd2000}, {0xc2bd4000}, {0xc2bd6000}, {0xc2bd8000}, {0xc2bda000}, {0xc2bdc000}, {0xc2bde000}, {0xc2be0000}, {0xc2be2000}, {0xc2be4000}, {0xc2be6000}, {0xc2be8000}, {0xc2bea000}, {0xc2bec000}, {0xc2bee000}, {0xc2bf0000}, {0xc2bf2000}, {0xc2bf4000}, {0xc2bf6000}, {0xc2bf8000}, {0xc2bfa000}, {0xc2bfc000}, {0xc2bfe000}, {0xc2c00000}, {0xc2c02000}, {0xc2c04000}, {0xc2c06000}, {0xc2c08000}, {0xc2c0a000}, {0xc2c0c000}, {0xc2c0e000}, {0xc2c10000}, {0xc2c12000}, {0xc2c14000}, {0xc2c16000}, {0xc2c18000}, {0xc2c1a000}, {0xc2c1c000}, {0xc2c1e000}, {0xc2c20000}, {0xc2c22000}, {0xc2c24000}, {0xc2c26000}, {0xc2c28000}, {0xc2c2a000}, {0xc2c2c000}, {0xc2c2e000}, {0xc2c30000}, {0xc2c32000}, {0xc2c34000}, {0xc2c36000}, {0xc2c38000}, {0xc2c3a000}, {0xc2c3c000}, {0xc2c3e000}, {0xc2c40000}, {0xc2c42000}, {0xc2c44000}, {0xc2c46000}, {0xc2c48000}, {0xc2c4a000}, {0xc2c4c000}, {0xc2c4e000}, {0xc2c50000}, {0xc2c52000}, {0xc2c54000}, {0xc2c56000}, {0xc2c58000}, {0xc2c5a000}, {0xc2c5c000}, {0xc2c5e000}, {0xc2c60000}, {0xc2c62000}, {0xc2c64000}, {0xc2c66000}, {0xc2c68000}, {0xc2c6a000}, {0xc2c6c000}, {0xc2c6e000}, {0xc2c70000}, {0xc2c72000}, {0xc2c74000}, {0xc2c76000}, {0xc2c78000}, {0xc2c7a000}, {0xc2c7c000}, {0xc2c7e000}, {0xc2c80000}, {0xc2c82000}, {0xc2c84000}, {0xc2c86000}, {0xc2c88000}, {0xc2c8a000}, {0xc2c8c000}, {0xc2c8e000}, {0xc2c90000}, {0xc2c92000}, {0xc2c94000}, {0xc2c96000}, {0xc2c98000}, {0xc2c9a000}, {0xc2c9c000}, {0xc2c9e000}, {0xc2ca0000}, {0xc2ca2000}, {0xc2ca4000}, {0xc2ca6000}, {0xc2ca8000}, {0xc2caa000}, {0xc2cac000}, {0xc2cae000}, {0xc2cb0000}, {0xc2cb2000}, {0xc2cb4000}, {0xc2cb6000}, {0xc2cb8000}, {0xc2cba000}, {0xc2cbc000}, {0xc2cbe000}, {0xc2cc0000}, {0xc2cc2000}, {0xc2cc4000}, {0xc2cc6000}, {0xc2cc8000}, {0xc2cca000}, {0xc2ccc000}, {0xc2cce000}, {0xc2cd0000}, {0xc2cd2000}, {0xc2cd4000}, {0xc2cd6000}, {0xc2cd8000}, {0xc2cda000}, {0xc2cdc000}, {0xc2cde000}, {0xc2ce0000}, {0xc2ce2000}, {0xc2ce4000}, {0xc2ce6000}, {0xc2ce8000}, {0xc2cea000}, {0xc2cec000}, {0xc2cee000}, {0xc2cf0000}, {0xc2cf2000}, {0xc2cf4000}, {0xc2cf6000}, {0xc2cf8000}, {0xc2cfa000}, {0xc2cfc000}, {0xc2cfe000}, {0xc2d00000}, {0xc2d02000}, {0xc2d04000}, {0xc2d06000}, {0xc2d08000}, {0xc2d0a000}, {0xc2d0c000}, {0xc2d0e000}, {0xc2d10000}, {0xc2d12000}, {0xc2d14000}, {0xc2d16000}, {0xc2d18000}, {0xc2d1a000}, {0xc2d1c000}, {0xc2d1e000}, {0xc2d20000}, {0xc2d22000}, {0xc2d24000}, {0xc2d26000}, {0xc2d28000}, {0xc2d2a000}, {0xc2d2c000}, {0xc2d2e000}, {0xc2d30000}, {0xc2d32000}, {0xc2d34000}, {0xc2d36000}, {0xc2d38000}, {0xc2d3a000}, {0xc2d3c000}, {0xc2d3e000}, {0xc2d40000}, {0xc2d42000}, {0xc2d44000}, {0xc2d46000}, {0xc2d48000}, {0xc2d4a000}, {0xc2d4c000}, {0xc2d4e000}, {0xc2d50000}, {0xc2d52000}, {0xc2d54000}, {0xc2d56000}, {0xc2d58000}, {0xc2d5a000}, {0xc2d5c000}, {0xc2d5e000}, {0xc2d60000}, {0xc2d62000}, {0xc2d64000}, {0xc2d66000}, {0xc2d68000}, {0xc2d6a000}, {0xc2d6c000}, {0xc2d6e000}, {0xc2d70000}, {0xc2d72000}, {0xc2d74000}, {0xc2d76000}, {0xc2d78000}, {0xc2d7a000}, {0xc2d7c000}, {0xc2d7e000}, {0xc2d80000}, {0xc2d82000}, {0xc2d84000}, {0xc2d86000}, {0xc2d88000}, {0xc2d8a000}, {0xc2d8c000}, {0xc2d8e000}, {0xc2d90000}, {0xc2d92000}, {0xc2d94000}, {0xc2d96000}, {0xc2d98000}, {0xc2d9a000}, {0xc2d9c000}, {0xc2d9e000}, {0xc2da0000}, {0xc2da2000}, {0xc2da4000}, {0xc2da6000}, {0xc2da8000}, {0xc2daa000}, {0xc2dac000}, {0xc2dae000}, {0xc2db0000}, {0xc2db2000}, {0xc2db4000}, {0xc2db6000}, {0xc2db8000}, {0xc2dba000}, {0xc2dbc000}, {0xc2dbe000}, {0xc2dc0000}, {0xc2dc2000}, {0xc2dc4000}, {0xc2dc6000}, {0xc2dc8000}, {0xc2dca000}, {0xc2dcc000}, {0xc2dce000}, {0xc2dd0000}, {0xc2dd2000}, {0xc2dd4000}, {0xc2dd6000}, {0xc2dd8000}, {0xc2dda000}, {0xc2ddc000}, {0xc2dde000}, {0xc2de0000}, {0xc2de2000}, {0xc2de4000}, {0xc2de6000}, {0xc2de8000}, {0xc2dea000}, {0xc2dec000}, {0xc2dee000}, {0xc2df0000}, {0xc2df2000}, {0xc2df4000}, {0xc2df6000}, {0xc2df8000}, {0xc2dfa000}, {0xc2dfc000}, {0xc2dfe000}, {0xc2e00000}, {0xc2e02000}, {0xc2e04000}, {0xc2e06000}, {0xc2e08000}, {0xc2e0a000}, {0xc2e0c000}, {0xc2e0e000}, {0xc2e10000}, {0xc2e12000}, {0xc2e14000}, {0xc2e16000}, {0xc2e18000}, {0xc2e1a000}, {0xc2e1c000}, {0xc2e1e000}, {0xc2e20000}, {0xc2e22000}, {0xc2e24000}, {0xc2e26000}, {0xc2e28000}, {0xc2e2a000}, {0xc2e2c000}, {0xc2e2e000}, {0xc2e30000}, {0xc2e32000}, {0xc2e34000}, {0xc2e36000}, {0xc2e38000}, {0xc2e3a000}, {0xc2e3c000}, {0xc2e3e000}, {0xc2e40000}, {0xc2e42000}, {0xc2e44000}, {0xc2e46000}, {0xc2e48000}, {0xc2e4a000}, {0xc2e4c000}, {0xc2e4e000}, {0xc2e50000}, {0xc2e52000}, {0xc2e54000}, {0xc2e56000}, {0xc2e58000}, {0xc2e5a000}, {0xc2e5c000}, {0xc2e5e000}, {0xc2e60000}, {0xc2e62000}, {0xc2e64000}, {0xc2e66000}, {0xc2e68000}, {0xc2e6a000}, {0xc2e6c000}, {0xc2e6e000}, {0xc2e70000}, {0xc2e72000}, {0xc2e74000}, {0xc2e76000}, {0xc2e78000}, {0xc2e7a000}, {0xc2e7c000}, {0xc2e7e000}, {0xc2e80000}, {0xc2e82000}, {0xc2e84000}, {0xc2e86000}, {0xc2e88000}, {0xc2e8a000}, {0xc2e8c000}, {0xc2e8e000}, {0xc2e90000}, {0xc2e92000}, {0xc2e94000}, {0xc2e96000}, {0xc2e98000}, {0xc2e9a000}, {0xc2e9c000}, {0xc2e9e000}, {0xc2ea0000}, {0xc2ea2000}, {0xc2ea4000}, {0xc2ea6000}, {0xc2ea8000}, {0xc2eaa000}, {0xc2eac000}, {0xc2eae000}, {0xc2eb0000}, {0xc2eb2000}, {0xc2eb4000}, {0xc2eb6000}, {0xc2eb8000}, {0xc2eba000}, {0xc2ebc000}, {0xc2ebe000}, {0xc2ec0000}, {0xc2ec2000}, {0xc2ec4000}, {0xc2ec6000}, {0xc2ec8000}, {0xc2eca000}, {0xc2ecc000}, {0xc2ece000}, {0xc2ed0000}, {0xc2ed2000}, {0xc2ed4000}, {0xc2ed6000}, {0xc2ed8000}, {0xc2eda000}, {0xc2edc000}, {0xc2ede000}, {0xc2ee0000}, {0xc2ee2000}, {0xc2ee4000}, {0xc2ee6000}, {0xc2ee8000}, {0xc2eea000}, {0xc2eec000}, {0xc2eee000}, {0xc2ef0000}, {0xc2ef2000}, {0xc2ef4000}, {0xc2ef6000}, {0xc2ef8000}, {0xc2efa000}, {0xc2efc000}, {0xc2efe000}, {0xc2f00000}, {0xc2f02000}, {0xc2f04000}, {0xc2f06000}, {0xc2f08000}, {0xc2f0a000}, {0xc2f0c000}, {0xc2f0e000}, {0xc2f10000}, {0xc2f12000}, {0xc2f14000}, {0xc2f16000}, {0xc2f18000}, {0xc2f1a000}, {0xc2f1c000}, {0xc2f1e000}, {0xc2f20000}, {0xc2f22000}, {0xc2f24000}, {0xc2f26000}, {0xc2f28000}, {0xc2f2a000}, {0xc2f2c000}, {0xc2f2e000}, {0xc2f30000}, {0xc2f32000}, {0xc2f34000}, {0xc2f36000}, {0xc2f38000}, {0xc2f3a000}, {0xc2f3c000}, {0xc2f3e000}, {0xc2f40000}, {0xc2f42000}, {0xc2f44000}, {0xc2f46000}, {0xc2f48000}, {0xc2f4a000}, {0xc2f4c000}, {0xc2f4e000}, {0xc2f50000}, {0xc2f52000}, {0xc2f54000}, {0xc2f56000}, {0xc2f58000}, {0xc2f5a000}, {0xc2f5c000}, {0xc2f5e000}, {0xc2f60000}, {0xc2f62000}, {0xc2f64000}, {0xc2f66000}, {0xc2f68000}, {0xc2f6a000}, {0xc2f6c000}, {0xc2f6e000}, {0xc2f70000}, {0xc2f72000}, {0xc2f74000}, {0xc2f76000}, {0xc2f78000}, {0xc2f7a000}, {0xc2f7c000}, {0xc2f7e000}, {0xc2f80000}, {0xc2f82000}, {0xc2f84000}, {0xc2f86000}, {0xc2f88000}, {0xc2f8a000}, {0xc2f8c000}, {0xc2f8e000}, {0xc2f90000}, {0xc2f92000}, {0xc2f94000}, {0xc2f96000}, {0xc2f98000}, {0xc2f9a000}, {0xc2f9c000}, {0xc2f9e000}, {0xc2fa0000}, {0xc2fa2000}, {0xc2fa4000}, {0xc2fa6000}, {0xc2fa8000}, {0xc2faa000}, {0xc2fac000}, {0xc2fae000}, {0xc2fb0000}, {0xc2fb2000}, {0xc2fb4000}, {0xc2fb6000}, {0xc2fb8000}, {0xc2fba000}, {0xc2fbc000}, {0xc2fbe000}, {0xc2fc0000}, {0xc2fc2000}, {0xc2fc4000}, {0xc2fc6000}, {0xc2fc8000}, {0xc2fca000}, {0xc2fcc000}, {0xc2fce000}, {0xc2fd0000}, {0xc2fd2000}, {0xc2fd4000}, {0xc2fd6000}, {0xc2fd8000}, {0xc2fda000}, {0xc2fdc000}, {0xc2fde000}, {0xc2fe0000}, {0xc2fe2000}, {0xc2fe4000}, {0xc2fe6000}, {0xc2fe8000}, {0xc2fea000}, {0xc2fec000}, {0xc2fee000}, {0xc2ff0000}, {0xc2ff2000}, {0xc2ff4000}, {0xc2ff6000}, {0xc2ff8000}, {0xc2ffa000}, {0xc2ffc000}, {0xc2ffe000}, {0xc3000000}, {0xc3002000}, {0xc3004000}, {0xc3006000}, {0xc3008000}, {0xc300a000}, {0xc300c000}, {0xc300e000}, {0xc3010000}, {0xc3012000}, {0xc3014000}, {0xc3016000}, {0xc3018000}, {0xc301a000}, {0xc301c000}, {0xc301e000}, {0xc3020000}, {0xc3022000}, {0xc3024000}, {0xc3026000}, {0xc3028000}, {0xc302a000}, {0xc302c000}, {0xc302e000}, {0xc3030000}, {0xc3032000}, {0xc3034000}, {0xc3036000}, {0xc3038000}, {0xc303a000}, {0xc303c000}, {0xc303e000}, {0xc3040000}, {0xc3042000}, {0xc3044000}, {0xc3046000}, {0xc3048000}, {0xc304a000}, {0xc304c000}, {0xc304e000}, {0xc3050000}, {0xc3052000}, {0xc3054000}, {0xc3056000}, {0xc3058000}, {0xc305a000}, {0xc305c000}, {0xc305e000}, {0xc3060000}, {0xc3062000}, {0xc3064000}, {0xc3066000}, {0xc3068000}, {0xc306a000}, {0xc306c000}, {0xc306e000}, {0xc3070000}, {0xc3072000}, {0xc3074000}, {0xc3076000}, {0xc3078000}, {0xc307a000}, {0xc307c000}, {0xc307e000}, {0xc3080000}, {0xc3082000}, {0xc3084000}, {0xc3086000}, {0xc3088000}, {0xc308a000}, {0xc308c000}, {0xc308e000}, {0xc3090000}, {0xc3092000}, {0xc3094000}, {0xc3096000}, {0xc3098000}, {0xc309a000}, {0xc309c000}, {0xc309e000}, {0xc30a0000}, {0xc30a2000}, {0xc30a4000}, {0xc30a6000}, {0xc30a8000}, {0xc30aa000}, {0xc30ac000}, {0xc30ae000}, {0xc30b0000}, {0xc30b2000}, {0xc30b4000}, {0xc30b6000}, {0xc30b8000}, {0xc30ba000}, {0xc30bc000}, {0xc30be000}, {0xc30c0000}, {0xc30c2000}, {0xc30c4000}, {0xc30c6000}, {0xc30c8000}, {0xc30ca000}, {0xc30cc000}, {0xc30ce000}, {0xc30d0000}, {0xc30d2000}, {0xc30d4000}, {0xc30d6000}, {0xc30d8000}, {0xc30da000}, {0xc30dc000}, {0xc30de000}, {0xc30e0000}, {0xc30e2000}, {0xc30e4000}, {0xc30e6000}, {0xc30e8000}, {0xc30ea000}, {0xc30ec000}, {0xc30ee000}, {0xc30f0000}, {0xc30f2000}, {0xc30f4000}, {0xc30f6000}, {0xc30f8000}, {0xc30fa000}, {0xc30fc000}, {0xc30fe000}, {0xc3100000}, {0xc3102000}, {0xc3104000}, {0xc3106000}, {0xc3108000}, {0xc310a000}, {0xc310c000}, {0xc310e000}, {0xc3110000}, {0xc3112000}, {0xc3114000}, {0xc3116000}, {0xc3118000}, {0xc311a000}, {0xc311c000}, {0xc311e000}, {0xc3120000}, {0xc3122000}, {0xc3124000}, {0xc3126000}, {0xc3128000}, {0xc312a000}, {0xc312c000}, {0xc312e000}, {0xc3130000}, {0xc3132000}, {0xc3134000}, {0xc3136000}, {0xc3138000}, {0xc313a000}, {0xc313c000}, {0xc313e000}, {0xc3140000}, {0xc3142000}, {0xc3144000}, {0xc3146000}, {0xc3148000}, {0xc314a000}, {0xc314c000}, {0xc314e000}, {0xc3150000}, {0xc3152000}, {0xc3154000}, {0xc3156000}, {0xc3158000}, {0xc315a000}, {0xc315c000}, {0xc315e000}, {0xc3160000}, {0xc3162000}, {0xc3164000}, {0xc3166000}, {0xc3168000}, {0xc316a000}, {0xc316c000}, {0xc316e000}, {0xc3170000}, {0xc3172000}, {0xc3174000}, {0xc3176000}, {0xc3178000}, {0xc317a000}, {0xc317c000}, {0xc317e000}, {0xc3180000}, {0xc3182000}, {0xc3184000}, {0xc3186000}, {0xc3188000}, {0xc318a000}, {0xc318c000}, {0xc318e000}, {0xc3190000}, {0xc3192000}, {0xc3194000}, {0xc3196000}, {0xc3198000}, {0xc319a000}, {0xc319c000}, {0xc319e000}, {0xc31a0000}, {0xc31a2000}, {0xc31a4000}, {0xc31a6000}, {0xc31a8000}, {0xc31aa000}, {0xc31ac000}, {0xc31ae000}, {0xc31b0000}, {0xc31b2000}, {0xc31b4000}, {0xc31b6000}, {0xc31b8000}, {0xc31ba000}, {0xc31bc000}, {0xc31be000}, {0xc31c0000}, {0xc31c2000}, {0xc31c4000}, {0xc31c6000}, {0xc31c8000}, {0xc31ca000}, {0xc31cc000}, {0xc31ce000}, {0xc31d0000}, {0xc31d2000}, {0xc31d4000}, {0xc31d6000}, {0xc31d8000}, {0xc31da000}, {0xc31dc000}, {0xc31de000}, {0xc31e0000}, {0xc31e2000}, {0xc31e4000}, {0xc31e6000}, {0xc31e8000}, {0xc31ea000}, {0xc31ec000}, {0xc31ee000}, {0xc31f0000}, {0xc31f2000}, {0xc31f4000}, {0xc31f6000}, {0xc31f8000}, {0xc31fa000}, {0xc31fc000}, {0xc31fe000}, {0xc3200000}, {0xc3202000}, {0xc3204000}, {0xc3206000}, {0xc3208000}, {0xc320a000}, {0xc320c000}, {0xc320e000}, {0xc3210000}, {0xc3212000}, {0xc3214000}, {0xc3216000}, {0xc3218000}, {0xc321a000}, {0xc321c000}, {0xc321e000}, {0xc3220000}, {0xc3222000}, {0xc3224000}, {0xc3226000}, {0xc3228000}, {0xc322a000}, {0xc322c000}, {0xc322e000}, {0xc3230000}, {0xc3232000}, {0xc3234000}, {0xc3236000}, {0xc3238000}, {0xc323a000}, {0xc323c000}, {0xc323e000}, {0xc3240000}, {0xc3242000}, {0xc3244000}, {0xc3246000}, {0xc3248000}, {0xc324a000}, {0xc324c000}, {0xc324e000}, {0xc3250000}, {0xc3252000}, {0xc3254000}, {0xc3256000}, {0xc3258000}, {0xc325a000}, {0xc325c000}, {0xc325e000}, {0xc3260000}, {0xc3262000}, {0xc3264000}, {0xc3266000}, {0xc3268000}, {0xc326a000}, {0xc326c000}, {0xc326e000}, {0xc3270000}, {0xc3272000}, {0xc3274000}, {0xc3276000}, {0xc3278000}, {0xc327a000}, {0xc327c000}, {0xc327e000}, {0xc3280000}, {0xc3282000}, {0xc3284000}, {0xc3286000}, {0xc3288000}, {0xc328a000}, {0xc328c000}, {0xc328e000}, {0xc3290000}, {0xc3292000}, {0xc3294000}, {0xc3296000}, {0xc3298000}, {0xc329a000}, {0xc329c000}, {0xc329e000}, {0xc32a0000}, {0xc32a2000}, {0xc32a4000}, {0xc32a6000}, {0xc32a8000}, {0xc32aa000}, {0xc32ac000}, {0xc32ae000}, {0xc32b0000}, {0xc32b2000}, {0xc32b4000}, {0xc32b6000}, {0xc32b8000}, {0xc32ba000}, {0xc32bc000}, {0xc32be000}, {0xc32c0000}, {0xc32c2000}, {0xc32c4000}, {0xc32c6000}, {0xc32c8000}, {0xc32ca000}, {0xc32cc000}, {0xc32ce000}, {0xc32d0000}, {0xc32d2000}, {0xc32d4000}, {0xc32d6000}, {0xc32d8000}, {0xc32da000}, {0xc32dc000}, {0xc32de000}, {0xc32e0000}, {0xc32e2000}, {0xc32e4000}, {0xc32e6000}, {0xc32e8000}, {0xc32ea000}, {0xc32ec000}, {0xc32ee000}, {0xc32f0000}, {0xc32f2000}, {0xc32f4000}, {0xc32f6000}, {0xc32f8000}, {0xc32fa000}, {0xc32fc000}, {0xc32fe000}, {0xc3300000}, {0xc3302000}, {0xc3304000}, {0xc3306000}, {0xc3308000}, {0xc330a000}, {0xc330c000}, {0xc330e000}, {0xc3310000}, {0xc3312000}, {0xc3314000}, {0xc3316000}, {0xc3318000}, {0xc331a000}, {0xc331c000}, {0xc331e000}, {0xc3320000}, {0xc3322000}, {0xc3324000}, {0xc3326000}, {0xc3328000}, {0xc332a000}, {0xc332c000}, {0xc332e000}, {0xc3330000}, {0xc3332000}, {0xc3334000}, {0xc3336000}, {0xc3338000}, {0xc333a000}, {0xc333c000}, {0xc333e000}, {0xc3340000}, {0xc3342000}, {0xc3344000}, {0xc3346000}, {0xc3348000}, {0xc334a000}, {0xc334c000}, {0xc334e000}, {0xc3350000}, {0xc3352000}, {0xc3354000}, {0xc3356000}, {0xc3358000}, {0xc335a000}, {0xc335c000}, {0xc335e000}, {0xc3360000}, {0xc3362000}, {0xc3364000}, {0xc3366000}, {0xc3368000}, {0xc336a000}, {0xc336c000}, {0xc336e000}, {0xc3370000}, {0xc3372000}, {0xc3374000}, {0xc3376000}, {0xc3378000}, {0xc337a000}, {0xc337c000}, {0xc337e000}, {0xc3380000}, {0xc3382000}, {0xc3384000}, {0xc3386000}, {0xc3388000}, {0xc338a000}, {0xc338c000}, {0xc338e000}, {0xc3390000}, {0xc3392000}, {0xc3394000}, {0xc3396000}, {0xc3398000}, {0xc339a000}, {0xc339c000}, {0xc339e000}, {0xc33a0000}, {0xc33a2000}, {0xc33a4000}, {0xc33a6000}, {0xc33a8000}, {0xc33aa000}, {0xc33ac000}, {0xc33ae000}, {0xc33b0000}, {0xc33b2000}, {0xc33b4000}, {0xc33b6000}, {0xc33b8000}, {0xc33ba000}, {0xc33bc000}, {0xc33be000}, {0xc33c0000}, {0xc33c2000}, {0xc33c4000}, {0xc33c6000}, {0xc33c8000}, {0xc33ca000}, {0xc33cc000}, {0xc33ce000}, {0xc33d0000}, {0xc33d2000}, {0xc33d4000}, {0xc33d6000}, {0xc33d8000}, {0xc33da000}, {0xc33dc000}, {0xc33de000}, {0xc33e0000}, {0xc33e2000}, {0xc33e4000}, {0xc33e6000}, {0xc33e8000}, {0xc33ea000}, {0xc33ec000}, {0xc33ee000}, {0xc33f0000}, {0xc33f2000}, {0xc33f4000}, {0xc33f6000}, {0xc33f8000}, {0xc33fa000}, {0xc33fc000}, {0xc33fe000}, {0xc3400000}, {0xc3402000}, {0xc3404000}, {0xc3406000}, {0xc3408000}, {0xc340a000}, {0xc340c000}, {0xc340e000}, {0xc3410000}, {0xc3412000}, {0xc3414000}, {0xc3416000}, {0xc3418000}, {0xc341a000}, {0xc341c000}, {0xc341e000}, {0xc3420000}, {0xc3422000}, {0xc3424000}, {0xc3426000}, {0xc3428000}, {0xc342a000}, {0xc342c000}, {0xc342e000}, {0xc3430000}, {0xc3432000}, {0xc3434000}, {0xc3436000}, {0xc3438000}, {0xc343a000}, {0xc343c000}, {0xc343e000}, {0xc3440000}, {0xc3442000}, {0xc3444000}, {0xc3446000}, {0xc3448000}, {0xc344a000}, {0xc344c000}, {0xc344e000}, {0xc3450000}, {0xc3452000}, {0xc3454000}, {0xc3456000}, {0xc3458000}, {0xc345a000}, {0xc345c000}, {0xc345e000}, {0xc3460000}, {0xc3462000}, {0xc3464000}, {0xc3466000}, {0xc3468000}, {0xc346a000}, {0xc346c000}, {0xc346e000}, {0xc3470000}, {0xc3472000}, {0xc3474000}, {0xc3476000}, {0xc3478000}, {0xc347a000}, {0xc347c000}, {0xc347e000}, {0xc3480000}, {0xc3482000}, {0xc3484000}, {0xc3486000}, {0xc3488000}, {0xc348a000}, {0xc348c000}, {0xc348e000}, {0xc3490000}, {0xc3492000}, {0xc3494000}, {0xc3496000}, {0xc3498000}, {0xc349a000}, {0xc349c000}, {0xc349e000}, {0xc34a0000}, {0xc34a2000}, {0xc34a4000}, {0xc34a6000}, {0xc34a8000}, {0xc34aa000}, {0xc34ac000}, {0xc34ae000}, {0xc34b0000}, {0xc34b2000}, {0xc34b4000}, {0xc34b6000}, {0xc34b8000}, {0xc34ba000}, {0xc34bc000}, {0xc34be000}, {0xc34c0000}, {0xc34c2000}, {0xc34c4000}, {0xc34c6000}, {0xc34c8000}, {0xc34ca000}, {0xc34cc000}, {0xc34ce000}, {0xc34d0000}, {0xc34d2000}, {0xc34d4000}, {0xc34d6000}, {0xc34d8000}, {0xc34da000}, {0xc34dc000}, {0xc34de000}, {0xc34e0000}, {0xc34e2000}, {0xc34e4000}, {0xc34e6000}, {0xc34e8000}, {0xc34ea000}, {0xc34ec000}, {0xc34ee000}, {0xc34f0000}, {0xc34f2000}, {0xc34f4000}, {0xc34f6000}, {0xc34f8000}, {0xc34fa000}, {0xc34fc000}, {0xc34fe000}, {0xc3500000}, {0xc3502000}, {0xc3504000}, {0xc3506000}, {0xc3508000}, {0xc350a000}, {0xc350c000}, {0xc350e000}, {0xc3510000}, {0xc3512000}, {0xc3514000}, {0xc3516000}, {0xc3518000}, {0xc351a000}, {0xc351c000}, {0xc351e000}, {0xc3520000}, {0xc3522000}, {0xc3524000}, {0xc3526000}, {0xc3528000}, {0xc352a000}, {0xc352c000}, {0xc352e000}, {0xc3530000}, {0xc3532000}, {0xc3534000}, {0xc3536000}, {0xc3538000}, {0xc353a000}, {0xc353c000}, {0xc353e000}, {0xc3540000}, {0xc3542000}, {0xc3544000}, {0xc3546000}, {0xc3548000}, {0xc354a000}, {0xc354c000}, {0xc354e000}, {0xc3550000}, {0xc3552000}, {0xc3554000}, {0xc3556000}, {0xc3558000}, {0xc355a000}, {0xc355c000}, {0xc355e000}, {0xc3560000}, {0xc3562000}, {0xc3564000}, {0xc3566000}, {0xc3568000}, {0xc356a000}, {0xc356c000}, {0xc356e000}, {0xc3570000}, {0xc3572000}, {0xc3574000}, {0xc3576000}, {0xc3578000}, {0xc357a000}, {0xc357c000}, {0xc357e000}, {0xc3580000}, {0xc3582000}, {0xc3584000}, {0xc3586000}, {0xc3588000}, {0xc358a000}, {0xc358c000}, {0xc358e000}, {0xc3590000}, {0xc3592000}, {0xc3594000}, {0xc3596000}, {0xc3598000}, {0xc359a000}, {0xc359c000}, {0xc359e000}, {0xc35a0000}, {0xc35a2000}, {0xc35a4000}, {0xc35a6000}, {0xc35a8000}, {0xc35aa000}, {0xc35ac000}, {0xc35ae000}, {0xc35b0000}, {0xc35b2000}, {0xc35b4000}, {0xc35b6000}, {0xc35b8000}, {0xc35ba000}, {0xc35bc000}, {0xc35be000}, {0xc35c0000}, {0xc35c2000}, {0xc35c4000}, {0xc35c6000}, {0xc35c8000}, {0xc35ca000}, {0xc35cc000}, {0xc35ce000}, {0xc35d0000}, {0xc35d2000}, {0xc35d4000}, {0xc35d6000}, {0xc35d8000}, {0xc35da000}, {0xc35dc000}, {0xc35de000}, {0xc35e0000}, {0xc35e2000}, {0xc35e4000}, {0xc35e6000}, {0xc35e8000}, {0xc35ea000}, {0xc35ec000}, {0xc35ee000}, {0xc35f0000}, {0xc35f2000}, {0xc35f4000}, {0xc35f6000}, {0xc35f8000}, {0xc35fa000}, {0xc35fc000}, {0xc35fe000}, {0xc3600000}, {0xc3602000}, {0xc3604000}, {0xc3606000}, {0xc3608000}, {0xc360a000}, {0xc360c000}, {0xc360e000}, {0xc3610000}, {0xc3612000}, {0xc3614000}, {0xc3616000}, {0xc3618000}, {0xc361a000}, {0xc361c000}, {0xc361e000}, {0xc3620000}, {0xc3622000}, {0xc3624000}, {0xc3626000}, {0xc3628000}, {0xc362a000}, {0xc362c000}, {0xc362e000}, {0xc3630000}, {0xc3632000}, {0xc3634000}, {0xc3636000}, {0xc3638000}, {0xc363a000}, {0xc363c000}, {0xc363e000}, {0xc3640000}, {0xc3642000}, {0xc3644000}, {0xc3646000}, {0xc3648000}, {0xc364a000}, {0xc364c000}, {0xc364e000}, {0xc3650000}, {0xc3652000}, {0xc3654000}, {0xc3656000}, {0xc3658000}, {0xc365a000}, {0xc365c000}, {0xc365e000}, {0xc3660000}, {0xc3662000}, {0xc3664000}, {0xc3666000}, {0xc3668000}, {0xc366a000}, {0xc366c000}, {0xc366e000}, {0xc3670000}, {0xc3672000}, {0xc3674000}, {0xc3676000}, {0xc3678000}, {0xc367a000}, {0xc367c000}, {0xc367e000}, {0xc3680000}, {0xc3682000}, {0xc3684000}, {0xc3686000}, {0xc3688000}, {0xc368a000}, {0xc368c000}, {0xc368e000}, {0xc3690000}, {0xc3692000}, {0xc3694000}, {0xc3696000}, {0xc3698000}, {0xc369a000}, {0xc369c000}, {0xc369e000}, {0xc36a0000}, {0xc36a2000}, {0xc36a4000}, {0xc36a6000}, {0xc36a8000}, {0xc36aa000}, {0xc36ac000}, {0xc36ae000}, {0xc36b0000}, {0xc36b2000}, {0xc36b4000}, {0xc36b6000}, {0xc36b8000}, {0xc36ba000}, {0xc36bc000}, {0xc36be000}, {0xc36c0000}, {0xc36c2000}, {0xc36c4000}, {0xc36c6000}, {0xc36c8000}, {0xc36ca000}, {0xc36cc000}, {0xc36ce000}, {0xc36d0000}, {0xc36d2000}, {0xc36d4000}, {0xc36d6000}, {0xc36d8000}, {0xc36da000}, {0xc36dc000}, {0xc36de000}, {0xc36e0000}, {0xc36e2000}, {0xc36e4000}, {0xc36e6000}, {0xc36e8000}, {0xc36ea000}, {0xc36ec000}, {0xc36ee000}, {0xc36f0000}, {0xc36f2000}, {0xc36f4000}, {0xc36f6000}, {0xc36f8000}, {0xc36fa000}, {0xc36fc000}, {0xc36fe000}, {0xc3700000}, {0xc3702000}, {0xc3704000}, {0xc3706000}, {0xc3708000}, {0xc370a000}, {0xc370c000}, {0xc370e000}, {0xc3710000}, {0xc3712000}, {0xc3714000}, {0xc3716000}, {0xc3718000}, {0xc371a000}, {0xc371c000}, {0xc371e000}, {0xc3720000}, {0xc3722000}, {0xc3724000}, {0xc3726000}, {0xc3728000}, {0xc372a000}, {0xc372c000}, {0xc372e000}, {0xc3730000}, {0xc3732000}, {0xc3734000}, {0xc3736000}, {0xc3738000}, {0xc373a000}, {0xc373c000}, {0xc373e000}, {0xc3740000}, {0xc3742000}, {0xc3744000}, {0xc3746000}, {0xc3748000}, {0xc374a000}, {0xc374c000}, {0xc374e000}, {0xc3750000}, {0xc3752000}, {0xc3754000}, {0xc3756000}, {0xc3758000}, {0xc375a000}, {0xc375c000}, {0xc375e000}, {0xc3760000}, {0xc3762000}, {0xc3764000}, {0xc3766000}, {0xc3768000}, {0xc376a000}, {0xc376c000}, {0xc376e000}, {0xc3770000}, {0xc3772000}, {0xc3774000}, {0xc3776000}, {0xc3778000}, {0xc377a000}, {0xc377c000}, {0xc377e000}, {0xc3780000}, {0xc3782000}, {0xc3784000}, {0xc3786000}, {0xc3788000}, {0xc378a000}, {0xc378c000}, {0xc378e000}, {0xc3790000}, {0xc3792000}, {0xc3794000}, {0xc3796000}, {0xc3798000}, {0xc379a000}, {0xc379c000}, {0xc379e000}, {0xc37a0000}, {0xc37a2000}, {0xc37a4000}, {0xc37a6000}, {0xc37a8000}, {0xc37aa000}, {0xc37ac000}, {0xc37ae000}, {0xc37b0000}, {0xc37b2000}, {0xc37b4000}, {0xc37b6000}, {0xc37b8000}, {0xc37ba000}, {0xc37bc000}, {0xc37be000}, {0xc37c0000}, {0xc37c2000}, {0xc37c4000}, {0xc37c6000}, {0xc37c8000}, {0xc37ca000}, {0xc37cc000}, {0xc37ce000}, {0xc37d0000}, {0xc37d2000}, {0xc37d4000}, {0xc37d6000}, {0xc37d8000}, {0xc37da000}, {0xc37dc000}, {0xc37de000}, {0xc37e0000}, {0xc37e2000}, {0xc37e4000}, {0xc37e6000}, {0xc37e8000}, {0xc37ea000}, {0xc37ec000}, {0xc37ee000}, {0xc37f0000}, {0xc37f2000}, {0xc37f4000}, {0xc37f6000}, {0xc37f8000}, {0xc37fa000}, {0xc37fc000}, {0xc37fe000}, {0xc3800000}, {0xc3802000}, {0xc3804000}, {0xc3806000}, {0xc3808000}, {0xc380a000}, {0xc380c000}, {0xc380e000}, {0xc3810000}, {0xc3812000}, {0xc3814000}, {0xc3816000}, {0xc3818000}, {0xc381a000}, {0xc381c000}, {0xc381e000}, {0xc3820000}, {0xc3822000}, {0xc3824000}, {0xc3826000}, {0xc3828000}, {0xc382a000}, {0xc382c000}, {0xc382e000}, {0xc3830000}, {0xc3832000}, {0xc3834000}, {0xc3836000}, {0xc3838000}, {0xc383a000}, {0xc383c000}, {0xc383e000}, {0xc3840000}, {0xc3842000}, {0xc3844000}, {0xc3846000}, {0xc3848000}, {0xc384a000}, {0xc384c000}, {0xc384e000}, {0xc3850000}, {0xc3852000}, {0xc3854000}, {0xc3856000}, {0xc3858000}, {0xc385a000}, {0xc385c000}, {0xc385e000}, {0xc3860000}, {0xc3862000}, {0xc3864000}, {0xc3866000}, {0xc3868000}, {0xc386a000}, {0xc386c000}, {0xc386e000}, {0xc3870000}, {0xc3872000}, {0xc3874000}, {0xc3876000}, {0xc3878000}, {0xc387a000}, {0xc387c000}, {0xc387e000}, {0xc3880000}, {0xc3882000}, {0xc3884000}, {0xc3886000}, {0xc3888000}, {0xc388a000}, {0xc388c000}, {0xc388e000}, {0xc3890000}, {0xc3892000}, {0xc3894000}, {0xc3896000}, {0xc3898000}, {0xc389a000}, {0xc389c000}, {0xc389e000}, {0xc38a0000}, {0xc38a2000}, {0xc38a4000}, {0xc38a6000}, {0xc38a8000}, {0xc38aa000}, {0xc38ac000}, {0xc38ae000}, {0xc38b0000}, {0xc38b2000}, {0xc38b4000}, {0xc38b6000}, {0xc38b8000}, {0xc38ba000}, {0xc38bc000}, {0xc38be000}, {0xc38c0000}, {0xc38c2000}, {0xc38c4000}, {0xc38c6000}, {0xc38c8000}, {0xc38ca000}, {0xc38cc000}, {0xc38ce000}, {0xc38d0000}, {0xc38d2000}, {0xc38d4000}, {0xc38d6000}, {0xc38d8000}, {0xc38da000}, {0xc38dc000}, {0xc38de000}, {0xc38e0000}, {0xc38e2000}, {0xc38e4000}, {0xc38e6000}, {0xc38e8000}, {0xc38ea000}, {0xc38ec000}, {0xc38ee000}, {0xc38f0000}, {0xc38f2000}, {0xc38f4000}, {0xc38f6000}, {0xc38f8000}, {0xc38fa000}, {0xc38fc000}, {0xc38fe000}, {0xc3900000}, {0xc3902000}, {0xc3904000}, {0xc3906000}, {0xc3908000}, {0xc390a000}, {0xc390c000}, {0xc390e000}, {0xc3910000}, {0xc3912000}, {0xc3914000}, {0xc3916000}, {0xc3918000}, {0xc391a000}, {0xc391c000}, {0xc391e000}, {0xc3920000}, {0xc3922000}, {0xc3924000}, {0xc3926000}, {0xc3928000}, {0xc392a000}, {0xc392c000}, {0xc392e000}, {0xc3930000}, {0xc3932000}, {0xc3934000}, {0xc3936000}, {0xc3938000}, {0xc393a000}, {0xc393c000}, {0xc393e000}, {0xc3940000}, {0xc3942000}, {0xc3944000}, {0xc3946000}, {0xc3948000}, {0xc394a000}, {0xc394c000}, {0xc394e000}, {0xc3950000}, {0xc3952000}, {0xc3954000}, {0xc3956000}, {0xc3958000}, {0xc395a000}, {0xc395c000}, {0xc395e000}, {0xc3960000}, {0xc3962000}, {0xc3964000}, {0xc3966000}, {0xc3968000}, {0xc396a000}, {0xc396c000}, {0xc396e000}, {0xc3970000}, {0xc3972000}, {0xc3974000}, {0xc3976000}, {0xc3978000}, {0xc397a000}, {0xc397c000}, {0xc397e000}, {0xc3980000}, {0xc3982000}, {0xc3984000}, {0xc3986000}, {0xc3988000}, {0xc398a000}, {0xc398c000}, {0xc398e000}, {0xc3990000}, {0xc3992000}, {0xc3994000}, {0xc3996000}, {0xc3998000}, {0xc399a000}, {0xc399c000}, {0xc399e000}, {0xc39a0000}, {0xc39a2000}, {0xc39a4000}, {0xc39a6000}, {0xc39a8000}, {0xc39aa000}, {0xc39ac000}, {0xc39ae000}, {0xc39b0000}, {0xc39b2000}, {0xc39b4000}, {0xc39b6000}, {0xc39b8000}, {0xc39ba000}, {0xc39bc000}, {0xc39be000}, {0xc39c0000}, {0xc39c2000}, {0xc39c4000}, {0xc39c6000}, {0xc39c8000}, {0xc39ca000}, {0xc39cc000}, {0xc39ce000}, {0xc39d0000}, {0xc39d2000}, {0xc39d4000}, {0xc39d6000}, {0xc39d8000}, {0xc39da000}, {0xc39dc000}, {0xc39de000}, {0xc39e0000}, {0xc39e2000}, {0xc39e4000}, {0xc39e6000}, {0xc39e8000}, {0xc39ea000}, {0xc39ec000}, {0xc39ee000}, {0xc39f0000}, {0xc39f2000}, {0xc39f4000}, {0xc39f6000}, {0xc39f8000}, {0xc39fa000}, {0xc39fc000}, {0xc39fe000}, {0xc3a00000}, {0xc3a02000}, {0xc3a04000}, {0xc3a06000}, {0xc3a08000}, {0xc3a0a000}, {0xc3a0c000}, {0xc3a0e000}, {0xc3a10000}, {0xc3a12000}, {0xc3a14000}, {0xc3a16000}, {0xc3a18000}, {0xc3a1a000}, {0xc3a1c000}, {0xc3a1e000}, {0xc3a20000}, {0xc3a22000}, {0xc3a24000}, {0xc3a26000}, {0xc3a28000}, {0xc3a2a000}, {0xc3a2c000}, {0xc3a2e000}, {0xc3a30000}, {0xc3a32000}, {0xc3a34000}, {0xc3a36000}, {0xc3a38000}, {0xc3a3a000}, {0xc3a3c000}, {0xc3a3e000}, {0xc3a40000}, {0xc3a42000}, {0xc3a44000}, {0xc3a46000}, {0xc3a48000}, {0xc3a4a000}, {0xc3a4c000}, {0xc3a4e000}, {0xc3a50000}, {0xc3a52000}, {0xc3a54000}, {0xc3a56000}, {0xc3a58000}, {0xc3a5a000}, {0xc3a5c000}, {0xc3a5e000}, {0xc3a60000}, {0xc3a62000}, {0xc3a64000}, {0xc3a66000}, {0xc3a68000}, {0xc3a6a000}, {0xc3a6c000}, {0xc3a6e000}, {0xc3a70000}, {0xc3a72000}, {0xc3a74000}, {0xc3a76000}, {0xc3a78000}, {0xc3a7a000}, {0xc3a7c000}, {0xc3a7e000}, {0xc3a80000}, {0xc3a82000}, {0xc3a84000}, {0xc3a86000}, {0xc3a88000}, {0xc3a8a000}, {0xc3a8c000}, {0xc3a8e000}, {0xc3a90000}, {0xc3a92000}, {0xc3a94000}, {0xc3a96000}, {0xc3a98000}, {0xc3a9a000}, {0xc3a9c000}, {0xc3a9e000}, {0xc3aa0000}, {0xc3aa2000}, {0xc3aa4000}, {0xc3aa6000}, {0xc3aa8000}, {0xc3aaa000}, {0xc3aac000}, {0xc3aae000}, {0xc3ab0000}, {0xc3ab2000}, {0xc3ab4000}, {0xc3ab6000}, {0xc3ab8000}, {0xc3aba000}, {0xc3abc000}, {0xc3abe000}, {0xc3ac0000}, {0xc3ac2000}, {0xc3ac4000}, {0xc3ac6000}, {0xc3ac8000}, {0xc3aca000}, {0xc3acc000}, {0xc3ace000}, {0xc3ad0000}, {0xc3ad2000}, {0xc3ad4000}, {0xc3ad6000}, {0xc3ad8000}, {0xc3ada000}, {0xc3adc000}, {0xc3ade000}, {0xc3ae0000}, {0xc3ae2000}, {0xc3ae4000}, {0xc3ae6000}, {0xc3ae8000}, {0xc3aea000}, {0xc3aec000}, {0xc3aee000}, {0xc3af0000}, {0xc3af2000}, {0xc3af4000}, {0xc3af6000}, {0xc3af8000}, {0xc3afa000}, {0xc3afc000}, {0xc3afe000}, {0xc3b00000}, {0xc3b02000}, {0xc3b04000}, {0xc3b06000}, {0xc3b08000}, {0xc3b0a000}, {0xc3b0c000}, {0xc3b0e000}, {0xc3b10000}, {0xc3b12000}, {0xc3b14000}, {0xc3b16000}, {0xc3b18000}, {0xc3b1a000}, {0xc3b1c000}, {0xc3b1e000}, {0xc3b20000}, {0xc3b22000}, {0xc3b24000}, {0xc3b26000}, {0xc3b28000}, {0xc3b2a000}, {0xc3b2c000}, {0xc3b2e000}, {0xc3b30000}, {0xc3b32000}, {0xc3b34000}, {0xc3b36000}, {0xc3b38000}, {0xc3b3a000}, {0xc3b3c000}, {0xc3b3e000}, {0xc3b40000}, {0xc3b42000}, {0xc3b44000}, {0xc3b46000}, {0xc3b48000}, {0xc3b4a000}, {0xc3b4c000}, {0xc3b4e000}, {0xc3b50000}, {0xc3b52000}, {0xc3b54000}, {0xc3b56000}, {0xc3b58000}, {0xc3b5a000}, {0xc3b5c000}, {0xc3b5e000}, {0xc3b60000}, {0xc3b62000}, {0xc3b64000}, {0xc3b66000}, {0xc3b68000}, {0xc3b6a000}, {0xc3b6c000}, {0xc3b6e000}, {0xc3b70000}, {0xc3b72000}, {0xc3b74000}, {0xc3b76000}, {0xc3b78000}, {0xc3b7a000}, {0xc3b7c000}, {0xc3b7e000}, {0xc3b80000}, {0xc3b82000}, {0xc3b84000}, {0xc3b86000}, {0xc3b88000}, {0xc3b8a000}, {0xc3b8c000}, {0xc3b8e000}, {0xc3b90000}, {0xc3b92000}, {0xc3b94000}, {0xc3b96000}, {0xc3b98000}, {0xc3b9a000}, {0xc3b9c000}, {0xc3b9e000}, {0xc3ba0000}, {0xc3ba2000}, {0xc3ba4000}, {0xc3ba6000}, {0xc3ba8000}, {0xc3baa000}, {0xc3bac000}, {0xc3bae000}, {0xc3bb0000}, {0xc3bb2000}, {0xc3bb4000}, {0xc3bb6000}, {0xc3bb8000}, {0xc3bba000}, {0xc3bbc000}, {0xc3bbe000}, {0xc3bc0000}, {0xc3bc2000}, {0xc3bc4000}, {0xc3bc6000}, {0xc3bc8000}, {0xc3bca000}, {0xc3bcc000}, {0xc3bce000}, {0xc3bd0000}, {0xc3bd2000}, {0xc3bd4000}, {0xc3bd6000}, {0xc3bd8000}, {0xc3bda000}, {0xc3bdc000}, {0xc3bde000}, {0xc3be0000}, {0xc3be2000}, {0xc3be4000}, {0xc3be6000}, {0xc3be8000}, {0xc3bea000}, {0xc3bec000}, {0xc3bee000}, {0xc3bf0000}, {0xc3bf2000}, {0xc3bf4000}, {0xc3bf6000}, {0xc3bf8000}, {0xc3bfa000}, {0xc3bfc000}, {0xc3bfe000}, {0xc3c00000}, {0xc3c02000}, {0xc3c04000}, {0xc3c06000}, {0xc3c08000}, {0xc3c0a000}, {0xc3c0c000}, {0xc3c0e000}, {0xc3c10000}, {0xc3c12000}, {0xc3c14000}, {0xc3c16000}, {0xc3c18000}, {0xc3c1a000}, {0xc3c1c000}, {0xc3c1e000}, {0xc3c20000}, {0xc3c22000}, {0xc3c24000}, {0xc3c26000}, {0xc3c28000}, {0xc3c2a000}, {0xc3c2c000}, {0xc3c2e000}, {0xc3c30000}, {0xc3c32000}, {0xc3c34000}, {0xc3c36000}, {0xc3c38000}, {0xc3c3a000}, {0xc3c3c000}, {0xc3c3e000}, {0xc3c40000}, {0xc3c42000}, {0xc3c44000}, {0xc3c46000}, {0xc3c48000}, {0xc3c4a000}, {0xc3c4c000}, {0xc3c4e000}, {0xc3c50000}, {0xc3c52000}, {0xc3c54000}, {0xc3c56000}, {0xc3c58000}, {0xc3c5a000}, {0xc3c5c000}, {0xc3c5e000}, {0xc3c60000}, {0xc3c62000}, {0xc3c64000}, {0xc3c66000}, {0xc3c68000}, {0xc3c6a000}, {0xc3c6c000}, {0xc3c6e000}, {0xc3c70000}, {0xc3c72000}, {0xc3c74000}, {0xc3c76000}, {0xc3c78000}, {0xc3c7a000}, {0xc3c7c000}, {0xc3c7e000}, {0xc3c80000}, {0xc3c82000}, {0xc3c84000}, {0xc3c86000}, {0xc3c88000}, {0xc3c8a000}, {0xc3c8c000}, {0xc3c8e000}, {0xc3c90000}, {0xc3c92000}, {0xc3c94000}, {0xc3c96000}, {0xc3c98000}, {0xc3c9a000}, {0xc3c9c000}, {0xc3c9e000}, {0xc3ca0000}, {0xc3ca2000}, {0xc3ca4000}, {0xc3ca6000}, {0xc3ca8000}, {0xc3caa000}, {0xc3cac000}, {0xc3cae000}, {0xc3cb0000}, {0xc3cb2000}, {0xc3cb4000}, {0xc3cb6000}, {0xc3cb8000}, {0xc3cba000}, {0xc3cbc000}, {0xc3cbe000}, {0xc3cc0000}, {0xc3cc2000}, {0xc3cc4000}, {0xc3cc6000}, {0xc3cc8000}, {0xc3cca000}, {0xc3ccc000}, {0xc3cce000}, {0xc3cd0000}, {0xc3cd2000}, {0xc3cd4000}, {0xc3cd6000}, {0xc3cd8000}, {0xc3cda000}, {0xc3cdc000}, {0xc3cde000}, {0xc3ce0000}, {0xc3ce2000}, {0xc3ce4000}, {0xc3ce6000}, {0xc3ce8000}, {0xc3cea000}, {0xc3cec000}, {0xc3cee000}, {0xc3cf0000}, {0xc3cf2000}, {0xc3cf4000}, {0xc3cf6000}, {0xc3cf8000}, {0xc3cfa000}, {0xc3cfc000}, {0xc3cfe000}, {0xc3d00000}, {0xc3d02000}, {0xc3d04000}, {0xc3d06000}, {0xc3d08000}, {0xc3d0a000}, {0xc3d0c000}, {0xc3d0e000}, {0xc3d10000}, {0xc3d12000}, {0xc3d14000}, {0xc3d16000}, {0xc3d18000}, {0xc3d1a000}, {0xc3d1c000}, {0xc3d1e000}, {0xc3d20000}, {0xc3d22000}, {0xc3d24000}, {0xc3d26000}, {0xc3d28000}, {0xc3d2a000}, {0xc3d2c000}, {0xc3d2e000}, {0xc3d30000}, {0xc3d32000}, {0xc3d34000}, {0xc3d36000}, {0xc3d38000}, {0xc3d3a000}, {0xc3d3c000}, {0xc3d3e000}, {0xc3d40000}, {0xc3d42000}, {0xc3d44000}, {0xc3d46000}, {0xc3d48000}, {0xc3d4a000}, {0xc3d4c000}, {0xc3d4e000}, {0xc3d50000}, {0xc3d52000}, {0xc3d54000}, {0xc3d56000}, {0xc3d58000}, {0xc3d5a000}, {0xc3d5c000}, {0xc3d5e000}, {0xc3d60000}, {0xc3d62000}, {0xc3d64000}, {0xc3d66000}, {0xc3d68000}, {0xc3d6a000}, {0xc3d6c000}, {0xc3d6e000}, {0xc3d70000}, {0xc3d72000}, {0xc3d74000}, {0xc3d76000}, {0xc3d78000}, {0xc3d7a000}, {0xc3d7c000}, {0xc3d7e000}, {0xc3d80000}, {0xc3d82000}, {0xc3d84000}, {0xc3d86000}, {0xc3d88000}, {0xc3d8a000}, {0xc3d8c000}, {0xc3d8e000}, {0xc3d90000}, {0xc3d92000}, {0xc3d94000}, {0xc3d96000}, {0xc3d98000}, {0xc3d9a000}, {0xc3d9c000}, {0xc3d9e000}, {0xc3da0000}, {0xc3da2000}, {0xc3da4000}, {0xc3da6000}, {0xc3da8000}, {0xc3daa000}, {0xc3dac000}, {0xc3dae000}, {0xc3db0000}, {0xc3db2000}, {0xc3db4000}, {0xc3db6000}, {0xc3db8000}, {0xc3dba000}, {0xc3dbc000}, {0xc3dbe000}, {0xc3dc0000}, {0xc3dc2000}, {0xc3dc4000}, {0xc3dc6000}, {0xc3dc8000}, {0xc3dca000}, {0xc3dcc000}, {0xc3dce000}, {0xc3dd0000}, {0xc3dd2000}, {0xc3dd4000}, {0xc3dd6000}, {0xc3dd8000}, {0xc3dda000}, {0xc3ddc000}, {0xc3dde000}, {0xc3de0000}, {0xc3de2000}, {0xc3de4000}, {0xc3de6000}, {0xc3de8000}, {0xc3dea000}, {0xc3dec000}, {0xc3dee000}, {0xc3df0000}, {0xc3df2000}, {0xc3df4000}, {0xc3df6000}, {0xc3df8000}, {0xc3dfa000}, {0xc3dfc000}, {0xc3dfe000}, {0xc3e00000}, {0xc3e02000}, {0xc3e04000}, {0xc3e06000}, {0xc3e08000}, {0xc3e0a000}, {0xc3e0c000}, {0xc3e0e000}, {0xc3e10000}, {0xc3e12000}, {0xc3e14000}, {0xc3e16000}, {0xc3e18000}, {0xc3e1a000}, {0xc3e1c000}, {0xc3e1e000}, {0xc3e20000}, {0xc3e22000}, {0xc3e24000}, {0xc3e26000}, {0xc3e28000}, {0xc3e2a000}, {0xc3e2c000}, {0xc3e2e000}, {0xc3e30000}, {0xc3e32000}, {0xc3e34000}, {0xc3e36000}, {0xc3e38000}, {0xc3e3a000}, {0xc3e3c000}, {0xc3e3e000}, {0xc3e40000}, {0xc3e42000}, {0xc3e44000}, {0xc3e46000}, {0xc3e48000}, {0xc3e4a000}, {0xc3e4c000}, {0xc3e4e000}, {0xc3e50000}, {0xc3e52000}, {0xc3e54000}, {0xc3e56000}, {0xc3e58000}, {0xc3e5a000}, {0xc3e5c000}, {0xc3e5e000}, {0xc3e60000}, {0xc3e62000}, {0xc3e64000}, {0xc3e66000}, {0xc3e68000}, {0xc3e6a000}, {0xc3e6c000}, {0xc3e6e000}, {0xc3e70000}, {0xc3e72000}, {0xc3e74000}, {0xc3e76000}, {0xc3e78000}, {0xc3e7a000}, {0xc3e7c000}, {0xc3e7e000}, {0xc3e80000}, {0xc3e82000}, {0xc3e84000}, {0xc3e86000}, {0xc3e88000}, {0xc3e8a000}, {0xc3e8c000}, {0xc3e8e000}, {0xc3e90000}, {0xc3e92000}, {0xc3e94000}, {0xc3e96000}, {0xc3e98000}, {0xc3e9a000}, {0xc3e9c000}, {0xc3e9e000}, {0xc3ea0000}, {0xc3ea2000}, {0xc3ea4000}, {0xc3ea6000}, {0xc3ea8000}, {0xc3eaa000}, {0xc3eac000}, {0xc3eae000}, {0xc3eb0000}, {0xc3eb2000}, {0xc3eb4000}, {0xc3eb6000}, {0xc3eb8000}, {0xc3eba000}, {0xc3ebc000}, {0xc3ebe000}, {0xc3ec0000}, {0xc3ec2000}, {0xc3ec4000}, {0xc3ec6000}, {0xc3ec8000}, {0xc3eca000}, {0xc3ecc000}, {0xc3ece000}, {0xc3ed0000}, {0xc3ed2000}, {0xc3ed4000}, {0xc3ed6000}, {0xc3ed8000}, {0xc3eda000}, {0xc3edc000}, {0xc3ede000}, {0xc3ee0000}, {0xc3ee2000}, {0xc3ee4000}, {0xc3ee6000}, {0xc3ee8000}, {0xc3eea000}, {0xc3eec000}, {0xc3eee000}, {0xc3ef0000}, {0xc3ef2000}, {0xc3ef4000}, {0xc3ef6000}, {0xc3ef8000}, {0xc3efa000}, {0xc3efc000}, {0xc3efe000}, {0xc3f00000}, {0xc3f02000}, {0xc3f04000}, {0xc3f06000}, {0xc3f08000}, {0xc3f0a000}, {0xc3f0c000}, {0xc3f0e000}, {0xc3f10000}, {0xc3f12000}, {0xc3f14000}, {0xc3f16000}, {0xc3f18000}, {0xc3f1a000}, {0xc3f1c000}, {0xc3f1e000}, {0xc3f20000}, {0xc3f22000}, {0xc3f24000}, {0xc3f26000}, {0xc3f28000}, {0xc3f2a000}, {0xc3f2c000}, {0xc3f2e000}, {0xc3f30000}, {0xc3f32000}, {0xc3f34000}, {0xc3f36000}, {0xc3f38000}, {0xc3f3a000}, {0xc3f3c000}, {0xc3f3e000}, {0xc3f40000}, {0xc3f42000}, {0xc3f44000}, {0xc3f46000}, {0xc3f48000}, {0xc3f4a000}, {0xc3f4c000}, {0xc3f4e000}, {0xc3f50000}, {0xc3f52000}, {0xc3f54000}, {0xc3f56000}, {0xc3f58000}, {0xc3f5a000}, {0xc3f5c000}, {0xc3f5e000}, {0xc3f60000}, {0xc3f62000}, {0xc3f64000}, {0xc3f66000}, {0xc3f68000}, {0xc3f6a000}, {0xc3f6c000}, {0xc3f6e000}, {0xc3f70000}, {0xc3f72000}, {0xc3f74000}, {0xc3f76000}, {0xc3f78000}, {0xc3f7a000}, {0xc3f7c000}, {0xc3f7e000}, {0xc3f80000}, {0xc3f82000}, {0xc3f84000}, {0xc3f86000}, {0xc3f88000}, {0xc3f8a000}, {0xc3f8c000}, {0xc3f8e000}, {0xc3f90000}, {0xc3f92000}, {0xc3f94000}, {0xc3f96000}, {0xc3f98000}, {0xc3f9a000}, {0xc3f9c000}, {0xc3f9e000}, {0xc3fa0000}, {0xc3fa2000}, {0xc3fa4000}, {0xc3fa6000}, {0xc3fa8000}, {0xc3faa000}, {0xc3fac000}, {0xc3fae000}, {0xc3fb0000}, {0xc3fb2000}, {0xc3fb4000}, {0xc3fb6000}, {0xc3fb8000}, {0xc3fba000}, {0xc3fbc000}, {0xc3fbe000}, {0xc3fc0000}, {0xc3fc2000}, {0xc3fc4000}, {0xc3fc6000}, {0xc3fc8000}, {0xc3fca000}, {0xc3fcc000}, {0xc3fce000}, {0xc3fd0000}, {0xc3fd2000}, {0xc3fd4000}, {0xc3fd6000}, {0xc3fd8000}, {0xc3fda000}, {0xc3fdc000}, {0xc3fde000}, {0xc3fe0000}, {0xc3fe2000}, {0xc3fe4000}, {0xc3fe6000}, {0xc3fe8000}, {0xc3fea000}, {0xc3fec000}, {0xc3fee000}, {0xc3ff0000}, {0xc3ff2000}, {0xc3ff4000}, {0xc3ff6000}, {0xc3ff8000}, {0xc3ffa000}, {0xc3ffc000}, {0xc3ffe000}, {0xc4000000}, {0xc4002000}, {0xc4004000}, {0xc4006000}, {0xc4008000}, {0xc400a000}, {0xc400c000}, {0xc400e000}, {0xc4010000}, {0xc4012000}, {0xc4014000}, {0xc4016000}, {0xc4018000}, {0xc401a000}, {0xc401c000}, {0xc401e000}, {0xc4020000}, {0xc4022000}, {0xc4024000}, {0xc4026000}, {0xc4028000}, {0xc402a000}, {0xc402c000}, {0xc402e000}, {0xc4030000}, {0xc4032000}, {0xc4034000}, {0xc4036000}, {0xc4038000}, {0xc403a000}, {0xc403c000}, {0xc403e000}, {0xc4040000}, {0xc4042000}, {0xc4044000}, {0xc4046000}, {0xc4048000}, {0xc404a000}, {0xc404c000}, {0xc404e000}, {0xc4050000}, {0xc4052000}, {0xc4054000}, {0xc4056000}, {0xc4058000}, {0xc405a000}, {0xc405c000}, {0xc405e000}, {0xc4060000}, {0xc4062000}, {0xc4064000}, {0xc4066000}, {0xc4068000}, {0xc406a000}, {0xc406c000}, {0xc406e000}, {0xc4070000}, {0xc4072000}, {0xc4074000}, {0xc4076000}, {0xc4078000}, {0xc407a000}, {0xc407c000}, {0xc407e000}, {0xc4080000}, {0xc4082000}, {0xc4084000}, {0xc4086000}, {0xc4088000}, {0xc408a000}, {0xc408c000}, {0xc408e000}, {0xc4090000}, {0xc4092000}, {0xc4094000}, {0xc4096000}, {0xc4098000}, {0xc409a000}, {0xc409c000}, {0xc409e000}, {0xc40a0000}, {0xc40a2000}, {0xc40a4000}, {0xc40a6000}, {0xc40a8000}, {0xc40aa000}, {0xc40ac000}, {0xc40ae000}, {0xc40b0000}, {0xc40b2000}, {0xc40b4000}, {0xc40b6000}, {0xc40b8000}, {0xc40ba000}, {0xc40bc000}, {0xc40be000}, {0xc40c0000}, {0xc40c2000}, {0xc40c4000}, {0xc40c6000}, {0xc40c8000}, {0xc40ca000}, {0xc40cc000}, {0xc40ce000}, {0xc40d0000}, {0xc40d2000}, {0xc40d4000}, {0xc40d6000}, {0xc40d8000}, {0xc40da000}, {0xc40dc000}, {0xc40de000}, {0xc40e0000}, {0xc40e2000}, {0xc40e4000}, {0xc40e6000}, {0xc40e8000}, {0xc40ea000}, {0xc40ec000}, {0xc40ee000}, {0xc40f0000}, {0xc40f2000}, {0xc40f4000}, {0xc40f6000}, {0xc40f8000}, {0xc40fa000}, {0xc40fc000}, {0xc40fe000}, {0xc4100000}, {0xc4102000}, {0xc4104000}, {0xc4106000}, {0xc4108000}, {0xc410a000}, {0xc410c000}, {0xc410e000}, {0xc4110000}, {0xc4112000}, {0xc4114000}, {0xc4116000}, {0xc4118000}, {0xc411a000}, {0xc411c000}, {0xc411e000}, {0xc4120000}, {0xc4122000}, {0xc4124000}, {0xc4126000}, {0xc4128000}, {0xc412a000}, {0xc412c000}, {0xc412e000}, {0xc4130000}, {0xc4132000}, {0xc4134000}, {0xc4136000}, {0xc4138000}, {0xc413a000}, {0xc413c000}, {0xc413e000}, {0xc4140000}, {0xc4142000}, {0xc4144000}, {0xc4146000}, {0xc4148000}, {0xc414a000}, {0xc414c000}, {0xc414e000}, {0xc4150000}, {0xc4152000}, {0xc4154000}, {0xc4156000}, {0xc4158000}, {0xc415a000}, {0xc415c000}, {0xc415e000}, {0xc4160000}, {0xc4162000}, {0xc4164000}, {0xc4166000}, {0xc4168000}, {0xc416a000}, {0xc416c000}, {0xc416e000}, {0xc4170000}, {0xc4172000}, {0xc4174000}, {0xc4176000}, {0xc4178000}, {0xc417a000}, {0xc417c000}, {0xc417e000}, {0xc4180000}, {0xc4182000}, {0xc4184000}, {0xc4186000}, {0xc4188000}, {0xc418a000}, {0xc418c000}, {0xc418e000}, {0xc4190000}, {0xc4192000}, {0xc4194000}, {0xc4196000}, {0xc4198000}, {0xc419a000}, {0xc419c000}, {0xc419e000}, {0xc41a0000}, {0xc41a2000}, {0xc41a4000}, {0xc41a6000}, {0xc41a8000}, {0xc41aa000}, {0xc41ac000}, {0xc41ae000}, {0xc41b0000}, {0xc41b2000}, {0xc41b4000}, {0xc41b6000}, {0xc41b8000}, {0xc41ba000}, {0xc41bc000}, {0xc41be000}, {0xc41c0000}, {0xc41c2000}, {0xc41c4000}, {0xc41c6000}, {0xc41c8000}, {0xc41ca000}, {0xc41cc000}, {0xc41ce000}, {0xc41d0000}, {0xc41d2000}, {0xc41d4000}, {0xc41d6000}, {0xc41d8000}, {0xc41da000}, {0xc41dc000}, {0xc41de000}, {0xc41e0000}, {0xc41e2000}, {0xc41e4000}, {0xc41e6000}, {0xc41e8000}, {0xc41ea000}, {0xc41ec000}, {0xc41ee000}, {0xc41f0000}, {0xc41f2000}, {0xc41f4000}, {0xc41f6000}, {0xc41f8000}, {0xc41fa000}, {0xc41fc000}, {0xc41fe000}, {0xc4200000}, {0xc4202000}, {0xc4204000}, {0xc4206000}, {0xc4208000}, {0xc420a000}, {0xc420c000}, {0xc420e000}, {0xc4210000}, {0xc4212000}, {0xc4214000}, {0xc4216000}, {0xc4218000}, {0xc421a000}, {0xc421c000}, {0xc421e000}, {0xc4220000}, {0xc4222000}, {0xc4224000}, {0xc4226000}, {0xc4228000}, {0xc422a000}, {0xc422c000}, {0xc422e000}, {0xc4230000}, {0xc4232000}, {0xc4234000}, {0xc4236000}, {0xc4238000}, {0xc423a000}, {0xc423c000}, {0xc423e000}, {0xc4240000}, {0xc4242000}, {0xc4244000}, {0xc4246000}, {0xc4248000}, {0xc424a000}, {0xc424c000}, {0xc424e000}, {0xc4250000}, {0xc4252000}, {0xc4254000}, {0xc4256000}, {0xc4258000}, {0xc425a000}, {0xc425c000}, {0xc425e000}, {0xc4260000}, {0xc4262000}, {0xc4264000}, {0xc4266000}, {0xc4268000}, {0xc426a000}, {0xc426c000}, {0xc426e000}, {0xc4270000}, {0xc4272000}, {0xc4274000}, {0xc4276000}, {0xc4278000}, {0xc427a000}, {0xc427c000}, {0xc427e000}, {0xc4280000}, {0xc4282000}, {0xc4284000}, {0xc4286000}, {0xc4288000}, {0xc428a000}, {0xc428c000}, {0xc428e000}, {0xc4290000}, {0xc4292000}, {0xc4294000}, {0xc4296000}, {0xc4298000}, {0xc429a000}, {0xc429c000}, {0xc429e000}, {0xc42a0000}, {0xc42a2000}, {0xc42a4000}, {0xc42a6000}, {0xc42a8000}, {0xc42aa000}, {0xc42ac000}, {0xc42ae000}, {0xc42b0000}, {0xc42b2000}, {0xc42b4000}, {0xc42b6000}, {0xc42b8000}, {0xc42ba000}, {0xc42bc000}, {0xc42be000}, {0xc42c0000}, {0xc42c2000}, {0xc42c4000}, {0xc42c6000}, {0xc42c8000}, {0xc42ca000}, {0xc42cc000}, {0xc42ce000}, {0xc42d0000}, {0xc42d2000}, {0xc42d4000}, {0xc42d6000}, {0xc42d8000}, {0xc42da000}, {0xc42dc000}, {0xc42de000}, {0xc42e0000}, {0xc42e2000}, {0xc42e4000}, {0xc42e6000}, {0xc42e8000}, {0xc42ea000}, {0xc42ec000}, {0xc42ee000}, {0xc42f0000}, {0xc42f2000}, {0xc42f4000}, {0xc42f6000}, {0xc42f8000}, {0xc42fa000}, {0xc42fc000}, {0xc42fe000}, {0xc4300000}, {0xc4302000}, {0xc4304000}, {0xc4306000}, {0xc4308000}, {0xc430a000}, {0xc430c000}, {0xc430e000}, {0xc4310000}, {0xc4312000}, {0xc4314000}, {0xc4316000}, {0xc4318000}, {0xc431a000}, {0xc431c000}, {0xc431e000}, {0xc4320000}, {0xc4322000}, {0xc4324000}, {0xc4326000}, {0xc4328000}, {0xc432a000}, {0xc432c000}, {0xc432e000}, {0xc4330000}, {0xc4332000}, {0xc4334000}, {0xc4336000}, {0xc4338000}, {0xc433a000}, {0xc433c000}, {0xc433e000}, {0xc4340000}, {0xc4342000}, {0xc4344000}, {0xc4346000}, {0xc4348000}, {0xc434a000}, {0xc434c000}, {0xc434e000}, {0xc4350000}, {0xc4352000}, {0xc4354000}, {0xc4356000}, {0xc4358000}, {0xc435a000}, {0xc435c000}, {0xc435e000}, {0xc4360000}, {0xc4362000}, {0xc4364000}, {0xc4366000}, {0xc4368000}, {0xc436a000}, {0xc436c000}, {0xc436e000}, {0xc4370000}, {0xc4372000}, {0xc4374000}, {0xc4376000}, {0xc4378000}, {0xc437a000}, {0xc437c000}, {0xc437e000}, {0xc4380000}, {0xc4382000}, {0xc4384000}, {0xc4386000}, {0xc4388000}, {0xc438a000}, {0xc438c000}, {0xc438e000}, {0xc4390000}, {0xc4392000}, {0xc4394000}, {0xc4396000}, {0xc4398000}, {0xc439a000}, {0xc439c000}, {0xc439e000}, {0xc43a0000}, {0xc43a2000}, {0xc43a4000}, {0xc43a6000}, {0xc43a8000}, {0xc43aa000}, {0xc43ac000}, {0xc43ae000}, {0xc43b0000}, {0xc43b2000}, {0xc43b4000}, {0xc43b6000}, {0xc43b8000}, {0xc43ba000}, {0xc43bc000}, {0xc43be000}, {0xc43c0000}, {0xc43c2000}, {0xc43c4000}, {0xc43c6000}, {0xc43c8000}, {0xc43ca000}, {0xc43cc000}, {0xc43ce000}, {0xc43d0000}, {0xc43d2000}, {0xc43d4000}, {0xc43d6000}, {0xc43d8000}, {0xc43da000}, {0xc43dc000}, {0xc43de000}, {0xc43e0000}, {0xc43e2000}, {0xc43e4000}, {0xc43e6000}, {0xc43e8000}, {0xc43ea000}, {0xc43ec000}, {0xc43ee000}, {0xc43f0000}, {0xc43f2000}, {0xc43f4000}, {0xc43f6000}, {0xc43f8000}, {0xc43fa000}, {0xc43fc000}, {0xc43fe000}, {0xc4400000}, {0xc4402000}, {0xc4404000}, {0xc4406000}, {0xc4408000}, {0xc440a000}, {0xc440c000}, {0xc440e000}, {0xc4410000}, {0xc4412000}, {0xc4414000}, {0xc4416000}, {0xc4418000}, {0xc441a000}, {0xc441c000}, {0xc441e000}, {0xc4420000}, {0xc4422000}, {0xc4424000}, {0xc4426000}, {0xc4428000}, {0xc442a000}, {0xc442c000}, {0xc442e000}, {0xc4430000}, {0xc4432000}, {0xc4434000}, {0xc4436000}, {0xc4438000}, {0xc443a000}, {0xc443c000}, {0xc443e000}, {0xc4440000}, {0xc4442000}, {0xc4444000}, {0xc4446000}, {0xc4448000}, {0xc444a000}, {0xc444c000}, {0xc444e000}, {0xc4450000}, {0xc4452000}, {0xc4454000}, {0xc4456000}, {0xc4458000}, {0xc445a000}, {0xc445c000}, {0xc445e000}, {0xc4460000}, {0xc4462000}, {0xc4464000}, {0xc4466000}, {0xc4468000}, {0xc446a000}, {0xc446c000}, {0xc446e000}, {0xc4470000}, {0xc4472000}, {0xc4474000}, {0xc4476000}, {0xc4478000}, {0xc447a000}, {0xc447c000}, {0xc447e000}, {0xc4480000}, {0xc4482000}, {0xc4484000}, {0xc4486000}, {0xc4488000}, {0xc448a000}, {0xc448c000}, {0xc448e000}, {0xc4490000}, {0xc4492000}, {0xc4494000}, {0xc4496000}, {0xc4498000}, {0xc449a000}, {0xc449c000}, {0xc449e000}, {0xc44a0000}, {0xc44a2000}, {0xc44a4000}, {0xc44a6000}, {0xc44a8000}, {0xc44aa000}, {0xc44ac000}, {0xc44ae000}, {0xc44b0000}, {0xc44b2000}, {0xc44b4000}, {0xc44b6000}, {0xc44b8000}, {0xc44ba000}, {0xc44bc000}, {0xc44be000}, {0xc44c0000}, {0xc44c2000}, {0xc44c4000}, {0xc44c6000}, {0xc44c8000}, {0xc44ca000}, {0xc44cc000}, {0xc44ce000}, {0xc44d0000}, {0xc44d2000}, {0xc44d4000}, {0xc44d6000}, {0xc44d8000}, {0xc44da000}, {0xc44dc000}, {0xc44de000}, {0xc44e0000}, {0xc44e2000}, {0xc44e4000}, {0xc44e6000}, {0xc44e8000}, {0xc44ea000}, {0xc44ec000}, {0xc44ee000}, {0xc44f0000}, {0xc44f2000}, {0xc44f4000}, {0xc44f6000}, {0xc44f8000}, {0xc44fa000}, {0xc44fc000}, {0xc44fe000}, {0xc4500000}, {0xc4502000}, {0xc4504000}, {0xc4506000}, {0xc4508000}, {0xc450a000}, {0xc450c000}, {0xc450e000}, {0xc4510000}, {0xc4512000}, {0xc4514000}, {0xc4516000}, {0xc4518000}, {0xc451a000}, {0xc451c000}, {0xc451e000}, {0xc4520000}, {0xc4522000}, {0xc4524000}, {0xc4526000}, {0xc4528000}, {0xc452a000}, {0xc452c000}, {0xc452e000}, {0xc4530000}, {0xc4532000}, {0xc4534000}, {0xc4536000}, {0xc4538000}, {0xc453a000}, {0xc453c000}, {0xc453e000}, {0xc4540000}, {0xc4542000}, {0xc4544000}, {0xc4546000}, {0xc4548000}, {0xc454a000}, {0xc454c000}, {0xc454e000}, {0xc4550000}, {0xc4552000}, {0xc4554000}, {0xc4556000}, {0xc4558000}, {0xc455a000}, {0xc455c000}, {0xc455e000}, {0xc4560000}, {0xc4562000}, {0xc4564000}, {0xc4566000}, {0xc4568000}, {0xc456a000}, {0xc456c000}, {0xc456e000}, {0xc4570000}, {0xc4572000}, {0xc4574000}, {0xc4576000}, {0xc4578000}, {0xc457a000}, {0xc457c000}, {0xc457e000}, {0xc4580000}, {0xc4582000}, {0xc4584000}, {0xc4586000}, {0xc4588000}, {0xc458a000}, {0xc458c000}, {0xc458e000}, {0xc4590000}, {0xc4592000}, {0xc4594000}, {0xc4596000}, {0xc4598000}, {0xc459a000}, {0xc459c000}, {0xc459e000}, {0xc45a0000}, {0xc45a2000}, {0xc45a4000}, {0xc45a6000}, {0xc45a8000}, {0xc45aa000}, {0xc45ac000}, {0xc45ae000}, {0xc45b0000}, {0xc45b2000}, {0xc45b4000}, {0xc45b6000}, {0xc45b8000}, {0xc45ba000}, {0xc45bc000}, {0xc45be000}, {0xc45c0000}, {0xc45c2000}, {0xc45c4000}, {0xc45c6000}, {0xc45c8000}, {0xc45ca000}, {0xc45cc000}, {0xc45ce000}, {0xc45d0000}, {0xc45d2000}, {0xc45d4000}, {0xc45d6000}, {0xc45d8000}, {0xc45da000}, {0xc45dc000}, {0xc45de000}, {0xc45e0000}, {0xc45e2000}, {0xc45e4000}, {0xc45e6000}, {0xc45e8000}, {0xc45ea000}, {0xc45ec000}, {0xc45ee000}, {0xc45f0000}, {0xc45f2000}, {0xc45f4000}, {0xc45f6000}, {0xc45f8000}, {0xc45fa000}, {0xc45fc000}, {0xc45fe000}, {0xc4600000}, {0xc4602000}, {0xc4604000}, {0xc4606000}, {0xc4608000}, {0xc460a000}, {0xc460c000}, {0xc460e000}, {0xc4610000}, {0xc4612000}, {0xc4614000}, {0xc4616000}, {0xc4618000}, {0xc461a000}, {0xc461c000}, {0xc461e000}, {0xc4620000}, {0xc4622000}, {0xc4624000}, {0xc4626000}, {0xc4628000}, {0xc462a000}, {0xc462c000}, {0xc462e000}, {0xc4630000}, {0xc4632000}, {0xc4634000}, {0xc4636000}, {0xc4638000}, {0xc463a000}, {0xc463c000}, {0xc463e000}, {0xc4640000}, {0xc4642000}, {0xc4644000}, {0xc4646000}, {0xc4648000}, {0xc464a000}, {0xc464c000}, {0xc464e000}, {0xc4650000}, {0xc4652000}, {0xc4654000}, {0xc4656000}, {0xc4658000}, {0xc465a000}, {0xc465c000}, {0xc465e000}, {0xc4660000}, {0xc4662000}, {0xc4664000}, {0xc4666000}, {0xc4668000}, {0xc466a000}, {0xc466c000}, {0xc466e000}, {0xc4670000}, {0xc4672000}, {0xc4674000}, {0xc4676000}, {0xc4678000}, {0xc467a000}, {0xc467c000}, {0xc467e000}, {0xc4680000}, {0xc4682000}, {0xc4684000}, {0xc4686000}, {0xc4688000}, {0xc468a000}, {0xc468c000}, {0xc468e000}, {0xc4690000}, {0xc4692000}, {0xc4694000}, {0xc4696000}, {0xc4698000}, {0xc469a000}, {0xc469c000}, {0xc469e000}, {0xc46a0000}, {0xc46a2000}, {0xc46a4000}, {0xc46a6000}, {0xc46a8000}, {0xc46aa000}, {0xc46ac000}, {0xc46ae000}, {0xc46b0000}, {0xc46b2000}, {0xc46b4000}, {0xc46b6000}, {0xc46b8000}, {0xc46ba000}, {0xc46bc000}, {0xc46be000}, {0xc46c0000}, {0xc46c2000}, {0xc46c4000}, {0xc46c6000}, {0xc46c8000}, {0xc46ca000}, {0xc46cc000}, {0xc46ce000}, {0xc46d0000}, {0xc46d2000}, {0xc46d4000}, {0xc46d6000}, {0xc46d8000}, {0xc46da000}, {0xc46dc000}, {0xc46de000}, {0xc46e0000}, {0xc46e2000}, {0xc46e4000}, {0xc46e6000}, {0xc46e8000}, {0xc46ea000}, {0xc46ec000}, {0xc46ee000}, {0xc46f0000}, {0xc46f2000}, {0xc46f4000}, {0xc46f6000}, {0xc46f8000}, {0xc46fa000}, {0xc46fc000}, {0xc46fe000}, {0xc4700000}, {0xc4702000}, {0xc4704000}, {0xc4706000}, {0xc4708000}, {0xc470a000}, {0xc470c000}, {0xc470e000}, {0xc4710000}, {0xc4712000}, {0xc4714000}, {0xc4716000}, {0xc4718000}, {0xc471a000}, {0xc471c000}, {0xc471e000}, {0xc4720000}, {0xc4722000}, {0xc4724000}, {0xc4726000}, {0xc4728000}, {0xc472a000}, {0xc472c000}, {0xc472e000}, {0xc4730000}, {0xc4732000}, {0xc4734000}, {0xc4736000}, {0xc4738000}, {0xc473a000}, {0xc473c000}, {0xc473e000}, {0xc4740000}, {0xc4742000}, {0xc4744000}, {0xc4746000}, {0xc4748000}, {0xc474a000}, {0xc474c000}, {0xc474e000}, {0xc4750000}, {0xc4752000}, {0xc4754000}, {0xc4756000}, {0xc4758000}, {0xc475a000}, {0xc475c000}, {0xc475e000}, {0xc4760000}, {0xc4762000}, {0xc4764000}, {0xc4766000}, {0xc4768000}, {0xc476a000}, {0xc476c000}, {0xc476e000}, {0xc4770000}, {0xc4772000}, {0xc4774000}, {0xc4776000}, {0xc4778000}, {0xc477a000}, {0xc477c000}, {0xc477e000}, {0xc4780000}, {0xc4782000}, {0xc4784000}, {0xc4786000}, {0xc4788000}, {0xc478a000}, {0xc478c000}, {0xc478e000}, {0xc4790000}, {0xc4792000}, {0xc4794000}, {0xc4796000}, {0xc4798000}, {0xc479a000}, {0xc479c000}, {0xc479e000}, {0xc47a0000}, {0xc47a2000}, {0xc47a4000}, {0xc47a6000}, {0xc47a8000}, {0xc47aa000}, {0xc47ac000}, {0xc47ae000}, {0xc47b0000}, {0xc47b2000}, {0xc47b4000}, {0xc47b6000}, {0xc47b8000}, {0xc47ba000}, {0xc47bc000}, {0xc47be000}, {0xc47c0000}, {0xc47c2000}, {0xc47c4000}, {0xc47c6000}, {0xc47c8000}, {0xc47ca000}, {0xc47cc000}, {0xc47ce000}, {0xc47d0000}, {0xc47d2000}, {0xc47d4000}, {0xc47d6000}, {0xc47d8000}, {0xc47da000}, {0xc47dc000}, {0xc47de000}, {0xc47e0000}, {0xc47e2000}, {0xc47e4000}, {0xc47e6000}, {0xc47e8000}, {0xc47ea000}, {0xc47ec000}, {0xc47ee000}, {0xc47f0000}, {0xc47f2000}, {0xc47f4000}, {0xc47f6000}, {0xc47f8000}, {0xc47fa000}, {0xc47fc000}, {0xc47fe000}, {0xc4800000}, {0xc4802000}, {0xc4804000}, {0xc4806000}, {0xc4808000}, {0xc480a000}, {0xc480c000}, {0xc480e000}, {0xc4810000}, {0xc4812000}, {0xc4814000}, {0xc4816000}, {0xc4818000}, {0xc481a000}, {0xc481c000}, {0xc481e000}, {0xc4820000}, {0xc4822000}, {0xc4824000}, {0xc4826000}, {0xc4828000}, {0xc482a000}, {0xc482c000}, {0xc482e000}, {0xc4830000}, {0xc4832000}, {0xc4834000}, {0xc4836000}, {0xc4838000}, {0xc483a000}, {0xc483c000}, {0xc483e000}, {0xc4840000}, {0xc4842000}, {0xc4844000}, {0xc4846000}, {0xc4848000}, {0xc484a000}, {0xc484c000}, {0xc484e000}, {0xc4850000}, {0xc4852000}, {0xc4854000}, {0xc4856000}, {0xc4858000}, {0xc485a000}, {0xc485c000}, {0xc485e000}, {0xc4860000}, {0xc4862000}, {0xc4864000}, {0xc4866000}, {0xc4868000}, {0xc486a000}, {0xc486c000}, {0xc486e000}, {0xc4870000}, {0xc4872000}, {0xc4874000}, {0xc4876000}, {0xc4878000}, {0xc487a000}, {0xc487c000}, {0xc487e000}, {0xc4880000}, {0xc4882000}, {0xc4884000}, {0xc4886000}, {0xc4888000}, {0xc488a000}, {0xc488c000}, {0xc488e000}, {0xc4890000}, {0xc4892000}, {0xc4894000}, {0xc4896000}, {0xc4898000}, {0xc489a000}, {0xc489c000}, {0xc489e000}, {0xc48a0000}, {0xc48a2000}, {0xc48a4000}, {0xc48a6000}, {0xc48a8000}, {0xc48aa000}, {0xc48ac000}, {0xc48ae000}, {0xc48b0000}, {0xc48b2000}, {0xc48b4000}, {0xc48b6000}, {0xc48b8000}, {0xc48ba000}, {0xc48bc000}, {0xc48be000}, {0xc48c0000}, {0xc48c2000}, {0xc48c4000}, {0xc48c6000}, {0xc48c8000}, {0xc48ca000}, {0xc48cc000}, {0xc48ce000}, {0xc48d0000}, {0xc48d2000}, {0xc48d4000}, {0xc48d6000}, {0xc48d8000}, {0xc48da000}, {0xc48dc000}, {0xc48de000}, {0xc48e0000}, {0xc48e2000}, {0xc48e4000}, {0xc48e6000}, {0xc48e8000}, {0xc48ea000}, {0xc48ec000}, {0xc48ee000}, {0xc48f0000}, {0xc48f2000}, {0xc48f4000}, {0xc48f6000}, {0xc48f8000}, {0xc48fa000}, {0xc48fc000}, {0xc48fe000}, {0xc4900000}, {0xc4902000}, {0xc4904000}, {0xc4906000}, {0xc4908000}, {0xc490a000}, {0xc490c000}, {0xc490e000}, {0xc4910000}, {0xc4912000}, {0xc4914000}, {0xc4916000}, {0xc4918000}, {0xc491a000}, {0xc491c000}, {0xc491e000}, {0xc4920000}, {0xc4922000}, {0xc4924000}, {0xc4926000}, {0xc4928000}, {0xc492a000}, {0xc492c000}, {0xc492e000}, {0xc4930000}, {0xc4932000}, {0xc4934000}, {0xc4936000}, {0xc4938000}, {0xc493a000}, {0xc493c000}, {0xc493e000}, {0xc4940000}, {0xc4942000}, {0xc4944000}, {0xc4946000}, {0xc4948000}, {0xc494a000}, {0xc494c000}, {0xc494e000}, {0xc4950000}, {0xc4952000}, {0xc4954000}, {0xc4956000}, {0xc4958000}, {0xc495a000}, {0xc495c000}, {0xc495e000}, {0xc4960000}, {0xc4962000}, {0xc4964000}, {0xc4966000}, {0xc4968000}, {0xc496a000}, {0xc496c000}, {0xc496e000}, {0xc4970000}, {0xc4972000}, {0xc4974000}, {0xc4976000}, {0xc4978000}, {0xc497a000}, {0xc497c000}, {0xc497e000}, {0xc4980000}, {0xc4982000}, {0xc4984000}, {0xc4986000}, {0xc4988000}, {0xc498a000}, {0xc498c000}, {0xc498e000}, {0xc4990000}, {0xc4992000}, {0xc4994000}, {0xc4996000}, {0xc4998000}, {0xc499a000}, {0xc499c000}, {0xc499e000}, {0xc49a0000}, {0xc49a2000}, {0xc49a4000}, {0xc49a6000}, {0xc49a8000}, {0xc49aa000}, {0xc49ac000}, {0xc49ae000}, {0xc49b0000}, {0xc49b2000}, {0xc49b4000}, {0xc49b6000}, {0xc49b8000}, {0xc49ba000}, {0xc49bc000}, {0xc49be000}, {0xc49c0000}, {0xc49c2000}, {0xc49c4000}, {0xc49c6000}, {0xc49c8000}, {0xc49ca000}, {0xc49cc000}, {0xc49ce000}, {0xc49d0000}, {0xc49d2000}, {0xc49d4000}, {0xc49d6000}, {0xc49d8000}, {0xc49da000}, {0xc49dc000}, {0xc49de000}, {0xc49e0000}, {0xc49e2000}, {0xc49e4000}, {0xc49e6000}, {0xc49e8000}, {0xc49ea000}, {0xc49ec000}, {0xc49ee000}, {0xc49f0000}, {0xc49f2000}, {0xc49f4000}, {0xc49f6000}, {0xc49f8000}, {0xc49fa000}, {0xc49fc000}, {0xc49fe000}, {0xc4a00000}, {0xc4a02000}, {0xc4a04000}, {0xc4a06000}, {0xc4a08000}, {0xc4a0a000}, {0xc4a0c000}, {0xc4a0e000}, {0xc4a10000}, {0xc4a12000}, {0xc4a14000}, {0xc4a16000}, {0xc4a18000}, {0xc4a1a000}, {0xc4a1c000}, {0xc4a1e000}, {0xc4a20000}, {0xc4a22000}, {0xc4a24000}, {0xc4a26000}, {0xc4a28000}, {0xc4a2a000}, {0xc4a2c000}, {0xc4a2e000}, {0xc4a30000}, {0xc4a32000}, {0xc4a34000}, {0xc4a36000}, {0xc4a38000}, {0xc4a3a000}, {0xc4a3c000}, {0xc4a3e000}, {0xc4a40000}, {0xc4a42000}, {0xc4a44000}, {0xc4a46000}, {0xc4a48000}, {0xc4a4a000}, {0xc4a4c000}, {0xc4a4e000}, {0xc4a50000}, {0xc4a52000}, {0xc4a54000}, {0xc4a56000}, {0xc4a58000}, {0xc4a5a000}, {0xc4a5c000}, {0xc4a5e000}, {0xc4a60000}, {0xc4a62000}, {0xc4a64000}, {0xc4a66000}, {0xc4a68000}, {0xc4a6a000}, {0xc4a6c000}, {0xc4a6e000}, {0xc4a70000}, {0xc4a72000}, {0xc4a74000}, {0xc4a76000}, {0xc4a78000}, {0xc4a7a000}, {0xc4a7c000}, {0xc4a7e000}, {0xc4a80000}, {0xc4a82000}, {0xc4a84000}, {0xc4a86000}, {0xc4a88000}, {0xc4a8a000}, {0xc4a8c000}, {0xc4a8e000}, {0xc4a90000}, {0xc4a92000}, {0xc4a94000}, {0xc4a96000}, {0xc4a98000}, {0xc4a9a000}, {0xc4a9c000}, {0xc4a9e000}, {0xc4aa0000}, {0xc4aa2000}, {0xc4aa4000}, {0xc4aa6000}, {0xc4aa8000}, {0xc4aaa000}, {0xc4aac000}, {0xc4aae000}, {0xc4ab0000}, {0xc4ab2000}, {0xc4ab4000}, {0xc4ab6000}, {0xc4ab8000}, {0xc4aba000}, {0xc4abc000}, {0xc4abe000}, {0xc4ac0000}, {0xc4ac2000}, {0xc4ac4000}, {0xc4ac6000}, {0xc4ac8000}, {0xc4aca000}, {0xc4acc000}, {0xc4ace000}, {0xc4ad0000}, {0xc4ad2000}, {0xc4ad4000}, {0xc4ad6000}, {0xc4ad8000}, {0xc4ada000}, {0xc4adc000}, {0xc4ade000}, {0xc4ae0000}, {0xc4ae2000}, {0xc4ae4000}, {0xc4ae6000}, {0xc4ae8000}, {0xc4aea000}, {0xc4aec000}, {0xc4aee000}, {0xc4af0000}, {0xc4af2000}, {0xc4af4000}, {0xc4af6000}, {0xc4af8000}, {0xc4afa000}, {0xc4afc000}, {0xc4afe000}, {0xc4b00000}, {0xc4b02000}, {0xc4b04000}, {0xc4b06000}, {0xc4b08000}, {0xc4b0a000}, {0xc4b0c000}, {0xc4b0e000}, {0xc4b10000}, {0xc4b12000}, {0xc4b14000}, {0xc4b16000}, {0xc4b18000}, {0xc4b1a000}, {0xc4b1c000}, {0xc4b1e000}, {0xc4b20000}, {0xc4b22000}, {0xc4b24000}, {0xc4b26000}, {0xc4b28000}, {0xc4b2a000}, {0xc4b2c000}, {0xc4b2e000}, {0xc4b30000}, {0xc4b32000}, {0xc4b34000}, {0xc4b36000}, {0xc4b38000}, {0xc4b3a000}, {0xc4b3c000}, {0xc4b3e000}, {0xc4b40000}, {0xc4b42000}, {0xc4b44000}, {0xc4b46000}, {0xc4b48000}, {0xc4b4a000}, {0xc4b4c000}, {0xc4b4e000}, {0xc4b50000}, {0xc4b52000}, {0xc4b54000}, {0xc4b56000}, {0xc4b58000}, {0xc4b5a000}, {0xc4b5c000}, {0xc4b5e000}, {0xc4b60000}, {0xc4b62000}, {0xc4b64000}, {0xc4b66000}, {0xc4b68000}, {0xc4b6a000}, {0xc4b6c000}, {0xc4b6e000}, {0xc4b70000}, {0xc4b72000}, {0xc4b74000}, {0xc4b76000}, {0xc4b78000}, {0xc4b7a000}, {0xc4b7c000}, {0xc4b7e000}, {0xc4b80000}, {0xc4b82000}, {0xc4b84000}, {0xc4b86000}, {0xc4b88000}, {0xc4b8a000}, {0xc4b8c000}, {0xc4b8e000}, {0xc4b90000}, {0xc4b92000}, {0xc4b94000}, {0xc4b96000}, {0xc4b98000}, {0xc4b9a000}, {0xc4b9c000}, {0xc4b9e000}, {0xc4ba0000}, {0xc4ba2000}, {0xc4ba4000}, {0xc4ba6000}, {0xc4ba8000}, {0xc4baa000}, {0xc4bac000}, {0xc4bae000}, {0xc4bb0000}, {0xc4bb2000}, {0xc4bb4000}, {0xc4bb6000}, {0xc4bb8000}, {0xc4bba000}, {0xc4bbc000}, {0xc4bbe000}, {0xc4bc0000}, {0xc4bc2000}, {0xc4bc4000}, {0xc4bc6000}, {0xc4bc8000}, {0xc4bca000}, {0xc4bcc000}, {0xc4bce000}, {0xc4bd0000}, {0xc4bd2000}, {0xc4bd4000}, {0xc4bd6000}, {0xc4bd8000}, {0xc4bda000}, {0xc4bdc000}, {0xc4bde000}, {0xc4be0000}, {0xc4be2000}, {0xc4be4000}, {0xc4be6000}, {0xc4be8000}, {0xc4bea000}, {0xc4bec000}, {0xc4bee000}, {0xc4bf0000}, {0xc4bf2000}, {0xc4bf4000}, {0xc4bf6000}, {0xc4bf8000}, {0xc4bfa000}, {0xc4bfc000}, {0xc4bfe000}, {0xc4c00000}, {0xc4c02000}, {0xc4c04000}, {0xc4c06000}, {0xc4c08000}, {0xc4c0a000}, {0xc4c0c000}, {0xc4c0e000}, {0xc4c10000}, {0xc4c12000}, {0xc4c14000}, {0xc4c16000}, {0xc4c18000}, {0xc4c1a000}, {0xc4c1c000}, {0xc4c1e000}, {0xc4c20000}, {0xc4c22000}, {0xc4c24000}, {0xc4c26000}, {0xc4c28000}, {0xc4c2a000}, {0xc4c2c000}, {0xc4c2e000}, {0xc4c30000}, {0xc4c32000}, {0xc4c34000}, {0xc4c36000}, {0xc4c38000}, {0xc4c3a000}, {0xc4c3c000}, {0xc4c3e000}, {0xc4c40000}, {0xc4c42000}, {0xc4c44000}, {0xc4c46000}, {0xc4c48000}, {0xc4c4a000}, {0xc4c4c000}, {0xc4c4e000}, {0xc4c50000}, {0xc4c52000}, {0xc4c54000}, {0xc4c56000}, {0xc4c58000}, {0xc4c5a000}, {0xc4c5c000}, {0xc4c5e000}, {0xc4c60000}, {0xc4c62000}, {0xc4c64000}, {0xc4c66000}, {0xc4c68000}, {0xc4c6a000}, {0xc4c6c000}, {0xc4c6e000}, {0xc4c70000}, {0xc4c72000}, {0xc4c74000}, {0xc4c76000}, {0xc4c78000}, {0xc4c7a000}, {0xc4c7c000}, {0xc4c7e000}, {0xc4c80000}, {0xc4c82000}, {0xc4c84000}, {0xc4c86000}, {0xc4c88000}, {0xc4c8a000}, {0xc4c8c000}, {0xc4c8e000}, {0xc4c90000}, {0xc4c92000}, {0xc4c94000}, {0xc4c96000}, {0xc4c98000}, {0xc4c9a000}, {0xc4c9c000}, {0xc4c9e000}, {0xc4ca0000}, {0xc4ca2000}, {0xc4ca4000}, {0xc4ca6000}, {0xc4ca8000}, {0xc4caa000}, {0xc4cac000}, {0xc4cae000}, {0xc4cb0000}, {0xc4cb2000}, {0xc4cb4000}, {0xc4cb6000}, {0xc4cb8000}, {0xc4cba000}, {0xc4cbc000}, {0xc4cbe000}, {0xc4cc0000}, {0xc4cc2000}, {0xc4cc4000}, {0xc4cc6000}, {0xc4cc8000}, {0xc4cca000}, {0xc4ccc000}, {0xc4cce000}, {0xc4cd0000}, {0xc4cd2000}, {0xc4cd4000}, {0xc4cd6000}, {0xc4cd8000}, {0xc4cda000}, {0xc4cdc000}, {0xc4cde000}, {0xc4ce0000}, {0xc4ce2000}, {0xc4ce4000}, {0xc4ce6000}, {0xc4ce8000}, {0xc4cea000}, {0xc4cec000}, {0xc4cee000}, {0xc4cf0000}, {0xc4cf2000}, {0xc4cf4000}, {0xc4cf6000}, {0xc4cf8000}, {0xc4cfa000}, {0xc4cfc000}, {0xc4cfe000}, {0xc4d00000}, {0xc4d02000}, {0xc4d04000}, {0xc4d06000}, {0xc4d08000}, {0xc4d0a000}, {0xc4d0c000}, {0xc4d0e000}, {0xc4d10000}, {0xc4d12000}, {0xc4d14000}, {0xc4d16000}, {0xc4d18000}, {0xc4d1a000}, {0xc4d1c000}, {0xc4d1e000}, {0xc4d20000}, {0xc4d22000}, {0xc4d24000}, {0xc4d26000}, {0xc4d28000}, {0xc4d2a000}, {0xc4d2c000}, {0xc4d2e000}, {0xc4d30000}, {0xc4d32000}, {0xc4d34000}, {0xc4d36000}, {0xc4d38000}, {0xc4d3a000}, {0xc4d3c000}, {0xc4d3e000}, {0xc4d40000}, {0xc4d42000}, {0xc4d44000}, {0xc4d46000}, {0xc4d48000}, {0xc4d4a000}, {0xc4d4c000}, {0xc4d4e000}, {0xc4d50000}, {0xc4d52000}, {0xc4d54000}, {0xc4d56000}, {0xc4d58000}, {0xc4d5a000}, {0xc4d5c000}, {0xc4d5e000}, {0xc4d60000}, {0xc4d62000}, {0xc4d64000}, {0xc4d66000}, {0xc4d68000}, {0xc4d6a000}, {0xc4d6c000}, {0xc4d6e000}, {0xc4d70000}, {0xc4d72000}, {0xc4d74000}, {0xc4d76000}, {0xc4d78000}, {0xc4d7a000}, {0xc4d7c000}, {0xc4d7e000}, {0xc4d80000}, {0xc4d82000}, {0xc4d84000}, {0xc4d86000}, {0xc4d88000}, {0xc4d8a000}, {0xc4d8c000}, {0xc4d8e000}, {0xc4d90000}, {0xc4d92000}, {0xc4d94000}, {0xc4d96000}, {0xc4d98000}, {0xc4d9a000}, {0xc4d9c000}, {0xc4d9e000}, {0xc4da0000}, {0xc4da2000}, {0xc4da4000}, {0xc4da6000}, {0xc4da8000}, {0xc4daa000}, {0xc4dac000}, {0xc4dae000}, {0xc4db0000}, {0xc4db2000}, {0xc4db4000}, {0xc4db6000}, {0xc4db8000}, {0xc4dba000}, {0xc4dbc000}, {0xc4dbe000}, {0xc4dc0000}, {0xc4dc2000}, {0xc4dc4000}, {0xc4dc6000}, {0xc4dc8000}, {0xc4dca000}, {0xc4dcc000}, {0xc4dce000}, {0xc4dd0000}, {0xc4dd2000}, {0xc4dd4000}, {0xc4dd6000}, {0xc4dd8000}, {0xc4dda000}, {0xc4ddc000}, {0xc4dde000}, {0xc4de0000}, {0xc4de2000}, {0xc4de4000}, {0xc4de6000}, {0xc4de8000}, {0xc4dea000}, {0xc4dec000}, {0xc4dee000}, {0xc4df0000}, {0xc4df2000}, {0xc4df4000}, {0xc4df6000}, {0xc4df8000}, {0xc4dfa000}, {0xc4dfc000}, {0xc4dfe000}, {0xc4e00000}, {0xc4e02000}, {0xc4e04000}, {0xc4e06000}, {0xc4e08000}, {0xc4e0a000}, {0xc4e0c000}, {0xc4e0e000}, {0xc4e10000}, {0xc4e12000}, {0xc4e14000}, {0xc4e16000}, {0xc4e18000}, {0xc4e1a000}, {0xc4e1c000}, {0xc4e1e000}, {0xc4e20000}, {0xc4e22000}, {0xc4e24000}, {0xc4e26000}, {0xc4e28000}, {0xc4e2a000}, {0xc4e2c000}, {0xc4e2e000}, {0xc4e30000}, {0xc4e32000}, {0xc4e34000}, {0xc4e36000}, {0xc4e38000}, {0xc4e3a000}, {0xc4e3c000}, {0xc4e3e000}, {0xc4e40000}, {0xc4e42000}, {0xc4e44000}, {0xc4e46000}, {0xc4e48000}, {0xc4e4a000}, {0xc4e4c000}, {0xc4e4e000}, {0xc4e50000}, {0xc4e52000}, {0xc4e54000}, {0xc4e56000}, {0xc4e58000}, {0xc4e5a000}, {0xc4e5c000}, {0xc4e5e000}, {0xc4e60000}, {0xc4e62000}, {0xc4e64000}, {0xc4e66000}, {0xc4e68000}, {0xc4e6a000}, {0xc4e6c000}, {0xc4e6e000}, {0xc4e70000}, {0xc4e72000}, {0xc4e74000}, {0xc4e76000}, {0xc4e78000}, {0xc4e7a000}, {0xc4e7c000}, {0xc4e7e000}, {0xc4e80000}, {0xc4e82000}, {0xc4e84000}, {0xc4e86000}, {0xc4e88000}, {0xc4e8a000}, {0xc4e8c000}, {0xc4e8e000}, {0xc4e90000}, {0xc4e92000}, {0xc4e94000}, {0xc4e96000}, {0xc4e98000}, {0xc4e9a000}, {0xc4e9c000}, {0xc4e9e000}, {0xc4ea0000}, {0xc4ea2000}, {0xc4ea4000}, {0xc4ea6000}, {0xc4ea8000}, {0xc4eaa000}, {0xc4eac000}, {0xc4eae000}, {0xc4eb0000}, {0xc4eb2000}, {0xc4eb4000}, {0xc4eb6000}, {0xc4eb8000}, {0xc4eba000}, {0xc4ebc000}, {0xc4ebe000}, {0xc4ec0000}, {0xc4ec2000}, {0xc4ec4000}, {0xc4ec6000}, {0xc4ec8000}, {0xc4eca000}, {0xc4ecc000}, {0xc4ece000}, {0xc4ed0000}, {0xc4ed2000}, {0xc4ed4000}, {0xc4ed6000}, {0xc4ed8000}, {0xc4eda000}, {0xc4edc000}, {0xc4ede000}, {0xc4ee0000}, {0xc4ee2000}, {0xc4ee4000}, {0xc4ee6000}, {0xc4ee8000}, {0xc4eea000}, {0xc4eec000}, {0xc4eee000}, {0xc4ef0000}, {0xc4ef2000}, {0xc4ef4000}, {0xc4ef6000}, {0xc4ef8000}, {0xc4efa000}, {0xc4efc000}, {0xc4efe000}, {0xc4f00000}, {0xc4f02000}, {0xc4f04000}, {0xc4f06000}, {0xc4f08000}, {0xc4f0a000}, {0xc4f0c000}, {0xc4f0e000}, {0xc4f10000}, {0xc4f12000}, {0xc4f14000}, {0xc4f16000}, {0xc4f18000}, {0xc4f1a000}, {0xc4f1c000}, {0xc4f1e000}, {0xc4f20000}, {0xc4f22000}, {0xc4f24000}, {0xc4f26000}, {0xc4f28000}, {0xc4f2a000}, {0xc4f2c000}, {0xc4f2e000}, {0xc4f30000}, {0xc4f32000}, {0xc4f34000}, {0xc4f36000}, {0xc4f38000}, {0xc4f3a000}, {0xc4f3c000}, {0xc4f3e000}, {0xc4f40000}, {0xc4f42000}, {0xc4f44000}, {0xc4f46000}, {0xc4f48000}, {0xc4f4a000}, {0xc4f4c000}, {0xc4f4e000}, {0xc4f50000}, {0xc4f52000}, {0xc4f54000}, {0xc4f56000}, {0xc4f58000}, {0xc4f5a000}, {0xc4f5c000}, {0xc4f5e000}, {0xc4f60000}, {0xc4f62000}, {0xc4f64000}, {0xc4f66000}, {0xc4f68000}, {0xc4f6a000}, {0xc4f6c000}, {0xc4f6e000}, {0xc4f70000}, {0xc4f72000}, {0xc4f74000}, {0xc4f76000}, {0xc4f78000}, {0xc4f7a000}, {0xc4f7c000}, {0xc4f7e000}, {0xc4f80000}, {0xc4f82000}, {0xc4f84000}, {0xc4f86000}, {0xc4f88000}, {0xc4f8a000}, {0xc4f8c000}, {0xc4f8e000}, {0xc4f90000}, {0xc4f92000}, {0xc4f94000}, {0xc4f96000}, {0xc4f98000}, {0xc4f9a000}, {0xc4f9c000}, {0xc4f9e000}, {0xc4fa0000}, {0xc4fa2000}, {0xc4fa4000}, {0xc4fa6000}, {0xc4fa8000}, {0xc4faa000}, {0xc4fac000}, {0xc4fae000}, {0xc4fb0000}, {0xc4fb2000}, {0xc4fb4000}, {0xc4fb6000}, {0xc4fb8000}, {0xc4fba000}, {0xc4fbc000}, {0xc4fbe000}, {0xc4fc0000}, {0xc4fc2000}, {0xc4fc4000}, {0xc4fc6000}, {0xc4fc8000}, {0xc4fca000}, {0xc4fcc000}, {0xc4fce000}, {0xc4fd0000}, {0xc4fd2000}, {0xc4fd4000}, {0xc4fd6000}, {0xc4fd8000}, {0xc4fda000}, {0xc4fdc000}, {0xc4fde000}, {0xc4fe0000}, {0xc4fe2000}, {0xc4fe4000}, {0xc4fe6000}, {0xc4fe8000}, {0xc4fea000}, {0xc4fec000}, {0xc4fee000}, {0xc4ff0000}, {0xc4ff2000}, {0xc4ff4000}, {0xc4ff6000}, {0xc4ff8000}, {0xc4ffa000}, {0xc4ffc000}, {0xc4ffe000}, {0xc5000000}, {0xc5002000}, {0xc5004000}, {0xc5006000}, {0xc5008000}, {0xc500a000}, {0xc500c000}, {0xc500e000}, {0xc5010000}, {0xc5012000}, {0xc5014000}, {0xc5016000}, {0xc5018000}, {0xc501a000}, {0xc501c000}, {0xc501e000}, {0xc5020000}, {0xc5022000}, {0xc5024000}, {0xc5026000}, {0xc5028000}, {0xc502a000}, {0xc502c000}, {0xc502e000}, {0xc5030000}, {0xc5032000}, {0xc5034000}, {0xc5036000}, {0xc5038000}, {0xc503a000}, {0xc503c000}, {0xc503e000}, {0xc5040000}, {0xc5042000}, {0xc5044000}, {0xc5046000}, {0xc5048000}, {0xc504a000}, {0xc504c000}, {0xc504e000}, {0xc5050000}, {0xc5052000}, {0xc5054000}, {0xc5056000}, {0xc5058000}, {0xc505a000}, {0xc505c000}, {0xc505e000}, {0xc5060000}, {0xc5062000}, {0xc5064000}, {0xc5066000}, {0xc5068000}, {0xc506a000}, {0xc506c000}, {0xc506e000}, {0xc5070000}, {0xc5072000}, {0xc5074000}, {0xc5076000}, {0xc5078000}, {0xc507a000}, {0xc507c000}, {0xc507e000}, {0xc5080000}, {0xc5082000}, {0xc5084000}, {0xc5086000}, {0xc5088000}, {0xc508a000}, {0xc508c000}, {0xc508e000}, {0xc5090000}, {0xc5092000}, {0xc5094000}, {0xc5096000}, {0xc5098000}, {0xc509a000}, {0xc509c000}, {0xc509e000}, {0xc50a0000}, {0xc50a2000}, {0xc50a4000}, {0xc50a6000}, {0xc50a8000}, {0xc50aa000}, {0xc50ac000}, {0xc50ae000}, {0xc50b0000}, {0xc50b2000}, {0xc50b4000}, {0xc50b6000}, {0xc50b8000}, {0xc50ba000}, {0xc50bc000}, {0xc50be000}, {0xc50c0000}, {0xc50c2000}, {0xc50c4000}, {0xc50c6000}, {0xc50c8000}, {0xc50ca000}, {0xc50cc000}, {0xc50ce000}, {0xc50d0000}, {0xc50d2000}, {0xc50d4000}, {0xc50d6000}, {0xc50d8000}, {0xc50da000}, {0xc50dc000}, {0xc50de000}, {0xc50e0000}, {0xc50e2000}, {0xc50e4000}, {0xc50e6000}, {0xc50e8000}, {0xc50ea000}, {0xc50ec000}, {0xc50ee000}, {0xc50f0000}, {0xc50f2000}, {0xc50f4000}, {0xc50f6000}, {0xc50f8000}, {0xc50fa000}, {0xc50fc000}, {0xc50fe000}, {0xc5100000}, {0xc5102000}, {0xc5104000}, {0xc5106000}, {0xc5108000}, {0xc510a000}, {0xc510c000}, {0xc510e000}, {0xc5110000}, {0xc5112000}, {0xc5114000}, {0xc5116000}, {0xc5118000}, {0xc511a000}, {0xc511c000}, {0xc511e000}, {0xc5120000}, {0xc5122000}, {0xc5124000}, {0xc5126000}, {0xc5128000}, {0xc512a000}, {0xc512c000}, {0xc512e000}, {0xc5130000}, {0xc5132000}, {0xc5134000}, {0xc5136000}, {0xc5138000}, {0xc513a000}, {0xc513c000}, {0xc513e000}, {0xc5140000}, {0xc5142000}, {0xc5144000}, {0xc5146000}, {0xc5148000}, {0xc514a000}, {0xc514c000}, {0xc514e000}, {0xc5150000}, {0xc5152000}, {0xc5154000}, {0xc5156000}, {0xc5158000}, {0xc515a000}, {0xc515c000}, {0xc515e000}, {0xc5160000}, {0xc5162000}, {0xc5164000}, {0xc5166000}, {0xc5168000}, {0xc516a000}, {0xc516c000}, {0xc516e000}, {0xc5170000}, {0xc5172000}, {0xc5174000}, {0xc5176000}, {0xc5178000}, {0xc517a000}, {0xc517c000}, {0xc517e000}, {0xc5180000}, {0xc5182000}, {0xc5184000}, {0xc5186000}, {0xc5188000}, {0xc518a000}, {0xc518c000}, {0xc518e000}, {0xc5190000}, {0xc5192000}, {0xc5194000}, {0xc5196000}, {0xc5198000}, {0xc519a000}, {0xc519c000}, {0xc519e000}, {0xc51a0000}, {0xc51a2000}, {0xc51a4000}, {0xc51a6000}, {0xc51a8000}, {0xc51aa000}, {0xc51ac000}, {0xc51ae000}, {0xc51b0000}, {0xc51b2000}, {0xc51b4000}, {0xc51b6000}, {0xc51b8000}, {0xc51ba000}, {0xc51bc000}, {0xc51be000}, {0xc51c0000}, {0xc51c2000}, {0xc51c4000}, {0xc51c6000}, {0xc51c8000}, {0xc51ca000}, {0xc51cc000}, {0xc51ce000}, {0xc51d0000}, {0xc51d2000}, {0xc51d4000}, {0xc51d6000}, {0xc51d8000}, {0xc51da000}, {0xc51dc000}, {0xc51de000}, {0xc51e0000}, {0xc51e2000}, {0xc51e4000}, {0xc51e6000}, {0xc51e8000}, {0xc51ea000}, {0xc51ec000}, {0xc51ee000}, {0xc51f0000}, {0xc51f2000}, {0xc51f4000}, {0xc51f6000}, {0xc51f8000}, {0xc51fa000}, {0xc51fc000}, {0xc51fe000}, {0xc5200000}, {0xc5202000}, {0xc5204000}, {0xc5206000}, {0xc5208000}, {0xc520a000}, {0xc520c000}, {0xc520e000}, {0xc5210000}, {0xc5212000}, {0xc5214000}, {0xc5216000}, {0xc5218000}, {0xc521a000}, {0xc521c000}, {0xc521e000}, {0xc5220000}, {0xc5222000}, {0xc5224000}, {0xc5226000}, {0xc5228000}, {0xc522a000}, {0xc522c000}, {0xc522e000}, {0xc5230000}, {0xc5232000}, {0xc5234000}, {0xc5236000}, {0xc5238000}, {0xc523a000}, {0xc523c000}, {0xc523e000}, {0xc5240000}, {0xc5242000}, {0xc5244000}, {0xc5246000}, {0xc5248000}, {0xc524a000}, {0xc524c000}, {0xc524e000}, {0xc5250000}, {0xc5252000}, {0xc5254000}, {0xc5256000}, {0xc5258000}, {0xc525a000}, {0xc525c000}, {0xc525e000}, {0xc5260000}, {0xc5262000}, {0xc5264000}, {0xc5266000}, {0xc5268000}, {0xc526a000}, {0xc526c000}, {0xc526e000}, {0xc5270000}, {0xc5272000}, {0xc5274000}, {0xc5276000}, {0xc5278000}, {0xc527a000}, {0xc527c000}, {0xc527e000}, {0xc5280000}, {0xc5282000}, {0xc5284000}, {0xc5286000}, {0xc5288000}, {0xc528a000}, {0xc528c000}, {0xc528e000}, {0xc5290000}, {0xc5292000}, {0xc5294000}, {0xc5296000}, {0xc5298000}, {0xc529a000}, {0xc529c000}, {0xc529e000}, {0xc52a0000}, {0xc52a2000}, {0xc52a4000}, {0xc52a6000}, {0xc52a8000}, {0xc52aa000}, {0xc52ac000}, {0xc52ae000}, {0xc52b0000}, {0xc52b2000}, {0xc52b4000}, {0xc52b6000}, {0xc52b8000}, {0xc52ba000}, {0xc52bc000}, {0xc52be000}, {0xc52c0000}, {0xc52c2000}, {0xc52c4000}, {0xc52c6000}, {0xc52c8000}, {0xc52ca000}, {0xc52cc000}, {0xc52ce000}, {0xc52d0000}, {0xc52d2000}, {0xc52d4000}, {0xc52d6000}, {0xc52d8000}, {0xc52da000}, {0xc52dc000}, {0xc52de000}, {0xc52e0000}, {0xc52e2000}, {0xc52e4000}, {0xc52e6000}, {0xc52e8000}, {0xc52ea000}, {0xc52ec000}, {0xc52ee000}, {0xc52f0000}, {0xc52f2000}, {0xc52f4000}, {0xc52f6000}, {0xc52f8000}, {0xc52fa000}, {0xc52fc000}, {0xc52fe000}, {0xc5300000}, {0xc5302000}, {0xc5304000}, {0xc5306000}, {0xc5308000}, {0xc530a000}, {0xc530c000}, {0xc530e000}, {0xc5310000}, {0xc5312000}, {0xc5314000}, {0xc5316000}, {0xc5318000}, {0xc531a000}, {0xc531c000}, {0xc531e000}, {0xc5320000}, {0xc5322000}, {0xc5324000}, {0xc5326000}, {0xc5328000}, {0xc532a000}, {0xc532c000}, {0xc532e000}, {0xc5330000}, {0xc5332000}, {0xc5334000}, {0xc5336000}, {0xc5338000}, {0xc533a000}, {0xc533c000}, {0xc533e000}, {0xc5340000}, {0xc5342000}, {0xc5344000}, {0xc5346000}, {0xc5348000}, {0xc534a000}, {0xc534c000}, {0xc534e000}, {0xc5350000}, {0xc5352000}, {0xc5354000}, {0xc5356000}, {0xc5358000}, {0xc535a000}, {0xc535c000}, {0xc535e000}, {0xc5360000}, {0xc5362000}, {0xc5364000}, {0xc5366000}, {0xc5368000}, {0xc536a000}, {0xc536c000}, {0xc536e000}, {0xc5370000}, {0xc5372000}, {0xc5374000}, {0xc5376000}, {0xc5378000}, {0xc537a000}, {0xc537c000}, {0xc537e000}, {0xc5380000}, {0xc5382000}, {0xc5384000}, {0xc5386000}, {0xc5388000}, {0xc538a000}, {0xc538c000}, {0xc538e000}, {0xc5390000}, {0xc5392000}, {0xc5394000}, {0xc5396000}, {0xc5398000}, {0xc539a000}, {0xc539c000}, {0xc539e000}, {0xc53a0000}, {0xc53a2000}, {0xc53a4000}, {0xc53a6000}, {0xc53a8000}, {0xc53aa000}, {0xc53ac000}, {0xc53ae000}, {0xc53b0000}, {0xc53b2000}, {0xc53b4000}, {0xc53b6000}, {0xc53b8000}, {0xc53ba000}, {0xc53bc000}, {0xc53be000}, {0xc53c0000}, {0xc53c2000}, {0xc53c4000}, {0xc53c6000}, {0xc53c8000}, {0xc53ca000}, {0xc53cc000}, {0xc53ce000}, {0xc53d0000}, {0xc53d2000}, {0xc53d4000}, {0xc53d6000}, {0xc53d8000}, {0xc53da000}, {0xc53dc000}, {0xc53de000}, {0xc53e0000}, {0xc53e2000}, {0xc53e4000}, {0xc53e6000}, {0xc53e8000}, {0xc53ea000}, {0xc53ec000}, {0xc53ee000}, {0xc53f0000}, {0xc53f2000}, {0xc53f4000}, {0xc53f6000}, {0xc53f8000}, {0xc53fa000}, {0xc53fc000}, {0xc53fe000}, {0xc5400000}, {0xc5402000}, {0xc5404000}, {0xc5406000}, {0xc5408000}, {0xc540a000}, {0xc540c000}, {0xc540e000}, {0xc5410000}, {0xc5412000}, {0xc5414000}, {0xc5416000}, {0xc5418000}, {0xc541a000}, {0xc541c000}, {0xc541e000}, {0xc5420000}, {0xc5422000}, {0xc5424000}, {0xc5426000}, {0xc5428000}, {0xc542a000}, {0xc542c000}, {0xc542e000}, {0xc5430000}, {0xc5432000}, {0xc5434000}, {0xc5436000}, {0xc5438000}, {0xc543a000}, {0xc543c000}, {0xc543e000}, {0xc5440000}, {0xc5442000}, {0xc5444000}, {0xc5446000}, {0xc5448000}, {0xc544a000}, {0xc544c000}, {0xc544e000}, {0xc5450000}, {0xc5452000}, {0xc5454000}, {0xc5456000}, {0xc5458000}, {0xc545a000}, {0xc545c000}, {0xc545e000}, {0xc5460000}, {0xc5462000}, {0xc5464000}, {0xc5466000}, {0xc5468000}, {0xc546a000}, {0xc546c000}, {0xc546e000}, {0xc5470000}, {0xc5472000}, {0xc5474000}, {0xc5476000}, {0xc5478000}, {0xc547a000}, {0xc547c000}, {0xc547e000}, {0xc5480000}, {0xc5482000}, {0xc5484000}, {0xc5486000}, {0xc5488000}, {0xc548a000}, {0xc548c000}, {0xc548e000}, {0xc5490000}, {0xc5492000}, {0xc5494000}, {0xc5496000}, {0xc5498000}, {0xc549a000}, {0xc549c000}, {0xc549e000}, {0xc54a0000}, {0xc54a2000}, {0xc54a4000}, {0xc54a6000}, {0xc54a8000}, {0xc54aa000}, {0xc54ac000}, {0xc54ae000}, {0xc54b0000}, {0xc54b2000}, {0xc54b4000}, {0xc54b6000}, {0xc54b8000}, {0xc54ba000}, {0xc54bc000}, {0xc54be000}, {0xc54c0000}, {0xc54c2000}, {0xc54c4000}, {0xc54c6000}, {0xc54c8000}, {0xc54ca000}, {0xc54cc000}, {0xc54ce000}, {0xc54d0000}, {0xc54d2000}, {0xc54d4000}, {0xc54d6000}, {0xc54d8000}, {0xc54da000}, {0xc54dc000}, {0xc54de000}, {0xc54e0000}, {0xc54e2000}, {0xc54e4000}, {0xc54e6000}, {0xc54e8000}, {0xc54ea000}, {0xc54ec000}, {0xc54ee000}, {0xc54f0000}, {0xc54f2000}, {0xc54f4000}, {0xc54f6000}, {0xc54f8000}, {0xc54fa000}, {0xc54fc000}, {0xc54fe000}, {0xc5500000}, {0xc5502000}, {0xc5504000}, {0xc5506000}, {0xc5508000}, {0xc550a000}, {0xc550c000}, {0xc550e000}, {0xc5510000}, {0xc5512000}, {0xc5514000}, {0xc5516000}, {0xc5518000}, {0xc551a000}, {0xc551c000}, {0xc551e000}, {0xc5520000}, {0xc5522000}, {0xc5524000}, {0xc5526000}, {0xc5528000}, {0xc552a000}, {0xc552c000}, {0xc552e000}, {0xc5530000}, {0xc5532000}, {0xc5534000}, {0xc5536000}, {0xc5538000}, {0xc553a000}, {0xc553c000}, {0xc553e000}, {0xc5540000}, {0xc5542000}, {0xc5544000}, {0xc5546000}, {0xc5548000}, {0xc554a000}, {0xc554c000}, {0xc554e000}, {0xc5550000}, {0xc5552000}, {0xc5554000}, {0xc5556000}, {0xc5558000}, {0xc555a000}, {0xc555c000}, {0xc555e000}, {0xc5560000}, {0xc5562000}, {0xc5564000}, {0xc5566000}, {0xc5568000}, {0xc556a000}, {0xc556c000}, {0xc556e000}, {0xc5570000}, {0xc5572000}, {0xc5574000}, {0xc5576000}, {0xc5578000}, {0xc557a000}, {0xc557c000}, {0xc557e000}, {0xc5580000}, {0xc5582000}, {0xc5584000}, {0xc5586000}, {0xc5588000}, {0xc558a000}, {0xc558c000}, {0xc558e000}, {0xc5590000}, {0xc5592000}, {0xc5594000}, {0xc5596000}, {0xc5598000}, {0xc559a000}, {0xc559c000}, {0xc559e000}, {0xc55a0000}, {0xc55a2000}, {0xc55a4000}, {0xc55a6000}, {0xc55a8000}, {0xc55aa000}, {0xc55ac000}, {0xc55ae000}, {0xc55b0000}, {0xc55b2000}, {0xc55b4000}, {0xc55b6000}, {0xc55b8000}, {0xc55ba000}, {0xc55bc000}, {0xc55be000}, {0xc55c0000}, {0xc55c2000}, {0xc55c4000}, {0xc55c6000}, {0xc55c8000}, {0xc55ca000}, {0xc55cc000}, {0xc55ce000}, {0xc55d0000}, {0xc55d2000}, {0xc55d4000}, {0xc55d6000}, {0xc55d8000}, {0xc55da000}, {0xc55dc000}, {0xc55de000}, {0xc55e0000}, {0xc55e2000}, {0xc55e4000}, {0xc55e6000}, {0xc55e8000}, {0xc55ea000}, {0xc55ec000}, {0xc55ee000}, {0xc55f0000}, {0xc55f2000}, {0xc55f4000}, {0xc55f6000}, {0xc55f8000}, {0xc55fa000}, {0xc55fc000}, {0xc55fe000}, {0xc5600000}, {0xc5602000}, {0xc5604000}, {0xc5606000}, {0xc5608000}, {0xc560a000}, {0xc560c000}, {0xc560e000}, {0xc5610000}, {0xc5612000}, {0xc5614000}, {0xc5616000}, {0xc5618000}, {0xc561a000}, {0xc561c000}, {0xc561e000}, {0xc5620000}, {0xc5622000}, {0xc5624000}, {0xc5626000}, {0xc5628000}, {0xc562a000}, {0xc562c000}, {0xc562e000}, {0xc5630000}, {0xc5632000}, {0xc5634000}, {0xc5636000}, {0xc5638000}, {0xc563a000}, {0xc563c000}, {0xc563e000}, {0xc5640000}, {0xc5642000}, {0xc5644000}, {0xc5646000}, {0xc5648000}, {0xc564a000}, {0xc564c000}, {0xc564e000}, {0xc5650000}, {0xc5652000}, {0xc5654000}, {0xc5656000}, {0xc5658000}, {0xc565a000}, {0xc565c000}, {0xc565e000}, {0xc5660000}, {0xc5662000}, {0xc5664000}, {0xc5666000}, {0xc5668000}, {0xc566a000}, {0xc566c000}, {0xc566e000}, {0xc5670000}, {0xc5672000}, {0xc5674000}, {0xc5676000}, {0xc5678000}, {0xc567a000}, {0xc567c000}, {0xc567e000}, {0xc5680000}, {0xc5682000}, {0xc5684000}, {0xc5686000}, {0xc5688000}, {0xc568a000}, {0xc568c000}, {0xc568e000}, {0xc5690000}, {0xc5692000}, {0xc5694000}, {0xc5696000}, {0xc5698000}, {0xc569a000}, {0xc569c000}, {0xc569e000}, {0xc56a0000}, {0xc56a2000}, {0xc56a4000}, {0xc56a6000}, {0xc56a8000}, {0xc56aa000}, {0xc56ac000}, {0xc56ae000}, {0xc56b0000}, {0xc56b2000}, {0xc56b4000}, {0xc56b6000}, {0xc56b8000}, {0xc56ba000}, {0xc56bc000}, {0xc56be000}, {0xc56c0000}, {0xc56c2000}, {0xc56c4000}, {0xc56c6000}, {0xc56c8000}, {0xc56ca000}, {0xc56cc000}, {0xc56ce000}, {0xc56d0000}, {0xc56d2000}, {0xc56d4000}, {0xc56d6000}, {0xc56d8000}, {0xc56da000}, {0xc56dc000}, {0xc56de000}, {0xc56e0000}, {0xc56e2000}, {0xc56e4000}, {0xc56e6000}, {0xc56e8000}, {0xc56ea000}, {0xc56ec000}, {0xc56ee000}, {0xc56f0000}, {0xc56f2000}, {0xc56f4000}, {0xc56f6000}, {0xc56f8000}, {0xc56fa000}, {0xc56fc000}, {0xc56fe000}, {0xc5700000}, {0xc5702000}, {0xc5704000}, {0xc5706000}, {0xc5708000}, {0xc570a000}, {0xc570c000}, {0xc570e000}, {0xc5710000}, {0xc5712000}, {0xc5714000}, {0xc5716000}, {0xc5718000}, {0xc571a000}, {0xc571c000}, {0xc571e000}, {0xc5720000}, {0xc5722000}, {0xc5724000}, {0xc5726000}, {0xc5728000}, {0xc572a000}, {0xc572c000}, {0xc572e000}, {0xc5730000}, {0xc5732000}, {0xc5734000}, {0xc5736000}, {0xc5738000}, {0xc573a000}, {0xc573c000}, {0xc573e000}, {0xc5740000}, {0xc5742000}, {0xc5744000}, {0xc5746000}, {0xc5748000}, {0xc574a000}, {0xc574c000}, {0xc574e000}, {0xc5750000}, {0xc5752000}, {0xc5754000}, {0xc5756000}, {0xc5758000}, {0xc575a000}, {0xc575c000}, {0xc575e000}, {0xc5760000}, {0xc5762000}, {0xc5764000}, {0xc5766000}, {0xc5768000}, {0xc576a000}, {0xc576c000}, {0xc576e000}, {0xc5770000}, {0xc5772000}, {0xc5774000}, {0xc5776000}, {0xc5778000}, {0xc577a000}, {0xc577c000}, {0xc577e000}, {0xc5780000}, {0xc5782000}, {0xc5784000}, {0xc5786000}, {0xc5788000}, {0xc578a000}, {0xc578c000}, {0xc578e000}, {0xc5790000}, {0xc5792000}, {0xc5794000}, {0xc5796000}, {0xc5798000}, {0xc579a000}, {0xc579c000}, {0xc579e000}, {0xc57a0000}, {0xc57a2000}, {0xc57a4000}, {0xc57a6000}, {0xc57a8000}, {0xc57aa000}, {0xc57ac000}, {0xc57ae000}, {0xc57b0000}, {0xc57b2000}, {0xc57b4000}, {0xc57b6000}, {0xc57b8000}, {0xc57ba000}, {0xc57bc000}, {0xc57be000}, {0xc57c0000}, {0xc57c2000}, {0xc57c4000}, {0xc57c6000}, {0xc57c8000}, {0xc57ca000}, {0xc57cc000}, {0xc57ce000}, {0xc57d0000}, {0xc57d2000}, {0xc57d4000}, {0xc57d6000}, {0xc57d8000}, {0xc57da000}, {0xc57dc000}, {0xc57de000}, {0xc57e0000}, {0xc57e2000}, {0xc57e4000}, {0xc57e6000}, {0xc57e8000}, {0xc57ea000}, {0xc57ec000}, {0xc57ee000}, {0xc57f0000}, {0xc57f2000}, {0xc57f4000}, {0xc57f6000}, {0xc57f8000}, {0xc57fa000}, {0xc57fc000}, {0xc57fe000}, {0xc5800000}, {0xc5802000}, {0xc5804000}, {0xc5806000}, {0xc5808000}, {0xc580a000}, {0xc580c000}, {0xc580e000}, {0xc5810000}, {0xc5812000}, {0xc5814000}, {0xc5816000}, {0xc5818000}, {0xc581a000}, {0xc581c000}, {0xc581e000}, {0xc5820000}, {0xc5822000}, {0xc5824000}, {0xc5826000}, {0xc5828000}, {0xc582a000}, {0xc582c000}, {0xc582e000}, {0xc5830000}, {0xc5832000}, {0xc5834000}, {0xc5836000}, {0xc5838000}, {0xc583a000}, {0xc583c000}, {0xc583e000}, {0xc5840000}, {0xc5842000}, {0xc5844000}, {0xc5846000}, {0xc5848000}, {0xc584a000}, {0xc584c000}, {0xc584e000}, {0xc5850000}, {0xc5852000}, {0xc5854000}, {0xc5856000}, {0xc5858000}, {0xc585a000}, {0xc585c000}, {0xc585e000}, {0xc5860000}, {0xc5862000}, {0xc5864000}, {0xc5866000}, {0xc5868000}, {0xc586a000}, {0xc586c000}, {0xc586e000}, {0xc5870000}, {0xc5872000}, {0xc5874000}, {0xc5876000}, {0xc5878000}, {0xc587a000}, {0xc587c000}, {0xc587e000}, {0xc5880000}, {0xc5882000}, {0xc5884000}, {0xc5886000}, {0xc5888000}, {0xc588a000}, {0xc588c000}, {0xc588e000}, {0xc5890000}, {0xc5892000}, {0xc5894000}, {0xc5896000}, {0xc5898000}, {0xc589a000}, {0xc589c000}, {0xc589e000}, {0xc58a0000}, {0xc58a2000}, {0xc58a4000}, {0xc58a6000}, {0xc58a8000}, {0xc58aa000}, {0xc58ac000}, {0xc58ae000}, {0xc58b0000}, {0xc58b2000}, {0xc58b4000}, {0xc58b6000}, {0xc58b8000}, {0xc58ba000}, {0xc58bc000}, {0xc58be000}, {0xc58c0000}, {0xc58c2000}, {0xc58c4000}, {0xc58c6000}, {0xc58c8000}, {0xc58ca000}, {0xc58cc000}, {0xc58ce000}, {0xc58d0000}, {0xc58d2000}, {0xc58d4000}, {0xc58d6000}, {0xc58d8000}, {0xc58da000}, {0xc58dc000}, {0xc58de000}, {0xc58e0000}, {0xc58e2000}, {0xc58e4000}, {0xc58e6000}, {0xc58e8000}, {0xc58ea000}, {0xc58ec000}, {0xc58ee000}, {0xc58f0000}, {0xc58f2000}, {0xc58f4000}, {0xc58f6000}, {0xc58f8000}, {0xc58fa000}, {0xc58fc000}, {0xc58fe000}, {0xc5900000}, {0xc5902000}, {0xc5904000}, {0xc5906000}, {0xc5908000}, {0xc590a000}, {0xc590c000}, {0xc590e000}, {0xc5910000}, {0xc5912000}, {0xc5914000}, {0xc5916000}, {0xc5918000}, {0xc591a000}, {0xc591c000}, {0xc591e000}, {0xc5920000}, {0xc5922000}, {0xc5924000}, {0xc5926000}, {0xc5928000}, {0xc592a000}, {0xc592c000}, {0xc592e000}, {0xc5930000}, {0xc5932000}, {0xc5934000}, {0xc5936000}, {0xc5938000}, {0xc593a000}, {0xc593c000}, {0xc593e000}, {0xc5940000}, {0xc5942000}, {0xc5944000}, {0xc5946000}, {0xc5948000}, {0xc594a000}, {0xc594c000}, {0xc594e000}, {0xc5950000}, {0xc5952000}, {0xc5954000}, {0xc5956000}, {0xc5958000}, {0xc595a000}, {0xc595c000}, {0xc595e000}, {0xc5960000}, {0xc5962000}, {0xc5964000}, {0xc5966000}, {0xc5968000}, {0xc596a000}, {0xc596c000}, {0xc596e000}, {0xc5970000}, {0xc5972000}, {0xc5974000}, {0xc5976000}, {0xc5978000}, {0xc597a000}, {0xc597c000}, {0xc597e000}, {0xc5980000}, {0xc5982000}, {0xc5984000}, {0xc5986000}, {0xc5988000}, {0xc598a000}, {0xc598c000}, {0xc598e000}, {0xc5990000}, {0xc5992000}, {0xc5994000}, {0xc5996000}, {0xc5998000}, {0xc599a000}, {0xc599c000}, {0xc599e000}, {0xc59a0000}, {0xc59a2000}, {0xc59a4000}, {0xc59a6000}, {0xc59a8000}, {0xc59aa000}, {0xc59ac000}, {0xc59ae000}, {0xc59b0000}, {0xc59b2000}, {0xc59b4000}, {0xc59b6000}, {0xc59b8000}, {0xc59ba000}, {0xc59bc000}, {0xc59be000}, {0xc59c0000}, {0xc59c2000}, {0xc59c4000}, {0xc59c6000}, {0xc59c8000}, {0xc59ca000}, {0xc59cc000}, {0xc59ce000}, {0xc59d0000}, {0xc59d2000}, {0xc59d4000}, {0xc59d6000}, {0xc59d8000}, {0xc59da000}, {0xc59dc000}, {0xc59de000}, {0xc59e0000}, {0xc59e2000}, {0xc59e4000}, {0xc59e6000}, {0xc59e8000}, {0xc59ea000}, {0xc59ec000}, {0xc59ee000}, {0xc59f0000}, {0xc59f2000}, {0xc59f4000}, {0xc59f6000}, {0xc59f8000}, {0xc59fa000}, {0xc59fc000}, {0xc59fe000}, {0xc5a00000}, {0xc5a02000}, {0xc5a04000}, {0xc5a06000}, {0xc5a08000}, {0xc5a0a000}, {0xc5a0c000}, {0xc5a0e000}, {0xc5a10000}, {0xc5a12000}, {0xc5a14000}, {0xc5a16000}, {0xc5a18000}, {0xc5a1a000}, {0xc5a1c000}, {0xc5a1e000}, {0xc5a20000}, {0xc5a22000}, {0xc5a24000}, {0xc5a26000}, {0xc5a28000}, {0xc5a2a000}, {0xc5a2c000}, {0xc5a2e000}, {0xc5a30000}, {0xc5a32000}, {0xc5a34000}, {0xc5a36000}, {0xc5a38000}, {0xc5a3a000}, {0xc5a3c000}, {0xc5a3e000}, {0xc5a40000}, {0xc5a42000}, {0xc5a44000}, {0xc5a46000}, {0xc5a48000}, {0xc5a4a000}, {0xc5a4c000}, {0xc5a4e000}, {0xc5a50000}, {0xc5a52000}, {0xc5a54000}, {0xc5a56000}, {0xc5a58000}, {0xc5a5a000}, {0xc5a5c000}, {0xc5a5e000}, {0xc5a60000}, {0xc5a62000}, {0xc5a64000}, {0xc5a66000}, {0xc5a68000}, {0xc5a6a000}, {0xc5a6c000}, {0xc5a6e000}, {0xc5a70000}, {0xc5a72000}, {0xc5a74000}, {0xc5a76000}, {0xc5a78000}, {0xc5a7a000}, {0xc5a7c000}, {0xc5a7e000}, {0xc5a80000}, {0xc5a82000}, {0xc5a84000}, {0xc5a86000}, {0xc5a88000}, {0xc5a8a000}, {0xc5a8c000}, {0xc5a8e000}, {0xc5a90000}, {0xc5a92000}, {0xc5a94000}, {0xc5a96000}, {0xc5a98000}, {0xc5a9a000}, {0xc5a9c000}, {0xc5a9e000}, {0xc5aa0000}, {0xc5aa2000}, {0xc5aa4000}, {0xc5aa6000}, {0xc5aa8000}, {0xc5aaa000}, {0xc5aac000}, {0xc5aae000}, {0xc5ab0000}, {0xc5ab2000}, {0xc5ab4000}, {0xc5ab6000}, {0xc5ab8000}, {0xc5aba000}, {0xc5abc000}, {0xc5abe000}, {0xc5ac0000}, {0xc5ac2000}, {0xc5ac4000}, {0xc5ac6000}, {0xc5ac8000}, {0xc5aca000}, {0xc5acc000}, {0xc5ace000}, {0xc5ad0000}, {0xc5ad2000}, {0xc5ad4000}, {0xc5ad6000}, {0xc5ad8000}, {0xc5ada000}, {0xc5adc000}, {0xc5ade000}, {0xc5ae0000}, {0xc5ae2000}, {0xc5ae4000}, {0xc5ae6000}, {0xc5ae8000}, {0xc5aea000}, {0xc5aec000}, {0xc5aee000}, {0xc5af0000}, {0xc5af2000}, {0xc5af4000}, {0xc5af6000}, {0xc5af8000}, {0xc5afa000}, {0xc5afc000}, {0xc5afe000}, {0xc5b00000}, {0xc5b02000}, {0xc5b04000}, {0xc5b06000}, {0xc5b08000}, {0xc5b0a000}, {0xc5b0c000}, {0xc5b0e000}, {0xc5b10000}, {0xc5b12000}, {0xc5b14000}, {0xc5b16000}, {0xc5b18000}, {0xc5b1a000}, {0xc5b1c000}, {0xc5b1e000}, {0xc5b20000}, {0xc5b22000}, {0xc5b24000}, {0xc5b26000}, {0xc5b28000}, {0xc5b2a000}, {0xc5b2c000}, {0xc5b2e000}, {0xc5b30000}, {0xc5b32000}, {0xc5b34000}, {0xc5b36000}, {0xc5b38000}, {0xc5b3a000}, {0xc5b3c000}, {0xc5b3e000}, {0xc5b40000}, {0xc5b42000}, {0xc5b44000}, {0xc5b46000}, {0xc5b48000}, {0xc5b4a000}, {0xc5b4c000}, {0xc5b4e000}, {0xc5b50000}, {0xc5b52000}, {0xc5b54000}, {0xc5b56000}, {0xc5b58000}, {0xc5b5a000}, {0xc5b5c000}, {0xc5b5e000}, {0xc5b60000}, {0xc5b62000}, {0xc5b64000}, {0xc5b66000}, {0xc5b68000}, {0xc5b6a000}, {0xc5b6c000}, {0xc5b6e000}, {0xc5b70000}, {0xc5b72000}, {0xc5b74000}, {0xc5b76000}, {0xc5b78000}, {0xc5b7a000}, {0xc5b7c000}, {0xc5b7e000}, {0xc5b80000}, {0xc5b82000}, {0xc5b84000}, {0xc5b86000}, {0xc5b88000}, {0xc5b8a000}, {0xc5b8c000}, {0xc5b8e000}, {0xc5b90000}, {0xc5b92000}, {0xc5b94000}, {0xc5b96000}, {0xc5b98000}, {0xc5b9a000}, {0xc5b9c000}, {0xc5b9e000}, {0xc5ba0000}, {0xc5ba2000}, {0xc5ba4000}, {0xc5ba6000}, {0xc5ba8000}, {0xc5baa000}, {0xc5bac000}, {0xc5bae000}, {0xc5bb0000}, {0xc5bb2000}, {0xc5bb4000}, {0xc5bb6000}, {0xc5bb8000}, {0xc5bba000}, {0xc5bbc000}, {0xc5bbe000}, {0xc5bc0000}, {0xc5bc2000}, {0xc5bc4000}, {0xc5bc6000}, {0xc5bc8000}, {0xc5bca000}, {0xc5bcc000}, {0xc5bce000}, {0xc5bd0000}, {0xc5bd2000}, {0xc5bd4000}, {0xc5bd6000}, {0xc5bd8000}, {0xc5bda000}, {0xc5bdc000}, {0xc5bde000}, {0xc5be0000}, {0xc5be2000}, {0xc5be4000}, {0xc5be6000}, {0xc5be8000}, {0xc5bea000}, {0xc5bec000}, {0xc5bee000}, {0xc5bf0000}, {0xc5bf2000}, {0xc5bf4000}, {0xc5bf6000}, {0xc5bf8000}, {0xc5bfa000}, {0xc5bfc000}, {0xc5bfe000}, {0xc5c00000}, {0xc5c02000}, {0xc5c04000}, {0xc5c06000}, {0xc5c08000}, {0xc5c0a000}, {0xc5c0c000}, {0xc5c0e000}, {0xc5c10000}, {0xc5c12000}, {0xc5c14000}, {0xc5c16000}, {0xc5c18000}, {0xc5c1a000}, {0xc5c1c000}, {0xc5c1e000}, {0xc5c20000}, {0xc5c22000}, {0xc5c24000}, {0xc5c26000}, {0xc5c28000}, {0xc5c2a000}, {0xc5c2c000}, {0xc5c2e000}, {0xc5c30000}, {0xc5c32000}, {0xc5c34000}, {0xc5c36000}, {0xc5c38000}, {0xc5c3a000}, {0xc5c3c000}, {0xc5c3e000}, {0xc5c40000}, {0xc5c42000}, {0xc5c44000}, {0xc5c46000}, {0xc5c48000}, {0xc5c4a000}, {0xc5c4c000}, {0xc5c4e000}, {0xc5c50000}, {0xc5c52000}, {0xc5c54000}, {0xc5c56000}, {0xc5c58000}, {0xc5c5a000}, {0xc5c5c000}, {0xc5c5e000}, {0xc5c60000}, {0xc5c62000}, {0xc5c64000}, {0xc5c66000}, {0xc5c68000}, {0xc5c6a000}, {0xc5c6c000}, {0xc5c6e000}, {0xc5c70000}, {0xc5c72000}, {0xc5c74000}, {0xc5c76000}, {0xc5c78000}, {0xc5c7a000}, {0xc5c7c000}, {0xc5c7e000}, {0xc5c80000}, {0xc5c82000}, {0xc5c84000}, {0xc5c86000}, {0xc5c88000}, {0xc5c8a000}, {0xc5c8c000}, {0xc5c8e000}, {0xc5c90000}, {0xc5c92000}, {0xc5c94000}, {0xc5c96000}, {0xc5c98000}, {0xc5c9a000}, {0xc5c9c000}, {0xc5c9e000}, {0xc5ca0000}, {0xc5ca2000}, {0xc5ca4000}, {0xc5ca6000}, {0xc5ca8000}, {0xc5caa000}, {0xc5cac000}, {0xc5cae000}, {0xc5cb0000}, {0xc5cb2000}, {0xc5cb4000}, {0xc5cb6000}, {0xc5cb8000}, {0xc5cba000}, {0xc5cbc000}, {0xc5cbe000}, {0xc5cc0000}, {0xc5cc2000}, {0xc5cc4000}, {0xc5cc6000}, {0xc5cc8000}, {0xc5cca000}, {0xc5ccc000}, {0xc5cce000}, {0xc5cd0000}, {0xc5cd2000}, {0xc5cd4000}, {0xc5cd6000}, {0xc5cd8000}, {0xc5cda000}, {0xc5cdc000}, {0xc5cde000}, {0xc5ce0000}, {0xc5ce2000}, {0xc5ce4000}, {0xc5ce6000}, {0xc5ce8000}, {0xc5cea000}, {0xc5cec000}, {0xc5cee000}, {0xc5cf0000}, {0xc5cf2000}, {0xc5cf4000}, {0xc5cf6000}, {0xc5cf8000}, {0xc5cfa000}, {0xc5cfc000}, {0xc5cfe000}, {0xc5d00000}, {0xc5d02000}, {0xc5d04000}, {0xc5d06000}, {0xc5d08000}, {0xc5d0a000}, {0xc5d0c000}, {0xc5d0e000}, {0xc5d10000}, {0xc5d12000}, {0xc5d14000}, {0xc5d16000}, {0xc5d18000}, {0xc5d1a000}, {0xc5d1c000}, {0xc5d1e000}, {0xc5d20000}, {0xc5d22000}, {0xc5d24000}, {0xc5d26000}, {0xc5d28000}, {0xc5d2a000}, {0xc5d2c000}, {0xc5d2e000}, {0xc5d30000}, {0xc5d32000}, {0xc5d34000}, {0xc5d36000}, {0xc5d38000}, {0xc5d3a000}, {0xc5d3c000}, {0xc5d3e000}, {0xc5d40000}, {0xc5d42000}, {0xc5d44000}, {0xc5d46000}, {0xc5d48000}, {0xc5d4a000}, {0xc5d4c000}, {0xc5d4e000}, {0xc5d50000}, {0xc5d52000}, {0xc5d54000}, {0xc5d56000}, {0xc5d58000}, {0xc5d5a000}, {0xc5d5c000}, {0xc5d5e000}, {0xc5d60000}, {0xc5d62000}, {0xc5d64000}, {0xc5d66000}, {0xc5d68000}, {0xc5d6a000}, {0xc5d6c000}, {0xc5d6e000}, {0xc5d70000}, {0xc5d72000}, {0xc5d74000}, {0xc5d76000}, {0xc5d78000}, {0xc5d7a000}, {0xc5d7c000}, {0xc5d7e000}, {0xc5d80000}, {0xc5d82000}, {0xc5d84000}, {0xc5d86000}, {0xc5d88000}, {0xc5d8a000}, {0xc5d8c000}, {0xc5d8e000}, {0xc5d90000}, {0xc5d92000}, {0xc5d94000}, {0xc5d96000}, {0xc5d98000}, {0xc5d9a000}, {0xc5d9c000}, {0xc5d9e000}, {0xc5da0000}, {0xc5da2000}, {0xc5da4000}, {0xc5da6000}, {0xc5da8000}, {0xc5daa000}, {0xc5dac000}, {0xc5dae000}, {0xc5db0000}, {0xc5db2000}, {0xc5db4000}, {0xc5db6000}, {0xc5db8000}, {0xc5dba000}, {0xc5dbc000}, {0xc5dbe000}, {0xc5dc0000}, {0xc5dc2000}, {0xc5dc4000}, {0xc5dc6000}, {0xc5dc8000}, {0xc5dca000}, {0xc5dcc000}, {0xc5dce000}, {0xc5dd0000}, {0xc5dd2000}, {0xc5dd4000}, {0xc5dd6000}, {0xc5dd8000}, {0xc5dda000}, {0xc5ddc000}, {0xc5dde000}, {0xc5de0000}, {0xc5de2000}, {0xc5de4000}, {0xc5de6000}, {0xc5de8000}, {0xc5dea000}, {0xc5dec000}, {0xc5dee000}, {0xc5df0000}, {0xc5df2000}, {0xc5df4000}, {0xc5df6000}, {0xc5df8000}, {0xc5dfa000}, {0xc5dfc000}, {0xc5dfe000}, {0xc5e00000}, {0xc5e02000}, {0xc5e04000}, {0xc5e06000}, {0xc5e08000}, {0xc5e0a000}, {0xc5e0c000}, {0xc5e0e000}, {0xc5e10000}, {0xc5e12000}, {0xc5e14000}, {0xc5e16000}, {0xc5e18000}, {0xc5e1a000}, {0xc5e1c000}, {0xc5e1e000}, {0xc5e20000}, {0xc5e22000}, {0xc5e24000}, {0xc5e26000}, {0xc5e28000}, {0xc5e2a000}, {0xc5e2c000}, {0xc5e2e000}, {0xc5e30000}, {0xc5e32000}, {0xc5e34000}, {0xc5e36000}, {0xc5e38000}, {0xc5e3a000}, {0xc5e3c000}, {0xc5e3e000}, {0xc5e40000}, {0xc5e42000}, {0xc5e44000}, {0xc5e46000}, {0xc5e48000}, {0xc5e4a000}, {0xc5e4c000}, {0xc5e4e000}, {0xc5e50000}, {0xc5e52000}, {0xc5e54000}, {0xc5e56000}, {0xc5e58000}, {0xc5e5a000}, {0xc5e5c000}, {0xc5e5e000}, {0xc5e60000}, {0xc5e62000}, {0xc5e64000}, {0xc5e66000}, {0xc5e68000}, {0xc5e6a000}, {0xc5e6c000}, {0xc5e6e000}, {0xc5e70000}, {0xc5e72000}, {0xc5e74000}, {0xc5e76000}, {0xc5e78000}, {0xc5e7a000}, {0xc5e7c000}, {0xc5e7e000}, {0xc5e80000}, {0xc5e82000}, {0xc5e84000}, {0xc5e86000}, {0xc5e88000}, {0xc5e8a000}, {0xc5e8c000}, {0xc5e8e000}, {0xc5e90000}, {0xc5e92000}, {0xc5e94000}, {0xc5e96000}, {0xc5e98000}, {0xc5e9a000}, {0xc5e9c000}, {0xc5e9e000}, {0xc5ea0000}, {0xc5ea2000}, {0xc5ea4000}, {0xc5ea6000}, {0xc5ea8000}, {0xc5eaa000}, {0xc5eac000}, {0xc5eae000}, {0xc5eb0000}, {0xc5eb2000}, {0xc5eb4000}, {0xc5eb6000}, {0xc5eb8000}, {0xc5eba000}, {0xc5ebc000}, {0xc5ebe000}, {0xc5ec0000}, {0xc5ec2000}, {0xc5ec4000}, {0xc5ec6000}, {0xc5ec8000}, {0xc5eca000}, {0xc5ecc000}, {0xc5ece000}, {0xc5ed0000}, {0xc5ed2000}, {0xc5ed4000}, {0xc5ed6000}, {0xc5ed8000}, {0xc5eda000}, {0xc5edc000}, {0xc5ede000}, {0xc5ee0000}, {0xc5ee2000}, {0xc5ee4000}, {0xc5ee6000}, {0xc5ee8000}, {0xc5eea000}, {0xc5eec000}, {0xc5eee000}, {0xc5ef0000}, {0xc5ef2000}, {0xc5ef4000}, {0xc5ef6000}, {0xc5ef8000}, {0xc5efa000}, {0xc5efc000}, {0xc5efe000}, {0xc5f00000}, {0xc5f02000}, {0xc5f04000}, {0xc5f06000}, {0xc5f08000}, {0xc5f0a000}, {0xc5f0c000}, {0xc5f0e000}, {0xc5f10000}, {0xc5f12000}, {0xc5f14000}, {0xc5f16000}, {0xc5f18000}, {0xc5f1a000}, {0xc5f1c000}, {0xc5f1e000}, {0xc5f20000}, {0xc5f22000}, {0xc5f24000}, {0xc5f26000}, {0xc5f28000}, {0xc5f2a000}, {0xc5f2c000}, {0xc5f2e000}, {0xc5f30000}, {0xc5f32000}, {0xc5f34000}, {0xc5f36000}, {0xc5f38000}, {0xc5f3a000}, {0xc5f3c000}, {0xc5f3e000}, {0xc5f40000}, {0xc5f42000}, {0xc5f44000}, {0xc5f46000}, {0xc5f48000}, {0xc5f4a000}, {0xc5f4c000}, {0xc5f4e000}, {0xc5f50000}, {0xc5f52000}, {0xc5f54000}, {0xc5f56000}, {0xc5f58000}, {0xc5f5a000}, {0xc5f5c000}, {0xc5f5e000}, {0xc5f60000}, {0xc5f62000}, {0xc5f64000}, {0xc5f66000}, {0xc5f68000}, {0xc5f6a000}, {0xc5f6c000}, {0xc5f6e000}, {0xc5f70000}, {0xc5f72000}, {0xc5f74000}, {0xc5f76000}, {0xc5f78000}, {0xc5f7a000}, {0xc5f7c000}, {0xc5f7e000}, {0xc5f80000}, {0xc5f82000}, {0xc5f84000}, {0xc5f86000}, {0xc5f88000}, {0xc5f8a000}, {0xc5f8c000}, {0xc5f8e000}, {0xc5f90000}, {0xc5f92000}, {0xc5f94000}, {0xc5f96000}, {0xc5f98000}, {0xc5f9a000}, {0xc5f9c000}, {0xc5f9e000}, {0xc5fa0000}, {0xc5fa2000}, {0xc5fa4000}, {0xc5fa6000}, {0xc5fa8000}, {0xc5faa000}, {0xc5fac000}, {0xc5fae000}, {0xc5fb0000}, {0xc5fb2000}, {0xc5fb4000}, {0xc5fb6000}, {0xc5fb8000}, {0xc5fba000}, {0xc5fbc000}, {0xc5fbe000}, {0xc5fc0000}, {0xc5fc2000}, {0xc5fc4000}, {0xc5fc6000}, {0xc5fc8000}, {0xc5fca000}, {0xc5fcc000}, {0xc5fce000}, {0xc5fd0000}, {0xc5fd2000}, {0xc5fd4000}, {0xc5fd6000}, {0xc5fd8000}, {0xc5fda000}, {0xc5fdc000}, {0xc5fde000}, {0xc5fe0000}, {0xc5fe2000}, {0xc5fe4000}, {0xc5fe6000}, {0xc5fe8000}, {0xc5fea000}, {0xc5fec000}, {0xc5fee000}, {0xc5ff0000}, {0xc5ff2000}, {0xc5ff4000}, {0xc5ff6000}, {0xc5ff8000}, {0xc5ffa000}, {0xc5ffc000}, {0xc5ffe000}, {0xc6000000}, {0xc6002000}, {0xc6004000}, {0xc6006000}, {0xc6008000}, {0xc600a000}, {0xc600c000}, {0xc600e000}, {0xc6010000}, {0xc6012000}, {0xc6014000}, {0xc6016000}, {0xc6018000}, {0xc601a000}, {0xc601c000}, {0xc601e000}, {0xc6020000}, {0xc6022000}, {0xc6024000}, {0xc6026000}, {0xc6028000}, {0xc602a000}, {0xc602c000}, {0xc602e000}, {0xc6030000}, {0xc6032000}, {0xc6034000}, {0xc6036000}, {0xc6038000}, {0xc603a000}, {0xc603c000}, {0xc603e000}, {0xc6040000}, {0xc6042000}, {0xc6044000}, {0xc6046000}, {0xc6048000}, {0xc604a000}, {0xc604c000}, {0xc604e000}, {0xc6050000}, {0xc6052000}, {0xc6054000}, {0xc6056000}, {0xc6058000}, {0xc605a000}, {0xc605c000}, {0xc605e000}, {0xc6060000}, {0xc6062000}, {0xc6064000}, {0xc6066000}, {0xc6068000}, {0xc606a000}, {0xc606c000}, {0xc606e000}, {0xc6070000}, {0xc6072000}, {0xc6074000}, {0xc6076000}, {0xc6078000}, {0xc607a000}, {0xc607c000}, {0xc607e000}, {0xc6080000}, {0xc6082000}, {0xc6084000}, {0xc6086000}, {0xc6088000}, {0xc608a000}, {0xc608c000}, {0xc608e000}, {0xc6090000}, {0xc6092000}, {0xc6094000}, {0xc6096000}, {0xc6098000}, {0xc609a000}, {0xc609c000}, {0xc609e000}, {0xc60a0000}, {0xc60a2000}, {0xc60a4000}, {0xc60a6000}, {0xc60a8000}, {0xc60aa000}, {0xc60ac000}, {0xc60ae000}, {0xc60b0000}, {0xc60b2000}, {0xc60b4000}, {0xc60b6000}, {0xc60b8000}, {0xc60ba000}, {0xc60bc000}, {0xc60be000}, {0xc60c0000}, {0xc60c2000}, {0xc60c4000}, {0xc60c6000}, {0xc60c8000}, {0xc60ca000}, {0xc60cc000}, {0xc60ce000}, {0xc60d0000}, {0xc60d2000}, {0xc60d4000}, {0xc60d6000}, {0xc60d8000}, {0xc60da000}, {0xc60dc000}, {0xc60de000}, {0xc60e0000}, {0xc60e2000}, {0xc60e4000}, {0xc60e6000}, {0xc60e8000}, {0xc60ea000}, {0xc60ec000}, {0xc60ee000}, {0xc60f0000}, {0xc60f2000}, {0xc60f4000}, {0xc60f6000}, {0xc60f8000}, {0xc60fa000}, {0xc60fc000}, {0xc60fe000}, {0xc6100000}, {0xc6102000}, {0xc6104000}, {0xc6106000}, {0xc6108000}, {0xc610a000}, {0xc610c000}, {0xc610e000}, {0xc6110000}, {0xc6112000}, {0xc6114000}, {0xc6116000}, {0xc6118000}, {0xc611a000}, {0xc611c000}, {0xc611e000}, {0xc6120000}, {0xc6122000}, {0xc6124000}, {0xc6126000}, {0xc6128000}, {0xc612a000}, {0xc612c000}, {0xc612e000}, {0xc6130000}, {0xc6132000}, {0xc6134000}, {0xc6136000}, {0xc6138000}, {0xc613a000}, {0xc613c000}, {0xc613e000}, {0xc6140000}, {0xc6142000}, {0xc6144000}, {0xc6146000}, {0xc6148000}, {0xc614a000}, {0xc614c000}, {0xc614e000}, {0xc6150000}, {0xc6152000}, {0xc6154000}, {0xc6156000}, {0xc6158000}, {0xc615a000}, {0xc615c000}, {0xc615e000}, {0xc6160000}, {0xc6162000}, {0xc6164000}, {0xc6166000}, {0xc6168000}, {0xc616a000}, {0xc616c000}, {0xc616e000}, {0xc6170000}, {0xc6172000}, {0xc6174000}, {0xc6176000}, {0xc6178000}, {0xc617a000}, {0xc617c000}, {0xc617e000}, {0xc6180000}, {0xc6182000}, {0xc6184000}, {0xc6186000}, {0xc6188000}, {0xc618a000}, {0xc618c000}, {0xc618e000}, {0xc6190000}, {0xc6192000}, {0xc6194000}, {0xc6196000}, {0xc6198000}, {0xc619a000}, {0xc619c000}, {0xc619e000}, {0xc61a0000}, {0xc61a2000}, {0xc61a4000}, {0xc61a6000}, {0xc61a8000}, {0xc61aa000}, {0xc61ac000}, {0xc61ae000}, {0xc61b0000}, {0xc61b2000}, {0xc61b4000}, {0xc61b6000}, {0xc61b8000}, {0xc61ba000}, {0xc61bc000}, {0xc61be000}, {0xc61c0000}, {0xc61c2000}, {0xc61c4000}, {0xc61c6000}, {0xc61c8000}, {0xc61ca000}, {0xc61cc000}, {0xc61ce000}, {0xc61d0000}, {0xc61d2000}, {0xc61d4000}, {0xc61d6000}, {0xc61d8000}, {0xc61da000}, {0xc61dc000}, {0xc61de000}, {0xc61e0000}, {0xc61e2000}, {0xc61e4000}, {0xc61e6000}, {0xc61e8000}, {0xc61ea000}, {0xc61ec000}, {0xc61ee000}, {0xc61f0000}, {0xc61f2000}, {0xc61f4000}, {0xc61f6000}, {0xc61f8000}, {0xc61fa000}, {0xc61fc000}, {0xc61fe000}, {0xc6200000}, {0xc6202000}, {0xc6204000}, {0xc6206000}, {0xc6208000}, {0xc620a000}, {0xc620c000}, {0xc620e000}, {0xc6210000}, {0xc6212000}, {0xc6214000}, {0xc6216000}, {0xc6218000}, {0xc621a000}, {0xc621c000}, {0xc621e000}, {0xc6220000}, {0xc6222000}, {0xc6224000}, {0xc6226000}, {0xc6228000}, {0xc622a000}, {0xc622c000}, {0xc622e000}, {0xc6230000}, {0xc6232000}, {0xc6234000}, {0xc6236000}, {0xc6238000}, {0xc623a000}, {0xc623c000}, {0xc623e000}, {0xc6240000}, {0xc6242000}, {0xc6244000}, {0xc6246000}, {0xc6248000}, {0xc624a000}, {0xc624c000}, {0xc624e000}, {0xc6250000}, {0xc6252000}, {0xc6254000}, {0xc6256000}, {0xc6258000}, {0xc625a000}, {0xc625c000}, {0xc625e000}, {0xc6260000}, {0xc6262000}, {0xc6264000}, {0xc6266000}, {0xc6268000}, {0xc626a000}, {0xc626c000}, {0xc626e000}, {0xc6270000}, {0xc6272000}, {0xc6274000}, {0xc6276000}, {0xc6278000}, {0xc627a000}, {0xc627c000}, {0xc627e000}, {0xc6280000}, {0xc6282000}, {0xc6284000}, {0xc6286000}, {0xc6288000}, {0xc628a000}, {0xc628c000}, {0xc628e000}, {0xc6290000}, {0xc6292000}, {0xc6294000}, {0xc6296000}, {0xc6298000}, {0xc629a000}, {0xc629c000}, {0xc629e000}, {0xc62a0000}, {0xc62a2000}, {0xc62a4000}, {0xc62a6000}, {0xc62a8000}, {0xc62aa000}, {0xc62ac000}, {0xc62ae000}, {0xc62b0000}, {0xc62b2000}, {0xc62b4000}, {0xc62b6000}, {0xc62b8000}, {0xc62ba000}, {0xc62bc000}, {0xc62be000}, {0xc62c0000}, {0xc62c2000}, {0xc62c4000}, {0xc62c6000}, {0xc62c8000}, {0xc62ca000}, {0xc62cc000}, {0xc62ce000}, {0xc62d0000}, {0xc62d2000}, {0xc62d4000}, {0xc62d6000}, {0xc62d8000}, {0xc62da000}, {0xc62dc000}, {0xc62de000}, {0xc62e0000}, {0xc62e2000}, {0xc62e4000}, {0xc62e6000}, {0xc62e8000}, {0xc62ea000}, {0xc62ec000}, {0xc62ee000}, {0xc62f0000}, {0xc62f2000}, {0xc62f4000}, {0xc62f6000}, {0xc62f8000}, {0xc62fa000}, {0xc62fc000}, {0xc62fe000}, {0xc6300000}, {0xc6302000}, {0xc6304000}, {0xc6306000}, {0xc6308000}, {0xc630a000}, {0xc630c000}, {0xc630e000}, {0xc6310000}, {0xc6312000}, {0xc6314000}, {0xc6316000}, {0xc6318000}, {0xc631a000}, {0xc631c000}, {0xc631e000}, {0xc6320000}, {0xc6322000}, {0xc6324000}, {0xc6326000}, {0xc6328000}, {0xc632a000}, {0xc632c000}, {0xc632e000}, {0xc6330000}, {0xc6332000}, {0xc6334000}, {0xc6336000}, {0xc6338000}, {0xc633a000}, {0xc633c000}, {0xc633e000}, {0xc6340000}, {0xc6342000}, {0xc6344000}, {0xc6346000}, {0xc6348000}, {0xc634a000}, {0xc634c000}, {0xc634e000}, {0xc6350000}, {0xc6352000}, {0xc6354000}, {0xc6356000}, {0xc6358000}, {0xc635a000}, {0xc635c000}, {0xc635e000}, {0xc6360000}, {0xc6362000}, {0xc6364000}, {0xc6366000}, {0xc6368000}, {0xc636a000}, {0xc636c000}, {0xc636e000}, {0xc6370000}, {0xc6372000}, {0xc6374000}, {0xc6376000}, {0xc6378000}, {0xc637a000}, {0xc637c000}, {0xc637e000}, {0xc6380000}, {0xc6382000}, {0xc6384000}, {0xc6386000}, {0xc6388000}, {0xc638a000}, {0xc638c000}, {0xc638e000}, {0xc6390000}, {0xc6392000}, {0xc6394000}, {0xc6396000}, {0xc6398000}, {0xc639a000}, {0xc639c000}, {0xc639e000}, {0xc63a0000}, {0xc63a2000}, {0xc63a4000}, {0xc63a6000}, {0xc63a8000}, {0xc63aa000}, {0xc63ac000}, {0xc63ae000}, {0xc63b0000}, {0xc63b2000}, {0xc63b4000}, {0xc63b6000}, {0xc63b8000}, {0xc63ba000}, {0xc63bc000}, {0xc63be000}, {0xc63c0000}, {0xc63c2000}, {0xc63c4000}, {0xc63c6000}, {0xc63c8000}, {0xc63ca000}, {0xc63cc000}, {0xc63ce000}, {0xc63d0000}, {0xc63d2000}, {0xc63d4000}, {0xc63d6000}, {0xc63d8000}, {0xc63da000}, {0xc63dc000}, {0xc63de000}, {0xc63e0000}, {0xc63e2000}, {0xc63e4000}, {0xc63e6000}, {0xc63e8000}, {0xc63ea000}, {0xc63ec000}, {0xc63ee000}, {0xc63f0000}, {0xc63f2000}, {0xc63f4000}, {0xc63f6000}, {0xc63f8000}, {0xc63fa000}, {0xc63fc000}, {0xc63fe000}, {0xc6400000}, {0xc6402000}, {0xc6404000}, {0xc6406000}, {0xc6408000}, {0xc640a000}, {0xc640c000}, {0xc640e000}, {0xc6410000}, {0xc6412000}, {0xc6414000}, {0xc6416000}, {0xc6418000}, {0xc641a000}, {0xc641c000}, {0xc641e000}, {0xc6420000}, {0xc6422000}, {0xc6424000}, {0xc6426000}, {0xc6428000}, {0xc642a000}, {0xc642c000}, {0xc642e000}, {0xc6430000}, {0xc6432000}, {0xc6434000}, {0xc6436000}, {0xc6438000}, {0xc643a000}, {0xc643c000}, {0xc643e000}, {0xc6440000}, {0xc6442000}, {0xc6444000}, {0xc6446000}, {0xc6448000}, {0xc644a000}, {0xc644c000}, {0xc644e000}, {0xc6450000}, {0xc6452000}, {0xc6454000}, {0xc6456000}, {0xc6458000}, {0xc645a000}, {0xc645c000}, {0xc645e000}, {0xc6460000}, {0xc6462000}, {0xc6464000}, {0xc6466000}, {0xc6468000}, {0xc646a000}, {0xc646c000}, {0xc646e000}, {0xc6470000}, {0xc6472000}, {0xc6474000}, {0xc6476000}, {0xc6478000}, {0xc647a000}, {0xc647c000}, {0xc647e000}, {0xc6480000}, {0xc6482000}, {0xc6484000}, {0xc6486000}, {0xc6488000}, {0xc648a000}, {0xc648c000}, {0xc648e000}, {0xc6490000}, {0xc6492000}, {0xc6494000}, {0xc6496000}, {0xc6498000}, {0xc649a000}, {0xc649c000}, {0xc649e000}, {0xc64a0000}, {0xc64a2000}, {0xc64a4000}, {0xc64a6000}, {0xc64a8000}, {0xc64aa000}, {0xc64ac000}, {0xc64ae000}, {0xc64b0000}, {0xc64b2000}, {0xc64b4000}, {0xc64b6000}, {0xc64b8000}, {0xc64ba000}, {0xc64bc000}, {0xc64be000}, {0xc64c0000}, {0xc64c2000}, {0xc64c4000}, {0xc64c6000}, {0xc64c8000}, {0xc64ca000}, {0xc64cc000}, {0xc64ce000}, {0xc64d0000}, {0xc64d2000}, {0xc64d4000}, {0xc64d6000}, {0xc64d8000}, {0xc64da000}, {0xc64dc000}, {0xc64de000}, {0xc64e0000}, {0xc64e2000}, {0xc64e4000}, {0xc64e6000}, {0xc64e8000}, {0xc64ea000}, {0xc64ec000}, {0xc64ee000}, {0xc64f0000}, {0xc64f2000}, {0xc64f4000}, {0xc64f6000}, {0xc64f8000}, {0xc64fa000}, {0xc64fc000}, {0xc64fe000}, {0xc6500000}, {0xc6502000}, {0xc6504000}, {0xc6506000}, {0xc6508000}, {0xc650a000}, {0xc650c000}, {0xc650e000}, {0xc6510000}, {0xc6512000}, {0xc6514000}, {0xc6516000}, {0xc6518000}, {0xc651a000}, {0xc651c000}, {0xc651e000}, {0xc6520000}, {0xc6522000}, {0xc6524000}, {0xc6526000}, {0xc6528000}, {0xc652a000}, {0xc652c000}, {0xc652e000}, {0xc6530000}, {0xc6532000}, {0xc6534000}, {0xc6536000}, {0xc6538000}, {0xc653a000}, {0xc653c000}, {0xc653e000}, {0xc6540000}, {0xc6542000}, {0xc6544000}, {0xc6546000}, {0xc6548000}, {0xc654a000}, {0xc654c000}, {0xc654e000}, {0xc6550000}, {0xc6552000}, {0xc6554000}, {0xc6556000}, {0xc6558000}, {0xc655a000}, {0xc655c000}, {0xc655e000}, {0xc6560000}, {0xc6562000}, {0xc6564000}, {0xc6566000}, {0xc6568000}, {0xc656a000}, {0xc656c000}, {0xc656e000}, {0xc6570000}, {0xc6572000}, {0xc6574000}, {0xc6576000}, {0xc6578000}, {0xc657a000}, {0xc657c000}, {0xc657e000}, {0xc6580000}, {0xc6582000}, {0xc6584000}, {0xc6586000}, {0xc6588000}, {0xc658a000}, {0xc658c000}, {0xc658e000}, {0xc6590000}, {0xc6592000}, {0xc6594000}, {0xc6596000}, {0xc6598000}, {0xc659a000}, {0xc659c000}, {0xc659e000}, {0xc65a0000}, {0xc65a2000}, {0xc65a4000}, {0xc65a6000}, {0xc65a8000}, {0xc65aa000}, {0xc65ac000}, {0xc65ae000}, {0xc65b0000}, {0xc65b2000}, {0xc65b4000}, {0xc65b6000}, {0xc65b8000}, {0xc65ba000}, {0xc65bc000}, {0xc65be000}, {0xc65c0000}, {0xc65c2000}, {0xc65c4000}, {0xc65c6000}, {0xc65c8000}, {0xc65ca000}, {0xc65cc000}, {0xc65ce000}, {0xc65d0000}, {0xc65d2000}, {0xc65d4000}, {0xc65d6000}, {0xc65d8000}, {0xc65da000}, {0xc65dc000}, {0xc65de000}, {0xc65e0000}, {0xc65e2000}, {0xc65e4000}, {0xc65e6000}, {0xc65e8000}, {0xc65ea000}, {0xc65ec000}, {0xc65ee000}, {0xc65f0000}, {0xc65f2000}, {0xc65f4000}, {0xc65f6000}, {0xc65f8000}, {0xc65fa000}, {0xc65fc000}, {0xc65fe000}, {0xc6600000}, {0xc6602000}, {0xc6604000}, {0xc6606000}, {0xc6608000}, {0xc660a000}, {0xc660c000}, {0xc660e000}, {0xc6610000}, {0xc6612000}, {0xc6614000}, {0xc6616000}, {0xc6618000}, {0xc661a000}, {0xc661c000}, {0xc661e000}, {0xc6620000}, {0xc6622000}, {0xc6624000}, {0xc6626000}, {0xc6628000}, {0xc662a000}, {0xc662c000}, {0xc662e000}, {0xc6630000}, {0xc6632000}, {0xc6634000}, {0xc6636000}, {0xc6638000}, {0xc663a000}, {0xc663c000}, {0xc663e000}, {0xc6640000}, {0xc6642000}, {0xc6644000}, {0xc6646000}, {0xc6648000}, {0xc664a000}, {0xc664c000}, {0xc664e000}, {0xc6650000}, {0xc6652000}, {0xc6654000}, {0xc6656000}, {0xc6658000}, {0xc665a000}, {0xc665c000}, {0xc665e000}, {0xc6660000}, {0xc6662000}, {0xc6664000}, {0xc6666000}, {0xc6668000}, {0xc666a000}, {0xc666c000}, {0xc666e000}, {0xc6670000}, {0xc6672000}, {0xc6674000}, {0xc6676000}, {0xc6678000}, {0xc667a000}, {0xc667c000}, {0xc667e000}, {0xc6680000}, {0xc6682000}, {0xc6684000}, {0xc6686000}, {0xc6688000}, {0xc668a000}, {0xc668c000}, {0xc668e000}, {0xc6690000}, {0xc6692000}, {0xc6694000}, {0xc6696000}, {0xc6698000}, {0xc669a000}, {0xc669c000}, {0xc669e000}, {0xc66a0000}, {0xc66a2000}, {0xc66a4000}, {0xc66a6000}, {0xc66a8000}, {0xc66aa000}, {0xc66ac000}, {0xc66ae000}, {0xc66b0000}, {0xc66b2000}, {0xc66b4000}, {0xc66b6000}, {0xc66b8000}, {0xc66ba000}, {0xc66bc000}, {0xc66be000}, {0xc66c0000}, {0xc66c2000}, {0xc66c4000}, {0xc66c6000}, {0xc66c8000}, {0xc66ca000}, {0xc66cc000}, {0xc66ce000}, {0xc66d0000}, {0xc66d2000}, {0xc66d4000}, {0xc66d6000}, {0xc66d8000}, {0xc66da000}, {0xc66dc000}, {0xc66de000}, {0xc66e0000}, {0xc66e2000}, {0xc66e4000}, {0xc66e6000}, {0xc66e8000}, {0xc66ea000}, {0xc66ec000}, {0xc66ee000}, {0xc66f0000}, {0xc66f2000}, {0xc66f4000}, {0xc66f6000}, {0xc66f8000}, {0xc66fa000}, {0xc66fc000}, {0xc66fe000}, {0xc6700000}, {0xc6702000}, {0xc6704000}, {0xc6706000}, {0xc6708000}, {0xc670a000}, {0xc670c000}, {0xc670e000}, {0xc6710000}, {0xc6712000}, {0xc6714000}, {0xc6716000}, {0xc6718000}, {0xc671a000}, {0xc671c000}, {0xc671e000}, {0xc6720000}, {0xc6722000}, {0xc6724000}, {0xc6726000}, {0xc6728000}, {0xc672a000}, {0xc672c000}, {0xc672e000}, {0xc6730000}, {0xc6732000}, {0xc6734000}, {0xc6736000}, {0xc6738000}, {0xc673a000}, {0xc673c000}, {0xc673e000}, {0xc6740000}, {0xc6742000}, {0xc6744000}, {0xc6746000}, {0xc6748000}, {0xc674a000}, {0xc674c000}, {0xc674e000}, {0xc6750000}, {0xc6752000}, {0xc6754000}, {0xc6756000}, {0xc6758000}, {0xc675a000}, {0xc675c000}, {0xc675e000}, {0xc6760000}, {0xc6762000}, {0xc6764000}, {0xc6766000}, {0xc6768000}, {0xc676a000}, {0xc676c000}, {0xc676e000}, {0xc6770000}, {0xc6772000}, {0xc6774000}, {0xc6776000}, {0xc6778000}, {0xc677a000}, {0xc677c000}, {0xc677e000}, {0xc6780000}, {0xc6782000}, {0xc6784000}, {0xc6786000}, {0xc6788000}, {0xc678a000}, {0xc678c000}, {0xc678e000}, {0xc6790000}, {0xc6792000}, {0xc6794000}, {0xc6796000}, {0xc6798000}, {0xc679a000}, {0xc679c000}, {0xc679e000}, {0xc67a0000}, {0xc67a2000}, {0xc67a4000}, {0xc67a6000}, {0xc67a8000}, {0xc67aa000}, {0xc67ac000}, {0xc67ae000}, {0xc67b0000}, {0xc67b2000}, {0xc67b4000}, {0xc67b6000}, {0xc67b8000}, {0xc67ba000}, {0xc67bc000}, {0xc67be000}, {0xc67c0000}, {0xc67c2000}, {0xc67c4000}, {0xc67c6000}, {0xc67c8000}, {0xc67ca000}, {0xc67cc000}, {0xc67ce000}, {0xc67d0000}, {0xc67d2000}, {0xc67d4000}, {0xc67d6000}, {0xc67d8000}, {0xc67da000}, {0xc67dc000}, {0xc67de000}, {0xc67e0000}, {0xc67e2000}, {0xc67e4000}, {0xc67e6000}, {0xc67e8000}, {0xc67ea000}, {0xc67ec000}, {0xc67ee000}, {0xc67f0000}, {0xc67f2000}, {0xc67f4000}, {0xc67f6000}, {0xc67f8000}, {0xc67fa000}, {0xc67fc000}, {0xc67fe000}, {0xc6800000}, {0xc6802000}, {0xc6804000}, {0xc6806000}, {0xc6808000}, {0xc680a000}, {0xc680c000}, {0xc680e000}, {0xc6810000}, {0xc6812000}, {0xc6814000}, {0xc6816000}, {0xc6818000}, {0xc681a000}, {0xc681c000}, {0xc681e000}, {0xc6820000}, {0xc6822000}, {0xc6824000}, {0xc6826000}, {0xc6828000}, {0xc682a000}, {0xc682c000}, {0xc682e000}, {0xc6830000}, {0xc6832000}, {0xc6834000}, {0xc6836000}, {0xc6838000}, {0xc683a000}, {0xc683c000}, {0xc683e000}, {0xc6840000}, {0xc6842000}, {0xc6844000}, {0xc6846000}, {0xc6848000}, {0xc684a000}, {0xc684c000}, {0xc684e000}, {0xc6850000}, {0xc6852000}, {0xc6854000}, {0xc6856000}, {0xc6858000}, {0xc685a000}, {0xc685c000}, {0xc685e000}, {0xc6860000}, {0xc6862000}, {0xc6864000}, {0xc6866000}, {0xc6868000}, {0xc686a000}, {0xc686c000}, {0xc686e000}, {0xc6870000}, {0xc6872000}, {0xc6874000}, {0xc6876000}, {0xc6878000}, {0xc687a000}, {0xc687c000}, {0xc687e000}, {0xc6880000}, {0xc6882000}, {0xc6884000}, {0xc6886000}, {0xc6888000}, {0xc688a000}, {0xc688c000}, {0xc688e000}, {0xc6890000}, {0xc6892000}, {0xc6894000}, {0xc6896000}, {0xc6898000}, {0xc689a000}, {0xc689c000}, {0xc689e000}, {0xc68a0000}, {0xc68a2000}, {0xc68a4000}, {0xc68a6000}, {0xc68a8000}, {0xc68aa000}, {0xc68ac000}, {0xc68ae000}, {0xc68b0000}, {0xc68b2000}, {0xc68b4000}, {0xc68b6000}, {0xc68b8000}, {0xc68ba000}, {0xc68bc000}, {0xc68be000}, {0xc68c0000}, {0xc68c2000}, {0xc68c4000}, {0xc68c6000}, {0xc68c8000}, {0xc68ca000}, {0xc68cc000}, {0xc68ce000}, {0xc68d0000}, {0xc68d2000}, {0xc68d4000}, {0xc68d6000}, {0xc68d8000}, {0xc68da000}, {0xc68dc000}, {0xc68de000}, {0xc68e0000}, {0xc68e2000}, {0xc68e4000}, {0xc68e6000}, {0xc68e8000}, {0xc68ea000}, {0xc68ec000}, {0xc68ee000}, {0xc68f0000}, {0xc68f2000}, {0xc68f4000}, {0xc68f6000}, {0xc68f8000}, {0xc68fa000}, {0xc68fc000}, {0xc68fe000}, {0xc6900000}, {0xc6902000}, {0xc6904000}, {0xc6906000}, {0xc6908000}, {0xc690a000}, {0xc690c000}, {0xc690e000}, {0xc6910000}, {0xc6912000}, {0xc6914000}, {0xc6916000}, {0xc6918000}, {0xc691a000}, {0xc691c000}, {0xc691e000}, {0xc6920000}, {0xc6922000}, {0xc6924000}, {0xc6926000}, {0xc6928000}, {0xc692a000}, {0xc692c000}, {0xc692e000}, {0xc6930000}, {0xc6932000}, {0xc6934000}, {0xc6936000}, {0xc6938000}, {0xc693a000}, {0xc693c000}, {0xc693e000}, {0xc6940000}, {0xc6942000}, {0xc6944000}, {0xc6946000}, {0xc6948000}, {0xc694a000}, {0xc694c000}, {0xc694e000}, {0xc6950000}, {0xc6952000}, {0xc6954000}, {0xc6956000}, {0xc6958000}, {0xc695a000}, {0xc695c000}, {0xc695e000}, {0xc6960000}, {0xc6962000}, {0xc6964000}, {0xc6966000}, {0xc6968000}, {0xc696a000}, {0xc696c000}, {0xc696e000}, {0xc6970000}, {0xc6972000}, {0xc6974000}, {0xc6976000}, {0xc6978000}, {0xc697a000}, {0xc697c000}, {0xc697e000}, {0xc6980000}, {0xc6982000}, {0xc6984000}, {0xc6986000}, {0xc6988000}, {0xc698a000}, {0xc698c000}, {0xc698e000}, {0xc6990000}, {0xc6992000}, {0xc6994000}, {0xc6996000}, {0xc6998000}, {0xc699a000}, {0xc699c000}, {0xc699e000}, {0xc69a0000}, {0xc69a2000}, {0xc69a4000}, {0xc69a6000}, {0xc69a8000}, {0xc69aa000}, {0xc69ac000}, {0xc69ae000}, {0xc69b0000}, {0xc69b2000}, {0xc69b4000}, {0xc69b6000}, {0xc69b8000}, {0xc69ba000}, {0xc69bc000}, {0xc69be000}, {0xc69c0000}, {0xc69c2000}, {0xc69c4000}, {0xc69c6000}, {0xc69c8000}, {0xc69ca000}, {0xc69cc000}, {0xc69ce000}, {0xc69d0000}, {0xc69d2000}, {0xc69d4000}, {0xc69d6000}, {0xc69d8000}, {0xc69da000}, {0xc69dc000}, {0xc69de000}, {0xc69e0000}, {0xc69e2000}, {0xc69e4000}, {0xc69e6000}, {0xc69e8000}, {0xc69ea000}, {0xc69ec000}, {0xc69ee000}, {0xc69f0000}, {0xc69f2000}, {0xc69f4000}, {0xc69f6000}, {0xc69f8000}, {0xc69fa000}, {0xc69fc000}, {0xc69fe000}, {0xc6a00000}, {0xc6a02000}, {0xc6a04000}, {0xc6a06000}, {0xc6a08000}, {0xc6a0a000}, {0xc6a0c000}, {0xc6a0e000}, {0xc6a10000}, {0xc6a12000}, {0xc6a14000}, {0xc6a16000}, {0xc6a18000}, {0xc6a1a000}, {0xc6a1c000}, {0xc6a1e000}, {0xc6a20000}, {0xc6a22000}, {0xc6a24000}, {0xc6a26000}, {0xc6a28000}, {0xc6a2a000}, {0xc6a2c000}, {0xc6a2e000}, {0xc6a30000}, {0xc6a32000}, {0xc6a34000}, {0xc6a36000}, {0xc6a38000}, {0xc6a3a000}, {0xc6a3c000}, {0xc6a3e000}, {0xc6a40000}, {0xc6a42000}, {0xc6a44000}, {0xc6a46000}, {0xc6a48000}, {0xc6a4a000}, {0xc6a4c000}, {0xc6a4e000}, {0xc6a50000}, {0xc6a52000}, {0xc6a54000}, {0xc6a56000}, {0xc6a58000}, {0xc6a5a000}, {0xc6a5c000}, {0xc6a5e000}, {0xc6a60000}, {0xc6a62000}, {0xc6a64000}, {0xc6a66000}, {0xc6a68000}, {0xc6a6a000}, {0xc6a6c000}, {0xc6a6e000}, {0xc6a70000}, {0xc6a72000}, {0xc6a74000}, {0xc6a76000}, {0xc6a78000}, {0xc6a7a000}, {0xc6a7c000}, {0xc6a7e000}, {0xc6a80000}, {0xc6a82000}, {0xc6a84000}, {0xc6a86000}, {0xc6a88000}, {0xc6a8a000}, {0xc6a8c000}, {0xc6a8e000}, {0xc6a90000}, {0xc6a92000}, {0xc6a94000}, {0xc6a96000}, {0xc6a98000}, {0xc6a9a000}, {0xc6a9c000}, {0xc6a9e000}, {0xc6aa0000}, {0xc6aa2000}, {0xc6aa4000}, {0xc6aa6000}, {0xc6aa8000}, {0xc6aaa000}, {0xc6aac000}, {0xc6aae000}, {0xc6ab0000}, {0xc6ab2000}, {0xc6ab4000}, {0xc6ab6000}, {0xc6ab8000}, {0xc6aba000}, {0xc6abc000}, {0xc6abe000}, {0xc6ac0000}, {0xc6ac2000}, {0xc6ac4000}, {0xc6ac6000}, {0xc6ac8000}, {0xc6aca000}, {0xc6acc000}, {0xc6ace000}, {0xc6ad0000}, {0xc6ad2000}, {0xc6ad4000}, {0xc6ad6000}, {0xc6ad8000}, {0xc6ada000}, {0xc6adc000}, {0xc6ade000}, {0xc6ae0000}, {0xc6ae2000}, {0xc6ae4000}, {0xc6ae6000}, {0xc6ae8000}, {0xc6aea000}, {0xc6aec000}, {0xc6aee000}, {0xc6af0000}, {0xc6af2000}, {0xc6af4000}, {0xc6af6000}, {0xc6af8000}, {0xc6afa000}, {0xc6afc000}, {0xc6afe000}, {0xc6b00000}, {0xc6b02000}, {0xc6b04000}, {0xc6b06000}, {0xc6b08000}, {0xc6b0a000}, {0xc6b0c000}, {0xc6b0e000}, {0xc6b10000}, {0xc6b12000}, {0xc6b14000}, {0xc6b16000}, {0xc6b18000}, {0xc6b1a000}, {0xc6b1c000}, {0xc6b1e000}, {0xc6b20000}, {0xc6b22000}, {0xc6b24000}, {0xc6b26000}, {0xc6b28000}, {0xc6b2a000}, {0xc6b2c000}, {0xc6b2e000}, {0xc6b30000}, {0xc6b32000}, {0xc6b34000}, {0xc6b36000}, {0xc6b38000}, {0xc6b3a000}, {0xc6b3c000}, {0xc6b3e000}, {0xc6b40000}, {0xc6b42000}, {0xc6b44000}, {0xc6b46000}, {0xc6b48000}, {0xc6b4a000}, {0xc6b4c000}, {0xc6b4e000}, {0xc6b50000}, {0xc6b52000}, {0xc6b54000}, {0xc6b56000}, {0xc6b58000}, {0xc6b5a000}, {0xc6b5c000}, {0xc6b5e000}, {0xc6b60000}, {0xc6b62000}, {0xc6b64000}, {0xc6b66000}, {0xc6b68000}, {0xc6b6a000}, {0xc6b6c000}, {0xc6b6e000}, {0xc6b70000}, {0xc6b72000}, {0xc6b74000}, {0xc6b76000}, {0xc6b78000}, {0xc6b7a000}, {0xc6b7c000}, {0xc6b7e000}, {0xc6b80000}, {0xc6b82000}, {0xc6b84000}, {0xc6b86000}, {0xc6b88000}, {0xc6b8a000}, {0xc6b8c000}, {0xc6b8e000}, {0xc6b90000}, {0xc6b92000}, {0xc6b94000}, {0xc6b96000}, {0xc6b98000}, {0xc6b9a000}, {0xc6b9c000}, {0xc6b9e000}, {0xc6ba0000}, {0xc6ba2000}, {0xc6ba4000}, {0xc6ba6000}, {0xc6ba8000}, {0xc6baa000}, {0xc6bac000}, {0xc6bae000}, {0xc6bb0000}, {0xc6bb2000}, {0xc6bb4000}, {0xc6bb6000}, {0xc6bb8000}, {0xc6bba000}, {0xc6bbc000}, {0xc6bbe000}, {0xc6bc0000}, {0xc6bc2000}, {0xc6bc4000}, {0xc6bc6000}, {0xc6bc8000}, {0xc6bca000}, {0xc6bcc000}, {0xc6bce000}, {0xc6bd0000}, {0xc6bd2000}, {0xc6bd4000}, {0xc6bd6000}, {0xc6bd8000}, {0xc6bda000}, {0xc6bdc000}, {0xc6bde000}, {0xc6be0000}, {0xc6be2000}, {0xc6be4000}, {0xc6be6000}, {0xc6be8000}, {0xc6bea000}, {0xc6bec000}, {0xc6bee000}, {0xc6bf0000}, {0xc6bf2000}, {0xc6bf4000}, {0xc6bf6000}, {0xc6bf8000}, {0xc6bfa000}, {0xc6bfc000}, {0xc6bfe000}, {0xc6c00000}, {0xc6c02000}, {0xc6c04000}, {0xc6c06000}, {0xc6c08000}, {0xc6c0a000}, {0xc6c0c000}, {0xc6c0e000}, {0xc6c10000}, {0xc6c12000}, {0xc6c14000}, {0xc6c16000}, {0xc6c18000}, {0xc6c1a000}, {0xc6c1c000}, {0xc6c1e000}, {0xc6c20000}, {0xc6c22000}, {0xc6c24000}, {0xc6c26000}, {0xc6c28000}, {0xc6c2a000}, {0xc6c2c000}, {0xc6c2e000}, {0xc6c30000}, {0xc6c32000}, {0xc6c34000}, {0xc6c36000}, {0xc6c38000}, {0xc6c3a000}, {0xc6c3c000}, {0xc6c3e000}, {0xc6c40000}, {0xc6c42000}, {0xc6c44000}, {0xc6c46000}, {0xc6c48000}, {0xc6c4a000}, {0xc6c4c000}, {0xc6c4e000}, {0xc6c50000}, {0xc6c52000}, {0xc6c54000}, {0xc6c56000}, {0xc6c58000}, {0xc6c5a000}, {0xc6c5c000}, {0xc6c5e000}, {0xc6c60000}, {0xc6c62000}, {0xc6c64000}, {0xc6c66000}, {0xc6c68000}, {0xc6c6a000}, {0xc6c6c000}, {0xc6c6e000}, {0xc6c70000}, {0xc6c72000}, {0xc6c74000}, {0xc6c76000}, {0xc6c78000}, {0xc6c7a000}, {0xc6c7c000}, {0xc6c7e000}, {0xc6c80000}, {0xc6c82000}, {0xc6c84000}, {0xc6c86000}, {0xc6c88000}, {0xc6c8a000}, {0xc6c8c000}, {0xc6c8e000}, {0xc6c90000}, {0xc6c92000}, {0xc6c94000}, {0xc6c96000}, {0xc6c98000}, {0xc6c9a000}, {0xc6c9c000}, {0xc6c9e000}, {0xc6ca0000}, {0xc6ca2000}, {0xc6ca4000}, {0xc6ca6000}, {0xc6ca8000}, {0xc6caa000}, {0xc6cac000}, {0xc6cae000}, {0xc6cb0000}, {0xc6cb2000}, {0xc6cb4000}, {0xc6cb6000}, {0xc6cb8000}, {0xc6cba000}, {0xc6cbc000}, {0xc6cbe000}, {0xc6cc0000}, {0xc6cc2000}, {0xc6cc4000}, {0xc6cc6000}, {0xc6cc8000}, {0xc6cca000}, {0xc6ccc000}, {0xc6cce000}, {0xc6cd0000}, {0xc6cd2000}, {0xc6cd4000}, {0xc6cd6000}, {0xc6cd8000}, {0xc6cda000}, {0xc6cdc000}, {0xc6cde000}, {0xc6ce0000}, {0xc6ce2000}, {0xc6ce4000}, {0xc6ce6000}, {0xc6ce8000}, {0xc6cea000}, {0xc6cec000}, {0xc6cee000}, {0xc6cf0000}, {0xc6cf2000}, {0xc6cf4000}, {0xc6cf6000}, {0xc6cf8000}, {0xc6cfa000}, {0xc6cfc000}, {0xc6cfe000}, {0xc6d00000}, {0xc6d02000}, {0xc6d04000}, {0xc6d06000}, {0xc6d08000}, {0xc6d0a000}, {0xc6d0c000}, {0xc6d0e000}, {0xc6d10000}, {0xc6d12000}, {0xc6d14000}, {0xc6d16000}, {0xc6d18000}, {0xc6d1a000}, {0xc6d1c000}, {0xc6d1e000}, {0xc6d20000}, {0xc6d22000}, {0xc6d24000}, {0xc6d26000}, {0xc6d28000}, {0xc6d2a000}, {0xc6d2c000}, {0xc6d2e000}, {0xc6d30000}, {0xc6d32000}, {0xc6d34000}, {0xc6d36000}, {0xc6d38000}, {0xc6d3a000}, {0xc6d3c000}, {0xc6d3e000}, {0xc6d40000}, {0xc6d42000}, {0xc6d44000}, {0xc6d46000}, {0xc6d48000}, {0xc6d4a000}, {0xc6d4c000}, {0xc6d4e000}, {0xc6d50000}, {0xc6d52000}, {0xc6d54000}, {0xc6d56000}, {0xc6d58000}, {0xc6d5a000}, {0xc6d5c000}, {0xc6d5e000}, {0xc6d60000}, {0xc6d62000}, {0xc6d64000}, {0xc6d66000}, {0xc6d68000}, {0xc6d6a000}, {0xc6d6c000}, {0xc6d6e000}, {0xc6d70000}, {0xc6d72000}, {0xc6d74000}, {0xc6d76000}, {0xc6d78000}, {0xc6d7a000}, {0xc6d7c000}, {0xc6d7e000}, {0xc6d80000}, {0xc6d82000}, {0xc6d84000}, {0xc6d86000}, {0xc6d88000}, {0xc6d8a000}, {0xc6d8c000}, {0xc6d8e000}, {0xc6d90000}, {0xc6d92000}, {0xc6d94000}, {0xc6d96000}, {0xc6d98000}, {0xc6d9a000}, {0xc6d9c000}, {0xc6d9e000}, {0xc6da0000}, {0xc6da2000}, {0xc6da4000}, {0xc6da6000}, {0xc6da8000}, {0xc6daa000}, {0xc6dac000}, {0xc6dae000}, {0xc6db0000}, {0xc6db2000}, {0xc6db4000}, {0xc6db6000}, {0xc6db8000}, {0xc6dba000}, {0xc6dbc000}, {0xc6dbe000}, {0xc6dc0000}, {0xc6dc2000}, {0xc6dc4000}, {0xc6dc6000}, {0xc6dc8000}, {0xc6dca000}, {0xc6dcc000}, {0xc6dce000}, {0xc6dd0000}, {0xc6dd2000}, {0xc6dd4000}, {0xc6dd6000}, {0xc6dd8000}, {0xc6dda000}, {0xc6ddc000}, {0xc6dde000}, {0xc6de0000}, {0xc6de2000}, {0xc6de4000}, {0xc6de6000}, {0xc6de8000}, {0xc6dea000}, {0xc6dec000}, {0xc6dee000}, {0xc6df0000}, {0xc6df2000}, {0xc6df4000}, {0xc6df6000}, {0xc6df8000}, {0xc6dfa000}, {0xc6dfc000}, {0xc6dfe000}, {0xc6e00000}, {0xc6e02000}, {0xc6e04000}, {0xc6e06000}, {0xc6e08000}, {0xc6e0a000}, {0xc6e0c000}, {0xc6e0e000}, {0xc6e10000}, {0xc6e12000}, {0xc6e14000}, {0xc6e16000}, {0xc6e18000}, {0xc6e1a000}, {0xc6e1c000}, {0xc6e1e000}, {0xc6e20000}, {0xc6e22000}, {0xc6e24000}, {0xc6e26000}, {0xc6e28000}, {0xc6e2a000}, {0xc6e2c000}, {0xc6e2e000}, {0xc6e30000}, {0xc6e32000}, {0xc6e34000}, {0xc6e36000}, {0xc6e38000}, {0xc6e3a000}, {0xc6e3c000}, {0xc6e3e000}, {0xc6e40000}, {0xc6e42000}, {0xc6e44000}, {0xc6e46000}, {0xc6e48000}, {0xc6e4a000}, {0xc6e4c000}, {0xc6e4e000}, {0xc6e50000}, {0xc6e52000}, {0xc6e54000}, {0xc6e56000}, {0xc6e58000}, {0xc6e5a000}, {0xc6e5c000}, {0xc6e5e000}, {0xc6e60000}, {0xc6e62000}, {0xc6e64000}, {0xc6e66000}, {0xc6e68000}, {0xc6e6a000}, {0xc6e6c000}, {0xc6e6e000}, {0xc6e70000}, {0xc6e72000}, {0xc6e74000}, {0xc6e76000}, {0xc6e78000}, {0xc6e7a000}, {0xc6e7c000}, {0xc6e7e000}, {0xc6e80000}, {0xc6e82000}, {0xc6e84000}, {0xc6e86000}, {0xc6e88000}, {0xc6e8a000}, {0xc6e8c000}, {0xc6e8e000}, {0xc6e90000}, {0xc6e92000}, {0xc6e94000}, {0xc6e96000}, {0xc6e98000}, {0xc6e9a000}, {0xc6e9c000}, {0xc6e9e000}, {0xc6ea0000}, {0xc6ea2000}, {0xc6ea4000}, {0xc6ea6000}, {0xc6ea8000}, {0xc6eaa000}, {0xc6eac000}, {0xc6eae000}, {0xc6eb0000}, {0xc6eb2000}, {0xc6eb4000}, {0xc6eb6000}, {0xc6eb8000}, {0xc6eba000}, {0xc6ebc000}, {0xc6ebe000}, {0xc6ec0000}, {0xc6ec2000}, {0xc6ec4000}, {0xc6ec6000}, {0xc6ec8000}, {0xc6eca000}, {0xc6ecc000}, {0xc6ece000}, {0xc6ed0000}, {0xc6ed2000}, {0xc6ed4000}, {0xc6ed6000}, {0xc6ed8000}, {0xc6eda000}, {0xc6edc000}, {0xc6ede000}, {0xc6ee0000}, {0xc6ee2000}, {0xc6ee4000}, {0xc6ee6000}, {0xc6ee8000}, {0xc6eea000}, {0xc6eec000}, {0xc6eee000}, {0xc6ef0000}, {0xc6ef2000}, {0xc6ef4000}, {0xc6ef6000}, {0xc6ef8000}, {0xc6efa000}, {0xc6efc000}, {0xc6efe000}, {0xc6f00000}, {0xc6f02000}, {0xc6f04000}, {0xc6f06000}, {0xc6f08000}, {0xc6f0a000}, {0xc6f0c000}, {0xc6f0e000}, {0xc6f10000}, {0xc6f12000}, {0xc6f14000}, {0xc6f16000}, {0xc6f18000}, {0xc6f1a000}, {0xc6f1c000}, {0xc6f1e000}, {0xc6f20000}, {0xc6f22000}, {0xc6f24000}, {0xc6f26000}, {0xc6f28000}, {0xc6f2a000}, {0xc6f2c000}, {0xc6f2e000}, {0xc6f30000}, {0xc6f32000}, {0xc6f34000}, {0xc6f36000}, {0xc6f38000}, {0xc6f3a000}, {0xc6f3c000}, {0xc6f3e000}, {0xc6f40000}, {0xc6f42000}, {0xc6f44000}, {0xc6f46000}, {0xc6f48000}, {0xc6f4a000}, {0xc6f4c000}, {0xc6f4e000}, {0xc6f50000}, {0xc6f52000}, {0xc6f54000}, {0xc6f56000}, {0xc6f58000}, {0xc6f5a000}, {0xc6f5c000}, {0xc6f5e000}, {0xc6f60000}, {0xc6f62000}, {0xc6f64000}, {0xc6f66000}, {0xc6f68000}, {0xc6f6a000}, {0xc6f6c000}, {0xc6f6e000}, {0xc6f70000}, {0xc6f72000}, {0xc6f74000}, {0xc6f76000}, {0xc6f78000}, {0xc6f7a000}, {0xc6f7c000}, {0xc6f7e000}, {0xc6f80000}, {0xc6f82000}, {0xc6f84000}, {0xc6f86000}, {0xc6f88000}, {0xc6f8a000}, {0xc6f8c000}, {0xc6f8e000}, {0xc6f90000}, {0xc6f92000}, {0xc6f94000}, {0xc6f96000}, {0xc6f98000}, {0xc6f9a000}, {0xc6f9c000}, {0xc6f9e000}, {0xc6fa0000}, {0xc6fa2000}, {0xc6fa4000}, {0xc6fa6000}, {0xc6fa8000}, {0xc6faa000}, {0xc6fac000}, {0xc6fae000}, {0xc6fb0000}, {0xc6fb2000}, {0xc6fb4000}, {0xc6fb6000}, {0xc6fb8000}, {0xc6fba000}, {0xc6fbc000}, {0xc6fbe000}, {0xc6fc0000}, {0xc6fc2000}, {0xc6fc4000}, {0xc6fc6000}, {0xc6fc8000}, {0xc6fca000}, {0xc6fcc000}, {0xc6fce000}, {0xc6fd0000}, {0xc6fd2000}, {0xc6fd4000}, {0xc6fd6000}, {0xc6fd8000}, {0xc6fda000}, {0xc6fdc000}, {0xc6fde000}, {0xc6fe0000}, {0xc6fe2000}, {0xc6fe4000}, {0xc6fe6000}, {0xc6fe8000}, {0xc6fea000}, {0xc6fec000}, {0xc6fee000}, {0xc6ff0000}, {0xc6ff2000}, {0xc6ff4000}, {0xc6ff6000}, {0xc6ff8000}, {0xc6ffa000}, {0xc6ffc000}, {0xc6ffe000}, {0xc7000000}, {0xc7002000}, {0xc7004000}, {0xc7006000}, {0xc7008000}, {0xc700a000}, {0xc700c000}, {0xc700e000}, {0xc7010000}, {0xc7012000}, {0xc7014000}, {0xc7016000}, {0xc7018000}, {0xc701a000}, {0xc701c000}, {0xc701e000}, {0xc7020000}, {0xc7022000}, {0xc7024000}, {0xc7026000}, {0xc7028000}, {0xc702a000}, {0xc702c000}, {0xc702e000}, {0xc7030000}, {0xc7032000}, {0xc7034000}, {0xc7036000}, {0xc7038000}, {0xc703a000}, {0xc703c000}, {0xc703e000}, {0xc7040000}, {0xc7042000}, {0xc7044000}, {0xc7046000}, {0xc7048000}, {0xc704a000}, {0xc704c000}, {0xc704e000}, {0xc7050000}, {0xc7052000}, {0xc7054000}, {0xc7056000}, {0xc7058000}, {0xc705a000}, {0xc705c000}, {0xc705e000}, {0xc7060000}, {0xc7062000}, {0xc7064000}, {0xc7066000}, {0xc7068000}, {0xc706a000}, {0xc706c000}, {0xc706e000}, {0xc7070000}, {0xc7072000}, {0xc7074000}, {0xc7076000}, {0xc7078000}, {0xc707a000}, {0xc707c000}, {0xc707e000}, {0xc7080000}, {0xc7082000}, {0xc7084000}, {0xc7086000}, {0xc7088000}, {0xc708a000}, {0xc708c000}, {0xc708e000}, {0xc7090000}, {0xc7092000}, {0xc7094000}, {0xc7096000}, {0xc7098000}, {0xc709a000}, {0xc709c000}, {0xc709e000}, {0xc70a0000}, {0xc70a2000}, {0xc70a4000}, {0xc70a6000}, {0xc70a8000}, {0xc70aa000}, {0xc70ac000}, {0xc70ae000}, {0xc70b0000}, {0xc70b2000}, {0xc70b4000}, {0xc70b6000}, {0xc70b8000}, {0xc70ba000}, {0xc70bc000}, {0xc70be000}, {0xc70c0000}, {0xc70c2000}, {0xc70c4000}, {0xc70c6000}, {0xc70c8000}, {0xc70ca000}, {0xc70cc000}, {0xc70ce000}, {0xc70d0000}, {0xc70d2000}, {0xc70d4000}, {0xc70d6000}, {0xc70d8000}, {0xc70da000}, {0xc70dc000}, {0xc70de000}, {0xc70e0000}, {0xc70e2000}, {0xc70e4000}, {0xc70e6000}, {0xc70e8000}, {0xc70ea000}, {0xc70ec000}, {0xc70ee000}, {0xc70f0000}, {0xc70f2000}, {0xc70f4000}, {0xc70f6000}, {0xc70f8000}, {0xc70fa000}, {0xc70fc000}, {0xc70fe000}, {0xc7100000}, {0xc7102000}, {0xc7104000}, {0xc7106000}, {0xc7108000}, {0xc710a000}, {0xc710c000}, {0xc710e000}, {0xc7110000}, {0xc7112000}, {0xc7114000}, {0xc7116000}, {0xc7118000}, {0xc711a000}, {0xc711c000}, {0xc711e000}, {0xc7120000}, {0xc7122000}, {0xc7124000}, {0xc7126000}, {0xc7128000}, {0xc712a000}, {0xc712c000}, {0xc712e000}, {0xc7130000}, {0xc7132000}, {0xc7134000}, {0xc7136000}, {0xc7138000}, {0xc713a000}, {0xc713c000}, {0xc713e000}, {0xc7140000}, {0xc7142000}, {0xc7144000}, {0xc7146000}, {0xc7148000}, {0xc714a000}, {0xc714c000}, {0xc714e000}, {0xc7150000}, {0xc7152000}, {0xc7154000}, {0xc7156000}, {0xc7158000}, {0xc715a000}, {0xc715c000}, {0xc715e000}, {0xc7160000}, {0xc7162000}, {0xc7164000}, {0xc7166000}, {0xc7168000}, {0xc716a000}, {0xc716c000}, {0xc716e000}, {0xc7170000}, {0xc7172000}, {0xc7174000}, {0xc7176000}, {0xc7178000}, {0xc717a000}, {0xc717c000}, {0xc717e000}, {0xc7180000}, {0xc7182000}, {0xc7184000}, {0xc7186000}, {0xc7188000}, {0xc718a000}, {0xc718c000}, {0xc718e000}, {0xc7190000}, {0xc7192000}, {0xc7194000}, {0xc7196000}, {0xc7198000}, {0xc719a000}, {0xc719c000}, {0xc719e000}, {0xc71a0000}, {0xc71a2000}, {0xc71a4000}, {0xc71a6000}, {0xc71a8000}, {0xc71aa000}, {0xc71ac000}, {0xc71ae000}, {0xc71b0000}, {0xc71b2000}, {0xc71b4000}, {0xc71b6000}, {0xc71b8000}, {0xc71ba000}, {0xc71bc000}, {0xc71be000}, {0xc71c0000}, {0xc71c2000}, {0xc71c4000}, {0xc71c6000}, {0xc71c8000}, {0xc71ca000}, {0xc71cc000}, {0xc71ce000}, {0xc71d0000}, {0xc71d2000}, {0xc71d4000}, {0xc71d6000}, {0xc71d8000}, {0xc71da000}, {0xc71dc000}, {0xc71de000}, {0xc71e0000}, {0xc71e2000}, {0xc71e4000}, {0xc71e6000}, {0xc71e8000}, {0xc71ea000}, {0xc71ec000}, {0xc71ee000}, {0xc71f0000}, {0xc71f2000}, {0xc71f4000}, {0xc71f6000}, {0xc71f8000}, {0xc71fa000}, {0xc71fc000}, {0xc71fe000}, {0xc7200000}, {0xc7202000}, {0xc7204000}, {0xc7206000}, {0xc7208000}, {0xc720a000}, {0xc720c000}, {0xc720e000}, {0xc7210000}, {0xc7212000}, {0xc7214000}, {0xc7216000}, {0xc7218000}, {0xc721a000}, {0xc721c000}, {0xc721e000}, {0xc7220000}, {0xc7222000}, {0xc7224000}, {0xc7226000}, {0xc7228000}, {0xc722a000}, {0xc722c000}, {0xc722e000}, {0xc7230000}, {0xc7232000}, {0xc7234000}, {0xc7236000}, {0xc7238000}, {0xc723a000}, {0xc723c000}, {0xc723e000}, {0xc7240000}, {0xc7242000}, {0xc7244000}, {0xc7246000}, {0xc7248000}, {0xc724a000}, {0xc724c000}, {0xc724e000}, {0xc7250000}, {0xc7252000}, {0xc7254000}, {0xc7256000}, {0xc7258000}, {0xc725a000}, {0xc725c000}, {0xc725e000}, {0xc7260000}, {0xc7262000}, {0xc7264000}, {0xc7266000}, {0xc7268000}, {0xc726a000}, {0xc726c000}, {0xc726e000}, {0xc7270000}, {0xc7272000}, {0xc7274000}, {0xc7276000}, {0xc7278000}, {0xc727a000}, {0xc727c000}, {0xc727e000}, {0xc7280000}, {0xc7282000}, {0xc7284000}, {0xc7286000}, {0xc7288000}, {0xc728a000}, {0xc728c000}, {0xc728e000}, {0xc7290000}, {0xc7292000}, {0xc7294000}, {0xc7296000}, {0xc7298000}, {0xc729a000}, {0xc729c000}, {0xc729e000}, {0xc72a0000}, {0xc72a2000}, {0xc72a4000}, {0xc72a6000}, {0xc72a8000}, {0xc72aa000}, {0xc72ac000}, {0xc72ae000}, {0xc72b0000}, {0xc72b2000}, {0xc72b4000}, {0xc72b6000}, {0xc72b8000}, {0xc72ba000}, {0xc72bc000}, {0xc72be000}, {0xc72c0000}, {0xc72c2000}, {0xc72c4000}, {0xc72c6000}, {0xc72c8000}, {0xc72ca000}, {0xc72cc000}, {0xc72ce000}, {0xc72d0000}, {0xc72d2000}, {0xc72d4000}, {0xc72d6000}, {0xc72d8000}, {0xc72da000}, {0xc72dc000}, {0xc72de000}, {0xc72e0000}, {0xc72e2000}, {0xc72e4000}, {0xc72e6000}, {0xc72e8000}, {0xc72ea000}, {0xc72ec000}, {0xc72ee000}, {0xc72f0000}, {0xc72f2000}, {0xc72f4000}, {0xc72f6000}, {0xc72f8000}, {0xc72fa000}, {0xc72fc000}, {0xc72fe000}, {0xc7300000}, {0xc7302000}, {0xc7304000}, {0xc7306000}, {0xc7308000}, {0xc730a000}, {0xc730c000}, {0xc730e000}, {0xc7310000}, {0xc7312000}, {0xc7314000}, {0xc7316000}, {0xc7318000}, {0xc731a000}, {0xc731c000}, {0xc731e000}, {0xc7320000}, {0xc7322000}, {0xc7324000}, {0xc7326000}, {0xc7328000}, {0xc732a000}, {0xc732c000}, {0xc732e000}, {0xc7330000}, {0xc7332000}, {0xc7334000}, {0xc7336000}, {0xc7338000}, {0xc733a000}, {0xc733c000}, {0xc733e000}, {0xc7340000}, {0xc7342000}, {0xc7344000}, {0xc7346000}, {0xc7348000}, {0xc734a000}, {0xc734c000}, {0xc734e000}, {0xc7350000}, {0xc7352000}, {0xc7354000}, {0xc7356000}, {0xc7358000}, {0xc735a000}, {0xc735c000}, {0xc735e000}, {0xc7360000}, {0xc7362000}, {0xc7364000}, {0xc7366000}, {0xc7368000}, {0xc736a000}, {0xc736c000}, {0xc736e000}, {0xc7370000}, {0xc7372000}, {0xc7374000}, {0xc7376000}, {0xc7378000}, {0xc737a000}, {0xc737c000}, {0xc737e000}, {0xc7380000}, {0xc7382000}, {0xc7384000}, {0xc7386000}, {0xc7388000}, {0xc738a000}, {0xc738c000}, {0xc738e000}, {0xc7390000}, {0xc7392000}, {0xc7394000}, {0xc7396000}, {0xc7398000}, {0xc739a000}, {0xc739c000}, {0xc739e000}, {0xc73a0000}, {0xc73a2000}, {0xc73a4000}, {0xc73a6000}, {0xc73a8000}, {0xc73aa000}, {0xc73ac000}, {0xc73ae000}, {0xc73b0000}, {0xc73b2000}, {0xc73b4000}, {0xc73b6000}, {0xc73b8000}, {0xc73ba000}, {0xc73bc000}, {0xc73be000}, {0xc73c0000}, {0xc73c2000}, {0xc73c4000}, {0xc73c6000}, {0xc73c8000}, {0xc73ca000}, {0xc73cc000}, {0xc73ce000}, {0xc73d0000}, {0xc73d2000}, {0xc73d4000}, {0xc73d6000}, {0xc73d8000}, {0xc73da000}, {0xc73dc000}, {0xc73de000}, {0xc73e0000}, {0xc73e2000}, {0xc73e4000}, {0xc73e6000}, {0xc73e8000}, {0xc73ea000}, {0xc73ec000}, {0xc73ee000}, {0xc73f0000}, {0xc73f2000}, {0xc73f4000}, {0xc73f6000}, {0xc73f8000}, {0xc73fa000}, {0xc73fc000}, {0xc73fe000}, {0xc7400000}, {0xc7402000}, {0xc7404000}, {0xc7406000}, {0xc7408000}, {0xc740a000}, {0xc740c000}, {0xc740e000}, {0xc7410000}, {0xc7412000}, {0xc7414000}, {0xc7416000}, {0xc7418000}, {0xc741a000}, {0xc741c000}, {0xc741e000}, {0xc7420000}, {0xc7422000}, {0xc7424000}, {0xc7426000}, {0xc7428000}, {0xc742a000}, {0xc742c000}, {0xc742e000}, {0xc7430000}, {0xc7432000}, {0xc7434000}, {0xc7436000}, {0xc7438000}, {0xc743a000}, {0xc743c000}, {0xc743e000}, {0xc7440000}, {0xc7442000}, {0xc7444000}, {0xc7446000}, {0xc7448000}, {0xc744a000}, {0xc744c000}, {0xc744e000}, {0xc7450000}, {0xc7452000}, {0xc7454000}, {0xc7456000}, {0xc7458000}, {0xc745a000}, {0xc745c000}, {0xc745e000}, {0xc7460000}, {0xc7462000}, {0xc7464000}, {0xc7466000}, {0xc7468000}, {0xc746a000}, {0xc746c000}, {0xc746e000}, {0xc7470000}, {0xc7472000}, {0xc7474000}, {0xc7476000}, {0xc7478000}, {0xc747a000}, {0xc747c000}, {0xc747e000}, {0xc7480000}, {0xc7482000}, {0xc7484000}, {0xc7486000}, {0xc7488000}, {0xc748a000}, {0xc748c000}, {0xc748e000}, {0xc7490000}, {0xc7492000}, {0xc7494000}, {0xc7496000}, {0xc7498000}, {0xc749a000}, {0xc749c000}, {0xc749e000}, {0xc74a0000}, {0xc74a2000}, {0xc74a4000}, {0xc74a6000}, {0xc74a8000}, {0xc74aa000}, {0xc74ac000}, {0xc74ae000}, {0xc74b0000}, {0xc74b2000}, {0xc74b4000}, {0xc74b6000}, {0xc74b8000}, {0xc74ba000}, {0xc74bc000}, {0xc74be000}, {0xc74c0000}, {0xc74c2000}, {0xc74c4000}, {0xc74c6000}, {0xc74c8000}, {0xc74ca000}, {0xc74cc000}, {0xc74ce000}, {0xc74d0000}, {0xc74d2000}, {0xc74d4000}, {0xc74d6000}, {0xc74d8000}, {0xc74da000}, {0xc74dc000}, {0xc74de000}, {0xc74e0000}, {0xc74e2000}, {0xc74e4000}, {0xc74e6000}, {0xc74e8000}, {0xc74ea000}, {0xc74ec000}, {0xc74ee000}, {0xc74f0000}, {0xc74f2000}, {0xc74f4000}, {0xc74f6000}, {0xc74f8000}, {0xc74fa000}, {0xc74fc000}, {0xc74fe000}, {0xc7500000}, {0xc7502000}, {0xc7504000}, {0xc7506000}, {0xc7508000}, {0xc750a000}, {0xc750c000}, {0xc750e000}, {0xc7510000}, {0xc7512000}, {0xc7514000}, {0xc7516000}, {0xc7518000}, {0xc751a000}, {0xc751c000}, {0xc751e000}, {0xc7520000}, {0xc7522000}, {0xc7524000}, {0xc7526000}, {0xc7528000}, {0xc752a000}, {0xc752c000}, {0xc752e000}, {0xc7530000}, {0xc7532000}, {0xc7534000}, {0xc7536000}, {0xc7538000}, {0xc753a000}, {0xc753c000}, {0xc753e000}, {0xc7540000}, {0xc7542000}, {0xc7544000}, {0xc7546000}, {0xc7548000}, {0xc754a000}, {0xc754c000}, {0xc754e000}, {0xc7550000}, {0xc7552000}, {0xc7554000}, {0xc7556000}, {0xc7558000}, {0xc755a000}, {0xc755c000}, {0xc755e000}, {0xc7560000}, {0xc7562000}, {0xc7564000}, {0xc7566000}, {0xc7568000}, {0xc756a000}, {0xc756c000}, {0xc756e000}, {0xc7570000}, {0xc7572000}, {0xc7574000}, {0xc7576000}, {0xc7578000}, {0xc757a000}, {0xc757c000}, {0xc757e000}, {0xc7580000}, {0xc7582000}, {0xc7584000}, {0xc7586000}, {0xc7588000}, {0xc758a000}, {0xc758c000}, {0xc758e000}, {0xc7590000}, {0xc7592000}, {0xc7594000}, {0xc7596000}, {0xc7598000}, {0xc759a000}, {0xc759c000}, {0xc759e000}, {0xc75a0000}, {0xc75a2000}, {0xc75a4000}, {0xc75a6000}, {0xc75a8000}, {0xc75aa000}, {0xc75ac000}, {0xc75ae000}, {0xc75b0000}, {0xc75b2000}, {0xc75b4000}, {0xc75b6000}, {0xc75b8000}, {0xc75ba000}, {0xc75bc000}, {0xc75be000}, {0xc75c0000}, {0xc75c2000}, {0xc75c4000}, {0xc75c6000}, {0xc75c8000}, {0xc75ca000}, {0xc75cc000}, {0xc75ce000}, {0xc75d0000}, {0xc75d2000}, {0xc75d4000}, {0xc75d6000}, {0xc75d8000}, {0xc75da000}, {0xc75dc000}, {0xc75de000}, {0xc75e0000}, {0xc75e2000}, {0xc75e4000}, {0xc75e6000}, {0xc75e8000}, {0xc75ea000}, {0xc75ec000}, {0xc75ee000}, {0xc75f0000}, {0xc75f2000}, {0xc75f4000}, {0xc75f6000}, {0xc75f8000}, {0xc75fa000}, {0xc75fc000}, {0xc75fe000}, {0xc7600000}, {0xc7602000}, {0xc7604000}, {0xc7606000}, {0xc7608000}, {0xc760a000}, {0xc760c000}, {0xc760e000}, {0xc7610000}, {0xc7612000}, {0xc7614000}, {0xc7616000}, {0xc7618000}, {0xc761a000}, {0xc761c000}, {0xc761e000}, {0xc7620000}, {0xc7622000}, {0xc7624000}, {0xc7626000}, {0xc7628000}, {0xc762a000}, {0xc762c000}, {0xc762e000}, {0xc7630000}, {0xc7632000}, {0xc7634000}, {0xc7636000}, {0xc7638000}, {0xc763a000}, {0xc763c000}, {0xc763e000}, {0xc7640000}, {0xc7642000}, {0xc7644000}, {0xc7646000}, {0xc7648000}, {0xc764a000}, {0xc764c000}, {0xc764e000}, {0xc7650000}, {0xc7652000}, {0xc7654000}, {0xc7656000}, {0xc7658000}, {0xc765a000}, {0xc765c000}, {0xc765e000}, {0xc7660000}, {0xc7662000}, {0xc7664000}, {0xc7666000}, {0xc7668000}, {0xc766a000}, {0xc766c000}, {0xc766e000}, {0xc7670000}, {0xc7672000}, {0xc7674000}, {0xc7676000}, {0xc7678000}, {0xc767a000}, {0xc767c000}, {0xc767e000}, {0xc7680000}, {0xc7682000}, {0xc7684000}, {0xc7686000}, {0xc7688000}, {0xc768a000}, {0xc768c000}, {0xc768e000}, {0xc7690000}, {0xc7692000}, {0xc7694000}, {0xc7696000}, {0xc7698000}, {0xc769a000}, {0xc769c000}, {0xc769e000}, {0xc76a0000}, {0xc76a2000}, {0xc76a4000}, {0xc76a6000}, {0xc76a8000}, {0xc76aa000}, {0xc76ac000}, {0xc76ae000}, {0xc76b0000}, {0xc76b2000}, {0xc76b4000}, {0xc76b6000}, {0xc76b8000}, {0xc76ba000}, {0xc76bc000}, {0xc76be000}, {0xc76c0000}, {0xc76c2000}, {0xc76c4000}, {0xc76c6000}, {0xc76c8000}, {0xc76ca000}, {0xc76cc000}, {0xc76ce000}, {0xc76d0000}, {0xc76d2000}, {0xc76d4000}, {0xc76d6000}, {0xc76d8000}, {0xc76da000}, {0xc76dc000}, {0xc76de000}, {0xc76e0000}, {0xc76e2000}, {0xc76e4000}, {0xc76e6000}, {0xc76e8000}, {0xc76ea000}, {0xc76ec000}, {0xc76ee000}, {0xc76f0000}, {0xc76f2000}, {0xc76f4000}, {0xc76f6000}, {0xc76f8000}, {0xc76fa000}, {0xc76fc000}, {0xc76fe000}, {0xc7700000}, {0xc7702000}, {0xc7704000}, {0xc7706000}, {0xc7708000}, {0xc770a000}, {0xc770c000}, {0xc770e000}, {0xc7710000}, {0xc7712000}, {0xc7714000}, {0xc7716000}, {0xc7718000}, {0xc771a000}, {0xc771c000}, {0xc771e000}, {0xc7720000}, {0xc7722000}, {0xc7724000}, {0xc7726000}, {0xc7728000}, {0xc772a000}, {0xc772c000}, {0xc772e000}, {0xc7730000}, {0xc7732000}, {0xc7734000}, {0xc7736000}, {0xc7738000}, {0xc773a000}, {0xc773c000}, {0xc773e000}, {0xc7740000}, {0xc7742000}, {0xc7744000}, {0xc7746000}, {0xc7748000}, {0xc774a000}, {0xc774c000}, {0xc774e000}, {0xc7750000}, {0xc7752000}, {0xc7754000}, {0xc7756000}, {0xc7758000}, {0xc775a000}, {0xc775c000}, {0xc775e000}, {0xc7760000}, {0xc7762000}, {0xc7764000}, {0xc7766000}, {0xc7768000}, {0xc776a000}, {0xc776c000}, {0xc776e000}, {0xc7770000}, {0xc7772000}, {0xc7774000}, {0xc7776000}, {0xc7778000}, {0xc777a000}, {0xc777c000}, {0xc777e000}, {0xc7780000}, {0xc7782000}, {0xc7784000}, {0xc7786000}, {0xc7788000}, {0xc778a000}, {0xc778c000}, {0xc778e000}, {0xc7790000}, {0xc7792000}, {0xc7794000}, {0xc7796000}, {0xc7798000}, {0xc779a000}, {0xc779c000}, {0xc779e000}, {0xc77a0000}, {0xc77a2000}, {0xc77a4000}, {0xc77a6000}, {0xc77a8000}, {0xc77aa000}, {0xc77ac000}, {0xc77ae000}, {0xc77b0000}, {0xc77b2000}, {0xc77b4000}, {0xc77b6000}, {0xc77b8000}, {0xc77ba000}, {0xc77bc000}, {0xc77be000}, {0xc77c0000}, {0xc77c2000}, {0xc77c4000}, {0xc77c6000}, {0xc77c8000}, {0xc77ca000}, {0xc77cc000}, {0xc77ce000}, {0xc77d0000}, {0xc77d2000}, {0xc77d4000}, {0xc77d6000}, {0xc77d8000}, {0xc77da000}, {0xc77dc000}, {0xc77de000}, {0xc77e0000}, {0xc77e2000}, {0xc77e4000}, {0xc77e6000}, {0xc77e8000}, {0xc77ea000}, {0xc77ec000}, {0xc77ee000}, {0xc77f0000}, {0xc77f2000}, {0xc77f4000}, {0xc77f6000}, {0xc77f8000}, {0xc77fa000}, {0xc77fc000}, {0xc77fe000}, {0xff800000}, {0xff802000}, {0xff804000}, {0xff806000}, {0xff808000}, {0xff80a000}, {0xff80c000}, {0xff80e000}, {0xff810000}, {0xff812000}, {0xff814000}, {0xff816000}, {0xff818000}, {0xff81a000}, {0xff81c000}, {0xff81e000}, {0xff820000}, {0xff822000}, {0xff824000}, {0xff826000}, {0xff828000}, {0xff82a000}, {0xff82c000}, {0xff82e000}, {0xff830000}, {0xff832000}, {0xff834000}, {0xff836000}, {0xff838000}, {0xff83a000}, {0xff83c000}, {0xff83e000}, {0xff840000}, {0xff842000}, {0xff844000}, {0xff846000}, {0xff848000}, {0xff84a000}, {0xff84c000}, {0xff84e000}, {0xff850000}, {0xff852000}, {0xff854000}, {0xff856000}, {0xff858000}, {0xff85a000}, {0xff85c000}, {0xff85e000}, {0xff860000}, {0xff862000}, {0xff864000}, {0xff866000}, {0xff868000}, {0xff86a000}, {0xff86c000}, {0xff86e000}, {0xff870000}, {0xff872000}, {0xff874000}, {0xff876000}, {0xff878000}, {0xff87a000}, {0xff87c000}, {0xff87e000}, {0xff880000}, {0xff882000}, {0xff884000}, {0xff886000}, {0xff888000}, {0xff88a000}, {0xff88c000}, {0xff88e000}, {0xff890000}, {0xff892000}, {0xff894000}, {0xff896000}, {0xff898000}, {0xff89a000}, {0xff89c000}, {0xff89e000}, {0xff8a0000}, {0xff8a2000}, {0xff8a4000}, {0xff8a6000}, {0xff8a8000}, {0xff8aa000}, {0xff8ac000}, {0xff8ae000}, {0xff8b0000}, {0xff8b2000}, {0xff8b4000}, {0xff8b6000}, {0xff8b8000}, {0xff8ba000}, {0xff8bc000}, {0xff8be000}, {0xff8c0000}, {0xff8c2000}, {0xff8c4000}, {0xff8c6000}, {0xff8c8000}, {0xff8ca000}, {0xff8cc000}, {0xff8ce000}, {0xff8d0000}, {0xff8d2000}, {0xff8d4000}, {0xff8d6000}, {0xff8d8000}, {0xff8da000}, {0xff8dc000}, {0xff8de000}, {0xff8e0000}, {0xff8e2000}, {0xff8e4000}, {0xff8e6000}, {0xff8e8000}, {0xff8ea000}, {0xff8ec000}, {0xff8ee000}, {0xff8f0000}, {0xff8f2000}, {0xff8f4000}, {0xff8f6000}, {0xff8f8000}, {0xff8fa000}, {0xff8fc000}, {0xff8fe000}, {0xff900000}, {0xff902000}, {0xff904000}, {0xff906000}, {0xff908000}, {0xff90a000}, {0xff90c000}, {0xff90e000}, {0xff910000}, {0xff912000}, {0xff914000}, {0xff916000}, {0xff918000}, {0xff91a000}, {0xff91c000}, {0xff91e000}, {0xff920000}, {0xff922000}, {0xff924000}, {0xff926000}, {0xff928000}, {0xff92a000}, {0xff92c000}, {0xff92e000}, {0xff930000}, {0xff932000}, {0xff934000}, {0xff936000}, {0xff938000}, {0xff93a000}, {0xff93c000}, {0xff93e000}, {0xff940000}, {0xff942000}, {0xff944000}, {0xff946000}, {0xff948000}, {0xff94a000}, {0xff94c000}, {0xff94e000}, {0xff950000}, {0xff952000}, {0xff954000}, {0xff956000}, {0xff958000}, {0xff95a000}, {0xff95c000}, {0xff95e000}, {0xff960000}, {0xff962000}, {0xff964000}, {0xff966000}, {0xff968000}, {0xff96a000}, {0xff96c000}, {0xff96e000}, {0xff970000}, {0xff972000}, {0xff974000}, {0xff976000}, {0xff978000}, {0xff97a000}, {0xff97c000}, {0xff97e000}, {0xff980000}, {0xff982000}, {0xff984000}, {0xff986000}, {0xff988000}, {0xff98a000}, {0xff98c000}, {0xff98e000}, {0xff990000}, {0xff992000}, {0xff994000}, {0xff996000}, {0xff998000}, {0xff99a000}, {0xff99c000}, {0xff99e000}, {0xff9a0000}, {0xff9a2000}, {0xff9a4000}, {0xff9a6000}, {0xff9a8000}, {0xff9aa000}, {0xff9ac000}, {0xff9ae000}, {0xff9b0000}, {0xff9b2000}, {0xff9b4000}, {0xff9b6000}, {0xff9b8000}, {0xff9ba000}, {0xff9bc000}, {0xff9be000}, {0xff9c0000}, {0xff9c2000}, {0xff9c4000}, {0xff9c6000}, {0xff9c8000}, {0xff9ca000}, {0xff9cc000}, {0xff9ce000}, {0xff9d0000}, {0xff9d2000}, {0xff9d4000}, {0xff9d6000}, {0xff9d8000}, {0xff9da000}, {0xff9dc000}, {0xff9de000}, {0xff9e0000}, {0xff9e2000}, {0xff9e4000}, {0xff9e6000}, {0xff9e8000}, {0xff9ea000}, {0xff9ec000}, {0xff9ee000}, {0xff9f0000}, {0xff9f2000}, {0xff9f4000}, {0xff9f6000}, {0xff9f8000}, {0xff9fa000}, {0xff9fc000}, {0xff9fe000}, {0xffa00000}, {0xffa02000}, {0xffa04000}, {0xffa06000}, {0xffa08000}, {0xffa0a000}, {0xffa0c000}, {0xffa0e000}, {0xffa10000}, {0xffa12000}, {0xffa14000}, {0xffa16000}, {0xffa18000}, {0xffa1a000}, {0xffa1c000}, {0xffa1e000}, {0xffa20000}, {0xffa22000}, {0xffa24000}, {0xffa26000}, {0xffa28000}, {0xffa2a000}, {0xffa2c000}, {0xffa2e000}, {0xffa30000}, {0xffa32000}, {0xffa34000}, {0xffa36000}, {0xffa38000}, {0xffa3a000}, {0xffa3c000}, {0xffa3e000}, {0xffa40000}, {0xffa42000}, {0xffa44000}, {0xffa46000}, {0xffa48000}, {0xffa4a000}, {0xffa4c000}, {0xffa4e000}, {0xffa50000}, {0xffa52000}, {0xffa54000}, {0xffa56000}, {0xffa58000}, {0xffa5a000}, {0xffa5c000}, {0xffa5e000}, {0xffa60000}, {0xffa62000}, {0xffa64000}, {0xffa66000}, {0xffa68000}, {0xffa6a000}, {0xffa6c000}, {0xffa6e000}, {0xffa70000}, {0xffa72000}, {0xffa74000}, {0xffa76000}, {0xffa78000}, {0xffa7a000}, {0xffa7c000}, {0xffa7e000}, {0xffa80000}, {0xffa82000}, {0xffa84000}, {0xffa86000}, {0xffa88000}, {0xffa8a000}, {0xffa8c000}, {0xffa8e000}, {0xffa90000}, {0xffa92000}, {0xffa94000}, {0xffa96000}, {0xffa98000}, {0xffa9a000}, {0xffa9c000}, {0xffa9e000}, {0xffaa0000}, {0xffaa2000}, {0xffaa4000}, {0xffaa6000}, {0xffaa8000}, {0xffaaa000}, {0xffaac000}, {0xffaae000}, {0xffab0000}, {0xffab2000}, {0xffab4000}, {0xffab6000}, {0xffab8000}, {0xffaba000}, {0xffabc000}, {0xffabe000}, {0xffac0000}, {0xffac2000}, {0xffac4000}, {0xffac6000}, {0xffac8000}, {0xffaca000}, {0xffacc000}, {0xfface000}, {0xffad0000}, {0xffad2000}, {0xffad4000}, {0xffad6000}, {0xffad8000}, {0xffada000}, {0xffadc000}, {0xffade000}, {0xffae0000}, {0xffae2000}, {0xffae4000}, {0xffae6000}, {0xffae8000}, {0xffaea000}, {0xffaec000}, {0xffaee000}, {0xffaf0000}, {0xffaf2000}, {0xffaf4000}, {0xffaf6000}, {0xffaf8000}, {0xffafa000}, {0xffafc000}, {0xffafe000}, {0xffb00000}, {0xffb02000}, {0xffb04000}, {0xffb06000}, {0xffb08000}, {0xffb0a000}, {0xffb0c000}, {0xffb0e000}, {0xffb10000}, {0xffb12000}, {0xffb14000}, {0xffb16000}, {0xffb18000}, {0xffb1a000}, {0xffb1c000}, {0xffb1e000}, {0xffb20000}, {0xffb22000}, {0xffb24000}, {0xffb26000}, {0xffb28000}, {0xffb2a000}, {0xffb2c000}, {0xffb2e000}, {0xffb30000}, {0xffb32000}, {0xffb34000}, {0xffb36000}, {0xffb38000}, {0xffb3a000}, {0xffb3c000}, {0xffb3e000}, {0xffb40000}, {0xffb42000}, {0xffb44000}, {0xffb46000}, {0xffb48000}, {0xffb4a000}, {0xffb4c000}, {0xffb4e000}, {0xffb50000}, {0xffb52000}, {0xffb54000}, {0xffb56000}, {0xffb58000}, {0xffb5a000}, {0xffb5c000}, {0xffb5e000}, {0xffb60000}, {0xffb62000}, {0xffb64000}, {0xffb66000}, {0xffb68000}, {0xffb6a000}, {0xffb6c000}, {0xffb6e000}, {0xffb70000}, {0xffb72000}, {0xffb74000}, {0xffb76000}, {0xffb78000}, {0xffb7a000}, {0xffb7c000}, {0xffb7e000}, {0xffb80000}, {0xffb82000}, {0xffb84000}, {0xffb86000}, {0xffb88000}, {0xffb8a000}, {0xffb8c000}, {0xffb8e000}, {0xffb90000}, {0xffb92000}, {0xffb94000}, {0xffb96000}, {0xffb98000}, {0xffb9a000}, {0xffb9c000}, {0xffb9e000}, {0xffba0000}, {0xffba2000}, {0xffba4000}, {0xffba6000}, {0xffba8000}, {0xffbaa000}, {0xffbac000}, {0xffbae000}, {0xffbb0000}, {0xffbb2000}, {0xffbb4000}, {0xffbb6000}, {0xffbb8000}, {0xffbba000}, {0xffbbc000}, {0xffbbe000}, {0xffbc0000}, {0xffbc2000}, {0xffbc4000}, {0xffbc6000}, {0xffbc8000}, {0xffbca000}, {0xffbcc000}, {0xffbce000}, {0xffbd0000}, {0xffbd2000}, {0xffbd4000}, {0xffbd6000}, {0xffbd8000}, {0xffbda000}, {0xffbdc000}, {0xffbde000}, {0xffbe0000}, {0xffbe2000}, {0xffbe4000}, {0xffbe6000}, {0xffbe8000}, {0xffbea000}, {0xffbec000}, {0xffbee000}, {0xffbf0000}, {0xffbf2000}, {0xffbf4000}, {0xffbf6000}, {0xffbf8000}, {0xffbfa000}, {0xffbfc000}, {0xffbfe000}, {0xffc00000}, {0xffc02000}, {0xffc04000}, {0xffc06000}, {0xffc08000}, {0xffc0a000}, {0xffc0c000}, {0xffc0e000}, {0xffc10000}, {0xffc12000}, {0xffc14000}, {0xffc16000}, {0xffc18000}, {0xffc1a000}, {0xffc1c000}, {0xffc1e000}, {0xffc20000}, {0xffc22000}, {0xffc24000}, {0xffc26000}, {0xffc28000}, {0xffc2a000}, {0xffc2c000}, {0xffc2e000}, {0xffc30000}, {0xffc32000}, {0xffc34000}, {0xffc36000}, {0xffc38000}, {0xffc3a000}, {0xffc3c000}, {0xffc3e000}, {0xffc40000}, {0xffc42000}, {0xffc44000}, {0xffc46000}, {0xffc48000}, {0xffc4a000}, {0xffc4c000}, {0xffc4e000}, {0xffc50000}, {0xffc52000}, {0xffc54000}, {0xffc56000}, {0xffc58000}, {0xffc5a000}, {0xffc5c000}, {0xffc5e000}, {0xffc60000}, {0xffc62000}, {0xffc64000}, {0xffc66000}, {0xffc68000}, {0xffc6a000}, {0xffc6c000}, {0xffc6e000}, {0xffc70000}, {0xffc72000}, {0xffc74000}, {0xffc76000}, {0xffc78000}, {0xffc7a000}, {0xffc7c000}, {0xffc7e000}, {0xffc80000}, {0xffc82000}, {0xffc84000}, {0xffc86000}, {0xffc88000}, {0xffc8a000}, {0xffc8c000}, {0xffc8e000}, {0xffc90000}, {0xffc92000}, {0xffc94000}, {0xffc96000}, {0xffc98000}, {0xffc9a000}, {0xffc9c000}, {0xffc9e000}, {0xffca0000}, {0xffca2000}, {0xffca4000}, {0xffca6000}, {0xffca8000}, {0xffcaa000}, {0xffcac000}, {0xffcae000}, {0xffcb0000}, {0xffcb2000}, {0xffcb4000}, {0xffcb6000}, {0xffcb8000}, {0xffcba000}, {0xffcbc000}, {0xffcbe000}, {0xffcc0000}, {0xffcc2000}, {0xffcc4000}, {0xffcc6000}, {0xffcc8000}, {0xffcca000}, {0xffccc000}, {0xffcce000}, {0xffcd0000}, {0xffcd2000}, {0xffcd4000}, {0xffcd6000}, {0xffcd8000}, {0xffcda000}, {0xffcdc000}, {0xffcde000}, {0xffce0000}, {0xffce2000}, {0xffce4000}, {0xffce6000}, {0xffce8000}, {0xffcea000}, {0xffcec000}, {0xffcee000}, {0xffcf0000}, {0xffcf2000}, {0xffcf4000}, {0xffcf6000}, {0xffcf8000}, {0xffcfa000}, {0xffcfc000}, {0xffcfe000}, {0xffd00000}, {0xffd02000}, {0xffd04000}, {0xffd06000}, {0xffd08000}, {0xffd0a000}, {0xffd0c000}, {0xffd0e000}, {0xffd10000}, {0xffd12000}, {0xffd14000}, {0xffd16000}, {0xffd18000}, {0xffd1a000}, {0xffd1c000}, {0xffd1e000}, {0xffd20000}, {0xffd22000}, {0xffd24000}, {0xffd26000}, {0xffd28000}, {0xffd2a000}, {0xffd2c000}, {0xffd2e000}, {0xffd30000}, {0xffd32000}, {0xffd34000}, {0xffd36000}, {0xffd38000}, {0xffd3a000}, {0xffd3c000}, {0xffd3e000}, {0xffd40000}, {0xffd42000}, {0xffd44000}, {0xffd46000}, {0xffd48000}, {0xffd4a000}, {0xffd4c000}, {0xffd4e000}, {0xffd50000}, {0xffd52000}, {0xffd54000}, {0xffd56000}, {0xffd58000}, {0xffd5a000}, {0xffd5c000}, {0xffd5e000}, {0xffd60000}, {0xffd62000}, {0xffd64000}, {0xffd66000}, {0xffd68000}, {0xffd6a000}, {0xffd6c000}, {0xffd6e000}, {0xffd70000}, {0xffd72000}, {0xffd74000}, {0xffd76000}, {0xffd78000}, {0xffd7a000}, {0xffd7c000}, {0xffd7e000}, {0xffd80000}, {0xffd82000}, {0xffd84000}, {0xffd86000}, {0xffd88000}, {0xffd8a000}, {0xffd8c000}, {0xffd8e000}, {0xffd90000}, {0xffd92000}, {0xffd94000}, {0xffd96000}, {0xffd98000}, {0xffd9a000}, {0xffd9c000}, {0xffd9e000}, {0xffda0000}, {0xffda2000}, {0xffda4000}, {0xffda6000}, {0xffda8000}, {0xffdaa000}, {0xffdac000}, {0xffdae000}, {0xffdb0000}, {0xffdb2000}, {0xffdb4000}, {0xffdb6000}, {0xffdb8000}, {0xffdba000}, {0xffdbc000}, {0xffdbe000}, {0xffdc0000}, {0xffdc2000}, {0xffdc4000}, {0xffdc6000}, {0xffdc8000}, {0xffdca000}, {0xffdcc000}, {0xffdce000}, {0xffdd0000}, {0xffdd2000}, {0xffdd4000}, {0xffdd6000}, {0xffdd8000}, {0xffdda000}, {0xffddc000}, {0xffdde000}, {0xffde0000}, {0xffde2000}, {0xffde4000}, {0xffde6000}, {0xffde8000}, {0xffdea000}, {0xffdec000}, {0xffdee000}, {0xffdf0000}, {0xffdf2000}, {0xffdf4000}, {0xffdf6000}, {0xffdf8000}, {0xffdfa000}, {0xffdfc000}, {0xffdfe000}, {0xffe00000}, {0xffe02000}, {0xffe04000}, {0xffe06000}, {0xffe08000}, {0xffe0a000}, {0xffe0c000}, {0xffe0e000}, {0xffe10000}, {0xffe12000}, {0xffe14000}, {0xffe16000}, {0xffe18000}, {0xffe1a000}, {0xffe1c000}, {0xffe1e000}, {0xffe20000}, {0xffe22000}, {0xffe24000}, {0xffe26000}, {0xffe28000}, {0xffe2a000}, {0xffe2c000}, {0xffe2e000}, {0xffe30000}, {0xffe32000}, {0xffe34000}, {0xffe36000}, {0xffe38000}, {0xffe3a000}, {0xffe3c000}, {0xffe3e000}, {0xffe40000}, {0xffe42000}, {0xffe44000}, {0xffe46000}, {0xffe48000}, {0xffe4a000}, {0xffe4c000}, {0xffe4e000}, {0xffe50000}, {0xffe52000}, {0xffe54000}, {0xffe56000}, {0xffe58000}, {0xffe5a000}, {0xffe5c000}, {0xffe5e000}, {0xffe60000}, {0xffe62000}, {0xffe64000}, {0xffe66000}, {0xffe68000}, {0xffe6a000}, {0xffe6c000}, {0xffe6e000}, {0xffe70000}, {0xffe72000}, {0xffe74000}, {0xffe76000}, {0xffe78000}, {0xffe7a000}, {0xffe7c000}, {0xffe7e000}, {0xffe80000}, {0xffe82000}, {0xffe84000}, {0xffe86000}, {0xffe88000}, {0xffe8a000}, {0xffe8c000}, {0xffe8e000}, {0xffe90000}, {0xffe92000}, {0xffe94000}, {0xffe96000}, {0xffe98000}, {0xffe9a000}, {0xffe9c000}, {0xffe9e000}, {0xffea0000}, {0xffea2000}, {0xffea4000}, {0xffea6000}, {0xffea8000}, {0xffeaa000}, {0xffeac000}, {0xffeae000}, {0xffeb0000}, {0xffeb2000}, {0xffeb4000}, {0xffeb6000}, {0xffeb8000}, {0xffeba000}, {0xffebc000}, {0xffebe000}, {0xffec0000}, {0xffec2000}, {0xffec4000}, {0xffec6000}, {0xffec8000}, {0xffeca000}, {0xffecc000}, {0xffece000}, {0xffed0000}, {0xffed2000}, {0xffed4000}, {0xffed6000}, {0xffed8000}, {0xffeda000}, {0xffedc000}, {0xffede000}, {0xffee0000}, {0xffee2000}, {0xffee4000}, {0xffee6000}, {0xffee8000}, {0xffeea000}, {0xffeec000}, {0xffeee000}, {0xffef0000}, {0xffef2000}, {0xffef4000}, {0xffef6000}, {0xffef8000}, {0xffefa000}, {0xffefc000}, {0xffefe000}, {0xfff00000}, {0xfff02000}, {0xfff04000}, {0xfff06000}, {0xfff08000}, {0xfff0a000}, {0xfff0c000}, {0xfff0e000}, {0xfff10000}, {0xfff12000}, {0xfff14000}, {0xfff16000}, {0xfff18000}, {0xfff1a000}, {0xfff1c000}, {0xfff1e000}, {0xfff20000}, {0xfff22000}, {0xfff24000}, {0xfff26000}, {0xfff28000}, {0xfff2a000}, {0xfff2c000}, {0xfff2e000}, {0xfff30000}, {0xfff32000}, {0xfff34000}, {0xfff36000}, {0xfff38000}, {0xfff3a000}, {0xfff3c000}, {0xfff3e000}, {0xfff40000}, {0xfff42000}, {0xfff44000}, {0xfff46000}, {0xfff48000}, {0xfff4a000}, {0xfff4c000}, {0xfff4e000}, {0xfff50000}, {0xfff52000}, {0xfff54000}, {0xfff56000}, {0xfff58000}, {0xfff5a000}, {0xfff5c000}, {0xfff5e000}, {0xfff60000}, {0xfff62000}, {0xfff64000}, {0xfff66000}, {0xfff68000}, {0xfff6a000}, {0xfff6c000}, {0xfff6e000}, {0xfff70000}, {0xfff72000}, {0xfff74000}, {0xfff76000}, {0xfff78000}, {0xfff7a000}, {0xfff7c000}, {0xfff7e000}, {0xfff80000}, {0xfff82000}, {0xfff84000}, {0xfff86000}, {0xfff88000}, {0xfff8a000}, {0xfff8c000}, {0xfff8e000}, {0xfff90000}, {0xfff92000}, {0xfff94000}, {0xfff96000}, {0xfff98000}, {0xfff9a000}, {0xfff9c000}, {0xfff9e000}, {0xfffa0000}, {0xfffa2000}, {0xfffa4000}, {0xfffa6000}, {0xfffa8000}, {0xfffaa000}, {0xfffac000}, {0xfffae000}, {0xfffb0000}, {0xfffb2000}, {0xfffb4000}, {0xfffb6000}, {0xfffb8000}, {0xfffba000}, {0xfffbc000}, {0xfffbe000}, {0xfffc0000}, {0xfffc2000}, {0xfffc4000}, {0xfffc6000}, {0xfffc8000}, {0xfffca000}, {0xfffcc000}, {0xfffce000}, {0xfffd0000}, {0xfffd2000}, {0xfffd4000}, {0xfffd6000}, {0xfffd8000}, {0xfffda000}, {0xfffdc000}, {0xfffde000}, {0xfffe0000}, {0xfffe2000}, {0xfffe4000}, {0xfffe6000}, {0xfffe8000}, {0xfffea000}, {0xfffec000}, {0xfffee000}, {0xffff0000}, {0xffff2000}, {0xffff4000}, {0xffff6000}, {0xffff8000}, {0xffffa000}, {0xffffc000}, {0xffffe000}, }; openexr-2.5.7/IlmBase/HalfTest/000077500000000000000000000000001406177042200162365ustar00rootroot00000000000000openexr-2.5.7/IlmBase/HalfTest/CMakeLists.txt000066400000000000000000000011551406177042200210000ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. add_executable(HalfTest main.cpp testArithmetic.cpp testBitPatterns.cpp testClassification.cpp testError.cpp testFunction.cpp testLimits.cpp testSize.cpp testToFloat.cpp ) target_link_libraries(HalfTest IlmBase::Half) set_target_properties(HalfTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) if(WIN32 AND (BUILD_SHARED_LIBS OR OPENEXR_BUILD_BOTH_STATIC_SHARED)) target_compile_definitions(HalfTest PRIVATE OPENEXR_DLL) endif() add_test(NAME IlmBase.Half COMMAND $) openexr-2.5.7/IlmBase/HalfTest/Makefile.am000066400000000000000000000012441406177042200202730ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in check_PROGRAMS = HalfTest HalfTest_SOURCES = main.cpp testArithmetic.cpp testArithmetic.h \ testBitPatterns.cpp testBitPatterns.h \ testClassification.cpp testClassification.h \ testError.cpp testError.h testFunction.cpp \ testFunction.h testLimits.cpp testLimits.h testSize.cpp \ testToFloat.cpp testToFloat.h \ testSize.h AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Half -I$(top_srcdir)/config LDADD = -L$(top_builddir)/Half -lHalf TESTS = HalfTest EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/HalfTest/main.cpp000066400000000000000000000015401406177042200176660ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include #include #include #include #include #define TEST(x) if (argc < 2 || !strcmp (argv[1], #x)) x(); int main (int argc, char *argv[]) { std::cout << "\ntesting type half:\n\n" << std::flush; TEST (testToFloat); TEST (testSize); TEST (testArithmetic); TEST (testNormalizedConversionError); TEST (testDenormalizedConversionError); TEST (testRoundingError); TEST (testBitPatterns); TEST (testClassification); TEST (testLimits); TEST (testFunction); return 0; } openexr-2.5.7/IlmBase/HalfTest/testArithmetic.cpp000066400000000000000000000020051406177042200217300ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "half.h" #include #include using namespace std; void testArithmetic () { cout << "basic arithmetic operations:\n"; float f1 (1); float f2 (2); half h1 (3); half h2 (4); cout << "f1 = " << f1 << ", " "f2 = " << f2 << ", " "h1 = " << h1 << ", " "h2 = " << h2 << endl; h1 = f1 + f2; assert (h1 == 3); cout << "h1 = f1 + f2: " << h1 << endl; h2 += f1; assert (h2 == 5); cout << "h2 += f1: " << h2 << endl; h2 = h1 + h2; assert (h2 == 8); cout << "h2 = h1 + h2: " << h2 << endl; h2 += h1; assert (h2 == 11); cout << "h2 += h1: " << h2 << endl; h1 = h2; assert (h1 == 11); cout << "h1 = h2: " << h1 << endl; h2 = -h1; assert (h2 == -11); cout << "h2 = -h1: " << h2 << endl; cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testArithmetic.h000066400000000000000000000001741406177042200214020ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testArithmetic (); openexr-2.5.7/IlmBase/HalfTest/testBitPatterns.cpp000066400000000000000000000340561406177042200221110ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "half.h" #include #include #include #include using namespace std; namespace { bool equalBitPatterns (const char *b1, const char *b2) { // // Returns true if the characters in zero-terminated string b1 // are the same as the charaters in string b2, except for places // where b1 or b2 contains an 'X'. For example: // // equalBitPatterns ("100", "100") returns true // equalBitPatterns ("100", "101") returns false // equalBitPatterns ("10X", "101") returns true // equalBitPatterns ("10X", "100") returns true // while (*b1 && *b2) { if (*b1 != *b2 && *b1 != 'X' && *b2 != 'X') return false; ++b1; ++b2; } return !(*b1 || *b2); } void testBits (float f, const char bh[19], const char bg[35]) { half h (f); float g (h); cout.width (15); cout.precision (8); cout << f << " "; printBits (cout, f); cout << " "; printBits (cout, h); cout << '\n'; cout.width (15); cout << g << " "; printBits (cout, g); cout << "\n\n"; if (bh || bg) { char ch[19], cg[35]; printBits (ch, h); printBits (cg, g); if (!equalBitPatterns (ch, bh)) { cout << "error: expected " << bh << ", got " << ch << endl; assert (false); } if (!equalBitPatterns (cg, bg)) { cout << "error: expected " << bg << ", got " << cg << endl; assert (false); } } } float floatPosInfinity () { half::uif x; x.i = 0x7f800000; return x.f; } float floatNegInfinity () { half::uif x; x.i = 0xff800000; return x.f; } float floatPosQNan1 () { half::uif x; x.i = 0x7fffffff; return x.f; } float floatNegQNan1 () { half::uif x; x.i = 0xffffffff; return x.f; } float floatPosQNan2 () { half::uif x; x.i = 0x7fd55555; return x.f; } float floatNegQNan2 () { half::uif x; x.i = 0xffd55555; return x.f; } } // namespace void testBitPatterns() { cout << "specific bit patterns\n\n"; // // Numbers close to 1.0 // testBits (1.0f, "0 01111 0000000000", "0 01111111 00000000000000000000000"); testBits (1.0f + HALF_EPSILON, "0 01111 0000000001", "0 01111111 00000000010000000000000"); testBits (1.0f + HALF_EPSILON * 0.5f, "0 01111 0000000000", "0 01111111 00000000000000000000000"); testBits (1.0f+ HALF_EPSILON * 0.4999f, "0 01111 0000000000", "0 01111111 00000000000000000000000"); testBits (1.0f + HALF_EPSILON * 0.5001f, "0 01111 0000000001", "0 01111111 00000000010000000000000"); testBits (1.0f + HALF_EPSILON + HALF_EPSILON, "0 01111 0000000010", "0 01111111 00000000100000000000000"); testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.5f, "0 01111 0000000010", "0 01111111 00000000100000000000000"); testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.4999f, "0 01111 0000000001", "0 01111111 00000000010000000000000"); testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.5001f, "0 01111 0000000010", "0 01111111 00000000100000000000000"); testBits (1.0f - HALF_EPSILON * 0.5f, "0 01110 1111111111", "0 01111110 11111111110000000000000"); testBits (1.0f - HALF_EPSILON * 0.5f * 0.5f, "0 01111 0000000000", "0 01111111 00000000000000000000000"); testBits (1.0f - HALF_EPSILON * 0.5f * 0.4999f, "0 01111 0000000000", "0 01111111 00000000000000000000000"); testBits (1.0f - HALF_EPSILON * 0.5f * 0.5001f, "0 01110 1111111111", "0 01111110 11111111110000000000000"); // // Numbers close to HALF_MIN // testBits (HALF_MIN, "0 00000 0000000001", "0 01100111 00000000000000000000000"); testBits (HALF_MIN + HALF_MIN, "0 00000 0000000010", "0 01101000 00000000000000000000000"); testBits (HALF_MIN + HALF_MIN * 0.5f, "0 00000 0000000010", "0 01101000 00000000000000000000000"); testBits (HALF_MIN + HALF_MIN * 0.4999f, "0 00000 0000000001", "0 01100111 00000000000000000000000"); testBits (HALF_MIN + HALF_MIN * 0.5001f, "0 00000 0000000010", "0 01101000 00000000000000000000000"); testBits (HALF_MIN - HALF_MIN, // NOSONAR - suppress SonarCloud bug report. "0 00000 0000000000", "0 00000000 00000000000000000000000"); testBits (HALF_MIN - HALF_MIN * 0.5f, "0 00000 0000000000", "0 00000000 00000000000000000000000"); testBits (HALF_MIN - HALF_MIN * 0.4999f, "0 00000 0000000001", "0 01100111 00000000000000000000000"); testBits (HALF_MIN - HALF_MIN * 0.5001f, "0 00000 0000000000", "0 00000000 00000000000000000000000"); // // Numbers close to HALF_NRM_MIN // testBits (HALF_NRM_MIN, "0 00001 0000000000", "0 01110001 00000000000000000000000"); testBits (HALF_NRM_MIN + HALF_MIN, "0 00001 0000000001", "0 01110001 00000000010000000000000"); testBits (HALF_NRM_MIN + HALF_MIN * 0.5f, "0 00001 0000000000", "0 01110001 00000000000000000000000"); testBits (HALF_NRM_MIN + HALF_MIN * 0.4999f, "0 00001 0000000000", "0 01110001 00000000000000000000000"); testBits (HALF_NRM_MIN + HALF_MIN * 0.5001f, "0 00001 0000000001", "0 01110001 00000000010000000000000"); testBits (HALF_NRM_MIN - HALF_MIN, "0 00000 1111111111", "0 01110000 11111111100000000000000"); testBits (HALF_NRM_MIN - HALF_MIN * 0.5f, "0 00001 0000000000", "0 01110001 00000000000000000000000"); testBits (HALF_NRM_MIN - HALF_MIN * 0.49995f, "0 00001 0000000000", "0 01110001 00000000000000000000000"); testBits (HALF_NRM_MIN - HALF_MIN * 0.50005f, "0 00000 1111111111", "0 01110000 11111111100000000000000"); // // Small positive integers and simple decimal fractions // testBits (2, "0 10000 0000000000", "0 10000000 00000000000000000000000"); testBits (3, "0 10000 1000000000", "0 10000000 10000000000000000000000"); testBits (10, "0 10010 0100000000", "0 10000010 01000000000000000000000"); testBits (0.1f, "0 01011 1001100110", "0 01111011 10011001100000000000000"); testBits (0.2f, "0 01100 1001100110", "0 01111100 10011001100000000000000"); testBits (0.3f, "0 01101 0011001101", "0 01111101 00110011010000000000000"); // // Numbers close to HALF_MAX // testBits (HALF_MAX, "0 11110 1111111111", "0 10001110 11111111110000000000000"); testBits ((1 << HALF_MAX_EXP) * 1.0, "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25f), "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25005f), "0 11110 1111111111", "0 10001110 11111111110000000000000"); testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.24995f), "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity // // Large positive numbers, positive infinity and NANs // testBits (HALF_MAX * HALF_MAX, "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity testBits (FLT_MAX, "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity testBits (floatPosInfinity(), "0 11111 0000000000", // +infinity "0 11111111 00000000000000000000000"); // +infinity testBits (floatPosQNan1(), "0 11111 1111111111", // nan "0 11111111 11111111110000000000000"); // nan testBits (floatPosQNan2(), "0 11111 1010101010", // nan "0 11111111 10101010100000000000000"); // nan // // Numbers close to -1.0 // testBits (-1.0, "1 01111 0000000000", "1 01111111 00000000000000000000000"); testBits (-(1.0f + HALF_EPSILON), "1 01111 0000000001", "1 01111111 00000000010000000000000"); testBits (-(1.0f + HALF_EPSILON * 0.5f), "1 01111 0000000000", "1 01111111 00000000000000000000000"); testBits (-(1.0f + HALF_EPSILON * 0.4999f), "1 01111 0000000000", "1 01111111 00000000000000000000000"); testBits (-(1.0f + HALF_EPSILON * 0.5001f), "1 01111 0000000001", "1 01111111 00000000010000000000000"); testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON), "1 01111 0000000010", "1 01111111 00000000100000000000000"); testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.5f), "1 01111 0000000010", "1 01111111 00000000100000000000000"); testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.4999f), "1 01111 0000000001", "1 01111111 00000000010000000000000"); testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.5001f), "1 01111 0000000010", "1 01111111 00000000100000000000000"); testBits (-(1.0f - HALF_EPSILON * 0.5f), "1 01110 1111111111", "1 01111110 11111111110000000000000"); testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.5f), "1 01111 0000000000", "1 01111111 00000000000000000000000"); testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.4999f), "1 01111 0000000000", "1 01111111 00000000000000000000000"); testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.5001f), "1 01110 1111111111", "1 01111110 11111111110000000000000"); // // Numbers close to -HALF_MIN // testBits (-HALF_MIN, "1 00000 0000000001", "1 01100111 00000000000000000000000"); testBits (-(HALF_MIN + HALF_MIN), "1 00000 0000000010", "1 01101000 00000000000000000000000"); testBits (-(HALF_MIN + HALF_MIN * 0.5f), "1 00000 0000000010", "1 01101000 00000000000000000000000"); testBits (-(HALF_MIN + HALF_MIN * 0.4999f), "1 00000 0000000001", "1 01100111 00000000000000000000000"); testBits (-(HALF_MIN + HALF_MIN * 0.5001f), "1 00000 0000000010", "1 01101000 00000000000000000000000"); testBits (-(HALF_MIN - HALF_MIN), // NOSONAR - suppress SonarCloud bug report. "X 00000 0000000000", "X 00000000 00000000000000000000000"); testBits (-(HALF_MIN - HALF_MIN * 0.5f), "1 00000 0000000000", "1 00000000 00000000000000000000000"); testBits (-(HALF_MIN - HALF_MIN * 0.4999f), "1 00000 0000000001", "1 01100111 00000000000000000000000"); testBits (-(HALF_MIN - HALF_MIN * 0.5001f), "1 00000 0000000000", "1 00000000 00000000000000000000000"); // // Numbers close to -HALF_NRM_MIN // testBits (-HALF_NRM_MIN, "1 00001 0000000000", "1 01110001 00000000000000000000000"); testBits (-(HALF_NRM_MIN + HALF_MIN), "1 00001 0000000001", "1 01110001 00000000010000000000000"); testBits (-(HALF_NRM_MIN + HALF_MIN * 0.5f), "1 00001 0000000000", "1 01110001 00000000000000000000000"); testBits (-(HALF_NRM_MIN + HALF_MIN * 0.4999f), "1 00001 0000000000", "1 01110001 00000000000000000000000"); testBits (-(HALF_NRM_MIN + HALF_MIN * 0.5001f), "1 00001 0000000001", "1 01110001 00000000010000000000000"); testBits (-(HALF_NRM_MIN - HALF_MIN), "1 00000 1111111111", "1 01110000 11111111100000000000000"); testBits (-(HALF_NRM_MIN - HALF_MIN * 0.5f), "1 00001 0000000000", "1 01110001 00000000000000000000000"); testBits (-(HALF_NRM_MIN - HALF_MIN * 0.49995f), "1 00001 0000000000", "1 01110001 00000000000000000000000"); testBits (-(HALF_NRM_MIN - HALF_MIN * 0.50005f), "1 00000 1111111111", "1 01110000 11111111100000000000000"); // // Small negative integers and simple decimal fractions // testBits (-2, "1 10000 0000000000", "1 10000000 00000000000000000000000"); testBits (-3, "1 10000 1000000000", "1 10000000 10000000000000000000000"); testBits (-10, "1 10010 0100000000", "1 10000010 01000000000000000000000"); testBits (-0.1f, "1 01011 1001100110", "1 01111011 10011001100000000000000"); testBits (-0.2f, "1 01100 1001100110", "1 01111100 10011001100000000000000"); testBits (-0.3f, "1 01101 0011001101", "1 01111101 00110011010000000000000"); // // Numbers close to -HALF_MAX // testBits (-HALF_MAX, "1 11110 1111111111", "1 10001110 11111111110000000000000"); testBits (-(1 << HALF_MAX_EXP) * 1.0f, "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25f), "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25005f), "1 11110 1111111111", "1 10001110 11111111110000000000000"); testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.24995f), "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity // // Large negative numbers, negative infinity and NANs // testBits (-HALF_MAX * HALF_MAX, "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity testBits (-FLT_MAX, "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity testBits (floatNegInfinity(), "1 11111 0000000000", // +infinity "1 11111111 00000000000000000000000"); // +infinity testBits (floatNegQNan1(), "1 11111 1111111111", // nan "1 11111111 11111111110000000000000"); // nan testBits (floatNegQNan2(), "1 11111 1010101010", // nan "1 11111111 10101010100000000000000"); // nan cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testBitPatterns.h000066400000000000000000000001751406177042200215510ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testBitPatterns (); openexr-2.5.7/IlmBase/HalfTest/testClassification.cpp000066400000000000000000000104671406177042200226050ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "half.h" #include #include #include using namespace std; namespace { #if __cplusplus >= 201402L static_assert(std::is_trivially_default_constructible::value, "half is trivial and default constructible"); #endif void testClass (half h, bool finite, bool normalized, bool denormalized, bool zero, bool nan, bool infinity, bool negative) { cout.width (15); cout.precision (8); cout << h << " "; printBits (cout, h); cout << " "; if (h.isFinite()) cout << "finite "; if (h.isNormalized()) cout << "normalized "; if (h.isDenormalized()) cout << "denormalized "; if (h.isZero()) cout << "zero "; if (h.isNan()) cout << "nan "; if (h.isInfinity()) cout << "infinity "; if (h.isNegative()) cout << "negative "; cout << endl; assert (h.isFinite() == finite); assert (h.isNormalized() == normalized); assert (h.isDenormalized() == denormalized); assert (h.isZero() == zero); assert (h.isNan() == nan); assert (h.isInfinity() == infinity); assert (h.isNegative() == negative); } float floatPosInfinity () { half::uif x; x.i = 0x7f800000; return x.f; } float floatNegInfinity () { half::uif x; x.i = 0xff800000; return x.f; } float floatPosQNan1 () { half::uif x; x.i = 0x7fffffff; return x.f; } float floatNegQNan1 () { half::uif x; x.i = 0xffffffff; return x.f; } float floatPosQNan2 () { half::uif x; x.i = 0x7fd55555; return x.f; } float floatNegQNan2 () { half::uif x; x.i = 0xffd55555; return x.f; } } // namespace void testClassification() { cout << "classification of bit patterns\n\n"; // // fini norm deno zero nan inf neg // testClass (0.0, 1, 0, 0, 1, 0, 0, 0); testClass (1.0, 1, 1, 0, 0, 0, 0, 0); testClass (1.0f + HALF_EPSILON, 1, 1, 0, 0, 0, 0, 0); testClass (HALF_MIN, 1, 0, 1, 0, 0, 0, 0); testClass (HALF_MIN + HALF_MIN, 1, 0, 1, 0, 0, 0, 0); testClass (HALF_NRM_MIN, 1, 1, 0, 0, 0, 0, 0); testClass (HALF_NRM_MIN + HALF_MIN, 1, 1, 0, 0, 0, 0, 0); testClass (HALF_NRM_MIN - HALF_MIN, 1, 0, 1, 0, 0, 0, 0); testClass (2.0f, 1, 1, 0, 0, 0, 0, 0); testClass (3.0f, 1, 1, 0, 0, 0, 0, 0); testClass (0.1f, 1, 1, 0, 0, 0, 0, 0); testClass (0.2f, 1, 1, 0, 0, 0, 0, 0); testClass (0.3f, 1, 1, 0, 0, 0, 0, 0); testClass (HALF_MAX, 1, 1, 0, 0, 0, 0, 0); testClass (floatPosInfinity(), 0, 0, 0, 0, 0, 1, 0); testClass (floatPosQNan1(), 0, 0, 0, 0, 1, 0, 0); testClass (floatPosQNan2(), 0, 0, 0, 0, 1, 0, 0); testClass (-1.0f, 1, 1, 0, 0, 0, 0, 1); testClass (-1.0f - HALF_EPSILON, 1, 1, 0, 0, 0, 0, 1); testClass (-HALF_MIN, 1, 0, 1, 0, 0, 0, 1); testClass (-HALF_MIN - HALF_MIN, 1, 0, 1, 0, 0, 0, 1); testClass (-HALF_NRM_MIN, 1, 1, 0, 0, 0, 0, 1); testClass (-HALF_NRM_MIN - HALF_MIN,1, 1, 0, 0, 0, 0, 1); testClass (-HALF_NRM_MIN + HALF_MIN,1, 0, 1, 0, 0, 0, 1); testClass (-2.0f, 1, 1, 0, 0, 0, 0, 1); testClass (-3.0f, 1, 1, 0, 0, 0, 0, 1); testClass (-0.1f, 1, 1, 0, 0, 0, 0, 1); testClass (-0.2f, 1, 1, 0, 0, 0, 0, 1); testClass (-0.3f, 1, 1, 0, 0, 0, 0, 1); testClass (-HALF_MAX, 1, 1, 0, 0, 0, 0, 1); testClass (floatNegInfinity(), 0, 0, 0, 0, 0, 1, 1); testClass (floatNegQNan1(), 0, 0, 0, 0, 1, 0, 1); testClass (floatNegQNan2(), 0, 0, 0, 0, 1, 0, 1); cout << "\n"; testClass (half::posInf(), 0, 0, 0, 0, 0, 1, 0); testClass (half::negInf(), 0, 0, 0, 0, 0, 1, 1); testClass (half::qNan(), 0, 0, 0, 0, 1, 0, 0); testClass (half::sNan(), 0, 0, 0, 0, 1, 0, 0); cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testClassification.h000066400000000000000000000002001406177042200222320ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testClassification (); openexr-2.5.7/IlmBase/HalfTest/testError.cpp000066400000000000000000000074731406177042200207460ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "half.h" #include #include #include #include using namespace std; namespace { float drand() { static std::default_random_engine generator; static std::uniform_real_distribution distribution (0.0f, 1.0f); float r = distribution (generator); return r; } } // namespace void testNormalizedConversionError() { cout << "float-to-half conversion error for normalized half numbers\n"; float eMax = 0; for (int i = 0; i < 20000000; i++) { float f (drand() * HALF_MAX); if (f < HALF_NRM_MIN) continue; if (i & 1) f = -f; half h (f); float e = 1.0f - h/f; if (e < 0) e = -e; if (e > HALF_EPSILON * 0.5) { cout << "float = " << f << ", half = " << h << ", error = " << e << endl; assert (false); } if (e > eMax) eMax = e; } cout << "max error = " << eMax << endl; cout << "max expected error = " << HALF_EPSILON * 0.5 << endl; cout << "ok\n\n" << flush; } void testDenormalizedConversionError() { cout << "float-to-half conversion error for denormalized half numbers\n"; float eMax = 0; for (int i = 0; i < 20000000; i++) { float f (drand() * (HALF_NRM_MIN - HALF_MIN)); if (i & 1) f = -f; half h (f); float e = h - f; if (e < 0) e = -e; if (e > HALF_MIN * 0.5) { cout << "float = " << f << ", half = " << h << ", error = " << e << endl; assert (false); } if (e > eMax) eMax = e; } cout << "max error = " << eMax << endl; cout << "max expected error = " << HALF_MIN * 0.5 << endl; cout << "ok\n\n" << flush; } namespace { void testNormalizedRounding (int n) { cout << "rounding normalized numbers to " << n << "-bit precision\n"; float eExpected = (n < 10)? HALF_EPSILON * 0.5f * (1 << (10 - n)): 0; float eMax = 0; for (int i = 0; i < 200000; i++) { half h (drand() * HALF_MAX); if (h < HALF_NRM_MIN) continue; if (i & 1) h = -h; half r (h.round(n)); float e = 1.0f - r/h; if (e < 0) e = -e; if (e > eExpected) { cout << "half = " << h << ", rounded = " << r << ", error = " << e << ", expected error = " << eExpected << endl; printBits (cout, h); cout << endl; printBits (cout, r); cout << endl; assert (false); } if (e > eMax) eMax = e; } cout << "max error = " << eMax << endl; cout << "max expected error = " << eExpected << endl; cout << "ok\n\n" << flush; } void testDenormalizedRounding (int n) { cout << "rounding denormalized numbers to " << n << "-bit precision\n"; float eExpected = (n < 10)? HALF_MIN * 0.5f * (1 << (10 - n)): 0; float eMax = 0; for (int i = 0; i < 200000; i++) { half h (drand() * (HALF_NRM_MIN - HALF_MIN)); if (i & 1) h = -h; half r (h.round(n)); float e = r - h; if (e < 0) e = -e; if (e > eExpected) { cout << "half = " << h << ", rounded = " << r << ", error = " << e << ", expected error = " << eExpected << endl; printBits (cout, h); cout << endl; printBits (cout, r); cout << endl; assert (false); } if (e > eMax) eMax = e; } cout << "max error = " << eMax << endl; cout << "max expected error = " << eExpected << endl; cout << "ok\n\n" << flush; } } // namespace void testRoundingError () { testNormalizedRounding (10); testDenormalizedRounding (10); testNormalizedRounding (9); testDenormalizedRounding (9); testNormalizedRounding (1); testDenormalizedRounding (1); testNormalizedRounding (0); testDenormalizedRounding (0); } openexr-2.5.7/IlmBase/HalfTest/testError.h000066400000000000000000000003171406177042200204010ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testNormalizedConversionError (); void testDenormalizedConversionError (); void testRoundingError (); openexr-2.5.7/IlmBase/HalfTest/testFunction.cpp000066400000000000000000000027211406177042200214310ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "halfFunction.h" #include #include using namespace std; namespace { float divideByTwo (float x) { return x / 2; } struct timesN { timesN (float n): n (n) {} float operator () (float x) {return x * n;} float n; }; } // namespace void testFunction () { cout << "halfFunction\n"; halfFunction d2 (divideByTwo); assert (d2 (0) == 0); assert (d2 (2) == 1); assert (d2 (-2) == -1); assert (d2 (HALF_MAX) == HALF_MAX / 2); assert (d2 (-HALF_MAX) == -HALF_MAX / 2); assert (d2 (half::posInf()) == 0); assert (d2 (half::negInf()) == 0); assert (d2 (half::qNan()) == 0); halfFunction t5 (timesN (5), // function 0, HALF_MAX / 8, // domain -1, // default value half::posInf(), // posInfValue half::negInf(), // negInfValue half::qNan()); // nanValue assert (t5 (0) == 0); assert (t5 (2) == 10); assert (t5 (-2) == -1); assert (t5 (HALF_MAX) == -1); assert (t5 (-HALF_MAX) == -1); assert ( t5(half::posInf()).isInfinity()); assert (!t5(half::posInf()).isNegative()); assert (t5(half::negInf()).isInfinity()); assert (t5(half::negInf()).isNegative()); assert (t5(half::qNan()).isNan()); cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testFunction.h000066400000000000000000000001721406177042200210740ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testFunction (); openexr-2.5.7/IlmBase/HalfTest/testLimits.cpp000066400000000000000000000034711406177042200211100ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "halfLimits.h" #include #include #include using namespace std; namespace { float mypow (int x, int y) { bool negative = false; if (y < 0) { negative = true; y = -y; } float z = 1; while (y > 0) { z *= x; y -= 1; } if (negative) z = 1 / z; return z; } } // namespace void testLimits() { cout << "values in std::numeric_limits\n"; cout << "min_exponent\n"; { half h (mypow (2, numeric_limits::min_exponent - 1)); assert (h.isNormalized()); } { half h (mypow (2, numeric_limits::min_exponent - 2)); assert (h.isDenormalized()); } cout << "max_exponent\n"; { half h (mypow (2, numeric_limits::max_exponent - 1)); assert (h.isNormalized()); } { half h (mypow (2, numeric_limits::max_exponent)); assert (h.isInfinity()); } cout << "min_exponent10\n"; { half h (mypow (10, numeric_limits::min_exponent10)); assert (h.isNormalized()); } { half h (mypow (10, numeric_limits::min_exponent10 - 1)); assert (h.isDenormalized()); } cout << "max_exponent10\n"; { half h (mypow (10, numeric_limits::max_exponent10)); assert (h.isNormalized()); } { half h (mypow (10, numeric_limits::max_exponent10 + 1)); assert (h.isInfinity()); } #if __cplusplus >= 201103L cout << "max_digits10\n"; assert (numeric_limits::max_digits10 == std::ceil(numeric_limits::digits * std::log10(2) + 1)); cout << "lowest\n"; assert (numeric_limits::lowest() == -HALF_MAX); #endif cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testLimits.h000066400000000000000000000001701406177042200205460ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testLimits (); openexr-2.5.7/IlmBase/HalfTest/testSize.cpp000066400000000000000000000011221406177042200205500ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include "half.h" #include #include #include using namespace std; void testSize () { cout << "size and alignment\n"; half h[2]; int size = sizeof (half); ptrdiff_t algn = (char *)&h[1] - (char *)&h[0]; cout << "sizeof (half) = " << size << endl; cout << "alignof (half) = " << (int) algn << endl; assert (size == 2 && algn == 2); cout << "ok\n\n" << flush; } openexr-2.5.7/IlmBase/HalfTest/testSize.h000066400000000000000000000001651406177042200202230ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testSize (); openexr-2.5.7/IlmBase/HalfTest/testToFloat.cpp000066400000000000000000000054251406177042200212200ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include using namespace std; // // This test uses the code that generates the toFLoat.h header to // validate the the tabel values are correct. // //--------------------------------------------------- // Interpret an unsigned short bit pattern as a half, // and convert that half to the corresponding float's // bit pattern. //--------------------------------------------------- unsigned int halfToFloat (unsigned short y) { int s = (y >> 15) & 0x00000001; int e = (y >> 10) & 0x0000001f; int m = y & 0x000003ff; if (e == 0) { if (m == 0) { // // Plus or minus zero // return s << 31; } else { // // Denormalized number -- renormalize it // while (!(m & 0x00000400)) { m <<= 1; e -= 1; } e += 1; m &= ~0x00000400; } } else if (e == 31) { if (m == 0) { // // Positive or negative infinity // return (s << 31) | 0x7f800000; } else { // // Nan -- preserve sign and significand bits // return (s << 31) | 0x7f800000 | (m << 13); } } // // Normalized number // e = e + (127 - 15); m = m << 13; // // Assemble s, e and m. // return (s << 31) | (e << 23) | m; } union HalfShort { half h; unsigned short s; }; void testToFloat () { std::cout << "running testToFloat" << std::endl; constexpr int iMax = (1 << 16); // // for each 16-bit bit pattern... // for (int s = 0; s < iMax; s++) { HalfShort hs; hs.s = s; // // cast these bits to a float, using the cast-to-float // operator. // float f = float (hs.h); // = _toFloat[s] // // Cast that float back to a half. // half h = half (f); // // halfToFloat() above is what generated the _toFloat table. // The i value return is the integer bit pattern of the corresponding // float. // half::uif uif; uif.i = halfToFloat (s); // // Equality operators fail for inf and nan, so handle them // specially. // if (isnan (f)) { assert (h.isNan()); assert (isnan (uif.f)); } else if (isinf (f)) { assert (h.isInfinity()); assert (isinf (uif.f)); } else { assert (h == hs.h); assert (f == uif.f); } } std::cout << "ok" << std::endl; } openexr-2.5.7/IlmBase/HalfTest/testToFloat.h000066400000000000000000000001701406177042200206550ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // void testToFloat (); openexr-2.5.7/IlmBase/Iex/000077500000000000000000000000001406177042200152515ustar00rootroot00000000000000openexr-2.5.7/IlmBase/Iex/CMakeLists.txt000066400000000000000000000006211406177042200200100ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. ilmbase_define_library(Iex PRIV_EXPORT IEX_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES IexBaseExc.cpp IexThrowErrnoExc.cpp HEADERS IexBaseExc.h IexMathExc.h IexThrowErrnoExc.h IexErrnoExc.h IexMacros.h Iex.h IexNamespace.h IexExport.h IexForward.h ) openexr-2.5.7/IlmBase/Iex/Iex.h000066400000000000000000000045341406177042200161550ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEX_H #define INCLUDED_IEX_H //-------------------------------- // // Exception handling // //-------------------------------- #include "IexMacros.h" #include "IexBaseExc.h" #include "IexMathExc.h" #include "IexThrowErrnoExc.h" // Note that we do not include file IexErrnoExc.h here. That file // defines over 150 classes and significantly slows down compilation. // If you throw ErrnoExc exceptions using the throwErrnoExc() function, // you don't need IexErrnoExc.h. You have to include IexErrnoExc.h // only if you want to catch specific subclasses of ErrnoExc. #endif openexr-2.5.7/IlmBase/Iex/IexBaseExc.cpp000066400000000000000000000333421406177042200177420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------- // // Constructors and destructors for our exception base class. // //--------------------------------------------------------------------- #include "IexExport.h" #include "IexBaseExc.h" #include "IexMacros.h" #include "IexErrnoExc.h" #include "IexMathExc.h" #ifdef _WIN32 #include #endif #include IEX_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { StackTracer currentStackTracer = 0; } // namespace void setStackTracer (StackTracer stackTracer) { currentStackTracer = stackTracer; } StackTracer stackTracer () { return currentStackTracer; } BaseExc::BaseExc (const char* s) throw () : _message (s? s: ""), _stackTrace (currentStackTracer? currentStackTracer(): "") { // empty } BaseExc::BaseExc (const std::string &s) throw () : _message (s), _stackTrace (currentStackTracer? currentStackTracer(): "") { // empty } BaseExc::BaseExc (std::stringstream &s) throw () : _message (s.str()), _stackTrace (currentStackTracer? currentStackTracer(): "") { // empty } BaseExc::BaseExc (const BaseExc &be) throw() : _message (be._message), _stackTrace (be._stackTrace) { } BaseExc::~BaseExc () throw () { } BaseExc & BaseExc::operator = (const BaseExc& be) throw () { if (this != &be) { _message = be._message; _stackTrace = be._stackTrace; } return *this; } BaseExc & BaseExc::operator = (BaseExc&& be) throw () { if (this != &be) { _message = std::move (be._message); _stackTrace = std::move (be._stackTrace); } return *this; } const char * BaseExc::what () const throw () { return _message.c_str(); } BaseExc & BaseExc::assign (std::stringstream &s) { _message.assign (s.str()); return *this; } BaseExc & BaseExc::append (std::stringstream &s) { _message.append (s.str()); return *this; } const std::string & BaseExc::message() const { return _message; } BaseExc & BaseExc::operator = (std::stringstream &s) { return assign (s); } BaseExc & BaseExc::operator += (std::stringstream &s) { return append (s); } BaseExc & BaseExc::assign (const char *s) { _message.assign(s); return *this; } BaseExc & BaseExc::operator = (const char *s) { return assign(s); } BaseExc & BaseExc::append (const char *s) { _message.append(s); return *this; } BaseExc & BaseExc::operator += (const char *s) { return append(s); } const std::string & BaseExc::stackTrace () const { return _stackTrace; } DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ArgExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, LogicExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InputExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, IoExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, MathExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErrnoExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, NoImplExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, NullExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, TypeExc, BaseExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpermExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoentExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsrchExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EintrExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EioExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnxioExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, E2bigExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoexecExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadfExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EchildExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EagainExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnomemExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaccesExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EfaultExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotblkExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbusyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EexistExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ExdevExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnodevExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotdirExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisdirExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnfileExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmfileExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnottyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtxtbsyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EfbigExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnospcExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EspipeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErofsExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmlinkExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpipeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdomExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErangeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnomsgExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EidrmExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EchrngExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El2nsyncExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El3hltExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El3rstExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElnrngExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EunatchExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnocsiExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, El2hltExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdeadlkExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolckExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadrExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ExfullExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoanoExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadrqcExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadsltExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdeadlockExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbfontExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnostrExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnodataExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtimeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnosrExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnonetExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnopkgExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremoteExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolinkExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EadvExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsrmntExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcommExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprotoExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmultihopExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadmsgExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnametoolongExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EoverflowExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotuniqExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbadfdExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremchgExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibaccExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibbadExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibscnExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibmaxExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ElibexecExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EilseqExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnosysExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EloopExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, ErestartExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EstrpipeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotemptyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EusersExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotsockExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdestaddrreqExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmsgsizeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprototypeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoprotooptExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EprotonosupportExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EsocktnosupportExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EopnotsuppExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EpfnosupportExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EafnosupportExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaddrinuseExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EaddrnotavailExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetdownExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetunreachExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnetresetExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnabortedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnresetExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnobufsExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisconnExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotconnExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EshutdownExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtoomanyrefsExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EtimedoutExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EconnrefusedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EhostdownExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EhostunreachExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EalreadyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinprogressExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EstaleExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EioresidExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EucleanExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotnamExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnavailExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EisnamExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremoteioExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinitExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EremdevExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcanceledExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnolimfileExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EproclimExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdisjointExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnologinExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EloginlimExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EgrouploopExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoattachExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotsupExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoattrExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdircorruptedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdquotExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnfsremoteExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcontrollerExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotcontrollerExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EenqueuedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotenqueuedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EjoinedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotjoinedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoprocExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EmustrunExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnotstoppedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EclockcpuExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalstateExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnoexistExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EendofminorExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EbufsizeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EemptyExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EnointrgroupExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvalmodeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EcantextentExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EinvaltimeExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, EdestroyedExc, ErrnoExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, OverflowExc, MathExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, UnderflowExc, MathExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, DivzeroExc, MathExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InexactExc, MathExc) DEFINE_EXC_EXP_IMPL (IEX_EXPORT, InvalidFpOpExc, MathExc) IEX_INTERNAL_NAMESPACE_SOURCE_EXIT #ifdef _WIN32 #pragma optimize("", off) void iex_debugTrap() { if (0 != getenv("IEXDEBUGTHROW")) ::DebugBreak(); } #else void iex_debugTrap() { // how to in Linux? if (0 != ::getenv("IEXDEBUGTHROW")) __builtin_trap(); } #endif openexr-2.5.7/IlmBase/Iex/IexBaseExc.h000066400000000000000000000235331406177042200174100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXBASEEXC_H #define INCLUDED_IEXBASEEXC_H #include "IexNamespace.h" #include "IexExport.h" //---------------------------------------------------------- // // A general exception base class, and a few // useful exceptions derived from the base class. // //---------------------------------------------------------- #include #include #include IEX_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------- // Our most basic exception class //------------------------------- class BaseExc: public std::exception { public: //---------------------------- // Constructors and destructor //---------------------------- IEX_EXPORT BaseExc (const char *s = nullptr) throw(); // std::string (s) IEX_EXPORT BaseExc (const std::string &s) throw(); // std::string (s) IEX_EXPORT BaseExc (std::stringstream &s) throw(); // std::string (s.str()) IEX_EXPORT BaseExc (const BaseExc &be) throw(); IEX_EXPORT BaseExc (BaseExc &&be) throw(); IEX_EXPORT virtual ~BaseExc () throw (); IEX_EXPORT BaseExc & operator = (const BaseExc& be) throw (); IEX_EXPORT BaseExc & operator = (BaseExc&& be) throw (); //--------------------------------------------------- // what() method -- e.what() returns _message.c_str() //--------------------------------------------------- IEX_EXPORT virtual const char * what () const throw (); //-------------------------------------------------- // Convenient methods to change the exception's text //-------------------------------------------------- IEX_EXPORT BaseExc & assign (std::stringstream &s); // assign (s.str()) IEX_EXPORT BaseExc & operator = (std::stringstream &s); IEX_EXPORT BaseExc & append (std::stringstream &s); // append (s.str()) IEX_EXPORT BaseExc & operator += (std::stringstream &s); //-------------------------------------------------- // These methods from the base class get obscured by // the definitions above. //-------------------------------------------------- IEX_EXPORT BaseExc & assign (const char *s); IEX_EXPORT BaseExc & operator = (const char *s); IEX_EXPORT BaseExc & append (const char *s); IEX_EXPORT BaseExc & operator += (const char *s); //--------------------------------------------------- // Access to the string representation of the message //--------------------------------------------------- IEX_EXPORT const std::string & message () const; //-------------------------------------------------- // Stack trace for the point at which the exception // was thrown. The stack trace will be an empty // string unless a working stack-tracing routine // has been installed (see below, setStackTracer()). //-------------------------------------------------- IEX_EXPORT const std::string & stackTrace () const; private: std::string _message; std::string _stackTrace; }; //----------------------------------------------------- // A macro to save typing when declararing an exception // class derived directly or indirectly from BaseExc: //----------------------------------------------------- #define DEFINE_EXC_EXP(exp, name, base) \ class name: public base \ { \ public: \ exp name() throw(); \ exp name (const char* text) throw(); \ exp name (const std::string &text) throw(); \ exp name (std::stringstream &text) throw(); \ exp name (const name &other) throw(); \ exp name (name &&other) throw(); \ exp name& operator = (name &other) throw(); \ exp name& operator = (name &&other) throw(); \ exp ~name() throw(); \ }; #define DEFINE_EXC_EXP_IMPL(exp, name, base) \ exp name::name () throw () : base () {} \ exp name::name (const char* text) throw () : base (text) {} \ exp name::name (const std::string& text) throw () : base (text) {} \ exp name::name (std::stringstream& text) throw () : base (text) {} \ exp name::name (const name &other) throw() : base (other) {} \ exp name::name (name &&other) throw() : base (other) {} \ exp name& name::operator = (name &other) throw() { base::operator=(other); return *this; } \ exp name& name::operator = (name &&other) throw() { base::operator=(other); return *this; } \ exp name::~name () throw () {} // For backward compatibility. #define DEFINE_EXC(name, base) DEFINE_EXC_EXP(, name, base) //-------------------------------------------------------- // Some exceptions which should be useful in most programs //-------------------------------------------------------- DEFINE_EXC_EXP (IEX_EXPORT, ArgExc, BaseExc) // Invalid arguments to a function call DEFINE_EXC_EXP (IEX_EXPORT, LogicExc, BaseExc) // General error in a program's logic, // for example, a function was called // in a context where the call does // not make sense. DEFINE_EXC_EXP (IEX_EXPORT, InputExc, BaseExc) // Invalid input data, e.g. from a file DEFINE_EXC_EXP (IEX_EXPORT, IoExc, BaseExc) // Input or output operation failed DEFINE_EXC_EXP (IEX_EXPORT, MathExc, BaseExc) // Arithmetic exception; more specific // exceptions derived from this class // are defined in ExcMath.h DEFINE_EXC_EXP (IEX_EXPORT, ErrnoExc, BaseExc) // Base class for exceptions corresponding // to errno values (see errno.h); more // specific exceptions derived from this // class are defined in ExcErrno.h DEFINE_EXC_EXP (IEX_EXPORT, NoImplExc, BaseExc) // Missing method exception e.g. from a // call to a method that is only partially // or not at all implemented. A reminder // to lazy software people to get back // to work. DEFINE_EXC_EXP (IEX_EXPORT, NullExc, BaseExc) // A pointer is inappropriately null. DEFINE_EXC_EXP (IEX_EXPORT, TypeExc, BaseExc) // An object is an inappropriate type, // i.e. a dynamnic_cast failed. //---------------------------------------------------------------------- // Stack-tracing support: // // setStackTracer(st) // // installs a stack-tracing routine, st, which will be called from // class BaseExc's constructor every time an exception derived from // BaseExc is thrown. The stack-tracing routine should return a // string that contains a printable representation of the program's // current call stack. This string will be stored in the BaseExc // object; the string is accesible via the BaseExc::stackTrace() // method. // // setStackTracer(0) // // removes the current stack tracing routine. When an exception // derived from BaseExc is thrown, the stack trace string stored // in the BaseExc object will be empty. // // stackTracer() // // returns a pointer to the current stack-tracing routine, or 0 // if there is no current stack stack-tracing routine. // //---------------------------------------------------------------------- typedef std::string (* StackTracer) (); IEX_EXPORT void setStackTracer (StackTracer stackTracer); IEX_EXPORT StackTracer stackTracer (); IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IEXBASEEXC_H openexr-2.5.7/IlmBase/Iex/IexErrnoExc.h000066400000000000000000000234511406177042200176220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXERRNOEXC_H #define INCLUDED_IEXERRNOEXC_H //---------------------------------------------------------------- // // Exceptions which correspond to "errno" error codes. // //---------------------------------------------------------------- #include "IexBaseExc.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER DEFINE_EXC_EXP (IEX_EXPORT, EpermExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoentExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EsrchExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EintrExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EioExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnxioExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, E2bigExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoexecExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadfExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EchildExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EagainExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnomemExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EaccesExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EfaultExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotblkExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbusyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EexistExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ExdevExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnodevExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotdirExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EisdirExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinvalExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnfileExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EmfileExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnottyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EtxtbsyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EfbigExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnospcExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EspipeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ErofsExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EmlinkExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EpipeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdomExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ErangeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnomsgExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EidrmExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EchrngExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, El2nsyncExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, El3hltExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, El3rstExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElnrngExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EunatchExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnocsiExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, El2hltExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdeadlkExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnolckExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadrExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ExfullExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoanoExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadrqcExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadsltExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdeadlockExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbfontExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnostrExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnodataExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EtimeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnosrExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnonetExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnopkgExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EremoteExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnolinkExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EadvExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EsrmntExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EcommExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EprotoExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EmultihopExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadmsgExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnametoolongExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EoverflowExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotuniqExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbadfdExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EremchgExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElibaccExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElibbadExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElibscnExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElibmaxExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ElibexecExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EilseqExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnosysExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EloopExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, ErestartExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EstrpipeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotemptyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EusersExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotsockExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdestaddrreqExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EmsgsizeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EprototypeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoprotooptExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EprotonosupportExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EsocktnosupportExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EopnotsuppExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EpfnosupportExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EafnosupportExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EaddrinuseExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EaddrnotavailExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnetdownExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnetunreachExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnetresetExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EconnabortedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EconnresetExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnobufsExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EisconnExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotconnExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EshutdownExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EtoomanyrefsExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EtimedoutExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EconnrefusedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EhostdownExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EhostunreachExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EalreadyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinprogressExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EstaleExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EioresidExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EucleanExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotnamExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnavailExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EisnamExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EremoteioExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinitExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EremdevExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EcanceledExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnolimfileExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EproclimExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdisjointExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnologinExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EloginlimExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EgrouploopExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoattachExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotsupExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoattrExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdircorruptedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdquotExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnfsremoteExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EcontrollerExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotcontrollerExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EenqueuedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotenqueuedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EjoinedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotjoinedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoprocExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EmustrunExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnotstoppedExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EclockcpuExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinvalstateExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnoexistExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EendofminorExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EbufsizeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EemptyExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EnointrgroupExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinvalmodeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EcantextentExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EinvaltimeExc, ErrnoExc) DEFINE_EXC_EXP (IEX_EXPORT, EdestroyedExc, ErrnoExc) IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/IlmBase/Iex/IexExport.h000066400000000000000000000041261406177042200173540ustar00rootroot00000000000000#ifndef IEXEXPORT_H #define IEXEXPORT_H /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #if defined(OPENEXR_DLL) #if defined(IEX_EXPORTS) #define IEX_EXPORT __declspec(dllexport) #else #define IEX_EXPORT __declspec(dllimport) #endif #define IEX_EXPORT_CONST #else #define IEX_EXPORT #define IEX_EXPORT_CONST const #endif #endif // #ifndef IEXEXPORT_H openexr-2.5.7/IlmBase/Iex/IexForward.h000066400000000000000000000121441406177042200174760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXFORWARD_H #define INCLUDED_IEXFORWARD_H #include "IexNamespace.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER // // Base exceptions. // class BaseExc; class ArgExc; class LogicExc; class InputExc; class IoExc; class MathExc; class ErrnoExc; class NoImplExc; class NullExc; class TypeExc; // // Math exceptions. // class OverflowExc; class UnderflowExc; class DivzeroExc; class InexactExc; class InvalidFpOpExc; // // Errno exceptions. // class EpermExc; class EnoentExc; class EsrchExc; class EintrExc; class EioExc; class EnxioExc; class E2bigExc; class EnoexecExc; class EbadfExc; class EchildExc; class EagainExc; class EnomemExc; class EaccesExc; class EfaultExc; class EnotblkExc; class EbusyExc; class EexistExc; class ExdevExc; class EnodevExc; class EnotdirExc; class EisdirExc; class EinvalExc; class EnfileExc; class EmfileExc; class EnottyExc; class EtxtbsyExc; class EfbigExc; class EnospcExc; class EspipeExc; class ErofsExc; class EmlinkExc; class EpipeExc; class EdomExc; class ErangeExc; class EnomsgExc; class EidrmExc; class EchrngExc; class El2nsyncExc; class El3hltExc; class El3rstExc; class ElnrngExc; class EunatchExc; class EnocsiExc; class El2hltExc; class EdeadlkExc; class EnolckExc; class EbadeExc; class EbadrExc; class ExfullExc; class EnoanoExc; class EbadrqcExc; class EbadsltExc; class EdeadlockExc; class EbfontExc; class EnostrExc; class EnodataExc; class EtimeExc; class EnosrExc; class EnonetExc; class EnopkgExc; class EremoteExc; class EnolinkExc; class EadvExc; class EsrmntExc; class EcommExc; class EprotoExc; class EmultihopExc; class EbadmsgExc; class EnametoolongExc; class EoverflowExc; class EnotuniqExc; class EbadfdExc; class EremchgExc; class ElibaccExc; class ElibbadExc; class ElibscnExc; class ElibmaxExc; class ElibexecExc; class EilseqExc; class EnosysExc; class EloopExc; class ErestartExc; class EstrpipeExc; class EnotemptyExc; class EusersExc; class EnotsockExc; class EdestaddrreqExc; class EmsgsizeExc; class EprototypeExc; class EnoprotooptExc; class EprotonosupportExc; class EsocktnosupportExc; class EopnotsuppExc; class EpfnosupportExc; class EafnosupportExc; class EaddrinuseExc; class EaddrnotavailExc; class EnetdownExc; class EnetunreachExc; class EnetresetExc; class EconnabortedExc; class EconnresetExc; class EnobufsExc; class EisconnExc; class EnotconnExc; class EshutdownExc; class EtoomanyrefsExc; class EtimedoutExc; class EconnrefusedExc; class EhostdownExc; class EhostunreachExc; class EalreadyExc; class EinprogressExc; class EstaleExc; class EioresidExc; class EucleanExc; class EnotnamExc; class EnavailExc; class EisnamExc; class EremoteioExc; class EinitExc; class EremdevExc; class EcanceledExc; class EnolimfileExc; class EproclimExc; class EdisjointExc; class EnologinExc; class EloginlimExc; class EgrouploopExc; class EnoattachExc; class EnotsupExc; class EnoattrExc; class EdircorruptedExc; class EdquotExc; class EnfsremoteExc; class EcontrollerExc; class EnotcontrollerExc; class EenqueuedExc; class EnotenqueuedExc; class EjoinedExc; class EnotjoinedExc; class EnoprocExc; class EmustrunExc; class EnotstoppedExc; class EclockcpuExc; class EinvalstateExc; class EnoexistExc; class EendofminorExc; class EbufsizeExc; class EemptyExc; class EnointrgroupExc; class EinvalmodeExc; class EcantextentExc; class EinvaltimeExc; class EdestroyedExc; IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IEXFORWARD_H openexr-2.5.7/IlmBase/Iex/IexMacros.h000066400000000000000000000140051406177042200173140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2018, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXMACROS_H #define INCLUDED_IEXMACROS_H //-------------------------------------------------------------------- // // Macros which make throwing exceptions more convenient // //-------------------------------------------------------------------- #include //---------------------------------------------------------------------------- // A macro to throw exceptions whose text is assembled using stringstreams. // // Example: // // THROW (InputExc, "Syntax error in line " << line ", " << file << "."); // //---------------------------------------------------------------------------- #include "IexExport.h" #include "IexForward.h" IEX_EXPORT void iex_debugTrap(); #define THROW(type, text) \ do \ { \ iex_debugTrap(); \ std::stringstream _iex_throw_s; \ _iex_throw_s << text; \ throw type (_iex_throw_s); \ } \ while (0) //---------------------------------------------------------------------------- // Macros to add to or to replace the text of an exception. // The new text is assembled using stringstreams. // // Examples: // // Append to end of an exception's text: // // catch (BaseExc &e) // { // APPEND_EXC (e, " Directory " << name << " does not exist."); // throw; // } // // Replace an exception's text: // // catch (BaseExc &e) // { // REPLACE_EXC (e, "Directory " << name << " does not exist. " << e); // throw; // } //---------------------------------------------------------------------------- #define APPEND_EXC(exc, text) \ do \ { \ std::stringstream _iex_append_s; \ _iex_append_s << text; \ exc.append (_iex_append_s); \ } \ while (0) #define REPLACE_EXC(exc, text) \ do \ { \ std::stringstream _iex_replace_s; \ _iex_replace_s << text; \ exc.assign (_iex_replace_s); \ } \ while (0) //------------------------------------------------------------- // A macro to throw ErrnoExc exceptions whose text is assembled // using stringstreams: // // Example: // // THROW_ERRNO ("Cannot open file " << name << " (%T)."); // //------------------------------------------------------------- #define THROW_ERRNO(text) \ do \ { \ std::stringstream _iex_throw_errno_s; \ _iex_throw_errno_s << text; \ ::IEX_NAMESPACE::throwErrnoExc (_iex_throw_errno_s.str()); \ } \ while (0) //------------------------------------------------------------- // A macro to throw exceptions if an assertion is false. // // Example: // // ASSERT (ptr != 0, NullExc, "Null pointer" ); // //------------------------------------------------------------- #define ASSERT(assertion, type, text) \ do \ { \ if( bool(assertion) == false ) \ { \ THROW( type, text ); \ } \ } \ while (0) //------------------------------------------------------------- // A macro to throw an IEX_NAMESPACE::LogicExc if an assertion is false, // with the text composed from the source code file, line number, // and assertion argument text. // // Example: // // LOGIC_ASSERT (i < n); // //------------------------------------------------------------- #define LOGIC_ASSERT(assertion) \ ASSERT(assertion, \ IEX_NAMESPACE::LogicExc, \ __FILE__ << "(" << __LINE__ << "): logical assertion failed: " << #assertion ) #endif openexr-2.5.7/IlmBase/Iex/IexMathExc.h000066400000000000000000000047621406177042200174320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXMATHEXC_H #define INCLUDED_IEXMATHEXC_H #include "IexBaseExc.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER //--------------------------------------------------------- // Exception classess which correspond to specific floating // point exceptions. //--------------------------------------------------------- DEFINE_EXC_EXP (IEX_EXPORT, OverflowExc, MathExc) // Overflow DEFINE_EXC_EXP (IEX_EXPORT, UnderflowExc, MathExc) // Underflow DEFINE_EXC_EXP (IEX_EXPORT, DivzeroExc, MathExc) // Division by zero DEFINE_EXC_EXP (IEX_EXPORT, InexactExc, MathExc) // Inexact result DEFINE_EXC_EXP (IEX_EXPORT, InvalidFpOpExc, MathExc) // Invalid operation IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IEXMATHEXC_H openexr-2.5.7/IlmBase/Iex/IexNamespace.h000066400000000000000000000104651406177042200177720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXNAMESPACE_H #define INCLUDED_IEXNAMESPACE_H // // The purpose of this file is to make it possible to specify an // IEX_INTERNAL_NAMESPACE as a preprocessor definition and have all of the // Iex symbols defined within that namespace rather than the standard // Iex namespace. Those symbols are made available to client code through // the IEX_NAMESPACE in addition to the IEX_INTERNAL_NAMESPACE. // // To ensure source code compatibility, the IEX_NAMESPACE defaults to Iex // and then "using namespace IEX_INTERNAL_NAMESPACE;" brings all of the // declarations from the IEX_INTERNAL_NAMESPACE into the IEX_NAMESPACE. This // means that client code can continue to use syntax like Iex::BaseExc, but // at link time it will resolve to a mangled symbol based on the // IEX_INTERNAL_NAMESPACE. // // As an example, if one needed to build against a newer version of Iex and // have it run alongside an older version in the same application, it is now // possible to use an internal namespace to prevent collisions between the // older versions of Iex symbols and the newer ones. To do this, the // following could be defined at build time: // // IEX_INTERNAL_NAMESPACE = Iex_v2 // // This means that declarations inside Iex headers look like this (after the // preprocessor has done its work): // // namespace Iex_v2 { // ... // class declarations // ... // } // // namespace Iex { // using namespace Iex_v2; // } // // // Open Source version of this file pulls in the IlmBaseConfig.h file // for the configure time options. // #include "IlmBaseConfig.h" #ifndef IEX_NAMESPACE #define IEX_NAMESPACE Iex #endif #ifndef IEX_INTERNAL_NAMESPACE #define IEX_INTERNAL_NAMESPACE IEX_NAMESPACE #endif // // We need to be sure that we import the internal namespace into the public one. // To do this, we use the small bit of code below which initially defines // IEX_INTERNAL_NAMESPACE (so it can be referenced) and then defines // IEX_NAMESPACE and pulls the internal symbols into the public namespace. // namespace IEX_INTERNAL_NAMESPACE {} namespace IEX_NAMESPACE { using namespace IEX_INTERNAL_NAMESPACE; } // // There are identical pairs of HEADER/SOURCE ENTER/EXIT macros so that // future extension to the namespace mechanism is possible without changing // project source code. // #define IEX_INTERNAL_NAMESPACE_HEADER_ENTER namespace IEX_INTERNAL_NAMESPACE { #define IEX_INTERNAL_NAMESPACE_HEADER_EXIT } #define IEX_INTERNAL_NAMESPACE_SOURCE_ENTER namespace IEX_INTERNAL_NAMESPACE { #define IEX_INTERNAL_NAMESPACE_SOURCE_EXIT } #endif // INCLUDED_IEXNAMESPACE_H openexr-2.5.7/IlmBase/Iex/IexThrowErrnoExc.cpp000066400000000000000000000412771406177042200212070ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------- // // Exceptions that correspond to "errno" error codes, // and a function to make throwing those exceptions easy. // //---------------------------------------------------------------- #include "IexThrowErrnoExc.h" #include "IexErrnoExc.h" #include #include #ifdef _WIN32 #include #endif IEX_INTERNAL_NAMESPACE_SOURCE_ENTER void throwErrnoExc (const std::string &text, int errnum) { #ifdef _WIN32 if (0 != getenv("IEXDEBUGTHROW")) DebugBreak(); #endif const char *entext = strerror (errnum); std::string tmp (text); std::string::size_type pos; while (std::string::npos != (pos = tmp.find ("%T"))) tmp.replace (pos, 2, entext, strlen (entext)); switch (errnum) { #if defined (EPERM) case EPERM: throw EpermExc (tmp); #endif #if defined (ENOENT) case ENOENT: throw EnoentExc (tmp); #endif #if defined (ESRCH) case ESRCH: throw EsrchExc (tmp); #endif #if defined (EINTR) case EINTR: throw EintrExc (tmp); #endif #if defined (EIO) case EIO: throw EioExc (tmp); #endif #if defined (ENXIO) case ENXIO: throw EnxioExc (tmp); #endif #if defined (E2BIG) case E2BIG: throw E2bigExc (tmp); #endif #if defined (ENOEXEC) case ENOEXEC: throw EnoexecExc (tmp); #endif #if defined (EBADF) case EBADF: throw EbadfExc (tmp); #endif #if defined (ECHILD) case ECHILD: throw EchildExc (tmp); #endif #if defined (EAGAIN) case EAGAIN: throw EagainExc (tmp); #endif #if defined (ENOMEM) case ENOMEM: throw EnomemExc (tmp); #endif #if defined (EACCES) case EACCES: throw EaccesExc (tmp); #endif #if defined (EFAULT) case EFAULT: throw EfaultExc (tmp); #endif #if defined (ENOTBLK) case ENOTBLK: throw EnotblkExc (tmp); #endif #if defined (EBUSY) case EBUSY: throw EbusyExc (tmp); #endif #if defined (EEXIST) case EEXIST: throw EexistExc (tmp); #endif #if defined (EXDEV) case EXDEV: throw ExdevExc (tmp); #endif #if defined (ENODEV) case ENODEV: throw EnodevExc (tmp); #endif #if defined (ENOTDIR) case ENOTDIR: throw EnotdirExc (tmp); #endif #if defined (EISDIR) case EISDIR: throw EisdirExc (tmp); #endif #if defined (EINVAL) case EINVAL: throw EinvalExc (tmp); #endif #if defined (ENFILE) case ENFILE: throw EnfileExc (tmp); #endif #if defined (EMFILE) case EMFILE: throw EmfileExc (tmp); #endif #if defined (ENOTTY) case ENOTTY: throw EnottyExc (tmp); #endif #if defined (ETXTBSY) case ETXTBSY: throw EtxtbsyExc (tmp); #endif #if defined (EFBIG) case EFBIG: throw EfbigExc (tmp); #endif #if defined (ENOSPC) case ENOSPC: throw EnospcExc (tmp); #endif #if defined (ESPIPE) case ESPIPE: throw EspipeExc (tmp); #endif #if defined (EROFS) case EROFS: throw ErofsExc (tmp); #endif #if defined (EMLINK) case EMLINK: throw EmlinkExc (tmp); #endif #if defined (EPIPE) case EPIPE: throw EpipeExc (tmp); #endif #if defined (EDOM) case EDOM: throw EdomExc (tmp); #endif #if defined (ERANGE) case ERANGE: throw ErangeExc (tmp); #endif #if defined (ENOMSG) case ENOMSG: throw EnomsgExc (tmp); #endif #if defined (EIDRM) case EIDRM: throw EidrmExc (tmp); #endif #if defined (ECHRNG) case ECHRNG: throw EchrngExc (tmp); #endif #if defined (EL2NSYNC) case EL2NSYNC: throw El2nsyncExc (tmp); #endif #if defined (EL3HLT) case EL3HLT: throw El3hltExc (tmp); #endif #if defined (EL3RST) case EL3RST: throw El3rstExc (tmp); #endif #if defined (ELNRNG) case ELNRNG: throw ElnrngExc (tmp); #endif #if defined (EUNATCH) case EUNATCH: throw EunatchExc (tmp); #endif #if defined (ENOSCI) case ENOCSI: throw EnocsiExc (tmp); #endif #if defined (EL2HLT) case EL2HLT: throw El2hltExc (tmp); #endif #if defined (EDEADLK) case EDEADLK: throw EdeadlkExc (tmp); #endif #if defined (ENOLCK) case ENOLCK: throw EnolckExc (tmp); #endif #if defined (EBADE) case EBADE: throw EbadeExc (tmp); #endif #if defined (EBADR) case EBADR: throw EbadrExc (tmp); #endif #if defined (EXFULL) case EXFULL: throw ExfullExc (tmp); #endif #if defined (ENOANO) case ENOANO: throw EnoanoExc (tmp); #endif #if defined (EBADRQC) case EBADRQC: throw EbadrqcExc (tmp); #endif #if defined (EBADSLT) case EBADSLT: throw EbadsltExc (tmp); #endif #if defined (EDEADLOCK) && defined (EDEADLK) #if EDEADLOCK != EDEADLK case EDEADLOCK: throw EdeadlockExc (tmp); #endif #elif defined (EDEADLOCK) case EDEADLOCK: throw EdeadlockExc (tmp); #endif #if defined (EBFONT) case EBFONT: throw EbfontExc (tmp); #endif #if defined (ENOSTR) case ENOSTR: throw EnostrExc (tmp); #endif #if defined (ENODATA) case ENODATA: throw EnodataExc (tmp); #endif #if defined (ETIME) case ETIME: throw EtimeExc (tmp); #endif #if defined (ENOSR) case ENOSR: throw EnosrExc (tmp); #endif #if defined (ENONET) case ENONET: throw EnonetExc (tmp); #endif #if defined (ENOPKG) case ENOPKG: throw EnopkgExc (tmp); #endif #if defined (EREMOTE) case EREMOTE: throw EremoteExc (tmp); #endif #if defined (ENOLINK) case ENOLINK: throw EnolinkExc (tmp); #endif #if defined (EADV) case EADV: throw EadvExc (tmp); #endif #if defined (ESRMNT) case ESRMNT: throw EsrmntExc (tmp); #endif #if defined (ECOMM) case ECOMM: throw EcommExc (tmp); #endif #if defined (EPROTO) case EPROTO: throw EprotoExc (tmp); #endif #if defined (EMULTIHOP) case EMULTIHOP: throw EmultihopExc (tmp); #endif #if defined (EBADMSG) case EBADMSG: throw EbadmsgExc (tmp); #endif #if defined (ENAMETOOLONG) case ENAMETOOLONG: throw EnametoolongExc (tmp); #endif #if defined (EOVERFLOW) case EOVERFLOW: throw EoverflowExc (tmp); #endif #if defined (ENOTUNIQ) case ENOTUNIQ: throw EnotuniqExc (tmp); #endif #if defined (EBADFD) case EBADFD: throw EbadfdExc (tmp); #endif #if defined (EREMCHG) case EREMCHG: throw EremchgExc (tmp); #endif #if defined (ELIBACC) case ELIBACC: throw ElibaccExc (tmp); #endif #if defined (ELIBBAD) case ELIBBAD: throw ElibbadExc (tmp); #endif #if defined (ELIBSCN) case ELIBSCN: throw ElibscnExc (tmp); #endif #if defined (ELIBMAX) case ELIBMAX: throw ElibmaxExc (tmp); #endif #if defined (ELIBEXEC) case ELIBEXEC: throw ElibexecExc (tmp); #endif #if defined (EILSEQ) case EILSEQ: throw EilseqExc (tmp); #endif #if defined (ENOSYS) case ENOSYS: throw EnosysExc (tmp); #endif #if defined (ELOOP) case ELOOP: throw EloopExc (tmp); #endif #if defined (ERESTART) case ERESTART: throw ErestartExc (tmp); #endif #if defined (ESTRPIPE) case ESTRPIPE: throw EstrpipeExc (tmp); #endif #if defined (ENOTEMPTY) case ENOTEMPTY: throw EnotemptyExc (tmp); #endif #if defined (EUSERS) case EUSERS: throw EusersExc (tmp); #endif #if defined (ENOTSOCK) case ENOTSOCK: throw EnotsockExc (tmp); #endif #if defined (EDESTADDRREQ) case EDESTADDRREQ: throw EdestaddrreqExc (tmp); #endif #if defined (EMSGSIZE) case EMSGSIZE: throw EmsgsizeExc (tmp); #endif #if defined (EPROTOTYPE) case EPROTOTYPE: throw EprototypeExc (tmp); #endif #if defined (ENOPROTOOPT) case ENOPROTOOPT: throw EnoprotooptExc (tmp); #endif #if defined (EPROTONOSUPPORT) case EPROTONOSUPPORT: throw EprotonosupportExc (tmp); #endif #if defined (ESOCKTNOSUPPORT) case ESOCKTNOSUPPORT: throw EsocktnosupportExc (tmp); #endif #if defined (EOPNOTSUPP) case EOPNOTSUPP: throw EopnotsuppExc (tmp); #endif #if defined (EPFNOSUPPORT) case EPFNOSUPPORT: throw EpfnosupportExc (tmp); #endif #if defined (EAFNOSUPPORT) case EAFNOSUPPORT: throw EafnosupportExc (tmp); #endif #if defined (EADDRINUSE) case EADDRINUSE: throw EaddrinuseExc (tmp); #endif #if defined (EADDRNOTAVAIL) case EADDRNOTAVAIL: throw EaddrnotavailExc (tmp); #endif #if defined (ENETDOWN) case ENETDOWN: throw EnetdownExc (tmp); #endif #if defined (ENETUNREACH) case ENETUNREACH: throw EnetunreachExc (tmp); #endif #if defined (ENETRESET) case ENETRESET: throw EnetresetExc (tmp); #endif #if defined (ECONNABORTED) case ECONNABORTED: throw EconnabortedExc (tmp); #endif #if defined (ECONNRESET) case ECONNRESET: throw EconnresetExc (tmp); #endif #if defined (ENOBUFS) case ENOBUFS: throw EnobufsExc (tmp); #endif #if defined (EISCONN) case EISCONN: throw EisconnExc (tmp); #endif #if defined (ENOTCONN) case ENOTCONN: throw EnotconnExc (tmp); #endif #if defined (ESHUTDOWN) case ESHUTDOWN: throw EshutdownExc (tmp); #endif #if defined (ETOOMANYREFS) case ETOOMANYREFS: throw EtoomanyrefsExc (tmp); #endif #if defined (ETIMEDOUT) case ETIMEDOUT: throw EtimedoutExc (tmp); #endif #if defined (ECONNREFUSED) case ECONNREFUSED: throw EconnrefusedExc (tmp); #endif #if defined (EHOSTDOWN) case EHOSTDOWN: throw EhostdownExc (tmp); #endif #if defined (EHOSTUNREACH) case EHOSTUNREACH: throw EhostunreachExc (tmp); #endif #if defined (EALREADY) case EALREADY: throw EalreadyExc (tmp); #endif #if defined (EINPROGRESS) case EINPROGRESS: throw EinprogressExc (tmp); #endif #if defined (ESTALE) case ESTALE: throw EstaleExc (tmp); #endif #if defined (EIORESID) case EIORESID: throw EioresidExc (tmp); #endif #if defined (EUCLEAN) case EUCLEAN: throw EucleanExc (tmp); #endif #if defined (ENOTNAM) case ENOTNAM: throw EnotnamExc (tmp); #endif #if defined (ENAVAIL) case ENAVAIL: throw EnavailExc (tmp); #endif #if defined (EISNAM) case EISNAM: throw EisnamExc (tmp); #endif #if defined (EREMOTEIO) case EREMOTEIO: throw EremoteioExc (tmp); #endif #if defined (EINIT) case EINIT: throw EinitExc (tmp); #endif #if defined (EREMDEV) case EREMDEV: throw EremdevExc (tmp); #endif #if defined (ECANCELED) case ECANCELED: throw EcanceledExc (tmp); #endif #if defined (ENOLIMFILE) case ENOLIMFILE: throw EnolimfileExc (tmp); #endif #if defined (EPROCLIM) case EPROCLIM: throw EproclimExc (tmp); #endif #if defined (EDISJOINT) case EDISJOINT: throw EdisjointExc (tmp); #endif #if defined (ENOLOGIN) case ENOLOGIN: throw EnologinExc (tmp); #endif #if defined (ELOGINLIM) case ELOGINLIM: throw EloginlimExc (tmp); #endif #if defined (EGROUPLOOP) case EGROUPLOOP: throw EgrouploopExc (tmp); #endif #if defined (ENOATTACH) case ENOATTACH: throw EnoattachExc (tmp); #endif #if defined (ENOTSUP) && defined (EOPNOTSUPP) #if ENOTSUP != EOPNOTSUPP case ENOTSUP: throw EnotsupExc (tmp); #endif #elif defined (ENOTSUP) case ENOTSUP: throw EnotsupExc (tmp); #endif #if defined (ENOATTR) case ENOATTR: throw EnoattrExc (tmp); #endif #if defined (EDIRCORRUPTED) case EDIRCORRUPTED: throw EdircorruptedExc (tmp); #endif #if defined (EDQUOT) case EDQUOT: throw EdquotExc (tmp); #endif #if defined (ENFSREMOTE) case ENFSREMOTE: throw EnfsremoteExc (tmp); #endif #if defined (ECONTROLLER) case ECONTROLLER: throw EcontrollerExc (tmp); #endif #if defined (ENOTCONTROLLER) case ENOTCONTROLLER: throw EnotcontrollerExc (tmp); #endif #if defined (EENQUEUED) case EENQUEUED: throw EenqueuedExc (tmp); #endif #if defined (ENOTENQUEUED) case ENOTENQUEUED: throw EnotenqueuedExc (tmp); #endif #if defined (EJOINED) case EJOINED: throw EjoinedExc (tmp); #endif #if defined (ENOTJOINED) case ENOTJOINED: throw EnotjoinedExc (tmp); #endif #if defined (ENOPROC) case ENOPROC: throw EnoprocExc (tmp); #endif #if defined (EMUSTRUN) case EMUSTRUN: throw EmustrunExc (tmp); #endif #if defined (ENOTSTOPPED) case ENOTSTOPPED: throw EnotstoppedExc (tmp); #endif #if defined (ECLOCKCPU) case ECLOCKCPU: throw EclockcpuExc (tmp); #endif #if defined (EINVALSTATE) case EINVALSTATE: throw EinvalstateExc (tmp); #endif #if defined (ENOEXIST) case ENOEXIST: throw EnoexistExc (tmp); #endif #if defined (EENDOFMINOR) case EENDOFMINOR: throw EendofminorExc (tmp); #endif #if defined (EBUFSIZE) case EBUFSIZE: throw EbufsizeExc (tmp); #endif #if defined (EEMPTY) case EEMPTY: throw EemptyExc (tmp); #endif #if defined (ENOINTRGROUP) case ENOINTRGROUP: throw EnointrgroupExc (tmp); #endif #if defined (EINVALMODE) case EINVALMODE: throw EinvalmodeExc (tmp); #endif #if defined (ECANTEXTENT) case ECANTEXTENT: throw EcantextentExc (tmp); #endif #if defined (EINVALTIME) case EINVALTIME: throw EinvaltimeExc (tmp); #endif #if defined (EDESTROYED) case EDESTROYED: throw EdestroyedExc (tmp); #endif } throw ErrnoExc (tmp); } void throwErrnoExc (const std::string &text) { throwErrnoExc (text, errno); } void throwErrnoExc() { std::string txt = "%T."; throwErrnoExc (txt); } IEX_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Iex/IexThrowErrnoExc.h000066400000000000000000000066301406177042200206460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXTHROWERRNOEXC_H #define INCLUDED_IEXTHROWERRNOEXC_H //---------------------------------------------------------- // // A function which throws ExcErrno exceptions // //---------------------------------------------------------- #include "IexBaseExc.h" #include "IexExport.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER //-------------------------------------------------------------------------- // // Function throwErrnoExc() throws an exception which corresponds to // error code errnum. The exception text is initialized with a copy // of the string passed to throwErrnoExc(), where all occurrences of // "%T" have been replaced with the output of strerror(oserror()). // // Example: // // If opening file /tmp/output failed with an ENOENT error code, // calling // // throwErrnoExc (); // // or // // throwErrnoExc ("%T."); // // will throw an EnoentExc whose text reads // // No such file or directory. // // More detailed messages can be assembled using stringstreams: // // std::stringstream s; // s << "Cannot open file " << name << " (%T)."; // throwErrnoExc (s); // // The resulting exception contains the following text: // // Cannot open file /tmp/output (No such file or directory). // // Alternatively, you may want to use the THROW_ERRNO macro defined // in IexMacros.h: // // THROW_ERRNO ("Cannot open file " << name << " (%T).") // //-------------------------------------------------------------------------- IEX_EXPORT void throwErrnoExc(const std::string &txt, int errnum); IEX_EXPORT void throwErrnoExc(const std::string &txt); IEX_EXPORT void throwErrnoExc(); IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IEXTHROWERRNOEXC_H openexr-2.5.7/IlmBase/Iex/Makefile.am000066400000000000000000000013621406177042200173070ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in AM_CPPFLAGS = -I$(top_srcdir)/config lib_LTLIBRARIES = libIex.la libIex_la_SOURCES = IexThrowErrnoExc.cpp IexBaseExc.cpp IexBaseExc.h \ IexErrnoExc.h Iex.h IexMacros.h IexMathExc.h \ IexThrowErrnoExc.h libIex_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined if LIB_SUFFIX_EXISTS libIex_la_LDFLAGS += -release @LIB_SUFFIX@ endif libIexincludedir = $(includedir)/OpenEXR libIexinclude_HEADERS = IexBaseExc.h IexMathExc.h IexThrowErrnoExc.h \ IexErrnoExc.h IexMacros.h Iex.h \ IexForward.h IexNamespace.h IexExport.h EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/IexMath/000077500000000000000000000000001406177042200160635ustar00rootroot00000000000000openexr-2.5.7/IlmBase/IexMath/CMakeLists.txt000066400000000000000000000005331406177042200206240ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. ilmbase_define_library(IexMath PRIV_EXPORT IEXMATH_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES IexMathFloatExc.cpp IexMathFpu.cpp HEADERS IexMathFloatExc.h IexMathFpu.h IexMathIeeeExc.h DEPENDENCIES IlmBase::Iex ) openexr-2.5.7/IlmBase/IexMath/IexMathFloatExc.cpp000066400000000000000000000065111406177042200215570ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------- // // A function to control which IEEE floating // point exceptions will be translated into // C++ MathExc exceptions. // //----------------------------------------------------- #include #include #include #if 0 #include #define debug(x) (std::cout << x << std::flush) #else #define debug(x) #endif IEX_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { void fpeHandler (int type, const char explanation[]) { switch (type) { case IEEE_OVERFLOW: throw OverflowExc (explanation); case IEEE_UNDERFLOW: throw UnderflowExc (explanation); case IEEE_DIVZERO: throw DivzeroExc (explanation); case IEEE_INEXACT: throw InexactExc (explanation); case IEEE_INVALID: throw InvalidFpOpExc (explanation); } throw MathExc (explanation); } } // namespace void mathExcOn (int when) { debug ("mathExcOn (when = 0x" << std::hex << when << ")\n"); setFpExceptions (when); setFpExceptionHandler (fpeHandler); } int getMathExcOn () { int when = fpExceptions(); debug ("getMathExcOn () == 0x" << std::hex << when << ")\n"); return when; } MathExcOn::MathExcOn (int when) : _changed (false) { _saved = getMathExcOn(); if (_saved != when) { _changed = true; mathExcOn (when); } } MathExcOn::~MathExcOn () { if (_changed) mathExcOn (_saved); } void MathExcOn::handleOutstandingExceptions() { handleExceptionsSetInRegisters(); } IEX_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/IexMath/IexMathFloatExc.h000066400000000000000000000112021406177042200212150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IEXMATHFLOATEXC_H #define INCLUDED_IEXMATHFLOATEXC_H #ifndef IEXMATH_EXPORT_H #define IEXMATH_EXPORT_H #if defined(OPENEXR_DLL) #if defined(IEXMATH_EXPORTS) #define IEXMATH_EXPORT __declspec(dllexport) #else #define IEXMATH_EXPORT __declspec(dllimport) #endif #define IEXMATH_EXPORT_CONST #else #define IEXMATH_EXPORT #define IEXMATH_EXPORT_CONST const #endif #endif #include "IexNamespace.h" #include "IexMathExc.h" //#include #include "IexMathIeeeExc.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------------------------- // Function mathExcOn() defines which floating point exceptions // will be trapped and converted to C++ exceptions. //------------------------------------------------------------- IEXMATH_EXPORT void mathExcOn (int when = (IEEE_OVERFLOW | IEEE_DIVZERO | IEEE_INVALID)); //---------------------------------------------------------------------- // Function getMathExcOn() tells you for which floating point exceptions // trapping and conversion to C++ exceptions is currently enabled. //---------------------------------------------------------------------- IEXMATH_EXPORT int getMathExcOn(); //------------------------------------------------------------------------ // A classs that temporarily sets floating point exception trapping // and conversion, and later restores the previous settings. // // Example: // // float // trickyComputation (float x) // { // MathExcOn meo (0); // temporarily disable floating // // point exception trapping // // float result = ...; // computation which may cause // // floating point exceptions // // return result; // destruction of meo restores // } // the program's previous floating // // point exception settings //------------------------------------------------------------------------ class MathExcOn { public: IEXMATH_EXPORT MathExcOn (int when); IEXMATH_EXPORT ~MathExcOn (); MathExcOn (const MathExcOn&) = delete; MathExcOn& operator= (const MathExcOn&) = delete; MathExcOn (MathExcOn&&) = delete; MathExcOn& operator= (MathExcOn&&) = delete; // It is possible for functions to set the exception registers // yet not trigger a SIGFPE. Specifically, the implementation // of pow(x, y) we're using can generates a NaN from a negative x // and fractional y but a SIGFPE is not generated. // This function examimes the exception registers and calls the // fpHandler if those registers modulo the exception mask are set. // It should be called wherever this class is commonly used where it has // been found that certain floating point exceptions are not being thrown. IEXMATH_EXPORT void handleOutstandingExceptions(); private: bool _changed; int _saved; }; IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/IlmBase/IexMath/IexMathFpu.cpp000066400000000000000000000326721406177042200206130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------ // // Functions to control floating point exceptions. // //------------------------------------------------------------------------ #include "IexMathFpu.h" #include #include #include #if 0 #include #define debug(x) (std::cout << x << std::flush) #else #define debug(x) #endif #include #if defined(HAVE_UCONTEXT_H) && \ (defined(ILMBASE_HAVE_SIGCONTEXT_CONTROL_REGISTER_SUPPORT) || \ defined(ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT)) # include # include # include # include IEX_INTERNAL_NAMESPACE_SOURCE_ENTER namespace FpuControl { //------------------------------------------------------------------- // // Modern x86 processors and all AMD64 processors have two // sets of floating-point control/status registers: cw and sw // for legacy x87 stack-based arithmetic, and mxcsr for // SIMD arithmetic. When setting exception masks or checking // for exceptions, we must set/check all relevant registers, // since applications may contain code that uses either FP // model. // // These functions handle both FP models for x86 and AMD64. // //------------------------------------------------------------------- //------------------------------------------------------------------- // // Restore the control register state from a signal handler // user context, optionally clearing the exception bits // in the restored control register, if applicable. // //------------------------------------------------------------------- void restoreControlRegs (const ucontext_t & ucon, bool clearExceptions = false); //------------------------------------------------------------ // // Set exception mask bits in the control register state. // A value of 1 means the exception is masked, a value of // 0 means the exception is enabled. // // setExceptionMask returns the previous mask value. If // the 'exceptions' pointer is non-null, it returns in // this argument the FPU exception bits. // //------------------------------------------------------------ const int INVALID_EXC = (1<<0); const int DENORMAL_EXC = (1<<1); const int DIVZERO_EXC = (1<<2); const int OVERFLOW_EXC = (1<<3); const int UNDERFLOW_EXC = (1<<4); const int INEXACT_EXC = (1<<5); const int ALL_EXC = INVALID_EXC | DENORMAL_EXC | DIVZERO_EXC | OVERFLOW_EXC | UNDERFLOW_EXC | INEXACT_EXC; int setExceptionMask (int mask, int * exceptions = 0); int getExceptionMask (); //--------------------------------------------- // // Get/clear the exception bits in the FPU. // //--------------------------------------------- int getExceptions (); void clearExceptions (); //------------------------------------------------------------------ // // Everything below here is implementation. Do not use these // constants or functions in your applications or libraries. // This is not the code you're looking for. Move along. // // Optimization notes -- on a Pentium 4, at least, it appears // to be faster to get the mxcsr first and then the cw; and to // set the cw first and then the mxcsr. Also, it seems to // be faster to clear the sw exception bits after setting // cw and mxcsr. // //------------------------------------------------------------------ static inline uint16_t getSw () { uint16_t sw; asm volatile ("fnstsw %0" : "=m" (sw) : ); return sw; } static inline void setCw (uint16_t cw) { asm volatile ("fldcw %0" : : "m" (cw) ); } static inline uint16_t getCw () { uint16_t cw; asm volatile ("fnstcw %0" : "=m" (cw) : ); return cw; } static inline void setMxcsr (uint32_t mxcsr, bool clearExceptions) { mxcsr &= clearExceptions ? 0xffffffc0 : 0xffffffff; asm volatile ("ldmxcsr %0" : : "m" (mxcsr) ); } static inline uint32_t getMxcsr () { uint32_t mxcsr; asm volatile ("stmxcsr %0" : "=m" (mxcsr) : ); return mxcsr; } static inline int calcMask (uint16_t cw, uint32_t mxcsr) { // // Hopefully, if the user has been using FpuControl functions, // the masks are the same, but just in case they're not, we // AND them together to report the proper subset of the masks. // return (cw & ALL_EXC) & ((mxcsr >> 7) & ALL_EXC); } inline int setExceptionMask (int mask, int * exceptions) { uint16_t cw = getCw (); uint32_t mxcsr = getMxcsr (); if (exceptions) *exceptions = (mxcsr & ALL_EXC) | (getSw () & ALL_EXC); int oldmask = calcMask (cw, mxcsr); // // The exception constants are chosen very carefully so that // we can do a simple mask and shift operation to insert // them into the control words. The mask operation is for // safety, in case the user accidentally set some other // bits in the exception mask. // mask &= ALL_EXC; cw = (cw & ~ALL_EXC) | mask; mxcsr = (mxcsr & ~(ALL_EXC << 7)) | (mask << 7); setCw (cw); setMxcsr (mxcsr, false); return oldmask; } inline int getExceptionMask () { uint32_t mxcsr = getMxcsr (); uint16_t cw = getCw (); return calcMask (cw, mxcsr); } inline int getExceptions () { return (getMxcsr () | getSw ()) & ALL_EXC; } void clearExceptions () { uint32_t mxcsr = getMxcsr () & 0xffffffc0; asm volatile ("ldmxcsr %0\n" "fnclex" : : "m" (mxcsr) ); } // If the fpe was taken while doing a float-to-int cast using the x87, // the rounding mode and possibly the precision will be wrong. So instead // of restoring to the state as of the fault, we force the rounding mode // to be 'nearest' and the precision to be double extended. // // rounding mode is in bits 10-11, value 00 == round to nearest // precision is in bits 8-9, value 11 == double extended (80-bit) // const uint16_t cwRestoreMask = ~((3 << 10) | (3 << 8)); const uint16_t cwRestoreVal = (0 << 10) | (3 << 8); #ifdef ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT inline void restoreControlRegs (const ucontext_t & ucon, bool clearExceptions) { setCw ((ucon.uc_mcontext.fpregs->cwd & cwRestoreMask) | cwRestoreVal); setMxcsr (ucon.uc_mcontext.fpregs->mxcsr, clearExceptions); } #else // // Ugly, the mxcsr isn't defined in GNU libc ucontext_t, but // it's passed to the signal handler by the kernel. Use // the kernel's version of the ucontext to get it, see // // #include inline void restoreControlRegs (const ucontext_t & ucon, bool clearExceptions) { #if defined(__GLIBC__) || defined(__i386__) setCw ((ucon.uc_mcontext.fpregs->cw & cwRestoreMask) | cwRestoreVal); #else setCw ((ucon.uc_mcontext.fpregs->cwd & cwRestoreMask) | cwRestoreVal); #endif _fpstate * kfp = reinterpret_cast<_fpstate *> (ucon.uc_mcontext.fpregs); #if defined(__GLIBC__) || defined(__i386__) setMxcsr (kfp->magic == 0 ? kfp->mxcsr : 0, clearExceptions); #else setMxcsr (kfp->mxcsr, clearExceptions); #endif } #endif } // namespace FpuControl namespace { volatile FpExceptionHandler fpeHandler = 0; extern "C" void catchSigFpe (int sig, siginfo_t *info, ucontext_t *ucon) { debug ("catchSigFpe (sig = "<< sig << ", ...)\n"); FpuControl::restoreControlRegs (*ucon, true); if (fpeHandler == 0) return; if (info->si_code == SI_USER) { fpeHandler (0, "Floating-point exception, caused by " "a signal sent from another process."); return; } if (sig == SIGFPE) { switch (info->si_code) { // // IEEE 754 floating point exceptions: // case FPE_FLTDIV: fpeHandler (IEEE_DIVZERO, "Floating-point division by zero."); return; case FPE_FLTOVF: fpeHandler (IEEE_OVERFLOW, "Floating-point overflow."); return; case FPE_FLTUND: fpeHandler (IEEE_UNDERFLOW, "Floating-point underflow."); return; case FPE_FLTRES: fpeHandler (IEEE_INEXACT, "Inexact floating-point result."); return; case FPE_FLTINV: fpeHandler (IEEE_INVALID, "Invalid floating-point operation."); return; // // Other arithmetic exceptions which can also // be trapped by the operating system: // case FPE_INTDIV: fpeHandler (0, "Integer division by zero."); break; case FPE_INTOVF: fpeHandler (0, "Integer overflow."); break; case FPE_FLTSUB: fpeHandler (0, "Subscript out of range."); break; } } fpeHandler (0, "Floating-point exception."); } } // namespace void setFpExceptions (int when) { int mask = FpuControl::ALL_EXC; if (when & IEEE_OVERFLOW) mask &= ~FpuControl::OVERFLOW_EXC; if (when & IEEE_UNDERFLOW) mask &= ~FpuControl::UNDERFLOW_EXC; if (when & IEEE_DIVZERO) mask &= ~FpuControl::DIVZERO_EXC; if (when & IEEE_INEXACT) mask &= ~FpuControl::INEXACT_EXC; if (when & IEEE_INVALID) mask &= ~FpuControl::INVALID_EXC; // // The Linux kernel apparently sometimes passes // incorrect si_info to signal handlers unless // the exception flags are cleared. // // XXX is this still true on 2.4+ kernels? // FpuControl::setExceptionMask (mask); FpuControl::clearExceptions (); } int fpExceptions () { int mask = FpuControl::getExceptionMask (); int when = 0; if (!(mask & FpuControl::OVERFLOW_EXC)) when |= IEEE_OVERFLOW; if (!(mask & FpuControl::UNDERFLOW_EXC)) when |= IEEE_UNDERFLOW; if (!(mask & FpuControl::DIVZERO_EXC)) when |= IEEE_DIVZERO; if (!(mask & FpuControl::INEXACT_EXC)) when |= IEEE_INEXACT; if (!(mask & FpuControl::INVALID_EXC)) when |= IEEE_INVALID; return when; } void handleExceptionsSetInRegisters() { if (fpeHandler == 0) return; int mask = FpuControl::getExceptionMask (); int exc = FpuControl::getExceptions(); if (!(mask & FpuControl::DIVZERO_EXC) && (exc & FpuControl::DIVZERO_EXC)) { fpeHandler(IEEE_DIVZERO, "Floating-point division by zero."); return; } if (!(mask & FpuControl::OVERFLOW_EXC) && (exc & FpuControl::OVERFLOW_EXC)) { fpeHandler(IEEE_OVERFLOW, "Floating-point overflow."); return; } if (!(mask & FpuControl::UNDERFLOW_EXC) && (exc & FpuControl::UNDERFLOW_EXC)) { fpeHandler(IEEE_UNDERFLOW, "Floating-point underflow."); return; } if (!(mask & FpuControl::INEXACT_EXC) && (exc & FpuControl::INEXACT_EXC)) { fpeHandler(IEEE_INEXACT, "Inexact floating-point result."); return; } if (!(mask & FpuControl::INVALID_EXC) && (exc & FpuControl::INVALID_EXC)) { fpeHandler(IEEE_INVALID, "Invalid floating-point operation."); return; } } void setFpExceptionHandler (FpExceptionHandler handler) { if (fpeHandler == 0) { struct sigaction action; sigemptyset (&action.sa_mask); action.sa_flags = SA_SIGINFO | SA_NOMASK; action.sa_sigaction = (void (*) (int, siginfo_t *, void *)) catchSigFpe; action.sa_restorer = 0; sigaction (SIGFPE, &action, 0); } fpeHandler = handler; } IEX_INTERNAL_NAMESPACE_SOURCE_EXIT #else #include #include IEX_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { volatile FpExceptionHandler fpeHandler = 0; void fpExc_(int x) { if (fpeHandler != 0) { fpeHandler(x, ""); } else { assert(0 != "Floating point exception"); } } } void setFpExceptions( int ) { } void setFpExceptionHandler (FpExceptionHandler handler) { // improve floating point exception handling nanoscopically above "nothing at all" fpeHandler = handler; signal(SIGFPE, fpExc_); } int fpExceptions() { return 0; } void handleExceptionsSetInRegisters() { // No implementation on this platform } IEX_INTERNAL_NAMESPACE_SOURCE_EXIT #endif openexr-2.5.7/IlmBase/IexMath/IexMathFpu.h000066400000000000000000000064571406177042200202620ustar00rootroot00000000000000#ifndef INCLUDED_IEXMATHFPU_H #define INCLUDED_IEXMATHFPU_H /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------ // // Functions to control floating point exceptions. // //------------------------------------------------------------------------ #include "IexMathIeeeExc.h" #include "IexNamespace.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------- // setFpExceptions() defines which floating // point exceptions cause SIGFPE signals. //----------------------------------------- void setFpExceptions (int when = (IEEE_OVERFLOW | IEEE_DIVZERO | IEEE_INVALID)); //---------------------------------------- // fpExceptions() tells you which floating // point exceptions cause SIGFPE signals. //---------------------------------------- int fpExceptions (); //------------------------------------------ // setFpExceptionHandler() defines a handler // that will be called when SIGFPE occurs. //------------------------------------------ extern "C" typedef void (* FpExceptionHandler) (int type, const char explanation[]); void setFpExceptionHandler (FpExceptionHandler handler); // ----------------------------------------- // handleExceptionsSetInRegisters() examines // the exception registers and calls the // floating point exception handler if the // bits are set. This function exists to // allow trapping of exception register states // that can get set though no SIGFPE occurs. // ----------------------------------------- void handleExceptionsSetInRegisters(); IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/IlmBase/IexMath/IexMathIeeeExc.h000066400000000000000000000044621406177042200210310ustar00rootroot00000000000000#ifndef INCLUDED_IEXMATHIEEE_EXC_H #define INCLUDED_IEXMATHIEEE_EXC_H /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // // Names for the loating point exceptions defined by IEEE standard 754 // //--------------------------------------------------------------------------- #include "IexNamespace.h" IEX_INTERNAL_NAMESPACE_HEADER_ENTER enum IeeeExcType { IEEE_OVERFLOW = 1, IEEE_UNDERFLOW = 2, IEEE_DIVZERO = 4, IEEE_INEXACT = 8, IEEE_INVALID = 16 }; IEX_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/IlmBase/IexMath/Makefile.am000066400000000000000000000012431406177042200201170ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = libIexMath.la libIexMathincludedir = $(includedir)/OpenEXR libIexMath_la_SOURCES = IexMathFloatExc.cpp IexMathFpu.cpp libIexMathinclude_HEADERS = IexMathFloatExc.h IexMathFpu.h IexMathIeeeExc.h libIexMath_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined if LIB_SUFFIX_EXISTS libIexMath_la_LDFLAGS += -release @LIB_SUFFIX@ endif libIexMath_la_LIBADD = ../Iex/libIex.la AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Iex \ -I$(top_srcdir)/config EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/IexTest/000077500000000000000000000000001406177042200161115ustar00rootroot00000000000000openexr-2.5.7/IlmBase/IexTest/CMakeLists.txt000066400000000000000000000007371406177042200206600ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. add_executable(IexTest main.cpp testBaseExc.cpp ) target_link_libraries(IexTest IlmBase::Iex) set_target_properties(IexTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) if(WIN32 AND (BUILD_SHARED_LIBS OR OPENEXR_BUILD_BOTH_STATIC_SHARED)) target_compile_definitions(IexTest PRIVATE OPENEXR_DLL) endif() add_test(NAME IlmBase.Iex COMMAND $) openexr-2.5.7/IlmBase/IexTest/Makefile.am000066400000000000000000000006171406177042200201510ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in check_PROGRAMS = IexTest IexTest_SOURCES = main.cpp testBaseExc.cpp testBaseExc.h AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Iex -I$(top_srcdir)/config LDADD = -L$(top_builddir)/Iex -lIex TESTS = IexTest EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/IexTest/main.cpp000066400000000000000000000037441406177042200175510ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #define TEST(x) if (argc < 2 || !strcmp (argv[1], #x)) x(); int main (int argc, char *argv[]) { TEST (testBaseExc); return 0; } openexr-2.5.7/IlmBase/IexTest/testBaseExc.cpp000066400000000000000000000321441406177042200210330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include namespace { void throwArgExc () { throw IEX_INTERNAL_NAMESPACE::ArgExc ("ArgExc"); } void throwLogicError () { throw std::logic_error("logic_error"); } void throwInt () { throw 3; } void throwNested() { try { throwArgExc(); } catch (const IEX_INTERNAL_NAMESPACE::ArgExc &) { bool caught = false; try { throwInt(); } catch (...) { caught = true; } assert (caught); throw; } } void test1 () { std::cout << "1" << std::endl; try { throwArgExc(); } catch (const IEX_INTERNAL_NAMESPACE::ArgExc &) { return; } catch (std::exception &) { assert (false); } catch (...) { assert (false); } assert (false); } void test2 () { std::cout << "2" << std::endl; try { throwLogicError(); } catch (const IEX_INTERNAL_NAMESPACE::ArgExc &) { assert (false); } catch (std::exception &) { return; } catch (...) { assert (false); } assert (false); } void test3 () { std::cout << "3" << std::endl; try { throwArgExc(); } catch (std::exception &) { return; } catch (...) { assert (false); } assert (false); } void test4 () { std::cout << "4" << std::endl; try { throwInt(); } catch (const IEX_INTERNAL_NAMESPACE::ArgExc &) { assert (false); } catch (std::exception &) { assert (false); } catch (...) { return; } assert (false); } void test5() { std::cout << "5" << std::endl; try { throwNested(); } catch (const IEX_INTERNAL_NAMESPACE::ArgExc &e) { assert (std::string(e.what()) == "ArgExc"); } } std::string getStackTrace() { return "???"; } template void test6() { std::cout << "6" << std::endl; IEX_INTERNAL_NAMESPACE::setStackTracer (getStackTrace); assert (IEX_INTERNAL_NAMESPACE::stackTracer() == getStackTrace); // // Test the constructors that take char* and stringstream, // and the += and assign functions. // T e1 ("arg"); e1 += "X"; std::stringstream s; s << "Y"; e1 += s; T e2 (e1); assert (e1.message() == "argXY"); assert (e1.stackTrace() == getStackTrace()); assert (e2.message() == e1.message()); assert (e2.stackTrace() == e1.stackTrace()); e2.assign ("Z"); assert (e2.message() == "Z"); e2.assign (s); assert (e2.message() == "Y"); T e3 (s); assert (e3.message() == s.str()); // // Confirm the throw/catch // bool caught = false; try { throw e1; } catch (T& e) { caught = true; assert (e.message() == e1.message()); } catch (...) { assert (false); } assert (caught); } } // namespace void testBaseExc() { std::cout << "See if throw and catch work:" << std::endl; test1(); test2(); test3(); test4(); test5(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); test6(); std::cout << "ok\n" << std::endl; } openexr-2.5.7/IlmBase/IexTest/testBaseExc.h000066400000000000000000000034331406177042200204770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testBaseExc(); openexr-2.5.7/IlmBase/IlmBase.pc.in000066400000000000000000000010061406177042200167660ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ libsuffix=@LIB_SUFFIX_DASH@ Name: IlmBase Description: Base math and exception libraries Version: @ILMBASE_VERSION@ Requires: Conflicts: Libs: -L${libdir} -lImath${libsuffix} -lHalf${libsuffix} -lIex${libsuffix} -lIexMath${libsuffix} -lIlmThread${libsuffix} @PTHREAD_LIBS@ Cflags: @PTHREAD_CFLAGS@ -I${includedir} -I${includedir}/OpenEXR openexr-2.5.7/IlmBase/IlmThread/000077500000000000000000000000001406177042200163755ustar00rootroot00000000000000openexr-2.5.7/IlmBase/IlmThread/CMakeLists.txt000066400000000000000000000013511406177042200211350ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. ilmbase_define_library(IlmThread PRIV_EXPORT ILMTHREAD_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES IlmThread.cpp IlmThreadMutex.cpp IlmThreadMutexPosix.cpp IlmThreadPool.cpp IlmThreadPosix.cpp IlmThreadSemaphore.cpp IlmThreadSemaphorePosixCompat.cpp IlmThreadSemaphorePosix.cpp IlmThreadSemaphoreOSX.cpp IlmThreadMutexWin32.cpp IlmThreadSemaphoreWin32.cpp IlmThreadWin32.cpp HEADERS IlmThreadPool.h IlmThread.h IlmThreadSemaphore.h IlmThreadMutex.h IlmThreadNamespace.h IlmThreadExport.h IlmThreadForward.h DEPENDENCIES IlmBase::Iex Threads::Threads ) openexr-2.5.7/IlmBase/IlmThread/IlmThread.cpp000066400000000000000000000077011406177042200207570ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Thread -- this file contains two implementations of thread: // - dummy implementation for platforms that do not support threading // when OPENEXR_FORCE_CXX03 is on // - c++11 and newer version // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThread.h" #include "Iex.h" ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER #ifndef ILMBASE_FORCE_CXX03 //----------------------------------------------------------------------------- // C++11 and newer implementation //----------------------------------------------------------------------------- bool supportsThreads () { return true; } Thread::Thread () { // empty } Thread::~Thread () { // hopefully the thread has basically exited and we are just // cleaning up, because run is a virtual function, so the v-table // has already been partly destroyed... if ( _thread.joinable () ) _thread.join (); } void Thread::join() { if ( _thread.joinable () ) _thread.join (); } bool Thread::joinable() const { return _thread.joinable(); } void Thread::start () { _thread = std::thread (&Thread::run, this); } #else # if !defined (_WIN32) && !defined (_WIN64) && ! defined(HAVE_PTHREAD) //----------------------------------------------------------------------------- // OPENEXR_FORCE_CXX03 with no windows / pthread support //----------------------------------------------------------------------------- bool supportsThreads () { return false; } Thread::Thread () { throw IEX_NAMESPACE::NoImplExc ("Threads not supported on this platform."); } Thread::~Thread () { throw IEX_NAMESPACE::NoImplExc ("Threads not supported on this platform."); } void Thread::start () { throw IEX_NAMESPACE::NoImplExc ("Threads not supported on this platform."); } void Thread::join () { throw IEX_NAMESPACE::NoImplExc ("Threads not supported / enabled on this platform."); } bool Thread::joinable () const { throw IEX_NAMESPACE::NoImplExc ("Threads not supported / enabled on this platform."); } # endif #endif ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/IlmThread/IlmThread.h000066400000000000000000000125321406177042200204220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILM_THREAD_H #define INCLUDED_ILM_THREAD_H //----------------------------------------------------------------------------- // // class Thread // // Class Thread is a portable interface to a system-dependent thread // primitive. In order to make a thread actually do something useful, // you must derive a subclass from class Thread and implement the // run() function. If the operating system supports threading then // the run() function will be executed int a new thread. // // The actual creation of the thread is done by the start() routine // which then calls the run() function. In general the start() // routine should be called from the constructor of the derived class. // // The base-class thread destructor will join/destroy the thread. // // IMPORTANT: Due to the mechanisms that encapsulate the low-level // threading primitives in a C++ class there is a race condition // with code resembling the following: // // { // WorkerThread myThread; // } // myThread goes out of scope, is destroyed // // and the thread is joined // // The race is between the parent thread joining the child thread // in the destructor of myThread, and the run() function in the // child thread. If the destructor gets executed first then run() // will be called with an invalid "this" pointer. // // This issue can be fixed by using a Semaphore to keep track of // whether the run() function has already been called. You can // include a Semaphore member variable within your derived class // which you post() on in the run() function, and wait() on in the // destructor before the thread is joined. Alternatively you could // do something like this: // // Semaphore runStarted; // // void WorkerThread::run () // { // runStarted.post() // // do some work // ... // } // // { // WorkerThread myThread; // runStarted.wait (); // ensure that we have started // // the run function // } // myThread goes out of scope, is destroyed // // and the thread is joined // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThreadExport.h" #include "IlmThreadNamespace.h" #ifdef ILMBASE_FORCE_CXX03 # if (defined (_WIN32) || defined (_WIN64)) && !defined(HAVE_PTHREAD) # ifdef NOMINMAX # undef NOMINMAX # endif # define NOMINMAX # include # include # elif HAVE_PTHREAD # include # endif #else # include #endif ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER // // Query function to determine if the current platform supports // threads AND this library was compiled with threading enabled. // ILMTHREAD_EXPORT bool supportsThreads (); class Thread { public: ILMTHREAD_EXPORT Thread (); ILMTHREAD_EXPORT virtual ~Thread (); ILMTHREAD_EXPORT void start (); ILMTHREAD_EXPORT virtual void run () = 0; // // wait for thread to exit - must be called before deleting thread // void join(); bool joinable() const; private: #ifdef ILMBASE_FORCE_CXX03 # if (defined (_WIN32) || defined (_WIN64)) && !defined (HAVE_PTHREAD) HANDLE _thread; # elif HAVE_PTHREAD pthread_t _thread; # endif void operator = (const Thread& t); // not implemented Thread (const Thread& t); // not implemented #else std::thread _thread; Thread &operator= (const Thread& t) = delete; Thread &operator= (Thread&& t) = delete; Thread (const Thread& t) = delete; Thread (Thread&& t) = delete; #endif }; ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_ILM_THREAD_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadExport.h000066400000000000000000000042341406177042200216240ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #if defined(OPENEXR_DLL) #if defined(ILMTHREAD_EXPORTS) #define ILMTHREAD_EXPORT __declspec(dllexport) #define ILMTHREAD_EXPORT_CONST extern __declspec(dllexport) #else #define ILMTHREAD_EXPORT __declspec(dllimport) #define ILMTHREAD_EXPORT_CONST extern __declspec(dllimport) #endif #else #define ILMTHREAD_EXPORT #define ILMTHREAD_EXPORT_CONST extern const #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadForward.h000066400000000000000000000043261406177042200217510ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILMTHREADFORWARD_H #define INCLUDED_ILMTHREADFORWARD_H #include "IlmThreadNamespace.h" #ifndef ILMBASE_FORCE_CXX03 namespace std { class mutex; } #endif ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER class Thread; #ifdef ILMBASE_FORCE_CXX03 class Mutex; #else using Mutex = std::mutex; #endif class Lock; class ThreadPool; class Task; class TaskGroup; class Semaphore; ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_ILMTHREADFORWARD_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadMutex.cpp000066400000000000000000000046011406177042200217760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Mutex, class Lock -- dummy implementation // for platforms that do not support threading // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #ifdef ILMBASE_FORCE_CXX03 # if !defined (_WIN32) && !defined (_WIN64) && !defined (HAVE_PTHREAD) # include "IlmThreadMutex.h" ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Mutex::Mutex () {} Mutex::~Mutex () {} void Mutex::lock () const {} void Mutex::unlock () const {} ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT # endif #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadMutex.h000066400000000000000000000121001406177042200214340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILM_THREAD_MUTEX_H #define INCLUDED_ILM_THREAD_MUTEX_H //----------------------------------------------------------------------------- // // class Mutex, class Lock // // Class Mutex is a wrapper for a system-dependent mutual exclusion // mechanism. Actual locking and unlocking of a Mutex object must // be performed using an instance of a Lock (defined below). // // Class lock provides safe locking and unlocking of mutexes even in // the presence of C++ exceptions. Constructing a Lock object locks // the mutex; destroying the Lock unlocks the mutex. // // Lock objects are not themselves thread-safe. You should never // share a Lock object among multiple threads. // // Typical usage: // // Mutex mtx; // Create a Mutex object that is visible // //to multiple threads // // ... // create some threads // // // Then, within each thread, construct a critical section like so: // // { // Lock lock (mtx); // Lock constructor locks the mutex // ... // do some computation on shared data // } // leaving the block unlocks the mutex // //----------------------------------------------------------------------------- #include "IlmThreadExport.h" #include "IlmBaseConfig.h" #include "IlmThreadNamespace.h" #ifdef ILMBASE_FORCE_CXX03 # if defined (_WIN32) || defined (_WIN64) # ifdef NOMINMAX # undef NOMINMAX # endif # define NOMINMAX # include # endif # ifdef HAVE_PTHREAD # include # endif #else # include #endif ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER // in c++11, this can just be // // using Mutex = std::mutex; // unfortunately we can't use std::unique_lock as a replacement for Lock since // they have different API. // // if we decide to break the API, we can just // // using Lock = std::lock_guard; // or // using Lock = std::unique_lock; // // (or eliminate the type completely and have people use the std library) #ifdef ILMBASE_FORCE_CXX03 class Lock; class ILMTHREAD_EXPORT Mutex { public: Mutex (); virtual ~Mutex (); private: void lock () const; void unlock () const; #if (defined (_WIN32) || defined (_WIN64)) && !defined (HAVE_PTHREAD) mutable CRITICAL_SECTION _mutex; #elif defined (HAVE_PTHREAD) mutable pthread_mutex_t _mutex; #endif void operator = (const Mutex& M); // not implemented Mutex (const Mutex& M); // not implemented friend class Lock; }; #else using Mutex = std::mutex; #endif class ILMTHREAD_EXPORT Lock { public: Lock (const Mutex& m, bool autoLock = true): _mutex (const_cast(m)), _locked (false) { if (autoLock) { _mutex.lock(); _locked = true; } } ~Lock () { if (_locked) _mutex.unlock(); } Lock (const Lock&) = delete; Lock &operator= (const Lock&) = delete; Lock (Lock&&) = delete; Lock& operator= (Lock&&) = delete; void acquire () { _mutex.lock(); _locked = true; } void release () { _mutex.unlock(); _locked = false; } bool locked () { return _locked; } private: Mutex & _mutex; bool _locked; }; ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_ILM_THREAD_MUTEX_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadMutexPosix.cpp000066400000000000000000000055321406177042200230250ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Mutex -- implementation for // platforms that support Posix threads // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThreadMutex.h" #ifdef ILMBASE_FORCE_CXX03 # ifdef HAVE_PTHREAD # include "Iex.h" # include ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Mutex::Mutex () { if (int error = ::pthread_mutex_init (&_mutex, 0)) IEX_INTERNAL_NAMESPACE::throwErrnoExc ("Cannot initialize mutex (%T).", error); } Mutex::~Mutex () { int error = ::pthread_mutex_destroy (&_mutex); assert (error == 0); } void Mutex::lock () const { if (int error = ::pthread_mutex_lock (&_mutex)) IEX_INTERNAL_NAMESPACE::throwErrnoExc ("Cannot lock mutex (%T).", error); } void Mutex::unlock () const { if (int error = ::pthread_mutex_unlock (&_mutex)) IEX_INTERNAL_NAMESPACE::throwErrnoExc ("Cannot unlock mutex (%T).", error); } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT # endif #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadMutexWin32.cpp000066400000000000000000000050331406177042200226210ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Mutex -- implementation for Windows // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThreadMutex.h" #ifdef ILMBASE_FORCE_CXX03 # if ((defined _WIN32 || defined _WIN64) && !defined(__MINGW64_VERSION_MAJOR)) # include "Iex.h" ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Mutex::Mutex () { ::InitializeCriticalSection (&_mutex); } Mutex::~Mutex () { ::DeleteCriticalSection (&_mutex); } void Mutex::lock () const { ::EnterCriticalSection (&_mutex); } void Mutex::unlock () const { ::LeaveCriticalSection (&_mutex); } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT # endif // _WIN32 #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadNamespace.h000066400000000000000000000110531406177042200222340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILMTHREADNAMESPACE_H #define INCLUDED_ILMTHREADNAMESPACE_H // // The purpose of this file is to make it possible to specify an // ILMTHREAD_INTERNAL_NAMESPACE as a preprocessor definition and have all of // the IlmThread symbols defined within that namespace rather than the // standard IlmThread namespace. Those symbols are made available to client // code through the ILMTHREAD_NAMESPACE in addition to the // ILMTHREAD_INTERNAL_NAMESPACE. // // To ensure source code compatibility, the ILMTHREAD_NAMESPACE defaults to // IlmThread and then "using namespace ILMTHREAD_INTERNAL_NAMESPACE;" brings // all of the declarations from the ILMTHREAD_INTERNAL_NAMESPACE into the // ILMTHREAD_NAMESPACE. This means that client code can continue to use // syntax like IlmThread::Thread, but at link time it will resolve to a // mangled symbol based on the ILMTHREAD_INTERNAL_NAMESPACE. // // As an example, if one needed to build against a newer version of IlmThread // and have it run alongside an older version in the same application, it is // now possible to use an internal namespace to prevent collisions between // the older versions of IlmThread symbols and the newer ones. To do this, // the following could be defined at build time: // // ILMTHREAD_INTERNAL_NAMESPACE = IlmThread_v2 // // This means that declarations inside IlmThread headers look like this // (after the preprocessor has done its work): // // namespace IlmThread_v2 { // ... // class declarations // ... // } // // namespace IlmThread { // using namespace IlmThread_v2; // } // // // Open Source version of this file pulls in the IlmBaseConfig.h file // for the configure time options. // #include "IlmBaseConfig.h" #ifndef ILMTHREAD_NAMESPACE #define ILMTHREAD_NAMESPACE IlmThread #endif #ifndef ILMTHREAD_INTERNAL_NAMESPACE #define ILMTHREAD_INTERNAL_NAMESPACE ILMTHREAD_NAMESPACE #endif // // We need to be sure that we import the internal namespace into the public one. // To do this, we use the small bit of code below which initially defines // ILMTHREAD_INTERNAL_NAMESPACE (so it can be referenced) and then defines // ILMTHREAD_NAMESPACE and pulls the internal symbols into the public // namespace. // namespace ILMTHREAD_INTERNAL_NAMESPACE {} namespace ILMTHREAD_NAMESPACE { using namespace ILMTHREAD_INTERNAL_NAMESPACE; } // // There are identical pairs of HEADER/SOURCE ENTER/EXIT macros so that // future extension to the namespace mechanism is possible without changing // project source code. // #define ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER namespace ILMTHREAD_INTERNAL_NAMESPACE { #define ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT } #define ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER namespace ILMTHREAD_INTERNAL_NAMESPACE { #define ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT } #endif // INCLUDED_ILMTHREADNAMESPACE_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadPool.cpp000066400000000000000000000514151406177042200216120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Task, class ThreadPool, class TaskGroup // //----------------------------------------------------------------------------- #include "IlmThread.h" #include "IlmThreadMutex.h" #include "IlmThreadSemaphore.h" #include "IlmThreadPool.h" #include "Iex.h" #include #ifndef ILMBASE_FORCE_CXX03 # include # include # include #else # ifndef _WIN32 # include # endif #endif using namespace std; ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER #if defined(__GNU_LIBRARY__) && ( __GLIBC__ < 2 || ( __GLIBC__ == 2 && __GLIBC_MINOR__ < 21 ) ) # define ENABLE_SEM_DTOR_WORKAROUND #endif struct TaskGroup::Data { Data (); ~Data (); void addTask () ; void removeTask (); #ifndef ILMBASE_FORCE_CXX03 std::atomic numPending; #else int numPending; // number of pending tasks to still execute #endif Semaphore isEmpty; // used to signal that the taskgroup is empty #if defined(ENABLE_SEM_DTOR_WORKAROUND) || defined(ILMBASE_FORCE_CXX03) // this mutex is also used to lock numPending in the legacy c++ mode... Mutex dtorMutex; // used to work around the glibc bug: // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 #endif }; struct ThreadPool::Data { typedef ThreadPoolProvider *TPPointer; Data (); ~Data(); Data (const Data&) = delete; Data &operator= (const Data&) = delete; Data (Data&&) = delete; Data &operator= (Data&&) = delete; struct SafeProvider { SafeProvider (Data *d, ThreadPoolProvider *p) : _data( d ), _ptr( p ) { } ~SafeProvider() { if ( _data ) _data->coalesceProviderUse(); } SafeProvider (const SafeProvider &o) : _data( o._data ), _ptr( o._ptr ) { if ( _data ) _data->bumpProviderUse(); } SafeProvider &operator= (const SafeProvider &o) { if ( this != &o ) { if ( o._data ) o._data->bumpProviderUse(); if ( _data ) _data->coalesceProviderUse(); _data = o._data; _ptr = o._ptr; } return *this; } #ifndef ILMBASE_FORCE_CXX03 SafeProvider( SafeProvider &&o ) : _data( o._data ), _ptr( o._ptr ) { o._data = nullptr; } SafeProvider &operator=( SafeProvider &&o ) { std::swap( _data, o._data ); std::swap( _ptr, o._ptr ); return *this; } #endif inline ThreadPoolProvider *get () const { return _ptr; } ThreadPoolProvider *operator-> () const { return get(); } Data *_data; ThreadPoolProvider *_ptr; }; // NB: In C++20, there is full support for atomic shared_ptr, but that is not // yet in use or finalized. Once stabilized, add appropriate usage here inline SafeProvider getProvider (); inline void coalesceProviderUse (); inline void bumpProviderUse (); inline void setProvider (ThreadPoolProvider *p); #ifdef ILMBASE_FORCE_CXX03 Semaphore provSem; Mutex provMutex; int provUsers; ThreadPoolProvider *provider; ThreadPoolProvider *oldprovider; #else std::atomic provUsers; std::atomic provider; #endif }; namespace { class DefaultWorkerThread; struct DefaultWorkData { Semaphore taskSemaphore; // threads wait on this for ready tasks mutable Mutex taskMutex; // mutual exclusion for the tasks list vector tasks; // the list of tasks to execute Semaphore threadSemaphore; // signaled when a thread starts executing mutable Mutex threadMutex; // mutual exclusion for threads list vector threads; // the list of all threads #ifdef ILMBASE_FORCE_CXX03 bool stopping; // flag indicating whether to stop threads mutable Mutex stopMutex; // mutual exclusion for stopping flag #else std::atomic hasThreads; std::atomic stopping; #endif inline bool stopped () const { #ifdef ILMBASE_FORCE_CXX03 Lock lock (stopMutex); return stopping; #else return stopping.load( std::memory_order_relaxed ); #endif } inline void stop () { #ifdef ILMBASE_FORCE_CXX03 Lock lock (stopMutex); #endif stopping = true; } }; // // class WorkerThread // class DefaultWorkerThread: public Thread { public: DefaultWorkerThread (DefaultWorkData* data); virtual void run (); private: DefaultWorkData * _data; }; DefaultWorkerThread::DefaultWorkerThread (DefaultWorkData* data): _data (data) { start(); } void DefaultWorkerThread::run () { // // Signal that the thread has started executing // _data->threadSemaphore.post(); while (true) { // // Wait for a task to become available // _data->taskSemaphore.wait(); { Lock taskLock (_data->taskMutex); // // If there is a task pending, pop off the next task in the FIFO // if (!_data->tasks.empty()) { Task* task = _data->tasks.back(); _data->tasks.pop_back(); taskLock.release(); TaskGroup* taskGroup = task->group(); task->execute(); delete task; taskGroup->_data->removeTask (); } else if (_data->stopped()) { break; } } } } // // class DefaultThreadPoolProvider // class DefaultThreadPoolProvider : public ThreadPoolProvider { public: DefaultThreadPoolProvider(int count); virtual ~DefaultThreadPoolProvider(); virtual int numThreads() const; virtual void setNumThreads(int count); virtual void addTask(Task *task); virtual void finish(); private: DefaultWorkData _data; }; DefaultThreadPoolProvider::DefaultThreadPoolProvider (int count) { setNumThreads(count); } DefaultThreadPoolProvider::~DefaultThreadPoolProvider () { finish(); } int DefaultThreadPoolProvider::numThreads () const { Lock lock (_data.threadMutex); return static_cast (_data.threads.size()); } void DefaultThreadPoolProvider::setNumThreads (int count) { // // Lock access to thread list and size // Lock lock (_data.threadMutex); size_t desired = static_cast(count); if (desired > _data.threads.size()) { // // Add more threads // while (_data.threads.size() < desired) _data.threads.push_back (new DefaultWorkerThread (&_data)); } else if ((size_t)count < _data.threads.size()) { // // Wait until all existing threads are finished processing, // then delete all threads. // finish (); // // Add in new threads // while (_data.threads.size() < desired) _data.threads.push_back (new DefaultWorkerThread (&_data)); } #ifndef ILMBASE_FORCE_CXX03 _data.hasThreads = !(_data.threads.empty()); #endif } void DefaultThreadPoolProvider::addTask (Task *task) { // // Lock the threads, needed to access numThreads // #ifdef ILMBASE_FORCE_CXX03 bool doPush; { Lock lock (_data.threadMutex); doPush = !_data.threads.empty(); } #else bool doPush = _data.hasThreads.load( std::memory_order_relaxed ); #endif if ( doPush ) { // // Get exclusive access to the tasks queue // { Lock taskLock (_data.taskMutex); // // Push the new task into the FIFO // _data.tasks.push_back (task); } // // Signal that we have a new task to process // _data.taskSemaphore.post (); } else { // this path shouldn't normally happen since we have the // NullThreadPoolProvider, but just in case... task->execute (); task->group()->_data->removeTask (); delete task; } } void DefaultThreadPoolProvider::finish () { _data.stop(); // // Signal enough times to allow all threads to stop. // // Wait until all threads have started their run functions. // If we do not wait before we destroy the threads then it's // possible that the threads have not yet called their run // functions. // If this happens then the run function will be called off // of an invalid object and we will crash, most likely with // an error like: "pure virtual method called" // size_t curT = _data.threads.size(); for (size_t i = 0; i != curT; ++i) { if (_data.threads[i]->joinable()) { _data.taskSemaphore.post(); _data.threadSemaphore.wait(); } } // // Join all the threads // for (size_t i = 0; i != curT; ++i) { if (_data.threads[i]->joinable()) _data.threads[i]->join(); delete _data.threads[i]; } Lock lock1 (_data.taskMutex); #ifdef ILMBASE_FORCE_CXX03 Lock lock2 (_data.stopMutex); #endif _data.threads.clear(); _data.tasks.clear(); _data.stopping = false; } class NullThreadPoolProvider : public ThreadPoolProvider { virtual ~NullThreadPoolProvider() {} virtual int numThreads () const { return 0; } virtual void setNumThreads (int count) { } virtual void addTask (Task *t) { t->execute (); t->group()->_data->removeTask (); delete t; } virtual void finish () {} }; } //namespace // // struct TaskGroup::Data // TaskGroup::Data::Data () : numPending (0), isEmpty (1) { // empty } TaskGroup::Data::~Data () { // // A TaskGroup acts like an "inverted" semaphore: if the count // is above 0 then waiting on the taskgroup will block. This // destructor waits until the taskgroup is empty before returning. // isEmpty.wait (); #ifdef ENABLE_SEM_DTOR_WORKAROUND // Update: this was fixed in v. 2.2.21, so this ifdef checks for that // // Alas, given the current bug in glibc we need a secondary // syncronisation primitive here to account for the fact that // destructing the isEmpty Semaphore in this thread can cause // an error for a separate thread that is issuing the post() call. // We are entitled to destruct the semaphore at this point, however, // that post() call attempts to access data out of the associated // memory *after* it has woken the waiting threads, including this one, // potentially leading to invalid memory reads. // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 Lock lock (dtorMutex); #endif } void TaskGroup::Data::addTask () { // // in c++11, we use an atomic to protect numPending to avoid the // extra lock but for c++98, to add the ability for custom thread // pool we add the lock here // #ifdef ILMBASE_FORCE_CXX03 Lock lock (dtorMutex); #endif if (numPending++ == 0) isEmpty.wait (); } void TaskGroup::Data::removeTask () { // Alas, given the current bug in glibc we need a secondary // syncronisation primitive here to account for the fact that // destructing the isEmpty Semaphore in a separate thread can // cause an error. Issuing the post call here the current libc // implementation attempts to access memory *after* it has woken // waiting threads. // Since other threads are entitled to delete the semaphore the // access to the memory location can be invalid. // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 // Update: this bug has been fixed, but how do we know which // glibc version we're in? // Further update: // // we could remove this if it is a new enough glibc, however // we've changed the API to enable a custom override of a // thread pool. In order to provide safe access to the numPending, // we need the lock anyway, except for c++11 or newer #ifdef ILMBASE_FORCE_CXX03 Lock lock (dtorMutex); if (--numPending == 0) isEmpty.post (); #else if (--numPending == 0) { #ifdef ENABLE_SEM_DTOR_WORKAROUND Lock lock (dtorMutex); #endif isEmpty.post (); } #endif } // // struct ThreadPool::Data // ThreadPool::Data::Data (): provUsers (0), provider (NULL) #ifdef ILMBASE_FORCE_CXX03 , oldprovider (NULL) #else #endif { // empty } ThreadPool::Data::~Data() { #ifdef ILMBASE_FORCE_CXX03 provider->finish(); delete provider; #else ThreadPoolProvider *p = provider.load( std::memory_order_relaxed ); p->finish(); delete p; #endif } inline ThreadPool::Data::SafeProvider ThreadPool::Data::getProvider () { #ifdef ILMBASE_FORCE_CXX03 Lock provLock( provMutex ); ++provUsers; return SafeProvider( this, provider ); #else provUsers.fetch_add( 1, std::memory_order_relaxed ); return SafeProvider( this, provider.load( std::memory_order_relaxed ) ); #endif } inline void ThreadPool::Data::coalesceProviderUse () { #ifdef ILMBASE_FORCE_CXX03 Lock provLock( provMutex ); --provUsers; if ( provUsers == 0 ) { if ( oldprovider ) provSem.post(); } #else int ov = provUsers.fetch_sub( 1, std::memory_order_relaxed ); // ov is the previous value, so one means that now it might be 0 if ( ov == 1 ) { } #endif } inline void ThreadPool::Data::bumpProviderUse () { #ifdef ILMBASE_FORCE_CXX03 Lock lock (provMutex); ++provUsers; #else provUsers.fetch_add( 1, std::memory_order_relaxed ); #endif } inline void ThreadPool::Data::setProvider (ThreadPoolProvider *p) { #ifdef ILMBASE_FORCE_CXX03 Lock provLock( provMutex ); if ( oldprovider ) throw IEX_INTERNAL_NAMESPACE::ArgExc ("Attempt to set the thread pool provider while" " another thread is currently setting the provider."); oldprovider = provider; provider = p; while ( provUsers > 0 ) { provLock.release(); provSem.wait(); provLock.acquire(); } if ( oldprovider ) { oldprovider->finish(); delete oldprovider; oldprovider = NULL; } #else ThreadPoolProvider *old = provider.load( std::memory_order_relaxed ); // work around older gcc bug just in case do { if ( ! provider.compare_exchange_weak( old, p, std::memory_order_release, std::memory_order_relaxed ) ) continue; } while (false); // NOSONAR - suppress SonarCloud bug report. // wait for any other users to finish prior to deleting, given // that these are just mostly to query the thread count or push a // task to the queue (so fast), just spin... // // (well, and normally, people don't do this mid stream anyway, so // this will be 0 99.999% of the time, but just to be safe) // while ( provUsers.load( std::memory_order_relaxed ) > 0 ) std::this_thread::yield(); if ( old ) { old->finish(); delete old; } // NB: the shared_ptr mechanism is safer and means we don't have // to have the provUsers counter since the shared_ptr keeps that // for us. However, gcc 4.8/9 compilers which many people are // still using even though it is 2018 forgot to add the shared_ptr // functions... once that compiler is fully deprecated, switch to // using the below, change provider to a std::shared_ptr and remove // provUsers... // // std::shared_ptr newp( p ); // std::shared_ptr curp = std::atomic_load_explicit( &provider, std::memory_order_relaxed ); // do // { // if ( ! std::atomic_compare_exchange_weak_explicit( &provider, &curp, newp, std::memory_order_release, std::memory_order_relaxed ) ) // continue; // } while ( false ); // if ( curp ) // curp->finish(); #endif } // // class Task // Task::Task (TaskGroup* g): _group(g) { if ( g ) g->_data->addTask (); } Task::~Task() { // empty } TaskGroup* Task::group () { return _group; } TaskGroup::TaskGroup (): _data (new Data()) { // empty } TaskGroup::~TaskGroup () { delete _data; } void TaskGroup::finishOneTask () { _data->removeTask (); } // // class ThreadPoolProvider // ThreadPoolProvider::ThreadPoolProvider() { } ThreadPoolProvider::~ThreadPoolProvider() { } // // class ThreadPool // ThreadPool::ThreadPool (unsigned nthreads): _data (new Data) { if ( nthreads == 0 ) _data->setProvider( new NullThreadPoolProvider ); else _data->setProvider( new DefaultThreadPoolProvider( int(nthreads) ) ); } ThreadPool::~ThreadPool () { delete _data; } int ThreadPool::numThreads () const { return _data->getProvider ()->numThreads (); } void ThreadPool::setNumThreads (int count) { if (count < 0) throw IEX_INTERNAL_NAMESPACE::ArgExc ("Attempt to set the number of threads " "in a thread pool to a negative value."); bool doReset = false; { Data::SafeProvider sp = _data->getProvider (); int curT = sp->numThreads (); if ( curT == count ) return; if ( curT == 0 ) { NullThreadPoolProvider *npp = dynamic_cast( sp.get() ); if ( npp ) doReset = true; } else if ( count == 0 ) { DefaultThreadPoolProvider *dpp = dynamic_cast( sp.get() ); if ( dpp ) doReset = true; } if ( ! doReset ) sp->setNumThreads( count ); } if ( doReset ) { if ( count == 0 ) _data->setProvider( new NullThreadPoolProvider ); else _data->setProvider( new DefaultThreadPoolProvider( count ) ); } } void ThreadPool::setThreadProvider (ThreadPoolProvider *provider) { _data->setProvider (provider); } void ThreadPool::addTask (Task* task) { _data->getProvider ()->addTask (task); } ThreadPool& ThreadPool::globalThreadPool () { // // The global thread pool // static ThreadPool gThreadPool (0); return gThreadPool; } void ThreadPool::addGlobalTask (Task* task) { globalThreadPool().addTask (task); } unsigned ThreadPool::estimateThreadCountForFileIO () { #ifdef ILMBASE_FORCE_CXX03 # if defined (_WIN32) || defined (_WIN64) SYSTEM_INFO sysinfo; GetSystemInfo (&sysinfo); return static_cast (sysinfo.dwNumberOfProcessors); # elif defined(_SC_NPROCESSORS_ONLN) int count = sysconf (_SC_NPROCESSORS_ONLN); return static_cast( count < 0 ? 0 : count ); # else return 0; # endif #else return std::thread::hardware_concurrency (); #endif } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/IlmThread/IlmThreadPool.h000066400000000000000000000205001406177042200212460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILM_THREAD_POOL_H #define INCLUDED_ILM_THREAD_POOL_H //----------------------------------------------------------------------------- // // class Task, class ThreadPool, class TaskGroup // // Class ThreadPool manages a set of worker threads and accepts // tasks for processing. Tasks added to the thread pool are // executed concurrently by the worker threads. // // Class Task provides an abstract interface for a task which // a ThreadPool works on. Derived classes need to implement the // execute() function which performs the actual task. // // Class TaskGroup allows synchronization on the completion of a set // of tasks. Every task that is added to a ThreadPool belongs to a // single TaskGroup. The destructor of the TaskGroup waits for all // tasks in the group to finish. // // Note: if you plan to use the ThreadPool interface in your own // applications note that the implementation of the ThreadPool calls // operator delete on tasks as they complete. If you define a custom // operator new for your tasks, for instance to use a custom heap, // then you must also write an appropriate operator delete. // //----------------------------------------------------------------------------- #include "IlmThreadNamespace.h" #include "IlmThreadExport.h" ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER class TaskGroup; class Task; //------------------------------------------------------- // ThreadPoolProvider -- this is a pure virtual interface // enabling custom overloading of the threads used and how // the implementation of the processing of tasks // is implemented //------------------------------------------------------- class ILMTHREAD_EXPORT ThreadPoolProvider { public: ThreadPoolProvider(); virtual ~ThreadPoolProvider(); // as in ThreadPool below virtual int numThreads () const = 0; // as in ThreadPool below virtual void setNumThreads (int count) = 0; // as in ThreadPool below virtual void addTask (Task* task) = 0; // Ensure that all tasks in this set are finished // and threads shutdown virtual void finish () = 0; // Make the provider non-copyable #if __cplusplus >= 201103L ThreadPoolProvider (const ThreadPoolProvider &) = delete; ThreadPoolProvider &operator= (const ThreadPoolProvider &) = delete; ThreadPoolProvider (ThreadPoolProvider &&) = delete; ThreadPoolProvider &operator= (ThreadPoolProvider &&) = delete; #else private: ThreadPoolProvider (const ThreadPoolProvider &); ThreadPoolProvider &operator= (const ThreadPoolProvider &); #endif }; class ILMTHREAD_EXPORT ThreadPool { public: //------------------------------------------------------- // static routine to query how many processors should be // used for processing exr files. The user of ThreadPool // is free to use std::thread::hardware_concurrency or // whatever number of threads is appropriate based on the // application. However, this routine exists such that // in the future, if core counts expand faster than // memory bandwidth, or higher order NUMA machines are built // that we can query, this routine gives a place where we // can centralize that logic //------------------------------------------------------- static unsigned estimateThreadCountForFileIO (); //------------------------------------------------------- // Constructor -- creates numThreads worker threads which // wait until a task is available, // using a default ThreadPoolProvider //------------------------------------------------------- ThreadPool (unsigned numThreads = 0); //----------------------------------------------------------- // Destructor -- waits for all tasks to complete, joins all // the threads to the calling thread, and then destroys them. //----------------------------------------------------------- virtual ~ThreadPool (); ThreadPool (const ThreadPool&) = delete; ThreadPool& operator= (const ThreadPool&) = delete; ThreadPool (ThreadPool&&) = delete; ThreadPool& operator= (ThreadPool&&) = delete; //-------------------------------------------------------- // Query and set the number of worker threads in the pool. // // Warning: never call setNumThreads from within a worker // thread as this will almost certainly cause a deadlock // or crash. //-------------------------------------------------------- int numThreads () const; void setNumThreads (int count); //-------------------------------------------------------- // Set the thread provider for the pool. // // The ThreadPool takes ownership of the ThreadPoolProvider // and will call delete on it when it is finished or when // it is changed // // Warning: never call setThreadProvider from within a worker // thread as this will almost certainly cause a deadlock // or crash. //-------------------------------------------------------- void setThreadProvider (ThreadPoolProvider *provider); //------------------------------------------------------------ // Add a task for processing. The ThreadPool can handle any // number of tasks regardless of the number of worker threads. // The tasks are first added onto a queue, and are executed // by threads as they become available, in FIFO order. //------------------------------------------------------------ void addTask (Task* task); //------------------------------------------- // Access functions for the global threadpool //------------------------------------------- static ThreadPool& globalThreadPool (); static void addGlobalTask (Task* task); struct Data; protected: Data * _data; }; class ILMTHREAD_EXPORT Task { public: Task (TaskGroup* g); virtual ~Task (); Task (const Task&) = delete; Task &operator= (const Task&) = delete; Task (Task&&) = delete; Task& operator= (Task&&) = delete; virtual void execute () = 0; TaskGroup * group(); protected: TaskGroup * _group; }; class ILMTHREAD_EXPORT TaskGroup { public: TaskGroup(); ~TaskGroup(); TaskGroup (const TaskGroup& other) = delete; TaskGroup& operator = (const TaskGroup& other) = delete; TaskGroup (TaskGroup&& other) = delete; TaskGroup& operator = (TaskGroup&& other) = delete; // marks one task as finished // should be used by the thread pool provider to notify // as it finishes tasks void finishOneTask (); struct Data; Data* const _data; }; ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_ILM_THREAD_POOL_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadPosix.cpp000066400000000000000000000053671406177042200220100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Thread -- implementation for // platforms that support Posix threads // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #ifdef HAVE_PTHREAD #ifdef ILMBASE_FORCE_CXX03 #include "IlmThread.h" #include "Iex.h" #include extern "C" { typedef void * (* Start) (void *); } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER bool supportsThreads () { return true; } namespace { void threadLoop (void * t) { return (reinterpret_cast(t))->run(); } } // namespace Thread::Thread () { // empty } Thread::~Thread () { int error = ::pthread_join (_thread, 0); assert (error == 0); } void Thread::start () { if (int error = ::pthread_create (&_thread, 0, Start (threadLoop), this)) IEX_NAMESPACE::throwErrnoExc ("Cannot create new thread (%T).", error); } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphore.cpp000066400000000000000000000046631406177042200226270ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Semaphore -- dummy implementation for // for platforms that do not support threading // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #if !defined (_WIN32) && !(_WIN64) && !(HAVE_PTHREAD) #include "IlmThreadSemaphore.h" ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Semaphore::Semaphore (unsigned int value) {} Semaphore::~Semaphore () {} void Semaphore::wait () {} bool Semaphore::tryWait () {return true;} void Semaphore::post () {} int Semaphore::value () const {return 0;} ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphore.h000066400000000000000000000074411406177042200222710ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_ILM_THREAD_SEMAPHORE_H #define INCLUDED_ILM_THREAD_SEMAPHORE_H //----------------------------------------------------------------------------- // // class Semaphore -- a wrapper class for // system-dependent counting semaphores // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThreadExport.h" #include "IlmThreadNamespace.h" #if defined _WIN32 || defined _WIN64 # ifdef NOMINMAX # undef NOMINMAX # endif # define NOMINMAX # include #endif #ifdef HAVE_POSIX_SEMAPHORES # include #elif defined(__APPLE__) # include #else # ifdef ILMBASE_FORCE_CXX03 # ifdef HAVE_PTHREAD # include # endif # else # include # include # endif #endif ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER class ILMTHREAD_EXPORT Semaphore { public: Semaphore (unsigned int value = 0); virtual ~Semaphore(); void wait(); bool tryWait(); void post(); int value() const; private: #if (defined (_WIN32) || defined (_WIN64)) && !defined (HAVE_POSIX_SEMAPHORES) mutable HANDLE _semaphore; #elif defined(HAVE_POSIX_SEMAPHORES) mutable sem_t _semaphore; #elif defined(__APPLE__) mutable dispatch_semaphore_t _semaphore; #else // // If the platform has Posix threads but no semapohores, // then we implement them ourselves using condition variables // struct sema_t { unsigned int count; unsigned long numWaiting; # if ILMBASE_FORCE_CXX03 # if HAVE_PTHREAD pthread_mutex_t mutex; pthread_cond_t nonZero; # else # error unhandled legacy setup # endif # else std::mutex mutex; std::condition_variable nonZero; # endif }; mutable sema_t _semaphore; #endif void operator = (const Semaphore& s); // not implemented Semaphore (const Semaphore& s); // not implemented }; ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_ILM_THREAD_SEMAPHORE_H openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphoreOSX.cpp000066400000000000000000000060321406177042200232110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Semaphore -- implementation for OSX platform(it don't support unnamed Posix semaphores) // std::condition_variable + std::mutex emulation show poor performance // //----------------------------------------------------------------------------- #if defined(__APPLE__) #include "IlmThreadSemaphore.h" #include "Iex.h" ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Semaphore::Semaphore (unsigned int value) { // Calls to dispatch_semaphore_signal must be balanced with calls to wait(). // Attempting to dispose of a semaphore with a count lower than value causes an EXC_BAD_INSTRUCTION exception. _semaphore = dispatch_semaphore_create (0); while (value--) post (); } Semaphore::~Semaphore () { dispatch_release (_semaphore); } void Semaphore::wait () { dispatch_semaphore_wait (_semaphore, DISPATCH_TIME_FOREVER); } bool Semaphore::tryWait () { return dispatch_semaphore_wait (_semaphore, DISPATCH_TIME_NOW) == 0; } void Semaphore::post () { dispatch_semaphore_signal (_semaphore); } int Semaphore::value () const { throw IEX_NAMESPACE::NoImplExc ("Not implemented on this platform"); return 0; } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphorePosix.cpp000066400000000000000000000061611406177042200236450ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Semaphore -- implementation for platforms // that support Posix threads and Posix semaphores // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #if defined (HAVE_PTHREAD) && defined(HAVE_POSIX_SEMAPHORES) #include "IlmThreadSemaphore.h" #include "Iex.h" #include #include ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER Semaphore::Semaphore (unsigned int value) { if (::sem_init (&_semaphore, 0, value)) IEX_NAMESPACE::throwErrnoExc ("Cannot initialize semaphore (%T)."); } Semaphore::~Semaphore () { #ifdef NDEBUG ::sem_destroy (&_semaphore); #else int error = ::sem_destroy (&_semaphore); assert (error == 0); #endif } void Semaphore::wait () { while( ::sem_wait( &_semaphore ) == -1 && errno == EINTR ) { } } bool Semaphore::tryWait () { return sem_trywait (&_semaphore) == 0; } void Semaphore::post () { if (::sem_post (&_semaphore)) IEX_NAMESPACE::throwErrnoExc ("Post operation on semaphore failed (%T)."); } int Semaphore::value () const { int value; if (::sem_getvalue (&_semaphore, &value)) IEX_NAMESPACE::throwErrnoExc ("Cannot read semaphore value (%T)."); return value; } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp000066400000000000000000000134331406177042200250110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Semaphore -- implementation for for platforms that do // support Posix threads but do not support Posix semaphores // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThreadSemaphore.h" #if !defined (HAVE_POSIX_SEMAPHORES) && !defined (__APPLE__) #if (!defined (_WIN32) && !defined (_WIN64)) || defined (__MINGW64_VERSION_MAJOR) #include "Iex.h" #include ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER #if defined (ILMBASE_FORCE_CXX03) && defined(HAVE_PTHREAD) Semaphore::Semaphore (unsigned int value) { if (int error = ::pthread_mutex_init (&_semaphore.mutex, 0)) IEX_NAMESPACE::throwErrnoExc ("Cannot initialize mutex (%T).", error); if (int error = ::pthread_cond_init (&_semaphore.nonZero, 0)) IEX_NAMESPACE::throwErrnoExc ("Cannot initialize condition variable (%T).", error); _semaphore.count = value; _semaphore.numWaiting = 0; } Semaphore::~Semaphore () { int error = ::pthread_cond_destroy (&_semaphore.nonZero); assert (error == 0); error = ::pthread_mutex_destroy (&_semaphore.mutex); assert (error == 0); } void Semaphore::wait () { ::pthread_mutex_lock (&_semaphore.mutex); _semaphore.numWaiting++; while (_semaphore.count == 0) { if (int error = ::pthread_cond_wait (&_semaphore.nonZero, &_semaphore.mutex)) { ::pthread_mutex_unlock (&_semaphore.mutex); IEX_NAMESPACE::throwErrnoExc ("Cannot wait on condition variable (%T).", error); } } _semaphore.numWaiting--; _semaphore.count--; ::pthread_mutex_unlock (&_semaphore.mutex); } bool Semaphore::tryWait () { ::pthread_mutex_lock (&_semaphore.mutex); if (_semaphore.count == 0) { ::pthread_mutex_unlock (&_semaphore.mutex); return false; } else { _semaphore.count--; ::pthread_mutex_unlock (&_semaphore.mutex); return true; } } void Semaphore::post () { ::pthread_mutex_lock (&_semaphore.mutex); if (_semaphore.numWaiting > 0) { int error; if (_semaphore.numWaiting > 1 && _semaphore.count > 1) { error = ::pthread_cond_broadcast (&_semaphore.nonZero); } else { error = ::pthread_cond_signal (&_semaphore.nonZero); } if (error) { ::pthread_mutex_unlock (&_semaphore.mutex); IEX_NAMESPACE::throwErrnoExc ("Cannot signal condition variable (%T).", error); } } _semaphore.count++; ::pthread_mutex_unlock (&_semaphore.mutex); } int Semaphore::value () const { ::pthread_mutex_lock (&_semaphore.mutex); int value = _semaphore.count; ::pthread_mutex_unlock (&_semaphore.mutex); return value; } #else Semaphore::Semaphore (unsigned int value) { _semaphore.count = value; _semaphore.numWaiting = 0; } Semaphore::~Semaphore () { } void Semaphore::wait () { std::unique_lock lk(_semaphore.mutex); _semaphore.numWaiting++; while (_semaphore.count == 0) _semaphore.nonZero.wait (lk); _semaphore.numWaiting--; _semaphore.count--; } bool Semaphore::tryWait () { std::lock_guard lk(_semaphore.mutex); if (_semaphore.count == 0) return false; _semaphore.count--; return true; } void Semaphore::post () { std::lock_guard lk(_semaphore.mutex); _semaphore.count++; if (_semaphore.numWaiting > 0) { if (_semaphore.count > 1) _semaphore.nonZero.notify_all(); else _semaphore.nonZero.notify_one(); } } int Semaphore::value () const { std::lock_guard lk(_semaphore.mutex); return _semaphore.count; } #endif ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif #endif openexr-2.5.7/IlmBase/IlmThread/IlmThreadSemaphoreWin32.cpp000066400000000000000000000077101406177042200234460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Semaphore -- implementation for Windows // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #if (defined(_WIN32) || defined(_WIN64)) && !defined(HAVE_POSIX_SEMAPHORES) #include "IlmThreadSemaphore.h" #include "Iex.h" #include #include #include ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace IEX_NAMESPACE; namespace { std::string errorString () { LPSTR messageBuffer; DWORD bufferLength; std::string message; // // Call FormatMessage() to allow for message // text to be acquired from the system. // if (bufferLength = FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &messageBuffer, 0, NULL)) { message = messageBuffer; LocalFree (messageBuffer); } return message; } } // namespace Semaphore::Semaphore (unsigned int value) { if ((_semaphore = ::CreateSemaphore (0, value, 0x7fffffff, 0)) == 0) { THROW (LogicExc, "Could not create semaphore " "(" << errorString() << ")."); } } Semaphore::~Semaphore() { bool ok = ::CloseHandle (_semaphore) != FALSE; assert (ok); } void Semaphore::wait() { if (::WaitForSingleObject (_semaphore, INFINITE) != WAIT_OBJECT_0) { THROW (LogicExc, "Could not wait on semaphore " "(" << errorString() << ")."); } } bool Semaphore::tryWait() { return ::WaitForSingleObject (_semaphore, 0) == WAIT_OBJECT_0; } void Semaphore::post() { if (!::ReleaseSemaphore (_semaphore, 1, 0)) { THROW (LogicExc, "Could not post on semaphore " "(" << errorString() << ")."); } } int Semaphore::value() const { LONG v = -1; if (!::ReleaseSemaphore (_semaphore, 0, &v) || v < 0) { THROW (LogicExc, "Could not get value of semaphore " "(" << errorString () << ")."); } return v; } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif // _WIN32 openexr-2.5.7/IlmBase/IlmThread/IlmThreadWin32.cpp000066400000000000000000000056351406177042200216060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Thread -- implementation for Windows // //----------------------------------------------------------------------------- #include "IlmBaseConfig.h" #include "IlmThread.h" #ifdef ILMBASE_FORCE_CXX03 #if (defined (_WIN32) || defined (_WIN64)) && !defined(HAVE_PTHREAD) #include "Iex.h" #include #include ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER bool supportsThreads () { return true; } namespace { unsigned __stdcall threadLoop (void * t) { reinterpret_cast(t)->run(); _endthreadex (0); return 0; } } // namespace Thread::Thread () { // empty } Thread::~Thread () { DWORD status = ::WaitForSingleObject (_thread, INFINITE); assert (status == WAIT_OBJECT_0); bool ok = ::CloseHandle (_thread) != FALSE; assert (ok); } void Thread::start () { unsigned id; _thread = (HANDLE)::_beginthreadex (0, 0, &threadLoop, this, 0, &id); if (_thread == 0) IEX_NAMESPACE::throwErrnoExc ("Cannot create new thread (%T)."); } ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT #endif // _WIN32 #endif openexr-2.5.7/IlmBase/IlmThread/Makefile.am000066400000000000000000000022621406177042200204330ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = libIlmThread.la libIlmThread_la_SOURCES = IlmThreadPool.h IlmThread.h \ IlmThreadSemaphore.h IlmThreadMutex.h \ IlmThreadPool.cpp IlmThread.cpp \ IlmThreadSemaphore.cpp IlmThreadMutex.cpp \ IlmThreadPosix.cpp IlmThreadSemaphorePosix.cpp \ IlmThreadSemaphorePosixCompat.cpp \ IlmThreadSemaphoreOSX.cpp \ IlmThreadMutexPosix.cpp libIlmThread_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined if LIB_SUFFIX_EXISTS libIlmThread_la_LDFLAGS += -release @LIB_SUFFIX@ endif libIlmThread_la_LIBADD = ../Iex/libIex.la $(PTHREAD_LIBS) libIlmThreadincludedir = $(includedir)/OpenEXR libIlmThreadinclude_HEADERS = IlmThreadPool.h IlmThread.h \ IlmThreadSemaphore.h IlmThreadMutex.h \ IlmThreadNamespace.h IlmThreadForward.h \ IlmThreadExport.h noinst_HEADERS = EXTRA_DIST = $(noinst_HEADERS) IlmThreadMutexWin32.cpp IlmThreadSemaphoreWin32.cpp \ IlmThreadWin32.cpp CMakeLists.txt AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Iex -I$(top_srcdir)/config openexr-2.5.7/IlmBase/Imath/000077500000000000000000000000001406177042200155665ustar00rootroot00000000000000openexr-2.5.7/IlmBase/Imath/CMakeLists.txt000066400000000000000000000017051406177042200203310ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. ilmbase_define_library(Imath PRIV_EXPORT IMATH_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES ImathRandom.cpp ImathColorAlgo.cpp ImathFun.cpp ImathVec.cpp ImathExc.cpp ImathMatrixAlgo.cpp HEADERS ImathBoxAlgo.h ImathBox.h ImathColorAlgo.h ImathColor.h ImathEuler.h ImathExc.h ImathExport.h ImathForward.h ImathFrame.h ImathFrustum.h ImathFrustumTest.h ImathFun.h ImathGL.h ImathGLU.h ImathHalfLimits.h ImathInt64.h ImathInterval.h ImathLimits.h ImathLineAlgo.h ImathLine.h ImathMath.h ImathMatrixAlgo.h ImathMatrix.h ImathNamespace.h ImathPlane.h ImathPlatform.h ImathQuat.h ImathRandom.h ImathRoots.h ImathShear.h ImathSphere.h ImathVecAlgo.h ImathVec.h DEPENDENCIES IlmBase::Half IlmBase::IexMath ) openexr-2.5.7/IlmBase/Imath/ImathBox.h000066400000000000000000000411751406177042200174620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHBOX_H #define INCLUDED_IMATHBOX_H //------------------------------------------------------------------- // // class Imath::Box // -------------------------------- // // This class imposes the following requirements on its // parameter class: // // 1) The class T must implement these operators: // + - < > <= >= = // with the signature (T,T) and the expected // return values for a numeric type. // // 2) The class T must implement operator= // with the signature (T,float and/or double) // // 3) The class T must have a constructor which takes // a float (and/or double) for use in initializing the box. // // 4) The class T must have a function T::dimensions() // which returns the number of dimensions in the class // (since its assumed its a vector) -- preferably, this // returns a constant expression. // //------------------------------------------------------------------- #include "ImathVec.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Box { public: //------------------------- // Data Members are public //------------------------- T min; T max; //----------------------------------------------------- // Constructors - an "empty" box is created by default //----------------------------------------------------- Box (); Box (const T &point); Box (const T &minT, const T &maxT); //-------------------- // Operators: ==, != //-------------------- bool operator == (const Box &src) const; bool operator != (const Box &src) const; //------------------ // Box manipulation //------------------ void makeEmpty (); void extendBy (const T &point); void extendBy (const Box &box); void makeInfinite (); //--------------------------------------------------- // Query functions - these compute results each time //--------------------------------------------------- T size () const; T center () const; bool intersects (const T &point) const; bool intersects (const Box &box) const; unsigned int majorAxis () const; //---------------- // Classification //---------------- bool isEmpty () const; bool hasVolume () const; bool isInfinite () const; }; //-------------------- // Convenient typedefs //-------------------- typedef Box Box2s; typedef Box Box2i; typedef Box Box2f; typedef Box Box2d; typedef Box Box3s; typedef Box Box3i; typedef Box Box3f; typedef Box Box3d; //---------------- // Implementation template inline Box::Box() { makeEmpty(); } template inline Box::Box (const T &point) { min = point; max = point; } template inline Box::Box (const T &minT, const T &maxT) { min = minT; max = maxT; } template inline bool Box::operator == (const Box &src) const { return (min == src.min && max == src.max); } template inline bool Box::operator != (const Box &src) const { return (min != src.min || max != src.max); } template inline void Box::makeEmpty() { min = T(T::baseTypeMax()); max = T(T::baseTypeMin()); } template inline void Box::makeInfinite() { min = T(T::baseTypeMin()); max = T(T::baseTypeMax()); } template inline void Box::extendBy(const T &point) { for (unsigned int i = 0; i < min.dimensions(); i++) { if (point[i] < min[i]) min[i] = point[i]; if (point[i] > max[i]) max[i] = point[i]; } } template inline void Box::extendBy(const Box &box) { for (unsigned int i = 0; i < min.dimensions(); i++) { if (box.min[i] < min[i]) min[i] = box.min[i]; if (box.max[i] > max[i]) max[i] = box.max[i]; } } template inline bool Box::intersects(const T &point) const { for (unsigned int i = 0; i < min.dimensions(); i++) { if (point[i] < min[i] || point[i] > max[i]) return false; } return true; } template inline bool Box::intersects(const Box &box) const { for (unsigned int i = 0; i < min.dimensions(); i++) { if (box.max[i] < min[i] || box.min[i] > max[i]) return false; } return true; } template inline T Box::size() const { if (isEmpty()) return T (0); return max - min; } template inline T Box::center() const { return (max + min) / 2; } template inline bool Box::isEmpty() const { for (unsigned int i = 0; i < min.dimensions(); i++) { if (max[i] < min[i]) return true; } return false; } template inline bool Box::isInfinite() const { for (unsigned int i = 0; i < min.dimensions(); i++) { if (min[i] != T::baseTypeMin() || max[i] != T::baseTypeMax()) return false; } return true; } template inline bool Box::hasVolume() const { for (unsigned int i = 0; i < min.dimensions(); i++) { if (max[i] <= min[i]) return false; } return true; } template inline unsigned int Box::majorAxis() const { unsigned int major = 0; T s = size(); for (unsigned int i = 1; i < min.dimensions(); i++) { if (s[i] > s[major]) major = i; } return major; } //------------------------------------------------------------------- // // Partial class specializations for Imath::Vec2 and Imath::Vec3 // //------------------------------------------------------------------- template class Box; template class Box > { public: //------------------------- // Data Members are public //------------------------- Vec2 min; Vec2 max; //----------------------------------------------------- // Constructors - an "empty" box is created by default //----------------------------------------------------- Box(); Box (const Vec2 &point); Box (const Vec2 &minT, const Vec2 &maxT); //-------------------- // Operators: ==, != //-------------------- bool operator == (const Box > &src) const; bool operator != (const Box > &src) const; //------------------ // Box manipulation //------------------ void makeEmpty(); void extendBy (const Vec2 &point); void extendBy (const Box > &box); void makeInfinite(); //--------------------------------------------------- // Query functions - these compute results each time //--------------------------------------------------- Vec2 size() const; Vec2 center() const; bool intersects (const Vec2 &point) const; bool intersects (const Box > &box) const; unsigned int majorAxis() const; //---------------- // Classification //---------------- bool isEmpty() const; bool hasVolume() const; bool isInfinite() const; }; //---------------- // Implementation template inline Box >::Box() { makeEmpty(); } template inline Box >::Box (const Vec2 &point) { min = point; max = point; } template inline Box >::Box (const Vec2 &minT, const Vec2 &maxT) { min = minT; max = maxT; } template inline bool Box >::operator == (const Box > &src) const { return (min == src.min && max == src.max); } template inline bool Box >::operator != (const Box > &src) const { return (min != src.min || max != src.max); } template inline void Box >::makeEmpty() { min = Vec2(Vec2::baseTypeMax()); max = Vec2(Vec2::baseTypeMin()); } template inline void Box >::makeInfinite() { min = Vec2(Vec2::baseTypeMin()); max = Vec2(Vec2::baseTypeMax()); } template inline void Box >::extendBy (const Vec2 &point) { if (point[0] < min[0]) min[0] = point[0]; if (point[0] > max[0]) max[0] = point[0]; if (point[1] < min[1]) min[1] = point[1]; if (point[1] > max[1]) max[1] = point[1]; } template inline void Box >::extendBy (const Box > &box) { if (box.min[0] < min[0]) min[0] = box.min[0]; if (box.max[0] > max[0]) max[0] = box.max[0]; if (box.min[1] < min[1]) min[1] = box.min[1]; if (box.max[1] > max[1]) max[1] = box.max[1]; } template inline bool Box >::intersects (const Vec2 &point) const { if (point[0] < min[0] || point[0] > max[0] || point[1] < min[1] || point[1] > max[1]) return false; return true; } template inline bool Box >::intersects (const Box > &box) const { if (box.max[0] < min[0] || box.min[0] > max[0] || box.max[1] < min[1] || box.min[1] > max[1]) return false; return true; } template inline Vec2 Box >::size() const { if (isEmpty()) return Vec2 (0); return max - min; } template inline Vec2 Box >::center() const { return (max + min) / 2; } template inline bool Box >::isEmpty() const { if (max[0] < min[0] || max[1] < min[1]) return true; return false; } template inline bool Box > ::isInfinite() const { if (min[0] != limits::min() || max[0] != limits::max() || min[1] != limits::min() || max[1] != limits::max()) return false; return true; } template inline bool Box >::hasVolume() const { if (max[0] <= min[0] || max[1] <= min[1]) return false; return true; } template inline unsigned int Box >::majorAxis() const { unsigned int major = 0; Vec2 s = size(); if (s[1] > s[major]) major = 1; return major; } template class Box > { public: //------------------------- // Data Members are public //------------------------- Vec3 min; Vec3 max; //----------------------------------------------------- // Constructors - an "empty" box is created by default //----------------------------------------------------- Box(); Box (const Vec3 &point); Box (const Vec3 &minT, const Vec3 &maxT); //-------------------- // Operators: ==, != //-------------------- bool operator == (const Box > &src) const; bool operator != (const Box > &src) const; //------------------ // Box manipulation //------------------ void makeEmpty(); void extendBy (const Vec3 &point); void extendBy (const Box > &box); void makeInfinite (); //--------------------------------------------------- // Query functions - these compute results each time //--------------------------------------------------- Vec3 size() const; Vec3 center() const; bool intersects (const Vec3 &point) const; bool intersects (const Box > &box) const; unsigned int majorAxis() const; //---------------- // Classification //---------------- bool isEmpty() const; bool hasVolume() const; bool isInfinite() const; }; //---------------- // Implementation template inline Box >::Box() { makeEmpty(); } template inline Box >::Box (const Vec3 &point) { min = point; max = point; } template inline Box >::Box (const Vec3 &minT, const Vec3 &maxT) { min = minT; max = maxT; } template inline bool Box >::operator == (const Box > &src) const { return (min == src.min && max == src.max); } template inline bool Box >::operator != (const Box > &src) const { return (min != src.min || max != src.max); } template inline void Box >::makeEmpty() { min = Vec3(Vec3::baseTypeMax()); max = Vec3(Vec3::baseTypeMin()); } template inline void Box >::makeInfinite() { min = Vec3(Vec3::baseTypeMin()); max = Vec3(Vec3::baseTypeMax()); } template inline void Box >::extendBy (const Vec3 &point) { if (point[0] < min[0]) min[0] = point[0]; if (point[0] > max[0]) max[0] = point[0]; if (point[1] < min[1]) min[1] = point[1]; if (point[1] > max[1]) max[1] = point[1]; if (point[2] < min[2]) min[2] = point[2]; if (point[2] > max[2]) max[2] = point[2]; } template inline void Box >::extendBy (const Box > &box) { if (box.min[0] < min[0]) min[0] = box.min[0]; if (box.max[0] > max[0]) max[0] = box.max[0]; if (box.min[1] < min[1]) min[1] = box.min[1]; if (box.max[1] > max[1]) max[1] = box.max[1]; if (box.min[2] < min[2]) min[2] = box.min[2]; if (box.max[2] > max[2]) max[2] = box.max[2]; } template inline bool Box >::intersects (const Vec3 &point) const { if (point[0] < min[0] || point[0] > max[0] || point[1] < min[1] || point[1] > max[1] || point[2] < min[2] || point[2] > max[2]) return false; return true; } template inline bool Box >::intersects (const Box > &box) const { if (box.max[0] < min[0] || box.min[0] > max[0] || box.max[1] < min[1] || box.min[1] > max[1] || box.max[2] < min[2] || box.min[2] > max[2]) return false; return true; } template inline Vec3 Box >::size() const { if (isEmpty()) return Vec3 (0); return max - min; } template inline Vec3 Box >::center() const { return (max + min) / 2; } template inline bool Box >::isEmpty() const { if (max[0] < min[0] || max[1] < min[1] || max[2] < min[2]) return true; return false; } template inline bool Box >::isInfinite() const { if (min[0] != limits::min() || max[0] != limits::max() || min[1] != limits::min() || max[1] != limits::max() || min[2] != limits::min() || max[2] != limits::max()) return false; return true; } template inline bool Box >::hasVolume() const { if (max[0] <= min[0] || max[1] <= min[1] || max[2] <= min[2]) return false; return true; } template inline unsigned int Box >::majorAxis() const { unsigned int major = 0; Vec3 s = size(); if (s[1] > s[major]) major = 1; if (s[2] > s[major]) major = 2; return major; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHBOX_H openexr-2.5.7/IlmBase/Imath/ImathBoxAlgo.h000066400000000000000000000545461406177042200202730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHBOXALGO_H #define INCLUDED_IMATHBOXALGO_H //--------------------------------------------------------------------------- // // This file contains algorithms applied to or in conjunction // with bounding boxes (Imath::Box). These algorithms require // more headers to compile. The assumption made is that these // functions are called much less often than the basic box // functions or these functions require more support classes. // // Contains: // // T clip(const T& in, const Box& box) // // Vec3 closestPointOnBox(const Vec3&, const Box>& ) // // Vec3 closestPointInBox(const Vec3&, const Box>& ) // // Box< Vec3 > transform(const Box>&, const Matrix44&) // Box< Vec3 > affineTransform(const Box>&, const Matrix44&) // // void transform(const Box>&, const Matrix44&, Box>&) // void affineTransform(const Box>&, // const Matrix44&, // Box>&) // // bool findEntryAndExitPoints(const Line &line, // const Box< Vec3 > &box, // Vec3 &enterPoint, // Vec3 &exitPoint) // // bool intersects(const Box> &box, // const Line3 &ray, // Vec3 intersectionPoint) // // bool intersects(const Box> &box, const Line3 &ray) // //--------------------------------------------------------------------------- #include "ImathBox.h" #include "ImathMatrix.h" #include "ImathLineAlgo.h" #include "ImathPlane.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template inline T clip (const T &p, const Box &box) { // // Clip the coordinates of a point, p, against a box. // The result, q, is the closest point to p that is inside the box. // T q; for (int i = 0; i < int (box.min.dimensions()); i++) { if (p[i] < box.min[i]) q[i] = box.min[i]; else if (p[i] > box.max[i]) q[i] = box.max[i]; else q[i] = p[i]; } return q; } template inline T closestPointInBox (const T &p, const Box &box) { return clip (p, box); } template Vec3 closestPointOnBox (const Vec3 &p, const Box< Vec3 > &box) { // // Find the point, q, on the surface of // the box, that is closest to point p. // // If the box is empty, return p. // if (box.isEmpty()) return p; Vec3 q = closestPointInBox (p, box); if (q == p) { Vec3 d1 = p - box.min; Vec3 d2 = box.max - p; Vec3 d ((d1.x < d2.x)? d1.x: d2.x, (d1.y < d2.y)? d1.y: d2.y, (d1.z < d2.z)? d1.z: d2.z); if (d.x < d.y && d.x < d.z) { q.x = (d1.x < d2.x)? box.min.x: box.max.x; } else if (d.y < d.z) { q.y = (d1.y < d2.y)? box.min.y: box.max.y; } else { q.z = (d1.z < d2.z)? box.min.z: box.max.z; } } return q; } template Box< Vec3 > transform (const Box< Vec3 > &box, const Matrix44 &m) { // // Transform a 3D box by a matrix, and compute a new box that // tightly encloses the transformed box. // // If m is an affine transform, then we use James Arvo's fast // method as described in "Graphics Gems", Academic Press, 1990, // pp. 548-550. // // // A transformed empty box is still empty, and a transformed infinite box // is still infinite // if (box.isEmpty() || box.isInfinite()) return box; // // If the last column of m is (0 0 0 1) then m is an affine // transform, and we use the fast Graphics Gems trick. // if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) { Box< Vec3 > newBox; for (int i = 0; i < 3; i++) { newBox.min[i] = newBox.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { newBox.min[i] += a; newBox.max[i] += b; } else { newBox.min[i] += b; newBox.max[i] += a; } } } return newBox; } // // M is a projection matrix. Do things the naive way: // Transform the eight corners of the box, and find an // axis-parallel box that encloses the transformed corners. // Vec3 points[8]; points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; Box< Vec3 > newBox; for (int i = 0; i < 8; i++) newBox.extendBy (points[i] * m); return newBox; } template void transform (const Box< Vec3 > &box, const Matrix44 &m, Box< Vec3 > &result) { // // Transform a 3D box by a matrix, and compute a new box that // tightly encloses the transformed box. // // If m is an affine transform, then we use James Arvo's fast // method as described in "Graphics Gems", Academic Press, 1990, // pp. 548-550. // // // A transformed empty box is still empty, and a transformed infinite // box is still infinite // if (box.isEmpty() || box.isInfinite()) { return; } // // If the last column of m is (0 0 0 1) then m is an affine // transform, and we use the fast Graphics Gems trick. // if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) { for (int i = 0; i < 3; i++) { result.min[i] = result.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { result.min[i] += a; result.max[i] += b; } else { result.min[i] += b; result.max[i] += a; } } } return; } // // M is a projection matrix. Do things the naive way: // Transform the eight corners of the box, and find an // axis-parallel box that encloses the transformed corners. // Vec3 points[8]; points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; for (int i = 0; i < 8; i++) result.extendBy (points[i] * m); } template Box< Vec3 > affineTransform (const Box< Vec3 > &box, const Matrix44 &m) { // // Transform a 3D box by a matrix whose rightmost column // is (0 0 0 1), and compute a new box that tightly encloses // the transformed box. // // As in the transform() function, above, we use James Arvo's // fast method. // if (box.isEmpty() || box.isInfinite()) { // // A transformed empty or infinite box is still empty or infinite // return box; } Box< Vec3 > newBox; for (int i = 0; i < 3; i++) { newBox.min[i] = newBox.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { newBox.min[i] += a; newBox.max[i] += b; } else { newBox.min[i] += b; newBox.max[i] += a; } } } return newBox; } template void affineTransform (const Box< Vec3 > &box, const Matrix44 &m, Box > &result) { // // Transform a 3D box by a matrix whose rightmost column // is (0 0 0 1), and compute a new box that tightly encloses // the transformed box. // // As in the transform() function, above, we use James Arvo's // fast method. // if (box.isEmpty()) { // // A transformed empty box is still empty // result.makeEmpty(); return; } if (box.isInfinite()) { // // A transformed infinite box is still infinite // result.makeInfinite(); return; } for (int i = 0; i < 3; i++) { result.min[i] = result.max[i] = (S) m[3][i]; for (int j = 0; j < 3; j++) { S a, b; a = (S) m[j][i] * box.min[j]; b = (S) m[j][i] * box.max[j]; if (a < b) { result.min[i] += a; result.max[i] += b; } else { result.min[i] += b; result.max[i] += a; } } } } template bool findEntryAndExitPoints (const Line3 &r, const Box > &b, Vec3 &entry, Vec3 &exit) { // // Compute the points where a ray, r, enters and exits a box, b: // // findEntryAndExitPoints() returns // // - true if the ray starts inside the box or if the // ray starts outside and intersects the box // // - false otherwise (that is, if the ray does not // intersect the box) // // The entry and exit points are // // - points on two of the faces of the box when // findEntryAndExitPoints() returns true // (The entry end exit points may be on either // side of the ray's origin) // // - undefined when findEntryAndExitPoints() // returns false // if (b.isEmpty()) { // // No ray intersects an empty box // return false; } // // The following description assumes that the ray's origin is outside // the box, but the code below works even if the origin is inside the // box: // // Between one and three "frontfacing" sides of the box are oriented // towards the ray's origin, and between one and three "backfacing" // sides are oriented away from the ray's origin. // We intersect the ray with the planes that contain the sides of the // box, and compare the distances between the ray's origin and the // ray-plane intersections. The ray intersects the box if the most // distant frontfacing intersection is nearer than the nearest // backfacing intersection. If the ray does intersect the box, then // the most distant frontfacing ray-plane intersection is the entry // point and the nearest backfacing ray-plane intersection is the // exit point. // const T TMAX = limits::max(); T tFrontMax = -TMAX; T tBackMin = TMAX; // // Minimum and maximum X sides. // if (r.dir.x >= 0) { T d1 = b.max.x - r.pos.x; T d2 = b.min.x - r.pos.x; if (r.dir.x > 1 || (abs (d1) < TMAX * r.dir.x && abs (d2) < TMAX * r.dir.x)) { T t1 = d1 / r.dir.x; T t2 = d2 / r.dir.x; if (tBackMin > t1) { tBackMin = t1; exit.x = b.max.x; exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = b.min.x; entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.x < b.min.x || r.pos.x > b.max.x) { return false; } } else // r.dir.x < 0 { T d1 = b.min.x - r.pos.x; T d2 = b.max.x - r.pos.x; if (r.dir.x < -1 || (abs (d1) < -TMAX * r.dir.x && abs (d2) < -TMAX * r.dir.x)) { T t1 = d1 / r.dir.x; T t2 = d2 / r.dir.x; if (tBackMin > t1) { tBackMin = t1; exit.x = b.min.x; exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = b.max.x; entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.x < b.min.x || r.pos.x > b.max.x) { return false; } } // // Minimum and maximum Y sides. // if (r.dir.y >= 0) { T d1 = b.max.y - r.pos.y; T d2 = b.min.y - r.pos.y; if (r.dir.y > 1 || (abs (d1) < TMAX * r.dir.y && abs (d2) < TMAX * r.dir.y)) { T t1 = d1 / r.dir.y; T t2 = d2 / r.dir.y; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = b.max.y; exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = b.min.y; entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.y < b.min.y || r.pos.y > b.max.y) { return false; } } else // r.dir.y < 0 { T d1 = b.min.y - r.pos.y; T d2 = b.max.y - r.pos.y; if (r.dir.y < -1 || (abs (d1) < -TMAX * r.dir.y && abs (d2) < -TMAX * r.dir.y)) { T t1 = d1 / r.dir.y; T t2 = d2 / r.dir.y; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = b.min.y; exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = b.max.y; entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); } } else if (r.pos.y < b.min.y || r.pos.y > b.max.y) { return false; } } // // Minimum and maximum Z sides. // if (r.dir.z >= 0) { T d1 = b.max.z - r.pos.z; T d2 = b.min.z - r.pos.z; if (r.dir.z > 1 || (abs (d1) < TMAX * r.dir.z && abs (d2) < TMAX * r.dir.z)) { T t1 = d1 / r.dir.z; T t2 = d2 / r.dir.z; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = b.max.z; } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = b.min.z; } } else if (r.pos.z < b.min.z || r.pos.z > b.max.z) { return false; } } else // r.dir.z < 0 { T d1 = b.min.z - r.pos.z; T d2 = b.max.z - r.pos.z; if (r.dir.z < -1 || (abs (d1) < -TMAX * r.dir.z && abs (d2) < -TMAX * r.dir.z)) { T t1 = d1 / r.dir.z; T t2 = d2 / r.dir.z; if (tBackMin > t1) { tBackMin = t1; exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); exit.z = b.min.z; } if (tFrontMax < t2) { tFrontMax = t2; entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); entry.z = b.max.z; } } else if (r.pos.z < b.min.z || r.pos.z > b.max.z) { return false; } } return tFrontMax <= tBackMin; } template bool intersects (const Box< Vec3 > &b, const Line3 &r, Vec3 &ip) { // // Intersect a ray, r, with a box, b, and compute the intersection // point, ip: // // intersect() returns // // - true if the ray starts inside the box or if the // ray starts outside and intersects the box // // - false if the ray starts outside the box and intersects it, // but the intersection is behind the ray's origin. // // - false if the ray starts outside and does not intersect it // // The intersection point is // // - the ray's origin if the ray starts inside the box // // - a point on one of the faces of the box if the ray // starts outside the box // // - undefined when intersect() returns false // if (b.isEmpty()) { // // No ray intersects an empty box // return false; } if (b.intersects (r.pos)) { // // The ray starts inside the box // ip = r.pos; return true; } // // The ray starts outside the box. Between one and three "frontfacing" // sides of the box are oriented towards the ray, and between one and // three "backfacing" sides are oriented away from the ray. // We intersect the ray with the planes that contain the sides of the // box, and compare the distances between ray's origin and the ray-plane // intersections. // The ray intersects the box if the most distant frontfacing intersection // is nearer than the nearest backfacing intersection. If the ray does // intersect the box, then the most distant frontfacing ray-plane // intersection is the ray-box intersection. // const T TMAX = limits::max(); T tFrontMax = -1; T tBackMin = TMAX; // // Minimum and maximum X sides. // if (r.dir.x > 0) { if (r.pos.x > b.max.x) return false; T d = b.max.x - r.pos.x; if (r.dir.x > 1 || d < TMAX * r.dir.x) { T t = d / r.dir.x; if (tBackMin > t) tBackMin = t; } if (r.pos.x <= b.min.x) { T d = b.min.x - r.pos.x; T t = (r.dir.x > 1 || d < TMAX * r.dir.x)? d / r.dir.x: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = b.min.x; ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else if (r.dir.x < 0) { if (r.pos.x < b.min.x) return false; T d = b.min.x - r.pos.x; if (r.dir.x < -1 || d > TMAX * r.dir.x) { T t = d / r.dir.x; if (tBackMin > t) tBackMin = t; } if (r.pos.x >= b.max.x) { T d = b.max.x - r.pos.x; T t = (r.dir.x < -1 || d > TMAX * r.dir.x)? d / r.dir.x: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = b.max.x; ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else // r.dir.x == 0 { if (r.pos.x < b.min.x || r.pos.x > b.max.x) return false; } // // Minimum and maximum Y sides. // if (r.dir.y > 0) { if (r.pos.y > b.max.y) return false; T d = b.max.y - r.pos.y; if (r.dir.y > 1 || d < TMAX * r.dir.y) { T t = d / r.dir.y; if (tBackMin > t) tBackMin = t; } if (r.pos.y <= b.min.y) { T d = b.min.y - r.pos.y; T t = (r.dir.y > 1 || d < TMAX * r.dir.y)? d / r.dir.y: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = b.min.y; ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else if (r.dir.y < 0) { if (r.pos.y < b.min.y) return false; T d = b.min.y - r.pos.y; if (r.dir.y < -1 || d > TMAX * r.dir.y) { T t = d / r.dir.y; if (tBackMin > t) tBackMin = t; } if (r.pos.y >= b.max.y) { T d = b.max.y - r.pos.y; T t = (r.dir.y < -1 || d > TMAX * r.dir.y)? d / r.dir.y: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = b.max.y; ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); } } } else // r.dir.y == 0 { if (r.pos.y < b.min.y || r.pos.y > b.max.y) return false; } // // Minimum and maximum Z sides. // if (r.dir.z > 0) { if (r.pos.z > b.max.z) return false; T d = b.max.z - r.pos.z; if (r.dir.z > 1 || d < TMAX * r.dir.z) { T t = d / r.dir.z; if (tBackMin > t) tBackMin = t; } if (r.pos.z <= b.min.z) { T d = b.min.z - r.pos.z; T t = (r.dir.z > 1 || d < TMAX * r.dir.z)? d / r.dir.z: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = b.min.z; } } } else if (r.dir.z < 0) { if (r.pos.z < b.min.z) return false; T d = b.min.z - r.pos.z; if (r.dir.z < -1 || d > TMAX * r.dir.z) { T t = d / r.dir.z; if (tBackMin > t) tBackMin = t; } if (r.pos.z >= b.max.z) { T d = b.max.z - r.pos.z; T t = (r.dir.z < -1 || d > TMAX * r.dir.z)? d / r.dir.z: TMAX; if (tFrontMax < t) { tFrontMax = t; ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); ip.z = b.max.z; } } } else // r.dir.z == 0 { if (r.pos.z < b.min.z || r.pos.z > b.max.z) return false; } return tFrontMax <= tBackMin; } template bool intersects (const Box< Vec3 > &box, const Line3 &ray) { Vec3 ignored; return intersects (box, ray, ignored); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHBOXALGO_H openexr-2.5.7/IlmBase/Imath/ImathColor.h000066400000000000000000000356551406177042200200160ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHCOLOR_H #define INCLUDED_IMATHCOLOR_H //---------------------------------------------------- // // A three and four component color class template. // //---------------------------------------------------- #include "ImathVec.h" #include "ImathNamespace.h" #include "half.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Color3: public Vec3 { public: //------------- // Constructors //------------- Color3 (); // no initialization explicit Color3 (T a); // (a a a) Color3 (T a, T b, T c); // (a b c) ~Color3 () = default; //--------------------------------- // Copy constructors and assignment //--------------------------------- Color3 (const Color3 &c); template Color3 (const Vec3 &v); const Color3 & operator = (const Color3 &c); //------------------------ // Component-wise addition //------------------------ const Color3 & operator += (const Color3 &c); Color3 operator + (const Color3 &c) const; //--------------------------- // Component-wise subtraction //--------------------------- const Color3 & operator -= (const Color3 &c); Color3 operator - (const Color3 &c) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Color3 operator - () const; const Color3 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Color3 & operator *= (const Color3 &c); const Color3 & operator *= (T a); Color3 operator * (const Color3 &c) const; Color3 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Color3 & operator /= (const Color3 &c); const Color3 & operator /= (T a); Color3 operator / (const Color3 &c) const; Color3 operator / (T a) const; }; template class Color4 { public: //------------------- // Access to elements //------------------- T r, g, b, a; T & operator [] (int i); const T & operator [] (int i) const; //------------- // Constructors //------------- Color4 (); // no initialization explicit Color4 (T a); // (a a a a) Color4 (T a, T b, T c, T d); // (a b c d) ~Color4 () = default; //--------------------------------- // Copy constructors and assignment //--------------------------------- Color4 (const Color4 &v); template Color4 (const Color4 &v); const Color4 & operator = (const Color4 &v); //---------------------- // Compatibility with Sb //---------------------- template void setValue (S a, S b, S c, S d); template void setValue (const Color4 &v); template void getValue (S &a, S &b, S &c, S &d) const; template void getValue (Color4 &v) const; T * getValue(); const T * getValue() const; //--------- // Equality //--------- template bool operator == (const Color4 &v) const; template bool operator != (const Color4 &v) const; //------------------------ // Component-wise addition //------------------------ const Color4 & operator += (const Color4 &v); Color4 operator + (const Color4 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Color4 & operator -= (const Color4 &v); Color4 operator - (const Color4 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Color4 operator - () const; const Color4 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Color4 & operator *= (const Color4 &v); const Color4 & operator *= (T a); Color4 operator * (const Color4 &v) const; Color4 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Color4 & operator /= (const Color4 &v); const Color4 & operator /= (T a); Color4 operator / (const Color4 &v) const; Color4 operator / (T a) const; //---------------------------------------------------------- // Number of dimensions, i.e. number of elements in a Color4 //---------------------------------------------------------- static unsigned int dimensions() {return 4;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} //-------------------------------------------------------------- // Base type -- in templates, which accept a parameter, V, which // could be a Color4, you can refer to T as // V::BaseType //-------------------------------------------------------------- typedef T BaseType; }; //-------------- // Stream output //-------------- template std::ostream & operator << (std::ostream &s, const Color4 &v); //---------------------------------------------------- // Reverse multiplication: S * Color4 //---------------------------------------------------- template Color4 operator * (S a, const Color4 &v); //------------------------- // Typedefs for convenience //------------------------- typedef Color3 Color3f; typedef Color3 Color3h; typedef Color3 Color3c; typedef Color3 C3h; typedef Color3 C3f; typedef Color3 C3c; typedef Color4 Color4f; typedef Color4 Color4h; typedef Color4 Color4c; typedef Color4 C4f; typedef Color4 C4h; typedef Color4 C4c; typedef unsigned int PackedColor; //------------------------- // Implementation of Color3 //------------------------- template inline Color3::Color3 (): Vec3 () { // empty } template inline Color3::Color3 (T a): Vec3 (a) { // empty } template inline Color3::Color3 (T a, T b, T c): Vec3 (a, b, c) { // empty } template inline Color3::Color3 (const Color3 &c): Vec3 (c) { // empty } template template inline Color3::Color3 (const Vec3 &v): Vec3 (v) { //empty } template inline const Color3 & Color3::operator = (const Color3 &c) { *((Vec3 *) this) = c; return *this; } template inline const Color3 & Color3::operator += (const Color3 &c) { *((Vec3 *) this) += c; return *this; } template inline Color3 Color3::operator + (const Color3 &c) const { return Color3 (*(Vec3 *)this + (const Vec3 &)c); } template inline const Color3 & Color3::operator -= (const Color3 &c) { *((Vec3 *) this) -= c; return *this; } template inline Color3 Color3::operator - (const Color3 &c) const { return Color3 (*(Vec3 *)this - (const Vec3 &)c); } template inline Color3 Color3::operator - () const { return Color3 (-(*(Vec3 *)this)); } template inline const Color3 & Color3::negate () { ((Vec3 *) this)->negate(); return *this; } template inline const Color3 & Color3::operator *= (const Color3 &c) { *((Vec3 *) this) *= c; return *this; } template inline const Color3 & Color3::operator *= (T a) { *((Vec3 *) this) *= a; return *this; } template inline Color3 Color3::operator * (const Color3 &c) const { return Color3 (*(Vec3 *)this * (const Vec3 &)c); } template inline Color3 Color3::operator * (T a) const { return Color3 (*(Vec3 *)this * a); } template inline const Color3 & Color3::operator /= (const Color3 &c) { *((Vec3 *) this) /= c; return *this; } template inline const Color3 & Color3::operator /= (T a) { *((Vec3 *) this) /= a; return *this; } template inline Color3 Color3::operator / (const Color3 &c) const { return Color3 (*(Vec3 *)this / (const Vec3 &)c); } template inline Color3 Color3::operator / (T a) const { return Color3 (*(Vec3 *)this / a); } //----------------------- // Implementation of Color4 //----------------------- template inline T & Color4::operator [] (int i) { return (&r)[i]; } template inline const T & Color4::operator [] (int i) const { return (&r)[i]; } template inline Color4::Color4 () { // empty } template inline Color4::Color4 (T x) { r = g = b = a = x; } template inline Color4::Color4 (T x, T y, T z, T w) { r = x; g = y; b = z; a = w; } template inline Color4::Color4 (const Color4 &v) { r = v.r; g = v.g; b = v.b; a = v.a; } template template inline Color4::Color4 (const Color4 &v) { r = T (v.r); g = T (v.g); b = T (v.b); a = T (v.a); } template inline const Color4 & Color4::operator = (const Color4 &v) { r = v.r; g = v.g; b = v.b; a = v.a; return *this; } template template inline void Color4::setValue (S x, S y, S z, S w) { r = T (x); g = T (y); b = T (z); a = T (w); } template template inline void Color4::setValue (const Color4 &v) { r = T (v.r); g = T (v.g); b = T (v.b); a = T (v.a); } template template inline void Color4::getValue (S &x, S &y, S &z, S &w) const { x = S (r); y = S (g); z = S (b); w = S (a); } template template inline void Color4::getValue (Color4 &v) const { v.r = S (r); v.g = S (g); v.b = S (b); v.a = S (a); } template inline T * Color4::getValue() { return (T *) &r; } template inline const T * Color4::getValue() const { return (const T *) &r; } template template inline bool Color4::operator == (const Color4 &v) const { return r == v.r && g == v.g && b == v.b && a == v.a; } template template inline bool Color4::operator != (const Color4 &v) const { return r != v.r || g != v.g || b != v.b || a != v.a; } template inline const Color4 & Color4::operator += (const Color4 &v) { r += v.r; g += v.g; b += v.b; a += v.a; return *this; } template inline Color4 Color4::operator + (const Color4 &v) const { return Color4 (r + v.r, g + v.g, b + v.b, a + v.a); } template inline const Color4 & Color4::operator -= (const Color4 &v) { r -= v.r; g -= v.g; b -= v.b; a -= v.a; return *this; } template inline Color4 Color4::operator - (const Color4 &v) const { return Color4 (r - v.r, g - v.g, b - v.b, a - v.a); } template inline Color4 Color4::operator - () const { return Color4 (-r, -g, -b, -a); } template inline const Color4 & Color4::negate () { r = -r; g = -g; b = -b; a = -a; return *this; } template inline const Color4 & Color4::operator *= (const Color4 &v) { r *= v.r; g *= v.g; b *= v.b; a *= v.a; return *this; } template inline const Color4 & Color4::operator *= (T x) { r *= x; g *= x; b *= x; a *= x; return *this; } template inline Color4 Color4::operator * (const Color4 &v) const { return Color4 (r * v.r, g * v.g, b * v.b, a * v.a); } template inline Color4 Color4::operator * (T x) const { return Color4 (r * x, g * x, b * x, a * x); } template inline const Color4 & Color4::operator /= (const Color4 &v) { r /= v.r; g /= v.g; b /= v.b; a /= v.a; return *this; } template inline const Color4 & Color4::operator /= (T x) { r /= x; g /= x; b /= x; a /= x; return *this; } template inline Color4 Color4::operator / (const Color4 &v) const { return Color4 (r / v.r, g / v.g, b / v.b, a / v.a); } template inline Color4 Color4::operator / (T x) const { return Color4 (r / x, g / x, b / x, a / x); } template std::ostream & operator << (std::ostream &s, const Color4 &v) { return s << '(' << v.r << ' ' << v.g << ' ' << v.b << ' ' << v.a << ')'; } //----------------------------------------- // Implementation of reverse multiplication //----------------------------------------- template inline Color4 operator * (S x, const Color4 &v) { return Color4 (x * v.r, x * v.g, x * v.b, x * v.a); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHCOLOR_H openexr-2.5.7/IlmBase/Imath/ImathColorAlgo.cpp000066400000000000000000000114601406177042200211400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------- // // Implementation of non-template items declared in ImathColorAlgo.h // //---------------------------------------------------------------------------- #include "ImathColorAlgo.h" IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER Vec3 hsv2rgb_d(const Vec3 &hsv) { double hue = hsv.x; double sat = hsv.y; double val = hsv.z; double x = 0.0, y = 0.0, z = 0.0; if (hue == 1) hue = 0; else hue *= 6; int i = int(Math::floor(hue)); double f = hue-i; double p = val*(1-sat); double q = val*(1-(sat*f)); double t = val*(1-(sat*(1-f))); switch (i) { case 0: x = val; y = t; z = p; break; case 1: x = q; y = val; z = p; break; case 2: x = p; y = val; z = t; break; case 3: x = p; y = q; z = val; break; case 4: x = t; y = p; z = val; break; case 5: x = val; y = p; z = q; break; } return Vec3(x,y,z); } Color4 hsv2rgb_d(const Color4 &hsv) { double hue = hsv.r; double sat = hsv.g; double val = hsv.b; double r = 0.0, g = 0.0, b = 0.0; if (hue == 1) hue = 0; else hue *= 6; int i = int(Math::floor(hue)); double f = hue-i; double p = val*(1-sat); double q = val*(1-(sat*f)); double t = val*(1-(sat*(1-f))); switch (i) { case 0: r = val; g = t; b = p; break; case 1: r = q; g = val; b = p; break; case 2: r = p; g = val; b = t; break; case 3: r = p; g = q; b = val; break; case 4: r = t; g = p; b = val; break; case 5: r = val; g = p; b = q; break; } return Color4(r,g,b,hsv.a); } Vec3 rgb2hsv_d(const Vec3 &c) { const double &x = c.x; const double &y = c.y; const double &z = c.z; double max = (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z); double min = (x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z); double range = max - min; double val = max; double sat = 0; double hue = 0; if (max != 0) sat = range/max; if (sat != 0) { double h; if (x == max) h = (y - z) / range; else if (y == max) h = 2 + (z - x) / range; else h = 4 + (x - y) / range; hue = h/6.; if (hue < 0.) hue += 1.0; } return Vec3(hue,sat,val); } Color4 rgb2hsv_d(const Color4 &c) { const double &r = c.r; const double &g = c.g; const double &b = c.b; double max = (r > g) ? ((r > b) ? r : b) : ((g > b) ? g : b); double min = (r < g) ? ((r < b) ? r : b) : ((g < b) ? g : b); double range = max - min; double val = max; double sat = 0; double hue = 0; if (max != 0) sat = range/max; if (sat != 0) { double h; if (r == max) h = (g - b) / range; else if (g == max) h = 2 + (b - r) / range; else h = 4 + (r - g) / range; hue = h/6.; if (hue < 0.) hue += 1.0; } return Color4(hue,sat,val,c.a); } IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathColorAlgo.h000066400000000000000000000161261406177042200206110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHCOLORALGO_H #define INCLUDED_IMATHCOLORALGO_H #include "ImathColor.h" #include "ImathExport.h" #include "ImathMath.h" #include "ImathLimits.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER // // Non-templated helper routines for color conversion. // These routines eliminate type warnings under g++. // IMATH_EXPORT Vec3 hsv2rgb_d(const Vec3 &hsv); IMATH_EXPORT Color4 hsv2rgb_d(const Color4 &hsv); IMATH_EXPORT Vec3 rgb2hsv_d(const Vec3 &rgb); IMATH_EXPORT Color4 rgb2hsv_d(const Color4 &rgb); // // Color conversion functions and general color algorithms // // hsv2rgb(), rgb2hsv(), rgb2packed(), packed2rgb() // see each funtion definition for details. // template Vec3 hsv2rgb(const Vec3 &hsv) { if ( limits::isIntegral() ) { Vec3 v = Vec3(hsv.x / double(limits::max()), hsv.y / double(limits::max()), hsv.z / double(limits::max())); Vec3 c = hsv2rgb_d(v); return Vec3((T) (c.x * limits::max()), (T) (c.y * limits::max()), (T) (c.z * limits::max())); } else { Vec3 v = Vec3(hsv.x, hsv.y, hsv.z); Vec3 c = hsv2rgb_d(v); return Vec3((T) c.x, (T) c.y, (T) c.z); } } template Color4 hsv2rgb(const Color4 &hsv) { if ( limits::isIntegral() ) { Color4 v = Color4(hsv.r / float(limits::max()), hsv.g / float(limits::max()), hsv.b / float(limits::max()), hsv.a / float(limits::max())); Color4 c = hsv2rgb_d(v); return Color4((T) (c.r * limits::max()), (T) (c.g * limits::max()), (T) (c.b * limits::max()), (T) (c.a * limits::max())); } else { Color4 v = Color4(hsv.r, hsv.g, hsv.b, hsv.a); Color4 c = hsv2rgb_d(v); return Color4((T) c.r, (T) c.g, (T) c.b, (T) c.a); } } template Vec3 rgb2hsv(const Vec3 &rgb) { if ( limits::isIntegral() ) { Vec3 v = Vec3(rgb.x / double(limits::max()), rgb.y / double(limits::max()), rgb.z / double(limits::max())); Vec3 c = rgb2hsv_d(v); return Vec3((T) (c.x * limits::max()), (T) (c.y * limits::max()), (T) (c.z * limits::max())); } else { Vec3 v = Vec3(rgb.x, rgb.y, rgb.z); Vec3 c = rgb2hsv_d(v); return Vec3((T) c.x, (T) c.y, (T) c.z); } } template Color4 rgb2hsv(const Color4 &rgb) { if ( limits::isIntegral() ) { Color4 v = Color4(rgb.r / float(limits::max()), rgb.g / float(limits::max()), rgb.b / float(limits::max()), rgb.a / float(limits::max())); Color4 c = rgb2hsv_d(v); return Color4((T) (c.r * limits::max()), (T) (c.g * limits::max()), (T) (c.b * limits::max()), (T) (c.a * limits::max())); } else { Color4 v = Color4(rgb.r, rgb.g, rgb.b, rgb.a); Color4 c = rgb2hsv_d(v); return Color4((T) c.r, (T) c.g, (T) c.b, (T) c.a); } } template PackedColor rgb2packed(const Vec3 &c) { if ( limits::isIntegral() ) { float x = c.x / float(limits::max()); float y = c.y / float(limits::max()); float z = c.z / float(limits::max()); return rgb2packed( V3f(x,y,z) ); } else { return ( (PackedColor) (c.x * 255) | (((PackedColor) (c.y * 255)) << 8) | (((PackedColor) (c.z * 255)) << 16) | 0xFF000000 ); } } template PackedColor rgb2packed(const Color4 &c) { if ( limits::isIntegral() ) { float r = c.r / float(limits::max()); float g = c.g / float(limits::max()); float b = c.b / float(limits::max()); float a = c.a / float(limits::max()); return rgb2packed( C4f(r,g,b,a) ); } else { return ( (PackedColor) (c.r * 255) | (((PackedColor) (c.g * 255)) << 8) | (((PackedColor) (c.b * 255)) << 16) | (((PackedColor) (c.a * 255)) << 24)); } } // // This guy can't return the result because the template // parameter would not be in the function signiture. So instead, // its passed in as an argument. // template void packed2rgb(PackedColor packed, Vec3 &out) { if ( limits::isIntegral() ) { T f = limits::max() / ((PackedColor)0xFF); out.x = (packed & 0xFF) * f; out.y = ((packed & 0xFF00) >> 8) * f; out.z = ((packed & 0xFF0000) >> 16) * f; } else { T f = T(1) / T(255); out.x = (packed & 0xFF) * f; out.y = ((packed & 0xFF00) >> 8) * f; out.z = ((packed & 0xFF0000) >> 16) * f; } } template void packed2rgb(PackedColor packed, Color4 &out) { if ( limits::isIntegral() ) { T f = limits::max() / ((PackedColor)0xFF); out.r = (packed & 0xFF) * f; out.g = ((packed & 0xFF00) >> 8) * f; out.b = ((packed & 0xFF0000) >> 16) * f; out.a = ((packed & 0xFF000000) >> 24) * f; } else { T f = T(1) / T(255); out.r = (packed & 0xFF) * f; out.g = ((packed & 0xFF00) >> 8) * f; out.b = ((packed & 0xFF0000) >> 16) * f; out.a = ((packed & 0xFF000000) >> 24) * f; } } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHCOLORALGO_H openexr-2.5.7/IlmBase/Imath/ImathEuler.h000066400000000000000000000561161406177042200200070ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHEULER_H #define INCLUDED_IMATHEULER_H //---------------------------------------------------------------------- // // template class Euler // // This class represents euler angle orientations. The class // inherits from Vec3 to it can be freely cast. The additional // information is the euler priorities rep. This class is // essentially a rip off of Ken Shoemake's GemsIV code. It has // been modified minimally to make it more understandable, but // hardly enough to make it easy to grok completely. // // There are 24 possible combonations of Euler angle // representations of which 12 are common in CG and you will // probably only use 6 of these which in this scheme are the // non-relative-non-repeating types. // // The representations can be partitioned according to two // criteria: // // 1) Are the angles measured relative to a set of fixed axis // or relative to each other (the latter being what happens // when rotation matrices are multiplied together and is // almost ubiquitous in the cg community) // // 2) Is one of the rotations repeated (ala XYX rotation) // // When you construct a given representation from scratch you // must order the angles according to their priorities. So, the // easiest is a softimage or aerospace (yaw/pitch/roll) ordering // of ZYX. // // float x_rot = 1; // float y_rot = 2; // float z_rot = 3; // // Eulerf angles(z_rot, y_rot, x_rot, Eulerf::ZYX); // -or- // Eulerf angles( V3f(z_rot,y_rot,z_rot), Eulerf::ZYX ); // // If instead, the order was YXZ for instance you would have to // do this: // // float x_rot = 1; // float y_rot = 2; // float z_rot = 3; // // Eulerf angles(y_rot, x_rot, z_rot, Eulerf::YXZ); // -or- // Eulerf angles( V3f(y_rot,x_rot,z_rot), Eulerf::YXZ ); // // Notice how the order you put the angles into the three slots // should correspond to the enum (YXZ) ordering. The input angle // vector is called the "ijk" vector -- not an "xyz" vector. The // ijk vector order is the same as the enum. If you treat the // Euler<> as a Vec<> (which it inherts from) you will find the // angles are ordered in the same way, i.e.: // // V3f v = angles; // // v.x == y_rot, v.y == x_rot, v.z == z_rot // // If you just want the x, y, and z angles stored in a vector in // that order, you can do this: // // V3f v = angles.toXYZVector() // // v.x == x_rot, v.y == y_rot, v.z == z_rot // // If you want to set the Euler with an XYZVector use the // optional layout argument: // // Eulerf angles(x_rot, y_rot, z_rot, // Eulerf::YXZ, // Eulerf::XYZLayout); // // This is the same as: // // Eulerf angles(y_rot, x_rot, z_rot, Eulerf::YXZ); // // Note that this won't do anything intelligent if you have a // repeated axis in the euler angles (e.g. XYX) // // If you need to use the "relative" versions of these, you will // need to use the "r" enums. // // The units of the rotation angles are assumed to be radians. // //---------------------------------------------------------------------- #include "ImathMath.h" #include "ImathVec.h" #include "ImathQuat.h" #include "ImathMatrix.h" #include "ImathLimits.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER // Disable MS VC++ warnings about conversion from double to float #pragma warning(disable:4244) #endif template class Euler : public Vec3 { public: using Vec3::x; using Vec3::y; using Vec3::z; enum Order { // // All 24 possible orderings // XYZ = 0x0101, // "usual" orderings XZY = 0x0001, YZX = 0x1101, YXZ = 0x1001, ZXY = 0x2101, ZYX = 0x2001, XZX = 0x0011, // first axis repeated XYX = 0x0111, YXY = 0x1011, YZY = 0x1111, ZYZ = 0x2011, ZXZ = 0x2111, XYZr = 0x2000, // relative orderings -- not common XZYr = 0x2100, YZXr = 0x1000, YXZr = 0x1100, ZXYr = 0x0000, ZYXr = 0x0100, XZXr = 0x2110, // relative first axis repeated XYXr = 0x2010, YXYr = 0x1110, YZYr = 0x1010, ZYZr = 0x0110, ZXZr = 0x0010, // |||| // VVVV // Legend: ABCD // A -> Initial Axis (0==x, 1==y, 2==z) // B -> Parity Even (1==true) // C -> Initial Repeated (1==true) // D -> Frame Static (1==true) // Legal = XYZ | XZY | YZX | YXZ | ZXY | ZYX | XZX | XYX | YXY | YZY | ZYZ | ZXZ | XYZr| XZYr| YZXr| YXZr| ZXYr| ZYXr| XZXr| XYXr| YXYr| YZYr| ZYZr| ZXZr, Min = 0x0000, Max = 0x2111, Default = XYZ }; enum Axis { X = 0, Y = 1, Z = 2 }; enum InputLayout { XYZLayout, IJKLayout }; //-------------------------------------------------------------------- // Constructors -- all default to ZYX non-relative ala softimage // (where there is no argument to specify it) // // The Euler-from-matrix constructors assume that the matrix does // not include shear or non-uniform scaling, but the constructors // do not examine the matrix to verify this assumption. If necessary, // you can adjust the matrix by calling the removeScalingAndShear() // function, defined in ImathMatrixAlgo.h. //-------------------------------------------------------------------- Euler(); Euler(const Euler&); Euler(Order p); Euler(const Vec3 &v, Order o = Default, InputLayout l = IJKLayout); Euler(T i, T j, T k, Order o = Default, InputLayout l = IJKLayout); Euler(const Euler &euler, Order newp); Euler(const Matrix33 &, Order o = Default); Euler(const Matrix44 &, Order o = Default); //------------- // Destructor //------------- ~Euler() = default; //--------------------------------- // Algebraic functions/ Operators //--------------------------------- const Euler& operator= (const Euler&); const Euler& operator= (const Vec3&); //-------------------------------------------------------- // Set the euler value // This does NOT convert the angles, but setXYZVector() // does reorder the input vector. //-------------------------------------------------------- static bool legal(Order); void setXYZVector(const Vec3 &); Order order() const; void setOrder(Order); void set(Axis initial, bool relative, bool parityEven, bool firstRepeats); //------------------------------------------------------------ // Conversions, toXYZVector() reorders the angles so that // the X rotation comes first, followed by the Y and Z // in cases like XYX ordering, the repeated angle will be // in the "z" component // // The Euler-from-matrix extract() functions assume that the // matrix does not include shear or non-uniform scaling, but // the extract() functions do not examine the matrix to verify // this assumption. If necessary, you can adjust the matrix // by calling the removeScalingAndShear() function, defined // in ImathMatrixAlgo.h. //------------------------------------------------------------ void extract(const Matrix33&); void extract(const Matrix44&); void extract(const Quat&); Matrix33 toMatrix33() const; Matrix44 toMatrix44() const; Quat toQuat() const; Vec3 toXYZVector() const; //--------------------------------------------------- // Use this function to unpack angles from ijk form //--------------------------------------------------- void angleOrder(int &i, int &j, int &k) const; //--------------------------------------------------- // Use this function to determine mapping from xyz to ijk // - reshuffles the xyz to match the order //--------------------------------------------------- void angleMapping(int &i, int &j, int &k) const; //---------------------------------------------------------------------- // // Utility methods for getting continuous rotations. None of these // methods change the orientation given by its inputs (or at least // that is the intent). // // angleMod() converts an angle to its equivalent in [-PI, PI] // // simpleXYZRotation() adjusts xyzRot so that its components differ // from targetXyzRot by no more than +-PI // // nearestRotation() adjusts xyzRot so that its components differ // from targetXyzRot by as little as possible. // Note that xyz here really means ijk, because // the order must be provided. // // makeNear() adjusts "this" Euler so that its components differ // from target by as little as possible. This method // might not make sense for Eulers with different order // and it probably doesn't work for repeated axis and // relative orderings (TODO). // //----------------------------------------------------------------------- static float angleMod (T angle); static void simpleXYZRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot); static void nearestRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot, Order order = XYZ); void makeNear (const Euler &target); bool frameStatic() const { return _frameStatic; } bool initialRepeated() const { return _initialRepeated; } bool parityEven() const { return _parityEven; } Axis initialAxis() const { return _initialAxis; } protected: bool _frameStatic : 1; // relative or static rotations bool _initialRepeated : 1; // init axis repeated as last bool _parityEven : 1; // "parity of axis permutation" #if defined _WIN32 || defined _WIN64 Axis _initialAxis ; // First axis of rotation #else Axis _initialAxis : 2; // First axis of rotation #endif }; //-------------------- // Convenient typedefs //-------------------- typedef Euler Eulerf; typedef Euler Eulerd; //--------------- // Implementation //--------------- template inline void Euler::angleOrder(int &i, int &j, int &k) const { i = _initialAxis; j = _parityEven ? (i+1)%3 : (i > 0 ? i-1 : 2); k = _parityEven ? (i > 0 ? i-1 : 2) : (i+1)%3; } template inline void Euler::angleMapping(int &i, int &j, int &k) const { int m[3]; m[_initialAxis] = 0; m[(_initialAxis+1) % 3] = _parityEven ? 1 : 2; m[(_initialAxis+2) % 3] = _parityEven ? 2 : 1; i = m[0]; j = m[1]; k = m[2]; } template inline void Euler::setXYZVector(const Vec3 &v) { int i,j,k; angleMapping(i,j,k); (*this)[i] = v.x; (*this)[j] = v.y; (*this)[k] = v.z; } template inline Vec3 Euler::toXYZVector() const { int i,j,k; angleMapping(i,j,k); return Vec3((*this)[i],(*this)[j],(*this)[k]); } template Euler::Euler() : Vec3(0,0,0), _frameStatic(true), _initialRepeated(false), _parityEven(true), _initialAxis(X) {} template Euler::Euler(typename Euler::Order p) : Vec3(0,0,0), _frameStatic(true), _initialRepeated(false), _parityEven(true), _initialAxis(X) { setOrder(p); } template inline Euler::Euler( const Vec3 &v, typename Euler::Order p, typename Euler::InputLayout l ) { setOrder(p); if ( l == XYZLayout ) setXYZVector(v); else { x = v.x; y = v.y; z = v.z; } } template inline Euler::Euler(const Euler &euler) { operator=(euler); } template inline Euler::Euler(const Euler &euler,Order p) { setOrder(p); Matrix33 M = euler.toMatrix33(); extract(M); } template inline Euler::Euler( T xi, T yi, T zi, typename Euler::Order p, typename Euler::InputLayout l) { setOrder(p); if ( l == XYZLayout ) setXYZVector(Vec3(xi,yi,zi)); else { x = xi; y = yi; z = zi; } } template inline Euler::Euler( const Matrix33 &M, typename Euler::Order p ) { setOrder(p); extract(M); } template inline Euler::Euler( const Matrix44 &M, typename Euler::Order p ) { setOrder(p); extract(M); } template inline void Euler::extract(const Quat &q) { extract(q.toMatrix33()); } template void Euler::extract(const Matrix33 &M) { int i,j,k; angleOrder(i,j,k); if (_initialRepeated) { // // Extract the first angle, x. // x = Math::atan2 (M[j][i], M[k][i]); // // Remove the x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Vec3 r (0, 0, 0); r[i] = (_parityEven? -x: x); Matrix44 N; N.rotate (r); N = N * Matrix44 (M[0][0], M[0][1], M[0][2], 0, M[1][0], M[1][1], M[1][2], 0, M[2][0], M[2][1], M[2][2], 0, 0, 0, 0, 1); // // Extract the other two angles, y and z, from N. // T sy = Math::sqrt (N[j][i]*N[j][i] + N[k][i]*N[k][i]); y = Math::atan2 (sy, N[i][i]); z = Math::atan2 (N[j][k], N[j][j]); } else { // // Extract the first angle, x. // x = Math::atan2 (M[j][k], M[k][k]); // // Remove the x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Vec3 r (0, 0, 0); r[i] = (_parityEven? -x: x); Matrix44 N; N.rotate (r); N = N * Matrix44 (M[0][0], M[0][1], M[0][2], 0, M[1][0], M[1][1], M[1][2], 0, M[2][0], M[2][1], M[2][2], 0, 0, 0, 0, 1); // // Extract the other two angles, y and z, from N. // T cy = Math::sqrt (N[i][i]*N[i][i] + N[i][j]*N[i][j]); y = Math::atan2 (-N[i][k], cy); z = Math::atan2 (-N[j][i], N[j][j]); } if (!_parityEven) *this *= -1; if (!_frameStatic) { T t = x; x = z; z = t; } } template void Euler::extract(const Matrix44 &M) { int i,j,k; angleOrder(i,j,k); if (_initialRepeated) { // // Extract the first angle, x. // x = Math::atan2 (M[j][i], M[k][i]); // // Remove the x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Vec3 r (0, 0, 0); r[i] = (_parityEven? -x: x); Matrix44 N; N.rotate (r); N = N * M; // // Extract the other two angles, y and z, from N. // T sy = Math::sqrt (N[j][i]*N[j][i] + N[k][i]*N[k][i]); y = Math::atan2 (sy, N[i][i]); z = Math::atan2 (N[j][k], N[j][j]); } else { // // Extract the first angle, x. // x = Math::atan2 (M[j][k], M[k][k]); // // Remove the x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Vec3 r (0, 0, 0); r[i] = (_parityEven? -x: x); Matrix44 N; N.rotate (r); N = N * M; // // Extract the other two angles, y and z, from N. // T cy = Math::sqrt (N[i][i]*N[i][i] + N[i][j]*N[i][j]); y = Math::atan2 (-N[i][k], cy); z = Math::atan2 (-N[j][i], N[j][j]); } if (!_parityEven) *this *= -1; if (!_frameStatic) { T t = x; x = z; z = t; } } template Matrix33 Euler::toMatrix33() const { int i,j,k; angleOrder(i,j,k); Vec3 angles; if ( _frameStatic ) angles = (*this); else angles = Vec3(z,y,x); if ( !_parityEven ) angles *= -1.0; T ci = Math::cos(angles.x); T cj = Math::cos(angles.y); T ch = Math::cos(angles.z); T si = Math::sin(angles.x); T sj = Math::sin(angles.y); T sh = Math::sin(angles.z); T cc = ci*ch; T cs = ci*sh; T sc = si*ch; T ss = si*sh; Matrix33 M; if ( _initialRepeated ) { M[i][i] = cj; M[j][i] = sj*si; M[k][i] = sj*ci; M[i][j] = sj*sh; M[j][j] = -cj*ss+cc; M[k][j] = -cj*cs-sc; M[i][k] = -sj*ch; M[j][k] = cj*sc+cs; M[k][k] = cj*cc-ss; } else { M[i][i] = cj*ch; M[j][i] = sj*sc-cs; M[k][i] = sj*cc+ss; M[i][j] = cj*sh; M[j][j] = sj*ss+cc; M[k][j] = sj*cs-sc; M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci; } return M; } template Matrix44 Euler::toMatrix44() const { int i,j,k; angleOrder(i,j,k); Vec3 angles; if ( _frameStatic ) angles = (*this); else angles = Vec3(z,y,x); if ( !_parityEven ) angles *= -1.0; T ci = Math::cos(angles.x); T cj = Math::cos(angles.y); T ch = Math::cos(angles.z); T si = Math::sin(angles.x); T sj = Math::sin(angles.y); T sh = Math::sin(angles.z); T cc = ci*ch; T cs = ci*sh; T sc = si*ch; T ss = si*sh; Matrix44 M; if ( _initialRepeated ) { M[i][i] = cj; M[j][i] = sj*si; M[k][i] = sj*ci; M[i][j] = sj*sh; M[j][j] = -cj*ss+cc; M[k][j] = -cj*cs-sc; M[i][k] = -sj*ch; M[j][k] = cj*sc+cs; M[k][k] = cj*cc-ss; } else { M[i][i] = cj*ch; M[j][i] = sj*sc-cs; M[k][i] = sj*cc+ss; M[i][j] = cj*sh; M[j][j] = sj*ss+cc; M[k][j] = sj*cs-sc; M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci; } return M; } template Quat Euler::toQuat() const { Vec3 angles; int i,j,k; angleOrder(i,j,k); if ( _frameStatic ) angles = (*this); else angles = Vec3(z,y,x); if ( !_parityEven ) angles.y = -angles.y; T ti = angles.x*0.5; T tj = angles.y*0.5; T th = angles.z*0.5; T ci = Math::cos(ti); T cj = Math::cos(tj); T ch = Math::cos(th); T si = Math::sin(ti); T sj = Math::sin(tj); T sh = Math::sin(th); T cc = ci*ch; T cs = ci*sh; T sc = si*ch; T ss = si*sh; T parity = _parityEven ? 1.0 : -1.0; Quat q; Vec3 a; if ( _initialRepeated ) { a[i] = cj*(cs + sc); a[j] = sj*(cc + ss) * parity, // NOSONAR - suppress SonarCloud bug report. a[k] = sj*(cs - sc); q.r = cj*(cc - ss); } else { a[i] = cj*sc - sj*cs, a[j] = (cj*ss + sj*cc) * parity, // NOSONAR - suppress SonarCloud bug report. a[k] = cj*cs - sj*sc; q.r = cj*cc + sj*ss; } q.v = a; return q; } template inline bool Euler::legal(typename Euler::Order order) { return (order & ~Legal) ? false : true; } template typename Euler::Order Euler::order() const { int foo = (_initialAxis == Z ? 0x2000 : (_initialAxis == Y ? 0x1000 : 0)); if (_parityEven) foo |= 0x0100; if (_initialRepeated) foo |= 0x0010; if (_frameStatic) foo++; return (Order)foo; } template inline void Euler::setOrder(typename Euler::Order p) { set( p & 0x2000 ? Z : (p & 0x1000 ? Y : X), // initial axis !(p & 0x1), // static? !!(p & 0x100), // permutation even? !!(p & 0x10)); // initial repeats? } template void Euler::set(typename Euler::Axis axis, bool relative, bool parityEven, bool firstRepeats) { _initialAxis = axis; _frameStatic = !relative; _parityEven = parityEven; _initialRepeated = firstRepeats; } template const Euler& Euler::operator= (const Euler &euler) { x = euler.x; y = euler.y; z = euler.z; _initialAxis = euler._initialAxis; _frameStatic = euler._frameStatic; _parityEven = euler._parityEven; _initialRepeated = euler._initialRepeated; return *this; } template const Euler& Euler::operator= (const Vec3 &v) { x = v.x; y = v.y; z = v.z; return *this; } template std::ostream& operator << (std::ostream &o, const Euler &euler) { char a[3] = { 'X', 'Y', 'Z' }; const char* r = euler.frameStatic() ? "" : "r"; int i,j,k; euler.angleOrder(i,j,k); if ( euler.initialRepeated() ) k = i; return o << "(" << euler.x << " " << euler.y << " " << euler.z << " " << a[i] << a[j] << a[k] << r << ")"; } template float Euler::angleMod (T angle) { const T pi = static_cast(M_PI); angle = fmod(T (angle), T (2 * pi)); if (angle < -pi) angle += 2 * pi; if (angle > +pi) angle -= 2 * pi; return angle; } template void Euler::simpleXYZRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot) { Vec3 d = xyzRot - targetXyzRot; xyzRot[0] = targetXyzRot[0] + angleMod(d[0]); xyzRot[1] = targetXyzRot[1] + angleMod(d[1]); xyzRot[2] = targetXyzRot[2] + angleMod(d[2]); } template void Euler::nearestRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot, Order order) { int i,j,k; Euler e (0,0,0, order); e.angleOrder(i,j,k); simpleXYZRotation(xyzRot, targetXyzRot); Vec3 otherXyzRot; otherXyzRot[i] = M_PI+xyzRot[i]; otherXyzRot[j] = M_PI-xyzRot[j]; otherXyzRot[k] = M_PI+xyzRot[k]; simpleXYZRotation(otherXyzRot, targetXyzRot); Vec3 d = xyzRot - targetXyzRot; Vec3 od = otherXyzRot - targetXyzRot; T dMag = d.dot(d); T odMag = od.dot(od); if (odMag < dMag) { xyzRot = otherXyzRot; } } template void Euler::makeNear (const Euler &target) { Vec3 xyzRot = toXYZVector(); Vec3 targetXyz; if (order() != target.order()) { Euler targetSameOrder = Euler(target, order()); targetXyz = targetSameOrder.toXYZVector(); } else { targetXyz = target.toXYZVector(); } nearestRotation(xyzRot, targetXyz, order()); setXYZVector(xyzRot); } #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER #pragma warning(default:4244) #endif IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHEULER_H openexr-2.5.7/IlmBase/Imath/ImathExc.cpp000066400000000000000000000012051406177042200177720ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. #include "ImathExc.h" IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, NullVecExc, ::IEX_NAMESPACE::MathExc) DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, InfPointExc, ::IEX_NAMESPACE::MathExc) DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, NullQuatExc, ::IEX_NAMESPACE::MathExc) DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, SingMatrixExc, ::IEX_NAMESPACE::MathExc) DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, ZeroScaleExc, ::IEX_NAMESPACE::MathExc) DEFINE_EXC_EXP_IMPL (IMATH_EXPORT, IntVecNormalizeExc, ::IEX_NAMESPACE::MathExc) IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathExc.h000066400000000000000000000055141406177042200174460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHEXC_H #define INCLUDED_IMATHEXC_H //----------------------------------------------- // // Imath library-specific exceptions // //----------------------------------------------- #include "ImathNamespace.h" #include "IexBaseExc.h" #include "ImathExport.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER // Attempt to normalize null vector DEFINE_EXC_EXP (IMATH_EXPORT, NullVecExc, ::IEX_NAMESPACE::MathExc) // Attempt to normalize a point at infinity DEFINE_EXC_EXP (IMATH_EXPORT, InfPointExc, ::IEX_NAMESPACE::MathExc) // Attempt to normalize null quaternion DEFINE_EXC_EXP (IMATH_EXPORT, NullQuatExc, ::IEX_NAMESPACE::MathExc) // Attempt to invert singular matrix DEFINE_EXC_EXP (IMATH_EXPORT, SingMatrixExc, ::IEX_NAMESPACE::MathExc) // Attempt to remove zero scaling from matrix DEFINE_EXC_EXP (IMATH_EXPORT, ZeroScaleExc, ::IEX_NAMESPACE::MathExc) // Attempt to normalize a vector of whose elementsare an integer type DEFINE_EXC_EXP (IMATH_EXPORT, IntVecNormalizeExc, ::IEX_NAMESPACE::MathExc) IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHEXC_H openexr-2.5.7/IlmBase/Imath/ImathExport.h000066400000000000000000000042001406177042200201770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #if defined(OPENEXR_DLL) #if defined(IMATH_EXPORTS) #define IMATH_EXPORT __declspec(dllexport) #define IMATH_EXPORT_CONST extern __declspec(dllexport) #else #define IMATH_EXPORT __declspec(dllimport) #define IMATH_EXPORT_CONST extern __declspec(dllimport) #endif #else #define IMATH_EXPORT #define IMATH_EXPORT_CONST extern const #endif openexr-2.5.7/IlmBase/Imath/ImathForward.h000066400000000000000000000052721406177042200203340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHFORWARD_H #define INCLUDED_IMATHFORWARD_H #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER // // Basic template type declarations. // template class Box; template class Color3; template class Color4; template class Euler; template class Frustum; template class FrustumTest; template class Interval; template class Line3; template class Matrix33; template class Matrix44; template class Plane3; template class Quat; template class Shear6; template class Sphere3; template class TMatrix; template class TMatrixBase; template class TMatrixData; template class Vec2; template class Vec3; template class Vec4; class Rand32; class Rand48; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHFORWARD_H openexr-2.5.7/IlmBase/Imath/ImathFrame.h000066400000000000000000000151461406177042200177630ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHFRAME_H #define INCLUDED_IMATHFRAME_H #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Vec3; template class Matrix44; // // These methods compute a set of reference frames, defined by their // transformation matrix, along a curve. It is designed so that the // array of points and the array of matrices used to fetch these routines // don't need to be ordered as the curve. // // A typical usage would be : // // m[0] = IMATH_INTERNAL_NAMESPACE::firstFrame( p[0], p[1], p[2] ); // for( int i = 1; i < n - 1; i++ ) // { // m[i] = IMATH_INTERNAL_NAMESPACE::nextFrame( m[i-1], p[i-1], p[i], t[i-1], t[i] ); // } // m[n-1] = IMATH_INTERNAL_NAMESPACE::lastFrame( m[n-2], p[n-2], p[n-1] ); // // See Graphics Gems I for the underlying algorithm. // template Matrix44 firstFrame( const Vec3&, // First point const Vec3&, // Second point const Vec3& ); // Third point template Matrix44 nextFrame( const Matrix44&, // Previous matrix const Vec3&, // Previous point const Vec3&, // Current point Vec3&, // Previous tangent Vec3& ); // Current tangent template Matrix44 lastFrame( const Matrix44&, // Previous matrix const Vec3&, // Previous point const Vec3& ); // Last point // // firstFrame - Compute the first reference frame along a curve. // // This function returns the transformation matrix to the reference frame // defined by the three points 'pi', 'pj' and 'pk'. Note that if the two // vectors and are colinears, an arbitrary twist value will // be choosen. // // Throw 'NullVecExc' if 'pi' and 'pj' are equals. // template Matrix44 firstFrame ( const Vec3& pi, // First point const Vec3& pj, // Second point const Vec3& pk ) // Third point { Vec3 t = pj - pi; t.normalizeExc(); Vec3 n = t.cross( pk - pi ); n.normalize(); if( n.length() == 0.0f ) { int i = fabs( t[0] ) < fabs( t[1] ) ? 0 : 1; if( fabs( t[2] ) < fabs( t[i] )) i = 2; Vec3 v( 0.0, 0.0, 0.0 ); v[i] = 1.0; n = t.cross( v ); n.normalize(); } Vec3 b = t.cross( n ); Matrix44 M; M[0][0] = t[0]; M[0][1] = t[1]; M[0][2] = t[2]; M[0][3] = 0.0, M[1][0] = n[0]; M[1][1] = n[1]; M[1][2] = n[2]; M[1][3] = 0.0, M[2][0] = b[0]; M[2][1] = b[1]; M[2][2] = b[2]; M[2][3] = 0.0, M[3][0] = pi[0]; M[3][1] = pi[1]; M[3][2] = pi[2]; M[3][3] = 1.0; return M; } // // nextFrame - Compute the next reference frame along a curve. // // This function returns the transformation matrix to the next reference // frame defined by the previously computed transformation matrix and the // new point and tangent vector along the curve. // template Matrix44 nextFrame ( const Matrix44& Mi, // Previous matrix const Vec3& pi, // Previous point const Vec3& pj, // Current point Vec3& ti, // Previous tangent vector Vec3& tj ) // Current tangent vector { Vec3 a(0.0, 0.0, 0.0); // Rotation axis. T r = 0.0; // Rotation angle. if( ti.length() != 0.0 && tj.length() != 0.0 ) { ti.normalize(); tj.normalize(); T dot = ti.dot( tj ); // // This is *really* necessary : // if( dot > 1.0 ) dot = 1.0; else if( dot < -1.0 ) dot = -1.0; r = acosf( dot ); a = ti.cross( tj ); } if( a.length() != 0.0 && r != 0.0 ) { Matrix44 R; R.setAxisAngle( a, r ); Matrix44 Tj; Tj.translate( pj ); Matrix44 Ti; Ti.translate( -pi ); return Mi * Ti * R * Tj; } else { Matrix44 Tr; Tr.translate( pj - pi ); return Mi * Tr; } } // // lastFrame - Compute the last reference frame along a curve. // // This function returns the transformation matrix to the last reference // frame defined by the previously computed transformation matrix and the // last point along the curve. // template Matrix44 lastFrame ( const Matrix44& Mi, // Previous matrix const Vec3& pi, // Previous point const Vec3& pj ) // Last point { Matrix44 Tr; Tr.translate( pj - pi ); return Mi * Tr; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHFRAME_H openexr-2.5.7/IlmBase/Imath/ImathFrustum.h000066400000000000000000000545001406177042200203730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHFRUSTUM_H #define INCLUDED_IMATHFRUSTUM_H #include "ImathVec.h" #include "ImathPlane.h" #include "ImathLine.h" #include "ImathMatrix.h" #include "ImathLimits.h" #include "ImathFun.h" #include "ImathNamespace.h" #include "IexMathExc.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER // // template class Frustum // // The frustum is always located with the eye point at the // origin facing down -Z. This makes the Frustum class // compatable with OpenGL (or anything that assumes a camera // looks down -Z, hence with a right-handed coordinate system) // but not with RenderMan which assumes the camera looks down // +Z. Additional functions are provided for conversion from // and from various camera coordinate spaces. // // nearPlane/farPlane: near/far are keywords used by Microsoft's // compiler, so we use nearPlane/farPlane instead to avoid // issues. template class Frustum { public: Frustum(); Frustum(const Frustum &); Frustum(T nearPlane, T farPlane, T left, T right, T top, T bottom, bool ortho=false); Frustum(T nearPlane, T farPlane, T fovx, T fovy, T aspect); virtual ~Frustum(); //-------------------- // Assignment operator //-------------------- const Frustum & operator = (const Frustum &); //-------------------- // Operators: ==, != //-------------------- bool operator == (const Frustum &src) const; bool operator != (const Frustum &src) const; //-------------------------------------------------------- // Set functions change the entire state of the Frustum //-------------------------------------------------------- void set(T nearPlane, T farPlane, T left, T right, T top, T bottom, bool ortho=false); void set(T nearPlane, T farPlane, T fovx, T fovy, T aspect); //------------------------------------------------------ // These functions modify an already valid frustum state //------------------------------------------------------ void modifyNearAndFar(T nearPlane, T farPlane); void setOrthographic(bool); //-------------- // Access //-------------- bool orthographic() const { return _orthographic; } T nearPlane() const { return _nearPlane; } T hither() const { return _nearPlane; } T farPlane() const { return _farPlane; } T yon() const { return _farPlane; } T left() const { return _left; } T right() const { return _right; } T bottom() const { return _bottom; } T top() const { return _top; } //----------------------------------------------------------------------- // Sets the planes in p to be the six bounding planes of the frustum, in // the following order: top, right, bottom, left, near, far. // Note that the planes have normals that point out of the frustum. // The version of this routine that takes a matrix applies that matrix // to transform the frustum before setting the planes. //----------------------------------------------------------------------- void planes(Plane3 p[6]) const; void planes(Plane3 p[6], const Matrix44 &M) const; //---------------------- // Derived Quantities //---------------------- T fovx() const; T fovy() const; T aspect() const; Matrix44 projectionMatrix() const; bool degenerate() const; //----------------------------------------------------------------------- // Takes a rectangle in the screen space (i.e., -1 <= left <= right <= 1 // and -1 <= bottom <= top <= 1) of this Frustum, and returns a new // Frustum whose near clipping-plane window is that rectangle in local // space. //----------------------------------------------------------------------- Frustum window(T left, T right, T top, T bottom) const; //---------------------------------------------------------- // Projection is in screen space / Conversion from Z-Buffer //---------------------------------------------------------- Line3 projectScreenToRay( const Vec2 & ) const; Vec2 projectPointToScreen( const Vec3 & ) const; T ZToDepth(long zval, long min, long max) const; T normalizedZToDepth(T zval) const; long DepthToZ(T depth, long zmin, long zmax) const; T worldRadius(const Vec3 &p, T radius) const; T screenRadius(const Vec3 &p, T radius) const; protected: Vec2 screenToLocal( const Vec2 & ) const; Vec2 localToScreen( const Vec2 & ) const; protected: T _nearPlane; T _farPlane; T _left; T _right; T _top; T _bottom; bool _orthographic; }; template inline Frustum::Frustum() { set(T (0.1), T (1000.0), T (-1.0), T (1.0), T (1.0), T (-1.0), false); } template inline Frustum::Frustum(const Frustum &f) { *this = f; } template inline Frustum::Frustum(T n, T f, T l, T r, T t, T b, bool o) { set(n,f,l,r,t,b,o); } template inline Frustum::Frustum(T nearPlane, T farPlane, T fovx, T fovy, T aspect) { set(nearPlane,farPlane,fovx,fovy,aspect); } template Frustum::~Frustum() { } template const Frustum & Frustum::operator = (const Frustum &f) { _nearPlane = f._nearPlane; _farPlane = f._farPlane; _left = f._left; _right = f._right; _top = f._top; _bottom = f._bottom; _orthographic = f._orthographic; return *this; } template bool Frustum::operator == (const Frustum &src) const { return _nearPlane == src._nearPlane && _farPlane == src._farPlane && _left == src._left && _right == src._right && _top == src._top && _bottom == src._bottom && _orthographic == src._orthographic; } template inline bool Frustum::operator != (const Frustum &src) const { return !operator== (src); } template void Frustum::set(T n, T f, T l, T r, T t, T b, bool o) { _nearPlane = n; _farPlane = f; _left = l; _right = r; _bottom = b; _top = t; _orthographic = o; } template void Frustum::modifyNearAndFar(T n, T f) { if ( _orthographic ) { _nearPlane = n; } else { Line3 lowerLeft( Vec3(0,0,0), Vec3(_left,_bottom,-_nearPlane) ); Line3 upperRight( Vec3(0,0,0), Vec3(_right,_top,-_nearPlane) ); Plane3 nearPlane( Vec3(0,0,-1), n ); Vec3 ll = Vec3 (0, 0, 0); Vec3 ur = Vec3 (0, 0, 0); nearPlane.intersect(lowerLeft,ll); nearPlane.intersect(upperRight,ur); _left = ll.x; _right = ur.x; _top = ur.y; _bottom = ll.y; _nearPlane = n; _farPlane = f; } _farPlane = f; } template void Frustum::setOrthographic(bool ortho) { _orthographic = ortho; } template void Frustum::set(T nearPlane, T farPlane, T fovx, T fovy, T aspect) { if (fovx != 0 && fovy != 0) throw IEX_NAMESPACE::ArgExc ("fovx and fovy cannot both be non-zero."); const T two = static_cast(2); if (fovx != 0) { _right = nearPlane * Math::tan(fovx / two); _left = -_right; _top = ((_right - _left) / aspect) / two; _bottom = -_top; } else { _top = nearPlane * Math::tan(fovy / two); _bottom = -_top; _right = (_top - _bottom) * aspect / two; _left = -_right; } _nearPlane = nearPlane; _farPlane = farPlane; _orthographic = false; } template T Frustum::fovx() const { return Math::atan2(_right,_nearPlane) - Math::atan2(_left,_nearPlane); } template T Frustum::fovy() const { return Math::atan2(_top,_nearPlane) - Math::atan2(_bottom,_nearPlane); } template T Frustum::aspect() const { T rightMinusLeft = _right-_left; T topMinusBottom = _top-_bottom; if (abs(topMinusBottom) < 1 && abs(rightMinusLeft) > limits::max() * abs(topMinusBottom)) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "aspect ratio cannot be computed."); } return rightMinusLeft / topMinusBottom; } template Matrix44 Frustum::projectionMatrix() const { T rightPlusLeft = _right+_left; T rightMinusLeft = _right-_left; T topPlusBottom = _top+_bottom; T topMinusBottom = _top-_bottom; T farPlusNear = _farPlane+_nearPlane; T farMinusNear = _farPlane-_nearPlane; if ((abs(rightMinusLeft) < 1 && abs(rightPlusLeft) > limits::max() * abs(rightMinusLeft)) || (abs(topMinusBottom) < 1 && abs(topPlusBottom) > limits::max() * abs(topMinusBottom)) || (abs(farMinusNear) < 1 && abs(farPlusNear) > limits::max() * abs(farMinusNear))) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "projection matrix cannot be computed."); } if ( _orthographic ) { T tx = -rightPlusLeft / rightMinusLeft; T ty = -topPlusBottom / topMinusBottom; T tz = -farPlusNear / farMinusNear; if ((abs(rightMinusLeft) < 1 && 2 > limits::max() * abs(rightMinusLeft)) || (abs(topMinusBottom) < 1 && 2 > limits::max() * abs(topMinusBottom)) || (abs(farMinusNear) < 1 && 2 > limits::max() * abs(farMinusNear))) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "projection matrix cannot be computed."); } T A = 2 / rightMinusLeft; T B = 2 / topMinusBottom; T C = -2 / farMinusNear; return Matrix44( A, 0, 0, 0, 0, B, 0, 0, 0, 0, C, 0, tx, ty, tz, 1.f ); } else { T A = rightPlusLeft / rightMinusLeft; T B = topPlusBottom / topMinusBottom; T C = -farPlusNear / farMinusNear; T farTimesNear = -2 * _farPlane * _nearPlane; if (abs(farMinusNear) < 1 && abs(farTimesNear) > limits::max() * abs(farMinusNear)) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "projection matrix cannot be computed."); } T D = farTimesNear / farMinusNear; T twoTimesNear = 2 * _nearPlane; if ((abs(rightMinusLeft) < 1 && abs(twoTimesNear) > limits::max() * abs(rightMinusLeft)) || (abs(topMinusBottom) < 1 && abs(twoTimesNear) > limits::max() * abs(topMinusBottom))) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "projection matrix cannot be computed."); } T E = twoTimesNear / rightMinusLeft; T F = twoTimesNear / topMinusBottom; return Matrix44( E, 0, 0, 0, 0, F, 0, 0, A, B, C, -1, 0, 0, D, 0 ); } } template bool Frustum::degenerate() const { return (_nearPlane == _farPlane) || (_left == _right) || (_top == _bottom); } template Frustum Frustum::window(T l, T r, T t, T b) const { // move it to 0->1 space Vec2 bl = screenToLocal( Vec2(l,b) ); Vec2 tr = screenToLocal( Vec2(r,t) ); return Frustum(_nearPlane, _farPlane, bl.x, tr.x, tr.y, bl.y, _orthographic); } template Vec2 Frustum::screenToLocal(const Vec2 &s) const { return Vec2( _left + (_right-_left) * (1.f+s.x) / 2.f, _bottom + (_top-_bottom) * (1.f+s.y) / 2.f ); } template Vec2 Frustum::localToScreen(const Vec2 &p) const { T leftPlusRight = _left - T (2) * p.x + _right; T leftMinusRight = _left-_right; T bottomPlusTop = _bottom - T (2) * p.y + _top; T bottomMinusTop = _bottom-_top; if ((abs(leftMinusRight) < T (1) && abs(leftPlusRight) > limits::max() * abs(leftMinusRight)) || (abs(bottomMinusTop) < T (1) && abs(bottomPlusTop) > limits::max() * abs(bottomMinusTop))) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: " "local-to-screen transformation cannot be computed"); } return Vec2( leftPlusRight / leftMinusRight, bottomPlusTop / bottomMinusTop ); } template Line3 Frustum::projectScreenToRay(const Vec2 &p) const { Vec2 point = screenToLocal(p); if (orthographic()) return Line3( Vec3(point.x,point.y, 0.0), Vec3(point.x,point.y,-1.0)); else return Line3( Vec3(0, 0, 0), Vec3(point.x,point.y,-_nearPlane)); } template Vec2 Frustum::projectPointToScreen(const Vec3 &point) const { if (orthographic() || point.z == T (0)) return localToScreen( Vec2( point.x, point.y ) ); else return localToScreen( Vec2( point.x * _nearPlane / -point.z, point.y * _nearPlane / -point.z ) ); } template T Frustum::ZToDepth(long zval,long zmin,long zmax) const { int zdiff = zmax - zmin; if (zdiff == 0) { throw IEX_NAMESPACE::DivzeroExc ("Bad call to Frustum::ZToDepth: zmax == zmin"); } if ( zval > zmax+1 ) zval -= zdiff; T fzval = (T(zval) - T(zmin)) / T(zdiff); return normalizedZToDepth(fzval); } template T Frustum::normalizedZToDepth(T zval) const { T Zp = zval * 2.0 - 1; if ( _orthographic ) { return -(Zp*(_farPlane-_nearPlane) + (_farPlane+_nearPlane))/2; } else { T farTimesNear = 2 * _farPlane * _nearPlane; T farMinusNear = Zp * (_farPlane - _nearPlane) - _farPlane - _nearPlane; if (abs(farMinusNear) < 1 && abs(farTimesNear) > limits::max() * abs(farMinusNear)) { throw IEX_NAMESPACE::DivzeroExc ("Frustum::normalizedZToDepth cannot be computed. The " "near and far clipping planes of the viewing frustum " "may be too close to each other"); } return farTimesNear / farMinusNear; } } template long Frustum::DepthToZ(T depth,long zmin,long zmax) const { long zdiff = zmax - zmin; T farMinusNear = _farPlane-_nearPlane; if ( _orthographic ) { T farPlusNear = 2*depth + _farPlane + _nearPlane; if (abs(farMinusNear) < 1 && abs(farPlusNear) > limits::max() * abs(farMinusNear)) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: near and far clipping planes " "are too close to each other"); } T Zp = -farPlusNear/farMinusNear; return long(0.5*(Zp+1)*zdiff) + zmin; } else { // Perspective T farTimesNear = 2*_farPlane*_nearPlane; if (abs(depth) < 1 && abs(farTimesNear) > limits::max() * abs(depth)) { throw IEX_NAMESPACE::DivzeroExc ("Bad call to DepthToZ function: value of `depth' " "is too small"); } T farPlusNear = farTimesNear/depth + _farPlane + _nearPlane; if (abs(farMinusNear) < 1 && abs(farPlusNear) > limits::max() * abs(farMinusNear)) { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: near and far clipping planes " "are too close to each other"); } T Zp = farPlusNear/farMinusNear; return long(0.5*(Zp+1)*zdiff) + zmin; } } template T Frustum::screenRadius(const Vec3 &p, T radius) const { // Derivation: // Consider X-Z plane. // X coord of projection of p = xp = p.x * (-_nearPlane / p.z) // Let q be p + (radius, 0, 0). // X coord of projection of q = xq = (p.x - radius) * (-_nearPlane / p.z) // X coord of projection of segment from p to q = r = xp - xq // = radius * (-_nearPlane / p.z) // A similar analysis holds in the Y-Z plane. // So r is the quantity we want to return. if (abs(p.z) > 1 || abs(-_nearPlane) < limits::max() * abs(p.z)) { return radius * (-_nearPlane / p.z); } else { throw IEX_NAMESPACE::DivzeroExc ("Bad call to Frustum::screenRadius: the magnitude of `p' " "is too small"); } return radius * (-_nearPlane / p.z); } template T Frustum::worldRadius(const Vec3 &p, T radius) const { if (abs(-_nearPlane) > 1 || abs(p.z) < limits::max() * abs(-_nearPlane)) { return radius * (p.z / -_nearPlane); } else { throw IEX_NAMESPACE::DivzeroExc ("Bad viewing frustum: the near clipping plane is too " "close to zero"); } } template void Frustum::planes(Plane3 p[6]) const { // // Plane order: Top, Right, Bottom, Left, Near, Far. // Normals point outwards. // if (! _orthographic) { Vec3 a( _left, _bottom, -_nearPlane); Vec3 b( _left, _top, -_nearPlane); Vec3 c( _right, _top, -_nearPlane); Vec3 d( _right, _bottom, -_nearPlane); Vec3 o(0,0,0); p[0].set( o, c, b ); p[1].set( o, d, c ); p[2].set( o, a, d ); p[3].set( o, b, a ); } else { p[0].set( Vec3( 0, 1, 0), _top ); p[1].set( Vec3( 1, 0, 0), _right ); p[2].set( Vec3( 0,-1, 0),-_bottom ); p[3].set( Vec3(-1, 0, 0),-_left ); } p[4].set( Vec3(0, 0, 1), -_nearPlane ); p[5].set( Vec3(0, 0,-1), _farPlane ); } template void Frustum::planes(Plane3 p[6], const Matrix44 &M) const { // // Plane order: Top, Right, Bottom, Left, Near, Far. // Normals point outwards. // Vec3 a = Vec3( _left, _bottom, -_nearPlane) * M; Vec3 b = Vec3( _left, _top, -_nearPlane) * M; Vec3 c = Vec3( _right, _top, -_nearPlane) * M; Vec3 d = Vec3( _right, _bottom, -_nearPlane) * M; if (! _orthographic) { double s = _farPlane / double(_nearPlane); T farLeft = (T) (s * _left); T farRight = (T) (s * _right); T farTop = (T) (s * _top); T farBottom = (T) (s * _bottom); Vec3 e = Vec3( farLeft, farBottom, -_farPlane) * M; Vec3 f = Vec3( farLeft, farTop, -_farPlane) * M; Vec3 g = Vec3( farRight, farTop, -_farPlane) * M; Vec3 o = Vec3(0,0,0) * M; p[0].set( o, c, b ); p[1].set( o, d, c ); p[2].set( o, a, d ); p[3].set( o, b, a ); p[4].set( a, d, c ); p[5].set( e, f, g ); } else { Vec3 e = Vec3( _left, _bottom, -_farPlane) * M; Vec3 f = Vec3( _left, _top, -_farPlane) * M; Vec3 g = Vec3( _right, _top, -_farPlane) * M; Vec3 h = Vec3( _right, _bottom, -_farPlane) * M; p[0].set( c, g, f ); p[1].set( d, h, g ); p[2].set( a, e, h ); p[3].set( b, f, e ); p[4].set( a, d, c ); p[5].set( e, f, g ); } } typedef Frustum Frustumf; typedef Frustum Frustumd; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #if defined _WIN32 || defined _WIN64 #ifdef _redef_near #define near #endif #ifdef _redef_far #define far #endif #endif #endif // INCLUDED_IMATHFRUSTUM_H openexr-2.5.7/IlmBase/Imath/ImathFrustumTest.h000066400000000000000000000354301406177042200212340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHFRUSTUMTEST_H #define INCLUDED_IMATHFRUSTUMTEST_H //------------------------------------------------------------------------- // // This file contains algorithms applied to or in conjunction with // Frustum visibility testing (Imath::Frustum). // // Methods for frustum-based rejection of primitives are contained here. // //------------------------------------------------------------------------- #include "ImathFrustum.h" #include "ImathBox.h" #include "ImathSphere.h" #include "ImathMatrix.h" #include "ImathVec.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER ///////////////////////////////////////////////////////////////// // FrustumTest // // template class FrustumTest // // This is a helper class, designed to accelerate the case // where many tests are made against the same frustum. // That's a really common case. // // The acceleration is achieved by pre-computing the planes of // the frustum, along with the ablsolute values of the plane normals. // ////////////////////////////////////////////////////////////////// // How to use this // // Given that you already have: // Imath::Frustum myFrustum // Imath::Matrix44 myCameraWorldMatrix // // First, make a frustum test object: // FrustumTest myFrustumTest(myFrustum, myCameraWorldMatrix) // // Whenever the camera or frustum changes, call: // myFrustumTest.setFrustum(myFrustum, myCameraWorldMatrix) // // For each object you want to test for visibility, call: // myFrustumTest.isVisible(myBox) // myFrustumTest.isVisible(mySphere) // myFrustumTest.isVisible(myVec3) // myFrustumTest.completelyContains(myBox) // myFrustumTest.completelyContains(mySphere) // ////////////////////////////////////////////////////////////////// // Explanation of how it works // // // We store six world-space Frustum planes (nx, ny, nz, offset) // // Points: To test a Vec3 for visibility, test it against each plane // using the normal (v dot n - offset) method. (the result is exact) // // BBoxes: To test an axis-aligned bbox, test the center against each plane // using the normal (v dot n - offset) method, but offset by the // box extents dot the abs of the plane normal. (the result is NOT // exact, but will not return false-negatives.) // // Spheres: To test a sphere, test the center against each plane // using the normal (v dot n - offset) method, but offset by the // sphere's radius. (the result is NOT exact, but will not return // false-negatives.) // // // SPECIAL NOTE: "Where are the dot products?" // Actual dot products are currently slow for most SIMD architectures. // In order to keep this code optimization-ready, the dot products // are all performed using vector adds and multipies. // // In order to do this, the plane equations are stored in "transpose" // form, with the X components grouped into an X vector, etc. // template class FrustumTest { public: FrustumTest() { Frustum frust; Matrix44 cameraMat; cameraMat.makeIdentity(); setFrustum(frust, cameraMat); } FrustumTest(const Frustum &frustum, const Matrix44 &cameraMat) { setFrustum(frustum, cameraMat); } //////////////////////////////////////////////////////////////////// // setFrustum() // This updates the frustum test with a new frustum and matrix. // This should usually be called just once per frame. void setFrustum(const Frustum &frustum, const Matrix44 &cameraMat); //////////////////////////////////////////////////////////////////// // isVisible() // Check to see if shapes are visible. bool isVisible(const Sphere3 &sphere) const; bool isVisible(const Box > &box) const; bool isVisible(const Vec3 &vec) const; //////////////////////////////////////////////////////////////////// // completelyContains() // Check to see if shapes are entirely contained. bool completelyContains(const Sphere3 &sphere) const; bool completelyContains(const Box > &box) const; // These next items are kept primarily for debugging tools. // It's useful for drawing the culling environment, and also // for getting an "outside view" of the culling frustum. IMATH_INTERNAL_NAMESPACE::Matrix44 cameraMat() const {return cameraMatrix;} IMATH_INTERNAL_NAMESPACE::Frustum currentFrustum() const {return currFrustum;} protected: // To understand why the planes are stored this way, see // the SPECIAL NOTE above. Vec3 planeNormX[2]; // The X compunents from 6 plane equations Vec3 planeNormY[2]; // The Y compunents from 6 plane equations Vec3 planeNormZ[2]; // The Z compunents from 6 plane equations Vec3 planeOffsetVec[2]; // The distance offsets from 6 plane equations // The absolute values are stored to assist with bounding box tests. Vec3 planeNormAbsX[2]; // The abs(X) compunents from 6 plane equations Vec3 planeNormAbsY[2]; // The abs(X) compunents from 6 plane equations Vec3 planeNormAbsZ[2]; // The abs(X) compunents from 6 plane equations // These are kept primarily for debugging tools. Frustum currFrustum; Matrix44 cameraMatrix; }; //////////////////////////////////////////////////////////////////// // setFrustum() // This should usually only be called once per frame, or however // often the camera moves. template void FrustumTest::setFrustum(const Frustum &frustum, const Matrix44 &cameraMat) { Plane3 frustumPlanes[6]; frustum.planes(frustumPlanes, cameraMat); // Here's where we effectively transpose the plane equations. // We stuff all six X's into the two planeNormX vectors, etc. for (int i = 0; i < 2; ++i) { int index = i * 3; planeNormX[i] = Vec3(frustumPlanes[index + 0].normal.x, frustumPlanes[index + 1].normal.x, frustumPlanes[index + 2].normal.x); planeNormY[i] = Vec3(frustumPlanes[index + 0].normal.y, frustumPlanes[index + 1].normal.y, frustumPlanes[index + 2].normal.y); planeNormZ[i] = Vec3(frustumPlanes[index + 0].normal.z, frustumPlanes[index + 1].normal.z, frustumPlanes[index + 2].normal.z); planeNormAbsX[i] = Vec3(IMATH_INTERNAL_NAMESPACE::abs(planeNormX[i].x), IMATH_INTERNAL_NAMESPACE::abs(planeNormX[i].y), IMATH_INTERNAL_NAMESPACE::abs(planeNormX[i].z)); planeNormAbsY[i] = Vec3(IMATH_INTERNAL_NAMESPACE::abs(planeNormY[i].x), IMATH_INTERNAL_NAMESPACE::abs(planeNormY[i].y), IMATH_INTERNAL_NAMESPACE::abs(planeNormY[i].z)); planeNormAbsZ[i] = Vec3(IMATH_INTERNAL_NAMESPACE::abs(planeNormZ[i].x), IMATH_INTERNAL_NAMESPACE::abs(planeNormZ[i].y), IMATH_INTERNAL_NAMESPACE::abs(planeNormZ[i].z)); planeOffsetVec[i] = Vec3(frustumPlanes[index + 0].distance, frustumPlanes[index + 1].distance, frustumPlanes[index + 2].distance); } currFrustum = frustum; cameraMatrix = cameraMat; } //////////////////////////////////////////////////////////////////// // isVisible(Sphere) // Returns true if any part of the sphere is inside // the frustum. // The result MAY return close false-positives, but not false-negatives. // template bool FrustumTest::isVisible(const Sphere3 &sphere) const { Vec3 center = sphere.center; Vec3 radiusVec = Vec3(sphere.radius, sphere.radius, sphere.radius); // This is a vertical dot-product on three vectors at once. Vec3 d0 = planeNormX[0] * center.x + planeNormY[0] * center.y + planeNormZ[0] * center.z - radiusVec - planeOffsetVec[0]; if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) return false; Vec3 d1 = planeNormX[1] * center.x + planeNormY[1] * center.y + planeNormZ[1] * center.z - radiusVec - planeOffsetVec[1]; if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) return false; return true; } //////////////////////////////////////////////////////////////////// // completelyContains(Sphere) // Returns true if every part of the sphere is inside // the frustum. // The result MAY return close false-negatives, but not false-positives. // template bool FrustumTest::completelyContains(const Sphere3 &sphere) const { Vec3 center = sphere.center; Vec3 radiusVec = Vec3(sphere.radius, sphere.radius, sphere.radius); // This is a vertical dot-product on three vectors at once. Vec3 d0 = planeNormX[0] * center.x + planeNormY[0] * center.y + planeNormZ[0] * center.z + radiusVec - planeOffsetVec[0]; if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) return false; Vec3 d1 = planeNormX[1] * center.x + planeNormY[1] * center.y + planeNormZ[1] * center.z + radiusVec - planeOffsetVec[1]; if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) return false; return true; } //////////////////////////////////////////////////////////////////// // isVisible(Box) // Returns true if any part of the axis-aligned box // is inside the frustum. // The result MAY return close false-positives, but not false-negatives. // template bool FrustumTest::isVisible(const Box > &box) const { if (box.isEmpty()) return false; Vec3 center = (box.min + box.max) / 2; Vec3 extent = (box.max - center); // This is a vertical dot-product on three vectors at once. Vec3 d0 = planeNormX[0] * center.x + planeNormY[0] * center.y + planeNormZ[0] * center.z - planeNormAbsX[0] * extent.x - planeNormAbsY[0] * extent.y - planeNormAbsZ[0] * extent.z - planeOffsetVec[0]; if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) return false; Vec3 d1 = planeNormX[1] * center.x + planeNormY[1] * center.y + planeNormZ[1] * center.z - planeNormAbsX[1] * extent.x - planeNormAbsY[1] * extent.y - planeNormAbsZ[1] * extent.z - planeOffsetVec[1]; if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) return false; return true; } //////////////////////////////////////////////////////////////////// // completelyContains(Box) // Returns true if every part of the axis-aligned box // is inside the frustum. // The result MAY return close false-negatives, but not false-positives. // template bool FrustumTest::completelyContains(const Box > &box) const { if (box.isEmpty()) return false; Vec3 center = (box.min + box.max) / 2; Vec3 extent = (box.max - center); // This is a vertical dot-product on three vectors at once. Vec3 d0 = planeNormX[0] * center.x + planeNormY[0] * center.y + planeNormZ[0] * center.z + planeNormAbsX[0] * extent.x + planeNormAbsY[0] * extent.y + planeNormAbsZ[0] * extent.z - planeOffsetVec[0]; if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) return false; Vec3 d1 = planeNormX[1] * center.x + planeNormY[1] * center.y + planeNormZ[1] * center.z + planeNormAbsX[1] * extent.x + planeNormAbsY[1] * extent.y + planeNormAbsZ[1] * extent.z - planeOffsetVec[1]; if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) return false; return true; } //////////////////////////////////////////////////////////////////// // isVisible(Vec3) // Returns true if the point is inside the frustum. // template bool FrustumTest::isVisible(const Vec3 &vec) const { // This is a vertical dot-product on three vectors at once. Vec3 d0 = (planeNormX[0] * vec.x) + (planeNormY[0] * vec.y) + (planeNormZ[0] * vec.z) - planeOffsetVec[0]; if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) return false; Vec3 d1 = (planeNormX[1] * vec.x) + (planeNormY[1] * vec.y) + (planeNormZ[1] * vec.z) - planeOffsetVec[1]; if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) return false; return true; } typedef FrustumTest FrustumTestf; typedef FrustumTest FrustumTestd; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHFRUSTUMTEST_H openexr-2.5.7/IlmBase/Imath/ImathFun.cpp000066400000000000000000000104701406177042200200070ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImathFun.h" IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER float succf (float f) { union {float f; unsigned int i;} u; u.f = f; if ((u.i & 0x7f800000) == 0x7f800000) { // Nan or infinity; don't change value. } else if (u.i == 0x00000000 || u.i == 0x80000000) { // Plus or minus zero. u.i = 0x00000001; } else if (u.f > 0) { // Positive float, normalized or denormalized. // Incrementing the largest positive float // produces +infinity. ++u.i; } else { // Negative normalized or denormalized float. --u.i; } return u.f; } float predf (float f) { union {float f; unsigned int i;} u; u.f = f; if ((u.i & 0x7f800000) == 0x7f800000) { // Nan or infinity; don't change value. } else if (u.i == 0x00000000 || u.i == 0x80000000) { // Plus or minus zero. u.i = 0x80000001; } else if (u.f > 0) { // Positive float, normalized or denormalized. --u.i; } else { // Negative normalized or denormalized float. // Decrementing the largest negative float // produces -infinity. ++u.i; } return u.f; } double succd (double d) { union {double d; Int64 i;} u; u.d = d; if ((u.i & 0x7ff0000000000000LL) == 0x7ff0000000000000LL) { // Nan or infinity; don't change value. } else if (u.i == 0x0000000000000000LL || u.i == 0x8000000000000000LL) { // Plus or minus zero. u.i = 0x0000000000000001LL; } else if (u.d > 0) { // Positive double, normalized or denormalized. // Incrementing the largest positive double // produces +infinity. ++u.i; } else { // Negative normalized or denormalized double. --u.i; } return u.d; } double predd (double d) { union {double d; Int64 i;} u; u.d = d; if ((u.i & 0x7ff0000000000000LL) == 0x7ff0000000000000LL) { // Nan or infinity; don't change value. } else if (u.i == 0x0000000000000000LL || u.i == 0x8000000000000000LL) { // Plus or minus zero. u.i = 0x8000000000000001LL; } else if (u.d > 0) { // Positive double, normalized or denormalized. --u.i; } else { // Negative normalized or denormalized double. // Decrementing the largest negative double // produces -infinity. ++u.i; } return u.d; } IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathFun.h000066400000000000000000000137641406177042200174650ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHFUN_H #define INCLUDED_IMATHFUN_H //----------------------------------------------------------------------------- // // Miscellaneous utility functions // //----------------------------------------------------------------------------- #include "ImathExport.h" #include "ImathLimits.h" #include "ImathInt64.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template inline T abs (T a) { return (a > T(0)) ? a : -a; } template inline int sign (T a) { return (a > T(0))? 1 : ((a < T(0)) ? -1 : 0); } template inline T lerp (T a, T b, Q t) { return (T) (a * (1 - t) + b * t); } template inline T ulerp (T a, T b, Q t) { return (T) ((a > b)? (a - (a - b) * t): (a + (b - a) * t)); } template inline T lerpfactor(T m, T a, T b) { // // Return how far m is between a and b, that is return t such that // if: // t = lerpfactor(m, a, b); // then: // m = lerp(a, b, t); // // If a==b, return 0. // T d = b - a; T n = m - a; if (abs(d) > T(1) || abs(n) < limits::max() * abs(d)) return n / d; return T(0); } template inline T clamp (T a, T l, T h) { return (a < l)? l : ((a > h)? h : a); } template inline int cmp (T a, T b) { return IMATH_INTERNAL_NAMESPACE::sign (a - b); } template inline int cmpt (T a, T b, T t) { return (IMATH_INTERNAL_NAMESPACE::abs (a - b) <= t)? 0 : cmp (a, b); } template inline bool iszero (T a, T t) { return (IMATH_INTERNAL_NAMESPACE::abs (a) <= t) ? 1 : 0; } template inline bool equal (T1 a, T2 b, T3 t) { return IMATH_INTERNAL_NAMESPACE::abs (a - b) <= t; } template inline int floor (T x) { return (x >= 0)? int (x): -(int (-x) + (-x > int (-x))); } template inline int ceil (T x) { return -floor (-x); } template inline int trunc (T x) { return (x >= 0) ? int(x) : -int(-x); } // // Integer division and remainder where the // remainder of x/y has the same sign as x: // // divs(x,y) == (abs(x) / abs(y)) * (sign(x) * sign(y)) // mods(x,y) == x - y * divs(x,y) // inline int divs (int x, int y) { return (x >= 0)? ((y >= 0)? ( x / y): -( x / -y)): ((y >= 0)? -(-x / y): (-x / -y)); } inline int mods (int x, int y) { return (x >= 0)? ((y >= 0)? ( x % y): ( x % -y)): ((y >= 0)? -(-x % y): -(-x % -y)); } // // Integer division and remainder where the // remainder of x/y is always positive: // // divp(x,y) == floor (double(x) / double (y)) // modp(x,y) == x - y * divp(x,y) // inline int divp (int x, int y) { return (x >= 0)? ((y >= 0)? ( x / y): -( x / -y)): ((y >= 0)? -((y-1-x) / y): ((-y-1-x) / -y)); } inline int modp (int x, int y) { return x - y * divp (x, y); } //---------------------------------------------------------- // Successor and predecessor for floating-point numbers: // // succf(f) returns float(f+e), where e is the smallest // positive number such that float(f+e) != f. // // predf(f) returns float(f-e), where e is the smallest // positive number such that float(f-e) != f. // // succd(d) returns double(d+e), where e is the smallest // positive number such that double(d+e) != d. // // predd(d) returns double(d-e), where e is the smallest // positive number such that double(d-e) != d. // // Exceptions: If the input value is an infinity or a nan, // succf(), predf(), succd(), and predd() all // return the input value without changing it. // //---------------------------------------------------------- IMATH_EXPORT float succf (float f); IMATH_EXPORT float predf (float f); IMATH_EXPORT double succd (double d); IMATH_EXPORT double predd (double d); // // Return true if the number is not a NaN or Infinity. // inline bool finitef (float f) { union {float f; int i;} u; u.f = f; return (u.i & 0x7f800000) != 0x7f800000; } inline bool finited (double d) { union {double d; Int64 i;} u; u.d = d; return (u.i & 0x7ff0000000000000LL) != 0x7ff0000000000000LL; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHFUN_H openexr-2.5.7/IlmBase/Imath/ImathGL.h000066400000000000000000000110311406177042200172200ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHGL_H #define INCLUDED_IMATHGL_H #include #include "ImathVec.h" #include "ImathMatrix.h" #include "IexMathExc.h" #include "ImathFun.h" #include "ImathNamespace.h" inline void glVertex ( const IMATH_INTERNAL_NAMESPACE::V3f &v ) { glVertex3f(v.x,v.y,v.z); } inline void glVertex ( const IMATH_INTERNAL_NAMESPACE::V2f &v ) { glVertex2f(v.x,v.y); } inline void glNormal ( const IMATH_INTERNAL_NAMESPACE::V3f &n ) { glNormal3f(n.x,n.y,n.z); } inline void glColor ( const IMATH_INTERNAL_NAMESPACE::V3f &c ) { glColor3f(c.x,c.y,c.z); } inline void glTranslate ( const IMATH_INTERNAL_NAMESPACE::V3f &t ) { glTranslatef(t.x,t.y,t.z); } inline void glTexCoord( const IMATH_INTERNAL_NAMESPACE::V2f &t ) { glTexCoord2f(t.x,t.y); } inline void glDisableTexture() { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); } namespace { const float GL_FLOAT_MAX = 1.8e+19; // sqrt (FLT_MAX) inline bool badFloat (float f) { return !IMATH_INTERNAL_NAMESPACE::finitef (f) || f < - GL_FLOAT_MAX || f > GL_FLOAT_MAX; } } // namespace inline void throwBadMatrix (const IMATH_INTERNAL_NAMESPACE::M44f& m) { if (badFloat (m[0][0]) || badFloat (m[0][1]) || badFloat (m[0][2]) || badFloat (m[0][3]) || badFloat (m[1][0]) || badFloat (m[1][1]) || badFloat (m[1][2]) || badFloat (m[1][3]) || badFloat (m[2][0]) || badFloat (m[2][1]) || badFloat (m[2][2]) || badFloat (m[2][3]) || badFloat (m[3][0]) || badFloat (m[3][1]) || badFloat (m[3][2]) || badFloat (m[3][3])) throw IEX_NAMESPACE::OverflowExc ("GL matrix overflow"); } inline void glMultMatrix( const IMATH_INTERNAL_NAMESPACE::M44f& m ) { throwBadMatrix (m); glMultMatrixf( (GLfloat*)m[0] ); } inline void glMultMatrix( const IMATH_INTERNAL_NAMESPACE::M44f* m ) { throwBadMatrix (*m); glMultMatrixf( (GLfloat*)(*m)[0] ); } inline void glLoadMatrix( const IMATH_INTERNAL_NAMESPACE::M44f& m ) { throwBadMatrix (m); glLoadMatrixf( (GLfloat*)m[0] ); } inline void glLoadMatrix( const IMATH_INTERNAL_NAMESPACE::M44f* m ) { throwBadMatrix (*m); glLoadMatrixf( (GLfloat*)(*m)[0] ); } IMATH_INTERNAL_NAMESPACE_HEADER_ENTER // // Class objects that push/pop the GL state. These objects assist with // proper cleanup of the state when exceptions are thrown. // class GLPushMatrix { public: GLPushMatrix () { glPushMatrix(); } ~GLPushMatrix() { glPopMatrix(); } }; class GLPushAttrib { public: GLPushAttrib (GLbitfield mask) { glPushAttrib (mask); } ~GLPushAttrib() { glPopAttrib(); } }; class GLBegin { public: GLBegin (GLenum mode) { glBegin (mode); } ~GLBegin() { glEnd(); } }; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/IlmBase/Imath/ImathGLU.h000066400000000000000000000042561406177042200173600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHGLU_H #define INCLUDED_IMATHGLU_H #include #include #include "ImathVec.h" inline void gluLookAt(const IMATH_INTERNAL_NAMESPACE::V3f &pos, const IMATH_INTERNAL_NAMESPACE::V3f &interest, const IMATH_INTERNAL_NAMESPACE::V3f &up) { gluLookAt(pos.x, pos.y, pos.z, interest.x, interest.y, interest.z, up.x, up.y, up.z); } #endif openexr-2.5.7/IlmBase/Imath/ImathHalfLimits.h000066400000000000000000000047441406177042200207670ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHHALFLIMITS_H #define INCLUDED_IMATHHALFLIMITS_H //-------------------------------------------------- // // Imath-style limits for class half. // //-------------------------------------------------- #include "ImathLimits.h" #include "ImathNamespace.h" #include "half.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template <> struct limits { static float min() {return -HALF_MAX;} static float max() {return HALF_MAX;} static float smallest() {return HALF_MIN;} static float epsilon() {return HALF_EPSILON;} static bool isIntegral() {return false;} static bool isSigned() {return true;} }; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHHALFLIMITS_H openexr-2.5.7/IlmBase/Imath/ImathInt64.h000066400000000000000000000047651406177042200176420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATH_INT64_H #define INCLUDED_IMATH_INT64_H //---------------------------------------------------------------------------- // // Int64 -- unsigned 64-bit integers // //---------------------------------------------------------------------------- #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER #if (defined _WIN32 || defined _WIN64) && _MSC_VER >= 1300 typedef unsigned __int64 Int64; typedef __int64 SInt64; #elif ULONG_MAX == 18446744073709551615LU typedef long unsigned int Int64; typedef long int SInt64; #else typedef long long unsigned int Int64; typedef long long int SInt64; #endif IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATH_INT64_H openexr-2.5.7/IlmBase/Imath/ImathInterval.h000066400000000000000000000125411406177042200205110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHINTERVAL_H #define INCLUDED_IMATHINTERVAL_H //------------------------------------------------------------------- // // class Imath::Interval // -------------------------------- // // An Interval has a min and a max and some miscellaneous // functions. It is basically a Box that allows T to be // a scalar. // //------------------------------------------------------------------- #include "ImathVec.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Interval { public: //------------------------- // Data Members are public //------------------------- T min; T max; //----------------------------------------------------- // Constructors - an "empty" Interval is created by default //----------------------------------------------------- Interval(); Interval(const T& point); Interval(const T& minT, const T& maxT); //-------------------------------- // Operators: we get != from STL //-------------------------------- bool operator == (const Interval &src) const; //------------------ // Interval manipulation //------------------ void makeEmpty(); void extendBy(const T& point); void extendBy(const Interval& interval); //--------------------------------------------------- // Query functions - these compute results each time //--------------------------------------------------- T size() const; T center() const; bool intersects(const T &point) const; bool intersects(const Interval &interval) const; //---------------- // Classification //---------------- bool hasVolume() const; bool isEmpty() const; }; //-------------------- // Convenient typedefs //-------------------- typedef Interval Intervalf; typedef Interval Intervald; typedef Interval Intervals; typedef Interval Intervali; //---------------- // Implementation //---------------- template inline Interval::Interval() { makeEmpty(); } template inline Interval::Interval(const T& point) { min = point; max = point; } template inline Interval::Interval(const T& minV, const T& maxV) { min = minV; max = maxV; } template inline bool Interval::operator == (const Interval &src) const { return (min == src.min && max == src.max); } template inline void Interval::makeEmpty() { min = limits::max(); max = limits::min(); } template inline void Interval::extendBy(const T& point) { if ( point < min ) min = point; if ( point > max ) max = point; } template inline void Interval::extendBy(const Interval& interval) { if ( interval.min < min ) min = interval.min; if ( interval.max > max ) max = interval.max; } template inline bool Interval::intersects(const T& point) const { return point >= min && point <= max; } template inline bool Interval::intersects(const Interval& interval) const { return interval.max >= min && interval.min <= max; } template inline T Interval::size() const { return max-min; } template inline T Interval::center() const { return (max+min)/2; } template inline bool Interval::isEmpty() const { return max < min; } template inline bool Interval::hasVolume() const { return max > min; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHINTERVAL_H openexr-2.5.7/IlmBase/Imath/ImathLimits.h000066400000000000000000000174161406177042200201740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHLIMITS_H #define INCLUDED_IMATHLIMITS_H //---------------------------------------------------------------- // // Limitations of the basic C++ numerical data types // //---------------------------------------------------------------- #include "ImathNamespace.h" #include #include //------------------------------------------ // In Windows, min and max are macros. Yay. //------------------------------------------ #if defined _WIN32 || defined _WIN64 #ifdef min #undef min #endif #ifdef max #undef max #endif #endif IMATH_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------------------------- // // Template class limits returns information about the limits // of numerical data type T: // // min() largest possible negative value of type T // // max() largest possible positive value of type T // // smallest() smallest possible positive value of type T // (for float and double: smallest normalized // positive value) // // epsilon() smallest possible e of type T, for which // 1 + e != 1 // // isIntegral() returns true if T is an integral type // // isSigned() returns true if T is signed // // Class limits is useful to implement template classes or // functions which depend on the limits of a numerical type // which is not known in advance; for example: // // template max (T x[], int n) // { // T m = limits::min(); // // for (int i = 0; i < n; i++) // if (m < x[i]) // m = x[i]; // // return m; // } // // Class limits has been implemented for the following types: // // char, signed char, unsigned char // short, unsigned short // int, unsigned int // long, unsigned long // float // double // long double // // Class limits has only static member functions, all of which // are implemented as inlines. No objects of type limits are // ever created. // //----------------------------------------------------------------- template struct limits { static T min(); static T max(); static T smallest(); static T epsilon(); static bool isIntegral(); static bool isSigned(); }; //--------------- // Implementation //--------------- template <> struct limits { static char min() {return CHAR_MIN;} static char max() {return CHAR_MAX;} static char smallest() {return 1;} static char epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return (char) ~0 < 0;} }; template <> struct limits { static signed char min() {return SCHAR_MIN;} static signed char max() {return SCHAR_MAX;} static signed char smallest() {return 1;} static signed char epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return true;} }; template <> struct limits { static unsigned char min() {return 0;} static unsigned char max() {return UCHAR_MAX;} static unsigned char smallest() {return 1;} static unsigned char epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return false;} }; template <> struct limits { static short min() {return SHRT_MIN;} static short max() {return SHRT_MAX;} static short smallest() {return 1;} static short epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return true;} }; template <> struct limits { static unsigned short min() {return 0;} static unsigned short max() {return USHRT_MAX;} static unsigned short smallest() {return 1;} static unsigned short epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return false;} }; template <> struct limits { static int min() {return INT_MIN;} static int max() {return INT_MAX;} static int smallest() {return 1;} static int epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return true;} }; template <> struct limits { static unsigned int min() {return 0;} static unsigned int max() {return UINT_MAX;} static unsigned int smallest() {return 1;} static unsigned int epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return false;} }; template <> struct limits { static long min() {return LONG_MIN;} static long max() {return LONG_MAX;} static long smallest() {return 1;} static long epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return true;} }; template <> struct limits { static unsigned long min() {return 0;} static unsigned long max() {return ULONG_MAX;} static unsigned long smallest() {return 1;} static unsigned long epsilon() {return 1;} static bool isIntegral() {return true;} static bool isSigned() {return false;} }; template <> struct limits { static float min() {return -FLT_MAX;} static float max() {return FLT_MAX;} static float smallest() {return FLT_MIN;} static float epsilon() {return FLT_EPSILON;} static bool isIntegral() {return false;} static bool isSigned() {return true;} }; template <> struct limits { static double min() {return -DBL_MAX;} static double max() {return DBL_MAX;} static double smallest() {return DBL_MIN;} static double epsilon() {return DBL_EPSILON;} static bool isIntegral() {return false;} static bool isSigned() {return true;} }; template <> struct limits { static long double min() {return -LDBL_MAX;} static long double max() {return LDBL_MAX;} static long double smallest() {return LDBL_MIN;} static long double epsilon() {return LDBL_EPSILON;} static bool isIntegral() {return false;} static bool isSigned() {return true;} }; IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHLIMITS_H openexr-2.5.7/IlmBase/Imath/ImathLine.h000066400000000000000000000113661406177042200176200ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHLINE_H #define INCLUDED_IMATHLINE_H //------------------------------------- // // A 3D line class template // //------------------------------------- #include "ImathVec.h" #include "ImathLimits.h" #include "ImathMatrix.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Line3 { public: Vec3 pos; Vec3 dir; //------------------------------------------------------------- // Constructors - default is normalized units along direction //------------------------------------------------------------- Line3() {} Line3(const Vec3& point1, const Vec3& point2); //------------------ // State Query/Set //------------------ void set(const Vec3& point1, const Vec3& point2); //------- // F(t) //------- Vec3 operator() (T parameter) const; //--------- // Query //--------- T distanceTo(const Vec3& point) const; T distanceTo(const Line3& line) const; Vec3 closestPointTo(const Vec3& point) const; Vec3 closestPointTo(const Line3& line) const; }; //-------------------- // Convenient typedefs //-------------------- typedef Line3 Line3f; typedef Line3 Line3d; //--------------- // Implementation //--------------- template inline Line3::Line3(const Vec3 &p0, const Vec3 &p1) { set(p0,p1); } template inline void Line3::set(const Vec3 &p0, const Vec3 &p1) { pos = p0; dir = p1-p0; dir.normalize(); } template inline Vec3 Line3::operator()(T parameter) const { return pos + dir * parameter; } template inline T Line3::distanceTo(const Vec3& point) const { return (closestPointTo(point)-point).length(); } template inline Vec3 Line3::closestPointTo(const Vec3& point) const { return ((point - pos) ^ dir) * dir + pos; } template inline T Line3::distanceTo(const Line3& line) const { T d = (dir % line.dir) ^ (line.pos - pos); return (d >= 0)? d: -d; } template inline Vec3 Line3::closestPointTo(const Line3& line) const { // Assumes the lines are normalized Vec3 posLpos = pos - line.pos ; T c = dir ^ posLpos; T a = line.dir ^ dir; T f = line.dir ^ posLpos ; T num = c - a * f; T denom = a*a - 1; T absDenom = ((denom >= 0)? denom: -denom); if (absDenom < 1) { T absNum = ((num >= 0)? num: -num); if (absNum >= absDenom * limits::max()) return pos; } return pos + dir * (num / denom); } template std::ostream& operator<< (std::ostream &o, const Line3 &line) { return o << "(" << line.pos << ", " << line.dir << ")"; } template inline Line3 operator * (const Line3 &line, const Matrix44 &M) { return Line3( line.pos * M, (line.pos + line.dir) * M ); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHLINE_H openexr-2.5.7/IlmBase/Imath/ImathLineAlgo.h000066400000000000000000000172701406177042200204230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHLINEALGO_H #define INCLUDED_IMATHLINEALGO_H //------------------------------------------------------------------ // // This file contains algorithms applied to or in conjunction // with lines (Imath::Line). These algorithms may require // more headers to compile. The assumption made is that these // functions are called much less often than the basic line // functions or these functions require more support classes // // Contains: // // bool closestPoints(const Line& line1, // const Line& line2, // Vec3& point1, // Vec3& point2) // // bool intersect( const Line3 &line, // const Vec3 &v0, // const Vec3 &v1, // const Vec3 &v2, // Vec3 &pt, // Vec3 &barycentric, // bool &front) // // V3f // closestVertex(const Vec3 &v0, // const Vec3 &v1, // const Vec3 &v2, // const Line3 &l) // // V3f // rotatePoint(const Vec3 p, Line3 l, float angle) // //------------------------------------------------------------------ #include "ImathLine.h" #include "ImathVecAlgo.h" #include "ImathFun.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template bool closestPoints (const Line3& line1, const Line3& line2, Vec3& point1, Vec3& point2) { // // Compute point1 and point2 such that point1 is on line1, point2 // is on line2 and the distance between point1 and point2 is minimal. // This function returns true if point1 and point2 can be computed, // or false if line1 and line2 are parallel or nearly parallel. // This function assumes that line1.dir and line2.dir are normalized. // Vec3 w = line1.pos - line2.pos; T d1w = line1.dir ^ w; T d2w = line2.dir ^ w; T d1d2 = line1.dir ^ line2.dir; T n1 = d1d2 * d2w - d1w; T n2 = d2w - d1d2 * d1w; T d = 1 - d1d2 * d1d2; T absD = abs (d); if ((absD > 1) || (abs (n1) < limits::max() * absD && abs (n2) < limits::max() * absD)) { point1 = line1 (n1 / d); point2 = line2 (n2 / d); return true; } else { return false; } } template bool intersect (const Line3 &line, const Vec3 &v0, const Vec3 &v1, const Vec3 &v2, Vec3 &pt, Vec3 &barycentric, bool &front) { // // Given a line and a triangle (v0, v1, v2), the intersect() function // finds the intersection of the line and the plane that contains the // triangle. // // If the intersection point cannot be computed, either because the // line and the triangle's plane are nearly parallel or because the // triangle's area is very small, intersect() returns false. // // If the intersection point is outside the triangle, intersect // returns false. // // If the intersection point, pt, is inside the triangle, intersect() // computes a front-facing flag and the barycentric coordinates of // the intersection point, and returns true. // // The front-facing flag is true if the dot product of the triangle's // normal, (v2-v1)%(v1-v0), and the line's direction is negative. // // The barycentric coordinates have the following property: // // pt = v0 * barycentric.x + v1 * barycentric.y + v2 * barycentric.z // Vec3 edge0 = v1 - v0; Vec3 edge1 = v2 - v1; Vec3 normal = edge1 % edge0; T l = normal.length(); if (l != 0) normal /= l; else return false; // zero-area triangle // // d is the distance of line.pos from the plane that contains the triangle. // The intersection point is at line.pos + (d/nd) * line.dir. // T d = normal ^ (v0 - line.pos); T nd = normal ^ line.dir; if (abs (nd) > 1 || abs (d) < limits::max() * abs (nd)) pt = line (d / nd); else return false; // line and plane are nearly parallel // // Compute the barycentric coordinates of the intersection point. // The intersection is inside the triangle if all three barycentric // coordinates are between zero and one. // { Vec3 en = edge0.normalized(); Vec3 a = pt - v0; Vec3 b = v2 - v0; Vec3 c = (a - en * (en ^ a)); Vec3 d = (b - en * (en ^ b)); T e = c ^ d; T f = d ^ d; if (e >= 0 && e <= f) barycentric.z = e / f; else return false; // outside } { Vec3 en = edge1.normalized(); Vec3 a = pt - v1; Vec3 b = v0 - v1; Vec3 c = (a - en * (en ^ a)); Vec3 d = (b - en * (en ^ b)); T e = c ^ d; T f = d ^ d; if (e >= 0 && e <= f) barycentric.x = e / f; else return false; // outside } barycentric.y = 1 - barycentric.x - barycentric.z; if (barycentric.y < 0) return false; // outside front = ((line.dir ^ normal) < 0); return true; } template Vec3 closestVertex (const Vec3 &v0, const Vec3 &v1, const Vec3 &v2, const Line3 &l) { Vec3 nearest = v0; T neardot = (v0 - l.closestPointTo(v0)).length2(); T tmp = (v1 - l.closestPointTo(v1)).length2(); if (tmp < neardot) { neardot = tmp; nearest = v1; } tmp = (v2 - l.closestPointTo(v2)).length2(); if (tmp < neardot) { neardot = tmp; nearest = v2; } return nearest; } template Vec3 rotatePoint (const Vec3 p, Line3 l, T angle) { // // Rotate the point p around the line l by the given angle. // // // Form a coordinate frame with . The rotation is the in xy // plane. // Vec3 q = l.closestPointTo(p); Vec3 x = p - q; T radius = x.length(); x.normalize(); Vec3 y = (x % l.dir).normalize(); T cosangle = Math::cos(angle); T sinangle = Math::sin(angle); Vec3 r = q + x * radius * cosangle + y * radius * sinangle; return r; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHLINEALGO_H openexr-2.5.7/IlmBase/Imath/ImathMath.h000066400000000000000000000162631406177042200176230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHMATH_H #define INCLUDED_IMATHMATH_H //---------------------------------------------------------------------------- // // ImathMath.h // // This file contains template functions which call the double- // precision math functions defined in math.h (sin(), sqrt(), // exp() etc.), with specializations that call the faster // single-precision versions (sinf(), sqrtf(), expf() etc.) // when appropriate. // // Example: // // double x = Math::sqrt (3); // calls ::sqrt(double); // float y = Math::sqrt (3); // calls ::sqrtf(float); // // When would I want to use this? // // You may be writing a template which needs to call some function // defined in math.h, for example to extract a square root, but you // don't know whether to call the single- or the double-precision // version of this function (sqrt() or sqrtf()): // // template // T // glorp (T x) // { // return sqrt (x + 1); // should call ::sqrtf(float) // } // if x is a float, but we // // don't know if it is // // Using the templates in this file, you can make sure that // the appropriate version of the math function is called: // // template // T // glorp (T x, T y) // { // return Math::sqrt (x + 1); // calls ::sqrtf(float) if x // } // is a float, ::sqrt(double) // // otherwise // //---------------------------------------------------------------------------- #include "ImathPlatform.h" #include "ImathLimits.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template struct Math { static T acos (T x) {return ::acos (double(x));} static T asin (T x) {return ::asin (double(x));} static T atan (T x) {return ::atan (double(x));} static T atan2 (T x, T y) {return ::atan2 (double(x), double(y));} static T cos (T x) {return ::cos (double(x));} static T sin (T x) {return ::sin (double(x));} static T tan (T x) {return ::tan (double(x));} static T cosh (T x) {return ::cosh (double(x));} static T sinh (T x) {return ::sinh (double(x));} static T tanh (T x) {return ::tanh (double(x));} static T exp (T x) {return ::exp (double(x));} static T log (T x) {return ::log (double(x));} static T log10 (T x) {return ::log10 (double(x));} static T modf (T x, T *iptr) { double ival; T rval( ::modf (double(x),&ival)); *iptr = ival; return rval; } static T pow (T x, T y) {return ::pow (double(x), double(y));} static T sqrt (T x) {return ::sqrt (double(x));} static T ceil (T x) {return ::ceil (double(x));} static T fabs (T x) {return ::fabs (double(x));} static T floor (T x) {return ::floor (double(x));} static T fmod (T x, T y) {return ::fmod (double(x), double(y));} static T hypot (T x, T y) {return ::hypot (double(x), double(y));} }; template <> struct Math { static float acos (float x) {return ::acosf (x);} static float asin (float x) {return ::asinf (x);} static float atan (float x) {return ::atanf (x);} static float atan2 (float x, float y) {return ::atan2f (x, y);} static float cos (float x) {return ::cosf (x);} static float sin (float x) {return ::sinf (x);} static float tan (float x) {return ::tanf (x);} static float cosh (float x) {return ::coshf (x);} static float sinh (float x) {return ::sinhf (x);} static float tanh (float x) {return ::tanhf (x);} static float exp (float x) {return ::expf (x);} static float log (float x) {return ::logf (x);} static float log10 (float x) {return ::log10f (x);} static float modf (float x, float *y) {return ::modff (x, y);} static float pow (float x, float y) {return ::powf (x, y);} static float sqrt (float x) {return ::sqrtf (x);} static float ceil (float x) {return ::ceilf (x);} static float fabs (float x) {return ::fabsf (x);} static float floor (float x) {return ::floorf (x);} static float fmod (float x, float y) {return ::fmodf (x, y);} #if !defined(_MSC_VER) static float hypot (float x, float y) {return ::hypotf (x, y);} #else static float hypot (float x, float y) {return ::sqrtf(x*x + y*y);} #endif }; //-------------------------------------------------------------------------- // Don Hatch's version of sin(x)/x, which is accurate for very small x. // Returns 1 for x == 0. //-------------------------------------------------------------------------- template inline T sinx_over_x (T x) { if (x * x < limits::epsilon()) return T (1); else return Math::sin (x) / x; } //-------------------------------------------------------------------------- // Compare two numbers and test if they are "approximately equal": // // equalWithAbsError (x1, x2, e) // // Returns true if x1 is the same as x2 with an absolute error of // no more than e, // // abs (x1 - x2) <= e // // equalWithRelError (x1, x2, e) // // Returns true if x1 is the same as x2 with an relative error of // no more than e, // // abs (x1 - x2) <= e * x1 // //-------------------------------------------------------------------------- template inline bool equalWithAbsError (T x1, T x2, T e) { return ((x1 > x2)? x1 - x2: x2 - x1) <= e; } template inline bool equalWithRelError (T x1, T x2, T e) { return ((x1 > x2)? x1 - x2: x2 - x1) <= e * ((x1 > 0)? x1: -x1); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHMATH_H openexr-2.5.7/IlmBase/Imath/ImathMatrix.h000066400000000000000000003104121406177042200201670ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHMATRIX_H #define INCLUDED_IMATHMATRIX_H //---------------------------------------------------------------- // // 2D (3x3) and 3D (4x4) transformation matrix templates. // //---------------------------------------------------------------- #include "ImathPlatform.h" #include "ImathFun.h" #include "ImathExc.h" #include "ImathVec.h" #include "ImathShear.h" #include "ImathNamespace.h" #include #include #include #include #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER // suppress exception specification warnings #pragma warning(disable:4290) #endif IMATH_INTERNAL_NAMESPACE_HEADER_ENTER enum Uninitialized {UNINITIALIZED}; template class Matrix22 { public: //------------------- // Access to elements //------------------- T x[2][2]; T * operator [] (int i); const T * operator [] (int i) const; //------------- // Constructors //------------- Matrix22 (Uninitialized) {} Matrix22 (); // 1 0 // 0 1 Matrix22 (T a); // a a // a a Matrix22 (const T a[2][2]); // a[0][0] a[0][1] // a[1][0] a[1][1] Matrix22 (T a, T b, T c, T d); // a b // c d //-------------------------------- // Copy constructor and assignment //-------------------------------- Matrix22 (const Matrix22 &v); template explicit Matrix22 (const Matrix22 &v); const Matrix22 & operator = (const Matrix22 &v); const Matrix22 & operator = (T a); //------------ // Destructor //------------ ~Matrix22 () = default; //---------------------- // Compatibility with Sb //---------------------- T * getValue (); const T * getValue () const; template void getValue (Matrix22 &v) const; template Matrix22 & setValue (const Matrix22 &v); template Matrix22 & setTheMatrix (const Matrix22 &v); //--------- // Identity //--------- void makeIdentity(); //--------- // Equality //--------- bool operator == (const Matrix22 &v) const; bool operator != (const Matrix22 &v) const; //----------------------------------------------------------------------- // Compare two matrices and test if they are "approximately equal": // // equalWithAbsError (m, e) // // Returns true if the coefficients of this and m are the same with // an absolute error of no more than e, i.e., for all i, j // // abs (this[i][j] - m[i][j]) <= e // // equalWithRelError (m, e) // // Returns true if the coefficients of this and m are the same with // a relative error of no more than e, i.e., for all i, j // // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) //----------------------------------------------------------------------- bool equalWithAbsError (const Matrix22 &v, T e) const; bool equalWithRelError (const Matrix22 &v, T e) const; //------------------------ // Component-wise addition //------------------------ const Matrix22 & operator += (const Matrix22 &v); const Matrix22 & operator += (T a); Matrix22 operator + (const Matrix22 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Matrix22 & operator -= (const Matrix22 &v); const Matrix22 & operator -= (T a); Matrix22 operator - (const Matrix22 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Matrix22 operator - () const; const Matrix22 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Matrix22 & operator *= (T a); Matrix22 operator * (T a) const; //----------------------------------- // Matrix-times-matrix multiplication //----------------------------------- const Matrix22 & operator *= (const Matrix22 &v); Matrix22 operator * (const Matrix22 &v) const; //----------------------------------------------------------------- // Vector-times-matrix multiplication; see also the "operator *" // functions defined below. // // m.multDirMatrix(src,dst) multiplies src by the matrix m. //----------------------------------------------------------------- template void multDirMatrix(const Vec2 &src, Vec2 &dst) const; //------------------------ // Component-wise division //------------------------ const Matrix22 & operator /= (T a); Matrix22 operator / (T a) const; //------------------ // Transposed matrix //------------------ const Matrix22 & transpose (); Matrix22 transposed () const; //------------------------------------------------------------ // Inverse matrix: If singExc is false, inverting a singular // matrix produces an identity matrix. If singExc is true, // inverting a singular matrix throws a SingMatrixExc. // // inverse() and invert() invert matrices using determinants. // //------------------------------------------------------------ const Matrix22 & invert (bool singExc = false); Matrix22 inverse (bool singExc = false) const; //------------ // Determinant //------------ T determinant() const; //----------------------------------------- // Set matrix to rotation by r (in radians) //----------------------------------------- template const Matrix22 & setRotation (S r); //----------------------------- // Rotate the given matrix by r //----------------------------- template const Matrix22 & rotate (S r); //-------------------------------------------- // Set matrix to scale by given uniform factor //-------------------------------------------- const Matrix22 & setScale (T s); //------------------------------------ // Set matrix to scale by given vector //------------------------------------ template const Matrix22 & setScale (const Vec2 &s); //---------------------- // Scale the matrix by s //---------------------- template const Matrix22 & scale (const Vec2 &s); //-------------------------------------------------------- // Number of the row and column dimensions, since // Matrix22 is a square matrix. //-------------------------------------------------------- static unsigned int dimensions() {return 2;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} typedef T BaseType; typedef Vec2 BaseVecType; private: template struct isSameType { enum {value = 0}; }; template struct isSameType { enum {value = 1}; }; }; template class Matrix33 { public: //------------------- // Access to elements //------------------- T x[3][3]; T * operator [] (int i); const T * operator [] (int i) const; //------------- // Constructors //------------- Matrix33 (Uninitialized) {} Matrix33 (); // 1 0 0 // 0 1 0 // 0 0 1 Matrix33 (T a); // a a a // a a a // a a a Matrix33 (const T a[3][3]); // a[0][0] a[0][1] a[0][2] // a[1][0] a[1][1] a[1][2] // a[2][0] a[2][1] a[2][2] Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i); // a b c // d e f // g h i //-------------------------------- // Copy constructor and assignment //-------------------------------- Matrix33 (const Matrix33 &v); template explicit Matrix33 (const Matrix33 &v); const Matrix33 & operator = (const Matrix33 &v); const Matrix33 & operator = (T a); //------------ // Destructor //------------ ~Matrix33 () = default; //---------------------- // Compatibility with Sb //---------------------- T * getValue (); const T * getValue () const; template void getValue (Matrix33 &v) const; template Matrix33 & setValue (const Matrix33 &v); template Matrix33 & setTheMatrix (const Matrix33 &v); //--------- // Identity //--------- void makeIdentity(); //--------- // Equality //--------- bool operator == (const Matrix33 &v) const; bool operator != (const Matrix33 &v) const; //----------------------------------------------------------------------- // Compare two matrices and test if they are "approximately equal": // // equalWithAbsError (m, e) // // Returns true if the coefficients of this and m are the same with // an absolute error of no more than e, i.e., for all i, j // // abs (this[i][j] - m[i][j]) <= e // // equalWithRelError (m, e) // // Returns true if the coefficients of this and m are the same with // a relative error of no more than e, i.e., for all i, j // // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) //----------------------------------------------------------------------- bool equalWithAbsError (const Matrix33 &v, T e) const; bool equalWithRelError (const Matrix33 &v, T e) const; //------------------------ // Component-wise addition //------------------------ const Matrix33 & operator += (const Matrix33 &v); const Matrix33 & operator += (T a); Matrix33 operator + (const Matrix33 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Matrix33 & operator -= (const Matrix33 &v); const Matrix33 & operator -= (T a); Matrix33 operator - (const Matrix33 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Matrix33 operator - () const; const Matrix33 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Matrix33 & operator *= (T a); Matrix33 operator * (T a) const; //----------------------------------- // Matrix-times-matrix multiplication //----------------------------------- const Matrix33 & operator *= (const Matrix33 &v); Matrix33 operator * (const Matrix33 &v) const; //----------------------------------------------------------------- // Vector-times-matrix multiplication; see also the "operator *" // functions defined below. // // m.multVecMatrix(src,dst) implements a homogeneous transformation // by computing Vec3 (src.x, src.y, 1) * m and dividing by the // result's third element. // // m.multDirMatrix(src,dst) multiplies src by the upper left 2x2 // submatrix, ignoring the rest of matrix m. //----------------------------------------------------------------- template void multVecMatrix(const Vec2 &src, Vec2 &dst) const; template void multDirMatrix(const Vec2 &src, Vec2 &dst) const; //------------------------ // Component-wise division //------------------------ const Matrix33 & operator /= (T a); Matrix33 operator / (T a) const; //------------------ // Transposed matrix //------------------ const Matrix33 & transpose (); Matrix33 transposed () const; //------------------------------------------------------------ // Inverse matrix: If singExc is false, inverting a singular // matrix produces an identity matrix. If singExc is true, // inverting a singular matrix throws a SingMatrixExc. // // inverse() and invert() invert matrices using determinants; // gjInverse() and gjInvert() use the Gauss-Jordan method. // // inverse() and invert() are significantly faster than // gjInverse() and gjInvert(), but the results may be slightly // less accurate. // //------------------------------------------------------------ const Matrix33 & invert (bool singExc = false); Matrix33 inverse (bool singExc = false) const; const Matrix33 & gjInvert (bool singExc = false); Matrix33 gjInverse (bool singExc = false) const; //------------------------------------------------ // Calculate the matrix minor of the (r,c) element //------------------------------------------------ T minorOf (const int r, const int c) const; //--------------------------------------------------- // Build a minor using the specified rows and columns //--------------------------------------------------- T fastMinor (const int r0, const int r1, const int c0, const int c1) const; //------------ // Determinant //------------ T determinant() const; //----------------------------------------- // Set matrix to rotation by r (in radians) //----------------------------------------- template const Matrix33 & setRotation (S r); //----------------------------- // Rotate the given matrix by r //----------------------------- template const Matrix33 & rotate (S r); //-------------------------------------------- // Set matrix to scale by given uniform factor //-------------------------------------------- const Matrix33 & setScale (T s); //------------------------------------ // Set matrix to scale by given vector //------------------------------------ template const Matrix33 & setScale (const Vec2 &s); //---------------------- // Scale the matrix by s //---------------------- template const Matrix33 & scale (const Vec2 &s); //------------------------------------------ // Set matrix to translation by given vector //------------------------------------------ template const Matrix33 & setTranslation (const Vec2 &t); //----------------------------- // Return translation component //----------------------------- Vec2 translation () const; //-------------------------- // Translate the matrix by t //-------------------------- template const Matrix33 & translate (const Vec2 &t); //----------------------------------------------------------- // Set matrix to shear x for each y coord. by given factor xy //----------------------------------------------------------- template const Matrix33 & setShear (const S &h); //------------------------------------------------------------- // Set matrix to shear x for each y coord. by given factor h[0] // and to shear y for each x coord. by given factor h[1] //------------------------------------------------------------- template const Matrix33 & setShear (const Vec2 &h); //----------------------------------------------------------- // Shear the matrix in x for each y coord. by given factor xy //----------------------------------------------------------- template const Matrix33 & shear (const S &xy); //----------------------------------------------------------- // Shear the matrix in x for each y coord. by given factor xy // and shear y for each x coord. by given factor yx //----------------------------------------------------------- template const Matrix33 & shear (const Vec2 &h); //-------------------------------------------------------- // Number of the row and column dimensions, since // Matrix33 is a square matrix. //-------------------------------------------------------- static unsigned int dimensions() {return 3;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} typedef T BaseType; typedef Vec3 BaseVecType; private: template struct isSameType { enum {value = 0}; }; template struct isSameType { enum {value = 1}; }; }; template class Matrix44 { public: //------------------- // Access to elements //------------------- T x[4][4]; T * operator [] (int i); const T * operator [] (int i) const; //------------- // Constructors //------------- Matrix44 (Uninitialized) {} Matrix44 (); // 1 0 0 0 // 0 1 0 0 // 0 0 1 0 // 0 0 0 1 Matrix44 (T a); // a a a a // a a a a // a a a a // a a a a Matrix44 (const T a[4][4]) ; // a[0][0] a[0][1] a[0][2] a[0][3] // a[1][0] a[1][1] a[1][2] a[1][3] // a[2][0] a[2][1] a[2][2] a[2][3] // a[3][0] a[3][1] a[3][2] a[3][3] Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p); // a b c d // e f g h // i j k l // m n o p Matrix44 (Matrix33 r, Vec3 t); // r r r 0 // r r r 0 // r r r 0 // t t t 1 //------------ // Destructor //------------ ~Matrix44 () = default; //-------------------------------- // Copy constructor and assignment //-------------------------------- Matrix44 (const Matrix44 &v); template explicit Matrix44 (const Matrix44 &v); const Matrix44 & operator = (const Matrix44 &v); const Matrix44 & operator = (T a); //---------------------- // Compatibility with Sb //---------------------- T * getValue (); const T * getValue () const; template void getValue (Matrix44 &v) const; template Matrix44 & setValue (const Matrix44 &v); template Matrix44 & setTheMatrix (const Matrix44 &v); //--------- // Identity //--------- void makeIdentity(); //--------- // Equality //--------- bool operator == (const Matrix44 &v) const; bool operator != (const Matrix44 &v) const; //----------------------------------------------------------------------- // Compare two matrices and test if they are "approximately equal": // // equalWithAbsError (m, e) // // Returns true if the coefficients of this and m are the same with // an absolute error of no more than e, i.e., for all i, j // // abs (this[i][j] - m[i][j]) <= e // // equalWithRelError (m, e) // // Returns true if the coefficients of this and m are the same with // a relative error of no more than e, i.e., for all i, j // // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) //----------------------------------------------------------------------- bool equalWithAbsError (const Matrix44 &v, T e) const; bool equalWithRelError (const Matrix44 &v, T e) const; //------------------------ // Component-wise addition //------------------------ const Matrix44 & operator += (const Matrix44 &v); const Matrix44 & operator += (T a); Matrix44 operator + (const Matrix44 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Matrix44 & operator -= (const Matrix44 &v); const Matrix44 & operator -= (T a); Matrix44 operator - (const Matrix44 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Matrix44 operator - () const; const Matrix44 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Matrix44 & operator *= (T a); Matrix44 operator * (T a) const; //----------------------------------- // Matrix-times-matrix multiplication //----------------------------------- const Matrix44 & operator *= (const Matrix44 &v); Matrix44 operator * (const Matrix44 &v) const; static void multiply (const Matrix44 &a, // assumes that const Matrix44 &b, // &a != &c and Matrix44 &c); // &b != &c. //----------------------------------------------------------------- // Vector-times-matrix multiplication; see also the "operator *" // functions defined below. // // m.multVecMatrix(src,dst) implements a homogeneous transformation // by computing Vec4 (src.x, src.y, src.z, 1) * m and dividing by // the result's third element. // // m.multDirMatrix(src,dst) multiplies src by the upper left 3x3 // submatrix, ignoring the rest of matrix m. //----------------------------------------------------------------- template void multVecMatrix(const Vec3 &src, Vec3 &dst) const; template void multDirMatrix(const Vec3 &src, Vec3 &dst) const; //------------------------ // Component-wise division //------------------------ const Matrix44 & operator /= (T a); Matrix44 operator / (T a) const; //------------------ // Transposed matrix //------------------ const Matrix44 & transpose (); Matrix44 transposed () const; //------------------------------------------------------------ // Inverse matrix: If singExc is false, inverting a singular // matrix produces an identity matrix. If singExc is true, // inverting a singular matrix throws a SingMatrixExc. // // inverse() and invert() invert matrices using determinants; // gjInverse() and gjInvert() use the Gauss-Jordan method. // // inverse() and invert() are significantly faster than // gjInverse() and gjInvert(), but the results may be slightly // less accurate. // //------------------------------------------------------------ const Matrix44 & invert (bool singExc = false); Matrix44 inverse (bool singExc = false) const; const Matrix44 & gjInvert (bool singExc = false); Matrix44 gjInverse (bool singExc = false) const; //------------------------------------------------ // Calculate the matrix minor of the (r,c) element //------------------------------------------------ T minorOf (const int r, const int c) const; //--------------------------------------------------- // Build a minor using the specified rows and columns //--------------------------------------------------- T fastMinor (const int r0, const int r1, const int r2, const int c0, const int c1, const int c2) const; //------------ // Determinant //------------ T determinant() const; //-------------------------------------------------------- // Set matrix to rotation by XYZ euler angles (in radians) //-------------------------------------------------------- template const Matrix44 & setEulerAngles (const Vec3& r); //-------------------------------------------------------- // Set matrix to rotation around given axis by given angle //-------------------------------------------------------- template const Matrix44 & setAxisAngle (const Vec3& ax, S ang); //------------------------------------------- // Rotate the matrix by XYZ euler angles in r //------------------------------------------- template const Matrix44 & rotate (const Vec3 &r); //-------------------------------------------- // Set matrix to scale by given uniform factor //-------------------------------------------- const Matrix44 & setScale (T s); //------------------------------------ // Set matrix to scale by given vector //------------------------------------ template const Matrix44 & setScale (const Vec3 &s); //---------------------- // Scale the matrix by s //---------------------- template const Matrix44 & scale (const Vec3 &s); //------------------------------------------ // Set matrix to translation by given vector //------------------------------------------ template const Matrix44 & setTranslation (const Vec3 &t); //----------------------------- // Return translation component //----------------------------- const Vec3 translation () const; //-------------------------- // Translate the matrix by t //-------------------------- template const Matrix44 & translate (const Vec3 &t); //------------------------------------------------------------- // Set matrix to shear by given vector h. The resulting matrix // will shear x for each y coord. by a factor of h[0] ; // will shear x for each z coord. by a factor of h[1] ; // will shear y for each z coord. by a factor of h[2] . //------------------------------------------------------------- template const Matrix44 & setShear (const Vec3 &h); //------------------------------------------------------------ // Set matrix to shear by given factors. The resulting matrix // will shear x for each y coord. by a factor of h.xy ; // will shear x for each z coord. by a factor of h.xz ; // will shear y for each z coord. by a factor of h.yz ; // will shear y for each x coord. by a factor of h.yx ; // will shear z for each x coord. by a factor of h.zx ; // will shear z for each y coord. by a factor of h.zy . //------------------------------------------------------------ template const Matrix44 & setShear (const Shear6 &h); //-------------------------------------------------------- // Shear the matrix by given vector. The composed matrix // will be * , where the shear matrix ... // will shear x for each y coord. by a factor of h[0] ; // will shear x for each z coord. by a factor of h[1] ; // will shear y for each z coord. by a factor of h[2] . //-------------------------------------------------------- template const Matrix44 & shear (const Vec3 &h); //-------------------------------------------------------- // Number of the row and column dimensions, since // Matrix44 is a square matrix. //-------------------------------------------------------- static unsigned int dimensions() {return 4;} //------------------------------------------------------------ // Shear the matrix by the given factors. The composed matrix // will be * , where the shear matrix ... // will shear x for each y coord. by a factor of h.xy ; // will shear x for each z coord. by a factor of h.xz ; // will shear y for each z coord. by a factor of h.yz ; // will shear y for each x coord. by a factor of h.yx ; // will shear z for each x coord. by a factor of h.zx ; // will shear z for each y coord. by a factor of h.zy . //------------------------------------------------------------ template const Matrix44 & shear (const Shear6 &h); //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} typedef T BaseType; typedef Vec4 BaseVecType; private: template struct isSameType { enum {value = 0}; }; template struct isSameType { enum {value = 1}; }; }; //-------------- // Stream output //-------------- template std::ostream & operator << (std::ostream & s, const Matrix22 &m); template std::ostream & operator << (std::ostream & s, const Matrix33 &m); template std::ostream & operator << (std::ostream & s, const Matrix44 &m); //--------------------------------------------- // Vector-times-matrix multiplication operators //--------------------------------------------- template const Vec2 & operator *= (Vec2 &v, const Matrix22 &m); template Vec2 operator * (const Vec2 &v, const Matrix22 &m); template const Vec2 & operator *= (Vec2 &v, const Matrix33 &m); template Vec2 operator * (const Vec2 &v, const Matrix33 &m); template const Vec3 & operator *= (Vec3 &v, const Matrix33 &m); template Vec3 operator * (const Vec3 &v, const Matrix33 &m); template const Vec3 & operator *= (Vec3 &v, const Matrix44 &m); template Vec3 operator * (const Vec3 &v, const Matrix44 &m); template const Vec4 & operator *= (Vec4 &v, const Matrix44 &m); template Vec4 operator * (const Vec4 &v, const Matrix44 &m); //------------------------- // Typedefs for convenience //------------------------- typedef Matrix22 M22f; typedef Matrix22 M22d; typedef Matrix33 M33f; typedef Matrix33 M33d; typedef Matrix44 M44f; typedef Matrix44 M44d; //--------------------------- // Implementation of Matrix22 //--------------------------- template inline T * Matrix22::operator [] (int i) { return x[i]; } template inline const T * Matrix22::operator [] (int i) const { return x[i]; } template inline Matrix22::Matrix22 () { x[0][0] = 1; x[0][1] = 0; x[1][0] = 0; x[1][1] = 1; } template inline Matrix22::Matrix22 (T a) { x[0][0] = a; x[0][1] = a; x[1][0] = a; x[1][1] = a; } template inline Matrix22::Matrix22 (const T a[2][2]) { memcpy (x, a, sizeof (x)); } template inline Matrix22::Matrix22 (T a, T b, T c, T d) { x[0][0] = a; x[0][1] = b; x[1][0] = c; x[1][1] = d; } template inline Matrix22::Matrix22 (const Matrix22 &v) { memcpy (x, v.x, sizeof (x)); } template template inline Matrix22::Matrix22 (const Matrix22 &v) { x[0][0] = T (v.x[0][0]); x[0][1] = T (v.x[0][1]); x[1][0] = T (v.x[1][0]); x[1][1] = T (v.x[1][1]); } template inline const Matrix22 & Matrix22::operator = (const Matrix22 &v) { memcpy (x, v.x, sizeof (x)); return *this; } template inline const Matrix22 & Matrix22::operator = (T a) { x[0][0] = a; x[0][1] = a; x[1][0] = a; x[1][1] = a; return *this; } template inline T * Matrix22::getValue () { return (T *) &x[0][0]; } template inline const T * Matrix22::getValue () const { return (const T *) &x[0][0]; } template template inline void Matrix22::getValue (Matrix22 &v) const { if (isSameType::value) { memcpy (v.x, x, sizeof (x)); } else { v.x[0][0] = x[0][0]; v.x[0][1] = x[0][1]; v.x[1][0] = x[1][0]; v.x[1][1] = x[1][1]; } } template template inline Matrix22 & Matrix22::setValue (const Matrix22 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; } return *this; } template template inline Matrix22 & Matrix22::setTheMatrix (const Matrix22 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; } return *this; } template inline void Matrix22::makeIdentity() { x[0][0] = 1; x[0][1] = 0; x[1][0] = 0; x[1][1] = 1; } template bool Matrix22::operator == (const Matrix22 &v) const { return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[1][0] == v.x[1][0] && x[1][1] == v.x[1][1]; } template bool Matrix22::operator != (const Matrix22 &v) const { return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[1][0] != v.x[1][0] || x[1][1] != v.x[1][1]; } template bool Matrix22::equalWithAbsError (const Matrix22 &m, T e) const { for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i][j], m[i][j], e)) return false; return true; } template bool Matrix22::equalWithRelError (const Matrix22 &m, T e) const { for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i][j], m[i][j], e)) return false; return true; } template const Matrix22 & Matrix22::operator += (const Matrix22 &v) { x[0][0] += v.x[0][0]; x[0][1] += v.x[0][1]; x[1][0] += v.x[1][0]; x[1][1] += v.x[1][1]; return *this; } template const Matrix22 & Matrix22::operator += (T a) { x[0][0] += a; x[0][1] += a; x[1][0] += a; x[1][1] += a; return *this; } template Matrix22 Matrix22::operator + (const Matrix22 &v) const { return Matrix22 (x[0][0] + v.x[0][0], x[0][1] + v.x[0][1], x[1][0] + v.x[1][0], x[1][1] + v.x[1][1]); } template const Matrix22 & Matrix22::operator -= (const Matrix22 &v) { x[0][0] -= v.x[0][0]; x[0][1] -= v.x[0][1]; x[1][0] -= v.x[1][0]; x[1][1] -= v.x[1][1]; return *this; } template const Matrix22 & Matrix22::operator -= (T a) { x[0][0] -= a; x[0][1] -= a; x[1][0] -= a; x[1][1] -= a; return *this; } template Matrix22 Matrix22::operator - (const Matrix22 &v) const { return Matrix22 (x[0][0] - v.x[0][0], x[0][1] - v.x[0][1], x[1][0] - v.x[1][0], x[1][1] - v.x[1][1]); } template Matrix22 Matrix22::operator - () const { return Matrix22 (-x[0][0], -x[0][1], -x[1][0], -x[1][1]); } template const Matrix22 & Matrix22::negate () { x[0][0] = -x[0][0]; x[0][1] = -x[0][1]; x[1][0] = -x[1][0]; x[1][1] = -x[1][1]; return *this; } template const Matrix22 & Matrix22::operator *= (T a) { x[0][0] *= a; x[0][1] *= a; x[1][0] *= a; x[1][1] *= a; return *this; } template Matrix22 Matrix22::operator * (T a) const { return Matrix22 (x[0][0] * a, x[0][1] * a, x[1][0] * a, x[1][1] * a); } template inline Matrix22 operator * (T a, const Matrix22 &v) { return v * a; } template const Matrix22 & Matrix22::operator *= (const Matrix22 &v) { Matrix22 tmp (T (0)); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) tmp.x[i][j] += x[i][k] * v.x[k][j]; *this = tmp; return *this; } template Matrix22 Matrix22::operator * (const Matrix22 &v) const { Matrix22 tmp (T (0)); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) tmp.x[i][j] += x[i][k] * v.x[k][j]; return tmp; } template template void Matrix22::multDirMatrix(const Vec2 &src, Vec2 &dst) const { S a, b; a = src[0] * x[0][0] + src[1] * x[1][0]; b = src[0] * x[0][1] + src[1] * x[1][1]; dst.x = a; dst.y = b; } template const Matrix22 & Matrix22::operator /= (T a) { x[0][0] /= a; x[0][1] /= a; x[1][0] /= a; x[1][1] /= a; return *this; } template Matrix22 Matrix22::operator / (T a) const { return Matrix22 (x[0][0] / a, x[0][1] / a, x[1][0] / a, x[1][1] / a); } template const Matrix22 & Matrix22::transpose () { Matrix22 tmp (x[0][0], x[1][0], x[0][1], x[1][1]); *this = tmp; return *this; } template Matrix22 Matrix22::transposed () const { return Matrix22 (x[0][0], x[1][0], x[0][1], x[1][1]); } template const Matrix22 & Matrix22::invert (bool singExc) { *this = inverse (singExc); return *this; } template Matrix22 Matrix22::inverse (bool singExc) const { Matrix22 s ( x[1][1], -x[0][1], -x[1][0], x[0][0]); T r = x[0][0] * x[1][1] - x[1][0] * x[0][1]; if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1) { for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { s[i][j] /= r; } } } else { T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / limits::smallest(); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j])) { s[i][j] /= r; } else { if (singExc) throw SingMatrixExc ("Cannot invert " "singular matrix."); return Matrix22(); } } } } return s; } template inline T Matrix22::determinant () const { return x[0][0] * x[1][1] - x[1][0] * x[0][1]; } template template const Matrix22 & Matrix22::setRotation (S r) { S cos_r, sin_r; cos_r = Math::cos (r); sin_r = Math::sin (r); x[0][0] = cos_r; x[0][1] = sin_r; x[1][0] = -sin_r; x[1][1] = cos_r; return *this; } template template const Matrix22 & Matrix22::rotate (S r) { *this *= Matrix22().setRotation (r); return *this; } template const Matrix22 & Matrix22::setScale (T s) { x[0][0] = s; x[0][1] = static_cast(0); x[1][0] = static_cast(0); x[1][1] = s; return *this; } template template const Matrix22 & Matrix22::setScale (const Vec2 &s) { x[0][0] = s[0]; x[0][1] = static_cast(0); x[1][0] = static_cast(0); x[1][1] = s[1]; return *this; } template template const Matrix22 & Matrix22::scale (const Vec2 &s) { x[0][0] *= s[0]; x[0][1] *= s[0]; x[1][0] *= s[1]; x[1][1] *= s[1]; return *this; } //--------------------------- // Implementation of Matrix33 //--------------------------- template inline T * Matrix33::operator [] (int i) { return x[i]; } template inline const T * Matrix33::operator [] (int i) const { return x[i]; } template inline Matrix33::Matrix33 () { memset (x, 0, sizeof (x)); x[0][0] = 1; x[1][1] = 1; x[2][2] = 1; } template inline Matrix33::Matrix33 (T a) { x[0][0] = a; x[0][1] = a; x[0][2] = a; x[1][0] = a; x[1][1] = a; x[1][2] = a; x[2][0] = a; x[2][1] = a; x[2][2] = a; } template inline Matrix33::Matrix33 (const T a[3][3]) { memcpy (x, a, sizeof (x)); } template inline Matrix33::Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i) { x[0][0] = a; x[0][1] = b; x[0][2] = c; x[1][0] = d; x[1][1] = e; x[1][2] = f; x[2][0] = g; x[2][1] = h; x[2][2] = i; } template inline Matrix33::Matrix33 (const Matrix33 &v) { memcpy (x, v.x, sizeof (x)); } template template inline Matrix33::Matrix33 (const Matrix33 &v) { x[0][0] = T (v.x[0][0]); x[0][1] = T (v.x[0][1]); x[0][2] = T (v.x[0][2]); x[1][0] = T (v.x[1][0]); x[1][1] = T (v.x[1][1]); x[1][2] = T (v.x[1][2]); x[2][0] = T (v.x[2][0]); x[2][1] = T (v.x[2][1]); x[2][2] = T (v.x[2][2]); } template inline const Matrix33 & Matrix33::operator = (const Matrix33 &v) { memcpy (x, v.x, sizeof (x)); return *this; } template inline const Matrix33 & Matrix33::operator = (T a) { x[0][0] = a; x[0][1] = a; x[0][2] = a; x[1][0] = a; x[1][1] = a; x[1][2] = a; x[2][0] = a; x[2][1] = a; x[2][2] = a; return *this; } template inline T * Matrix33::getValue () { return (T *) &x[0][0]; } template inline const T * Matrix33::getValue () const { return (const T *) &x[0][0]; } template template inline void Matrix33::getValue (Matrix33 &v) const { if (isSameType::value) { memcpy (v.x, x, sizeof (x)); } else { v.x[0][0] = x[0][0]; v.x[0][1] = x[0][1]; v.x[0][2] = x[0][2]; v.x[1][0] = x[1][0]; v.x[1][1] = x[1][1]; v.x[1][2] = x[1][2]; v.x[2][0] = x[2][0]; v.x[2][1] = x[2][1]; v.x[2][2] = x[2][2]; } } template template inline Matrix33 & Matrix33::setValue (const Matrix33 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; } return *this; } template template inline Matrix33 & Matrix33::setTheMatrix (const Matrix33 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; } return *this; } template inline void Matrix33::makeIdentity() { memset (x, 0, sizeof (x)); x[0][0] = 1; x[1][1] = 1; x[2][2] = 1; } template bool Matrix33::operator == (const Matrix33 &v) const { return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[0][2] == v.x[0][2] && x[1][0] == v.x[1][0] && x[1][1] == v.x[1][1] && x[1][2] == v.x[1][2] && x[2][0] == v.x[2][0] && x[2][1] == v.x[2][1] && x[2][2] == v.x[2][2]; } template bool Matrix33::operator != (const Matrix33 &v) const { return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[0][2] != v.x[0][2] || x[1][0] != v.x[1][0] || x[1][1] != v.x[1][1] || x[1][2] != v.x[1][2] || x[2][0] != v.x[2][0] || x[2][1] != v.x[2][1] || x[2][2] != v.x[2][2]; } template bool Matrix33::equalWithAbsError (const Matrix33 &m, T e) const { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i][j], m[i][j], e)) return false; return true; } template bool Matrix33::equalWithRelError (const Matrix33 &m, T e) const { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i][j], m[i][j], e)) return false; return true; } template const Matrix33 & Matrix33::operator += (const Matrix33 &v) { x[0][0] += v.x[0][0]; x[0][1] += v.x[0][1]; x[0][2] += v.x[0][2]; x[1][0] += v.x[1][0]; x[1][1] += v.x[1][1]; x[1][2] += v.x[1][2]; x[2][0] += v.x[2][0]; x[2][1] += v.x[2][1]; x[2][2] += v.x[2][2]; return *this; } template const Matrix33 & Matrix33::operator += (T a) { x[0][0] += a; x[0][1] += a; x[0][2] += a; x[1][0] += a; x[1][1] += a; x[1][2] += a; x[2][0] += a; x[2][1] += a; x[2][2] += a; return *this; } template Matrix33 Matrix33::operator + (const Matrix33 &v) const { return Matrix33 (x[0][0] + v.x[0][0], x[0][1] + v.x[0][1], x[0][2] + v.x[0][2], x[1][0] + v.x[1][0], x[1][1] + v.x[1][1], x[1][2] + v.x[1][2], x[2][0] + v.x[2][0], x[2][1] + v.x[2][1], x[2][2] + v.x[2][2]); } template const Matrix33 & Matrix33::operator -= (const Matrix33 &v) { x[0][0] -= v.x[0][0]; x[0][1] -= v.x[0][1]; x[0][2] -= v.x[0][2]; x[1][0] -= v.x[1][0]; x[1][1] -= v.x[1][1]; x[1][2] -= v.x[1][2]; x[2][0] -= v.x[2][0]; x[2][1] -= v.x[2][1]; x[2][2] -= v.x[2][2]; return *this; } template const Matrix33 & Matrix33::operator -= (T a) { x[0][0] -= a; x[0][1] -= a; x[0][2] -= a; x[1][0] -= a; x[1][1] -= a; x[1][2] -= a; x[2][0] -= a; x[2][1] -= a; x[2][2] -= a; return *this; } template Matrix33 Matrix33::operator - (const Matrix33 &v) const { return Matrix33 (x[0][0] - v.x[0][0], x[0][1] - v.x[0][1], x[0][2] - v.x[0][2], x[1][0] - v.x[1][0], x[1][1] - v.x[1][1], x[1][2] - v.x[1][2], x[2][0] - v.x[2][0], x[2][1] - v.x[2][1], x[2][2] - v.x[2][2]); } template Matrix33 Matrix33::operator - () const { return Matrix33 (-x[0][0], -x[0][1], -x[0][2], -x[1][0], -x[1][1], -x[1][2], -x[2][0], -x[2][1], -x[2][2]); } template const Matrix33 & Matrix33::negate () { x[0][0] = -x[0][0]; x[0][1] = -x[0][1]; x[0][2] = -x[0][2]; x[1][0] = -x[1][0]; x[1][1] = -x[1][1]; x[1][2] = -x[1][2]; x[2][0] = -x[2][0]; x[2][1] = -x[2][1]; x[2][2] = -x[2][2]; return *this; } template const Matrix33 & Matrix33::operator *= (T a) { x[0][0] *= a; x[0][1] *= a; x[0][2] *= a; x[1][0] *= a; x[1][1] *= a; x[1][2] *= a; x[2][0] *= a; x[2][1] *= a; x[2][2] *= a; return *this; } template Matrix33 Matrix33::operator * (T a) const { return Matrix33 (x[0][0] * a, x[0][1] * a, x[0][2] * a, x[1][0] * a, x[1][1] * a, x[1][2] * a, x[2][0] * a, x[2][1] * a, x[2][2] * a); } template inline Matrix33 operator * (T a, const Matrix33 &v) { return v * a; } template const Matrix33 & Matrix33::operator *= (const Matrix33 &v) { Matrix33 tmp (T (0)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) tmp.x[i][j] += x[i][k] * v.x[k][j]; *this = tmp; return *this; } template Matrix33 Matrix33::operator * (const Matrix33 &v) const { Matrix33 tmp (T (0)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) tmp.x[i][j] += x[i][k] * v.x[k][j]; return tmp; } template template void Matrix33::multVecMatrix(const Vec2 &src, Vec2 &dst) const { S a, b, w; a = src[0] * x[0][0] + src[1] * x[1][0] + x[2][0]; b = src[0] * x[0][1] + src[1] * x[1][1] + x[2][1]; w = src[0] * x[0][2] + src[1] * x[1][2] + x[2][2]; dst.x = a / w; dst.y = b / w; } template template void Matrix33::multDirMatrix(const Vec2 &src, Vec2 &dst) const { S a, b; a = src[0] * x[0][0] + src[1] * x[1][0]; b = src[0] * x[0][1] + src[1] * x[1][1]; dst.x = a; dst.y = b; } template const Matrix33 & Matrix33::operator /= (T a) { x[0][0] /= a; x[0][1] /= a; x[0][2] /= a; x[1][0] /= a; x[1][1] /= a; x[1][2] /= a; x[2][0] /= a; x[2][1] /= a; x[2][2] /= a; return *this; } template Matrix33 Matrix33::operator / (T a) const { return Matrix33 (x[0][0] / a, x[0][1] / a, x[0][2] / a, x[1][0] / a, x[1][1] / a, x[1][2] / a, x[2][0] / a, x[2][1] / a, x[2][2] / a); } template const Matrix33 & Matrix33::transpose () { Matrix33 tmp (x[0][0], x[1][0], x[2][0], x[0][1], x[1][1], x[2][1], x[0][2], x[1][2], x[2][2]); *this = tmp; return *this; } template Matrix33 Matrix33::transposed () const { return Matrix33 (x[0][0], x[1][0], x[2][0], x[0][1], x[1][1], x[2][1], x[0][2], x[1][2], x[2][2]); } template const Matrix33 & Matrix33::gjInvert (bool singExc) { *this = gjInverse (singExc); return *this; } template Matrix33 Matrix33::gjInverse (bool singExc) const { int i, j, k; Matrix33 s; Matrix33 t (*this); // Forward elimination for (i = 0; i < 2 ; i++) { int pivot = i; T pivotsize = t[i][i]; if (pivotsize < 0) pivotsize = -pivotsize; for (j = i + 1; j < 3; j++) { T tmp = t[j][i]; if (tmp < 0) tmp = -tmp; if (tmp > pivotsize) { pivot = j; pivotsize = tmp; } } if (pivotsize == 0) { if (singExc) throw ::IMATH_INTERNAL_NAMESPACE::SingMatrixExc ("Cannot invert singular matrix."); return Matrix33(); } if (pivot != i) { for (j = 0; j < 3; j++) { T tmp; tmp = t[i][j]; t[i][j] = t[pivot][j]; t[pivot][j] = tmp; tmp = s[i][j]; s[i][j] = s[pivot][j]; s[pivot][j] = tmp; } } for (j = i + 1; j < 3; j++) { T f = t[j][i] / t[i][i]; for (k = 0; k < 3; k++) { t[j][k] -= f * t[i][k]; s[j][k] -= f * s[i][k]; } } } // Backward substitution for (i = 2; i >= 0; --i) { T f; if ((f = t[i][i]) == 0) { if (singExc) throw ::IMATH_INTERNAL_NAMESPACE::SingMatrixExc ("Cannot invert singular matrix."); return Matrix33(); } for (j = 0; j < 3; j++) { t[i][j] /= f; s[i][j] /= f; } for (j = 0; j < i; j++) { f = t[j][i]; for (k = 0; k < 3; k++) { t[j][k] -= f * t[i][k]; s[j][k] -= f * s[i][k]; } } } return s; } template const Matrix33 & Matrix33::invert (bool singExc) { *this = inverse (singExc); return *this; } template Matrix33 Matrix33::inverse (bool singExc) const { if (x[0][2] != 0 || x[1][2] != 0 || x[2][2] != 1) { Matrix33 s (x[1][1] * x[2][2] - x[2][1] * x[1][2], x[2][1] * x[0][2] - x[0][1] * x[2][2], x[0][1] * x[1][2] - x[1][1] * x[0][2], x[2][0] * x[1][2] - x[1][0] * x[2][2], x[0][0] * x[2][2] - x[2][0] * x[0][2], x[1][0] * x[0][2] - x[0][0] * x[1][2], x[1][0] * x[2][1] - x[2][0] * x[1][1], x[2][0] * x[0][1] - x[0][0] * x[2][1], x[0][0] * x[1][1] - x[1][0] * x[0][1]); T r = x[0][0] * s[0][0] + x[0][1] * s[1][0] + x[0][2] * s[2][0]; if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { s[i][j] /= r; } } } else { T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / limits::smallest(); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j])) { s[i][j] /= r; } else { if (singExc) throw SingMatrixExc ("Cannot invert " "singular matrix."); return Matrix33(); } } } } return s; } else { Matrix33 s ( x[1][1], -x[0][1], 0, -x[1][0], x[0][0], 0, 0, 0, 1); T r = x[0][0] * x[1][1] - x[1][0] * x[0][1]; if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1) { for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { s[i][j] /= r; } } } else { T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / limits::smallest(); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j])) { s[i][j] /= r; } else { if (singExc) throw SingMatrixExc ("Cannot invert " "singular matrix."); return Matrix33(); } } } } s[2][0] = -x[2][0] * s[0][0] - x[2][1] * s[1][0]; s[2][1] = -x[2][0] * s[0][1] - x[2][1] * s[1][1]; return s; } } template inline T Matrix33::minorOf (const int r, const int c) const { int r0 = 0 + (r < 1 ? 1 : 0); int r1 = 1 + (r < 2 ? 1 : 0); int c0 = 0 + (c < 1 ? 1 : 0); int c1 = 1 + (c < 2 ? 1 : 0); return x[r0][c0]*x[r1][c1] - x[r1][c0]*x[r0][c1]; } template inline T Matrix33::fastMinor( const int r0, const int r1, const int c0, const int c1) const { return x[r0][c0]*x[r1][c1] - x[r0][c1]*x[r1][c0]; } template inline T Matrix33::determinant () const { return x[0][0]*(x[1][1]*x[2][2] - x[1][2]*x[2][1]) + x[0][1]*(x[1][2]*x[2][0] - x[1][0]*x[2][2]) + x[0][2]*(x[1][0]*x[2][1] - x[1][1]*x[2][0]); } template template const Matrix33 & Matrix33::setRotation (S r) { S cos_r, sin_r; cos_r = Math::cos (r); sin_r = Math::sin (r); x[0][0] = cos_r; x[0][1] = sin_r; x[0][2] = 0; x[1][0] = -sin_r; x[1][1] = cos_r; x[1][2] = 0; x[2][0] = 0; x[2][1] = 0; x[2][2] = 1; return *this; } template template const Matrix33 & Matrix33::rotate (S r) { *this *= Matrix33().setRotation (r); return *this; } template const Matrix33 & Matrix33::setScale (T s) { memset (x, 0, sizeof (x)); x[0][0] = s; x[1][1] = s; x[2][2] = 1; return *this; } template template const Matrix33 & Matrix33::setScale (const Vec2 &s) { memset (x, 0, sizeof (x)); x[0][0] = s[0]; x[1][1] = s[1]; x[2][2] = 1; return *this; } template template const Matrix33 & Matrix33::scale (const Vec2 &s) { x[0][0] *= s[0]; x[0][1] *= s[0]; x[0][2] *= s[0]; x[1][0] *= s[1]; x[1][1] *= s[1]; x[1][2] *= s[1]; return *this; } template template const Matrix33 & Matrix33::setTranslation (const Vec2 &t) { x[0][0] = 1; x[0][1] = 0; x[0][2] = 0; x[1][0] = 0; x[1][1] = 1; x[1][2] = 0; x[2][0] = t[0]; x[2][1] = t[1]; x[2][2] = 1; return *this; } template inline Vec2 Matrix33::translation () const { return Vec2 (x[2][0], x[2][1]); } template template const Matrix33 & Matrix33::translate (const Vec2 &t) { x[2][0] += t[0] * x[0][0] + t[1] * x[1][0]; x[2][1] += t[0] * x[0][1] + t[1] * x[1][1]; x[2][2] += t[0] * x[0][2] + t[1] * x[1][2]; return *this; } template template const Matrix33 & Matrix33::setShear (const S &xy) { x[0][0] = 1; x[0][1] = 0; x[0][2] = 0; x[1][0] = xy; x[1][1] = 1; x[1][2] = 0; x[2][0] = 0; x[2][1] = 0; x[2][2] = 1; return *this; } template template const Matrix33 & Matrix33::setShear (const Vec2 &h) { x[0][0] = 1; x[0][1] = h[1]; x[0][2] = 0; x[1][0] = h[0]; x[1][1] = 1; x[1][2] = 0; x[2][0] = 0; x[2][1] = 0; x[2][2] = 1; return *this; } template template const Matrix33 & Matrix33::shear (const S &xy) { // // In this case, we don't need a temp. copy of the matrix // because we never use a value on the RHS after we've // changed it on the LHS. // x[1][0] += xy * x[0][0]; x[1][1] += xy * x[0][1]; x[1][2] += xy * x[0][2]; return *this; } template template const Matrix33 & Matrix33::shear (const Vec2 &h) { Matrix33 P (*this); x[0][0] = P[0][0] + h[1] * P[1][0]; x[0][1] = P[0][1] + h[1] * P[1][1]; x[0][2] = P[0][2] + h[1] * P[1][2]; x[1][0] = P[1][0] + h[0] * P[0][0]; x[1][1] = P[1][1] + h[0] * P[0][1]; x[1][2] = P[1][2] + h[0] * P[0][2]; return *this; } //--------------------------- // Implementation of Matrix44 //--------------------------- template inline T * Matrix44::operator [] (int i) { return x[i]; } template inline const T * Matrix44::operator [] (int i) const { return x[i]; } template inline Matrix44::Matrix44 () { memset (x, 0, sizeof (x)); x[0][0] = 1; x[1][1] = 1; x[2][2] = 1; x[3][3] = 1; } template inline Matrix44::Matrix44 (T a) { x[0][0] = a; x[0][1] = a; x[0][2] = a; x[0][3] = a; x[1][0] = a; x[1][1] = a; x[1][2] = a; x[1][3] = a; x[2][0] = a; x[2][1] = a; x[2][2] = a; x[2][3] = a; x[3][0] = a; x[3][1] = a; x[3][2] = a; x[3][3] = a; } template inline Matrix44::Matrix44 (const T a[4][4]) { memcpy (x, a, sizeof (x)); } template inline Matrix44::Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p) { x[0][0] = a; x[0][1] = b; x[0][2] = c; x[0][3] = d; x[1][0] = e; x[1][1] = f; x[1][2] = g; x[1][3] = h; x[2][0] = i; x[2][1] = j; x[2][2] = k; x[2][3] = l; x[3][0] = m; x[3][1] = n; x[3][2] = o; x[3][3] = p; } template inline Matrix44::Matrix44 (Matrix33 r, Vec3 t) { x[0][0] = r[0][0]; x[0][1] = r[0][1]; x[0][2] = r[0][2]; x[0][3] = 0; x[1][0] = r[1][0]; x[1][1] = r[1][1]; x[1][2] = r[1][2]; x[1][3] = 0; x[2][0] = r[2][0]; x[2][1] = r[2][1]; x[2][2] = r[2][2]; x[2][3] = 0; x[3][0] = t[0]; x[3][1] = t[1]; x[3][2] = t[2]; x[3][3] = 1; } template inline Matrix44::Matrix44 (const Matrix44 &v) { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[0][3] = v.x[0][3]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[1][3] = v.x[1][3]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; x[2][3] = v.x[2][3]; x[3][0] = v.x[3][0]; x[3][1] = v.x[3][1]; x[3][2] = v.x[3][2]; x[3][3] = v.x[3][3]; } template template inline Matrix44::Matrix44 (const Matrix44 &v) { x[0][0] = T (v.x[0][0]); x[0][1] = T (v.x[0][1]); x[0][2] = T (v.x[0][2]); x[0][3] = T (v.x[0][3]); x[1][0] = T (v.x[1][0]); x[1][1] = T (v.x[1][1]); x[1][2] = T (v.x[1][2]); x[1][3] = T (v.x[1][3]); x[2][0] = T (v.x[2][0]); x[2][1] = T (v.x[2][1]); x[2][2] = T (v.x[2][2]); x[2][3] = T (v.x[2][3]); x[3][0] = T (v.x[3][0]); x[3][1] = T (v.x[3][1]); x[3][2] = T (v.x[3][2]); x[3][3] = T (v.x[3][3]); } template inline const Matrix44 & Matrix44::operator = (const Matrix44 &v) { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[0][3] = v.x[0][3]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[1][3] = v.x[1][3]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; x[2][3] = v.x[2][3]; x[3][0] = v.x[3][0]; x[3][1] = v.x[3][1]; x[3][2] = v.x[3][2]; x[3][3] = v.x[3][3]; return *this; } template inline const Matrix44 & Matrix44::operator = (T a) { x[0][0] = a; x[0][1] = a; x[0][2] = a; x[0][3] = a; x[1][0] = a; x[1][1] = a; x[1][2] = a; x[1][3] = a; x[2][0] = a; x[2][1] = a; x[2][2] = a; x[2][3] = a; x[3][0] = a; x[3][1] = a; x[3][2] = a; x[3][3] = a; return *this; } template inline T * Matrix44::getValue () { return (T *) &x[0][0]; } template inline const T * Matrix44::getValue () const { return (const T *) &x[0][0]; } template template inline void Matrix44::getValue (Matrix44 &v) const { if (isSameType::value) { memcpy (v.x, x, sizeof (x)); } else { v.x[0][0] = x[0][0]; v.x[0][1] = x[0][1]; v.x[0][2] = x[0][2]; v.x[0][3] = x[0][3]; v.x[1][0] = x[1][0]; v.x[1][1] = x[1][1]; v.x[1][2] = x[1][2]; v.x[1][3] = x[1][3]; v.x[2][0] = x[2][0]; v.x[2][1] = x[2][1]; v.x[2][2] = x[2][2]; v.x[2][3] = x[2][3]; v.x[3][0] = x[3][0]; v.x[3][1] = x[3][1]; v.x[3][2] = x[3][2]; v.x[3][3] = x[3][3]; } } template template inline Matrix44 & Matrix44::setValue (const Matrix44 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[0][3] = v.x[0][3]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[1][3] = v.x[1][3]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; x[2][3] = v.x[2][3]; x[3][0] = v.x[3][0]; x[3][1] = v.x[3][1]; x[3][2] = v.x[3][2]; x[3][3] = v.x[3][3]; } return *this; } template template inline Matrix44 & Matrix44::setTheMatrix (const Matrix44 &v) { if (isSameType::value) { memcpy (x, v.x, sizeof (x)); } else { x[0][0] = v.x[0][0]; x[0][1] = v.x[0][1]; x[0][2] = v.x[0][2]; x[0][3] = v.x[0][3]; x[1][0] = v.x[1][0]; x[1][1] = v.x[1][1]; x[1][2] = v.x[1][2]; x[1][3] = v.x[1][3]; x[2][0] = v.x[2][0]; x[2][1] = v.x[2][1]; x[2][2] = v.x[2][2]; x[2][3] = v.x[2][3]; x[3][0] = v.x[3][0]; x[3][1] = v.x[3][1]; x[3][2] = v.x[3][2]; x[3][3] = v.x[3][3]; } return *this; } template inline void Matrix44::makeIdentity() { memset (x, 0, sizeof (x)); x[0][0] = 1; x[1][1] = 1; x[2][2] = 1; x[3][3] = 1; } template bool Matrix44::operator == (const Matrix44 &v) const { return x[0][0] == v.x[0][0] && x[0][1] == v.x[0][1] && x[0][2] == v.x[0][2] && x[0][3] == v.x[0][3] && x[1][0] == v.x[1][0] && x[1][1] == v.x[1][1] && x[1][2] == v.x[1][2] && x[1][3] == v.x[1][3] && x[2][0] == v.x[2][0] && x[2][1] == v.x[2][1] && x[2][2] == v.x[2][2] && x[2][3] == v.x[2][3] && x[3][0] == v.x[3][0] && x[3][1] == v.x[3][1] && x[3][2] == v.x[3][2] && x[3][3] == v.x[3][3]; } template bool Matrix44::operator != (const Matrix44 &v) const { return x[0][0] != v.x[0][0] || x[0][1] != v.x[0][1] || x[0][2] != v.x[0][2] || x[0][3] != v.x[0][3] || x[1][0] != v.x[1][0] || x[1][1] != v.x[1][1] || x[1][2] != v.x[1][2] || x[1][3] != v.x[1][3] || x[2][0] != v.x[2][0] || x[2][1] != v.x[2][1] || x[2][2] != v.x[2][2] || x[2][3] != v.x[2][3] || x[3][0] != v.x[3][0] || x[3][1] != v.x[3][1] || x[3][2] != v.x[3][2] || x[3][3] != v.x[3][3]; } template bool Matrix44::equalWithAbsError (const Matrix44 &m, T e) const { for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i][j], m[i][j], e)) return false; return true; } template bool Matrix44::equalWithRelError (const Matrix44 &m, T e) const { for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i][j], m[i][j], e)) return false; return true; } template const Matrix44 & Matrix44::operator += (const Matrix44 &v) { x[0][0] += v.x[0][0]; x[0][1] += v.x[0][1]; x[0][2] += v.x[0][2]; x[0][3] += v.x[0][3]; x[1][0] += v.x[1][0]; x[1][1] += v.x[1][1]; x[1][2] += v.x[1][2]; x[1][3] += v.x[1][3]; x[2][0] += v.x[2][0]; x[2][1] += v.x[2][1]; x[2][2] += v.x[2][2]; x[2][3] += v.x[2][3]; x[3][0] += v.x[3][0]; x[3][1] += v.x[3][1]; x[3][2] += v.x[3][2]; x[3][3] += v.x[3][3]; return *this; } template const Matrix44 & Matrix44::operator += (T a) { x[0][0] += a; x[0][1] += a; x[0][2] += a; x[0][3] += a; x[1][0] += a; x[1][1] += a; x[1][2] += a; x[1][3] += a; x[2][0] += a; x[2][1] += a; x[2][2] += a; x[2][3] += a; x[3][0] += a; x[3][1] += a; x[3][2] += a; x[3][3] += a; return *this; } template Matrix44 Matrix44::operator + (const Matrix44 &v) const { return Matrix44 (x[0][0] + v.x[0][0], x[0][1] + v.x[0][1], x[0][2] + v.x[0][2], x[0][3] + v.x[0][3], x[1][0] + v.x[1][0], x[1][1] + v.x[1][1], x[1][2] + v.x[1][2], x[1][3] + v.x[1][3], x[2][0] + v.x[2][0], x[2][1] + v.x[2][1], x[2][2] + v.x[2][2], x[2][3] + v.x[2][3], x[3][0] + v.x[3][0], x[3][1] + v.x[3][1], x[3][2] + v.x[3][2], x[3][3] + v.x[3][3]); } template const Matrix44 & Matrix44::operator -= (const Matrix44 &v) { x[0][0] -= v.x[0][0]; x[0][1] -= v.x[0][1]; x[0][2] -= v.x[0][2]; x[0][3] -= v.x[0][3]; x[1][0] -= v.x[1][0]; x[1][1] -= v.x[1][1]; x[1][2] -= v.x[1][2]; x[1][3] -= v.x[1][3]; x[2][0] -= v.x[2][0]; x[2][1] -= v.x[2][1]; x[2][2] -= v.x[2][2]; x[2][3] -= v.x[2][3]; x[3][0] -= v.x[3][0]; x[3][1] -= v.x[3][1]; x[3][2] -= v.x[3][2]; x[3][3] -= v.x[3][3]; return *this; } template const Matrix44 & Matrix44::operator -= (T a) { x[0][0] -= a; x[0][1] -= a; x[0][2] -= a; x[0][3] -= a; x[1][0] -= a; x[1][1] -= a; x[1][2] -= a; x[1][3] -= a; x[2][0] -= a; x[2][1] -= a; x[2][2] -= a; x[2][3] -= a; x[3][0] -= a; x[3][1] -= a; x[3][2] -= a; x[3][3] -= a; return *this; } template Matrix44 Matrix44::operator - (const Matrix44 &v) const { return Matrix44 (x[0][0] - v.x[0][0], x[0][1] - v.x[0][1], x[0][2] - v.x[0][2], x[0][3] - v.x[0][3], x[1][0] - v.x[1][0], x[1][1] - v.x[1][1], x[1][2] - v.x[1][2], x[1][3] - v.x[1][3], x[2][0] - v.x[2][0], x[2][1] - v.x[2][1], x[2][2] - v.x[2][2], x[2][3] - v.x[2][3], x[3][0] - v.x[3][0], x[3][1] - v.x[3][1], x[3][2] - v.x[3][2], x[3][3] - v.x[3][3]); } template Matrix44 Matrix44::operator - () const { return Matrix44 (-x[0][0], -x[0][1], -x[0][2], -x[0][3], -x[1][0], -x[1][1], -x[1][2], -x[1][3], -x[2][0], -x[2][1], -x[2][2], -x[2][3], -x[3][0], -x[3][1], -x[3][2], -x[3][3]); } template const Matrix44 & Matrix44::negate () { x[0][0] = -x[0][0]; x[0][1] = -x[0][1]; x[0][2] = -x[0][2]; x[0][3] = -x[0][3]; x[1][0] = -x[1][0]; x[1][1] = -x[1][1]; x[1][2] = -x[1][2]; x[1][3] = -x[1][3]; x[2][0] = -x[2][0]; x[2][1] = -x[2][1]; x[2][2] = -x[2][2]; x[2][3] = -x[2][3]; x[3][0] = -x[3][0]; x[3][1] = -x[3][1]; x[3][2] = -x[3][2]; x[3][3] = -x[3][3]; return *this; } template const Matrix44 & Matrix44::operator *= (T a) { x[0][0] *= a; x[0][1] *= a; x[0][2] *= a; x[0][3] *= a; x[1][0] *= a; x[1][1] *= a; x[1][2] *= a; x[1][3] *= a; x[2][0] *= a; x[2][1] *= a; x[2][2] *= a; x[2][3] *= a; x[3][0] *= a; x[3][1] *= a; x[3][2] *= a; x[3][3] *= a; return *this; } template Matrix44 Matrix44::operator * (T a) const { return Matrix44 (x[0][0] * a, x[0][1] * a, x[0][2] * a, x[0][3] * a, x[1][0] * a, x[1][1] * a, x[1][2] * a, x[1][3] * a, x[2][0] * a, x[2][1] * a, x[2][2] * a, x[2][3] * a, x[3][0] * a, x[3][1] * a, x[3][2] * a, x[3][3] * a); } template inline Matrix44 operator * (T a, const Matrix44 &v) { return v * a; } template inline const Matrix44 & Matrix44::operator *= (const Matrix44 &v) { Matrix44 tmp (T (0)); multiply (*this, v, tmp); *this = tmp; return *this; } template inline Matrix44 Matrix44::operator * (const Matrix44 &v) const { Matrix44 tmp (T (0)); multiply (*this, v, tmp); return tmp; } template void Matrix44::multiply (const Matrix44 &a, const Matrix44 &b, Matrix44 &c) { const T * IMATH_RESTRICT ap = &a.x[0][0]; const T * IMATH_RESTRICT bp = &b.x[0][0]; T * IMATH_RESTRICT cp = &c.x[0][0]; T a0, a1, a2, a3; a0 = ap[0]; a1 = ap[1]; a2 = ap[2]; a3 = ap[3]; cp[0] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; cp[1] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; cp[2] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; cp[3] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; a0 = ap[4]; a1 = ap[5]; a2 = ap[6]; a3 = ap[7]; cp[4] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; cp[5] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; cp[6] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; cp[7] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; a0 = ap[8]; a1 = ap[9]; a2 = ap[10]; a3 = ap[11]; cp[8] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; cp[9] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; cp[10] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; cp[11] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; a0 = ap[12]; a1 = ap[13]; a2 = ap[14]; a3 = ap[15]; cp[12] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; cp[13] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; cp[14] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; cp[15] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; } template template void Matrix44::multVecMatrix(const Vec3 &src, Vec3 &dst) const { S a, b, c, w; a = src[0] * x[0][0] + src[1] * x[1][0] + src[2] * x[2][0] + x[3][0]; b = src[0] * x[0][1] + src[1] * x[1][1] + src[2] * x[2][1] + x[3][1]; c = src[0] * x[0][2] + src[1] * x[1][2] + src[2] * x[2][2] + x[3][2]; w = src[0] * x[0][3] + src[1] * x[1][3] + src[2] * x[2][3] + x[3][3]; dst.x = a / w; dst.y = b / w; dst.z = c / w; } template template void Matrix44::multDirMatrix(const Vec3 &src, Vec3 &dst) const { S a, b, c; a = src[0] * x[0][0] + src[1] * x[1][0] + src[2] * x[2][0]; b = src[0] * x[0][1] + src[1] * x[1][1] + src[2] * x[2][1]; c = src[0] * x[0][2] + src[1] * x[1][2] + src[2] * x[2][2]; dst.x = a; dst.y = b; dst.z = c; } template const Matrix44 & Matrix44::operator /= (T a) { x[0][0] /= a; x[0][1] /= a; x[0][2] /= a; x[0][3] /= a; x[1][0] /= a; x[1][1] /= a; x[1][2] /= a; x[1][3] /= a; x[2][0] /= a; x[2][1] /= a; x[2][2] /= a; x[2][3] /= a; x[3][0] /= a; x[3][1] /= a; x[3][2] /= a; x[3][3] /= a; return *this; } template Matrix44 Matrix44::operator / (T a) const { return Matrix44 (x[0][0] / a, x[0][1] / a, x[0][2] / a, x[0][3] / a, x[1][0] / a, x[1][1] / a, x[1][2] / a, x[1][3] / a, x[2][0] / a, x[2][1] / a, x[2][2] / a, x[2][3] / a, x[3][0] / a, x[3][1] / a, x[3][2] / a, x[3][3] / a); } template const Matrix44 & Matrix44::transpose () { Matrix44 tmp (x[0][0], x[1][0], x[2][0], x[3][0], x[0][1], x[1][1], x[2][1], x[3][1], x[0][2], x[1][2], x[2][2], x[3][2], x[0][3], x[1][3], x[2][3], x[3][3]); *this = tmp; return *this; } template Matrix44 Matrix44::transposed () const { return Matrix44 (x[0][0], x[1][0], x[2][0], x[3][0], x[0][1], x[1][1], x[2][1], x[3][1], x[0][2], x[1][2], x[2][2], x[3][2], x[0][3], x[1][3], x[2][3], x[3][3]); } template const Matrix44 & Matrix44::gjInvert (bool singExc) { *this = gjInverse (singExc); return *this; } template Matrix44 Matrix44::gjInverse (bool singExc) const { int i, j, k; Matrix44 s; Matrix44 t (*this); // Forward elimination for (i = 0; i < 3 ; i++) { int pivot = i; T pivotsize = t[i][i]; if (pivotsize < 0) pivotsize = -pivotsize; for (j = i + 1; j < 4; j++) { T tmp = t[j][i]; if (tmp < 0) tmp = -tmp; if (tmp > pivotsize) { pivot = j; pivotsize = tmp; } } if (pivotsize == 0) { if (singExc) throw ::IMATH_INTERNAL_NAMESPACE::SingMatrixExc ("Cannot invert singular matrix."); return Matrix44(); } if (pivot != i) { for (j = 0; j < 4; j++) { T tmp; tmp = t[i][j]; t[i][j] = t[pivot][j]; t[pivot][j] = tmp; tmp = s[i][j]; s[i][j] = s[pivot][j]; s[pivot][j] = tmp; } } for (j = i + 1; j < 4; j++) { T f = t[j][i] / t[i][i]; for (k = 0; k < 4; k++) { t[j][k] -= f * t[i][k]; s[j][k] -= f * s[i][k]; } } } // Backward substitution for (i = 3; i >= 0; --i) { T f; if ((f = t[i][i]) == 0) { if (singExc) throw ::IMATH_INTERNAL_NAMESPACE::SingMatrixExc ("Cannot invert singular matrix."); return Matrix44(); } for (j = 0; j < 4; j++) { t[i][j] /= f; s[i][j] /= f; } for (j = 0; j < i; j++) { f = t[j][i]; for (k = 0; k < 4; k++) { t[j][k] -= f * t[i][k]; s[j][k] -= f * s[i][k]; } } } return s; } template const Matrix44 & Matrix44::invert (bool singExc) { *this = inverse (singExc); return *this; } template Matrix44 Matrix44::inverse (bool singExc) const { if (x[0][3] != 0 || x[1][3] != 0 || x[2][3] != 0 || x[3][3] != 1) return gjInverse(singExc); Matrix44 s (x[1][1] * x[2][2] - x[2][1] * x[1][2], x[2][1] * x[0][2] - x[0][1] * x[2][2], x[0][1] * x[1][2] - x[1][1] * x[0][2], 0, x[2][0] * x[1][2] - x[1][0] * x[2][2], x[0][0] * x[2][2] - x[2][0] * x[0][2], x[1][0] * x[0][2] - x[0][0] * x[1][2], 0, x[1][0] * x[2][1] - x[2][0] * x[1][1], x[2][0] * x[0][1] - x[0][0] * x[2][1], x[0][0] * x[1][1] - x[1][0] * x[0][1], 0, 0, 0, 0, 1); T r = x[0][0] * s[0][0] + x[0][1] * s[1][0] + x[0][2] * s[2][0]; if (IMATH_INTERNAL_NAMESPACE::abs (r) >= 1) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { s[i][j] /= r; } } } else { T mr = IMATH_INTERNAL_NAMESPACE::abs (r) / limits::smallest(); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (mr > IMATH_INTERNAL_NAMESPACE::abs (s[i][j])) { s[i][j] /= r; } else { if (singExc) throw SingMatrixExc ("Cannot invert singular matrix."); return Matrix44(); } } } } s[3][0] = -x[3][0] * s[0][0] - x[3][1] * s[1][0] - x[3][2] * s[2][0]; s[3][1] = -x[3][0] * s[0][1] - x[3][1] * s[1][1] - x[3][2] * s[2][1]; s[3][2] = -x[3][0] * s[0][2] - x[3][1] * s[1][2] - x[3][2] * s[2][2]; return s; } template inline T Matrix44::fastMinor( const int r0, const int r1, const int r2, const int c0, const int c1, const int c2) const { return x[r0][c0] * (x[r1][c1]*x[r2][c2] - x[r1][c2]*x[r2][c1]) + x[r0][c1] * (x[r1][c2]*x[r2][c0] - x[r1][c0]*x[r2][c2]) + x[r0][c2] * (x[r1][c0]*x[r2][c1] - x[r1][c1]*x[r2][c0]); } template inline T Matrix44::minorOf (const int r, const int c) const { int r0 = 0 + (r < 1 ? 1 : 0); int r1 = 1 + (r < 2 ? 1 : 0); int r2 = 2 + (r < 3 ? 1 : 0); int c0 = 0 + (c < 1 ? 1 : 0); int c1 = 1 + (c < 2 ? 1 : 0); int c2 = 2 + (c < 3 ? 1 : 0); Matrix33 working (x[r0][c0],x[r1][c0],x[r2][c0], x[r0][c1],x[r1][c1],x[r2][c1], x[r0][c2],x[r1][c2],x[r2][c2]); return working.determinant(); } template inline T Matrix44::determinant () const { T sum = (T)0; if (x[0][3] != 0.) sum -= x[0][3] * fastMinor(1,2,3,0,1,2); if (x[1][3] != 0.) sum += x[1][3] * fastMinor(0,2,3,0,1,2); if (x[2][3] != 0.) sum -= x[2][3] * fastMinor(0,1,3,0,1,2); if (x[3][3] != 0.) sum += x[3][3] * fastMinor(0,1,2,0,1,2); return sum; } template template const Matrix44 & Matrix44::setEulerAngles (const Vec3& r) { S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx; cos_rz = Math::cos (r[2]); cos_ry = Math::cos (r[1]); cos_rx = Math::cos (r[0]); sin_rz = Math::sin (r[2]); sin_ry = Math::sin (r[1]); sin_rx = Math::sin (r[0]); x[0][0] = cos_rz * cos_ry; x[0][1] = sin_rz * cos_ry; x[0][2] = -sin_ry; x[0][3] = 0; x[1][0] = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx; x[1][1] = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx; x[1][2] = cos_ry * sin_rx; x[1][3] = 0; x[2][0] = sin_rz * sin_rx + cos_rz * sin_ry * cos_rx; x[2][1] = -cos_rz * sin_rx + sin_rz * sin_ry * cos_rx; x[2][2] = cos_ry * cos_rx; x[2][3] = 0; x[3][0] = 0; x[3][1] = 0; x[3][2] = 0; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::setAxisAngle (const Vec3& axis, S angle) { Vec3 unit (axis.normalized()); S sine = Math::sin (angle); S cosine = Math::cos (angle); x[0][0] = unit[0] * unit[0] * (1 - cosine) + cosine; x[0][1] = unit[0] * unit[1] * (1 - cosine) + unit[2] * sine; x[0][2] = unit[0] * unit[2] * (1 - cosine) - unit[1] * sine; x[0][3] = 0; x[1][0] = unit[0] * unit[1] * (1 - cosine) - unit[2] * sine; x[1][1] = unit[1] * unit[1] * (1 - cosine) + cosine; x[1][2] = unit[1] * unit[2] * (1 - cosine) + unit[0] * sine; x[1][3] = 0; x[2][0] = unit[0] * unit[2] * (1 - cosine) + unit[1] * sine; x[2][1] = unit[1] * unit[2] * (1 - cosine) - unit[0] * sine; x[2][2] = unit[2] * unit[2] * (1 - cosine) + cosine; x[2][3] = 0; x[3][0] = 0; x[3][1] = 0; x[3][2] = 0; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::rotate (const Vec3 &r) { S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx; S m00, m01, m02; S m10, m11, m12; S m20, m21, m22; cos_rz = Math::cos (r[2]); cos_ry = Math::cos (r[1]); cos_rx = Math::cos (r[0]); sin_rz = Math::sin (r[2]); sin_ry = Math::sin (r[1]); sin_rx = Math::sin (r[0]); m00 = cos_rz * cos_ry; m01 = sin_rz * cos_ry; m02 = -sin_ry; m10 = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx; m11 = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx; m12 = cos_ry * sin_rx; m20 = -sin_rz * -sin_rx + cos_rz * sin_ry * cos_rx; m21 = cos_rz * -sin_rx + sin_rz * sin_ry * cos_rx; m22 = cos_ry * cos_rx; Matrix44 P (*this); x[0][0] = P[0][0] * m00 + P[1][0] * m01 + P[2][0] * m02; x[0][1] = P[0][1] * m00 + P[1][1] * m01 + P[2][1] * m02; x[0][2] = P[0][2] * m00 + P[1][2] * m01 + P[2][2] * m02; x[0][3] = P[0][3] * m00 + P[1][3] * m01 + P[2][3] * m02; x[1][0] = P[0][0] * m10 + P[1][0] * m11 + P[2][0] * m12; x[1][1] = P[0][1] * m10 + P[1][1] * m11 + P[2][1] * m12; x[1][2] = P[0][2] * m10 + P[1][2] * m11 + P[2][2] * m12; x[1][3] = P[0][3] * m10 + P[1][3] * m11 + P[2][3] * m12; x[2][0] = P[0][0] * m20 + P[1][0] * m21 + P[2][0] * m22; x[2][1] = P[0][1] * m20 + P[1][1] * m21 + P[2][1] * m22; x[2][2] = P[0][2] * m20 + P[1][2] * m21 + P[2][2] * m22; x[2][3] = P[0][3] * m20 + P[1][3] * m21 + P[2][3] * m22; return *this; } template const Matrix44 & Matrix44::setScale (T s) { memset (x, 0, sizeof (x)); x[0][0] = s; x[1][1] = s; x[2][2] = s; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::setScale (const Vec3 &s) { memset (x, 0, sizeof (x)); x[0][0] = s[0]; x[1][1] = s[1]; x[2][2] = s[2]; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::scale (const Vec3 &s) { x[0][0] *= s[0]; x[0][1] *= s[0]; x[0][2] *= s[0]; x[0][3] *= s[0]; x[1][0] *= s[1]; x[1][1] *= s[1]; x[1][2] *= s[1]; x[1][3] *= s[1]; x[2][0] *= s[2]; x[2][1] *= s[2]; x[2][2] *= s[2]; x[2][3] *= s[2]; return *this; } template template const Matrix44 & Matrix44::setTranslation (const Vec3 &t) { x[0][0] = 1; x[0][1] = 0; x[0][2] = 0; x[0][3] = 0; x[1][0] = 0; x[1][1] = 1; x[1][2] = 0; x[1][3] = 0; x[2][0] = 0; x[2][1] = 0; x[2][2] = 1; x[2][3] = 0; x[3][0] = t[0]; x[3][1] = t[1]; x[3][2] = t[2]; x[3][3] = 1; return *this; } template inline const Vec3 Matrix44::translation () const { return Vec3 (x[3][0], x[3][1], x[3][2]); } template template const Matrix44 & Matrix44::translate (const Vec3 &t) { x[3][0] += t[0] * x[0][0] + t[1] * x[1][0] + t[2] * x[2][0]; x[3][1] += t[0] * x[0][1] + t[1] * x[1][1] + t[2] * x[2][1]; x[3][2] += t[0] * x[0][2] + t[1] * x[1][2] + t[2] * x[2][2]; x[3][3] += t[0] * x[0][3] + t[1] * x[1][3] + t[2] * x[2][3]; return *this; } template template const Matrix44 & Matrix44::setShear (const Vec3 &h) { x[0][0] = 1; x[0][1] = 0; x[0][2] = 0; x[0][3] = 0; x[1][0] = h[0]; x[1][1] = 1; x[1][2] = 0; x[1][3] = 0; x[2][0] = h[1]; x[2][1] = h[2]; x[2][2] = 1; x[2][3] = 0; x[3][0] = 0; x[3][1] = 0; x[3][2] = 0; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::setShear (const Shear6 &h) { x[0][0] = 1; x[0][1] = h.yx; x[0][2] = h.zx; x[0][3] = 0; x[1][0] = h.xy; x[1][1] = 1; x[1][2] = h.zy; x[1][3] = 0; x[2][0] = h.xz; x[2][1] = h.yz; x[2][2] = 1; x[2][3] = 0; x[3][0] = 0; x[3][1] = 0; x[3][2] = 0; x[3][3] = 1; return *this; } template template const Matrix44 & Matrix44::shear (const Vec3 &h) { // // In this case, we don't need a temp. copy of the matrix // because we never use a value on the RHS after we've // changed it on the LHS. // for (int i=0; i < 4; i++) { x[2][i] += h[1] * x[0][i] + h[2] * x[1][i]; x[1][i] += h[0] * x[0][i]; } return *this; } template template const Matrix44 & Matrix44::shear (const Shear6 &h) { Matrix44 P (*this); for (int i=0; i < 4; i++) { x[0][i] = P[0][i] + h.yx * P[1][i] + h.zx * P[2][i]; x[1][i] = h.xy * P[0][i] + P[1][i] + h.zy * P[2][i]; x[2][i] = h.xz * P[0][i] + h.yz * P[1][i] + P[2][i]; } return *this; } //-------------------------------- // Implementation of stream output //-------------------------------- template std::ostream & operator << (std::ostream &s, const Matrix22 &m) { std::ios_base::fmtflags oldFlags = s.flags(); int width; if (s.flags() & std::ios_base::fixed) { s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 5; } else { s.setf (std::ios_base::scientific); s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 8; } s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << "\n" << " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << ")\n"; s.flags (oldFlags); return s; } template std::ostream & operator << (std::ostream &s, const Matrix33 &m) { std::ios_base::fmtflags oldFlags = s.flags(); int width; if (s.flags() & std::ios_base::fixed) { s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 5; } else { s.setf (std::ios_base::scientific); s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 8; } s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << " " << std::setw (width) << m[0][2] << "\n" << " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << " " << std::setw (width) << m[1][2] << "\n" << " " << std::setw (width) << m[2][0] << " " << std::setw (width) << m[2][1] << " " << std::setw (width) << m[2][2] << ")\n"; s.flags (oldFlags); return s; } template std::ostream & operator << (std::ostream &s, const Matrix44 &m) { std::ios_base::fmtflags oldFlags = s.flags(); int width; if (s.flags() & std::ios_base::fixed) { s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 5; } else { s.setf (std::ios_base::scientific); s.setf (std::ios_base::showpoint); width = static_cast(s.precision()) + 8; } s << "(" << std::setw (width) << m[0][0] << " " << std::setw (width) << m[0][1] << " " << std::setw (width) << m[0][2] << " " << std::setw (width) << m[0][3] << "\n" << " " << std::setw (width) << m[1][0] << " " << std::setw (width) << m[1][1] << " " << std::setw (width) << m[1][2] << " " << std::setw (width) << m[1][3] << "\n" << " " << std::setw (width) << m[2][0] << " " << std::setw (width) << m[2][1] << " " << std::setw (width) << m[2][2] << " " << std::setw (width) << m[2][3] << "\n" << " " << std::setw (width) << m[3][0] << " " << std::setw (width) << m[3][1] << " " << std::setw (width) << m[3][2] << " " << std::setw (width) << m[3][3] << ")\n"; s.flags (oldFlags); return s; } //--------------------------------------------------------------- // Implementation of vector-times-matrix multiplication operators //--------------------------------------------------------------- template inline const Vec2 & operator *= (Vec2 &v, const Matrix22 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0]); S y = S(v.x * m[0][1] + v.y * m[1][1]); v.x = x; v.y = y; return v; } template inline Vec2 operator * (const Vec2 &v, const Matrix22 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0]); S y = S(v.x * m[0][1] + v.y * m[1][1]); return Vec2 (x, y); } template inline const Vec2 & operator *= (Vec2 &v, const Matrix33 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + m[2][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + m[2][1]); S w = S(v.x * m[0][2] + v.y * m[1][2] + m[2][2]); v.x = x / w; v.y = y / w; return v; } template inline Vec2 operator * (const Vec2 &v, const Matrix33 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + m[2][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + m[2][1]); S w = S(v.x * m[0][2] + v.y * m[1][2] + m[2][2]); return Vec2 (x / w, y / w); } template inline const Vec3 & operator *= (Vec3 &v, const Matrix33 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2]); v.x = x; v.y = y; v.z = z; return v; } template inline Vec3 operator * (const Vec3 &v, const Matrix33 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2]); return Vec3 (x, y, z); } template inline const Vec3 & operator *= (Vec3 &v, const Matrix44 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]); S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + m[3][3]); v.x = x / w; v.y = y / w; v.z = z / w; return v; } template inline Vec3 operator * (const Vec3 &v, const Matrix44 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]); S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + m[3][3]); return Vec3 (x / w, y / w, z / w); } template inline const Vec4 & operator *= (Vec4 &v, const Matrix44 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]); S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]); v.x = x; v.y = y; v.z = z; v.w = w; return v; } template inline Vec4 operator * (const Vec4 &v, const Matrix44 &m) { S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]); S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]); S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]); S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]); return Vec4 (x, y, z, w); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHMATRIX_H openexr-2.5.7/IlmBase/Imath/ImathMatrixAlgo.cpp000066400000000000000000001237461406177042200213410ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------- // // Implementation of non-template items declared in ImathMatrixAlgo.h // //---------------------------------------------------------------------------- #include "ImathMatrixAlgo.h" #include #include #if defined(OPENEXR_DLL) #define EXPORT_CONST __declspec(dllexport) #else #define EXPORT_CONST const #endif IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER EXPORT_CONST M22f identity22f ( 1, 0, 0, 1); EXPORT_CONST M22d identity22d ( 1, 0, 0, 1); EXPORT_CONST M33f identity33f ( 1, 0, 0, 0, 1, 0, 0, 0, 1); EXPORT_CONST M33d identity33d ( 1, 0, 0, 0, 1, 0, 0, 0, 1); EXPORT_CONST M44f identity44f ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); EXPORT_CONST M44d identity44d ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); namespace { class KahanSum { public: KahanSum() : _total(0), _correction(0) {} void operator+= (const double val) { const double y = val - _correction; const double t = _total + y; _correction = (t - _total) - y; _total = t; } double get() const { return _total; } private: double _total; double _correction; }; } template M44d procrustesRotationAndTranslation (const Vec3* A, const Vec3* B, const T* weights, const size_t numPoints, const bool doScale) { if (numPoints == 0) return M44d(); // Always do the accumulation in double precision: V3d Acenter (0.0); V3d Bcenter (0.0); double weightsSum = 0.0; if (weights == 0) { for (size_t i = 0; i < numPoints; ++i) { Acenter += (V3d) A[i]; Bcenter += (V3d) B[i]; } weightsSum = (double) numPoints; } else { for (size_t i = 0; i < numPoints; ++i) { const double w = weights[i]; weightsSum += w; Acenter += w * (V3d) A[i]; Bcenter += w * (V3d) B[i]; } } if (weightsSum == 0) return M44d(); Acenter /= weightsSum; Bcenter /= weightsSum; // // Find Q such that |Q*A - B| (actually A-Acenter and B-Bcenter, weighted) // is minimized in the least squares sense. // From Golub/Van Loan, p.601 // // A,B are 3xn // Let C = B A^T (where A is 3xn and B^T is nx3, so C is 3x3) // Compute the SVD: C = U D V^T (U,V rotations, D diagonal). // Throw away the D part, and return Q = U V^T M33d C (0.0); if (weights == 0) { for (size_t i = 0; i < numPoints; ++i) C += outerProduct ((V3d) B[i] - Bcenter, (V3d) A[i] - Acenter); } else { for (size_t i = 0; i < numPoints; ++i) { const double w = weights[i]; C += outerProduct (w * ((V3d) B[i] - Bcenter), (V3d) A[i] - Acenter); } } M33d U, V; V3d S; jacobiSVD (C, U, S, V, IMATH_INTERNAL_NAMESPACE::limits::epsilon(), true); // We want Q.transposed() here since we are going to be using it in the // Imath style (multiplying vectors on the right, v' = v*A^T): const M33d Qt = V * U.transposed(); double s = 1.0; if (doScale && numPoints > 1) { // Finding a uniform scale: let us assume the Q is completely fixed // at this point (solving for both simultaneously seems much harder). // We are trying to compute (again, per Golub and van Loan) // min || s*A*Q - B ||_F // Notice that we've jammed a uniform scale in front of the Q. // Now, the Frobenius norm (the least squares norm over matrices) // has the neat property that it is equivalent to minimizing the trace // of M^T*M (see your friendly neighborhood linear algebra text for a // derivation). Thus, we can expand this out as // min tr (s*A*Q - B)^T*(s*A*Q - B) // = min tr(Q^T*A^T*s*s*A*Q) + tr(B^T*B) - 2*tr(Q^T*A^T*s*B) by linearity of the trace // = min s^2 tr(A^T*A) + tr(B^T*B) - 2*s*tr(Q^T*A^T*B) using the fact that the trace is invariant // under similarity transforms Q*M*Q^T // If we differentiate w.r.t. s and set this to 0, we get // 0 = 2*s*tr(A^T*A) - 2*tr(Q^T*A^T*B) // so // 2*s*tr(A^T*A) = 2*s*tr(Q^T*A^T*B) // s = tr(Q^T*A^T*B) / tr(A^T*A) KahanSum traceATA; if (weights == 0) { for (size_t i = 0; i < numPoints; ++i) traceATA += ((V3d) A[i] - Acenter).length2(); } else { for (size_t i = 0; i < numPoints; ++i) traceATA += ((double) weights[i]) * ((V3d) A[i] - Acenter).length2(); } KahanSum traceBATQ; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) traceBATQ += Qt[j][i] * C[i][j]; s = traceBATQ.get() / traceATA.get(); } // Q is the rotation part of what we want to return. // The entire transform is: // (translate origin to Bcenter) * Q * (translate Acenter to origin) // last first // The effect of this on a point is: // (translate origin to Bcenter) * Q * (translate Acenter to origin) * point // = (translate origin to Bcenter) * Q * (-Acenter + point) // = (translate origin to Bcenter) * (-Q*Acenter + Q*point) // = (translate origin to Bcenter) * (translate Q*Acenter to origin) * Q*point // = (translate Q*Acenter to Bcenter) * Q*point // So what we want to return is: // (translate Q*Acenter to Bcenter) * Q // // In block form, this is: // [ 1 0 0 | ] [ 0 ] [ 1 0 0 | ] [ 1 0 0 | ] [ | ] [ ] // [ 0 1 0 tb ] [ s*Q 0 ] [ 0 1 0 -ta ] = [ 0 1 0 tb ] [ s*Q -s*Q*ta ] = [ Q tb-s*Q*ta ] // [ 0 0 1 | ] [ 0 ] [ 0 0 1 | ] [ 0 0 1 | ] [ | ] [ ] // [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] // (ofc the whole thing is transposed for Imath). const V3d translate = Bcenter - s*Acenter*Qt; return M44d (s*Qt.x[0][0], s*Qt.x[0][1], s*Qt.x[0][2], T(0), s*Qt.x[1][0], s*Qt.x[1][1], s*Qt.x[1][2], T(0), s*Qt.x[2][0], s*Qt.x[2][1], s*Qt.x[2][2], T(0), translate.x, translate.y, translate.z, T(1)); } // procrustesRotationAndTranslation template M44d procrustesRotationAndTranslation (const Vec3* A, const Vec3* B, const size_t numPoints, const bool doScale) { return procrustesRotationAndTranslation (A, B, (const T*) 0, numPoints, doScale); } // procrustesRotationAndTranslation template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const size_t numPoints, const bool doScale); template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const size_t numPoints, const bool doScale); template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const double* weights, const size_t numPoints, const bool doScale); template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const float* weights, const size_t numPoints, const bool doScale); namespace { // Applies the 2x2 Jacobi rotation // [ c s 0 ] [ 1 0 0 ] [ c 0 s ] // [ -s c 0 ] or [ 0 c s ] or [ 0 1 0 ] // [ 0 0 1 ] [ 0 -s c ] [ -s 0 c ] // from the right; that is, computes // J * A // for the Jacobi rotation J and the matrix A. This is efficient because we // only need to touch exactly the 2 columns that are affected, so we never // need to explicitly construct the J matrix. template void jacobiRotateRight (IMATH_INTERNAL_NAMESPACE::Matrix33& A, const T c, const T s) { for (int i = 0; i < 3; ++i) { const T tau1 = A[i][j]; const T tau2 = A[i][k]; A[i][j] = c * tau1 - s * tau2; A[i][k] = s * tau1 + c * tau2; } } template void jacobiRotateRight (IMATH_INTERNAL_NAMESPACE::Matrix44& A, const int j, const int k, const T c, const T s) { for (int i = 0; i < 4; ++i) { const T tau1 = A[i][j]; const T tau2 = A[i][k]; A[i][j] = c * tau1 - s * tau2; A[i][k] = s * tau1 + c * tau2; } } // This routine solves the 2x2 SVD: // [ c1 s1 ] [ w x ] [ c2 s2 ] [ d1 0 ] // [ ] [ ] [ ] = [ ] // [ -s1 c1 ] [ y z ] [ -s2 c2 ] [ 0 d2 ] // where // [ w x ] // A = [ ] // [ y z ] // is the subset of A consisting of the [j,k] entries, A([j k], [j k]) in // Matlab parlance. The method is the 'USVD' algorithm described in the // following paper: // 'Computation of the Singular Value Decomposition using Mesh-Connected Processors' // by Richard P. Brent, Franklin T. Luk, and Charles Van Loan // It breaks the computation into two steps: the first symmetrizes the matrix, // and the second diagonalizes the symmetric matrix. template bool twoSidedJacobiRotation (IMATH_INTERNAL_NAMESPACE::Matrix33& A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const T tol) { // Load everything into local variables to make things easier on the // optimizer: const T w = A[j][j]; const T x = A[j][k]; const T y = A[k][j]; const T z = A[k][k]; // We will keep track of whether we're actually performing any rotations, // since if the matrix is already diagonal we'll end up with the identity // as our Jacobi rotation and we can short-circuit. bool changed = false; // The first step is to symmetrize the 2x2 matrix, // [ c s ]^T [ w x ] = [ p q ] // [ -s c ] [ y z ] [ q r ] T mu_1 = w + z; T mu_2 = x - y; T c, s; if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance) { // Note that the <= is important here c = T(1); // because we want to bypass the computation s = T(0); // of rho if mu_1 = mu_2 = 0. const T p = w; const T r = z; mu_1 = r - p; mu_2 = x + y; } else { const T rho = mu_1 / mu_2; s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function? if (rho < 0) s = -s; c = s * rho; mu_1 = s * (x + y) + c * (z - w); // = r - p mu_2 = T(2) * (c * x - s * z); // = 2*q changed = true; } // The second stage diagonalizes, // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ] // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ] T c_2, s_2; if (std::abs(mu_2) <= tol*std::abs(mu_1)) { c_2 = T(1); s_2 = T(0); } else { const T rho_2 = mu_1 / mu_2; T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2)); if (rho_2 < 0) t_2 = -t_2; c_2 = T(1) / std::sqrt (T(1) + t_2*t_2); s_2 = c_2 * t_2; changed = true; } const T c_1 = c_2 * c - s_2 * s; const T s_1 = s_2 * c + c_2 * s; if (!changed) { // We've decided that the off-diagonal entries are already small // enough, so we'll set them to zero. This actually appears to result // in smaller errors than leaving them be, possibly because it prevents // us from trying to do extra rotations later that we don't need. A[k][j] = 0; A[j][k] = 0; return false; } const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2); const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2); // For the entries we just zeroed out, we'll just set them to 0, since // they should be 0 up to machine precision. A[j][j] = d_1; A[k][k] = d_2; A[k][j] = 0; A[j][k] = 0; // Rotate the entries that _weren't_ involved in the 2x2 SVD: { // Rotate on the left by // [ c1 s1 0 ]^T [ c1 0 s1 ]^T [ 1 0 0 ]^T // [ -s1 c1 0 ] or [ 0 1 0 ] or [ 0 c1 s1 ] // [ 0 0 1 ] [ -s1 0 c1 ] [ 0 -s1 c1 ] // This has the effect of adding the (weighted) ith and jth _rows_ to // each other. const T tau1 = A[j][l]; const T tau2 = A[k][l]; A[j][l] = c_1 * tau1 - s_1 * tau2; A[k][l] = s_1 * tau1 + c_1 * tau2; } { // Rotate on the right by // [ c2 s2 0 ] [ c2 0 s2 ] [ 1 0 0 ] // [ -s2 c2 0 ] or [ 0 1 0 ] or [ 0 c2 s2 ] // [ 0 0 1 ] [ -s2 0 c2 ] [ 0 -s2 c2 ] // This has the effect of adding the (weighted) ith and jth _columns_ to // each other. const T tau1 = A[l][j]; const T tau2 = A[l][k]; A[l][j] = c_2 * tau1 - s_2 * tau2; A[l][k] = s_2 * tau1 + c_2 * tau2; } // Now apply the rotations to U and V: // Remember that we have // R1^T * A * R2 = D // This is in the 2x2 case, but after doing a bunch of these // we will get something like this for the 3x3 case: // ... R1b^T * R1a^T * A * R2a * R2b * ... = D // ----------------- --------------- // = U^T = V // So, // U = R1a * R1b * ... // V = R2a * R2b * ... jacobiRotateRight (U, c_1, s_1); jacobiRotateRight (V, c_2, s_2); return true; } template bool twoSidedJacobiRotation (IMATH_INTERNAL_NAMESPACE::Matrix44& A, int j, int k, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const T tol) { // Load everything into local variables to make things easier on the // optimizer: const T w = A[j][j]; const T x = A[j][k]; const T y = A[k][j]; const T z = A[k][k]; // We will keep track of whether we're actually performing any rotations, // since if the matrix is already diagonal we'll end up with the identity // as our Jacobi rotation and we can short-circuit. bool changed = false; // The first step is to symmetrize the 2x2 matrix, // [ c s ]^T [ w x ] = [ p q ] // [ -s c ] [ y z ] [ q r ] T mu_1 = w + z; T mu_2 = x - y; T c, s; if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance) { // Note that the <= is important here c = T(1); // because we want to bypass the computation s = T(0); // of rho if mu_1 = mu_2 = 0. const T p = w; const T r = z; mu_1 = r - p; mu_2 = x + y; } else { const T rho = mu_1 / mu_2; s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function? if (rho < 0) s = -s; c = s * rho; mu_1 = s * (x + y) + c * (z - w); // = r - p mu_2 = T(2) * (c * x - s * z); // = 2*q changed = true; } // The second stage diagonalizes, // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ] // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ] T c_2, s_2; if (std::abs(mu_2) <= tol*std::abs(mu_1)) { c_2 = T(1); s_2 = T(0); } else { const T rho_2 = mu_1 / mu_2; T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2)); if (rho_2 < 0) t_2 = -t_2; c_2 = T(1) / std::sqrt (T(1) + t_2*t_2); s_2 = c_2 * t_2; changed = true; } const T c_1 = c_2 * c - s_2 * s; const T s_1 = s_2 * c + c_2 * s; if (!changed) { // We've decided that the off-diagonal entries are already small // enough, so we'll set them to zero. This actually appears to result // in smaller errors than leaving them be, possibly because it prevents // us from trying to do extra rotations later that we don't need. A[k][j] = 0; A[j][k] = 0; return false; } const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2); const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2); // For the entries we just zeroed out, we'll just set them to 0, since // they should be 0 up to machine precision. A[j][j] = d_1; A[k][k] = d_2; A[k][j] = 0; A[j][k] = 0; // Rotate the entries that _weren't_ involved in the 2x2 SVD: for (int l = 0; l < 4; ++l) { if (l == j || l == k) continue; // Rotate on the left by // [ 1 ] // [ . ] // [ c2 s2 ] j // [ 1 ] // [ -s2 c2 ] k // [ . ] // [ 1 ] // j k // // This has the effect of adding the (weighted) ith and jth _rows_ to // each other. const T tau1 = A[j][l]; const T tau2 = A[k][l]; A[j][l] = c_1 * tau1 - s_1 * tau2; A[k][l] = s_1 * tau1 + c_1 * tau2; } for (int l = 0; l < 4; ++l) { // We set the A[j/k][j/k] entries already if (l == j || l == k) continue; // Rotate on the right by // [ 1 ] // [ . ] // [ c2 s2 ] j // [ 1 ] // [ -s2 c2 ] k // [ . ] // [ 1 ] // j k // // This has the effect of adding the (weighted) ith and jth _columns_ to // each other. const T tau1 = A[l][j]; const T tau2 = A[l][k]; A[l][j] = c_2 * tau1 - s_2 * tau2; A[l][k] = s_2 * tau1 + c_2 * tau2; } // Now apply the rotations to U and V: // Remember that we have // R1^T * A * R2 = D // This is in the 2x2 case, but after doing a bunch of these // we will get something like this for the 3x3 case: // ... R1b^T * R1a^T * A * R2a * R2b * ... = D // ----------------- --------------- // = U^T = V // So, // U = R1a * R1b * ... // V = R2a * R2b * ... jacobiRotateRight (U, j, k, c_1, s_1); jacobiRotateRight (V, j, k, c_2, s_2); return true; } template void swapColumns (IMATH_INTERNAL_NAMESPACE::Matrix33& A, int j, int k) { for (int i = 0; i < 3; ++i) std::swap (A[i][j], A[i][k]); } template T maxOffDiag (const IMATH_INTERNAL_NAMESPACE::Matrix33& A) { T result = 0; result = std::max (result, std::abs (A[0][1])); result = std::max (result, std::abs (A[0][2])); result = std::max (result, std::abs (A[1][0])); result = std::max (result, std::abs (A[1][2])); result = std::max (result, std::abs (A[2][0])); result = std::max (result, std::abs (A[2][1])); return result; } template T maxOffDiag (const IMATH_INTERNAL_NAMESPACE::Matrix44& A) { T result = 0; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (i != j) result = std::max (result, std::abs (A[i][j])); } } return result; } template void twoSidedJacobiSVD (IMATH_INTERNAL_NAMESPACE::Matrix33 A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Vec3& S, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const T tol, const bool forcePositiveDeterminant) { // The two-sided Jacobi SVD works by repeatedly zeroing out // off-diagonal entries of the matrix, 2 at a time. Basically, // we can take our 3x3 matrix, // [* * *] // [* * *] // [* * *] // and use a pair of orthogonal transforms to zero out, say, the // pair of entries (0, 1) and (1, 0): // [ c1 s1 ] [* * *] [ c2 s2 ] [* *] // [-s1 c1 ] [* * *] [-s2 c2 ] = [ * *] // [ 1] [* * *] [ 1] [* * *] // When we go to zero out the next pair of entries (say, (0, 2) and (2, 0)) // then we don't expect those entries to stay 0: // [ c1 s1 ] [* *] [ c2 s2 ] [* * ] // [-s1 c1 ] [ * *] [-s2 c2 ] = [* * *] // [ 1] [* * *] [ 1] [ * *] // However, if we keep doing this, we'll find that the off-diagonal entries // converge to 0 fairly quickly (convergence should be roughly cubic). The // result is a diagonal A matrix and a bunch of orthogonal transforms: // [* * *] [* ] // L1 L2 ... Ln [* * *] Rn ... R2 R1 = [ * ] // [* * *] [ *] // ------------ ------- ------------ ------- // U^T A V S // This turns out to be highly accurate because (1) orthogonal transforms // are extremely stable to compute and apply (this is why QR factorization // works so well, FWIW) and because (2) by applying everything to the original // matrix A instead of computing (A^T * A) we avoid any precision loss that // would result from that. U.makeIdentity(); V.makeIdentity(); const int maxIter = 20; // In case we get really unlucky, prevents infinite loops const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum if (absTol != 0) // _off-diagonal_ entry. { int numIter = 0; do { ++numIter; bool changed = twoSidedJacobiRotation (A, U, V, tol); changed = twoSidedJacobiRotation (A, U, V, tol) || changed; changed = twoSidedJacobiRotation (A, U, V, tol) || changed; if (!changed) break; } while (maxOffDiag(A) > absTol && numIter < maxIter); } // The off-diagonal entries are (effectively) 0, so whatever's left on the // diagonal are the singular values: S.x = A[0][0]; S.y = A[1][1]; S.z = A[2][2]; // Nothing thus far has guaranteed that the singular values are positive, // so let's go back through and flip them if not (since by contract we are // supposed to return all positive SVs): for (int i = 0; i < 3; ++i) { if (S[i] < 0) { // If we flip S[i], we need to flip the corresponding column of U // (we could also pick V if we wanted; it doesn't really matter): S[i] = -S[i]; for (int j = 0; j < 3; ++j) U[j][i] = -U[j][i]; } } // Order the singular values from largest to smallest; this requires // exactly two passes through the data using bubble sort: for (int i = 0; i < 2; ++i) { for (int j = 0; j < (2 - i); ++j) { // No absolute values necessary since we already ensured that // they're positive: if (S[j] < S[j+1]) { // If we swap singular values we also have to swap // corresponding columns in U and V: std::swap (S[j], S[j+1]); swapColumns (U, j, j+1); swapColumns (V, j, j+1); } } } if (forcePositiveDeterminant) { // We want to guarantee that the returned matrices always have positive // determinant. We can do this by adding the appropriate number of // matrices of the form: // [ 1 ] // L = [ 1 ] // [ -1 ] // Note that L' = L and L*L = Identity. Thus we can add: // U*L*L*S*V = (U*L)*(L*S)*V // if U has a negative determinant, and // U*S*L*L*V = U*(S*L)*(L*V) // if V has a neg. determinant. if (U.determinant() < 0) { for (int i = 0; i < 3; ++i) U[i][2] = -U[i][2]; S.z = -S.z; } if (V.determinant() < 0) { for (int i = 0; i < 3; ++i) V[i][2] = -V[i][2]; S.z = -S.z; } } } template void twoSidedJacobiSVD (IMATH_INTERNAL_NAMESPACE::Matrix44 A, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Vec4& S, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const T tol, const bool forcePositiveDeterminant) { // Please see the Matrix33 version for a detailed description of the algorithm. U.makeIdentity(); V.makeIdentity(); const int maxIter = 20; // In case we get really unlucky, prevents infinite loops const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum if (absTol != 0) // _off-diagonal_ entry. { int numIter = 0; do { ++numIter; bool changed = twoSidedJacobiRotation (A, 0, 1, U, V, tol); changed = twoSidedJacobiRotation (A, 0, 2, U, V, tol) || changed; changed = twoSidedJacobiRotation (A, 0, 3, U, V, tol) || changed; changed = twoSidedJacobiRotation (A, 1, 2, U, V, tol) || changed; changed = twoSidedJacobiRotation (A, 1, 3, U, V, tol) || changed; changed = twoSidedJacobiRotation (A, 2, 3, U, V, tol) || changed; if (!changed) break; } while (maxOffDiag(A) > absTol && numIter < maxIter); } // The off-diagonal entries are (effectively) 0, so whatever's left on the // diagonal are the singular values: S[0] = A[0][0]; S[1] = A[1][1]; S[2] = A[2][2]; S[3] = A[3][3]; // Nothing thus far has guaranteed that the singular values are positive, // so let's go back through and flip them if not (since by contract we are // supposed to return all positive SVs): for (int i = 0; i < 4; ++i) { if (S[i] < 0) { // If we flip S[i], we need to flip the corresponding column of U // (we could also pick V if we wanted; it doesn't really matter): S[i] = -S[i]; for (int j = 0; j < 4; ++j) U[j][i] = -U[j][i]; } } // Order the singular values from largest to smallest using insertion sort: for (int i = 1; i < 4; ++i) { const IMATH_INTERNAL_NAMESPACE::Vec4 uCol (U[0][i], U[1][i], U[2][i], U[3][i]); const IMATH_INTERNAL_NAMESPACE::Vec4 vCol (V[0][i], V[1][i], V[2][i], V[3][i]); const T sVal = S[i]; int j = i - 1; while (std::abs (S[j]) < std::abs (sVal)) { for (int k = 0; k < 4; ++k) U[k][j+1] = U[k][j]; for (int k = 0; k < 4; ++k) V[k][j+1] = V[k][j]; S[j+1] = S[j]; --j; if (j < 0) break; } for (int k = 0; k < 4; ++k) U[k][j+1] = uCol[k]; for (int k = 0; k < 4; ++k) V[k][j+1] = vCol[k]; S[j+1] = sVal; } if (forcePositiveDeterminant) { // We want to guarantee that the returned matrices always have positive // determinant. We can do this by adding the appropriate number of // matrices of the form: // [ 1 ] // L = [ 1 ] // [ 1 ] // [ -1 ] // Note that L' = L and L*L = Identity. Thus we can add: // U*L*L*S*V = (U*L)*(L*S)*V // if U has a negative determinant, and // U*S*L*L*V = U*(S*L)*(L*V) // if V has a neg. determinant. if (U.determinant() < 0) { for (int i = 0; i < 4; ++i) U[i][3] = -U[i][3]; S[3] = -S[3]; } if (V.determinant() < 0) { for (int i = 0; i < 4; ++i) V[i][3] = -V[i][3]; S[3] = -S[3]; } } } } template void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33& A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Vec3& S, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const T tol, const bool forcePositiveDeterminant) { twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant); } template void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44& A, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Vec4& S, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const T tol, const bool forcePositiveDeterminant) { twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant); } template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33& A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Vec3& S, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const float tol, const bool forcePositiveDeterminant); template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33& A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Vec3& S, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const double tol, const bool forcePositiveDeterminant); template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44& A, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Vec4& S, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const float tol, const bool forcePositiveDeterminant); template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44& A, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Vec4& S, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const double tol, const bool forcePositiveDeterminant); namespace { template inline void jacobiRotateRight (TM& A, const typename TM::BaseType s, const typename TM::BaseType tau) { typedef typename TM::BaseType T; for (unsigned int i = 0; i < TM::dimensions(); ++i) { const T nu1 = A[i][j]; const T nu2 = A[i][k]; A[i][j] -= s * (nu2 + tau * nu1); A[i][k] += s * (nu1 - tau * nu2); } } template bool jacobiRotation (Matrix33& A, Matrix33& V, Vec3& Z, const T tol) { // Load everything into local variables to make things easier on the // optimizer: const T x = A[j][j]; const T y = A[j][k]; const T z = A[k][k]; // The first stage diagonalizes, // [ c s ]^T [ x y ] [ c -s ] = [ d1 0 ] // [ -s c ] [ y z ] [ s c ] [ 0 d2 ] const T mu1 = z - x; const T mu2 = 2 * y; if (std::abs(mu2) <= tol*std::abs(mu1)) { // We've decided that the off-diagonal entries are already small // enough, so we'll set them to zero. This actually appears to result // in smaller errors than leaving them be, possibly because it prevents // us from trying to do extra rotations later that we don't need. A[j][k] = 0; return false; } const T rho = mu1 / mu2; const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho)); const T c = T(1) / std::sqrt (T(1) + t*t); const T s = t * c; const T tau = s / (T(1) + c); const T h = t * y; // Update diagonal elements. Z[j] -= h; Z[k] += h; A[j][j] -= h; A[k][k] += h; // For the entries we just zeroed out, we'll just set them to 0, since // they should be 0 up to machine precision. A[j][k] = 0; // We only update upper triagnular elements of A, since // A is supposed to be symmetric. T& offd1 = l < j ? A[l][j] : A[j][l]; T& offd2 = l < k ? A[l][k] : A[k][l]; const T nu1 = offd1; const T nu2 = offd2; offd1 = nu1 - s * (nu2 + tau * nu1); offd2 = nu2 + s * (nu1 - tau * nu2); // Apply rotation to V jacobiRotateRight (V, s, tau); return true; } template bool jacobiRotation (Matrix44& A, Matrix44& V, Vec4& Z, const T tol) { const T x = A[j][j]; const T y = A[j][k]; const T z = A[k][k]; const T mu1 = z - x; const T mu2 = T(2) * y; // Let's see if rho^(-1) = mu2 / mu1 is less than tol // This test also checks if rho^2 will overflow // when tol^(-1) < sqrt(limits::max()). if (std::abs(mu2) <= tol*std::abs(mu1)) { A[j][k] = 0; return true; } const T rho = mu1 / mu2; const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho)); const T c = T(1) / std::sqrt (T(1) + t*t); const T s = c * t; const T tau = s / (T(1) + c); const T h = t * y; Z[j] -= h; Z[k] += h; A[j][j] -= h; A[k][k] += h; A[j][k] = 0; { T& offd1 = l1 < j ? A[l1][j] : A[j][l1]; T& offd2 = l1 < k ? A[l1][k] : A[k][l1]; const T nu1 = offd1; const T nu2 = offd2; offd1 -= s * (nu2 + tau * nu1); offd2 += s * (nu1 - tau * nu2); } { T& offd1 = l2 < j ? A[l2][j] : A[j][l2]; T& offd2 = l2 < k ? A[l2][k] : A[k][l2]; const T nu1 = offd1; const T nu2 = offd2; offd1 -= s * (nu2 + tau * nu1); offd2 += s * (nu1 - tau * nu2); } jacobiRotateRight (V, s, tau); return true; } template inline typename TM::BaseType maxOffDiagSymm (const TM& A) { typedef typename TM::BaseType T; T result = 0; for (unsigned int i = 0; i < TM::dimensions(); ++i) for (unsigned int j = i+1; j < TM::dimensions(); ++j) result = std::max (result, std::abs (A[i][j])); return result; } } // namespace template void jacobiEigenSolver (Matrix33& A, Vec3& S, Matrix33& V, const T tol) { V.makeIdentity(); for(int i = 0; i < 3; ++i) { S[i] = A[i][i]; } const int maxIter = 20; // In case we get really unlucky, prevents infinite loops const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum if (absTol != 0) // _off-diagonal_ entry. { int numIter = 0; do { // Z is for accumulating small changes (h) to diagonal entries // of A for one sweep. Adding h's directly to A might cause // a cancellation effect when h is relatively very small to // the corresponding diagonal entry of A and // this will increase numerical errors Vec3 Z(0, 0, 0); ++numIter; bool changed = jacobiRotation<0, 1, 2> (A, V, Z, tol); changed = jacobiRotation<0, 2, 1> (A, V, Z, tol) || changed; changed = jacobiRotation<1, 2, 0> (A, V, Z, tol) || changed; // One sweep passed. Add accumulated changes (Z) to singular values (S) // Update diagonal elements of A for better accuracy as well. for(int i = 0; i < 3; ++i) { A[i][i] = S[i] += Z[i]; } if (!changed) break; } while (maxOffDiagSymm(A) > absTol && numIter < maxIter); } } template void jacobiEigenSolver (Matrix44& A, Vec4& S, Matrix44& V, const T tol) { V.makeIdentity(); for(int i = 0; i < 4; ++i) { S[i] = A[i][i]; } const int maxIter = 20; // In case we get really unlucky, prevents infinite loops const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum if (absTol != 0) // _off-diagonal_ entry. { int numIter = 0; do { ++numIter; Vec4 Z(0, 0, 0, 0); bool changed = jacobiRotation<0, 1, 2, 3> (A, V, Z, tol); changed = jacobiRotation<0, 2, 1, 3> (A, V, Z, tol) || changed; changed = jacobiRotation<0, 3, 1, 2> (A, V, Z, tol) || changed; changed = jacobiRotation<1, 2, 0, 3> (A, V, Z, tol) || changed; changed = jacobiRotation<1, 3, 0, 2> (A, V, Z, tol) || changed; changed = jacobiRotation<2, 3, 0, 1> (A, V, Z, tol) || changed; for(int i = 0; i < 4; ++i) { A[i][i] = S[i] += Z[i]; } if (!changed) break; } while (maxOffDiagSymm(A) > absTol && numIter < maxIter); } } template void maxEigenVector (TM& A, TV& V) { TV S; TM MV; jacobiEigenSolver(A, S, MV); int maxIdx(0); for(unsigned int i = 1; i < TV::dimensions(); ++i) { if(std::abs(S[i]) > std::abs(S[maxIdx])) maxIdx = i; } for(unsigned int i = 0; i < TV::dimensions(); ++i) V[i] = MV[i][maxIdx]; } template void minEigenVector (TM& A, TV& V) { TV S; TM MV; jacobiEigenSolver(A, S, MV); int minIdx(0); for(unsigned int i = 1; i < TV::dimensions(); ++i) { if(std::abs(S[i]) < std::abs(S[minIdx])) minIdx = i; } for(unsigned int i = 0; i < TV::dimensions(); ++i) V[i] = MV[i][minIdx]; } template IMATH_EXPORT void jacobiEigenSolver (Matrix33& A, Vec3& S, Matrix33& V, const float tol); template IMATH_EXPORT void jacobiEigenSolver (Matrix33& A, Vec3& S, Matrix33& V, const double tol); template IMATH_EXPORT void jacobiEigenSolver (Matrix44& A, Vec4& S, Matrix44& V, const float tol); template IMATH_EXPORT void jacobiEigenSolver (Matrix44& A, Vec4& S, Matrix44& V, const double tol); template IMATH_EXPORT void maxEigenVector (Matrix33& A, Vec3& S); template IMATH_EXPORT void maxEigenVector (Matrix44& A, Vec4& S); template IMATH_EXPORT void maxEigenVector (Matrix33& A, Vec3& S); template IMATH_EXPORT void maxEigenVector (Matrix44& A, Vec4& S); template IMATH_EXPORT void minEigenVector (Matrix33& A, Vec3& S); template IMATH_EXPORT void minEigenVector (Matrix44& A, Vec4& S); template IMATH_EXPORT void minEigenVector (Matrix33& A, Vec3& S); template IMATH_EXPORT void minEigenVector (Matrix44& A, Vec4& S); IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathMatrixAlgo.h000066400000000000000000001150171406177042200207760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHMATRIXALGO_H #define INCLUDED_IMATHMATRIXALGO_H //------------------------------------------------------------------------- // // This file contains algorithms applied to or in conjunction with // transformation matrices (Imath::Matrix33 and Imath::Matrix44). // The assumption made is that these functions are called much less // often than the basic point functions or these functions require // more support classes. // // This file also defines a few predefined constant matrices. // //------------------------------------------------------------------------- #include "ImathExport.h" #include "ImathMatrix.h" #include "ImathQuat.h" #include "ImathEuler.h" #include "ImathExc.h" #include "ImathVec.h" #include "ImathLimits.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER //------------------ // Identity matrices //------------------ IMATH_EXPORT_CONST M22f identity22f; IMATH_EXPORT_CONST M33f identity33f; IMATH_EXPORT_CONST M44f identity44f; IMATH_EXPORT_CONST M22d identity22d; IMATH_EXPORT_CONST M33d identity33d; IMATH_EXPORT_CONST M44d identity44d; //---------------------------------------------------------------------- // Extract scale, shear, rotation, and translation values from a matrix: // // Notes: // // This implementation follows the technique described in the paper by // Spencer W. Thomas in the Graphics Gems II article: "Decomposing a // Matrix into Simple Transformations", p. 320. // // - Some of the functions below have an optional exc parameter // that determines the functions' behavior when the matrix' // scaling is very close to zero: // // If exc is true, the functions throw an Imath::ZeroScale exception. // // If exc is false: // // extractScaling (m, s) returns false, s is invalid // sansScaling (m) returns m // removeScaling (m) returns false, m is unchanged // sansScalingAndShear (m) returns m // removeScalingAndShear (m) returns false, m is unchanged // extractAndRemoveScalingAndShear (m, s, h) // returns false, m is unchanged, // (sh) are invalid // checkForZeroScaleInRow () returns false // extractSHRT (m, s, h, r, t) returns false, (shrt) are invalid // // - Functions extractEuler(), extractEulerXYZ() and extractEulerZYX() // assume that the matrix does not include shear or non-uniform scaling, // but they do not examine the matrix to verify this assumption. // Matrices with shear or non-uniform scaling are likely to produce // meaningless results. Therefore, you should use the // removeScalingAndShear() routine, if necessary, prior to calling // extractEuler...() . // // - All functions assume that the matrix does not include perspective // transformation(s), but they do not examine the matrix to verify // this assumption. Matrices with perspective transformations are // likely to produce meaningless results. // //---------------------------------------------------------------------- // // Declarations for 4x4 matrix. // template bool extractScaling (const Matrix44 &mat, Vec3 &scl, bool exc = true); template Matrix44 sansScaling (const Matrix44 &mat, bool exc = true); template bool removeScaling (Matrix44 &mat, bool exc = true); template bool extractScalingAndShear (const Matrix44 &mat, Vec3 &scl, Vec3 &shr, bool exc = true); template Matrix44 sansScalingAndShear (const Matrix44 &mat, bool exc = true); template void sansScalingAndShear (Matrix44 &result, const Matrix44 &mat, bool exc = true); template bool removeScalingAndShear (Matrix44 &mat, bool exc = true); template bool extractAndRemoveScalingAndShear (Matrix44 &mat, Vec3 &scl, Vec3 &shr, bool exc = true); template void extractEulerXYZ (const Matrix44 &mat, Vec3 &rot); template void extractEulerZYX (const Matrix44 &mat, Vec3 &rot); template Quat extractQuat (const Matrix44 &mat); template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Vec3 &r, Vec3 &t, bool exc /*= true*/, typename Euler::Order rOrder); template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Vec3 &r, Vec3 &t, bool exc = true); template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Euler &r, Vec3 &t, bool exc = true); // // Internal utility function. // template bool checkForZeroScaleInRow (const T &scl, const Vec3 &row, bool exc = true); template Matrix44 outerProduct ( const Vec4 &a, const Vec4 &b); // // Returns a matrix that rotates "fromDirection" vector to "toDirection" // vector. // template Matrix44 rotationMatrix (const Vec3 &fromDirection, const Vec3 &toDirection); // // Returns a matrix that rotates the "fromDir" vector // so that it points towards "toDir". You may also // specify that you want the up vector to be pointing // in a certain direction "upDir". // template Matrix44 rotationMatrixWithUpDir (const Vec3 &fromDir, const Vec3 &toDir, const Vec3 &upDir); // // Constructs a matrix that rotates the z-axis so that it // points towards "targetDir". You must also specify // that you want the up vector to be pointing in a // certain direction "upDir". // // Notes: The following degenerate cases are handled: // (a) when the directions given by "toDir" and "upDir" // are parallel or opposite; // (the direction vectors must have a non-zero cross product) // (b) when any of the given direction vectors have zero length // template void alignZAxisWithTargetDir (Matrix44 &result, Vec3 targetDir, Vec3 upDir); // Compute an orthonormal direct frame from : a position, an x axis direction and a normal to the y axis // If the x axis and normal are perpendicular, then the normal will have the same direction as the z axis. // Inputs are : // -the position of the frame // -the x axis direction of the frame // -a normal to the y axis of the frame // Return is the orthonormal frame template Matrix44 computeLocalFrame( const Vec3& p, const Vec3& xDir, const Vec3& normal); // Add a translate/rotate/scale offset to an input frame // and put it in another frame of reference // Inputs are : // - input frame // - translate offset // - rotate offset in degrees // - scale offset // - frame of reference // Output is the offsetted frame template Matrix44 addOffset( const Matrix44& inMat, const Vec3& tOffset, const Vec3& rOffset, const Vec3& sOffset, const Vec3& ref); // Compute Translate/Rotate/Scale matrix from matrix A with the Rotate/Scale of Matrix B // Inputs are : // -keepRotateA : if true keep rotate from matrix A, use B otherwise // -keepScaleA : if true keep scale from matrix A, use B otherwise // -Matrix A // -Matrix B // Return Matrix A with tweaked rotation/scale template Matrix44 computeRSMatrix( bool keepRotateA, bool keepScaleA, const Matrix44& A, const Matrix44& B); //---------------------------------------------------------------------- // // Declarations for 3x3 matrix. // template bool extractScaling (const Matrix33 &mat, Vec2 &scl, bool exc = true); template Matrix33 sansScaling (const Matrix33 &mat, bool exc = true); template bool removeScaling (Matrix33 &mat, bool exc = true); template bool extractScalingAndShear (const Matrix33 &mat, Vec2 &scl, T &h, bool exc = true); template Matrix33 sansScalingAndShear (const Matrix33 &mat, bool exc = true); template bool removeScalingAndShear (Matrix33 &mat, bool exc = true); template bool extractAndRemoveScalingAndShear (Matrix33 &mat, Vec2 &scl, T &shr, bool exc = true); template void extractEuler (const Matrix22 &mat, T &rot); template void extractEuler (const Matrix33 &mat, T &rot); template bool extractSHRT (const Matrix33 &mat, Vec2 &s, T &h, T &r, Vec2 &t, bool exc = true); template bool checkForZeroScaleInRow (const T &scl, const Vec2 &row, bool exc = true); template Matrix33 outerProduct ( const Vec3 &a, const Vec3 &b); //----------------------------------------------------------------------------- // Implementation for 4x4 Matrix //------------------------------ template bool extractScaling (const Matrix44 &mat, Vec3 &scl, bool exc) { Vec3 shr; Matrix44 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return false; return true; } template Matrix44 sansScaling (const Matrix44 &mat, bool exc) { Vec3 scl; Vec3 shr; Vec3 rot; Vec3 tran; if (! extractSHRT (mat, scl, shr, rot, tran, exc)) return mat; Matrix44 M; M.translate (tran); M.rotate (rot); M.shear (shr); return M; } template bool removeScaling (Matrix44 &mat, bool exc) { Vec3 scl; Vec3 shr; Vec3 rot; Vec3 tran; if (! extractSHRT (mat, scl, shr, rot, tran, exc)) return false; mat.makeIdentity (); mat.translate (tran); mat.rotate (rot); mat.shear (shr); return true; } template bool extractScalingAndShear (const Matrix44 &mat, Vec3 &scl, Vec3 &shr, bool exc) { Matrix44 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return false; return true; } template Matrix44 sansScalingAndShear (const Matrix44 &mat, bool exc) { Vec3 scl; Vec3 shr; Matrix44 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return mat; return M; } template void sansScalingAndShear (Matrix44 &result, const Matrix44 &mat, bool exc) { Vec3 scl; Vec3 shr; if (! extractAndRemoveScalingAndShear (result, scl, shr, exc)) result = mat; } template bool removeScalingAndShear (Matrix44 &mat, bool exc) { Vec3 scl; Vec3 shr; if (! extractAndRemoveScalingAndShear (mat, scl, shr, exc)) return false; return true; } template bool extractAndRemoveScalingAndShear (Matrix44 &mat, Vec3 &scl, Vec3 &shr, bool exc) { // // This implementation follows the technique described in the paper by // Spencer W. Thomas in the Graphics Gems II article: "Decomposing a // Matrix into Simple Transformations", p. 320. // Vec3 row[3]; row[0] = Vec3 (mat[0][0], mat[0][1], mat[0][2]); row[1] = Vec3 (mat[1][0], mat[1][1], mat[1][2]); row[2] = Vec3 (mat[2][0], mat[2][1], mat[2][2]); T maxVal = 0; for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) if (IMATH_INTERNAL_NAMESPACE::abs (row[i][j]) > maxVal) maxVal = IMATH_INTERNAL_NAMESPACE::abs (row[i][j]); // // We normalize the 3x3 matrix here. // It was noticed that this can improve numerical stability significantly, // especially when many of the upper 3x3 matrix's coefficients are very // close to zero; we correct for this step at the end by multiplying the // scaling factors by maxVal at the end (shear and rotation are not // affected by the normalization). if (maxVal != 0) { for (int i=0; i < 3; i++) if (! checkForZeroScaleInRow (maxVal, row[i], exc)) return false; else row[i] /= maxVal; } // Compute X scale factor. scl.x = row[0].length (); if (! checkForZeroScaleInRow (scl.x, row[0], exc)) return false; // Normalize first row. row[0] /= scl.x; // An XY shear factor will shear the X coord. as the Y coord. changes. // There are 6 combinations (XY, XZ, YZ, YX, ZX, ZY), although we only // extract the first 3 because we can effect the last 3 by shearing in // XY, XZ, YZ combined rotations and scales. // // shear matrix < 1, YX, ZX, 0, // XY, 1, ZY, 0, // XZ, YZ, 1, 0, // 0, 0, 0, 1 > // Compute XY shear factor and make 2nd row orthogonal to 1st. shr[0] = row[0].dot (row[1]); row[1] -= shr[0] * row[0]; // Now, compute Y scale. scl.y = row[1].length (); if (! checkForZeroScaleInRow (scl.y, row[1], exc)) return false; // Normalize 2nd row and correct the XY shear factor for Y scaling. row[1] /= scl.y; shr[0] /= scl.y; // Compute XZ and YZ shears, orthogonalize 3rd row. shr[1] = row[0].dot (row[2]); row[2] -= shr[1] * row[0]; shr[2] = row[1].dot (row[2]); row[2] -= shr[2] * row[1]; // Next, get Z scale. scl.z = row[2].length (); if (! checkForZeroScaleInRow (scl.z, row[2], exc)) return false; // Normalize 3rd row and correct the XZ and YZ shear factors for Z scaling. row[2] /= scl.z; shr[1] /= scl.z; shr[2] /= scl.z; // At this point, the upper 3x3 matrix in mat is orthonormal. // Check for a coordinate system flip. If the determinant // is less than zero, then negate the matrix and the scaling factors. if (row[0].dot (row[1].cross (row[2])) < 0) for (int i=0; i < 3; i++) { scl[i] *= -1; row[i] *= -1; } // Copy over the orthonormal rows into the returned matrix. // The upper 3x3 matrix in mat is now a rotation matrix. for (int i=0; i < 3; i++) { mat[i][0] = row[i][0]; mat[i][1] = row[i][1]; mat[i][2] = row[i][2]; } // Correct the scaling factors for the normalization step that we // performed above; shear and rotation are not affected by the // normalization. scl *= maxVal; return true; } template void extractEulerXYZ (const Matrix44 &mat, Vec3 &rot) { // // Normalize the local x, y and z axes to remove scaling. // Vec3 i (mat[0][0], mat[0][1], mat[0][2]); Vec3 j (mat[1][0], mat[1][1], mat[1][2]); Vec3 k (mat[2][0], mat[2][1], mat[2][2]); i.normalize(); j.normalize(); k.normalize(); Matrix44 M (i[0], i[1], i[2], 0, j[0], j[1], j[2], 0, k[0], k[1], k[2], 0, 0, 0, 0, 1); // // Extract the first angle, rot.x. // rot.x = Math::atan2 (M[1][2], M[2][2]); // // Remove the rot.x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Matrix44 N; N.rotate (Vec3 (-rot.x, 0, 0)); N = N * M; // // Extract the other two angles, rot.y and rot.z, from N. // T cy = Math::sqrt (N[0][0]*N[0][0] + N[0][1]*N[0][1]); rot.y = Math::atan2 (-N[0][2], cy); rot.z = Math::atan2 (-N[1][0], N[1][1]); } template void extractEulerZYX (const Matrix44 &mat, Vec3 &rot) { // // Normalize the local x, y and z axes to remove scaling. // Vec3 i (mat[0][0], mat[0][1], mat[0][2]); Vec3 j (mat[1][0], mat[1][1], mat[1][2]); Vec3 k (mat[2][0], mat[2][1], mat[2][2]); i.normalize(); j.normalize(); k.normalize(); Matrix44 M (i[0], i[1], i[2], 0, j[0], j[1], j[2], 0, k[0], k[1], k[2], 0, 0, 0, 0, 1); // // Extract the first angle, rot.x. // rot.x = -Math::atan2 (M[1][0], M[0][0]); // // Remove the x rotation from M, so that the remaining // rotation, N, is only around two axes, and gimbal lock // cannot occur. // Matrix44 N; N.rotate (Vec3 (0, 0, -rot.x)); N = N * M; // // Extract the other two angles, rot.y and rot.z, from N. // T cy = Math::sqrt (N[2][2]*N[2][2] + N[2][1]*N[2][1]); rot.y = -Math::atan2 (-N[2][0], cy); rot.z = -Math::atan2 (-N[1][2], N[1][1]); } template Quat extractQuat (const Matrix44 &mat) { Matrix44 rot; T tr, s; T q[4]; int i, j, k; Quat quat; int nxt[3] = {1, 2, 0}; tr = mat[0][0] + mat[1][1] + mat[2][2]; // check the diagonal if (tr > 0.0) { s = Math::sqrt (tr + T(1.0)); quat.r = s / T(2.0); s = T(0.5) / s; quat.v.x = (mat[1][2] - mat[2][1]) * s; quat.v.y = (mat[2][0] - mat[0][2]) * s; quat.v.z = (mat[0][1] - mat[1][0]) * s; } else { // diagonal is negative i = 0; if (mat[1][1] > mat[0][0]) i=1; if (mat[2][2] > mat[i][i]) i=2; j = nxt[i]; k = nxt[j]; s = Math::sqrt ((mat[i][i] - (mat[j][j] + mat[k][k])) + T(1.0)); q[i] = s * T(0.5); if (s != T(0.0)) s = T(0.5) / s; q[3] = (mat[j][k] - mat[k][j]) * s; q[j] = (mat[i][j] + mat[j][i]) * s; q[k] = (mat[i][k] + mat[k][i]) * s; quat.v.x = q[0]; quat.v.y = q[1]; quat.v.z = q[2]; quat.r = q[3]; } return quat; } template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Vec3 &r, Vec3 &t, bool exc /* = true */ , typename Euler::Order rOrder /* = Euler::XYZ */ ) { Matrix44 rot; rot = mat; if (! extractAndRemoveScalingAndShear (rot, s, h, exc)) return false; extractEulerXYZ (rot, r); t.x = mat[3][0]; t.y = mat[3][1]; t.z = mat[3][2]; if (rOrder != Euler::XYZ) { IMATH_INTERNAL_NAMESPACE::Euler eXYZ (r, IMATH_INTERNAL_NAMESPACE::Euler::XYZ); IMATH_INTERNAL_NAMESPACE::Euler e (eXYZ, rOrder); r = e.toXYZVector (); } return true; } template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Vec3 &r, Vec3 &t, bool exc) { return extractSHRT(mat, s, h, r, t, exc, IMATH_INTERNAL_NAMESPACE::Euler::XYZ); } template bool extractSHRT (const Matrix44 &mat, Vec3 &s, Vec3 &h, Euler &r, Vec3 &t, bool exc /* = true */) { return extractSHRT (mat, s, h, r, t, exc, r.order ()); } template bool checkForZeroScaleInRow (const T& scl, const Vec3 &row, bool exc /* = true */ ) { for (int i = 0; i < 3; i++) { if ((abs (scl) < 1 && abs (row[i]) >= limits::max() * abs (scl))) { if (exc) throw IMATH_INTERNAL_NAMESPACE::ZeroScaleExc ("Cannot remove zero scaling " "from matrix."); else return false; } } return true; } template Matrix44 outerProduct (const Vec4 &a, const Vec4 &b ) { return Matrix44 (a.x*b.x, a.x*b.y, a.x*b.z, a.x*b.w, a.y*b.x, a.y*b.y, a.y*b.z, a.x*b.w, a.z*b.x, a.z*b.y, a.z*b.z, a.x*b.w, a.w*b.x, a.w*b.y, a.w*b.z, a.w*b.w); } template Matrix44 rotationMatrix (const Vec3 &from, const Vec3 &to) { Quat q; q.setRotation(from, to); return q.toMatrix44(); } template Matrix44 rotationMatrixWithUpDir (const Vec3 &fromDir, const Vec3 &toDir, const Vec3 &upDir) { // // The goal is to obtain a rotation matrix that takes // "fromDir" to "toDir". We do this in two steps and // compose the resulting rotation matrices; // (a) rotate "fromDir" into the z-axis // (b) rotate the z-axis into "toDir" // // The from direction must be non-zero; but we allow zero to and up dirs. if (fromDir.length () == 0) return Matrix44 (); else { Matrix44 zAxis2FromDir( IMATH_INTERNAL_NAMESPACE::UNINITIALIZED ); alignZAxisWithTargetDir (zAxis2FromDir, fromDir, Vec3 (0, 1, 0)); Matrix44 fromDir2zAxis = zAxis2FromDir.transposed (); Matrix44 zAxis2ToDir( IMATH_INTERNAL_NAMESPACE::UNINITIALIZED ); alignZAxisWithTargetDir (zAxis2ToDir, toDir, upDir); return fromDir2zAxis * zAxis2ToDir; } } template void alignZAxisWithTargetDir (Matrix44 &result, Vec3 targetDir, Vec3 upDir) { // // Ensure that the target direction is non-zero. // if ( targetDir.length () == 0 ) targetDir = Vec3 (0, 0, 1); // // Ensure that the up direction is non-zero. // if ( upDir.length () == 0 ) upDir = Vec3 (0, 1, 0); // // Check for degeneracies. If the upDir and targetDir are parallel // or opposite, then compute a new, arbitrary up direction that is // not parallel or opposite to the targetDir. // if (upDir.cross (targetDir).length () == 0) { upDir = targetDir.cross (Vec3 (1, 0, 0)); if (upDir.length() == 0) upDir = targetDir.cross(Vec3 (0, 0, 1)); } // // Compute the x-, y-, and z-axis vectors of the new coordinate system. // Vec3 targetPerpDir = upDir.cross (targetDir); Vec3 targetUpDir = targetDir.cross (targetPerpDir); // // Rotate the x-axis into targetPerpDir (row 0), // rotate the y-axis into targetUpDir (row 1), // rotate the z-axis into targetDir (row 2). // Vec3 row[3]; row[0] = targetPerpDir.normalized (); row[1] = targetUpDir .normalized (); row[2] = targetDir .normalized (); result.x[0][0] = row[0][0]; result.x[0][1] = row[0][1]; result.x[0][2] = row[0][2]; result.x[0][3] = (T)0; result.x[1][0] = row[1][0]; result.x[1][1] = row[1][1]; result.x[1][2] = row[1][2]; result.x[1][3] = (T)0; result.x[2][0] = row[2][0]; result.x[2][1] = row[2][1]; result.x[2][2] = row[2][2]; result.x[2][3] = (T)0; result.x[3][0] = (T)0; result.x[3][1] = (T)0; result.x[3][2] = (T)0; result.x[3][3] = (T)1; } // Compute an orthonormal direct frame from : a position, an x axis direction and a normal to the y axis // If the x axis and normal are perpendicular, then the normal will have the same direction as the z axis. // Inputs are : // -the position of the frame // -the x axis direction of the frame // -a normal to the y axis of the frame // Return is the orthonormal frame template Matrix44 computeLocalFrame( const Vec3& p, const Vec3& xDir, const Vec3& normal) { Vec3 _xDir(xDir); Vec3 x = _xDir.normalize(); Vec3 y = (normal % x).normalize(); Vec3 z = (x % y).normalize(); Matrix44 L; L[0][0] = x[0]; L[0][1] = x[1]; L[0][2] = x[2]; L[0][3] = 0.0; L[1][0] = y[0]; L[1][1] = y[1]; L[1][2] = y[2]; L[1][3] = 0.0; L[2][0] = z[0]; L[2][1] = z[1]; L[2][2] = z[2]; L[2][3] = 0.0; L[3][0] = p[0]; L[3][1] = p[1]; L[3][2] = p[2]; L[3][3] = 1.0; return L; } // Add a translate/rotate/scale offset to an input frame // and put it in another frame of reference // Inputs are : // - input frame // - translate offset // - rotate offset in degrees // - scale offset // - frame of reference // Output is the offsetted frame template Matrix44 addOffset( const Matrix44& inMat, const Vec3& tOffset, const Vec3& rOffset, const Vec3& sOffset, const Matrix44& ref) { Matrix44 O; Vec3 _rOffset(rOffset); _rOffset *= M_PI / 180.0; O.rotate (_rOffset); O[3][0] = tOffset[0]; O[3][1] = tOffset[1]; O[3][2] = tOffset[2]; Matrix44 S; S.scale (sOffset); Matrix44 X = S * O * inMat * ref; return X; } // Compute Translate/Rotate/Scale matrix from matrix A with the Rotate/Scale of Matrix B // Inputs are : // -keepRotateA : if true keep rotate from matrix A, use B otherwise // -keepScaleA : if true keep scale from matrix A, use B otherwise // -Matrix A // -Matrix B // Return Matrix A with tweaked rotation/scale template Matrix44 computeRSMatrix( bool keepRotateA, bool keepScaleA, const Matrix44& A, const Matrix44& B) { Vec3 as, ah, ar, at; extractSHRT (A, as, ah, ar, at); Vec3 bs, bh, br, bt; extractSHRT (B, bs, bh, br, bt); if (!keepRotateA) ar = br; if (!keepScaleA) as = bs; Matrix44 mat; mat.makeIdentity(); mat.translate (at); mat.rotate (ar); mat.scale (as); return mat; } //----------------------------------------------------------------------------- // Implementation for 3x3 Matrix //------------------------------ template bool extractScaling (const Matrix33 &mat, Vec2 &scl, bool exc) { T shr; Matrix33 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return false; return true; } template Matrix33 sansScaling (const Matrix33 &mat, bool exc) { Vec2 scl; T shr; T rot; Vec2 tran; if (! extractSHRT (mat, scl, shr, rot, tran, exc)) return mat; Matrix33 M; M.translate (tran); M.rotate (rot); M.shear (shr); return M; } template bool removeScaling (Matrix33 &mat, bool exc) { Vec2 scl; T shr; T rot; Vec2 tran; if (! extractSHRT (mat, scl, shr, rot, tran, exc)) return false; mat.makeIdentity (); mat.translate (tran); mat.rotate (rot); mat.shear (shr); return true; } template bool extractScalingAndShear (const Matrix33 &mat, Vec2 &scl, T &shr, bool exc) { Matrix33 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return false; return true; } template Matrix33 sansScalingAndShear (const Matrix33 &mat, bool exc) { Vec2 scl; T shr; Matrix33 M (mat); if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) return mat; return M; } template bool removeScalingAndShear (Matrix33 &mat, bool exc) { Vec2 scl; T shr; if (! extractAndRemoveScalingAndShear (mat, scl, shr, exc)) return false; return true; } template bool extractAndRemoveScalingAndShear (Matrix33 &mat, Vec2 &scl, T &shr, bool exc) { Vec2 row[2]; row[0] = Vec2 (mat[0][0], mat[0][1]); row[1] = Vec2 (mat[1][0], mat[1][1]); T maxVal = 0; for (int i=0; i < 2; i++) for (int j=0; j < 2; j++) if (IMATH_INTERNAL_NAMESPACE::abs (row[i][j]) > maxVal) maxVal = IMATH_INTERNAL_NAMESPACE::abs (row[i][j]); // // We normalize the 2x2 matrix here. // It was noticed that this can improve numerical stability significantly, // especially when many of the upper 2x2 matrix's coefficients are very // close to zero; we correct for this step at the end by multiplying the // scaling factors by maxVal at the end (shear and rotation are not // affected by the normalization). if (maxVal != 0) { for (int i=0; i < 2; i++) if (! checkForZeroScaleInRow (maxVal, row[i], exc)) return false; else row[i] /= maxVal; } // Compute X scale factor. scl.x = row[0].length (); if (! checkForZeroScaleInRow (scl.x, row[0], exc)) return false; // Normalize first row. row[0] /= scl.x; // An XY shear factor will shear the X coord. as the Y coord. changes. // There are 2 combinations (XY, YX), although we only extract the XY // shear factor because we can effect the an YX shear factor by // shearing in XY combined with rotations and scales. // // shear matrix < 1, YX, 0, // XY, 1, 0, // 0, 0, 1 > // Compute XY shear factor and make 2nd row orthogonal to 1st. shr = row[0].dot (row[1]); row[1] -= shr * row[0]; // Now, compute Y scale. scl.y = row[1].length (); if (! checkForZeroScaleInRow (scl.y, row[1], exc)) return false; // Normalize 2nd row and correct the XY shear factor for Y scaling. row[1] /= scl.y; shr /= scl.y; // At this point, the upper 2x2 matrix in mat is orthonormal. // Check for a coordinate system flip. If the determinant // is -1, then flip the rotation matrix and adjust the scale(Y) // and shear(XY) factors to compensate. if (row[0][0] * row[1][1] - row[0][1] * row[1][0] < 0) { row[1][0] *= -1; row[1][1] *= -1; scl[1] *= -1; shr *= -1; } // Copy over the orthonormal rows into the returned matrix. // The upper 2x2 matrix in mat is now a rotation matrix. for (int i=0; i < 2; i++) { mat[i][0] = row[i][0]; mat[i][1] = row[i][1]; } scl *= maxVal; return true; } template void extractEuler (const Matrix22 &mat, T &rot) { // // Normalize the local x and y axes to remove scaling. // Vec2 i (mat[0][0], mat[0][1]); Vec2 j (mat[1][0], mat[1][1]); i.normalize(); j.normalize(); // // Extract the angle, rot. // rot = - Math::atan2 (j[0], i[0]); } template void extractEuler (const Matrix33 &mat, T &rot) { // // Normalize the local x and y axes to remove scaling. // Vec2 i (mat[0][0], mat[0][1]); Vec2 j (mat[1][0], mat[1][1]); i.normalize(); j.normalize(); // // Extract the angle, rot. // rot = - Math::atan2 (j[0], i[0]); } template bool extractSHRT (const Matrix33 &mat, Vec2 &s, T &h, T &r, Vec2 &t, bool exc) { Matrix33 rot; rot = mat; if (! extractAndRemoveScalingAndShear (rot, s, h, exc)) return false; extractEuler (rot, r); t.x = mat[2][0]; t.y = mat[2][1]; return true; } template bool checkForZeroScaleInRow (const T& scl, const Vec2 &row, bool exc /* = true */ ) { for (int i = 0; i < 2; i++) { if ((abs (scl) < 1 && abs (row[i]) >= limits::max() * abs (scl))) { if (exc) throw IMATH_INTERNAL_NAMESPACE::ZeroScaleExc ( "Cannot remove zero scaling from matrix."); else return false; } } return true; } template Matrix33 outerProduct (const Vec3 &a, const Vec3 &b ) { return Matrix33 (a.x*b.x, a.x*b.y, a.x*b.z, a.y*b.x, a.y*b.y, a.y*b.z, a.z*b.x, a.z*b.y, a.z*b.z ); } // Computes the translation and rotation that brings the 'from' points // as close as possible to the 'to' points under the Frobenius norm. // To be more specific, let x be the matrix of 'from' points and y be // the matrix of 'to' points, we want to find the matrix A of the form // [ R t ] // [ 0 1 ] // that minimizes // || (A*x - y)^T * W * (A*x - y) ||_F // If doScaling is true, then a uniform scale is allowed also. template IMATH_INTERNAL_NAMESPACE::M44d procrustesRotationAndTranslation (const IMATH_INTERNAL_NAMESPACE::Vec3* A, // From these const IMATH_INTERNAL_NAMESPACE::Vec3* B, // To these const T* weights, const size_t numPoints, const bool doScaling = false); // Unweighted: template IMATH_INTERNAL_NAMESPACE::M44d procrustesRotationAndTranslation (const IMATH_INTERNAL_NAMESPACE::Vec3* A, const IMATH_INTERNAL_NAMESPACE::Vec3* B, const size_t numPoints, const bool doScaling = false); // Compute the SVD of a 3x3 matrix using Jacobi transformations. This method // should be quite accurate (competitive with LAPACK) even for poorly // conditioned matrices, and because it has been written specifically for the // 3x3/4x4 case it is much faster than calling out to LAPACK. // // The SVD of a 3x3/4x4 matrix A is defined as follows: // A = U * S * V^T // where S is the diagonal matrix of singular values and both U and V are // orthonormal. By convention, the entries S are all positive and sorted from // the largest to the smallest. However, some uses of this function may // require that the matrix U*V^T have positive determinant; in this case, we // may make the smallest singular value negative to ensure that this is // satisfied. // // Currently only available for single- and double-precision matrices. template void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33& A, IMATH_INTERNAL_NAMESPACE::Matrix33& U, IMATH_INTERNAL_NAMESPACE::Vec3& S, IMATH_INTERNAL_NAMESPACE::Matrix33& V, const T tol = IMATH_INTERNAL_NAMESPACE::limits::epsilon(), const bool forcePositiveDeterminant = false); template void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44& A, IMATH_INTERNAL_NAMESPACE::Matrix44& U, IMATH_INTERNAL_NAMESPACE::Vec4& S, IMATH_INTERNAL_NAMESPACE::Matrix44& V, const T tol = IMATH_INTERNAL_NAMESPACE::limits::epsilon(), const bool forcePositiveDeterminant = false); // Compute the eigenvalues (S) and the eigenvectors (V) of // a real symmetric matrix using Jacobi transformation. // // Jacobi transformation of a 3x3/4x4 matrix A outputs S and V: // A = V * S * V^T // where V is orthonormal and S is the diagonal matrix of eigenvalues. // Input matrix A must be symmetric. A is also modified during // the computation so that upper diagonal entries of A become zero. // template void jacobiEigenSolver (Matrix33& A, Vec3& S, Matrix33& V, const T tol); template inline void jacobiEigenSolver (Matrix33& A, Vec3& S, Matrix33& V) { jacobiEigenSolver(A,S,V,limits::epsilon()); } template void jacobiEigenSolver (Matrix44& A, Vec4& S, Matrix44& V, const T tol); template inline void jacobiEigenSolver (Matrix44& A, Vec4& S, Matrix44& V) { jacobiEigenSolver(A,S,V,limits::epsilon()); } // Compute a eigenvector corresponding to the abs max/min eigenvalue // of a real symmetric matrix using Jacobi transformation. template void maxEigenVector (TM& A, TV& S); template void minEigenVector (TM& A, TV& S); IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHMATRIXALGO_H openexr-2.5.7/IlmBase/Imath/ImathNamespace.h000066400000000000000000000106111406177042200206150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHNAMESPACE_H #define INCLUDED_IMATHNAMESPACE_H // // The purpose of this file is to make it possible to specify an // IMATH_INTERNAL_NAMESPACE as a preprocessor definition and have all of the // Imath symbols defined within that namespace rather than the standard // Imath namespace. Those symbols are made available to client code through // the IMATH_NAMESPACE in addition to the IMATH_INTERNAL_NAMESPACE. // // To ensure source code compatibility, the IMATH_NAMESPACE defaults to Imath // and then "using namespace IMATH_INTERNAL_NAMESPACE;" brings all of the // declarations from the IMATH_INTERNAL_NAMESPACE into the IMATH_NAMESPACE. // This means that client code can continue to use syntax like Imath::V3f, // but at link time it will resolve to a mangled symbol based on the // IMATH_INTERNAL_NAMESPACE. // // As an example, if one needed to build against a newer version of Imath and // have it run alongside an older version in the same application, it is now // possible to use an internal namespace to prevent collisions between the // older versions of Imath symbols and the newer ones. To do this, the // following could be defined at build time: // // IMATH_INTERNAL_NAMESPACE = Imath_v2 // // This means that declarations inside Imath headers look like this (after // the preprocessor has done its work): // // namespace Imath_v2 { // ... // class declarations // ... // } // // namespace Imath { // using namespace Imath_v2; // } // // // Open Source version of this file pulls in the IlmBaseConfig.h file // for the configure time options. // #include "IlmBaseConfig.h" #ifndef IMATH_NAMESPACE #define IMATH_NAMESPACE Imath #endif #ifndef IMATH_INTERNAL_NAMESPACE #define IMATH_INTERNAL_NAMESPACE IMATH_NAMESPACE #endif // // We need to be sure that we import the internal namespace into the public one. // To do this, we use the small bit of code below which initially defines // IMATH_INTERNAL_NAMESPACE (so it can be referenced) and then defines // IMATH_NAMESPACE and pulls the internal symbols into the public // namespace. // namespace IMATH_INTERNAL_NAMESPACE {} namespace IMATH_NAMESPACE { using namespace IMATH_INTERNAL_NAMESPACE; } // // There are identical pairs of HEADER/SOURCE ENTER/EXIT macros so that // future extension to the namespace mechanism is possible without changing // project source code. // #define IMATH_INTERNAL_NAMESPACE_HEADER_ENTER namespace IMATH_INTERNAL_NAMESPACE { #define IMATH_INTERNAL_NAMESPACE_HEADER_EXIT } #define IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER namespace IMATH_INTERNAL_NAMESPACE { #define IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT } #endif /* INCLUDED_IMATHNAMESPACE_H */ openexr-2.5.7/IlmBase/Imath/ImathPlane.h000066400000000000000000000154011406177042200177620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHPLANE_H #define INCLUDED_IMATHPLANE_H //---------------------------------------------------------------------- // // template class Plane3 // // The Imath::Plane3<> class represents a half space, so the // normal may point either towards or away from origin. The // plane P can be represented by Imath::Plane3 as either p or -p // corresponding to the two half-spaces on either side of the // plane. Any function which computes a distance will return // either negative or positive values for the distance indicating // which half-space the point is in. Note that reflection, and // intersection functions will operate as expected. // //---------------------------------------------------------------------- #include "ImathVec.h" #include "ImathLine.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Plane3 { public: Vec3 normal; T distance; Plane3() {} Plane3(const Vec3 &normal, T distance); Plane3(const Vec3 &point, const Vec3 &normal); Plane3(const Vec3 &point1, const Vec3 &point2, const Vec3 &point3); //---------------------- // Various set methods //---------------------- void set(const Vec3 &normal, T distance); void set(const Vec3 &point, const Vec3 &normal); void set(const Vec3 &point1, const Vec3 &point2, const Vec3 &point3 ); //---------------------- // Utilities //---------------------- bool intersect(const Line3 &line, Vec3 &intersection) const; bool intersectT(const Line3 &line, T ¶meter) const; T distanceTo(const Vec3 &) const; Vec3 reflectPoint(const Vec3 &) const; Vec3 reflectVector(const Vec3 &) const; }; //-------------------- // Convenient typedefs //-------------------- typedef Plane3 Plane3f; typedef Plane3 Plane3d; //--------------- // Implementation //--------------- template inline Plane3::Plane3(const Vec3 &p0, const Vec3 &p1, const Vec3 &p2) { set(p0,p1,p2); } template inline Plane3::Plane3(const Vec3 &n, T d) { set(n, d); } template inline Plane3::Plane3(const Vec3 &p, const Vec3 &n) { set(p, n); } template inline void Plane3::set(const Vec3& point1, const Vec3& point2, const Vec3& point3) { normal = (point2 - point1) % (point3 - point1); normal.normalize(); distance = normal ^ point1; } template inline void Plane3::set(const Vec3& point, const Vec3& n) { normal = n; normal.normalize(); distance = normal ^ point; } template inline void Plane3::set(const Vec3& n, T d) { normal = n; normal.normalize(); distance = d; } template inline T Plane3::distanceTo(const Vec3 &point) const { return (point ^ normal) - distance; } template inline Vec3 Plane3::reflectPoint(const Vec3 &point) const { return normal * distanceTo(point) * -2.0 + point; } template inline Vec3 Plane3::reflectVector(const Vec3 &v) const { return normal * (normal ^ v) * 2.0 - v; } template inline bool Plane3::intersect(const Line3& line, Vec3& point) const { T d = normal ^ line.dir; if ( d == 0.0 ) return false; T t = - ((normal ^ line.pos) - distance) / d; point = line(t); return true; } template inline bool Plane3::intersectT(const Line3& line, T &t) const { T d = normal ^ line.dir; if ( d == 0.0 ) return false; t = - ((normal ^ line.pos) - distance) / d; return true; } template std::ostream &operator<< (std::ostream &o, const Plane3 &plane) { return o << "(" << plane.normal << ", " << plane.distance << ")"; } template Plane3 operator* (const Plane3 &plane, const Matrix44 &M) { // T // -1 // Could also compute M but that would suck. // Vec3 dir1 = Vec3 (1, 0, 0) % plane.normal; T dir1Len = dir1 ^ dir1; Vec3 tmp = Vec3 (0, 1, 0) % plane.normal; T tmpLen = tmp ^ tmp; if (tmpLen > dir1Len) { dir1 = tmp; dir1Len = tmpLen; } tmp = Vec3 (0, 0, 1) % plane.normal; tmpLen = tmp ^ tmp; if (tmpLen > dir1Len) { dir1 = tmp; } Vec3 dir2 = dir1 % plane.normal; Vec3 point = plane.distance * plane.normal; return Plane3 ( point * M, (point + dir2) * M, (point + dir1) * M ); } template Plane3 operator- (const Plane3 &plane) { return Plane3(-plane.normal,-plane.distance); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHPLANE_H openexr-2.5.7/IlmBase/Imath/ImathPlatform.h000066400000000000000000000063531406177042200205150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHPLATFORM_H #define INCLUDED_IMATHPLATFORM_H //---------------------------------------------------------------------------- // // ImathPlatform.h // // This file contains functions and constants which aren't // provided by the system libraries, compilers, or includes on // certain platforms. // //---------------------------------------------------------------------------- #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 // pi/2 #endif //----------------------------------------------------------------------------- // // Some, but not all, C++ compilers support the C99 restrict // keyword or some variant of it, for example, __restrict. // //----------------------------------------------------------------------------- #if defined __GNUC__ // // supports __restrict // #define IMATH_RESTRICT __restrict #elif defined (__INTEL_COMPILER) || \ defined(__ICL) || \ defined(__ICC) || \ defined(__ECC) // // supports restrict // #define IMATH_RESTRICT restrict #elif defined __sgi // // supports restrict // #define IMATH_RESTRICT restrict #elif defined _MSC_VER // // supports __restrict // // #define IMATH_RESTRICT __restrict #define IMATH_RESTRICT #else // // restrict / __restrict not supported // #define IMATH_RESTRICT #endif #endif // INCLUDED_IMATHPLATFORM_H openexr-2.5.7/IlmBase/Imath/ImathQuat.h000066400000000000000000000523161406177042200176430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHQUAT_H #define INCLUDED_IMATHQUAT_H //---------------------------------------------------------------------- // // template class Quat // // "Quaternions came from Hamilton ... and have been an unmixed // evil to those who have touched them in any way. Vector is a // useless survival ... and has never been of the slightest use // to any creature." // // - Lord Kelvin // // This class implements the quaternion numerical type -- you // will probably want to use this class to represent orientations // in R3 and to convert between various euler angle reps. You // should probably use Imath::Euler<> for that. // //---------------------------------------------------------------------- #include "ImathExc.h" #include "ImathMatrix.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER // Disable MS VC++ warnings about conversion from double to float #pragma warning(disable:4244) #endif template class Quat { public: T r; // real part Vec3 v; // imaginary vector //----------------------------------------------------- // Constructors - default constructor is identity quat //----------------------------------------------------- Quat (); template Quat (const Quat &q); Quat (T s, T i, T j, T k); Quat (T s, Vec3 d); static Quat identity (); //------------------- // Copy constructor //------------------- Quat (const Quat &q); //------------- // Destructor //------------- ~Quat () = default; //------------------------------------------------- // Basic Algebra - Operators and Methods // The operator return values are *NOT* normalized // // operator^ and euclideanInnnerProduct() both // implement the 4D dot product // // operator/ uses the inverse() quaternion // // operator~ is conjugate -- if (S+V) is quat then // the conjugate (S+V)* == (S-V) // // some operators (*,/,*=,/=) treat the quat as // a 4D vector when one of the operands is scalar //------------------------------------------------- const Quat & operator = (const Quat &q); const Quat & operator *= (const Quat &q); const Quat & operator *= (T t); const Quat & operator /= (const Quat &q); const Quat & operator /= (T t); const Quat & operator += (const Quat &q); const Quat & operator -= (const Quat &q); T & operator [] (int index); // as 4D vector T operator [] (int index) const; template bool operator == (const Quat &q) const; template bool operator != (const Quat &q) const; Quat & invert (); // this -> 1 / this Quat inverse () const; Quat & normalize (); // returns this Quat normalized () const; T length () const; // in R4 Vec3 rotateVector(const Vec3 &original) const; T euclideanInnerProduct(const Quat &q) const; //----------------------- // Rotation conversion //----------------------- Quat & setAxisAngle (const Vec3 &axis, T radians); Quat & setRotation (const Vec3 &fromDirection, const Vec3 &toDirection); T angle () const; Vec3 axis () const; Matrix33 toMatrix33 () const; Matrix44 toMatrix44 () const; Quat log () const; Quat exp () const; private: void setRotationInternal (const Vec3 &f0, const Vec3 &t0, Quat &q); }; template Quat slerp (const Quat &q1, const Quat &q2, T t); template Quat slerpShortestArc (const Quat &q1, const Quat &q2, T t); template Quat squad (const Quat &q1, const Quat &q2, const Quat &qa, const Quat &qb, T t); template void intermediate (const Quat &q0, const Quat &q1, const Quat &q2, const Quat &q3, Quat &qa, Quat &qb); template Matrix33 operator * (const Matrix33 &M, const Quat &q); template Matrix33 operator * (const Quat &q, const Matrix33 &M); template std::ostream & operator << (std::ostream &o, const Quat &q); template Quat operator * (const Quat &q1, const Quat &q2); template Quat operator / (const Quat &q1, const Quat &q2); template Quat operator / (const Quat &q, T t); template Quat operator * (const Quat &q, T t); template Quat operator * (T t, const Quat &q); template Quat operator + (const Quat &q1, const Quat &q2); template Quat operator - (const Quat &q1, const Quat &q2); template Quat operator ~ (const Quat &q); template Quat operator - (const Quat &q); template Vec3 operator * (const Vec3 &v, const Quat &q); //-------------------- // Convenient typedefs //-------------------- typedef Quat Quatf; typedef Quat Quatd; //--------------- // Implementation //--------------- template inline Quat::Quat (): r (1), v (0, 0, 0) { // empty } template template inline Quat::Quat (const Quat &q): r (q.r), v (q.v) { // empty } template inline Quat::Quat (T s, T i, T j, T k): r (s), v (i, j, k) { // empty } template inline Quat::Quat (T s, Vec3 d): r (s), v (d) { // empty } template inline Quat::Quat(const Quat &q) { operator=(q); } template inline Quat Quat::identity () { return Quat(); } template inline const Quat & Quat::operator = (const Quat &q) { r = q.r; v = q.v; return *this; } template inline const Quat & Quat::operator *= (const Quat &q) { T rtmp = r * q.r - (v ^ q.v); v = r * q.v + v * q.r + v % q.v; r = rtmp; return *this; } template inline const Quat & Quat::operator *= (T t) { r *= t; v *= t; return *this; } template inline const Quat & Quat::operator /= (const Quat &q) { *this = *this * q.inverse(); return *this; } template inline const Quat & Quat::operator /= (T t) { r /= t; v /= t; return *this; } template inline const Quat & Quat::operator += (const Quat &q) { r += q.r; v += q.v; return *this; } template inline const Quat & Quat::operator -= (const Quat &q) { r -= q.r; v -= q.v; return *this; } template inline T & Quat::operator [] (int index) { return index ? v[index - 1] : r; } template inline T Quat::operator [] (int index) const { return index ? v[index - 1] : r; } template template inline bool Quat::operator == (const Quat &q) const { return r == q.r && v == q.v; } template template inline bool Quat::operator != (const Quat &q) const { return r != q.r || v != q.v; } template inline T operator ^ (const Quat& q1 ,const Quat& q2) { return q1.r * q2.r + (q1.v ^ q2.v); } template inline T Quat::length () const { return Math::sqrt (r * r + (v ^ v)); } template inline Quat & Quat::normalize () { if (T l = length()) { r /= l; v /= l; } else { r = 1; v = Vec3 (0); } return *this; } template inline Quat Quat::normalized () const { if (T l = length()) return Quat (r / l, v / l); return Quat(); } template inline Quat Quat::inverse () const { // // 1 Q* // - = ---- where Q* is conjugate (operator~) // Q Q* Q and (Q* Q) == Q ^ Q (4D dot) // T qdot = *this ^ *this; return Quat (r / qdot, -v / qdot); } template inline Quat & Quat::invert () { T qdot = (*this) ^ (*this); r /= qdot; v = -v / qdot; return *this; } template inline Vec3 Quat::rotateVector(const Vec3& original) const { // // Given a vector p and a quaternion q (aka this), // calculate p' = qpq* // // Assumes unit quaternions (because non-unit // quaternions cannot be used to rotate vectors // anyway). // Quat vec (0, original); // temporarily promote grade of original Quat inv (*this); inv.v *= -1; // unit multiplicative inverse Quat result = *this * vec * inv; return result.v; } template inline T Quat::euclideanInnerProduct (const Quat &q) const { return r * q.r + v.x * q.v.x + v.y * q.v.y + v.z * q.v.z; } template T angle4D (const Quat &q1, const Quat &q2) { // // Compute the angle between two quaternions, // interpreting the quaternions as 4D vectors. // Quat d = q1 - q2; T lengthD = Math::sqrt (d ^ d); Quat s = q1 + q2; T lengthS = Math::sqrt (s ^ s); return 2 * Math::atan2 (lengthD, lengthS); } template Quat slerp (const Quat &q1, const Quat &q2, T t) { // // Spherical linear interpolation. // Assumes q1 and q2 are normalized and that q1 != -q2. // // This method does *not* interpolate along the shortest // arc between q1 and q2. If you desire interpolation // along the shortest arc, and q1^q2 is negative, then // consider calling slerpShortestArc(), below, or flipping // the second quaternion explicitly. // // The implementation of squad() depends on a slerp() // that interpolates as is, without the automatic // flipping. // // Don Hatch explains the method we use here on his // web page, The Right Way to Calculate Stuff, at // http://www.plunk.org/~hatch/rightway.php // T a = angle4D (q1, q2); T s = 1 - t; Quat q = sinx_over_x (s * a) / sinx_over_x (a) * s * q1 + sinx_over_x (t * a) / sinx_over_x (a) * t * q2; return q.normalized(); } template Quat slerpShortestArc (const Quat &q1, const Quat &q2, T t) { // // Spherical linear interpolation along the shortest // arc from q1 to either q2 or -q2, whichever is closer. // Assumes q1 and q2 are unit quaternions. // if ((q1 ^ q2) >= 0) return slerp (q1, q2, t); else return slerp (q1, -q2, t); } template Quat spline (const Quat &q0, const Quat &q1, const Quat &q2, const Quat &q3, T t) { // // Spherical Cubic Spline Interpolation - // from Advanced Animation and Rendering // Techniques by Watt and Watt, Page 366: // A spherical curve is constructed using three // spherical linear interpolations of a quadrangle // of unit quaternions: q1, qa, qb, q2. // Given a set of quaternion keys: q0, q1, q2, q3, // this routine does the interpolation between // q1 and q2 by constructing two intermediate // quaternions: qa and qb. The qa and qb are // computed by the intermediate function to // guarantee the continuity of tangents across // adjacent cubic segments. The qa represents in-tangent // for q1 and the qb represents the out-tangent for q2. // // The q1 q2 is the cubic segment being interpolated. // The q0 is from the previous adjacent segment and q3 is // from the next adjacent segment. The q0 and q3 are used // in computing qa and qb. // Quat qa = intermediate (q0, q1, q2); Quat qb = intermediate (q1, q2, q3); Quat result = squad (q1, qa, qb, q2, t); return result; } template Quat squad (const Quat &q1, const Quat &qa, const Quat &qb, const Quat &q2, T t) { // // Spherical Quadrangle Interpolation - // from Advanced Animation and Rendering // Techniques by Watt and Watt, Page 366: // It constructs a spherical cubic interpolation as // a series of three spherical linear interpolations // of a quadrangle of unit quaternions. // Quat r1 = slerp (q1, q2, t); Quat r2 = slerp (qa, qb, t); Quat result = slerp (r1, r2, 2 * t * (1 - t)); return result; } template Quat intermediate (const Quat &q0, const Quat &q1, const Quat &q2) { // // From advanced Animation and Rendering // Techniques by Watt and Watt, Page 366: // computing the inner quadrangle // points (qa and qb) to guarantee tangent // continuity. // Quat q1inv = q1.inverse(); Quat c1 = q1inv * q2; Quat c2 = q1inv * q0; Quat c3 = (T) (-0.25) * (c2.log() + c1.log()); Quat qa = q1 * c3.exp(); qa.normalize(); return qa; } template inline Quat Quat::log () const { // // For unit quaternion, from Advanced Animation and // Rendering Techniques by Watt and Watt, Page 366: // T theta = Math::acos (std::min (r, (T) 1.0)); if (theta == 0) return Quat (0, v); T sintheta = Math::sin (theta); T k; if (abs (sintheta) < 1 && abs (theta) >= limits::max() * abs (sintheta)) k = 1; else k = theta / sintheta; return Quat ((T) 0, v.x * k, v.y * k, v.z * k); } template inline Quat Quat::exp () const { // // For pure quaternion (zero scalar part): // from Advanced Animation and Rendering // Techniques by Watt and Watt, Page 366: // T theta = v.length(); T sintheta = Math::sin (theta); T k; if (abs (theta) < 1 && abs (sintheta) >= limits::max() * abs (theta)) k = 1; else k = sintheta / theta; T costheta = Math::cos (theta); return Quat (costheta, v.x * k, v.y * k, v.z * k); } template inline T Quat::angle () const { return 2 * Math::atan2 (v.length(), r); } template inline Vec3 Quat::axis () const { return v.normalized(); } template inline Quat & Quat::setAxisAngle (const Vec3 &axis, T radians) { r = Math::cos (radians / 2); v = axis.normalized() * Math::sin (radians / 2); return *this; } template Quat & Quat::setRotation (const Vec3 &from, const Vec3 &to) { // // Create a quaternion that rotates vector from into vector to, // such that the rotation is around an axis that is the cross // product of from and to. // // This function calls function setRotationInternal(), which is // numerically accurate only for rotation angles that are not much // greater than pi/2. In order to achieve good accuracy for angles // greater than pi/2, we split large angles in half, and rotate in // two steps. // // // Normalize from and to, yielding f0 and t0. // Vec3 f0 = from.normalized(); Vec3 t0 = to.normalized(); if ((f0 ^ t0) >= 0) { // // The rotation angle is less than or equal to pi/2. // setRotationInternal (f0, t0, *this); } else { // // The angle is greater than pi/2. After computing h0, // which is halfway between f0 and t0, we rotate first // from f0 to h0, then from h0 to t0. // Vec3 h0 = (f0 + t0).normalized(); if ((h0 ^ h0) != 0) { setRotationInternal (f0, h0, *this); Quat q; setRotationInternal (h0, t0, q); *this *= q; } else { // // f0 and t0 point in exactly opposite directions. // Pick an arbitrary axis that is orthogonal to f0, // and rotate by pi. // r = T (0); Vec3 f02 = f0 * f0; if (f02.x <= f02.y && f02.x <= f02.z) v = (f0 % Vec3 (1, 0, 0)).normalized(); else if (f02.y <= f02.z) v = (f0 % Vec3 (0, 1, 0)).normalized(); else v = (f0 % Vec3 (0, 0, 1)).normalized(); } } return *this; } template void Quat::setRotationInternal (const Vec3 &f0, const Vec3 &t0, Quat &q) { // // The following is equivalent to setAxisAngle(n,2*phi), // where the rotation axis, n, is orthogonal to the f0 and // t0 vectors, and 2*phi is the angle between f0 and t0. // // This function is called by setRotation(), above; it assumes // that f0 and t0 are normalized and that the angle between // them is not much greater than pi/2. This function becomes // numerically inaccurate if f0 and t0 point into nearly // opposite directions. // // // Find a normalized vector, h0, that is halfway between f0 and t0. // The angle between f0 and h0 is phi. // Vec3 h0 = (f0 + t0).normalized(); // // Store the rotation axis and rotation angle. // q.r = f0 ^ h0; // f0 ^ h0 == cos (phi) q.v = f0 % h0; // (f0 % h0).length() == sin (phi) } template Matrix33 Quat::toMatrix33() const { return Matrix33 (1 - 2 * (v.y * v.y + v.z * v.z), 2 * (v.x * v.y + v.z * r), 2 * (v.z * v.x - v.y * r), 2 * (v.x * v.y - v.z * r), 1 - 2 * (v.z * v.z + v.x * v.x), 2 * (v.y * v.z + v.x * r), 2 * (v.z * v.x + v.y * r), 2 * (v.y * v.z - v.x * r), 1 - 2 * (v.y * v.y + v.x * v.x)); } template Matrix44 Quat::toMatrix44() const { return Matrix44 (1 - 2 * (v.y * v.y + v.z * v.z), 2 * (v.x * v.y + v.z * r), 2 * (v.z * v.x - v.y * r), 0, 2 * (v.x * v.y - v.z * r), 1 - 2 * (v.z * v.z + v.x * v.x), 2 * (v.y * v.z + v.x * r), 0, 2 * (v.z * v.x + v.y * r), 2 * (v.y * v.z - v.x * r), 1 - 2 * (v.y * v.y + v.x * v.x), 0, 0, 0, 0, 1); } template inline Matrix33 operator * (const Matrix33 &M, const Quat &q) { return M * q.toMatrix33(); } template inline Matrix33 operator * (const Quat &q, const Matrix33 &M) { return q.toMatrix33() * M; } template std::ostream & operator << (std::ostream &o, const Quat &q) { return o << "(" << q.r << " " << q.v.x << " " << q.v.y << " " << q.v.z << ")"; } template inline Quat operator * (const Quat &q1, const Quat &q2) { return Quat (q1.r * q2.r - (q1.v ^ q2.v), q1.r * q2.v + q1.v * q2.r + q1.v % q2.v); } template inline Quat operator / (const Quat &q1, const Quat &q2) { return q1 * q2.inverse(); } template inline Quat operator / (const Quat &q, T t) { return Quat (q.r / t, q.v / t); } template inline Quat operator * (const Quat &q, T t) { return Quat (q.r * t, q.v * t); } template inline Quat operator * (T t, const Quat &q) { return Quat (q.r * t, q.v * t); } template inline Quat operator + (const Quat &q1, const Quat &q2) { return Quat (q1.r + q2.r, q1.v + q2.v); } template inline Quat operator - (const Quat &q1, const Quat &q2) { return Quat (q1.r - q2.r, q1.v - q2.v); } template inline Quat operator ~ (const Quat &q) { return Quat (q.r, -q.v); } template inline Quat operator - (const Quat &q) { return Quat (-q.r, -q.v); } template inline Vec3 operator * (const Vec3 &v, const Quat &q) { Vec3 a = q.v % v; Vec3 b = q.v % a; return v + T (2) * (q.r * a + b); } #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER #pragma warning(default:4244) #endif IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHQUAT_H openexr-2.5.7/IlmBase/Imath/ImathRandom.cpp000066400000000000000000000133731406177042200205040ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Routines that generate pseudo-random numbers compatible // with the standard erand48(), nrand48(), etc. functions. // //----------------------------------------------------------------------------- #include "ImathRandom.h" #include "ImathInt64.h" IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { // // Static state used by Imath::drand48(), Imath::lrand48() and Imath::srand48() // unsigned short staticState[3] = {0, 0, 0}; void rand48Next (unsigned short state[3]) { // // drand48() and friends are all based on a linear congruential // sequence, // // x[n+1] = (a * x[n] + c) % m, // // where a and c are as specified below, and m == (1 << 48) // static const Int64 a = Int64 (0x5deece66dLL); static const Int64 c = Int64 (0xbLL); // // Assemble the 48-bit value x[n] from the // three 16-bit values stored in state. // Int64 x = (Int64 (state[2]) << 32) | (Int64 (state[1]) << 16) | Int64 (state[0]); // // Compute x[n+1], except for the "modulo m" part. // x = a * x + c; // // Disassemble the 48 least significant bits of x[n+1] into // three 16-bit values. Discard the 16 most significant bits; // this takes care of the "modulo m" operation. // // We assume that sizeof (unsigned short) == 2. // state[2] = (unsigned short)(x >> 32); state[1] = (unsigned short)(x >> 16); state[0] = (unsigned short)(x); } } // namespace double erand48 (unsigned short state[3]) { // // Generate double-precision floating-point values between 0.0 and 1.0: // // The exponent is set to 0x3ff, which indicates a value greater // than or equal to 1.0, and less than 2.0. The 48 most significant // bits of the significand (mantissa) are filled with pseudo-random // bits generated by rand48Next(). The remaining 4 bits are a copy // of the 4 most significant bits of the significand. This results // in bit patterns between 0x3ff0000000000000 and 0x3fffffffffffffff, // which correspond to uniformly distributed floating-point values // between 1.0 and 1.99999999999999978. Subtracting 1.0 from those // values produces numbers between 0.0 and 0.99999999999999978, that // is, between 0.0 and 1.0-DBL_EPSILON. // rand48Next (state); union {double d; Int64 i;} u; u.i = (Int64 (0x3ff) << 52) | // sign and exponent (Int64 (state[2]) << 36) | // significand (Int64 (state[1]) << 20) | (Int64 (state[0]) << 4) | (Int64 (state[2]) >> 12); return u.d - 1; } double drand48 () { return IMATH_INTERNAL_NAMESPACE::erand48 (staticState); } long int nrand48 (unsigned short state[3]) { // // Generate uniformly distributed integers between 0 and 0x7fffffff. // rand48Next (state); return ((long int) (state[2]) << 15) | ((long int) (state[1]) >> 1); } long int lrand48 () { return IMATH_INTERNAL_NAMESPACE::nrand48 (staticState); } void srand48 (long int seed) { staticState[2] = (unsigned short)(seed >> 16); staticState[1] = (unsigned short)(seed); staticState[0] = 0x330e; } float Rand32::nextf () { // // Generate single-precision floating-point values between 0.0 and 1.0: // // The exponent is set to 0x7f, which indicates a value greater than // or equal to 1.0, and less than 2.0. The 23 bits of the significand // (mantissa) are filled with pseudo-random bits generated by // Rand32::next(). This results in in bit patterns between 0x3f800000 // and 0x3fffffff, which correspond to uniformly distributed floating- // point values between 1.0 and 1.99999988. Subtracting 1.0 from // those values produces numbers between 0.0 and 0.99999988, that is, // between 0.0 and 1.0-FLT_EPSILON. // next (); union {float f; unsigned int i;} u; u.i = 0x3f800000 | (_state & 0x7fffff); return u.f - 1; } IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathRandom.h000066400000000000000000000235411406177042200201470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHRANDOM_H #define INCLUDED_IMATHRANDOM_H //----------------------------------------------------------------------------- // // Generators for uniformly distributed pseudo-random numbers and // functions that use those generators to generate numbers with // non-uniform distributions: // // class Rand32 // class Rand48 // solidSphereRand() // hollowSphereRand() // gaussRand() // gaussSphereRand() // // Note: class Rand48() calls erand48() and nrand48(), which are not // available on all operating systems. For compatibility we include // our own versions of erand48() and nrand48(). Our functions have // been reverse-engineered from the corresponding Unix/Linux man page. // //----------------------------------------------------------------------------- #include "ImathNamespace.h" #include "ImathExport.h" #include #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------- // Fast random-number generator that generates // a uniformly distributed sequence with a period // length of 2^32. //----------------------------------------------- class IMATH_EXPORT Rand32 { public: //------------ // Constructor //------------ Rand32 (unsigned long int seed = 0); //-------------------------------- // Re-initialize with a given seed //-------------------------------- void init (unsigned long int seed); //---------------------------------------------------------- // Get the next value in the sequence (range: [false, true]) //---------------------------------------------------------- bool nextb (); //--------------------------------------------------------------- // Get the next value in the sequence (range: [0 ... 0xffffffff]) //--------------------------------------------------------------- unsigned long int nexti (); //------------------------------------------------------ // Get the next value in the sequence (range: [0 ... 1[) //------------------------------------------------------ float nextf (); //------------------------------------------------------------------- // Get the next value in the sequence (range [rangeMin ... rangeMax[) //------------------------------------------------------------------- float nextf (float rangeMin, float rangeMax); private: void next (); unsigned long int _state; }; //-------------------------------------------------------- // Random-number generator based on the C Standard Library // functions erand48(), nrand48() & company; generates a // uniformly distributed sequence. //-------------------------------------------------------- class Rand48 { public: //------------ // Constructor //------------ Rand48 (unsigned long int seed = 0); //-------------------------------- // Re-initialize with a given seed //-------------------------------- void init (unsigned long int seed); //---------------------------------------------------------- // Get the next value in the sequence (range: [false, true]) //---------------------------------------------------------- bool nextb (); //--------------------------------------------------------------- // Get the next value in the sequence (range: [0 ... 0x7fffffff]) //--------------------------------------------------------------- long int nexti (); //------------------------------------------------------ // Get the next value in the sequence (range: [0 ... 1[) //------------------------------------------------------ double nextf (); //------------------------------------------------------------------- // Get the next value in the sequence (range [rangeMin ... rangeMax[) //------------------------------------------------------------------- double nextf (double rangeMin, double rangeMax); private: unsigned short int _state[3]; }; //------------------------------------------------------------ // Return random points uniformly distributed in a sphere with // radius 1 around the origin (distance from origin <= 1). //------------------------------------------------------------ template Vec solidSphereRand (Rand &rand); //------------------------------------------------------------- // Return random points uniformly distributed on the surface of // a sphere with radius 1 around the origin. //------------------------------------------------------------- template Vec hollowSphereRand (Rand &rand); //----------------------------------------------- // Return random numbers with a normal (Gaussian) // distribution with zero mean and unit variance. //----------------------------------------------- template float gaussRand (Rand &rand); //---------------------------------------------------- // Return random points whose distance from the origin // has a normal (Gaussian) distribution with zero mean // and unit variance. //---------------------------------------------------- template Vec gaussSphereRand (Rand &rand); //--------------------------------- // erand48(), nrand48() and friends //--------------------------------- IMATH_EXPORT double erand48 (unsigned short state[3]); IMATH_EXPORT double drand48 (); IMATH_EXPORT long int nrand48 (unsigned short state[3]); IMATH_EXPORT long int lrand48 (); IMATH_EXPORT void srand48 (long int seed); //--------------- // Implementation //--------------- inline void Rand32::init (unsigned long int seed) { _state = (seed * 0xa5a573a5L) ^ 0x5a5a5a5aL; } inline Rand32::Rand32 (unsigned long int seed) { init (seed); } inline void Rand32::next () { _state = 1664525L * _state + 1013904223L; } inline bool Rand32::nextb () { next (); // Return the 31st (most significant) bit, by and-ing with 2 ^ 31. return !!(_state & 2147483648UL); } inline unsigned long int Rand32::nexti () { next (); return _state & 0xffffffff; } inline float Rand32::nextf (float rangeMin, float rangeMax) { float f = nextf(); return rangeMin * (1 - f) + rangeMax * f; } inline void Rand48::init (unsigned long int seed) { seed = (seed * 0xa5a573a5L) ^ 0x5a5a5a5aL; _state[0] = (unsigned short int) (seed & 0xFFFF); _state[1] = (unsigned short int) ((seed >> 16) & 0xFFFF); _state[2] = (unsigned short int) (seed & 0xFFFF); } inline Rand48::Rand48 (unsigned long int seed) { init (seed); } inline bool Rand48::nextb () { return nrand48 (_state) & 1; } inline long int Rand48::nexti () { return nrand48 (_state); } inline double Rand48::nextf () { return erand48 (_state); } inline double Rand48::nextf (double rangeMin, double rangeMax) { double f = nextf(); return rangeMin * (1 - f) + rangeMax * f; } template Vec solidSphereRand (Rand &rand) { Vec v; do { for (unsigned int i = 0; i < Vec::dimensions(); i++) v[i] = (typename Vec::BaseType) rand.nextf (-1, 1); } while (v.length2() > 1); return v; } template Vec hollowSphereRand (Rand &rand) { Vec v; typename Vec::BaseType length; do { for (unsigned int i = 0; i < Vec::dimensions(); i++) v[i] = (typename Vec::BaseType) rand.nextf (-1, 1); length = v.length(); } while (length > 1 || length == 0); return v / length; } template float gaussRand (Rand &rand) { float x; // Note: to avoid numerical problems with very small float y; // numbers, we make these variables singe-precision float length2; // floats, but later we call the double-precision log() // and sqrt() functions instead of logf() and sqrtf(). do { x = float (rand.nextf (-1, 1)); y = float (rand.nextf (-1, 1)); length2 = x * x + y * y; } while (length2 >= 1 || length2 == 0); return x * sqrt (-2 * log (double (length2)) / length2); } template Vec gaussSphereRand (Rand &rand) { return hollowSphereRand (rand) * gaussRand (rand); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHRANDOM_H openexr-2.5.7/IlmBase/Imath/ImathRoots.h000066400000000000000000000131761406177042200200400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHROOTS_H #define INCLUDED_IMATHROOTS_H //--------------------------------------------------------------------- // // Functions to solve linear, quadratic or cubic equations // //--------------------------------------------------------------------- #include "ImathMath.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER //-------------------------------------------------------------------------- // Find the real solutions of a linear, quadratic or cubic equation: // // function equation solved // // solveLinear (a, b, x) a * x + b == 0 // solveQuadratic (a, b, c, x) a * x*x + b * x + c == 0 // solveNormalizedCubic (r, s, t, x) x*x*x + r * x*x + s * x + t == 0 // solveCubic (a, b, c, d, x) a * x*x*x + b * x*x + c * x + d == 0 // // Return value: // // 3 three real solutions, stored in x[0], x[1] and x[2] // 2 two real solutions, stored in x[0] and x[1] // 1 one real solution, stored in x[1] // 0 no real solutions // -1 all real numbers are solutions // // Notes: // // * It is possible that an equation has real solutions, but that the // solutions (or some intermediate result) are not representable. // In this case, either some of the solutions returned are invalid // (nan or infinity), or, if floating-point exceptions have been // enabled with Iex::mathExcOn(), an Iex::MathExc exception is // thrown. // // * Cubic equations are solved using Cardano's Formula; even though // only real solutions are produced, some intermediate results are // complex (std::complex). // //-------------------------------------------------------------------------- template int solveLinear (T a, T b, T &x); template int solveQuadratic (T a, T b, T c, T x[2]); template int solveNormalizedCubic (T r, T s, T t, T x[3]); template int solveCubic (T a, T b, T c, T d, T x[3]); //--------------- // Implementation //--------------- template int solveLinear (T a, T b, T &x) { if (a != 0) { x = -b / a; return 1; } else if (b != 0) { return 0; } else { return -1; } } template int solveQuadratic (T a, T b, T c, T x[2]) { if (a == 0) { return solveLinear (b, c, x[0]); } else { T D = b * b - 4 * a * c; if (D > 0) { T s = Math::sqrt (D); T q = -(b + (b > 0 ? 1 : -1) * s) / T(2); x[0] = q / a; x[1] = c / q; return 2; } if (D == 0) { x[0] = -b / (2 * a); return 1; } else { return 0; } } } template int solveNormalizedCubic (T r, T s, T t, T x[3]) { T p = (3 * s - r * r) / 3; T q = 2 * r * r * r / 27 - r * s / 3 + t; T p3 = p / 3; T q2 = q / 2; T D = p3 * p3 * p3 + q2 * q2; if (D == 0 && p3 == 0) { x[0] = -r / 3; x[1] = -r / 3; x[2] = -r / 3; return 1; } std::complex u = std::pow (-q / 2 + std::sqrt (std::complex (D)), T (1) / T (3)); std::complex v = -p / (T (3) * u); const T sqrt3 = T (1.73205080756887729352744634150587); // enough digits // for long double std::complex y0 (u + v); std::complex y1 (-(u + v) / T (2) + (u - v) / T (2) * std::complex (0, sqrt3)); std::complex y2 (-(u + v) / T (2) - (u - v) / T (2) * std::complex (0, sqrt3)); if (D > 0) { x[0] = y0.real() - r / 3; return 1; } else if (D == 0) { x[0] = y0.real() - r / 3; x[1] = y1.real() - r / 3; return 2; } else { x[0] = y0.real() - r / 3; x[1] = y1.real() - r / 3; x[2] = y2.real() - r / 3; return 3; } } template int solveCubic (T a, T b, T c, T d, T x[3]) { if (a == 0) { return solveQuadratic (b, c, d, x); } else { return solveNormalizedCubic (b / a, c / a, d / a, x); } } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHROOTS_H openexr-2.5.7/IlmBase/Imath/ImathShear.h000066400000000000000000000340171406177042200177710ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHSHEAR_H #define INCLUDED_IMATHSHEAR_H //---------------------------------------------------- // // Shear6 class template. // //---------------------------------------------------- #include "ImathExc.h" #include "ImathLimits.h" #include "ImathMath.h" #include "ImathVec.h" #include "ImathNamespace.h" #include IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Shear6 { public: //------------------- // Access to elements //------------------- T xy, xz, yz, yx, zx, zy; T & operator [] (int i); const T & operator [] (int i) const; //------------- // Constructors //------------- Shear6 (); // (0 0 0 0 0 0) Shear6 (T XY, T XZ, T YZ); // (XY XZ YZ 0 0 0) Shear6 (const Vec3 &v); // (v.x v.y v.z 0 0 0) template // (v.x v.y v.z 0 0 0) Shear6 (const Vec3 &v); Shear6 (T XY, T XZ, T YZ, // (XY XZ YZ YX ZX ZY) T YX, T ZX, T ZY); //--------------------------------- // Copy constructors and assignment //--------------------------------- Shear6 (const Shear6 &h); template Shear6 (const Shear6 &h); const Shear6 & operator = (const Shear6 &h); template const Shear6 & operator = (const Vec3 &v); //------------ // Destructor //------------ ~Shear6() = default; //---------------------- // Compatibility with Sb //---------------------- template void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY); template void setValue (const Shear6 &h); template void getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const; template void getValue (Shear6 &h) const; T * getValue(); const T * getValue() const; //--------- // Equality //--------- template bool operator == (const Shear6 &h) const; template bool operator != (const Shear6 &h) const; //----------------------------------------------------------------------- // Compare two shears and test if they are "approximately equal": // // equalWithAbsError (h, e) // // Returns true if the coefficients of this and h are the same with // an absolute error of no more than e, i.e., for all i // // abs (this[i] - h[i]) <= e // // equalWithRelError (h, e) // // Returns true if the coefficients of this and h are the same with // a relative error of no more than e, i.e., for all i // // abs (this[i] - h[i]) <= e * abs (this[i]) //----------------------------------------------------------------------- bool equalWithAbsError (const Shear6 &h, T e) const; bool equalWithRelError (const Shear6 &h, T e) const; //------------------------ // Component-wise addition //------------------------ const Shear6 & operator += (const Shear6 &h); Shear6 operator + (const Shear6 &h) const; //--------------------------- // Component-wise subtraction //--------------------------- const Shear6 & operator -= (const Shear6 &h); Shear6 operator - (const Shear6 &h) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Shear6 operator - () const; const Shear6 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Shear6 & operator *= (const Shear6 &h); const Shear6 & operator *= (T a); Shear6 operator * (const Shear6 &h) const; Shear6 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Shear6 & operator /= (const Shear6 &h); const Shear6 & operator /= (T a); Shear6 operator / (const Shear6 &h) const; Shear6 operator / (T a) const; //---------------------------------------------------------- // Number of dimensions, i.e. number of elements in a Shear6 //---------------------------------------------------------- static unsigned int dimensions() {return 6;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} //-------------------------------------------------------------- // Base type -- in templates, which accept a parameter, V, which // could be either a Vec2 or a Shear6, you can refer to T as // V::BaseType //-------------------------------------------------------------- typedef T BaseType; }; //-------------- // Stream output //-------------- template std::ostream & operator << (std::ostream &s, const Shear6 &h); //---------------------------------------------------- // Reverse multiplication: scalar * Shear6 //---------------------------------------------------- template Shear6 operator * (S a, const Shear6 &h); //------------------------- // Typedefs for convenience //------------------------- typedef Vec3 Shear3f; typedef Vec3 Shear3d; typedef Shear6 Shear6f; typedef Shear6 Shear6d; //----------------------- // Implementation of Shear6 //----------------------- template inline T & Shear6::operator [] (int i) { return (&xy)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline const T & Shear6::operator [] (int i) const { return (&xy)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline Shear6::Shear6 () { xy = xz = yz = yx = zx = zy = 0; } template inline Shear6::Shear6 (T XY, T XZ, T YZ) { xy = XY; xz = XZ; yz = YZ; yx = 0; zx = 0; zy = 0; } template inline Shear6::Shear6 (const Vec3 &v) { xy = v.x; xz = v.y; yz = v.z; yx = 0; zx = 0; zy = 0; } template template inline Shear6::Shear6 (const Vec3 &v) { xy = T (v.x); xz = T (v.y); yz = T (v.z); yx = 0; zx = 0; zy = 0; } template inline Shear6::Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY) { xy = XY; xz = XZ; yz = YZ; yx = YX; zx = ZX; zy = ZY; } template inline Shear6::Shear6 (const Shear6 &h) { xy = h.xy; xz = h.xz; yz = h.yz; yx = h.yx; zx = h.zx; zy = h.zy; } template template inline Shear6::Shear6 (const Shear6 &h) { xy = T (h.xy); xz = T (h.xz); yz = T (h.yz); yx = T (h.yx); zx = T (h.zx); zy = T (h.zy); } template inline const Shear6 & Shear6::operator = (const Shear6 &h) { xy = h.xy; xz = h.xz; yz = h.yz; yx = h.yx; zx = h.zx; zy = h.zy; return *this; } template template inline const Shear6 & Shear6::operator = (const Vec3 &v) { xy = T (v.x); xz = T (v.y); yz = T (v.z); yx = 0; zx = 0; zy = 0; return *this; } template template inline void Shear6::setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY) { xy = T (XY); xz = T (XZ); yz = T (YZ); yx = T (YX); zx = T (ZX); zy = T (ZY); } template template inline void Shear6::setValue (const Shear6 &h) { xy = T (h.xy); xz = T (h.xz); yz = T (h.yz); yx = T (h.yx); zx = T (h.zx); zy = T (h.zy); } template template inline void Shear6::getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const { XY = S (xy); XZ = S (xz); YZ = S (yz); YX = S (yx); ZX = S (zx); ZY = S (zy); } template template inline void Shear6::getValue (Shear6 &h) const { h.xy = S (xy); h.xz = S (xz); h.yz = S (yz); h.yx = S (yx); h.zx = S (zx); h.zy = S (zy); } template inline T * Shear6::getValue() { return (T *) &xy; } template inline const T * Shear6::getValue() const { return (const T *) &xy; } template template inline bool Shear6::operator == (const Shear6 &h) const { return xy == h.xy && xz == h.xz && yz == h.yz && yx == h.yx && zx == h.zx && zy == h.zy; } template template inline bool Shear6::operator != (const Shear6 &h) const { return xy != h.xy || xz != h.xz || yz != h.yz || yx != h.yx || zx != h.zx || zy != h.zy; } template bool Shear6::equalWithAbsError (const Shear6 &h, T e) const { for (int i = 0; i < 6; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], h[i], e)) return false; return true; } template bool Shear6::equalWithRelError (const Shear6 &h, T e) const { for (int i = 0; i < 6; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], h[i], e)) return false; return true; } template inline const Shear6 & Shear6::operator += (const Shear6 &h) { xy += h.xy; xz += h.xz; yz += h.yz; yx += h.yx; zx += h.zx; zy += h.zy; return *this; } template inline Shear6 Shear6::operator + (const Shear6 &h) const { return Shear6 (xy + h.xy, xz + h.xz, yz + h.yz, yx + h.yx, zx + h.zx, zy + h.zy); } template inline const Shear6 & Shear6::operator -= (const Shear6 &h) { xy -= h.xy; xz -= h.xz; yz -= h.yz; yx -= h.yx; zx -= h.zx; zy -= h.zy; return *this; } template inline Shear6 Shear6::operator - (const Shear6 &h) const { return Shear6 (xy - h.xy, xz - h.xz, yz - h.yz, yx - h.yx, zx - h.zx, zy - h.zy); } template inline Shear6 Shear6::operator - () const { return Shear6 (-xy, -xz, -yz, -yx, -zx, -zy); } template inline const Shear6 & Shear6::negate () { xy = -xy; xz = -xz; yz = -yz; yx = -yx; zx = -zx; zy = -zy; return *this; } template inline const Shear6 & Shear6::operator *= (const Shear6 &h) { xy *= h.xy; xz *= h.xz; yz *= h.yz; yx *= h.yx; zx *= h.zx; zy *= h.zy; return *this; } template inline const Shear6 & Shear6::operator *= (T a) { xy *= a; xz *= a; yz *= a; yx *= a; zx *= a; zy *= a; return *this; } template inline Shear6 Shear6::operator * (const Shear6 &h) const { return Shear6 (xy * h.xy, xz * h.xz, yz * h.yz, yx * h.yx, zx * h.zx, zy * h.zy); } template inline Shear6 Shear6::operator * (T a) const { return Shear6 (xy * a, xz * a, yz * a, yx * a, zx * a, zy * a); } template inline const Shear6 & Shear6::operator /= (const Shear6 &h) { xy /= h.xy; xz /= h.xz; yz /= h.yz; yx /= h.yx; zx /= h.zx; zy /= h.zy; return *this; } template inline const Shear6 & Shear6::operator /= (T a) { xy /= a; xz /= a; yz /= a; yx /= a; zx /= a; zy /= a; return *this; } template inline Shear6 Shear6::operator / (const Shear6 &h) const { return Shear6 (xy / h.xy, xz / h.xz, yz / h.yz, yx / h.yx, zx / h.zx, zy / h.zy); } template inline Shear6 Shear6::operator / (T a) const { return Shear6 (xy / a, xz / a, yz / a, yx / a, zx / a, zy / a); } //----------------------------- // Stream output implementation //----------------------------- template std::ostream & operator << (std::ostream &s, const Shear6 &h) { return s << '(' << h.xy << ' ' << h.xz << ' ' << h.yz << h.yx << ' ' << h.zx << ' ' << h.zy << ')'; } //----------------------------------------- // Implementation of reverse multiplication //----------------------------------------- template inline Shear6 operator * (S a, const Shear6 &h) { return Shear6 (a * h.xy, a * h.xz, a * h.yz, a * h.yx, a * h.zx, a * h.zy); } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHSHEAR_H openexr-2.5.7/IlmBase/Imath/ImathSphere.h000066400000000000000000000112751406177042200201560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHSPHERE_H #define INCLUDED_IMATHSPHERE_H //------------------------------------- // // A 3D sphere class template // //------------------------------------- #include "ImathVec.h" #include "ImathBox.h" #include "ImathLine.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Sphere3 { public: Vec3 center; T radius; //--------------- // Constructors //--------------- Sphere3() : center(0,0,0), radius(0) {} Sphere3(const Vec3 &c, T r) : center(c), radius(r) {} //------------------------------------------------------------------- // Utilities: // // s.circumscribe(b) sets center and radius of sphere s // so that the s tightly encloses box b. // // s.intersectT (l, t) If sphere s and line l intersect, then // intersectT() computes the smallest t, // t >= 0, so that l(t) is a point on the // sphere. intersectT() then returns true. // // If s and l do not intersect, intersectT() // returns false. // // s.intersect (l, i) If sphere s and line l intersect, then // intersect() calls s.intersectT(l,t) and // computes i = l(t). // // If s and l do not intersect, intersect() // returns false. // //------------------------------------------------------------------- void circumscribe(const Box > &box); bool intersect(const Line3 &l, Vec3 &intersection) const; bool intersectT(const Line3 &l, T &t) const; }; //-------------------- // Convenient typedefs //-------------------- typedef Sphere3 Sphere3f; typedef Sphere3 Sphere3d; //--------------- // Implementation //--------------- template void Sphere3::circumscribe(const Box > &box) { center = T(0.5) * (box.min + box.max); radius = (box.max - center).length(); } template bool Sphere3::intersectT(const Line3 &line, T &t) const { bool doesIntersect = true; Vec3 v = line.pos - center; T B = T(2.0) * (line.dir ^ v); T C = (v ^ v) - (radius * radius); // compute discriminant // if negative, there is no intersection T discr = B*B - T(4.0)*C; if (discr < 0.0) { // line and Sphere3 do not intersect doesIntersect = false; } else { // t0: (-B - sqrt(B^2 - 4AC)) / 2A (A = 1) T sqroot = Math::sqrt(discr); t = (-B - sqroot) * T(0.5); if (t < 0.0) { // no intersection, try t1: (-B + sqrt(B^2 - 4AC)) / 2A (A = 1) t = (-B + sqroot) * T(0.5); } if (t < 0.0) doesIntersect = false; } return doesIntersect; } template bool Sphere3::intersect(const Line3 &line, Vec3 &intersection) const { T t; if (intersectT (line, t)) { intersection = line(t); return true; } else { return false; } } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHSPHERE_H openexr-2.5.7/IlmBase/Imath/ImathVec.cpp000066400000000000000000000257151406177042200200040ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------- // // Specializations of the Vec2 and Vec3 templates. // //---------------------------------------------------------------------------- #include "ImathVec.h" #include "ImathExport.h" #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER // suppress exception specification warnings #pragma warning(disable:4290) #endif IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { template bool normalizeOrThrow(Vec2 &v) { int axis = -1; for (int i = 0; i < 2; i ++) { if (v[i] != 0) { if (axis != -1) { throw IntVecNormalizeExc ("Cannot normalize an integer " "vector unless it is parallel " "to a principal axis"); } axis = i; } } v[axis] = (v[axis] > 0) ? 1 : -1; return true; } template bool normalizeOrThrow(Vec3 &v) { int axis = -1; for (int i = 0; i < 3; i ++) { if (v[i] != 0) { if (axis != -1) { throw IntVecNormalizeExc ("Cannot normalize an integer " "vector unless it is parallel " "to a principal axis"); } axis = i; } } v[axis] = (v[axis] > 0) ? 1 : -1; return true; } template bool normalizeOrThrow(Vec4 &v) { int axis = -1; for (int i = 0; i < 4; i ++) { if (v[i] != 0) { if (axis != -1) { throw IntVecNormalizeExc ("Cannot normalize an integer " "vector unless it is parallel " "to a principal axis"); } axis = i; } } v[axis] = (v[axis] > 0) ? 1 : -1; return true; } } // Vec2 template <> IMATH_EXPORT short Vec2::length () const { float lenF = Math::sqrt ((float)dot (*this)); short lenS = (short) (lenF + 0.5f); return lenS; } template <> IMATH_EXPORT const Vec2 & Vec2::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec2 & Vec2::normalizeExc () { if ((x == 0) && (y == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec2 & Vec2::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec2 Vec2::normalized () const { Vec2 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec2 Vec2::normalizedExc () const { if ((x == 0) && (y == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec2 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec2 Vec2::normalizedNonNull () const { Vec2 v(*this); normalizeOrThrow(v); return v; } // Vec2 template <> IMATH_EXPORT int Vec2::length () const { float lenF = Math::sqrt ((float)dot (*this)); int lenI = (int) (lenF + 0.5f); return lenI; } template <> IMATH_EXPORT const Vec2 & Vec2::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec2 & Vec2::normalizeExc () { if ((x == 0) && (y == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec2 & Vec2::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec2 Vec2::normalized () const { Vec2 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec2 Vec2::normalizedExc () const { if ((x == 0) && (y == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec2 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec2 Vec2::normalizedNonNull () const { Vec2 v(*this); normalizeOrThrow(v); return v; } // Vec3 template <> IMATH_EXPORT short Vec3::length () const { float lenF = Math::sqrt ((float)dot (*this)); short lenS = (short) (lenF + 0.5f); return lenS; } template <> IMATH_EXPORT const Vec3 & Vec3::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec3 & Vec3::normalizeExc () { if ((x == 0) && (y == 0) && (z == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec3 & Vec3::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec3 Vec3::normalized () const { Vec3 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec3 Vec3::normalizedExc () const { if ((x == 0) && (y == 0) && (z == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec3 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec3 Vec3::normalizedNonNull () const { Vec3 v(*this); normalizeOrThrow(v); return v; } // Vec3 template <> IMATH_EXPORT int Vec3::length () const { float lenF = Math::sqrt ((float)dot (*this)); int lenI = (int) (lenF + 0.5f); return lenI; } template <> IMATH_EXPORT const Vec3 & Vec3::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec3 & Vec3::normalizeExc () { if ((x == 0) && (y == 0) && (z == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec3 & Vec3::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec3 Vec3::normalized () const { Vec3 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec3 Vec3::normalizedExc () const { if ((x == 0) && (y == 0) && (z == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec3 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec3 Vec3::normalizedNonNull () const { Vec3 v(*this); normalizeOrThrow(v); return v; } // Vec4 template <> IMATH_EXPORT short Vec4::length () const { float lenF = Math::sqrt ((float)dot (*this)); short lenS = (short) (lenF + 0.5f); return lenS; } template <> IMATH_EXPORT const Vec4 & Vec4::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec4 & Vec4::normalizeExc () { if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec4 & Vec4::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec4 Vec4::normalized () const { Vec4 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec4 Vec4::normalizedExc () const { if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec4 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec4 Vec4::normalizedNonNull () const { Vec4 v(*this); normalizeOrThrow(v); return v; } // Vec4 template <> IMATH_EXPORT int Vec4::length () const { float lenF = Math::sqrt ((float)dot (*this)); int lenI = (int) (lenF + 0.5f); return lenI; } template <> IMATH_EXPORT const Vec4 & Vec4::normalize () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec4 & Vec4::normalizeExc () { if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) throw NullVecExc ("Cannot normalize null vector."); normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT const Vec4 & Vec4::normalizeNonNull () { normalizeOrThrow(*this); return *this; } template <> IMATH_EXPORT Vec4 Vec4::normalized () const { Vec4 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec4 Vec4::normalizedExc () const { if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) throw NullVecExc ("Cannot normalize null vector."); Vec4 v(*this); normalizeOrThrow(v); return v; } template <> IMATH_EXPORT Vec4 Vec4::normalizedNonNull () const { Vec4 v(*this); normalizeOrThrow(v); return v; } IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/IlmBase/Imath/ImathVec.h000066400000000000000000001277021406177042200174500ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHVEC_H #define INCLUDED_IMATHVEC_H //---------------------------------------------------- // // 2D, 3D and 4D point/vector class templates // //---------------------------------------------------- #include "ImathExc.h" #include "ImathLimits.h" #include "ImathMath.h" #include "ImathNamespace.h" #include #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER // suppress exception specification warnings #pragma warning(push) #pragma warning(disable:4290) #endif IMATH_INTERNAL_NAMESPACE_HEADER_ENTER template class Vec2; template class Vec3; template class Vec4; enum InfException {INF_EXCEPTION}; template class Vec2 { public: //------------------- // Access to elements //------------------- T x, y; T & operator [] (int i); const T & operator [] (int i) const; //------------- // Constructors //------------- Vec2 (); // no initialization explicit Vec2 (T a); // (a a) Vec2 (T a, T b); // (a b) //--------------------------------- // Copy constructors and assignment //--------------------------------- Vec2 (const Vec2 &v); template Vec2 (const Vec2 &v); const Vec2 & operator = (const Vec2 &v); //------------ // Destructor //------------ ~Vec2 () = default; //---------------------- // Compatibility with Sb //---------------------- template void setValue (S a, S b); template void setValue (const Vec2 &v); template void getValue (S &a, S &b) const; template void getValue (Vec2 &v) const; T * getValue (); const T * getValue () const; //--------- // Equality //--------- template bool operator == (const Vec2 &v) const; template bool operator != (const Vec2 &v) const; //----------------------------------------------------------------------- // Compare two vectors and test if they are "approximately equal": // // equalWithAbsError (v, e) // // Returns true if the coefficients of this and v are the same with // an absolute error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e // // equalWithRelError (v, e) // // Returns true if the coefficients of this and v are the same with // a relative error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e * abs (this[i]) //----------------------------------------------------------------------- bool equalWithAbsError (const Vec2 &v, T e) const; bool equalWithRelError (const Vec2 &v, T e) const; //------------ // Dot product //------------ T dot (const Vec2 &v) const; T operator ^ (const Vec2 &v) const; //------------------------------------------------ // Right-handed cross product, i.e. z component of // Vec3 (this->x, this->y, 0) % Vec3 (v.x, v.y, 0) //------------------------------------------------ T cross (const Vec2 &v) const; T operator % (const Vec2 &v) const; //------------------------ // Component-wise addition //------------------------ const Vec2 & operator += (const Vec2 &v); Vec2 operator + (const Vec2 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Vec2 & operator -= (const Vec2 &v); Vec2 operator - (const Vec2 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Vec2 operator - () const; const Vec2 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Vec2 & operator *= (const Vec2 &v); const Vec2 & operator *= (T a); Vec2 operator * (const Vec2 &v) const; Vec2 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Vec2 & operator /= (const Vec2 &v); const Vec2 & operator /= (T a); Vec2 operator / (const Vec2 &v) const; Vec2 operator / (T a) const; //---------------------------------------------------------------- // Length and normalization: If v.length() is 0.0, v.normalize() // and v.normalized() produce a null vector; v.normalizeExc() and // v.normalizedExc() throw a NullVecExc. // v.normalizeNonNull() and v.normalizedNonNull() are slightly // faster than the other normalization routines, but if v.length() // is 0.0, the result is undefined. //---------------------------------------------------------------- T length () const; T length2 () const; const Vec2 & normalize (); // modifies *this const Vec2 & normalizeExc (); const Vec2 & normalizeNonNull (); Vec2 normalized () const; // does not modify *this Vec2 normalizedExc () const; Vec2 normalizedNonNull () const; //-------------------------------------------------------- // Number of dimensions, i.e. number of elements in a Vec2 //-------------------------------------------------------- static unsigned int dimensions() {return 2;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} //-------------------------------------------------------------- // Base type -- in templates, which accept a parameter, V, which // could be either a Vec2, a Vec3, or a Vec4 you can // refer to T as V::BaseType //-------------------------------------------------------------- typedef T BaseType; private: T lengthTiny () const; }; template class Vec3 { public: //------------------- // Access to elements //------------------- T x, y, z; T & operator [] (int i); const T & operator [] (int i) const; //------------- // Constructors //------------- Vec3 (); // no initialization explicit Vec3 (T a); // (a a a) Vec3 (T a, T b, T c); // (a b c) //--------------------------------- // Copy constructors and assignment //--------------------------------- Vec3 (const Vec3 &v); template Vec3 (const Vec3 &v); const Vec3 & operator = (const Vec3 &v); //----------- // Destructor //----------- ~Vec3 () = default; //--------------------------------------------------------- // Vec4 to Vec3 conversion, divides x, y and z by w: // // The one-argument conversion function divides by w even // if w is zero. The result depends on how the environment // handles floating-point exceptions. // // The two-argument version thows an InfPointExc exception // if w is zero or if division by w would overflow. //--------------------------------------------------------- template explicit Vec3 (const Vec4 &v); template explicit Vec3 (const Vec4 &v, InfException); //---------------------- // Compatibility with Sb //---------------------- template void setValue (S a, S b, S c); template void setValue (const Vec3 &v); template void getValue (S &a, S &b, S &c) const; template void getValue (Vec3 &v) const; T * getValue(); const T * getValue() const; //--------- // Equality //--------- template bool operator == (const Vec3 &v) const; template bool operator != (const Vec3 &v) const; //----------------------------------------------------------------------- // Compare two vectors and test if they are "approximately equal": // // equalWithAbsError (v, e) // // Returns true if the coefficients of this and v are the same with // an absolute error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e // // equalWithRelError (v, e) // // Returns true if the coefficients of this and v are the same with // a relative error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e * abs (this[i]) //----------------------------------------------------------------------- bool equalWithAbsError (const Vec3 &v, T e) const; bool equalWithRelError (const Vec3 &v, T e) const; //------------ // Dot product //------------ T dot (const Vec3 &v) const; T operator ^ (const Vec3 &v) const; //--------------------------- // Right-handed cross product //--------------------------- Vec3 cross (const Vec3 &v) const; const Vec3 & operator %= (const Vec3 &v); Vec3 operator % (const Vec3 &v) const; //------------------------ // Component-wise addition //------------------------ const Vec3 & operator += (const Vec3 &v); Vec3 operator + (const Vec3 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Vec3 & operator -= (const Vec3 &v); Vec3 operator - (const Vec3 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Vec3 operator - () const; const Vec3 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Vec3 & operator *= (const Vec3 &v); const Vec3 & operator *= (T a); Vec3 operator * (const Vec3 &v) const; Vec3 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Vec3 & operator /= (const Vec3 &v); const Vec3 & operator /= (T a); Vec3 operator / (const Vec3 &v) const; Vec3 operator / (T a) const; //---------------------------------------------------------------- // Length and normalization: If v.length() is 0.0, v.normalize() // and v.normalized() produce a null vector; v.normalizeExc() and // v.normalizedExc() throw a NullVecExc. // v.normalizeNonNull() and v.normalizedNonNull() are slightly // faster than the other normalization routines, but if v.length() // is 0.0, the result is undefined. //---------------------------------------------------------------- T length () const; T length2 () const; const Vec3 & normalize (); // modifies *this const Vec3 & normalizeExc (); const Vec3 & normalizeNonNull (); Vec3 normalized () const; // does not modify *this Vec3 normalizedExc () const; Vec3 normalizedNonNull () const; //-------------------------------------------------------- // Number of dimensions, i.e. number of elements in a Vec3 //-------------------------------------------------------- static unsigned int dimensions() {return 3;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} //-------------------------------------------------------------- // Base type -- in templates, which accept a parameter, V, which // could be either a Vec2, a Vec3, or a Vec4 you can // refer to T as V::BaseType //-------------------------------------------------------------- typedef T BaseType; private: T lengthTiny () const; }; template class Vec4 { public: //------------------- // Access to elements //------------------- T x, y, z, w; T & operator [] (int i); const T & operator [] (int i) const; //------------- // Constructors //------------- Vec4 (); // no initialization explicit Vec4 (T a); // (a a a a) Vec4 (T a, T b, T c, T d); // (a b c d) //--------------------------------- // Copy constructors and assignment //--------------------------------- Vec4 (const Vec4 &v); template Vec4 (const Vec4 &v); const Vec4 & operator = (const Vec4 &v); //----------- // Destructor //----------- ~Vec4 () = default; //------------------------------------- // Vec3 to Vec4 conversion, sets w to 1 //------------------------------------- template explicit Vec4 (const Vec3 &v); //--------- // Equality //--------- template bool operator == (const Vec4 &v) const; template bool operator != (const Vec4 &v) const; //----------------------------------------------------------------------- // Compare two vectors and test if they are "approximately equal": // // equalWithAbsError (v, e) // // Returns true if the coefficients of this and v are the same with // an absolute error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e // // equalWithRelError (v, e) // // Returns true if the coefficients of this and v are the same with // a relative error of no more than e, i.e., for all i // // abs (this[i] - v[i]) <= e * abs (this[i]) //----------------------------------------------------------------------- bool equalWithAbsError (const Vec4 &v, T e) const; bool equalWithRelError (const Vec4 &v, T e) const; //------------ // Dot product //------------ T dot (const Vec4 &v) const; T operator ^ (const Vec4 &v) const; //----------------------------------- // Cross product is not defined in 4D //----------------------------------- //------------------------ // Component-wise addition //------------------------ const Vec4 & operator += (const Vec4 &v); Vec4 operator + (const Vec4 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Vec4 & operator -= (const Vec4 &v); Vec4 operator - (const Vec4 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Vec4 operator - () const; const Vec4 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Vec4 & operator *= (const Vec4 &v); const Vec4 & operator *= (T a); Vec4 operator * (const Vec4 &v) const; Vec4 operator * (T a) const; //------------------------ // Component-wise division //------------------------ const Vec4 & operator /= (const Vec4 &v); const Vec4 & operator /= (T a); Vec4 operator / (const Vec4 &v) const; Vec4 operator / (T a) const; //---------------------------------------------------------------- // Length and normalization: If v.length() is 0.0, v.normalize() // and v.normalized() produce a null vector; v.normalizeExc() and // v.normalizedExc() throw a NullVecExc. // v.normalizeNonNull() and v.normalizedNonNull() are slightly // faster than the other normalization routines, but if v.length() // is 0.0, the result is undefined. //---------------------------------------------------------------- T length () const; T length2 () const; const Vec4 & normalize (); // modifies *this const Vec4 & normalizeExc (); const Vec4 & normalizeNonNull (); Vec4 normalized () const; // does not modify *this Vec4 normalizedExc () const; Vec4 normalizedNonNull () const; //-------------------------------------------------------- // Number of dimensions, i.e. number of elements in a Vec4 //-------------------------------------------------------- static unsigned int dimensions() {return 4;} //------------------------------------------------- // Limitations of type T (see also class limits) //------------------------------------------------- static T baseTypeMin() {return limits::min();} static T baseTypeMax() {return limits::max();} static T baseTypeSmallest() {return limits::smallest();} static T baseTypeEpsilon() {return limits::epsilon();} //-------------------------------------------------------------- // Base type -- in templates, which accept a parameter, V, which // could be either a Vec2, a Vec3, or a Vec4 you can // refer to T as V::BaseType //-------------------------------------------------------------- typedef T BaseType; private: T lengthTiny () const; }; //-------------- // Stream output //-------------- template std::ostream & operator << (std::ostream &s, const Vec2 &v); template std::ostream & operator << (std::ostream &s, const Vec3 &v); template std::ostream & operator << (std::ostream &s, const Vec4 &v); //---------------------------------------------------- // Reverse multiplication: S * Vec2 and S * Vec3 //---------------------------------------------------- template Vec2 operator * (T a, const Vec2 &v); template Vec3 operator * (T a, const Vec3 &v); template Vec4 operator * (T a, const Vec4 &v); //------------------------- // Typedefs for convenience //------------------------- typedef Vec2 V2s; typedef Vec2 V2i; typedef Vec2 V2f; typedef Vec2 V2d; typedef Vec3 V3s; typedef Vec3 V3i; typedef Vec3 V3f; typedef Vec3 V3d; typedef Vec4 V4s; typedef Vec4 V4i; typedef Vec4 V4f; typedef Vec4 V4d; //------------------------------------------- // Specializations for VecN, VecN //------------------------------------------- // Vec2 template <> short Vec2::length () const; template <> const Vec2 & Vec2::normalize (); template <> const Vec2 & Vec2::normalizeExc (); template <> const Vec2 & Vec2::normalizeNonNull (); template <> Vec2 Vec2::normalized () const; template <> Vec2 Vec2::normalizedExc () const; template <> Vec2 Vec2::normalizedNonNull () const; // Vec2 template <> int Vec2::length () const; template <> const Vec2 & Vec2::normalize (); template <> const Vec2 & Vec2::normalizeExc (); template <> const Vec2 & Vec2::normalizeNonNull (); template <> Vec2 Vec2::normalized () const; template <> Vec2 Vec2::normalizedExc () const; template <> Vec2 Vec2::normalizedNonNull () const; // Vec3 template <> short Vec3::length () const; template <> const Vec3 & Vec3::normalize (); template <> const Vec3 & Vec3::normalizeExc (); template <> const Vec3 & Vec3::normalizeNonNull (); template <> Vec3 Vec3::normalized () const; template <> Vec3 Vec3::normalizedExc () const; template <> Vec3 Vec3::normalizedNonNull () const; // Vec3 template <> int Vec3::length () const; template <> const Vec3 & Vec3::normalize (); template <> const Vec3 & Vec3::normalizeExc (); template <> const Vec3 & Vec3::normalizeNonNull (); template <> Vec3 Vec3::normalized () const; template <> Vec3 Vec3::normalizedExc () const; template <> Vec3 Vec3::normalizedNonNull () const; // Vec4 template <> short Vec4::length () const; template <> const Vec4 & Vec4::normalize (); template <> const Vec4 & Vec4::normalizeExc (); template <> const Vec4 & Vec4::normalizeNonNull (); template <> Vec4 Vec4::normalized () const; template <> Vec4 Vec4::normalizedExc () const; template <> Vec4 Vec4::normalizedNonNull () const; // Vec4 template <> int Vec4::length () const; template <> const Vec4 & Vec4::normalize (); template <> const Vec4 & Vec4::normalizeExc (); template <> const Vec4 & Vec4::normalizeNonNull (); template <> Vec4 Vec4::normalized () const; template <> Vec4 Vec4::normalizedExc () const; template <> Vec4 Vec4::normalizedNonNull () const; //------------------------ // Implementation of Vec2: //------------------------ template inline T & Vec2::operator [] (int i) { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline const T & Vec2::operator [] (int i) const { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline Vec2::Vec2 () { // empty } template inline Vec2::Vec2 (T a) { x = y = a; } template inline Vec2::Vec2 (T a, T b) { x = a; y = b; } template inline Vec2::Vec2 (const Vec2 &v) { x = v.x; y = v.y; } template template inline Vec2::Vec2 (const Vec2 &v) { x = T (v.x); y = T (v.y); } template inline const Vec2 & Vec2::operator = (const Vec2 &v) { x = v.x; y = v.y; return *this; } template template inline void Vec2::setValue (S a, S b) { x = T (a); y = T (b); } template template inline void Vec2::setValue (const Vec2 &v) { x = T (v.x); y = T (v.y); } template template inline void Vec2::getValue (S &a, S &b) const { a = S (x); b = S (y); } template template inline void Vec2::getValue (Vec2 &v) const { v.x = S (x); v.y = S (y); } template inline T * Vec2::getValue() { return (T *) &x; } template inline const T * Vec2::getValue() const { return (const T *) &x; } template template inline bool Vec2::operator == (const Vec2 &v) const { return x == v.x && y == v.y; } template template inline bool Vec2::operator != (const Vec2 &v) const { return x != v.x || y != v.y; } template bool Vec2::equalWithAbsError (const Vec2 &v, T e) const { for (int i = 0; i < 2; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], v[i], e)) return false; return true; } template bool Vec2::equalWithRelError (const Vec2 &v, T e) const { for (int i = 0; i < 2; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], v[i], e)) return false; return true; } template inline T Vec2::dot (const Vec2 &v) const { return x * v.x + y * v.y; } template inline T Vec2::operator ^ (const Vec2 &v) const { return dot (v); } template inline T Vec2::cross (const Vec2 &v) const { return x * v.y - y * v.x; } template inline T Vec2::operator % (const Vec2 &v) const { return x * v.y - y * v.x; } template inline const Vec2 & Vec2::operator += (const Vec2 &v) { x += v.x; y += v.y; return *this; } template inline Vec2 Vec2::operator + (const Vec2 &v) const { return Vec2 (x + v.x, y + v.y); } template inline const Vec2 & Vec2::operator -= (const Vec2 &v) { x -= v.x; y -= v.y; return *this; } template inline Vec2 Vec2::operator - (const Vec2 &v) const { return Vec2 (x - v.x, y - v.y); } template inline Vec2 Vec2::operator - () const { return Vec2 (-x, -y); } template inline const Vec2 & Vec2::negate () { x = -x; y = -y; return *this; } template inline const Vec2 & Vec2::operator *= (const Vec2 &v) { x *= v.x; y *= v.y; return *this; } template inline const Vec2 & Vec2::operator *= (T a) { x *= a; y *= a; return *this; } template inline Vec2 Vec2::operator * (const Vec2 &v) const { return Vec2 (x * v.x, y * v.y); } template inline Vec2 Vec2::operator * (T a) const { return Vec2 (x * a, y * a); } template inline const Vec2 & Vec2::operator /= (const Vec2 &v) { x /= v.x; y /= v.y; return *this; } template inline const Vec2 & Vec2::operator /= (T a) { x /= a; y /= a; return *this; } template inline Vec2 Vec2::operator / (const Vec2 &v) const { return Vec2 (x / v.x, y / v.y); } template inline Vec2 Vec2::operator / (T a) const { return Vec2 (x / a, y / a); } template T Vec2::lengthTiny () const { T absX = (x >= T (0))? x: -x; T absY = (y >= T (0))? y: -y; T max = absX; if (max < absY) max = absY; if (max == T (0)) return T (0); // // Do not replace the divisions by max with multiplications by 1/max. // Computing 1/max can overflow but the divisions below will always // produce results less than or equal to 1. // absX /= max; absY /= max; return max * Math::sqrt (absX * absX + absY * absY); } template inline T Vec2::length () const { T length2 = dot (*this); if (length2 < T (2) * limits::smallest()) return lengthTiny(); return Math::sqrt (length2); } template inline T Vec2::length2 () const { return dot (*this); } template const Vec2 & Vec2::normalize () { T l = length(); if (l != T (0)) { // // Do not replace the divisions by l with multiplications by 1/l. // Computing 1/l can overflow but the divisions below will always // produce results less than or equal to 1. // x /= l; y /= l; } return *this; } template const Vec2 & Vec2::normalizeExc () { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); x /= l; y /= l; return *this; } template inline const Vec2 & Vec2::normalizeNonNull () { T l = length(); x /= l; y /= l; return *this; } template Vec2 Vec2::normalized () const { T l = length(); if (l == T (0)) return Vec2 (T (0)); return Vec2 (x / l, y / l); } template Vec2 Vec2::normalizedExc () const { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); return Vec2 (x / l, y / l); } template inline Vec2 Vec2::normalizedNonNull () const { T l = length(); return Vec2 (x / l, y / l); } //----------------------- // Implementation of Vec3 //----------------------- template inline T & Vec3::operator [] (int i) { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline const T & Vec3::operator [] (int i) const { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline Vec3::Vec3 () { // empty } template inline Vec3::Vec3 (T a) { x = y = z = a; } template inline Vec3::Vec3 (T a, T b, T c) { x = a; y = b; z = c; } template inline Vec3::Vec3 (const Vec3 &v) { x = v.x; y = v.y; z = v.z; } template template inline Vec3::Vec3 (const Vec3 &v) { x = T (v.x); y = T (v.y); z = T (v.z); } template inline const Vec3 & Vec3::operator = (const Vec3 &v) { x = v.x; y = v.y; z = v.z; return *this; } template template inline Vec3::Vec3 (const Vec4 &v) { x = T (v.x / v.w); y = T (v.y / v.w); z = T (v.z / v.w); } template template Vec3::Vec3 (const Vec4 &v, InfException) { T vx = T (v.x); T vy = T (v.y); T vz = T (v.z); T vw = T (v.w); T absW = (vw >= T (0))? vw: -vw; if (absW < 1) { T m = baseTypeMax() * absW; if (vx <= -m || vx >= m || vy <= -m || vy >= m || vz <= -m || vz >= m) throw InfPointExc ("Cannot normalize point at infinity."); } x = vx / vw; y = vy / vw; z = vz / vw; } template template inline void Vec3::setValue (S a, S b, S c) { x = T (a); y = T (b); z = T (c); } template template inline void Vec3::setValue (const Vec3 &v) { x = T (v.x); y = T (v.y); z = T (v.z); } template template inline void Vec3::getValue (S &a, S &b, S &c) const { a = S (x); b = S (y); c = S (z); } template template inline void Vec3::getValue (Vec3 &v) const { v.x = S (x); v.y = S (y); v.z = S (z); } template inline T * Vec3::getValue() { return (T *) &x; } template inline const T * Vec3::getValue() const { return (const T *) &x; } template template inline bool Vec3::operator == (const Vec3 &v) const { return x == v.x && y == v.y && z == v.z; } template template inline bool Vec3::operator != (const Vec3 &v) const { return x != v.x || y != v.y || z != v.z; } template bool Vec3::equalWithAbsError (const Vec3 &v, T e) const { for (int i = 0; i < 3; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], v[i], e)) return false; return true; } template bool Vec3::equalWithRelError (const Vec3 &v, T e) const { for (int i = 0; i < 3; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], v[i], e)) return false; return true; } template inline T Vec3::dot (const Vec3 &v) const { return x * v.x + y * v.y + z * v.z; } template inline T Vec3::operator ^ (const Vec3 &v) const { return dot (v); } template inline Vec3 Vec3::cross (const Vec3 &v) const { return Vec3 (y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); } template inline const Vec3 & Vec3::operator %= (const Vec3 &v) { T a = y * v.z - z * v.y; T b = z * v.x - x * v.z; T c = x * v.y - y * v.x; x = a; y = b; z = c; return *this; } template inline Vec3 Vec3::operator % (const Vec3 &v) const { return Vec3 (y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); } template inline const Vec3 & Vec3::operator += (const Vec3 &v) { x += v.x; y += v.y; z += v.z; return *this; } template inline Vec3 Vec3::operator + (const Vec3 &v) const { return Vec3 (x + v.x, y + v.y, z + v.z); } template inline const Vec3 & Vec3::operator -= (const Vec3 &v) { x -= v.x; y -= v.y; z -= v.z; return *this; } template inline Vec3 Vec3::operator - (const Vec3 &v) const { return Vec3 (x - v.x, y - v.y, z - v.z); } template inline Vec3 Vec3::operator - () const { return Vec3 (-x, -y, -z); } template inline const Vec3 & Vec3::negate () { x = -x; y = -y; z = -z; return *this; } template inline const Vec3 & Vec3::operator *= (const Vec3 &v) { x *= v.x; y *= v.y; z *= v.z; return *this; } template inline const Vec3 & Vec3::operator *= (T a) { x *= a; y *= a; z *= a; return *this; } template inline Vec3 Vec3::operator * (const Vec3 &v) const { return Vec3 (x * v.x, y * v.y, z * v.z); } template inline Vec3 Vec3::operator * (T a) const { return Vec3 (x * a, y * a, z * a); } template inline const Vec3 & Vec3::operator /= (const Vec3 &v) { x /= v.x; y /= v.y; z /= v.z; return *this; } template inline const Vec3 & Vec3::operator /= (T a) { x /= a; y /= a; z /= a; return *this; } template inline Vec3 Vec3::operator / (const Vec3 &v) const { return Vec3 (x / v.x, y / v.y, z / v.z); } template inline Vec3 Vec3::operator / (T a) const { return Vec3 (x / a, y / a, z / a); } template T Vec3::lengthTiny () const { T absX = (x >= T (0))? x: -x; T absY = (y >= T (0))? y: -y; T absZ = (z >= T (0))? z: -z; T max = absX; if (max < absY) max = absY; if (max < absZ) max = absZ; if (max == T (0)) return T (0); // // Do not replace the divisions by max with multiplications by 1/max. // Computing 1/max can overflow but the divisions below will always // produce results less than or equal to 1. // absX /= max; absY /= max; absZ /= max; return max * Math::sqrt (absX * absX + absY * absY + absZ * absZ); } template inline T Vec3::length () const { T length2 = dot (*this); if (length2 < T (2) * limits::smallest()) return lengthTiny(); return Math::sqrt (length2); } template inline T Vec3::length2 () const { return dot (*this); } template const Vec3 & Vec3::normalize () { T l = length(); if (l != T (0)) { // // Do not replace the divisions by l with multiplications by 1/l. // Computing 1/l can overflow but the divisions below will always // produce results less than or equal to 1. // x /= l; y /= l; z /= l; } return *this; } template const Vec3 & Vec3::normalizeExc () { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); x /= l; y /= l; z /= l; return *this; } template inline const Vec3 & Vec3::normalizeNonNull () { T l = length(); x /= l; y /= l; z /= l; return *this; } template Vec3 Vec3::normalized () const { T l = length(); if (l == T (0)) return Vec3 (T (0)); return Vec3 (x / l, y / l, z / l); } template Vec3 Vec3::normalizedExc () const { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); return Vec3 (x / l, y / l, z / l); } template inline Vec3 Vec3::normalizedNonNull () const { T l = length(); return Vec3 (x / l, y / l, z / l); } //----------------------- // Implementation of Vec4 //----------------------- template inline T & Vec4::operator [] (int i) { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline const T & Vec4::operator [] (int i) const { return (&x)[i]; // NOSONAR - suppress SonarCloud bug report. } template inline Vec4::Vec4 () { // empty } template inline Vec4::Vec4 (T a) { x = y = z = w = a; } template inline Vec4::Vec4 (T a, T b, T c, T d) { x = a; y = b; z = c; w = d; } template inline Vec4::Vec4 (const Vec4 &v) { x = v.x; y = v.y; z = v.z; w = v.w; } template template inline Vec4::Vec4 (const Vec4 &v) { x = T (v.x); y = T (v.y); z = T (v.z); w = T (v.w); } template inline const Vec4 & Vec4::operator = (const Vec4 &v) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; } template template inline Vec4::Vec4 (const Vec3 &v) { x = T (v.x); y = T (v.y); z = T (v.z); w = T (1); } template template inline bool Vec4::operator == (const Vec4 &v) const { return x == v.x && y == v.y && z == v.z && w == v.w; } template template inline bool Vec4::operator != (const Vec4 &v) const { return x != v.x || y != v.y || z != v.z || w != v.w; } template bool Vec4::equalWithAbsError (const Vec4 &v, T e) const { for (int i = 0; i < 4; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], v[i], e)) return false; return true; } template bool Vec4::equalWithRelError (const Vec4 &v, T e) const { for (int i = 0; i < 4; i++) if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], v[i], e)) return false; return true; } template inline T Vec4::dot (const Vec4 &v) const { return x * v.x + y * v.y + z * v.z + w * v.w; } template inline T Vec4::operator ^ (const Vec4 &v) const { return dot (v); } template inline const Vec4 & Vec4::operator += (const Vec4 &v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; } template inline Vec4 Vec4::operator + (const Vec4 &v) const { return Vec4 (x + v.x, y + v.y, z + v.z, w + v.w); } template inline const Vec4 & Vec4::operator -= (const Vec4 &v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; } template inline Vec4 Vec4::operator - (const Vec4 &v) const { return Vec4 (x - v.x, y - v.y, z - v.z, w - v.w); } template inline Vec4 Vec4::operator - () const { return Vec4 (-x, -y, -z, -w); } template inline const Vec4 & Vec4::negate () { x = -x; y = -y; z = -z; w = -w; return *this; } template inline const Vec4 & Vec4::operator *= (const Vec4 &v) { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; } template inline const Vec4 & Vec4::operator *= (T a) { x *= a; y *= a; z *= a; w *= a; return *this; } template inline Vec4 Vec4::operator * (const Vec4 &v) const { return Vec4 (x * v.x, y * v.y, z * v.z, w * v.w); } template inline Vec4 Vec4::operator * (T a) const { return Vec4 (x * a, y * a, z * a, w * a); } template inline const Vec4 & Vec4::operator /= (const Vec4 &v) { x /= v.x; y /= v.y; z /= v.z; w /= v.w; return *this; } template inline const Vec4 & Vec4::operator /= (T a) { x /= a; y /= a; z /= a; w /= a; return *this; } template inline Vec4 Vec4::operator / (const Vec4 &v) const { return Vec4 (x / v.x, y / v.y, z / v.z, w / v.w); } template inline Vec4 Vec4::operator / (T a) const { return Vec4 (x / a, y / a, z / a, w / a); } template T Vec4::lengthTiny () const { T absX = (x >= T (0))? x: -x; T absY = (y >= T (0))? y: -y; T absZ = (z >= T (0))? z: -z; T absW = (w >= T (0))? w: -w; T max = absX; if (max < absY) max = absY; if (max < absZ) max = absZ; if (max < absW) max = absW; if (max == T (0)) return T (0); // // Do not replace the divisions by max with multiplications by 1/max. // Computing 1/max can overflow but the divisions below will always // produce results less than or equal to 1. // absX /= max; absY /= max; absZ /= max; absW /= max; return max * Math::sqrt (absX * absX + absY * absY + absZ * absZ + absW * absW); } template inline T Vec4::length () const { T length2 = dot (*this); if (length2 < T (2) * limits::smallest()) return lengthTiny(); return Math::sqrt (length2); } template inline T Vec4::length2 () const { return dot (*this); } template const Vec4 & Vec4::normalize () { T l = length(); if (l != T (0)) { // // Do not replace the divisions by l with multiplications by 1/l. // Computing 1/l can overflow but the divisions below will always // produce results less than or equal to 1. // x /= l; y /= l; z /= l; w /= l; } return *this; } template const Vec4 & Vec4::normalizeExc () { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); x /= l; y /= l; z /= l; w /= l; return *this; } template inline const Vec4 & Vec4::normalizeNonNull () { T l = length(); x /= l; y /= l; z /= l; w /= l; return *this; } template Vec4 Vec4::normalized () const { T l = length(); if (l == T (0)) return Vec4 (T (0)); return Vec4 (x / l, y / l, z / l, w / l); } template Vec4 Vec4::normalizedExc () const { T l = length(); if (l == T (0)) throw NullVecExc ("Cannot normalize null vector."); return Vec4 (x / l, y / l, z / l, w / l); } template inline Vec4 Vec4::normalizedNonNull () const { T l = length(); return Vec4 (x / l, y / l, z / l, w / l); } //----------------------------- // Stream output implementation //----------------------------- template std::ostream & operator << (std::ostream &s, const Vec2 &v) { return s << '(' << v.x << ' ' << v.y << ')'; } template std::ostream & operator << (std::ostream &s, const Vec3 &v) { return s << '(' << v.x << ' ' << v.y << ' ' << v.z << ')'; } template std::ostream & operator << (std::ostream &s, const Vec4 &v) { return s << '(' << v.x << ' ' << v.y << ' ' << v.z << ' ' << v.w << ')'; } //----------------------------------------- // Implementation of reverse multiplication //----------------------------------------- template inline Vec2 operator * (T a, const Vec2 &v) { return Vec2 (a * v.x, a * v.y); } template inline Vec3 operator * (T a, const Vec3 &v) { return Vec3 (a * v.x, a * v.y, a * v.z); } template inline Vec4 operator * (T a, const Vec4 &v) { return Vec4 (a * v.x, a * v.y, a * v.z, a * v.w); } #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER #pragma warning(pop) #endif IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHVEC_H openexr-2.5.7/IlmBase/Imath/ImathVecAlgo.h000066400000000000000000000112201406177042200202360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMATHVECALGO_H #define INCLUDED_IMATHVECALGO_H //------------------------------------------------------------------------- // // This file contains algorithms applied to or in conjunction // with points (Imath::Vec2 and Imath::Vec3). // The assumption made is that these functions are called much // less often than the basic point functions or these functions // require more support classes. // //------------------------------------------------------------------------- #include "ImathVec.h" #include "ImathLimits.h" #include "ImathNamespace.h" IMATH_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------------------------- // Find the projection of vector t onto vector s (Vec2, Vec3, Vec4) //----------------------------------------------------------------- template Vec project (const Vec &s, const Vec &t); //------------------------------------------------ // Find a vector that is perpendicular to s and // in the same plane as s and t (Vec2, Vec3, Vec4) //------------------------------------------------ template Vec orthogonal (const Vec &s, const Vec &t); //----------------------------------------------- // Find the direction of a ray s after reflection // off a plane with normal t (Vec2, Vec3, Vec4) //----------------------------------------------- template Vec reflect (const Vec &s, const Vec &t); //-------------------------------------------------------------------- // Find the vertex of triangle (v0, v1, v2) that is closest to point p // (Vec2, Vec3, Vec4) //-------------------------------------------------------------------- template Vec closestVertex (const Vec &v0, const Vec &v1, const Vec &v2, const Vec &p); //--------------- // Implementation //--------------- template Vec project (const Vec &s, const Vec &t) { Vec sNormalized = s.normalized(); return sNormalized * (sNormalized ^ t); } template Vec orthogonal (const Vec &s, const Vec &t) { return t - project (s, t); } template Vec reflect (const Vec &s, const Vec &t) { return s - typename Vec::BaseType(2) * (s - project(t, s)); } template Vec closestVertex(const Vec &v0, const Vec &v1, const Vec &v2, const Vec &p) { Vec nearest = v0; typename Vec::BaseType neardot = (v0 - p).length2(); typename Vec::BaseType tmp = (v1 - p).length2(); if (tmp < neardot) { neardot = tmp; nearest = v1; } tmp = (v2 - p).length2(); if (tmp < neardot) { neardot = tmp; nearest = v2; } return nearest; } IMATH_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMATHVECALGO_H openexr-2.5.7/IlmBase/Imath/Makefile.am000066400000000000000000000034001406177042200176170ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = libImath.la libImath_la_SOURCES = ImathMatrixAlgo.cpp ImathVec.cpp \ ImathColorAlgo.cpp ImathExc.cpp ImathFun.cpp \ ImathColorAlgo.h ImathMatrixAlgo.h ImathVec.h \ ImathShear.h ImathFun.h ImathBox.h ImathBoxAlgo.h \ ImathEuler.h ImathExc.h ImathLimits.h ImathLine.h \ ImathLineAlgo.h ImathMatrix.h ImathPlane.h \ ImathSphere.h ImathVecAlgo.h ImathQuat.h \ ImathFrustum.h ImathMath.h ImathGL.h \ ImathColor.h ImathRandom.h ImathRoots.h \ ImathHalfLimits.h ImathInterval.h ImathGLU.h \ ImathFrame.h ImathPlatform.h \ ImathRandom.cpp ImathInt64.h \ ImathFrustumTest.h libImath_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ -no-undefined if LIB_SUFFIX_EXISTS libImath_la_LDFLAGS += -release @LIB_SUFFIX@ endif libImath_la_LIBADD = ../Iex/libIex.la libImathincludedir = $(includedir)/OpenEXR libImathinclude_HEADERS = ImathColorAlgo.h ImathMatrixAlgo.h ImathVec.h \ ImathShear.h ImathFun.h ImathBox.h ImathBoxAlgo.h \ ImathEuler.h ImathExc.h ImathLimits.h ImathLine.h \ ImathLineAlgo.h ImathMatrix.h ImathPlane.h \ ImathSphere.h ImathVecAlgo.h ImathQuat.h \ ImathFrustum.h ImathMath.h ImathGL.h \ ImathColor.h ImathRandom.h ImathRoots.h \ ImathHalfLimits.h ImathInterval.h ImathGLU.h \ ImathFrame.h ImathPlatform.h ImathInt64.h \ ImathNamespace.h ImathForward.h ImathExport.h \ ImathFrustumTest.h AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Iex -I$(top_srcdir)/Half \ -I$(top_srcdir)/config EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/ImathTest/000077500000000000000000000000001406177042200164265ustar00rootroot00000000000000openexr-2.5.7/IlmBase/ImathTest/CMakeLists.txt000066400000000000000000000015741406177042200211750ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. add_executable(ImathTest main.cpp testBox.cpp testBoxAlgo.cpp testColor.cpp testExtractEuler.cpp testExtractSHRT.cpp testFrustum.cpp testFrustumTest.cpp testFun.cpp testInvert.cpp testJacobiEigenSolver.cpp testLineAlgo.cpp testMatrix.cpp testMiscMatrixAlgo.cpp testProcrustes.cpp testQuat.cpp testQuatSetRotation.cpp testQuatSlerp.cpp testRandom.cpp testRoots.cpp testShear.cpp testTinySVD.cpp testVec.cpp ) target_link_libraries(ImathTest IlmBase::Imath) set_target_properties(ImathTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) if(WIN32 AND (BUILD_SHARED_LIBS OR OPENEXR_BUILD_BOTH_STATIC_SHARED)) target_compile_definitions(ImathTest PRIVATE OPENEXR_DLL) endif() add_test(NAME IlmBase.Imath COMMAND $) openexr-2.5.7/IlmBase/ImathTest/Makefile.am000066400000000000000000000024361406177042200204670ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in check_PROGRAMS = ImathTest ImathTest_SOURCES = main.cpp testExtractEuler.cpp testExtractSHRT.cpp \ testFrustum.cpp testFun.cpp testInvert.cpp \ testMatrix.cpp testRandom.cpp testRoots.cpp \ testShear.cpp testColor.cpp testColor.h \ testExtractEuler.h testExtractSHRT.h testFrustum.h \ testFun.h testInvert.h testMatrix.h testRandom.h \ testRoots.h testShear.h testQuatSetRotation.cpp \ testQuatSetRotation.h testLineAlgo.cpp testLineAlgo.h \ testQuatSlerp.cpp testQuatSlerp.h testQuat.cpp \ testQuat.h testBoxAlgo.cpp testBoxAlgo.h \ testVec.cpp testVec.h testBox.cpp testBox.h \ testMiscMatrixAlgo.cpp testMiscMatrixAlgo.h \ testProcrustes.cpp testProcrustes.h \ testTinySVD.cpp testTinySVD.h \ testJacobiEigenSolver.cpp testJacobiEigenSolver.h \ testFrustumTest.cpp testFrustumTest.h AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/Imath -I$(top_srcdir)/Iex -I$(top_srcdir)/Half \ -I$(top_srcdir)/config LDADD = -L$(top_builddir)/Imath -L$(top_builddir)/Iex -L$(top_builddir)/Half \ -lImath -lIex -lHalf TESTS = ImathTest EXTRA_DIST = CMakeLists.txt openexr-2.5.7/IlmBase/ImathTest/main.cpp000066400000000000000000000060221406177042200200560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define TEST(x) if (argc < 2 || !strcmp (argv[1], #x)) x(); int main (int argc, char *argv[]) { TEST (testVec); TEST (testColor); TEST (testShear); TEST (testMatrix); TEST (testMiscMatrixAlgo); TEST (testRoots); TEST (testFun); TEST (testInvert); TEST (testFrustum); TEST (testRandom); TEST (testExtractEuler); TEST (testExtractSHRT); TEST (testQuat); TEST (testQuatSetRotation); TEST (testQuatSlerp); TEST (testLineAlgo); TEST (testBoxAlgo); TEST (testBox); TEST (testProcrustes); TEST (testTinySVD); TEST (testJacobiEigenSolver); TEST (testFrustumTest); return 0; } openexr-2.5.7/IlmBase/ImathTest/testBox.cpp000066400000000000000000000773141406177042200205760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathBoxAlgo.h" #include "ImathRandom.h" #include #include #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { // // Test case generation utility - create a vector of IMATH_INTERNAL_NAMESPACE::Vec{2,3,4} // with all permutations of integers 1..T::dimensions(). // // Algorithm from www.bearcave.com/random_hacks/permute.html // template static void addItem(const std::vector &value, std::vector &perms) { T p; for (unsigned int i = 0; i < value.size(); i++) { p[i] = value[i]; } perms.push_back(p); } template static void visit(int &level, int n, int k, std::vector &value, std::vector &perms) { level = level + 1; value[k] = level; if (level == n) addItem(value, perms); else for (int i = 0; i < n; i++) if (value[i] == 0) visit(level, n, i, value, perms); level = level - 1; value[k] = 0; } template static void permutations(std::vector &perms) { std::vector value(T::dimensions()); int level = -1; int n = T::dimensions(); visit(level, n, 0, value, perms); } template static void testConstructors(const char *type) { cout << " constructors for type " << type << endl; // // Empty // { IMATH_INTERNAL_NAMESPACE::Box b; assert(b.min == T(T::baseTypeMax()) && b.max == T(T::baseTypeMin())); } // // Single point // { T p; for (unsigned int i = 0; i < T::dimensions(); i++) p[i] = i; IMATH_INTERNAL_NAMESPACE::Box b(p); assert(b.min == p && b.max == p); } // // Min and max // { T p0; T p1; for (unsigned int i = 0; i < T::dimensions(); i++) { p0[i] = i; p1[i] = 10 * T::dimensions() - i - 1; } IMATH_INTERNAL_NAMESPACE::Box b(p0, p1); assert(b.min == p0 && b.max == p1); } } template void testMakeEmpty(const char *type) { cout << " makeEmpty() for type " << type << endl; // // Empty box // { IMATH_INTERNAL_NAMESPACE::Box b; b.makeEmpty(); assert(b.min == T(T::baseTypeMax()) && b.max == T(T::baseTypeMin())); } // // Non-empty, has volume // { IMATH_INTERNAL_NAMESPACE::Box b(T(-1), T(1)); b.makeEmpty(); assert(b.min == T(T::baseTypeMax()) && b.max == T(T::baseTypeMin())); } // // Non-empty, no volume // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max(0); max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b(min, max); b.makeEmpty(); assert(b.min == T(T::baseTypeMax()) && b.max == T(T::baseTypeMin())); } } template void testMakeInfinite(const char *type) { cout << " makeInfinite() for type " << type << endl; // // Infinite box // { IMATH_INTERNAL_NAMESPACE::Box b; b.makeInfinite(); assert(b.min == T(T::baseTypeMin()) && b.max == T(T::baseTypeMax())); } // // Non-empty, has volume // { IMATH_INTERNAL_NAMESPACE::Box b(T(-1), T(1)); b.makeInfinite(); assert(b.min == T(T::baseTypeMin()) && b.max == T(T::baseTypeMax())); } // // Non-empty, no volume // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max(0); max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b(min, max); b.makeInfinite(); assert(b.min == T(T::baseTypeMin()) && b.max == T(T::baseTypeMax())); } } template void testExtendByPoint(const char *type) { cout << " extendBy() point for type " << type << endl; IMATH_INTERNAL_NAMESPACE::Rand32 rand(0); const unsigned int iters = 10; // // Extend empty box with a single point. // for (unsigned int i = 0; i < iters; i++) { T p; for (unsigned int j = 0; j < T::dimensions(); j++) p[j] = typename T::BaseType (rand.nextf(-12345, 12345)); IMATH_INTERNAL_NAMESPACE::Box b; b.extendBy(p); assert(b.min == p && b.max == p); } // // Extend empty box with a number of random points. Note that // this also covers extending a non-empty box. // for (unsigned int i = 0; i < iters; i++) { IMATH_INTERNAL_NAMESPACE::Box b; T min; T max; for (unsigned int j = 0; j < i; j++) { T p; for (unsigned int k = 0; k < T::dimensions(); k++) p[k] = typename T::BaseType (rand.nextf(-12345, 12345)); if (j == 0) { min = p; max = p; } for (unsigned int k = 0; k < T::dimensions(); k++) { min[k] = std::min(min[k], p[k]); max[k] = std::max(max[k], p[k]); } b.extendBy(p); assert(b.min == min && b.max == max); } } } template void testExtendByBox(const char *type) { cout << " extendBy() box for type " << type << endl; // // Extend empty box with an empty box; // { IMATH_INTERNAL_NAMESPACE::Box b; b.extendBy(IMATH_INTERNAL_NAMESPACE::Box()); assert(b.min == T(T::baseTypeMax()) && b.max == T(T::baseTypeMin())); } // // Extend empty box with a non-empty box and vice versa. // { std::vector perms; permutations(perms); for (unsigned int i = 0; i < perms.size(); i++) { for (unsigned int j = 0; j < perms.size(); j++) { T p0 = -perms[i]; T p1 = perms[j]; IMATH_INTERNAL_NAMESPACE::Box b0; b0.extendBy(IMATH_INTERNAL_NAMESPACE::Box(p0, p1)); assert(b0.min == p0 && b0.max == p1); IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); b1.extendBy(IMATH_INTERNAL_NAMESPACE::Box()); assert(b1.min == p0 && b1.max == p1); } } } // // Extend non-empty box with non-empty box. Starts with empty, then builds. // IMATH_INTERNAL_NAMESPACE::Rand32 rand(0); const unsigned int iters = 10; { IMATH_INTERNAL_NAMESPACE::Box b; T min, max; for (unsigned int i = 1; i < iters; i++) { T p0; T p1; for (unsigned int k = 0; k < T::dimensions(); k++) { p0[k] = typename T::BaseType (rand.nextf( 0, 999)); p1[k] = typename T::BaseType (rand.nextf(1000, 1999)); } min = b.min; max = b.max; for (unsigned int k = 0; k < T::dimensions(); k++) { min[k] = std::min(min[k], p0[k]); max[k] = std::max(max[k], p1[k]); } b.extendBy(IMATH_INTERNAL_NAMESPACE::Box(p0, p1)); assert(b.min == min && b.max == max); } } } template void testComparators(const char *type) { cout << " comparators for type " << type << endl; IMATH_INTERNAL_NAMESPACE::Rand32 rand(0); // // Compare empty. // { IMATH_INTERNAL_NAMESPACE::Box b0; IMATH_INTERNAL_NAMESPACE::Box b1; assert(b0 == b1); assert(!(b0 != b1)); } // // Compare empty to non-empty. // { std::vector perms; permutations(perms); for (unsigned int i = 0; i < perms.size(); i++) { for (unsigned int j = 0; j < perms.size(); j++) { T p0 = -perms[i]; T p1 = perms[j]; IMATH_INTERNAL_NAMESPACE::Box b0; IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); assert(!(b0 == b1)); assert(b0 != b1); } } } // // Compare two non-empty // { std::vector perms; permutations(perms); for (unsigned int i = 0; i < perms.size(); i++) { for (unsigned int j = 0; j < perms.size(); j++) { T p0 = -perms[i]; T p1 = perms[j]; T p2 = -perms[j]; T p3 = perms[i]; IMATH_INTERNAL_NAMESPACE::Box b0(p0, p1); IMATH_INTERNAL_NAMESPACE::Box b1(p2, p3); IMATH_INTERNAL_NAMESPACE::Box b2(p0, p1); if (i == j) { assert(b0 == b1); assert(!(b0 != b1)); } else { assert(b0 != b1); assert(!(b0 == b1)); } assert(b0 == b2); assert(!(b0 != b2)); } } } } template void testIntersects(const char *type) { cout << " intersects() for type " << type << endl; IMATH_INTERNAL_NAMESPACE::Rand32 rand(0); // // Intersect point with empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; T p(1); assert(!b.intersects(p)); } // // Intersect point with non-empty, has-volume box. // { IMATH_INTERNAL_NAMESPACE::Box b(T(-1), T(1)); T p0(0); T p1(5); T p2(-5); assert(b.intersects(p0)); assert(!b.intersects(p1)); assert(!b.intersects(p2)); } // // Intersect point with non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max = min; max[T::dimensions() - 1] = 1; T p0(0); T p1(5); IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(b.intersects(p0)); assert(!b.intersects(p1)); } // // Intersect empty box with empty box. // { IMATH_INTERNAL_NAMESPACE::Box b0; IMATH_INTERNAL_NAMESPACE::Box b1; assert(!b0.intersects(b1)); assert(!b1.intersects(b0)); } // // Intersect empty box with non-empty has-volume boxes. // { IMATH_INTERNAL_NAMESPACE::Box b0; IMATH_INTERNAL_NAMESPACE::Box b1(T(-1), T(1)); IMATH_INTERNAL_NAMESPACE::Box b2(T( 1), T(2)); assert(!b0.intersects(b1)); assert(!b0.intersects(b2)); assert(!b1.intersects(b0)); assert(!b2.intersects(b0)); } // // Intersect empty box with non-empty no-volume box. // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max = min; max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b0; IMATH_INTERNAL_NAMESPACE::Box b1(min, max); assert(!b0.intersects(b1)); assert(!b1.intersects(b0)); } // // Intersect non-empty has-volume box with non-empty has-volume box. // { IMATH_INTERNAL_NAMESPACE::Box b1(T(-1), T(1)); IMATH_INTERNAL_NAMESPACE::Box b2(T(-1), T(1)); IMATH_INTERNAL_NAMESPACE::Box b3(T( 1), T(2)); IMATH_INTERNAL_NAMESPACE::Box b4(T( 2), T(3)); assert(b1.intersects(b1)); assert(b1.intersects(b3)); assert(!b1.intersects(b4)); assert(b3.intersects(b1)); assert(!b4.intersects(b1)); } // // Intersect non-empty has-volume box with non-empty no-volume box. // // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); T min(0); T max = min; max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b1(min, max); IMATH_INTERNAL_NAMESPACE::Box b2(min + T(2), max + T(2)); assert(b0.intersects(b1)); assert(b1.intersects(b0)); assert(!b0.intersects(b2)); assert(!b2.intersects(b1)); } // // Intersect non-empty no-volume box with non-empty no-volume box. // // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max = min; max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b0(min, max); IMATH_INTERNAL_NAMESPACE::Box b1(min, max + T(2)); IMATH_INTERNAL_NAMESPACE::Box b2(min + T(2), max + T(2)); assert(b0.intersects(b1)); assert(b1.intersects(b0)); assert(!b0.intersects(b2)); assert(!b2.intersects(b0)); } } template void testSize(const char *type) { cout << " size() for type " << type << endl; // // Size of empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; assert(b.size() == T(0)); } // // Size of non-empty, has-volume box. // Boxes are: // 2D: [(-1, -1), (1, 1) ] // 3D: [(-1, -1, -1), (1, 1, 1) ] // 4D: [(-1, -1, -1, -1), (1, 1, 1, 1) ] // // and // // 2D: [(-1, -2), (1, 2) ] // 3D: [(-1, -2, -3), (1, 2, 3) ] // 4D: [(-1, -2, -3, -4), (1, 2, 3, 4) ] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); assert(b0.size() == T(2)); T p; for (unsigned int i = 0; i < T::dimensions(); i++) { p[i] = i; } IMATH_INTERNAL_NAMESPACE::Box b1(-p, p); assert(b1.size() == p * T(2)); } // // Size of non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 1) ] // 3D: [(0, 0, 0), (0, 0, 1) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 1)] // { T min(0); T max = min; max[T::dimensions() - 1] = 1; IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(b.size() == max); } } template void testCenter(const char *type) { cout << " center() for type " << type << endl; // // Center of empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; assert(b.center() == T(0)); } // // Center of non-empty, has-volume box. // Boxes are: // 2D: [(-1, -1), (1, 1) ] // 3D: [(-1, -1, -1), (1, 1, 1) ] // 4D: [(-1, -1, -1, -1), (1, 1, 1, 1) ] // // and // // 2D: [(-2, -4), ( 8, 2) ] // 3D: [(-2, -4, -6), (12, 8, 2) ] // 4D: [(-2, -4, -6, -8), (16, 12, 8, 4) ] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); assert(b0.center() == T(0)); T p0; T p1; for (unsigned int i = 0; i < T::dimensions(); i++) { p0[i] = -typename T::BaseType(1 << (i + 1)); p1[i] = typename T::BaseType(1 << (T::dimensions() - i)); } IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); assert(b1.center() == (p1 + p0) / 2); } // // Center of non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 2) ] // 3D: [(0, 0, 0), (0, 0, 2) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 2)] // { T min(0); T max = min; max[T::dimensions() - 1] = 2; IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(b.center() == max /2); } } template void testIsEmpty(const char *type) { cout << " isEmpty() for type " << type << endl; // // Empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; assert(b.isEmpty()); } // // Non-empty, has-volume box. // 2D: [(-2, -4), ( 8, 2) ] // 3D: [(-2, -4, -6), (12, 8, 2) ] // 4D: [(-2, -4, -6, -8), (16, 12, 8, 4) ] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); assert(!b0.isEmpty()); T p0; T p1; for (unsigned int i = 0; i < T::dimensions(); i++) { p0[i] = -typename T::BaseType(1 << (i + 1)); p1[i] = typename T::BaseType(1 << (T::dimensions() - i)); } IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); assert(!b1.isEmpty()); } // // Non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 2) ] // 3D: [(0, 0, 0), (0, 0, 2) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 2)] // { T min(0); T max = min; max[T::dimensions() - 1] = 2; IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(!b.isEmpty()); } } template void testIsInfinite(const char *type) { cout << " isInfinite() for type " << type << endl; // // Infinite box. // { IMATH_INTERNAL_NAMESPACE::Box b; b.makeInfinite(); assert(b.isInfinite()); } // // Non-empty, has-volume box. // 2D: [(-2, -4), ( 8, 2) ] // 3D: [(-2, -4, -6), (12, 8, 2) ] // 4D: [(-2, -4, -6, -8), (16, 12, 8, 4) ] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); assert(!b0.isInfinite()); T p0; T p1; for (unsigned int i = 0; i < T::dimensions(); i++) { p0[i] = -typename T::BaseType(1 << (i + 1)); p1[i] = typename T::BaseType(1 << (T::dimensions() - i)); } IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); assert(!b1.isInfinite()); } // // Non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 2) ] // 3D: [(0, 0, 0), (0, 0, 2) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 2)] // { T min(0); T max = min; max[T::dimensions() - 1] = 2; IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(!b.isInfinite()); } } template void testHasVolume(const char *type) { cout << " hasVolume() for type " << type << endl; // // Empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; assert(!b.hasVolume()); } // // Infinite box. // { IMATH_INTERNAL_NAMESPACE::Box b; b.makeInfinite(); assert(b.hasVolume()); } // // Non-empty, has-volume box. // 2D: [(-2, -4), ( 8, 2) ] // 3D: [(-2, -4, -6), (12, 8, 2) ] // 4D: [(-2, -4, -6, -8), (16, 12, 8, 4) ] // { IMATH_INTERNAL_NAMESPACE::Box b0(T(-1), T(1)); assert(b0.hasVolume()); T p0; T p1; for (unsigned int i = 0; i < T::dimensions(); i++) { p0[i] = -typename T::BaseType(1 << (i + 1)); p1[i] = typename T::BaseType(1 << (T::dimensions() - i)); } IMATH_INTERNAL_NAMESPACE::Box b1(p0, p1); assert(b1.hasVolume()); } // // Non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (0, 2) ] // 3D: [(0, 0, 0), (0, 0, 2) ] // 4D: [(0, 0, 0, 0), (0, 0, 0, 2)] // { T min(0); T max = min; max[T::dimensions() - 1] = 2; IMATH_INTERNAL_NAMESPACE::Box b(min, max); assert(!b.hasVolume()); } } template void testMajorAxis(const char *type) { cout << " majorAxis() for type " << type << endl; // // Empty box. // { IMATH_INTERNAL_NAMESPACE::Box b; assert(b.majorAxis() == 0); } // // Non-empty, has-volume box. // Boxes are [ (0, 0, ...), () ] // { std::vector perms; permutations(perms); for (unsigned int i = 0; i < perms.size(); i++) { IMATH_INTERNAL_NAMESPACE::Box b(T(0), perms[i]); unsigned int major = 0; T size = perms[i] - T(0); for (unsigned int j = 1; j < T::dimensions(); j++) if (size[j] > size[major]) major = j; assert(b.majorAxis() == major); } } // // Non-empty, no-volume box. // Boxes are: // 2D: [(0, 0), (1, 0) ] // 2D: [(0, 0), (0, 1) ] // // 3D: [(0, 0), (1, 0, 0) ] // 3D: [(0, 0), (0, 1, 0) ] // 3D: [(0, 0), (0, 0, 1) ] // // and similarly for 4D // { for (unsigned int i = 0; i < T::dimensions(); i++) { for (unsigned int j = 0; j < T::dimensions(); j++) { T max(0); max[j] = 1; IMATH_INTERNAL_NAMESPACE::Box b(T(0), max); assert(b.majorAxis() == j); } } } } } // anonymous namespace void testBox() { cout << "Testing box methods" << endl; // // Constructors // testConstructors("V2s"); testConstructors("V2i"); testConstructors("V2f"); testConstructors("V2d"); testConstructors("V3s"); testConstructors("V3i"); testConstructors("V3f"); testConstructors("V3d"); testConstructors("V4s"); testConstructors("V4i"); testConstructors("V4f"); testConstructors("V4d"); // // makeEmpty() // testMakeEmpty("V2s"); testMakeEmpty("V2i"); testMakeEmpty("V2f"); testMakeEmpty("V2d"); testMakeEmpty("V3s"); testMakeEmpty("V3i"); testMakeEmpty("V3f"); testMakeEmpty("V3d"); testMakeEmpty("V4s"); testMakeEmpty("V4i"); testMakeEmpty("V4f"); testMakeEmpty("V4d"); // // makeInfinite() // testMakeInfinite("V2s"); testMakeInfinite("V2i"); testMakeInfinite("V2f"); testMakeInfinite("V2d"); testMakeInfinite("V3s"); testMakeInfinite("V3i"); testMakeInfinite("V3f"); testMakeInfinite("V3d"); testMakeInfinite("V4s"); testMakeInfinite("V4i"); testMakeInfinite("V4f"); testMakeInfinite("V4d"); // // extendBy() (point) // testExtendByPoint("V2s"); testExtendByPoint("V2i"); testExtendByPoint("V2f"); testExtendByPoint("V2d"); testExtendByPoint("V3s"); testExtendByPoint("V3i"); testExtendByPoint("V3f"); testExtendByPoint("V3d"); testExtendByPoint("V4s"); testExtendByPoint("V4i"); testExtendByPoint("V4f"); testExtendByPoint("V4d"); // // extendBy() box // testExtendByBox("V2s"); testExtendByBox("V2i"); testExtendByBox("V2f"); testExtendByBox("V2d"); testExtendByBox("V3s"); testExtendByBox("V3i"); testExtendByBox("V3f"); testExtendByBox("V3d"); testExtendByBox("V4s"); testExtendByBox("V4i"); testExtendByBox("V4f"); testExtendByBox("V4d"); // // == and !== // testComparators("V2s"); testComparators("V2i"); testComparators("V2f"); testComparators("V2d"); testComparators("V3s"); testComparators("V3i"); testComparators("V3f"); testComparators("V3d"); testComparators("V4s"); testComparators("V4i"); testComparators("V4f"); testComparators("V4d"); // // size() // testSize("V2s"); testSize("V2i"); testSize("V2f"); testSize("V2d"); testSize("V3s"); testSize("V3i"); testSize("V3f"); testSize("V3d"); testSize("V4s"); testSize("V4i"); testSize("V4f"); testSize("V4d"); // // center() // testCenter("V2s"); testCenter("V2i"); testCenter("V2f"); testCenter("V2d"); testCenter("V3s"); testCenter("V3i"); testCenter("V3f"); testCenter("V3d"); testCenter("V4s"); testCenter("V4i"); testCenter("V4f"); testCenter("V4d"); // // isEmpty() // testIsEmpty("V2s"); testIsEmpty("V2i"); testIsEmpty("V2f"); testIsEmpty("V2d"); testIsEmpty("V3s"); testIsEmpty("V3i"); testIsEmpty("V3f"); testIsEmpty("V3d"); testIsEmpty("V4s"); testIsEmpty("V4i"); testIsEmpty("V4f"); testIsEmpty("V4d"); // // isInfinite() // testIsInfinite("V2s"); testIsInfinite("V2i"); testIsInfinite("V2f"); testIsInfinite("V2d"); testIsInfinite("V3s"); testIsInfinite("V3i"); testIsInfinite("V3f"); testIsInfinite("V3d"); testIsInfinite("V4s"); testIsInfinite("V4i"); testIsInfinite("V4f"); testIsInfinite("V4d"); // // hasVolume() // testHasVolume("V2s"); testHasVolume("V2i"); testHasVolume("V2f"); testHasVolume("V2d"); testHasVolume("V3s"); testHasVolume("V3i"); testHasVolume("V3f"); testHasVolume("V3d"); testHasVolume("V4s"); testHasVolume("V4i"); testHasVolume("V4f"); testHasVolume("V4d"); // // majorAxis() // testMajorAxis("V2s"); testMajorAxis("V2i"); testMajorAxis("V2f"); testMajorAxis("V2d"); testMajorAxis("V3s"); testMajorAxis("V3i"); testMajorAxis("V3f"); testMajorAxis("V3d"); testMajorAxis("V4s"); testMajorAxis("V4i"); testMajorAxis("V4f"); testMajorAxis("V4d"); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testBox.h000066400000000000000000000034241406177042200202320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testBox(); openexr-2.5.7/IlmBase/ImathTest/testBoxAlgo.cpp000066400000000000000000000603671406177042200214010ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathBoxAlgo.h" #include "ImathRandom.h" #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { bool approximatelyEqual (const V3f &p1, const V3f &p2, float e) { float m = 0; for (int i = 0; i < 3; ++i) { m = max (m, abs (p1[i])); m = max (m, abs (p2[i])); } for (int i = 0; i < 3; ++i) if (!equalWithAbsError (p1[i], p2[i], m * e)) return false; return true; } void testEntryAndExitPoints (const Box3f &box) { Rand48 random (2007); float e = 50 * limits::epsilon(); if (box.isEmpty()) { cout << " empty box, no rays intersect" << endl; for (int i = 0; i < 100000; ++i) { V3f p1 (random.nextf (box.max.x, box.min.x), random.nextf (box.max.y, box.min.y), random.nextf (box.max.z, box.min.z)); V3f p2 (p1 + hollowSphereRand (random)); V3f r, s; assert (!findEntryAndExitPoints (Line3f (p1, p2), box, r, s)); } return; } cout << " box = (" << box.min << " " << box.max << ")" << endl; if (box.max == box.min) { cout << " single-point box, ray intersects" << endl; static const float off[6][3] = { {-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1} }; for (int i = 0; i < 6; ++i) { V3f p1 (box.min.x + off[i][0], box.min.y + off[i][1], box.min.z + off[i][2]); V3f r, s; assert (findEntryAndExitPoints (Line3f (p1, box.min), box, r, s)); assert (r == box.min && s == box.min); } cout << " single-point box, ray does not intersect" << endl; for (int i = 0; i < 100000; ++i) { // // The ray starts at a distance of r2 from the of the // box, and it passes the box at a minimum distance of r1. // const float r1 = 0.00001; const float r2 = 1.0; V3f p1 = box.min + r2 * hollowSphereRand (random); V3f p2; float r3; do { do { p2 = box.min + r2 * hollowSphereRand (random); } while (approximatelyEqual (p1, p2, e)); V3f d1 = (p2 - p1).normalized(); V3f d2 = (box.min - p1); r3 = (d2 - d1 * (d1 ^ d2)).length(); } while (r3 < r1); Line3f ray (p1, p2); V3f r, s; assert (!findEntryAndExitPoints (ray, box, r, s)); } return; } cout << " ray starts outside box, intersects" << endl; Box3f bigBox (box.min - (box.max - box.min), box.max + (box.max - box.min)); for (int i = 0; i < 100000; ++i) { // // Find starting point outside the box, end point inside the box // V3f p1; do { p1 = V3f (random.nextf (bigBox.min.x, bigBox.max.x), random.nextf (bigBox.min.y, bigBox.max.y), random.nextf (bigBox.min.z, bigBox.max.z)); } while (box.intersects (p1)); V3f p2; do { p2 = V3f (random.nextf (box.min.x, box.max.x), random.nextf (box.min.y, box.max.y), random.nextf (box.min.z, box.max.z)); } while (approximatelyEqual (p1, p2, e)); Line3f ray (p1, p2); V3f r, s; bool b = findEntryAndExitPoints (ray, box, r, s); // // Ray and box must intersect, entry and exit points // must be on the surface of the box. // assert (b); assert (r.x == box.min.x || r.x == box.max.x || r.y == box.min.y || r.y == box.max.y || r.z == box.min.z || r.z == box.max.z); assert (s.x == box.min.x || s.x == box.max.x || s.y == box.min.y || s.y == box.max.y || s.z == box.min.z || s.z == box.max.z); // // Entry and exit points must be consistent // with the direction of the ray // if (r.x == box.min.x) assert (ray.dir.x >= 0); if (r.x == box.max.x) assert (ray.dir.x <= 0); if (r.y == box.min.y) assert (ray.dir.y >= 0); if (r.y == box.max.y) assert (ray.dir.y <= 0); if (r.z == box.min.z) assert (ray.dir.z >= 0); if (r.z == box.max.z) assert (ray.dir.z <= 0); if (s.x == box.max.x) assert (ray.dir.x >= 0); if (s.x == box.min.x) assert (ray.dir.x <= 0); if (s.y == box.max.y) assert (ray.dir.y >= 0); if (s.y == box.min.y) assert (ray.dir.y <= 0); if (s.z == box.max.z) assert (ray.dir.z >= 0); if (s.z == box.min.z) assert (ray.dir.z <= 0); // // Entry and exit points must be approximately on the ray // How far they can be off depends on how far p1 and the // entry and exit points are are from the origin. // { V3f p3 = p1 + ray.dir * (ray.dir ^ (r - p1)); float m = 0; for (int j = 0; j < 3; ++j) { m = max (abs (p1[j]), m); m = max (abs (r[j]), m); } float err = 30 * m * limits::epsilon(); assert (p3.equalWithAbsError (r, err)); } { V3f p3 = p1 + ray.dir * (ray.dir ^ (s - p1)); float m = 0; for (int j = 0; j < 3; ++j) { m = max (abs (p1[j]), m); m = max (abs (s[j]), m); } float err = 30 * m * limits::epsilon(); assert (p3.equalWithAbsError (s, err)); } } cout << " ray starts outside box, does not intersect" << endl; V3f center = (box.min + box.max) * 0.5f; float r1 = (box.max - box.min).length() * 0.51f; float r2 = 2 * r1; for (int i = 0; i < 100000; ++i) { // // The ray starts at a distance of r2 from the center // of the box, and it passes the center at a minimum // distance of r1. (r1 and r2 are both greater than // the distance between the center and the corners // of the box.) // V3f p1 = center + r2 * hollowSphereRand (random); V3f p2; float r3; do { do { p2 = center + r2 * hollowSphereRand (random); } while (approximatelyEqual (p1, p2, e)); V3f d1 = (p2 - p1).normalized(); V3f d2 = (center - p1); r3 = (d2 - d1 * (d1 ^ d2)).length(); } while (r3 < r1); Line3f ray (p1, p2); V3f r, s; assert (!findEntryAndExitPoints (ray, box, r, s)); } } void entryAndExitPoints1 () { cout << " ray-box entry and exit, random rays" << endl; Box3f boxes[] = { // Boxes with a positive volume Box3f (V3f (-1, -1, -1), V3f (1, 1, 1)), Box3f (V3f (10, 20, 30), V3f (1010, 21, 31)), Box3f (V3f (10, 20, 30), V3f (11, 1020, 31)), Box3f (V3f (10, 20, 30), V3f (11, 21, 1030)), Box3f (V3f (-1e10f, -2e10f, -3e10f), V3f (5e15f, 6e15f, 7e15f)), // Non-empty, zero-volume boxes Box3f (V3f (1, 1, 1), V3f (2, 1, 1)), Box3f (V3f (1, 1, 1), V3f (1, 2, 1)), Box3f (V3f (1, 1, 1), V3f (1, 1, 2)), Box3f (V3f (1, 1, 1), V3f (1, 2, 3)), Box3f (V3f (1, 1, 1), V3f (2, 3, 1)), Box3f (V3f (1, 1, 1), V3f (2, 1, 3)), Box3f (V3f (-1, -2, 1), V3f (-1, -2, 1)), Box3f (V3f (1, 1, 1), V3f (1, 1, 1)), Box3f (V3f (0, 0, 0), V3f (0, 0, 0)), // empty box Box3f () }; for (size_t i = 0; i < sizeof (boxes) / sizeof (boxes[0]); ++i) testEntryAndExitPoints (boxes[i]); } void testPerturbedRayBoxEntryExit (const Box3f &box, const Line3f &ray, bool result) { cout << " dir ~ " << ray.dir << ", result = " << result << endl; { V3f r, s; assert (result == findEntryAndExitPoints (ray, box, r, s)); } Rand48 random (19); const float e = 1e-25f; for (int i = 0; i < 10000; ++i) { Line3f ray1 (ray); ray1.dir += e * solidSphereRand (random); V3f r, s; assert (result == findEntryAndExitPoints (ray1, box, r, s)); } } void entryAndExitPoints2 () { cout << " ray-box entry and exit, nearly axis-parallel rays" << endl; Box3f box (V3f (-1e15f, -1e15f, -1e15f), V3f (1e15f, 1e15f, 1e15f)); Line3f ray; V3f r, s; bool b; ray = Line3f (V3f (-2e15f, 0, 0), V3f (2e15f, 0, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (-1e15f, 0, 0) && s == V3f (1e15f, 0, 0)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (2e15f, 0, 0), V3f (-2e15f, 0, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (1e15f, 0, 0) && s == V3f (-1e15f, 0, 0)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (-2e15f, 2e15f, 0), V3f (2e15f, 2e15f, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); ray = Line3f (V3f (2e15f, 2e15f, 0), V3f (-2e15f, 2e15f, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); ray = Line3f (V3f (0, -2e15f, 0), V3f (0, 2e15f, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (0, -1e15f, 0) && s == V3f (0, 1e15f, 0)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (0, 2e15f, 0), V3f (0, -2e15f, 0)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (0, 1e15f, 0) && s == V3f (0, -1e15f, 0)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (0, -2e15f, 2e15f), V3f (0, 2e15f, 2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); ray = Line3f (V3f (0, 2e15f, 2e15f), V3f (0, -2e15f, 2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); ray = Line3f (V3f (0, 0, -2e15f), V3f (0, 0, 2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (0, 0, -1e15f) && s == V3f (0, 0, 1e15f)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (0, 0, 2e15f), V3f (0, 0, -2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (b && r == V3f (0, 0, 1e15f) && s == V3f (0, 0, -1e15f)); testPerturbedRayBoxEntryExit (box, ray, true); ray = Line3f (V3f (2e15f, 0, -2e15f), V3f (2e15f, 0, 2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); ray = Line3f (V3f (2e15f, 0, 2e15f), V3f (2e15f, 0, -2e15f)); b = findEntryAndExitPoints (ray, box, r, s); assert (!b); testPerturbedRayBoxEntryExit (box, ray, false); } void testRayBoxIntersection (const Box3f &box) { Rand48 random (2007); float e = 50 * limits::epsilon(); if (box.isEmpty()) { cout << " empty box, no rays intersect" << endl; for (int i = 0; i < 100000; ++i) { V3f p1 (random.nextf (box.max.x, box.min.x), random.nextf (box.max.y, box.min.y), random.nextf (box.max.z, box.min.z)); V3f p2 (p1 + hollowSphereRand (random)); V3f ip; assert (!intersects (box, Line3f (p1, p2), ip)); } return; } cout << " box = (" << box.min << " " << box.max << ")" << endl; if (box.max == box.min) { cout << " single-point box, ray intersects" << endl; static const float off[6][3] = { {-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1} }; for (int i = 0; i < 6; ++i) { V3f p1 (box.min.x + off[i][0], box.min.y + off[i][1], box.min.z + off[i][2]); V3f ip; assert (intersects (box, Line3f (p1, box.min), ip)); assert (ip == box.min); } cout << " single-point box, ray does not intersect" << endl; for (int i = 0; i < 100000; ++i) { // // The ray starts at a distance of r2 from the of the // box, and it passes the box at a minimum distance of r1. // const float r1 = 0.00001; const float r2 = 1.0; V3f p1 = box.min + r2 * hollowSphereRand (random); V3f p2; float r3; do { do { p2 = box.min + r2 * hollowSphereRand (random); } while (approximatelyEqual (p1, p2, e)); V3f d1 = (p2 - p1).normalized(); V3f d2 = (box.min - p1); r3 = (d2 - d1 * (d1 ^ d2)).length(); } while (r3 < r1); Line3f ray (p1, p2); V3f ip; assert (!intersects (box, ray, ip)); } return; } cout << " ray starts inside box" << endl; for (int i = 0; i < 1000; ++i) { V3f p1 (random.nextf (box.min.x, box.max.x), random.nextf (box.min.y, box.max.y), random.nextf (box.min.z, box.max.z)); V3f p2 (p1 + hollowSphereRand (random)); V3f ip; bool b = intersects (box, Line3f (p1, p2), ip); assert (b && ip == p1); } cout << " ray starts outside box, intersects" << endl; Box3f bigBox (box.min - (box.max - box.min), box.max + (box.max - box.min)); for (int i = 0; i < 100000; ++i) { // // Find starting point outside the box, end point inside the box // V3f p1; do { p1 = V3f (random.nextf (bigBox.min.x, bigBox.max.x), random.nextf (bigBox.min.y, bigBox.max.y), random.nextf (bigBox.min.z, bigBox.max.z)); } while (box.intersects (p1)); V3f p2; do { p2 = V3f (random.nextf (box.min.x, box.max.x), random.nextf (box.min.y, box.max.y), random.nextf (box.min.z, box.max.z)); } while (approximatelyEqual (p1, p2, e)); Line3f ray (p1, p2); V3f ip; bool b = intersects (box, ray, ip); // // Ray and box must intersect, intersection point // must be on the surface of the box. // assert (b); assert (ip.x == box.min.x || ip.x == box.max.x || ip.y == box.min.y || ip.y == box.max.y || ip.z == box.min.z || ip.z == box.max.z); // // Intersection point must be consistent with the origin // and direction of the ray // if (ip.x == box.min.x) assert (ray.pos.x <= box.min.x && ray.dir.x >= 0); if (ip.x == box.max.x) assert (ray.pos.x >= box.max.x && ray.dir.x <= 0); if (ip.y == box.min.y) assert (ray.pos.y <= box.min.y && ray.dir.y >= 0); if (ip.y == box.max.y) assert (ray.pos.y >= box.max.y && ray.dir.y <= 0); if (ip.z == box.min.z) assert (ray.pos.z <= box.min.z && ray.dir.z >= 0); if (ip.z == box.max.z) assert (ray.pos.z >= box.max.z && ray.dir.z <= 0); // // Intersection point must be approximately on the ray // How far it can be off depends on how far p1 and ip // are from the origin. // V3f p3 = p1 + ray.dir * (ray.dir ^ (ip - p1)); float m = 0; for (int j = 0; j < 3; ++j) { m = max (abs (p1[j]), m); m = max (abs (ip[j]), m); } float err = 30 * m * limits::epsilon(); assert (p3.equalWithAbsError (ip, err)); // // Try same starting point, opposite direction // ray.dir *= -1; V3f ip2; assert (!intersects (box, ray, ip2)); } cout << " ray starts outside box, does not intersect" << endl; V3f center = (box.min + box.max) * 0.5f; float r1 = (box.max - box.min).length() * 0.51f; float r2 = 2 * r1; for (int i = 0; i < 100000; ++i) { // // The ray starts at a distance of r2 from the center // of the box, and it passes the center at a minimum // distance of r1. (r1 and r2 are both greater than // the distance between the center and the corners // of the box.) // V3f p1 = center + r2 * hollowSphereRand (random); V3f p2; float r3; do { do { p2 = center + r2 * hollowSphereRand (random); } while (approximatelyEqual (p1, p2, e)); V3f d1 = (p2 - p1).normalized(); V3f d2 = (center - p1); r3 = (d2 - d1 * (d1 ^ d2)).length(); } while (r3 < r1); Line3f ray (p1, p2); V3f ip; assert (!intersects (box, ray, ip)); } } void rayBoxIntersection1 () { cout << " ray-box intersection, random rays" << endl; Box3f boxes[] = { // Boxes with a positive volume Box3f (V3f (-1, -1, -1), V3f (1, 1, 1)), Box3f (V3f (10, 20, 30), V3f (1010, 21, 31)), Box3f (V3f (10, 20, 30), V3f (11, 1020, 31)), Box3f (V3f (10, 20, 30), V3f (11, 21, 1030)), Box3f (V3f (-1e10f, -2e10f, -3e10f), V3f (5e15f, 6e15f, 7e15f)), // Non-empty, zero-volume boxes Box3f (V3f (1, 1, 1), V3f (2, 1, 1)), Box3f (V3f (1, 1, 1), V3f (1, 2, 1)), Box3f (V3f (1, 1, 1), V3f (1, 1, 2)), Box3f (V3f (1, 1, 1), V3f (1, 2, 3)), Box3f (V3f (1, 1, 1), V3f (2, 3, 1)), Box3f (V3f (1, 1, 1), V3f (2, 1, 3)), Box3f (V3f (-1, -2, 1), V3f (-1, -2, 1)), Box3f (V3f (1, 1, 1), V3f (1, 1, 1)), Box3f (V3f (0, 0, 0), V3f (0, 0, 0)), // empty box Box3f () }; for (size_t i = 0; i < sizeof (boxes) / sizeof (boxes[0]); ++i) testRayBoxIntersection (boxes[i]); } void testPerturbedRayBox (const Box3f &box, const Line3f &ray, bool result) { cout << " dir ~ " << ray.dir << ", result = " << result << endl; { V3f ip; assert (result == intersects (box, ray, ip)); } Rand48 random (19); const float e = 1e-25f; for (int i = 0; i < 10000; ++i) { Line3f ray1 (ray); ray1.dir += e * solidSphereRand (random); V3f ip; assert (result == intersects (box, ray1, ip)); } } void rayBoxIntersection2 () { cout << " ray-box intersection, nearly axis-parallel rays" << endl; Box3f box (V3f (-1e15f, -1e15f, -1e15f), V3f (1e15f, 1e15f, 1e15f)); Line3f ray; V3f ip; bool b; ray = Line3f (V3f (-2e15f, 0, 0), V3f (2e15f, 0, 0)); b = intersects (box, ray, ip); assert (b && ip == V3f (-1e15f, 0, 0)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (2e15f, 0, 0), V3f (-2e15f, 0, 0)); b = intersects (box, ray, ip); assert (b && ip == V3f (1e15f, 0, 0)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (-2e15f, 2e15f, 0), V3f (2e15f, 2e15f, 0)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); ray = Line3f (V3f (2e15f, 2e15f, 0), V3f (-2e15f, 2e15f, 0)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); ray = Line3f (V3f (0, -2e15f, 0), V3f (0, 2e15f, 0)); b = intersects (box, ray, ip); assert (b && ip == V3f (0, -1e15f, 0)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (0, 2e15f, 0), V3f (0, -2e15f, 0)); b = intersects (box, ray, ip); assert (b && ip == V3f (0, 1e15f, 0)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (0, -2e15f, 2e15f), V3f (0, 2e15f, 2e15f)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); ray = Line3f (V3f (0, 2e15f, 2e15f), V3f (0, -2e15f, 2e15f)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); ray = Line3f (V3f (0, 0, -2e15f), V3f (0, 0, 2e15f)); b = intersects (box, ray, ip); assert (b && ip == V3f (0, 0, -1e15f)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (0, 0, 2e15f), V3f (0, 0, -2e15f)); b = intersects (box, ray, ip); assert (b && ip == V3f (0, 0, 1e15f)); testPerturbedRayBox (box, ray, true); ray = Line3f (V3f (2e15f, 0, -2e15f), V3f (2e15f, 0, 2e15f)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); ray = Line3f (V3f (2e15f, 0, 2e15f), V3f (2e15f, 0, -2e15f)); b = intersects (box, ray, ip); assert (!b); testPerturbedRayBox (box, ray, false); } Box3f transformSimple (const Box3f &b, const M44f &M) { Box3f b1; for (int i = 0; i < 8; ++i) { V3f p; for (int j = 0; j < 3; ++j) p[j] = ((i >> j) & 1)? b.max[j]: b.min[j]; b1.extendBy (p * M); } return b1; } void boxMatrixTransform () { cout << " transform box by matrix" << endl; const float e = 5 * limits::epsilon(); Box3f b1 (V3f (4, 5, 6), V3f (7, 8, 9)); M44f M; M.setEulerAngles (V3f (1, 2, 3)); M.translate (V3f (20, -15, 2)); Box3f b2 = transform (b1, M); Box3f b3 = affineTransform (b1, M); Box3f b4 = transformSimple (b1, M); Box3f b21; Box3f b31; transform (b1, M, b21); affineTransform (b1, M, b31); assert (approximatelyEqual (b2.min, b4.min, e)); assert (approximatelyEqual (b2.max, b4.max, e)); assert (approximatelyEqual (b3.max, b4.max, e)); assert (approximatelyEqual (b3.max, b4.max, e)); assert (b21 == b2); assert (b31 == b3); M[0][3] = 1; M[1][3] = 2; M[2][3] = 3; M[3][3] = 4; Box3f b5 = transform (b1, M); Box3f b6 = transformSimple (b1, M); Box3f b51; transform (b1, M, b51); assert (approximatelyEqual (b5.min, b6.min, e)); assert (approximatelyEqual (b5.max, b6.max, e)); assert (b51 == b5); } void pointInAndOnBox () { cout << " closest points in and on box" << endl; Box3f box (V3f (1, 2, 3), V3f (5, 4, 6)); // // Points outside the box // assert (closestPointOnBox (V3f (0, 0, 0), box) == V3f (1, 2, 3)); assert (closestPointInBox (V3f (0, 0, 0), box) == V3f (1, 2, 3)); assert (closestPointOnBox (V3f (7, 7, 7), box) == V3f (5, 4, 6)); assert (closestPointInBox (V3f (7, 7, 7), box) == V3f (5, 4, 6)); assert (closestPointOnBox (V3f (2, 3, 0), box) == V3f (2, 3, 3)); assert (closestPointInBox (V3f (2, 3, 0), box) == V3f (2, 3, 3)); assert (closestPointOnBox (V3f (2, 3, 7), box) == V3f (2, 3, 6)); assert (closestPointInBox (V3f (2, 3, 7), box) == V3f (2, 3, 6)); assert (closestPointOnBox (V3f (2, 0, 4), box) == V3f (2, 2, 4)); assert (closestPointInBox (V3f (2, 0, 4), box) == V3f (2, 2, 4)); assert (closestPointOnBox (V3f (2, 7, 4), box) == V3f (2, 4, 4)); assert (closestPointInBox (V3f (2, 7, 4), box) == V3f (2, 4, 4)); assert (closestPointOnBox (V3f (0, 3, 4), box) == V3f (1, 3, 4)); assert (closestPointInBox (V3f (0, 3, 4), box) == V3f (1, 3, 4)); assert (closestPointOnBox (V3f (7, 3, 4), box) == V3f (5, 3, 4)); assert (closestPointInBox (V3f (7, 3, 4), box) == V3f (5, 3, 4)); // // Points inside the box // assert (closestPointOnBox (V3f (1.5, 3, 5), box) == V3f (1, 3, 5)); assert (closestPointInBox (V3f (1.5, 3, 5), box) == V3f (1.5, 3, 5)); assert (closestPointOnBox (V3f (4.5, 3, 5), box) == V3f (5, 3, 5)); assert (closestPointInBox (V3f (4.5, 3, 5), box) == V3f (4.5, 3, 5)); assert (closestPointOnBox (V3f (2, 2.5, 4), box) == V3f (2, 2, 4)); assert (closestPointInBox (V3f (2, 2.5, 4), box) == V3f (2, 2.5, 4)); assert (closestPointOnBox (V3f (2, 3.5, 4), box) == V3f (2, 4, 4)); assert (closestPointInBox (V3f (2, 3.5, 4), box) == V3f (2, 3.5, 4)); assert (closestPointOnBox (V3f (2, 3, 3.5), box) == V3f (2, 3, 3)); assert (closestPointInBox (V3f (2, 3, 3.5), box) == V3f (2, 3, 3.5)); assert (closestPointOnBox (V3f (2, 3, 5.5), box) == V3f (2, 3, 6)); assert (closestPointInBox (V3f (2, 3, 5.5), box) == V3f (2, 3, 5.5)); // // Point at the center of the box. "Closest point on box" is // in at the center of +Y side // assert (closestPointOnBox (V3f (3, 3, 4.5), box) == V3f (3, 4, 4.5)); assert (closestPointInBox (V3f (3, 3, 4.5), box) == V3f (3, 3, 4.5)); } } // namespace void testBoxAlgo () { cout << "Testing box algorithms" << endl; entryAndExitPoints1(); entryAndExitPoints2(); rayBoxIntersection1(); rayBoxIntersection2(); boxMatrixTransform(); pointInAndOnBox(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testBoxAlgo.h000066400000000000000000000034321406177042200210340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testBoxAlgo (); openexr-2.5.7/IlmBase/ImathTest/testColor.cpp000066400000000000000000000200351406177042200211100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathColor.h" #include "ImathColorAlgo.h" #include "ImathLimits.h" #include "ImathMath.h" #include #include using namespace std; void testColor () { cout << "Testing functions in ImathColor.h & ImathColorAlgo.h" << endl; cout << "rgb2packed -> packed2rgb" << endl; const float epsilon = IMATH_INTERNAL_NAMESPACE::limits< float >::epsilon(); IMATH_INTERNAL_NAMESPACE::PackedColor packed; IMATH_INTERNAL_NAMESPACE::C3c in3( 52, 128, 254 ); IMATH_INTERNAL_NAMESPACE::C3c out3; packed = IMATH_INTERNAL_NAMESPACE::rgb2packed( in3 ); IMATH_INTERNAL_NAMESPACE::packed2rgb( packed, out3 ); assert ( in3 == out3 ); IMATH_INTERNAL_NAMESPACE::C4c testConstructor1; IMATH_INTERNAL_NAMESPACE::C4c testConstructor1i ( 0.f ); IMATH_INTERNAL_NAMESPACE::C4c testConstructor2( testConstructor1i ); testConstructor1 = testConstructor2; // use these so the compiler doesn't emit a warning IMATH_INTERNAL_NAMESPACE::C4c testConstructor3( 52, 128, 254, 127 ); IMATH_INTERNAL_NAMESPACE::C4c A( testConstructor3 ); IMATH_INTERNAL_NAMESPACE::C4c B; IMATH_INTERNAL_NAMESPACE::C4f X, Y, tmp; packed = IMATH_INTERNAL_NAMESPACE::rgb2packed( A ); IMATH_INTERNAL_NAMESPACE::packed2rgb( packed, B ); assert ( A == B ); cout << "Imath::Color4 * f" << endl; assert ( ( IMATH_INTERNAL_NAMESPACE::C4f( 0.330f, 0.710f, 0.010f, 0.999f ) * 0.999f ) == IMATH_INTERNAL_NAMESPACE::C4f( 0.330f * 0.999f, 0.710f * 0.999f, 0.010f * 0.999f, 0.999f * 0.999f ) ); cout << "Imath::Color4 / f" << endl; assert ( ( IMATH_INTERNAL_NAMESPACE::C4f( 0.330f, 0.710f, 0.010f, 0.999f ) / 0.999f ) == IMATH_INTERNAL_NAMESPACE::C4f( 0.330f / 0.999f, 0.710f / 0.999f, 0.010f / 0.999f, 0.999f / 0.999f ) ); cout << "Assignment and comparison" << endl; B = A; assert( B == A ); assert( !( B != A ) ); X = Y = IMATH_INTERNAL_NAMESPACE::C4f( 0.123f, -0.420f, 0.501f, 0.998f ); X *= 0.001f; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.r * 0.001f ) - X.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.g * 0.001f ) - X.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.b * 0.001f ) - X.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.a * 0.001f ) - X.a ) <= epsilon ); X = Y = IMATH_INTERNAL_NAMESPACE::C4f( 0.123f, -0.420f, 0.501f, 0.998f ); X /= -1.001f; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.r / -1.001f ) - X.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.g / -1.001f ) - X.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.b / -1.001f ) - X.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.a / -1.001f ) - X.a ) <= epsilon ); Y = IMATH_INTERNAL_NAMESPACE::C4f( 0.998f, -0.001f, 0.501f, 1.001f ); X = IMATH_INTERNAL_NAMESPACE::C4f( 0.011f, -0.420f, -0.501f, 0.998f ); tmp = X + Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r + Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g + Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b + Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a + Y.a ) - tmp.a ) <= epsilon ); tmp = X - Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r - Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g - Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b - Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a - Y.a ) - tmp.a ) <= epsilon ); tmp = X * Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r * Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g * Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b * Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a * Y.a ) - tmp.a ) <= epsilon ); tmp = X / Y; // // epsilon doesn't work here. // assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r / Y.r ) - tmp.r ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g / Y.g ) - tmp.g ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b / Y.b ) - tmp.b ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a / Y.a ) - tmp.a ) <= 1e-5f ); tmp = X; tmp += Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r + Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g + Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b + Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a + Y.a ) - tmp.a ) <= epsilon ); tmp = X; tmp -= Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r - Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g - Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b - Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a - Y.a ) - tmp.a ) <= epsilon ); tmp = X; tmp *= Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r * Y.r ) - tmp.r ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g * Y.g ) - tmp.g ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b * Y.b ) - tmp.b ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a * Y.a ) - tmp.a ) <= epsilon ); tmp = X; tmp /= Y; // // epsilon doesn't work here. // assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.r / Y.r ) - tmp.r ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.g / Y.g ) - tmp.g ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.b / Y.b ) - tmp.b ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.a / Y.a ) - tmp.a ) <= 1e-5f ); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testColor.h000066400000000000000000000034331406177042200205600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testColor (); openexr-2.5.7/IlmBase/ImathTest/testExtractEuler.cpp000066400000000000000000000156071406177042200224520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathMatrixAlgo.h" #include "ImathEuler.h" #include "ImathRandom.h" #include "ImathFun.h" #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { float rad (float deg) {return deg * (M_PI / 180);} M44f matrixEulerMatrix_1 (const M44f &M, Eulerf::Order order) { V3f f; if (order == Eulerf::XYZ) extractEulerXYZ (M, f); else extractEulerZYX (M, f); return Eulerf(f, order).toMatrix44(); } M44f matrixEulerMatrix_2 (const M44f &M, Eulerf::Order order) { Eulerf f (order); f.extract (M); return f.toMatrix44(); } void testMatrix (const M44f M, M44f (*matrixEulerMatrix)(const M44f &, Eulerf::Order), Eulerf::Order order) { // // Extract Euler angles from M, and convert the // Euler angles back to a matrix, N. // M44f N = matrixEulerMatrix (M, order); // // Verify that the entries in M and N do not // differ too much. // M44f D (M - N); for (int j = 0; j < 3; ++j) { for (int k = 0; k < 3; ++k) { if (abs (D[j][k]) > 0.000002) { cout << "unexpectedly large matrix to " "euler angles conversion error: " << D[j][k] << endl; cout << j << " " << k << endl; cout << "M\n" << M << endl; cout << "N\n" << N << endl; cout << "D\n" << D << endl; assert (false); } } } } void testRandomAngles (M44f (*matrixEulerMatrix)(const M44f &, Eulerf::Order), Eulerf::Order order) { Rand48 r(0); for (int i = 0; i < 100000; ++i) { // // Create a rotation matrix, M // Eulerf e (rad (r.nextf (-180, 180)), rad (r.nextf (-180, 180)), rad (r.nextf (-180, 180)), Eulerf::XYZ); M44f M (e.toMatrix44()); // // Add a small random error to the elements of M // for (int j = 0; j < 3; ++j) for (int k = 0; k < 3; ++k) M[j][k] += r.nextf (-1e-7, 1e-7); // // Extract Euler angles from M, convert the Euler angles // back to a matrix, N, and verify that the entries in M // and N do not differ too much. // testMatrix (M, matrixEulerMatrix, order); } } void testAngles (V3f angles, M44f (*matrixEulerMatrix)(const M44f &, Eulerf::Order), Eulerf::Order order) { Eulerf e (rad (angles.x), rad (angles.y), rad (angles.z), order); M44f M (e.toMatrix44()); // // With rounding errors from e.toMatrix. // testMatrix (M, matrixEulerMatrix, order); // // Without rounding errors (assuming that // all angles are multiples of 90 degrees). // for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) if (M[i][j] < -0.5) M[i][j] = -1; else if (M[i][j] > 0.5) M[i][j] = 1; else M[i][j] = 0; testMatrix (M, matrixEulerMatrix, order); } void test (M44f (*matrixEulerMatrix)(const M44f &, Eulerf::Order), Eulerf::Order order) { cout << "order = " << setbase (16) << int (order) << setbase (10) << endl; // cout << "random angles" << endl; testRandomAngles (matrixEulerMatrix, order); // cout << "special angles" << endl; for (int i = 0; i < 360; i += 90) for (int j = 0; j < 360; j += 90) for (int k = 0; k < 360; k += 90) testAngles (V3f (i, j, k), matrixEulerMatrix, order); } void testRandomAngles33 () { Rand48 r(0); float eps = 8.0 * limits::epsilon(); for (int i = 0; i < 100000; ++i) { float angle = rad (r.nextf (-180, 180)); M33f M; M.setRotation (angle); float angleEx; extractEuler (M, angleEx); assert (IMATH_INTERNAL_NAMESPACE::equal (angle, angleEx, eps)); } } } // namespace void testExtractEuler () { cout << "Testing extraction of rotation angle from 3x3 matrices" << endl; testRandomAngles33 (); cout << "Testing extraction of Euler angles from matrices" << endl; cout << "extractEulerXYZ()" << endl; test (matrixEulerMatrix_1, Eulerf::XYZ); cout << "extractEulerZYX()" << endl; test (matrixEulerMatrix_1, Eulerf::ZYX); cout << "Eulerf::extract()" << endl; test (matrixEulerMatrix_2, Eulerf::XYZ); test (matrixEulerMatrix_2, Eulerf::XZY); test (matrixEulerMatrix_2, Eulerf::YZX); test (matrixEulerMatrix_2, Eulerf::YXZ); test (matrixEulerMatrix_2, Eulerf::ZXY); test (matrixEulerMatrix_2, Eulerf::ZYX); test (matrixEulerMatrix_2, Eulerf::XZX); test (matrixEulerMatrix_2, Eulerf::XYX); test (matrixEulerMatrix_2, Eulerf::YXY); test (matrixEulerMatrix_2, Eulerf::YZY); test (matrixEulerMatrix_2, Eulerf::ZYZ); test (matrixEulerMatrix_2, Eulerf::ZXZ); test (matrixEulerMatrix_2, Eulerf::XYZr); test (matrixEulerMatrix_2, Eulerf::XZYr); test (matrixEulerMatrix_2, Eulerf::YZXr); test (matrixEulerMatrix_2, Eulerf::YXZr); test (matrixEulerMatrix_2, Eulerf::ZXYr); test (matrixEulerMatrix_2, Eulerf::ZYXr); test (matrixEulerMatrix_2, Eulerf::XZXr); test (matrixEulerMatrix_2, Eulerf::XYXr); test (matrixEulerMatrix_2, Eulerf::YXYr); test (matrixEulerMatrix_2, Eulerf::YZYr); test (matrixEulerMatrix_2, Eulerf::ZYZr); test (matrixEulerMatrix_2, Eulerf::ZXZr); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testExtractEuler.h000066400000000000000000000034421406177042200221110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testExtractEuler (); openexr-2.5.7/IlmBase/ImathTest/testExtractSHRT.cpp000066400000000000000000000214511406177042200221500ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathMatrixAlgo.h" #include "ImathEuler.h" #include "ImathRandom.h" #include "ImathFun.h" #include #include #include #include #if 0 #define debug(x) (printf x, fflush (stdout)) #else #define debug(x) #endif using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { float rad (float deg) {return deg * (M_PI / 180);} void testMatrix (const M33f M) { // // Extract the rotation angle from M, and convert the // angle back to a matrix, N. // V2f s(0.f), t(0.f); float h, r= 0.f; if (!extractSHRT (M, s, h, r, t, true)) { cout << "Unable to extractSHRT" << std::endl; assert(false); } M33f N; N *= M33f().setScale (s); N *= M33f().setShear (h); N *= M33f().setRotation (r); N *= M33f().setTranslation (t); debug (("Re-scale: %f %f\n", s[0], s[1])); debug (("Re-shear: %f\n", h)); debug (("Re-rot : %f\n", r)); debug (("Re-trans: %f %f\n", t[0], t[1])); // // Verify that the entries in M and N do not // differ too much. // M33f D (M - N); for (int j = 0; j < 3; ++j) { for (int k = 0; k < 3; ++k) { if (abs (D[j][k]) > 0.00001) { cout << "unexpectedly large matrix to " "euler angles conversion error: " << D[j][k] << endl; cout << j << " " << k << endl; cout << "M\n" << M << endl; cout << "N\n" << N << endl; cout << "D\n" << D << endl; assert (false); } } } } void testRandomAngles33 () { Rand48 random(0); for (int i = 0; i < 100000; ++i) { debug (("iteration: %d\n", i)); M33f M; // // Scale M. // V2f s (random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0)); for (int j=0; j < 2; j++) if (random.nextf (0.0, 1.0) >= 0.5) s[j] *= -1; M *= M33f().setScale (s); // // Shear M. // float h = random.nextf (0.000001, 2.); if (random.nextf (0.0, 1.0) >= 0.5) h *= -1; M *= M33f().setShear (h); // // Rotate M. // float r = rad (random.nextf (-180, 180)); M *= M33f().setRotation (r); // // Translate M. // V2f t (random.nextf (-10, 10), random.nextf (-10, 10)); M *= M33f().setTranslation (t); // // Add a small random error to the elements of M // for (int j = 0; j < 3; ++j) for (int k = 0; k < 2; ++k) M[j][k] += random.nextf (-1e-7, 1e-7); debug (("Scale : %f %f\n", s[0], s[1])); debug (("Shear : %f\n", h)); debug (("Rot : %f\n", r)); debug (("Trans : %f %f\n", t[0], t[1])); // // Extract Euler angles from M, convert the Euler angles // back to a matrix, N, and verify that the entries in M // and N do not differ too much. // testMatrix (M); debug (("\n")); } } void testAngles33 (float angle) { M33f M; M.setRotation (rad (angle)); // // With rounding errors from e.toMatrix. // testMatrix (M); // // Without rounding errors (assuming that // all angles are multiples of 90 degrees). // for (int i = 0; i < 2; ++i) for (int j = 0; j < 2; ++j) if (M[i][j] < -0.5) M[i][j] = -1; else if (M[i][j] > 0.5) M[i][j] = 1; else M[i][j] = 0; testMatrix (M); } void testMatrix (const M44f M) { // // Extract Euler angles from M, and convert the // Euler angles back to a matrix, N. // V3f s, h, r, t; extractSHRT (M, s, h, r, t, true); M44f N; N.translate (t); // ... matrix compositions N.rotate (r); N.shear (h); N.scale (s); debug (("Re-scale: %f %f %f\n", s[0], s[1], s[2])); debug (("Re-shear: %f %f %f\n", h[0], h[1], h[2])); debug (("Re-rot : %f %f %f\n", r[0], r[1], r[2])); debug (("Re-trans: %f %f %f\n", t[0], t[1], t[2])); // // Verify that the entries in M and N do not // differ too much. // M44f D (M - N); for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { if (abs (D[j][k]) > 0.00001) { cout << "unexpectedly large matrix to " "euler angles conversion error: " << D[j][k] << endl; cout << j << " " << k << endl; cout << "M\n" << M << endl; cout << "N\n" << N << endl; cout << "D\n" << D << endl; assert (false); } } } } void testRandomAngles44 () { Rand48 random(0); for (int i = 0; i < 100000; ++i) { debug (("iteration: %d\n", i)); M44f M; // // Translate M. // V3f t (random.nextf (-10, 10), random.nextf (-10, 10), random.nextf (-10, 10)); M.translate (t); // // Rotate M. // V3f r (rad (random.nextf (-180, 180)), rad (random.nextf (-180, 180)), rad (random.nextf (-180, 180))); M.rotate (r); // // Shear M. // V3f h (random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0)); for (int j=0; j < 3; j++) if (random.nextf (0.0, 1.0) >= 0.5) h[j] *= -1; M.shear (h); // // Scale M. // V3f s (random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0)); for (int j=0; j < 3; j++) if (random.nextf (0.0, 1.0) >= 0.5) s[j] *= -1; M.scale (s); // // Add a small random error to the elements of M // for (int j = 0; j < 4; ++j) for (int k = 0; k < 3; ++k) M[j][k] += random.nextf (-1e-7, 1e-7); debug (("Scale : %f %f %f\n", s[0], s[1], s[2])); debug (("Shear : %f %f %f\n", h[0], h[1], h[2])); debug (("Rot : %f %f %f\n", r[0], r[1], r[2])); debug (("Trans : %f %f %f\n", t[0], t[1], t[2])); // // Extract Euler angles from M, convert the Euler angles // back to a matrix, N, and verify that the entries in M // and N do not differ too much. // testMatrix (M); debug (("\n")); } } void testAngles44 (V3f angles) { Eulerf e (rad (angles.x), rad (angles.y), rad (angles.z)); M44f M (e.toMatrix44()); // // With rounding errors from e.toMatrix. // testMatrix (M); // // Without rounding errors (assuming that // all angles are multiples of 90 degrees). // for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) if (M[i][j] < -0.5) M[i][j] = -1; else if (M[i][j] > 0.5) M[i][j] = 1; else M[i][j] = 0; testMatrix (M); } void test () { cout << " random angles" << endl; cout << " 3x3" << endl; testRandomAngles33 (); cout << " 4x4" << endl; testRandomAngles44 (); cout << " special angles" << endl; cout << " 3x3" << endl; for (int i = 0; i < 360; i += 90) testAngles33 (float (i)); cout << " 4x4" << endl; for (int i = 0; i < 360; i += 90) for (int j = 0; j < 360; j += 90) for (int k = 0; k < 360; k += 90) testAngles44 (V3f (i, j, k)); } } // namespace void testExtractSHRT () { try { cout << "Testing extraction of scale, shear, rotation, translation " << "from matrices" << endl; cout << "Imath::extractSHRT()" << endl; test (); cout << "ok\n" << endl; } catch (std::exception &e) { cerr << " Caught exception: " << e.what () << endl; } } openexr-2.5.7/IlmBase/ImathTest/testExtractSHRT.h000066400000000000000000000034411406177042200216140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testExtractSHRT (); openexr-2.5.7/IlmBase/ImathTest/testFrustum.cpp000066400000000000000000000324741406177042200215110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathFrustum.h" #include "ImathEuler.h" #include "ImathFun.h" #include #include using namespace std; namespace { void testFrustumPlanes (IMATH_INTERNAL_NAMESPACE::Frustumf &frustum) { bool ortho = frustum.orthographic(); IMATH_INTERNAL_NAMESPACE::V3f o (0.0f, 0.0f, 0.0f); float eps = 5.0e-4; for (auto xRo : {0.0f, 100.0f, 200.0f}) { for (auto yRo : {0.0f, 105.0f, 210.0f, 315.0f}) { for (auto zRo : {0.0f, 110.0f, 220.0f, 330.0f}) { for (auto xTr : {-10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f}) { for (auto yTr : {-10.0f, -7.0f, -4.0f, -1.0f, 2.0f, 5.0f, 8.0f}) { for (auto zTr : {-10.0f, -6.0f, -2.0f, 2.0f, 6.0f}) { float xRoRad = xRo * (2.0f * float(M_PI) / 360.0f); float yRoRad = yRo * (2.0f * float(M_PI) / 360.0f); float zRoRad = zRo * (2.0f * float(M_PI) / 360.0f); IMATH_INTERNAL_NAMESPACE::Eulerf e(xRoRad, yRoRad, zRoRad); IMATH_INTERNAL_NAMESPACE::M44f mView = e.toMatrix44(); mView.translate (IMATH_INTERNAL_NAMESPACE::V3f(xTr, yTr, zTr)); IMATH_INTERNAL_NAMESPACE::Plane3f planes0[6]; frustum.planes (planes0); IMATH_INTERNAL_NAMESPACE::Plane3f planes[6]; frustum.planes (planes, mView); IMATH_INTERNAL_NAMESPACE::V3f up = IMATH_INTERNAL_NAMESPACE::V3f(0, 1, 0); assert ((up ^ planes0[0].normal) > 0.0); mView.multDirMatrix (up, up); assert ((up ^ planes[0].normal) > 0.0); IMATH_INTERNAL_NAMESPACE::V3f pt = (! ortho) ? o : IMATH_INTERNAL_NAMESPACE::V3f (0.0f, frustum.top(), 0.0f); float d = planes0[0].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[0].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); IMATH_INTERNAL_NAMESPACE::V3f right = IMATH_INTERNAL_NAMESPACE::V3f(1, 0, 0); assert ((right ^ planes0[1].normal) > 0.0); mView.multDirMatrix (right, right); assert ((right ^ planes[1].normal) > 0.0); pt = (! ortho) ? o : IMATH_INTERNAL_NAMESPACE::V3f (frustum.right(), 0.0f, 0.0f); d = planes0[1].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[1].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); IMATH_INTERNAL_NAMESPACE::V3f down = IMATH_INTERNAL_NAMESPACE::V3f(0, -1, 0); assert ((down ^ planes0[2].normal) > 0.0); mView.multDirMatrix (down, down); assert ((down ^ planes[2].normal) > 0.0); pt = (! ortho) ? o : IMATH_INTERNAL_NAMESPACE::V3f (0.0f, frustum.bottom(), 0.0f); d = planes0[2].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[2].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); IMATH_INTERNAL_NAMESPACE::V3f left = IMATH_INTERNAL_NAMESPACE::V3f(-1, 0, 0); assert ((left ^ planes0[3].normal) > 0.0); mView.multDirMatrix (left, left); assert ((left ^ planes[3].normal) > 0.0); pt = (! ortho) ? o : IMATH_INTERNAL_NAMESPACE::V3f (frustum.left(), 0.0f, 0.0f); d = planes0[3].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[3].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); IMATH_INTERNAL_NAMESPACE::V3f front = IMATH_INTERNAL_NAMESPACE::V3f(0, 0, 1); assert ((front ^ planes0[4].normal) > 0.0); mView.multDirMatrix (front, front); assert ((front ^ planes[4].normal) > 0.0); pt = IMATH_INTERNAL_NAMESPACE::V3f (0.0f, 0.0f, -frustum.nearPlane()); d = planes0[4].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[4].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); IMATH_INTERNAL_NAMESPACE::V3f back = IMATH_INTERNAL_NAMESPACE::V3f(0, 0, -1); assert ((back ^ planes0[5].normal) > 0.0); mView.multDirMatrix (back, back); assert ((back ^ planes[5].normal) > 0.0); pt = IMATH_INTERNAL_NAMESPACE::V3f (0.0f, 0.0f, -frustum.farPlane()); d = planes0[5].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); pt = pt * mView; d = planes[5].distanceTo (pt); assert (IMATH_INTERNAL_NAMESPACE::iszero (d, eps)); } } } } } } } } void testFrustum () { cout << "Testing functions in ImathFrustum.h"; cout << "\nperspective "; float n = 1.7; float f = 567.0; float l = -3.5; float r = 2.0; float b = -1.3; float t = 0.9; IMATH_INTERNAL_NAMESPACE::Frustum frustum (n, f, l, r, t, b, false); assert (IMATH_INTERNAL_NAMESPACE::abs (frustum.fovx() - (atan2(r,n) - atan2(l,n))) < 1e-6); assert (IMATH_INTERNAL_NAMESPACE::abs (frustum.fovy() - (atan2(t,n) - atan2(b,n))) < 1e-6); cout << "1"; assert (IMATH_INTERNAL_NAMESPACE::abs (frustum.aspect() - ((r-l)/(t-b))) < 1e-6); cout << "2"; IMATH_INTERNAL_NAMESPACE::M44f m = frustum.projectionMatrix(); assert (IMATH_INTERNAL_NAMESPACE::abs (m[0][0] - ((2*n)/(r-l))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][1]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][2]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][3]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][0]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][1] - ((2*n)/(t-b))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][2]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][3]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][0] - ((r+l)/(r-l))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][1] - ((t+b)/(t-b))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][2] - (-(f+n)/(f-n))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][3] - -1.0) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][0]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][1]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][2] - ((-2*f*n)/(f-n))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][3]) < 1e-6); cout << "3"; cout << "\nplanes "; testFrustumPlanes (frustum); cout << "\nexceptions "; IMATH_INTERNAL_NAMESPACE::Frustum badFrustum; bool caught; badFrustum.set (n, n, l, r, t, b, false); caught = false; try { (void)badFrustum.projectionMatrix(); assert (!"near == far didn't throw an exception"); } catch (IEX_NAMESPACE::DivzeroExc &) { caught = true; } assert (caught); cout << "1"; badFrustum.set (n, f, l, l, t, b, false); caught = false; try { (void)badFrustum.projectionMatrix(); assert (!"left == right didn't throw an exception"); } catch (IEX_NAMESPACE::DivzeroExc &) { caught = true; } assert (caught); cout << "2"; badFrustum.set (n, f, l, r, t, t, false); caught = false; try { (void)badFrustum.projectionMatrix(); assert (!"top == bottom didn't throw an exception"); } catch (IEX_NAMESPACE::DivzeroExc &) { caught = true; } assert (caught); cout << "3"; cout << "\northographic "; frustum.setOrthographic (true); m = frustum.projectionMatrix(); assert (IMATH_INTERNAL_NAMESPACE::abs (m[0][0] - (2/(r-l))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][1]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][2]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[0][3]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][0]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][1] - (2/(t-b))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][2]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[1][3]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][0]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][1]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][2] - (-2/(f-n))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[2][3]) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][0] - (-(r+l)/(r-l))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][1] - (-(t+b)/(t-b))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][2] - (-(f+n)/(f-n))) < 1e-6 && IMATH_INTERNAL_NAMESPACE::abs (m[3][3] - 1.0) < 1e-6); cout << "1"; cout << "\nplanes "; testFrustumPlanes (frustum); // TODO - There are many little functions in IMATH_INTERNAL_NAMESPACE::Frustum which // aren't tested here. Those test should be added. But this is // a start. IMATH_INTERNAL_NAMESPACE::Frustum f1 (n, f, l, r, t, b, false); IMATH_INTERNAL_NAMESPACE::Frustum f2 (n, f, l, r, t, b, true); assert (f1 != f2); f2.set(n + 0.1, f, l, r, t, b, false); assert (f1 != f2); f2.set(n, f + 0.1, l, r, t, b, false); assert (f1 != f2); f2.set(n, f, l + 0.1, r, t, b, false); assert (f1 != f2); f2.set(n, f, l, r + 0.1, t, b, false); assert (f1 != f2); f2.set(n, f, l, r, t + 0.1, b, false); assert (f1 != f2); f2.set(n, f, l, r, t, b + 0.1, false); assert (f1 != f2); cout << "\npassed inequality test"; f1 = f2; assert (f1 == f2); cout << "\npassed equality test"; cout << "\nok\n\n"; } openexr-2.5.7/IlmBase/ImathTest/testFrustum.h000066400000000000000000000034331406177042200211470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFrustum (); openexr-2.5.7/IlmBase/ImathTest/testFrustumTest.cpp000066400000000000000000000161671406177042200223520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathFrustum.h" #include "ImathFrustumTest.h" #include "ImathBox.h" #include "ImathSphere.h" #include #include using namespace std; void testFrustumTest () { cout << "Testing functions in ImathFrustumTest.h"; cout << "\nisVisible(Vec3) "; float n = 1.7; float f = 567.0; float l = -3.5; float r = 2.0; float b = -1.3; float t = 0.9; IMATH_INTERNAL_NAMESPACE::Frustum frustum (n, f, l, r, t, b, false); IMATH_INTERNAL_NAMESPACE::Matrix44 cameraMat; IMATH_INTERNAL_NAMESPACE::Vec3 cameraPos(100.0f, 200.0f, 300.0f); cameraMat.makeIdentity(); cameraMat.translate(cameraPos); IMATH_INTERNAL_NAMESPACE::FrustumTest frustumTest(frustum, cameraMat); ///////////////////////////////////////////////////// // Test Vec3's IMATH_INTERNAL_NAMESPACE::Vec3 insideVec (100.0f, 200.0f, 300 - 2.0f); IMATH_INTERNAL_NAMESPACE::Vec3 outsideVec_near(100.0f, 200.0f, 300 - 1.5f); IMATH_INTERNAL_NAMESPACE::Vec3 outsideVec_far (100.0f, 200.0f, 300 - 568.0f); IMATH_INTERNAL_NAMESPACE::Vec3 outsideVec_side(100.0f, 200.0f + 100.0f, 300 - 2.0f); IMATH_INTERNAL_NAMESPACE::Vec3 outsideVec_up (100.0f + 100.0f, 200.0f, 300 - 2.0f); assert ( frustumTest.isVisible(insideVec)); assert (! frustumTest.isVisible(outsideVec_near)); assert (! frustumTest.isVisible(outsideVec_far)); assert (! frustumTest.isVisible(outsideVec_side)); assert (! frustumTest.isVisible(outsideVec_up)); cout << "passed Vec3\n"; ///////////////////////////////////////////////////// // Test Boxes IMATH_INTERNAL_NAMESPACE::Vec3 tinySize(0.0001f, 0.0001f, 0.0001f); IMATH_INTERNAL_NAMESPACE::Vec3 hugeSize(1000.0f, 1000.0f, 1000.0f); // Empty box should NOT be visible assert (!frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box >())); // Tiny box inside the frust should be visible assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (insideVec + tinySize, insideVec + tinySize))); // Huge boxes inside and outside should be visible assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (insideVec - hugeSize, insideVec + hugeSize))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_near - hugeSize, outsideVec_near + hugeSize))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_far - hugeSize, outsideVec_far + hugeSize))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_side - hugeSize, outsideVec_side + hugeSize))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_up - hugeSize, outsideVec_up + hugeSize))); // Tiny boxes outside should NOT be visible assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_near - tinySize, outsideVec_near + tinySize))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_far - tinySize, outsideVec_far + tinySize))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_side - tinySize, outsideVec_side + tinySize))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Box > (outsideVec_up - tinySize, outsideVec_up + tinySize))); cout << "passed Box\n"; ///////////////////////////////////////////////////// // Test Spheres float tinyRadius = 0.0001f; float hugeRadius = 1000.0f; // Tiny sphere inside the frust should be visible assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (insideVec, tinyRadius))); // Huge spheres inside and outside should be visible assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (insideVec, hugeRadius))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_near, hugeRadius))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_far, hugeRadius))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_side, hugeRadius))); assert (frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_up, hugeRadius))); // Tiny spheres outside should NOT be visible assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_near, tinyRadius))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_far, tinyRadius))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_side, tinyRadius))); assert (! frustumTest.isVisible(IMATH_INTERNAL_NAMESPACE::Sphere3 (outsideVec_up, tinyRadius))); cout << "passed Sphere\n"; cout << "\nok\n\n"; } openexr-2.5.7/IlmBase/ImathTest/testFrustumTest.h000066400000000000000000000034371406177042200220130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFrustumTest (); openexr-2.5.7/IlmBase/ImathTest/testFun.cpp000066400000000000000000000262151406177042200205700ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathFun.h" #if __cplusplus >= 202002L # include #endif #include #include #include using namespace std; #if ULONG_MAX == 18446744073709551615LU typedef long unsigned int Int64; #else typedef long long unsigned int Int64; #endif #if __cplusplus < 202002L template static inline To bit_cast (From from) { static_assert (sizeof (From) == sizeof (To), "Type sizes do not match"); union { From f; To t; } u; u.f = from; return u.t; } #endif void testf (float f, bool changeExpected = true) { printf ("\n"); float sf = IMATH_INTERNAL_NAMESPACE::succf (f); float pf = IMATH_INTERNAL_NAMESPACE::predf (f); float spf = IMATH_INTERNAL_NAMESPACE::succf (IMATH_INTERNAL_NAMESPACE::predf (f)); float psf = IMATH_INTERNAL_NAMESPACE::predf (IMATH_INTERNAL_NAMESPACE::succf (f)); printf ("f %.9g\n", f); printf ("sf %.9g\n", sf); printf ("pf %.9g\n", pf); printf ("spf %.9g\n", spf); printf ("psf %.9g\n", psf); fflush (stdout); if (changeExpected) { assert (pf < f); assert (f < sf); } else { // No bit change expected if input was inf or NaN assert (bit_cast (pf) == bit_cast (f)); assert (bit_cast (sf) == bit_cast (f)); } } void testd (double d, bool changeExpected = true) { printf ("\n"); double sd = IMATH_INTERNAL_NAMESPACE::succd (d); double pd = IMATH_INTERNAL_NAMESPACE::predd (d); double spd = IMATH_INTERNAL_NAMESPACE::succd (IMATH_INTERNAL_NAMESPACE::predd (d)); double psd = IMATH_INTERNAL_NAMESPACE::predd (IMATH_INTERNAL_NAMESPACE::succd (d)); printf ("d %.18lg\n", d); printf ("sd %.18lg\n", sd); printf ("pd %.18lg\n", pd); printf ("spd %.18lg\n", spd); printf ("psd %.18lg\n", psd); fflush (stdout); if (changeExpected) { assert (pd < d); assert (d < sd); } else { // No bit change expected if input was inf or NaN assert (bit_cast (pd) == bit_cast (d)); assert (bit_cast (sd) == bit_cast (d)); } } void testFun () { cout << "Testing functions in ImathFun.h" << endl; cout << "floor" << endl; assert (IMATH_INTERNAL_NAMESPACE::floor ( 0.0f) == 0); assert (IMATH_INTERNAL_NAMESPACE::floor ( 0.5f) == 0); assert (IMATH_INTERNAL_NAMESPACE::floor (-0.5f) == -1); assert (IMATH_INTERNAL_NAMESPACE::floor ( 1.0f) == 1); assert (IMATH_INTERNAL_NAMESPACE::floor (-1.0f) == -1); assert (IMATH_INTERNAL_NAMESPACE::floor ( 1.5f) == 1); assert (IMATH_INTERNAL_NAMESPACE::floor (-1.5f) == -2); cout << "ceil" << endl; assert (IMATH_INTERNAL_NAMESPACE::ceil ( 0.0f) == 0); assert (IMATH_INTERNAL_NAMESPACE::ceil ( 0.5f) == 1); assert (IMATH_INTERNAL_NAMESPACE::ceil (-0.5f) == 0); assert (IMATH_INTERNAL_NAMESPACE::ceil ( 1.0f) == 1); assert (IMATH_INTERNAL_NAMESPACE::ceil (-1.0f) == -1); assert (IMATH_INTERNAL_NAMESPACE::ceil ( 1.5f) == 2); assert (IMATH_INTERNAL_NAMESPACE::ceil (-1.5f) == -1); cout << "trunc" << endl; assert (IMATH_INTERNAL_NAMESPACE::trunc ( 0.0f) == 0); assert (IMATH_INTERNAL_NAMESPACE::trunc ( 0.5f) == 0); assert (IMATH_INTERNAL_NAMESPACE::trunc (-0.5f) == 0); assert (IMATH_INTERNAL_NAMESPACE::trunc ( 1.0f) == 1); assert (IMATH_INTERNAL_NAMESPACE::trunc (-1.0f) == -1); assert (IMATH_INTERNAL_NAMESPACE::trunc ( 1.5f) == 1); assert (IMATH_INTERNAL_NAMESPACE::trunc (-1.5f) == -1); cout << "divs / mods" << endl; assert (IMATH_INTERNAL_NAMESPACE::divs ( 5, 2) == 2 && IMATH_INTERNAL_NAMESPACE::mods ( 5, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 4, 2) == 2 && IMATH_INTERNAL_NAMESPACE::mods ( 4, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs ( 3, 2) == 1 && IMATH_INTERNAL_NAMESPACE::mods ( 3, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 2, 2) == 1 && IMATH_INTERNAL_NAMESPACE::mods ( 2, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs ( 1, 2) == 0 && IMATH_INTERNAL_NAMESPACE::mods ( 1, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 0, 2) == 0 && IMATH_INTERNAL_NAMESPACE::mods ( 0, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-1, 2) == 0 && IMATH_INTERNAL_NAMESPACE::mods (-1, 2) == -1); assert (IMATH_INTERNAL_NAMESPACE::divs (-2, 2) == -1 && IMATH_INTERNAL_NAMESPACE::mods (-2, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-3, 2) == -1 && IMATH_INTERNAL_NAMESPACE::mods (-3, 2) == -1); assert (IMATH_INTERNAL_NAMESPACE::divs (-4, 2) == -2 && IMATH_INTERNAL_NAMESPACE::mods (-4, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-5, 2) == -2 && IMATH_INTERNAL_NAMESPACE::mods (-5, 2) == -1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 5, -2) == -2 && IMATH_INTERNAL_NAMESPACE::mods ( 5, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 4, -2) == -2 && IMATH_INTERNAL_NAMESPACE::mods ( 4, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs ( 3, -2) == -1 && IMATH_INTERNAL_NAMESPACE::mods ( 3, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 2, -2) == -1 && IMATH_INTERNAL_NAMESPACE::mods ( 2, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs ( 1, -2) == 0 && IMATH_INTERNAL_NAMESPACE::mods ( 1, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divs ( 0, -2) == 0 && IMATH_INTERNAL_NAMESPACE::mods ( 0, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-1, -2) == 0 && IMATH_INTERNAL_NAMESPACE::mods (-1, -2) == -1); assert (IMATH_INTERNAL_NAMESPACE::divs (-2, -2) == 1 && IMATH_INTERNAL_NAMESPACE::mods (-2, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-3, -2) == 1 && IMATH_INTERNAL_NAMESPACE::mods (-3, -2) == -1); assert (IMATH_INTERNAL_NAMESPACE::divs (-4, -2) == 2 && IMATH_INTERNAL_NAMESPACE::mods (-4, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divs (-5, -2) == 2 && IMATH_INTERNAL_NAMESPACE::mods (-5, -2) == -1); cout << "divp / modp" << endl; assert (IMATH_INTERNAL_NAMESPACE::divp ( 5, 2) == 2 && IMATH_INTERNAL_NAMESPACE::modp ( 5, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 4, 2) == 2 && IMATH_INTERNAL_NAMESPACE::modp ( 4, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp ( 3, 2) == 1 && IMATH_INTERNAL_NAMESPACE::modp ( 3, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 2, 2) == 1 && IMATH_INTERNAL_NAMESPACE::modp ( 2, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp ( 1, 2) == 0 && IMATH_INTERNAL_NAMESPACE::modp ( 1, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 0, 2) == 0 && IMATH_INTERNAL_NAMESPACE::modp ( 0, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-1, 2) == -1 && IMATH_INTERNAL_NAMESPACE::modp (-1, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp (-2, 2) == -1 && IMATH_INTERNAL_NAMESPACE::modp (-2, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-3, 2) == -2 && IMATH_INTERNAL_NAMESPACE::modp (-3, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp (-4, 2) == -2 && IMATH_INTERNAL_NAMESPACE::modp (-4, 2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-5, 2) == -3 && IMATH_INTERNAL_NAMESPACE::modp (-5, 2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 5, -2) == -2 && IMATH_INTERNAL_NAMESPACE::modp ( 5, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 4, -2) == -2 && IMATH_INTERNAL_NAMESPACE::modp ( 4, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp ( 3, -2) == -1 && IMATH_INTERNAL_NAMESPACE::modp ( 3, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 2, -2) == -1 && IMATH_INTERNAL_NAMESPACE::modp ( 2, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp ( 1, -2) == 0 && IMATH_INTERNAL_NAMESPACE::modp ( 1, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp ( 0, -2) == 0 && IMATH_INTERNAL_NAMESPACE::modp ( 0, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-1, -2) == 1 && IMATH_INTERNAL_NAMESPACE::modp (-1, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp (-2, -2) == 1 && IMATH_INTERNAL_NAMESPACE::modp (-2, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-3, -2) == 2 && IMATH_INTERNAL_NAMESPACE::modp (-3, -2) == 1); assert (IMATH_INTERNAL_NAMESPACE::divp (-4, -2) == 2 && IMATH_INTERNAL_NAMESPACE::modp (-4, -2) == 0); assert (IMATH_INTERNAL_NAMESPACE::divp (-5, -2) == 3 && IMATH_INTERNAL_NAMESPACE::modp (-5, -2) == 1); cout << "successor, predecessor" << endl; testf (0); testf (0.0 * -1.0); testf (1); testf (-1); testf (16); testf (7); testf (0.7); union {float f; int i;} u; u.i = 0x7f800000; // inf testf (u.f, false); u.i = 0xff800000; // -inf testf (u.f, false); u.i = 0x7f800001; // nan testf (u.f, false); u.i = 0x7f7fffff; // FLT_MAX testf (u.f); u.i = 0xff7fffff; // -FLT_MAX testf (u.f); testd (0); testd (0.0 * -1.0); testd (1); testd (-1); testd (16); testd (7); testd (0.7); union {double d; Int64 i;} v; v.i = 0x7ff0000000000000ULL; // inf testd (v.d, false); v.i = 0xfff0000000000000ULL; // -inf testd (v.d, false); v.i = 0x7ff0000000000001ULL; // NAN testd (v.d, false); v.i = 0x7fefffffffffffffULL; // FLT_MAX testd (v.d); v.i = 0xffefffffffffffffULL; // -FLT_MAX testd (v.d); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testFun.h000066400000000000000000000034311406177042200202300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFun (); openexr-2.5.7/IlmBase/ImathTest/testInvert.cpp000066400000000000000000000107521406177042200213060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathMatrix.h" #include "ImathMatrixAlgo.h" #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { void invertM44f (const M44f &m, float e) { M44f inv1 = m.inverse(); M44f inv2 = m.gjInverse(); M44f ident1 = m * inv1; M44f ident2 = m * inv2; //cout << "m\n" << m << endl; //cout << "inv1\n" << inv1 << "ident1\n" << ident1 << endl; //cout << "inv2\n" << inv2 << "ident2\n" << ident2 << endl; assert (ident1.equalWithAbsError (identity44f, e)); assert (ident2.equalWithAbsError (identity44f, e)); } void invertM33f (const M33f &m, float e) { M33f inv1 = m.inverse(); M33f inv2 = m.gjInverse(); M33f ident1 = m * inv1; M33f ident2 = m * inv2; //cout << "m\n" << m << endl; //cout << "inv1\n" << inv1 << "ident1\n" << ident1 << endl; //cout << "inv2\n" << inv2 << "ident2\n" << ident2 << endl; assert (ident1.equalWithAbsError (identity33f, e)); assert (ident2.equalWithAbsError (identity33f, e)); } } // namespace void testInvert () { cout << "Testing 4x4 and 3x3 matrix inversion:" << endl; { cout << "M44f" << endl; M44f m1 ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); M44f m2 ( 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); M44f m3 ( 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0); M44f m4 ( 4.683281e-01, -8.749647e-01, 1.229049e-01, 0.000000e+00, 1.251189e-02, 1.456563e-01, 9.892561e-01, 0.000000e+00, -8.834660e-01, -4.617587e-01, 7.916244e-02, 0.000000e+00, -4.726541e+00, 3.044795e+00, -6.737138e+00, 1.000000e+00); M44f m5 ( 4.683281e-01, -8.749647e-01, 1.229049e-01, 1.000000e+00, 1.251189e-02, 1.456563e-01, 9.892561e-01, 2.000000e+00, -8.834660e-01, -4.617587e-01, 7.916244e-02, 3.000000e+00, -4.726541e+00, 3.044795e+00, -6.737138e+00, 4.000000e+00); invertM44f (m1, 0); invertM44f (m2, 0); invertM44f (m3, 0); invertM44f (m4, 1e-6); invertM44f (m5, 1e-6); } { cout << "M33f" << endl; M33f m1 ( 1, 0, 0, 0, 1, 0, 0, 0, 1); M33f m2 ( 0, 1, 0, -1, 0, 0, 0, 0, 1); M33f m3 ( 2, 0, 0, 0, 0, -1, 0, 1, 0); M33f m4 ( 4.683281e-01, -8.749647e-01, 0.000000e+00, 1.251189e-02, 1.456563e-01, 0.000000e+00, 0.000000e+00, 0.000000e+00, 1.000000e+00); M33f m5 ( 4.683281e-01, -8.749647e-01, 1.229049e-01, 1.251189e-02, 1.456563e-01, 9.892561e-01, -8.834660e-01, -4.617587e-01, 7.916244e-02); invertM33f (m1, 0); invertM33f (m2, 0); invertM33f (m3, 0); invertM33f (m4, 1e-6); invertM33f (m5, 1e-6); } cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testInvert.h000066400000000000000000000034341406177042200207520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testInvert (); openexr-2.5.7/IlmBase/ImathTest/testJacobiEigenSolver.cpp000066400000000000000000000234561406177042200233760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include "ImathMatrix.h" #include "ImathMatrixAlgo.h" #include #include #include #include #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; const Matrix33 A33_1 ( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); const Matrix33 A33_2 ( 1, 0, 0, 0,-1, 0, 0, 0, 1 ); const Matrix33 A33_3 ( 1, 0, 0, 0, 1, 0, 0, 0, 0 ); const Matrix33 A33_4 ( 1, 0, 0, 0, 0, 0, 0, 0, 0 ); const Matrix33 A33_5 ( 0, 0, 0, 0, 0, 0, 0, 0, 0 ); const Matrix33 A33_6 ( 1, 0, 0, 0, 1e-10, 0, 0, 0, 0 ); const Matrix33 A33_7 ( 1, 0, 0, 0, 1e-10, 0, 0, 0, 1e+10 ); const Matrix33 A33_8 ( 0.25058694044821, 0.49427229444416, 0.81415724537748, 0.49427229444416, 0.80192384710853, -0.61674948224910, 0.81415724537748, -0.61674948224910, -1.28486154645285); const Matrix33 A33_9 ( 4, -30, 60, -30, 300, -675, 60, -675, 1620); const Matrix44 A44_1 ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); const Matrix44 A44_2 ( 1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); const Matrix44 A44_3 ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); const Matrix44 A44_4 ( 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); const Matrix44 A44_5 ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); const Matrix44 A44_6 ( 1, 0, 0, 0, 0, 1e-20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const Matrix44 A44_7 ( 1, 0, 0, 0, 0, 1e-20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e+20 ); const Matrix44 A44_8 ( 4.05747631538951, 0.16358123075600, 0.11541756047409, -1.65369223465270, 0.16358123075600, 0.57629829390780, 3.88542912704029, 0.92016316185369, 0.11541756047409, 3.88542912704029, 0.65367032943707, -0.21971103270410, -1.65369223465270, 0.92016316185369, -0.21971103270410, -0.28108876552761); const Matrix44 A44_9 ( 4, -30, 60, -35, -30, 300, -675, 420, 60, -675, 1620, -1050, -35, 420, -1050, 700); template void verifyOrthonormal (const TM& A, const typename TM::BaseType threshold) { const TM prod = A * A.transposed(); for (size_t i = 0; i < TM::dimensions(); ++i) for (size_t j = 0; j < TM::dimensions(); ++j) if (i == j) assert (std::abs (prod[i][j] - 1) < threshold); else assert (std::abs (prod[i][j]) < threshold); } template typename TM::BaseType computeThreshold(const TM& A) { typedef typename TM::BaseType T; T maxAbsEntry(0); for (size_t i = 0; i < TM::dimensions(); ++i) for (size_t j = 0; j < TM::dimensions(); ++j) maxAbsEntry = std::max (maxAbsEntry, std::abs(A[i][j])); const T eps = std::numeric_limits::epsilon(); maxAbsEntry = std::max(maxAbsEntry, eps); return maxAbsEntry * T(100) * eps; } template void testJacobiEigenSolver(const TM& A) { using std::abs; typedef typename TM::BaseType T; typedef typename TM::BaseVecType TV; const T threshold = computeThreshold(A); TM AA(A); TV S; TM V; jacobiEigenSolver(AA, S, V); // Orthogonality of V verifyOrthonormal(V, threshold); // Determinant of V assert(abs(V.determinant()) - 1 < threshold); // Determinant of A and S TM MS; for (size_t i = 0; i < TM::dimensions(); ++i) for (size_t j = 0; j < TM::dimensions(); ++j) if(i == j) MS[i][j] = S[i]; else MS[i][j] = 0; assert(abs(A.determinant()) - abs(MS.determinant()) < threshold); // A = V * S * V^T TM MA = V * MS * V.transposed(); for (size_t i = 0; i < TM::dimensions(); ++i) for (size_t j =0; j < TM::dimensions(); ++j) assert(abs(A[i][j]-MA[i][j]) < threshold); } template void testMinMaxEigenValue(const TM& A) { typedef typename TM::BaseVecType TV; typedef typename TM::BaseType T; TV minV, maxV, S; TM U, V; const T threshold = computeThreshold(A); { TM A1(A); minEigenVector(A1, minV); TM A2(A); maxEigenVector(A2, maxV); } { TM A3(A); jacobiSVD(A3, U, S, V); } const int dim = TM::dimensions(); for(int i = 0; i < dim; ++i) { assert(abs(minV[i]-V[i][dim - 1]) < threshold); assert(abs(maxV[i]-V[i][0]) < threshold); } } template void testJacobiTiming() { int rounds(100000); clock_t tJacobi,tSVD, t; { Matrix33 A,V,U; Vec3 S; t = clock(); for(int i = 0; i < rounds; ++i) { A = Matrix33(A33_7); jacobiEigenSolver(A, S, V); A = Matrix33(A33_8); jacobiEigenSolver(A, S, V); } tJacobi = clock() - t; cout << "Jacobi EigenSolver of 3x3 matrices took " << tJacobi << " clocks." << endl; t = clock(); for(int i = 0; i < rounds; ++i) { A = Matrix33(A33_7); jacobiSVD(A, U, S, V); A = Matrix33(A33_8); jacobiSVD(A, U, S, V); } tSVD = clock() - t; cout << "TinySVD of 3x3 matrices took " << tSVD << " clocks." << endl; cout << (float)(tSVD-tJacobi)*100.0f/(float)(tSVD) << "% speed up." << endl; } { Matrix44 A,V,U; Vec4 S; t = clock(); for(int i = 0; i < rounds; ++i) { A = Matrix44(A44_7); jacobiEigenSolver(A, S, V); A = Matrix44(A44_8); jacobiEigenSolver(A, S, V); } tJacobi = clock() - t; cout << "Jacobi EigenSolver of 4x4 matrices took " << tJacobi << " clocks" << endl; t = clock(); for(int i = 0; i < rounds; ++i) { A = Matrix44(A44_7); jacobiSVD(A, U, S, V); A = Matrix44(A44_8); jacobiSVD(A, U, S, V); } tSVD = clock() - t; cout << "TinySVD of 4x4 matrices took " << tSVD << " clocks" << endl; cout << (float)(tSVD-tJacobi)*100.0f/(float)(tSVD) << "% speed up." << endl; } } template void testJacobiEigenSolverImp() { testJacobiEigenSolver(Matrix33(A33_1)); testJacobiEigenSolver(Matrix33(A33_2)); testJacobiEigenSolver(Matrix33(A33_3)); testJacobiEigenSolver(Matrix33(A33_4)); testJacobiEigenSolver(Matrix33(A33_5)); testJacobiEigenSolver(Matrix33(A33_6)); testJacobiEigenSolver(Matrix33(A33_7)); testJacobiEigenSolver(Matrix33(A33_8)); testJacobiEigenSolver(Matrix44(A44_1)); testJacobiEigenSolver(Matrix44(A44_2)); testJacobiEigenSolver(Matrix44(A44_3)); testJacobiEigenSolver(Matrix44(A44_4)); testJacobiEigenSolver(Matrix44(A44_5)); testJacobiEigenSolver(Matrix44(A44_6)); testJacobiEigenSolver(Matrix44(A44_7)); testJacobiEigenSolver(Matrix44(A44_8)); } template void testMinMaxEigenValueImp() { testMinMaxEigenValue(Matrix33(A33_7)); testMinMaxEigenValue(Matrix33(A33_8)); testMinMaxEigenValue(Matrix44(A44_7)); testMinMaxEigenValue(Matrix44(A44_8)); } void testJacobiEigenSolver() { cout << endl; cout << "************ Testing IMATH_INTERNAL_NAMESPACE::ImathJacobiEigenSolver ************" << endl; cout << "Jacobi EigenSolver in single precision..."; testJacobiEigenSolverImp(); cout << "PASS" << endl; cout << "Jacobi EigenSolver in double precision..."; testJacobiEigenSolverImp(); cout << "PASS" << endl; cout << "Min/Max EigenValue in single precision..."; testMinMaxEigenValueImp(); cout << "PASS" << endl; cout << "Min/Max EigenValue in double precision..."; testMinMaxEigenValueImp(); cout << "PASS" << endl; cout << "Timing Jacobi EigenSolver in single precision...\n"; testJacobiTiming(); cout << "Timing Jacobi EigenSolver in double precision...\n"; testJacobiTiming(); cout << "************ ALL PASS ************" << endl; } openexr-2.5.7/IlmBase/ImathTest/testJacobiEigenSolver.h000066400000000000000000000034421406177042200230340ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testJacobiEigenSolver(); openexr-2.5.7/IlmBase/ImathTest/testLineAlgo.cpp000066400000000000000000000245501406177042200215320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathLineAlgo.h" #include "ImathRandom.h" #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { void testClosestPoints (const Line3f &line1, const Line3f &line2, bool returnValue, const V3f &point1, const V3f &point2) { V3f p1; V3f p2; bool rv = closestPoints (line1, line2, p1, p2); assert (rv == returnValue); if (rv) { float e = 10 * limits::epsilon(); assert (point1.equalWithAbsError (p1, e)); assert (point2.equalWithAbsError (p2, e)); } } void testClosestPoints () { cout << "closest points on two lines" << endl; cout << " non-intersecting, non-parallel lines" << endl; testClosestPoints (Line3f (V3f ( 0, -1, -1), V3f ( 0, 1, -1)), Line3f (V3f (-1, 0, 1), V3f ( 1, 0, 1)), true, V3f ( 0, 0, -1), V3f ( 0, 0, 1)); testClosestPoints (Line3f (V3f ( 2, -1, -1), V3f ( 2, 1, -1)), Line3f (V3f (-1, 3, 1), V3f ( 1, 3, 1)), true, V3f ( 2, 3, -1), V3f ( 2, 3, 1)); cout << " intersecting, non-parallel lines" << endl; testClosestPoints (Line3f (V3f ( 2, -1, 0), V3f ( 2, 1, 0)), Line3f (V3f (-1, 3, 0), V3f ( 1, 3, 0)), true, V3f ( 2, 3, 0), V3f ( 2, 3, 0)); cout << " parallel lines" << endl; testClosestPoints (Line3f (V3f ( 2, -1, 0), V3f ( 2, 1, 0)), Line3f (V3f ( 2, -1, 1), V3f ( 2, 1, 1)), false, V3f ( 0, 0, 0), V3f ( 0, 0, 0)); testClosestPoints (Line3f (V3f ( 2, -1, 0), V3f ( 2, 1, 0)), Line3f (V3f ( 2, 1, 1), V3f ( 2, -1, 1)), false, V3f ( 0, 0, 0), V3f ( 0, 0, 0)); cout << " coincident lines" << endl; testClosestPoints (Line3f (V3f ( 2, -1, 0), V3f ( 2, -1, 1)), Line3f (V3f ( 2, -1, 0), V3f ( 2, -1, 1)), false, V3f ( 0, 0, 0), V3f ( 0, 0, 0)); cout << " random lines" << endl; Rand48 rand (7); for (int i = 0; i < 10000; ++i) { Line3f line1 (solidSphereRand (rand) * 100.f, solidSphereRand (rand) * 100.f); Line3f line2 (solidSphereRand (rand) * 100.f, solidSphereRand (rand) * 100.f); V3f point1; V3f point2; bool rv = closestPoints (line1, line2, point1, point2); if (rv) { // // We test if the line that connects point1 and point2 // is perpendicular to line1 and line2. The numerical // accuracy of point1 and point2 depends strongly on // the relative directions of line1 and line2; accuracy // degrades rather quickly if line1 and line2 become // close to parallel. // float e = 2000 * limits::epsilon(); float d = 1 - (line1.dir ^ line2.dir) * (line1.dir ^ line2.dir); V3f n = point1 - point2; assert (equalWithAbsError (0.0f, (line1.dir ^ n) * d, e)); assert (equalWithAbsError (0.0f, (line2.dir ^ n) * d, e)); } } } void testIntersect (const Line3f &line, const V3f &v0, const V3f &v1, const V3f &v2, const V3f &point, bool front, bool returnValue) { V3f pt; V3f bary; bool fr; bool rv = intersect (line, v0, v1, v2, pt, bary, fr); assert (rv == returnValue); float e = 10 * limits::epsilon(); if (rv) { assert (front == fr); assert (pt.equalWithAbsError (point, e)); V3f pt2 = v0 * bary.x + v1 * bary.y + v2 * bary.z; assert (pt.equalWithAbsError (pt2, e)); } } void testIntersect () { cout << "line-triangle intersection" << endl; cout << " line-plane intersection inside triangle" << endl; testIntersect (Line3f (V3f (0, 0, -1), V3f (0, 0, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 7), true, true); testIntersect (Line3f (V3f (0, 0, -1), V3f (-1, -2, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (-1, -2, 7), true, true); testIntersect (Line3f (V3f (0, 0, -1), V3f (-1, 1, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (-1, 1, 7), true, true); testIntersect (Line3f (V3f (0, 0, -1), V3f (-1, 1, 7)), V3f (4, -4, 7), V3f (-4, -4, 7), V3f (0, 6, 7), V3f (-1, 1, 7), false, true); testIntersect (Line3f (V3f (1, 1, 2), V3f (0, 0, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 7), true, true); testIntersect (Line3f (V3f (2, 3, -5), V3f (-1, -2, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (-1, -2, 7), true, true); testIntersect (Line3f (V3f (2, 8, -10), V3f (-1, 1, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (-1, 1, 7), true, true); testIntersect (Line3f (V3f (-10, 2, -1), V3f (-1, 1, 7)), V3f (4, -4, 7), V3f (-4, -4, 7), V3f (0, 6, 7), V3f (-1, 1, 7), false, true); cout << " line-plane intersection outside triangle" << endl; testIntersect (Line3f (V3f (0, 0, -1), V3f (4, 0, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (0, 0, -1), V3f (-4, 1, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (0, 0, -1), V3f (0, -5, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (0, 0, -1), V3f (0, -7, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); cout << " line parallel to triangle" << endl; testIntersect (Line3f (V3f (0, 0, -1), V3f (4, 0, -1)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (0, 4, 7), V3f (4, 0, 7)), V3f (-4, -4, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); cout << " zero-area triangle" << endl; testIntersect (Line3f (V3f (2, 3, -5), V3f (-1, -2, 7)), V3f (0, 6, 7), V3f (4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (2, 3, -5), V3f (-1, -2, 7)), V3f (-4, -4, 7), V3f (-4, -4, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (2, 3, -5), V3f (-1, -2, 7)), V3f (-4, -4, 7), V3f (0, 6, 7), V3f (0, 6, 7), V3f (0, 0, 0), false, false); testIntersect (Line3f (V3f (2, 3, -5), V3f (-1, -2, 7)), V3f (-4, -4, 7), V3f (-4, -4, 7), V3f (-4, -4, 7), V3f (0, 0, 0), false, false); cout << " random lines and triangles" << endl; Rand48 rand (8); for (int i = 0; i < 10000; ++i) { // // Generate a random triangle with non-zero area // V3f v0, v1, v2; V3f normal; do { v0 = solidSphereRand (rand); v1 = solidSphereRand (rand); v2 = solidSphereRand (rand); normal = (v2 - v1) % (v1 - v0); } while (normal.length() < 0.01); { // // Generate a line that intersects inside the triangle // V3f b; do { b.x = rand.nextf (0.001, 0.999); b.y = rand.nextf (0.001, 0.999); b.z = 1 - b.x - b.y; } while (b.x + b.y > 0.999); V3f p1 = v0 * b.x + v1 * b.y + v2 * b.z; V3f p0; do { p0 = solidSphereRand (rand); } while (abs (normal.normalized() ^ (p1 - p0).normalized()) < 0.1); // // Test for intersection // V3f point; V3f bary; bool front; bool rv = intersect (Line3f (p0, p1), v0, v1, v2, point, bary, front); assert (rv == true); float nd = abs (normal.normalized() ^ (p1 - p0).normalized()); float ep = 20 * limits::epsilon() / nd; assert (point.equalWithAbsError (p1, ep)); } { // // Generate a line that intersects the triangle's plane // but outside the triangle // V3f b; do { b.x = rand.nextf (-3, 3); b.y = rand.nextf (-3, 3); b.z = 1 - b.x - b.y; } while (b.x > -0.001 && b.y > -0.001 && b.z > -0.001); V3f p1 = v0 * b.x + v1 * b.y + v2 * b.z; V3f p0; do { p0 = solidSphereRand (rand) * 10; } while (abs (normal.normalized() ^ (p1 - p0).normalized()) < 0.1); // // Test for intersection // V3f point; V3f bary; bool front; bool rv = intersect (Line3f (p0, p1), v0, v1, v2, point, bary, front); assert (rv == false); } } } } // namespace void testLineAlgo () { cout << "Testing line algorithms" << endl; testClosestPoints(); testIntersect(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testLineAlgo.h000066400000000000000000000034351406177042200211760ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testLineAlgo (); openexr-2.5.7/IlmBase/ImathTest/testMatrix.cpp000066400000000000000000000432001406177042200212750ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathMatrix.h" #include "ImathMatrixAlgo.h" #include "ImathVec.h" #include "ImathLimits.h" #include "ImathMath.h" #include "ImathInt64.h" #include "ImathRandom.h" #include #include using namespace std; using IMATH_INTERNAL_NAMESPACE::Int64; // // This file is not currently intended to exhaustively test // the Imath Matrix33 and Matrix44 classes. We leave // that to PyImathTest. // // Instead, in this file we test only those aspects of the // Imath Matrix33 and Matrix44 classes that must be // or are more convenient to test from C++. // void testMatrix () { cout << "Testing functions in ImathMatrix.h" << endl; union {float f; int i;} nanf; nanf.i = 0x7f800001; // NAN union {double d; Int64 i;} nand; nand.i = 0x7ff0000000000001ULL; // NAN { cout << "Imath::M22f constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M22f m1; m1[0][0] = 99.0f; m1[1][1] = 101.0f; IMATH_INTERNAL_NAMESPACE::M22f test(m1); assert(test == m1); IMATH_INTERNAL_NAMESPACE::M22f test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M22f test3; test3.makeIdentity(); assert(test2 == test3); } { cout << "M22d constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M22d m2; m2[0][0] = 99.0f; m2[1][1] = 101.0f; IMATH_INTERNAL_NAMESPACE::M22d test(m2); assert(test == m2); IMATH_INTERNAL_NAMESPACE::M22d test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M22d test3; test3.makeIdentity(); assert(test2 == test3); IMATH_INTERNAL_NAMESPACE::M22f test4 (1.0f, 2.0f, 3.0f, 4.0f); IMATH_INTERNAL_NAMESPACE::M22d test5 = IMATH_INTERNAL_NAMESPACE::M22d (test4); assert (test5[0][0] == 1.0); assert (test5[0][1] == 2.0); assert (test5[1][0] == 3.0); assert (test5[1][1] == 4.0); } { cout << "Imath::M33f shear functions" << endl; IMATH_INTERNAL_NAMESPACE::M33f m1, m2; m1.setShear (2.0f); assert (m1[0][0] == 1.0f && m1[0][1] == 0.0f && m1[0][2] == 0.0f && m1[1][0] == 2.0f && m1[1][1] == 1.0f && m1[1][2] == 0.0f && m1[2][0] == 0.0f && m1[2][1] == 0.0f && m1[2][2] == 1.0f); m2.setShear (IMATH_INTERNAL_NAMESPACE::V2f (3.0f, 4.0f)); assert (m2[0][0] == 1.0f && m2[0][1] == 4.0f && m2[0][2] == 0.0f && m2[1][0] == 3.0f && m2[1][1] == 1.0f && m2[1][2] == 0.0f && m2[2][0] == 0.0f && m2[2][1] == 0.0f && m2[2][2] == 1.0f); m1.shear (IMATH_INTERNAL_NAMESPACE::V2f (5.0f, 6.0f)); assert (m1[0][0] == 13.0f && m1[0][1] == 6.0f && m1[0][2] == 0.0f && m1[1][0] == 7.0f && m1[1][1] == 1.0f && m1[1][2] == 0.0f && m1[2][0] == 0.0f && m1[2][1] == 0.0f && m1[2][2] == 1.0f); m2.shear (7.0f); assert (m2[0][0] == 1.0f && m2[0][1] == 4.0f && m2[0][2] == 0.0f && m2[1][0] == 10.0f && m2[1][1] == 29.0f && m2[1][2] == 0.0f && m2[2][0] == 0.0f && m2[2][1] == 0.0f && m2[2][2] == 1.0f); cout << "M33f constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M33f test(m2); assert(test == m2); IMATH_INTERNAL_NAMESPACE::M33f test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M33f test3; test3.makeIdentity(); assert(test2 == test3); } { cout << "M33d constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M33d m2; m2[0][0] = 99.0f; m2[1][2] = 101.0f; IMATH_INTERNAL_NAMESPACE::M33d test(m2); assert(test == m2); IMATH_INTERNAL_NAMESPACE::M33d test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M33d test3; test3.makeIdentity(); assert(test2 == test3); IMATH_INTERNAL_NAMESPACE::M33f test4 (1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f); IMATH_INTERNAL_NAMESPACE::M33d test5 = IMATH_INTERNAL_NAMESPACE::M33d (test4); assert (test5[0][0] == 1.0); assert (test5[0][1] == 2.0); assert (test5[0][2] == 3.0); assert (test5[1][0] == 4.0); assert (test5[1][1] == 5.0); assert (test5[1][2] == 6.0); assert (test5[2][0] == 7.0); assert (test5[2][1] == 8.0); assert (test5[2][2] == 9.0); } { IMATH_INTERNAL_NAMESPACE::M44f m2; m2[0][0] = 99.0f; m2[1][2] = 101.0f; cout << "M44f constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M44f test(m2); assert(test == m2); IMATH_INTERNAL_NAMESPACE::M44f test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M44f test3; test3.makeIdentity(); assert(test2 == test3); // // Test non-equality when a NAN is in the same // place in two identical matrices // test2[0][0] = nanf.f; test3 = test2; assert(test2 != test3); } { IMATH_INTERNAL_NAMESPACE::M44d m2; m2[0][0] = 99.0f; m2[1][2] = 101.0f; cout << "M44d constructors and equality operators" << endl; IMATH_INTERNAL_NAMESPACE::M44d test(m2); assert(test == m2); IMATH_INTERNAL_NAMESPACE::M44d test2; assert(test != test2); IMATH_INTERNAL_NAMESPACE::M44d test3; test3.makeIdentity(); assert(test2 == test3); // // Test non-equality when a NAN is in the same // place in two identical matrices // test2[0][0] = nand.d; test3 = test2; assert(test2 != test3); IMATH_INTERNAL_NAMESPACE::M44f test4 ( 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); IMATH_INTERNAL_NAMESPACE::M44d test5 = IMATH_INTERNAL_NAMESPACE::M44d (test4); assert (test5[0][0] == 1.0); assert (test5[0][1] == 2.0); assert (test5[0][2] == 3.0); assert (test5[0][3] == 4.0); assert (test5[1][0] == 5.0); assert (test5[1][1] == 6.0); assert (test5[1][2] == 7.0); assert (test5[1][3] == 8.0); assert (test5[2][0] == 9.0); assert (test5[2][1] == 10.0); assert (test5[2][2] == 11.0); assert (test5[2][3] == 12.0); assert (test5[3][0] == 13.0); assert (test5[3][1] == 14.0); assert (test5[3][2] == 15.0); assert (test5[3][3] == 16.0); } { cout << "Converting between M33 and M44" << endl; IMATH_INTERNAL_NAMESPACE::M44d m1; m1[0][0] = 99; IMATH_INTERNAL_NAMESPACE::M44f m2; m2.setValue(m1); assert(m2[0][0] == (float)m1[0][0]); m1[0][0] = 101; m1.setValue(m2); assert(m2[0][0] == (float)m1[0][0]); } // Matrix minors { cout << "3x3 Matrix minors" << endl; IMATH_INTERNAL_NAMESPACE::M33f a(1,2,3,4,5,6,7,8,9); assert (a.minorOf(0,0) == a.fastMinor(1,2,1,2)); assert (a.minorOf(0,1) == a.fastMinor(1,2,0,2)); assert (a.minorOf(0,2) == a.fastMinor(1,2,0,1)); assert (a.minorOf(1,0) == a.fastMinor(0,2,1,2)); assert (a.minorOf(1,1) == a.fastMinor(0,2,0,2)); assert (a.minorOf(1,2) == a.fastMinor(0,2,0,1)); assert (a.minorOf(2,0) == a.fastMinor(0,1,1,2)); assert (a.minorOf(2,1) == a.fastMinor(0,1,0,2)); assert (a.minorOf(2,2) == a.fastMinor(0,1,0,1)); } { IMATH_INTERNAL_NAMESPACE::M33d a(1,2,3,4,5,6,7,8,9); assert (a.minorOf(0,0) == a.fastMinor(1,2,1,2)); assert (a.minorOf(0,1) == a.fastMinor(1,2,0,2)); assert (a.minorOf(0,2) == a.fastMinor(1,2,0,1)); assert (a.minorOf(1,0) == a.fastMinor(0,2,1,2)); assert (a.minorOf(1,1) == a.fastMinor(0,2,0,2)); assert (a.minorOf(1,2) == a.fastMinor(0,2,0,1)); assert (a.minorOf(2,0) == a.fastMinor(0,1,1,2)); assert (a.minorOf(2,1) == a.fastMinor(0,1,0,2)); assert (a.minorOf(2,2) == a.fastMinor(0,1,0,1)); } // Determinants (by building a random singular value decomposition) { cout << "2x2 determinant" << endl; IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M22f u; IMATH_INTERNAL_NAMESPACE::M22f v; IMATH_INTERNAL_NAMESPACE::M22f s; u.setRotation( random.nextf() ); v.setRotation( random.nextf() ); s[0][0] = random.nextf(); s[1][1] = random.nextf(); IMATH_INTERNAL_NAMESPACE::M22f c = u * s * v.transpose(); assert (fabsf(c.determinant() - s[0][0]*s[1][1]) <= u.baseTypeEpsilon()); } { IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M22d u; IMATH_INTERNAL_NAMESPACE::M22d v; IMATH_INTERNAL_NAMESPACE::M22d s; u.setRotation( (double)random.nextf() ); v.setRotation( (double)random.nextf() ); s[0][0] = (double)random.nextf(); s[1][1] = (double)random.nextf(); IMATH_INTERNAL_NAMESPACE::M22d c = u * s * v.transpose(); assert (fabs(c.determinant() - s[0][0]*s[1][1]) <= u.baseTypeEpsilon()); } { cout << "3x3 determinant" << endl; IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M33f u; IMATH_INTERNAL_NAMESPACE::M33f v; IMATH_INTERNAL_NAMESPACE::M33f s; u.setRotation( random.nextf() ); v.setRotation( random.nextf() ); s[0][0] = random.nextf(); s[1][1] = random.nextf(); s[2][2] = random.nextf(); IMATH_INTERNAL_NAMESPACE::M33f c = u * s * v.transpose(); assert (fabsf(c.determinant() - s[0][0]*s[1][1]*s[2][2]) <= u.baseTypeEpsilon()); } { IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M33d u; IMATH_INTERNAL_NAMESPACE::M33d v; IMATH_INTERNAL_NAMESPACE::M33d s; u.setRotation( (double)random.nextf() ); v.setRotation( (double)random.nextf() ); s[0][0] = (double)random.nextf(); s[1][1] = (double)random.nextf(); s[2][2] = (double)random.nextf(); IMATH_INTERNAL_NAMESPACE::M33d c = u * s * v.transpose(); assert (fabs(c.determinant() - s[0][0]*s[1][1]*s[2][2]) <= u.baseTypeEpsilon()); } // Outer product of two 3D vectors { cout << "Outer product of two 3D vectors" << endl; IMATH_INTERNAL_NAMESPACE::V3f a(1,2,3); IMATH_INTERNAL_NAMESPACE::V3f b(4,5,6); IMATH_INTERNAL_NAMESPACE::M33f p = IMATH_INTERNAL_NAMESPACE::outerProduct(a,b); for (int i=0; i<3; i++ ) { for (int j=0; j<3; j++) { assert (p[i][j] == a[i]*b[j]); } } } { IMATH_INTERNAL_NAMESPACE::V3d a(1,2,3); IMATH_INTERNAL_NAMESPACE::V3d b(4,5,6); IMATH_INTERNAL_NAMESPACE::M33d p = IMATH_INTERNAL_NAMESPACE::outerProduct(a,b); for (int i=0; i<3; i++ ) { for (int j=0; j<3; j++) { assert (p[i][j] == a[i]*b[j]); } } } // Determinants (by building a random singular value decomposition) { cout << "4x4 determinants" << endl; IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M44f u = IMATH_INTERNAL_NAMESPACE::rotationMatrix ( IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize(), IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize() ); IMATH_INTERNAL_NAMESPACE::M44f v = IMATH_INTERNAL_NAMESPACE::rotationMatrix ( IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize(), IMATH_INTERNAL_NAMESPACE::V3f(random.nextf(),random.nextf(),random.nextf()).normalize() ); IMATH_INTERNAL_NAMESPACE::M44f s; s[0][0] = random.nextf(); s[1][1] = random.nextf(); s[2][2] = random.nextf(); s[3][3] = random.nextf(); IMATH_INTERNAL_NAMESPACE::M44f c = u * s * v.transpose(); assert (fabsf(c.determinant() - s[0][0]*s[1][1]*s[2][2]*s[3][3]) <= u.baseTypeEpsilon()); } { IMATH_INTERNAL_NAMESPACE::Rand32 random; IMATH_INTERNAL_NAMESPACE::M44d u = IMATH_INTERNAL_NAMESPACE::rotationMatrix ( IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize(), IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize() ); IMATH_INTERNAL_NAMESPACE::M44d v = IMATH_INTERNAL_NAMESPACE::rotationMatrix ( IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize(), IMATH_INTERNAL_NAMESPACE::V3d(random.nextf(),random.nextf(),random.nextf()).normalize() ); IMATH_INTERNAL_NAMESPACE::M44d s; s[0][0] = random.nextf(); s[1][1] = random.nextf(); s[2][2] = random.nextf(); s[3][3] = random.nextf(); IMATH_INTERNAL_NAMESPACE::M44d c = u * s * v.transpose(); assert (fabs(c.determinant() - s[0][0]*s[1][1]*s[2][2]*s[3][3]) <= u.baseTypeEpsilon()); } // Matrix minors { cout << "4x4 matrix minors" << endl; IMATH_INTERNAL_NAMESPACE::M44d a(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); assert (a.minorOf(0,0) == a.fastMinor(1,2,3,1,2,3)); assert (a.minorOf(0,1) == a.fastMinor(1,2,3,0,2,3)); assert (a.minorOf(0,2) == a.fastMinor(1,2,3,0,1,3)); assert (a.minorOf(0,3) == a.fastMinor(1,2,3,0,1,2)); assert (a.minorOf(1,0) == a.fastMinor(0,2,3,1,2,3)); assert (a.minorOf(1,1) == a.fastMinor(0,2,3,0,2,3)); assert (a.minorOf(1,2) == a.fastMinor(0,2,3,0,1,3)); assert (a.minorOf(1,3) == a.fastMinor(0,2,3,0,1,2)); assert (a.minorOf(2,0) == a.fastMinor(0,1,3,1,2,3)); assert (a.minorOf(2,1) == a.fastMinor(0,1,3,0,2,3)); assert (a.minorOf(2,2) == a.fastMinor(0,1,3,0,1,3)); assert (a.minorOf(2,3) == a.fastMinor(0,1,3,0,1,2)); assert (a.minorOf(3,0) == a.fastMinor(0,1,2,1,2,3)); assert (a.minorOf(3,1) == a.fastMinor(0,1,2,0,2,3)); assert (a.minorOf(3,2) == a.fastMinor(0,1,2,0,1,3)); assert (a.minorOf(3,3) == a.fastMinor(0,1,2,0,1,2)); } { IMATH_INTERNAL_NAMESPACE::M44f a(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); assert (a.minorOf(0,0) == a.fastMinor(1,2,3,1,2,3)); assert (a.minorOf(0,1) == a.fastMinor(1,2,3,0,2,3)); assert (a.minorOf(0,2) == a.fastMinor(1,2,3,0,1,3)); assert (a.minorOf(0,3) == a.fastMinor(1,2,3,0,1,2)); assert (a.minorOf(1,0) == a.fastMinor(0,2,3,1,2,3)); assert (a.minorOf(1,1) == a.fastMinor(0,2,3,0,2,3)); assert (a.minorOf(1,2) == a.fastMinor(0,2,3,0,1,3)); assert (a.minorOf(1,3) == a.fastMinor(0,2,3,0,1,2)); assert (a.minorOf(2,0) == a.fastMinor(0,1,3,1,2,3)); assert (a.minorOf(2,1) == a.fastMinor(0,1,3,0,2,3)); assert (a.minorOf(2,2) == a.fastMinor(0,1,3,0,1,3)); assert (a.minorOf(2,3) == a.fastMinor(0,1,3,0,1,2)); assert (a.minorOf(3,0) == a.fastMinor(0,1,2,1,2,3)); assert (a.minorOf(3,1) == a.fastMinor(0,1,2,0,2,3)); assert (a.minorOf(3,2) == a.fastMinor(0,1,2,0,1,3)); assert (a.minorOf(3,3) == a.fastMinor(0,1,2,0,1,2)); } // VC 2005 64 bits compiler has a bug with __restrict keword. // Pointers with __restrict should not alias the same symbol. // But, with optimization on, VC removes intermediate temp variable // and ignores __restrict. { cout << "M44 multiplicaftion test" << endl; IMATH_INTERNAL_NAMESPACE::M44f M ( 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); IMATH_INTERNAL_NAMESPACE::M44f N; N.makeIdentity(); // N should be equal to M // This typical test fails // when __restrict is used for pointers in "multiply" function. N = N * M; assert(N == M); if (N != M) { cout << "M44 multiplication test has failed, error." << endl << "M" << endl << M << endl << "N" << endl << N << endl; } } cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testMatrix.h000066400000000000000000000034341406177042200207470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testMatrix (); openexr-2.5.7/IlmBase/ImathTest/testMiscMatrixAlgo.cpp000066400000000000000000000230401406177042200227140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathMatrixAlgo.h" #include "ImathRandom.h" #include #include #include #include #if 0 #define debug(x) (printf x, fflush (stdout)) #else #define debug(x) #endif using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { float rad (float deg) {return deg * (M_PI / 180);} void testComputeLocalFrame () { float eps = 0.00005; Rand48 random(0); for (int i = 0; i < 100000; ++i) { debug (("iteration: %d\n", i)); // Random pos V3f p (random.nextf (-10, 10), random.nextf (-10, 10), random.nextf (-10, 10)); // Random xDir V3f xDir (random.nextf (-10, 10), random.nextf (-10, 10), random.nextf (-10, 10)); // Random normalDir V3f normalDir (random.nextf (-10, 10), random.nextf (-10, 10), random.nextf (-10, 10)); // Run computeLocalFrame we want to test M44f L = computeLocalFrame(p, xDir, normalDir); // test position for (int j=0; j<3; j++) { if ( abs(L[3][j] - p[j])>eps ) assert(false); } if (abs (L[3][3] - 1.0)>eps) assert(false ); // check that xAxis has the same dir as xDir and that is is normalized V3f x( L[0][0], L[0][1], L[0][2]); assert( (x%xDir).length() < eps ); if (abs (L[0][3])>eps) assert(false); assert((abs(x.length()-1.f)eps) assert(false ); assert(abs(x^y)eps) assert(false ); assert((abs(z.length()-1.f)0); } } void getRandTRS(Rand48& random, V3f& trans, V3f& rot, V3f& scale) { // Translate trans = V3f (random.nextf (-10, 10), random.nextf (-10, 10), random.nextf (-10, 10)); // Rotate rot = V3f (rad (random.nextf (-180, 180)), rad (random.nextf (-180, 180)), rad (random.nextf (-180, 180))); // Scale V3f s(random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0)); for (int j=0; j < 3; j++) if (random.nextf (0.0, 1.0) >= 0.5) s[j] *= -1; scale = s; } M44f createRandomMat(Rand48& random, V3f& trans, V3f& rot, V3f& scale) { M44f M; V3f t, r, s; getRandTRS(random, t, r, s); M.translate (t); M.rotate (r); // Shear M. V3f h (random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0), random.nextf (0.000001, 2.0)); for (int j=0; j < 3; j++) if (random.nextf (0.0, 1.0) >= 0.5) h[j] *= -1; M.shear (h); M.scale (s); // // Add a small random error to the elements of M // for (int j = 0; j < 4; ++j) for (int k = 0; k < 3; ++k) M[j][k] += random.nextf (-1e-7, 1e-7); V3f sh; extractSHRT (M, scale, sh, rot, trans); debug (("Scale : %f %f %f\n", s[0], s[1], s[2])); debug (("Shear : %f %f %f\n", h[0], h[1], h[2])); debug (("Rot : %f %f %f\n", r[0], r[1], r[2])); debug (("Trans : %f %f %f\n", t[0], t[1], t[2])); return M; } void compareMat(M44f& M, M44f& N) { float eps = 0.0001; /// Verify that the entries in M and N do not // differ too much. M44f D (M - N); for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { //cout << "diff="< eps) { cout << "unexpectedly diff "<< D[j][k] << endl; cout << j << " " << k << endl; cout << "M\n" << M << endl; cout << "N\n" << N << endl; cout << "D\n" << D << endl; assert (false); } } } } void testAddOffset() { Rand48 random(0); for (int i = 0; i < 100000; ++i) { debug (("iteration: %d\n", i)); V3f transA, transB, rotA, rotB, scaleA, scaleB; V3f tOffset, rOffset, sOffset; M44f inMat = createRandomMat(random, transA, rotA, scaleA); M44f refMat = createRandomMat(random, transB, rotB, scaleB); getRandTRS(random, tOffset, rOffset, sOffset); // addOffset : function to test M44f outMat = addOffset( inMat, tOffset, rOffset, sOffset, refMat); // add the inverse offset M44f invO; invO.rotate (V3f(rad(rOffset[0]), rad(rOffset[1]), rad(rOffset[2]))); invO[3][0] = tOffset[0]; invO[3][1] = tOffset[1]; invO[3][2] = tOffset[2]; invO.invert(); M44f invS; invS.scale (sOffset); invS.invert(); // zero scale is avoided in getRandTRS // in ref mat from the function result M44f outInRefMat = invO*invS*outMat; // in ref mat from the inputs M44f inRefMat = inMat*refMat; // compare the mat compareMat(outInRefMat, inRefMat); } } void testRSMatrix(M44f& M, V3f& t, V3f& r, V3f& s) { M44f N; N.makeIdentity(); N.translate (t); // ... matrix compositions N.rotate (r); N.scale (s); compareMat(M, N); } void testComputeRSMatrix () { Rand48 random(0); for (int i = 0; i < 100000; ++i) { debug (("iteration: %d\n", i)); V3f transA, transB, rotA, rotB, scaleA, scaleB; M44f A = createRandomMat(random, transA, rotA, scaleA); M44f B = createRandomMat(random, transB, rotB, scaleB); M44f ArAsA = computeRSMatrix( true, true, A, B); M44f ArBsB = computeRSMatrix( false, false, A, B); M44f ArAsB = computeRSMatrix( true, false, A, B); M44f ArBsA = computeRSMatrix( false, true, A, B); testRSMatrix(ArAsA, transA, rotA, scaleA); testRSMatrix(ArBsB, transA, rotB, scaleB); testRSMatrix(ArAsB, transA, rotA, scaleB); testRSMatrix(ArBsA, transA, rotB, scaleA); debug (("\n")); } } } // namespace void testMiscMatrixAlgo () { try { cout << "Testing misc functions in ImathMatrixAlgo.h" << endl; cout << "Testing the building of an orthonormal direct frame from : a position, " << "an x axis direction and a normal to the y axis" << endl; cout << "IMATH_INTERNAL_NAMESPACE::computeLocalFrame()" << endl; testComputeLocalFrame (); cout << "ok\n" << endl; cout << "Add a translate/rotate/scale offset to an input frame " << "and put it in another frame of reference" << endl; cout << "IMATH_INTERNAL_NAMESPACE::addOffset()" << endl; testAddOffset (); cout << "ok\n" << endl; cout << "Compute Translate/Rotate/Scale matrix from matrix A "< #include #include #include #include // Verify that if our transformation is already orthogonal, procrustes doesn't // change that: template void testTranslationRotationMatrix (const IMATH_INTERNAL_NAMESPACE::M44d& mat) { std::cout << "Testing known translate/rotate matrix:\n " << mat; typedef IMATH_INTERNAL_NAMESPACE::Vec3 Vec; static IMATH_INTERNAL_NAMESPACE::Rand48 rand (2047); size_t numPoints = 7; std::vector from; from.reserve (numPoints); std::vector to; to.reserve (numPoints); for (size_t i = 0; i < numPoints; ++i) { IMATH_INTERNAL_NAMESPACE::V3d a (rand.nextf(), rand.nextf(), rand.nextf()); IMATH_INTERNAL_NAMESPACE::V3d b = a * mat; from.push_back (Vec(a)); to.push_back (Vec(b)); } std::vector weights (numPoints, T(1)); const IMATH_INTERNAL_NAMESPACE::M44d m1 = procrustesRotationAndTranslation (&from[0], &to[0], &weights[0], numPoints); const IMATH_INTERNAL_NAMESPACE::M44d m2 = procrustesRotationAndTranslation (&from[0], &to[0], numPoints); const T eps = sizeof(T) == 8 ? 1e-8 : 1e-4; for (size_t i = 0; i < numPoints; ++i) { const IMATH_INTERNAL_NAMESPACE::V3d a = from[i]; const IMATH_INTERNAL_NAMESPACE::V3d b = to[i]; const IMATH_INTERNAL_NAMESPACE::V3d b1 = a * m1; const IMATH_INTERNAL_NAMESPACE::V3d b2 = a * m2; assert ((b - b1).length() < eps); assert ((b - b2).length() < eps); } std::cout << " OK\n"; } // Test that if we pass in a matrix that we know consists only of translates, // rotates, and uniform scale that we get an exact match. template void testWithTranslateRotateAndScale (const IMATH_INTERNAL_NAMESPACE::M44d& m) { std::cout << "Testing with known translate/rotate/scale matrix\n" << m; IMATH_INTERNAL_NAMESPACE::Rand48 rand(5376); typedef IMATH_INTERNAL_NAMESPACE::Vec3 V3; std::vector from; std::vector weights; const float eps = 1e-4; std::cout << "numPoints: " << std::flush; for (size_t numPoints = 1; numPoints < 10; ++numPoints) { from.push_back (V3(rand.nextf(), rand.nextf(), rand.nextf())); weights.push_back (rand.nextf()); std::cout << from.size() << " "; std::vector to; for (size_t i = 0; i < from.size(); ++i) to.push_back (from[i] * m); // weighted: IMATH_INTERNAL_NAMESPACE::M44d res = IMATH_INTERNAL_NAMESPACE::procrustesRotationAndTranslation (&from[0], &to[0], &weights[0], from.size(), true); for (size_t i = 0; i < from.size(); ++i) assert ((from[i] * res - to[i]).length() < eps); // unweighted: res = IMATH_INTERNAL_NAMESPACE::procrustesRotationAndTranslation (&from[0], &to[0], from.size(), true); for (size_t i = 0; i < from.size(); ++i) assert ((from[i] * res - to[i]).length() < eps); } std::cout << " OK\n"; } template double procrustesError (const IMATH_INTERNAL_NAMESPACE::Vec3* from, const IMATH_INTERNAL_NAMESPACE::Vec3* to, const T* weights, const size_t n, const IMATH_INTERNAL_NAMESPACE::M44d& xform) { double result = 0.0; double residual = 0.0; for (size_t i = 0; i < n; ++i) { IMATH_INTERNAL_NAMESPACE::V3d xformed = IMATH_INTERNAL_NAMESPACE::V3d(from[i]) * xform; IMATH_INTERNAL_NAMESPACE::V3d diff = xformed - IMATH_INTERNAL_NAMESPACE::V3d(to[i]); const double w = weights[i]; const double mag = w * diff.length2(); // Use Kahan summation for the heck of it: const double y = mag - residual; const double t = result + y; residual = (t - result) - y; result = t; } return result; } template void verifyProcrustes (const std::vector >& from, const std::vector >& to) { const T eps = std::sqrt(std::numeric_limits::epsilon()); const size_t n = from.size(); // Validate that passing in uniform weights gives the same answer as // passing in no weights: std::vector weights (from.size()); for (size_t i = 0; i < weights.size(); ++i) weights[i] = 1; IMATH_INTERNAL_NAMESPACE::M44d m1 = procrustesRotationAndTranslation (&from[0], &to[0], n); IMATH_INTERNAL_NAMESPACE::M44d m2 = procrustesRotationAndTranslation (&from[0], &to[0], &weights[0], n); for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) assert (std::abs(m1[i][j] - m2[i][j]) < eps); // Now try the weighted version: for (size_t i = 0; i < weights.size(); ++i) weights[i] = i+1; IMATH_INTERNAL_NAMESPACE::M44d m = procrustesRotationAndTranslation (&from[0], &to[0], &weights[0], n); // with scale: IMATH_INTERNAL_NAMESPACE::M44d ms = procrustesRotationAndTranslation (&from[0], &to[0], &weights[0], n, true); // Verify that it's orthonormal w/ positive determinant. const T det = m.determinant(); assert (std::abs(det - T(1)) < eps); // Verify orthonormal: IMATH_INTERNAL_NAMESPACE::M33d upperLeft; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) upperLeft[i][j] = m[i][j]; IMATH_INTERNAL_NAMESPACE::M33d product = upperLeft * upperLeft.transposed(); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { const double expected = (i == j ? 1.0 : 0.0); assert (std::abs(product[i][j] - expected) < eps); } } // Verify that nearby transforms are worse: const size_t numTries = 10; IMATH_INTERNAL_NAMESPACE::Rand48 rand (1056); const double delta = 1e-3; for (size_t i = 0; i < numTries; ++i) { // Construct an orthogonal rotation matrix using Euler angles: IMATH_INTERNAL_NAMESPACE::Eulerd diffRot (delta * rand.nextf(), delta * rand.nextf(), delta * rand.nextf()); assert (procrustesError (&from[0], &to[0], &weights[0], n, m * diffRot.toMatrix44()) > procrustesError (&from[0], &to[0], &weights[0], n, m)); // Try a small translation: IMATH_INTERNAL_NAMESPACE::V3d diffTrans (delta * rand.nextf(), delta * rand.nextf(), delta * rand.nextf()); IMATH_INTERNAL_NAMESPACE::M44d translateMatrix; translateMatrix.translate (diffTrans); assert (procrustesError (&from[0], &to[0], &weights[0], n, m * translateMatrix) > procrustesError (&from[0], &to[0], &weights[0], n, m)); } // Try a small scale: IMATH_INTERNAL_NAMESPACE::M44d newMat = ms; const double scaleDiff = delta; for (size_t i = 0; i < 3; ++i) for (size_t j = 0; j < 3; ++j) newMat[i][j] = ms[i][j] * (1.0 + scaleDiff); assert (procrustesError (&from[0], &to[0], &weights[0], n, newMat) > procrustesError (&from[0], &to[0], &weights[0], n, ms)); for (size_t i = 0; i < 3; ++i) for (size_t j = 0; j < 3; ++j) newMat[i][j] = ms[i][j] * (1.0 - scaleDiff); assert (procrustesError (&from[0], &to[0], &weights[0], n, newMat) > procrustesError (&from[0], &to[0], &weights[0], n, ms)); // // Verify the magical property that makes shape springs work: // when the displacements Q*A-B, times the weights, // are applied as forces at B, // there is zero net force and zero net torque. // { IMATH_INTERNAL_NAMESPACE::V3d center (0, 0, 0); IMATH_INTERNAL_NAMESPACE::V3d netForce(0); IMATH_INTERNAL_NAMESPACE::V3d netTorque(0); for (size_t iPoint = 0; iPoint < n; ++iPoint) { const IMATH_INTERNAL_NAMESPACE::V3d force = weights[iPoint] * (from[iPoint]*m - to[iPoint]); netForce += force; netTorque += to[iPoint].cross (force); } assert (netForce.length2() < eps); assert (netTorque.length2() < eps); } } template void testProcrustesWithMatrix (const IMATH_INTERNAL_NAMESPACE::M44d& m) { std::cout << "Testing Procrustes algorithm with arbitrary matrix: \n" << m; std::vector > fromPoints; std::vector > toPoints; IMATH_INTERNAL_NAMESPACE::Rand48 random (1209); std::cout << " numPoints: "; for (size_t numPoints = 1; numPoints < 10; ++numPoints) { std::cout << numPoints << " " << std::flush; fromPoints.clear(); toPoints.clear(); for (size_t i = 0; i < numPoints; ++i) { const IMATH_INTERNAL_NAMESPACE::V3d fromPt (random.nextf(), random.nextf(), random.nextf()); const IMATH_INTERNAL_NAMESPACE::V3d toPt = fromPt * m; fromPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(fromPt)); toPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(toPt)); } verifyProcrustes (fromPoints, toPoints); } std::cout << "OK\n"; } template void testProcrustesImp () { // Test the empty case: IMATH_INTERNAL_NAMESPACE::M44d id = procrustesRotationAndTranslation ((IMATH_INTERNAL_NAMESPACE::Vec3*) 0, (IMATH_INTERNAL_NAMESPACE::Vec3*) 0, (T*) 0, 0); assert (id == IMATH_INTERNAL_NAMESPACE::M44d()); id = procrustesRotationAndTranslation ((IMATH_INTERNAL_NAMESPACE::Vec3*) 0, (IMATH_INTERNAL_NAMESPACE::Vec3*) 0, 0); assert (id == IMATH_INTERNAL_NAMESPACE::M44d()); // First we'll test with a bunch of known translation/rotation matrices // to make sure we get back exactly the same points: IMATH_INTERNAL_NAMESPACE::M44d m; m.makeIdentity(); testTranslationRotationMatrix (m); m.translate (IMATH_INTERNAL_NAMESPACE::V3d(3.0, 5.0, -0.2)); testTranslationRotationMatrix (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(M_PI, 0, 0)); testTranslationRotationMatrix (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(0, M_PI/4.0, 0)); testTranslationRotationMatrix (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(0, 0, -3.0/4.0 * M_PI)); testTranslationRotationMatrix (m); m.makeIdentity(); testWithTranslateRotateAndScale (m); m.translate (IMATH_INTERNAL_NAMESPACE::V3d(0.4, 6.0, 10.0)); testWithTranslateRotateAndScale (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(M_PI, 0, 0)); testWithTranslateRotateAndScale (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(0, M_PI/4.0, 0)); testWithTranslateRotateAndScale (m); m.rotate (IMATH_INTERNAL_NAMESPACE::V3d(0, 0, -3.0/4.0 * M_PI)); testWithTranslateRotateAndScale (m); m.scale (IMATH_INTERNAL_NAMESPACE::V3d(2.0, 2.0, 2.0)); testWithTranslateRotateAndScale (m); m.scale (IMATH_INTERNAL_NAMESPACE::V3d(0.01, 0.01, 0.01)); testWithTranslateRotateAndScale (m); // Now we'll test with some random point sets and verify // the various Procrustes properties: std::vector > fromPoints; std::vector > toPoints; fromPoints.clear(); toPoints.clear(); for (size_t i = 0; i < 4; ++i) { const T theta = T(2*i) / T(M_PI); fromPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(cos(theta), sin(theta), 0)); toPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(cos(theta + M_PI/3.0), sin(theta + M_PI/3.0), 0)); } verifyProcrustes (fromPoints, toPoints); IMATH_INTERNAL_NAMESPACE::Rand48 random (1209); for (size_t numPoints = 1; numPoints < 10; ++numPoints) { fromPoints.clear(); toPoints.clear(); for (size_t i = 0; i < numPoints; ++i) { fromPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(random.nextf(), random.nextf(), random.nextf())); toPoints.push_back (IMATH_INTERNAL_NAMESPACE::Vec3(random.nextf(), random.nextf(), random.nextf())); } } verifyProcrustes (fromPoints, toPoints); // Test with some known matrices of varying degrees of quality: testProcrustesWithMatrix (m); m.translate (IMATH_INTERNAL_NAMESPACE::Vec3(3, 4, 1)); testProcrustesWithMatrix (m); m.translate (IMATH_INTERNAL_NAMESPACE::Vec3(-10, 2, 1)); testProcrustesWithMatrix (m); IMATH_INTERNAL_NAMESPACE::Eulerd rot (M_PI/3.0, 3.0*M_PI/4.0, 0); m = m * rot.toMatrix44(); testProcrustesWithMatrix (m); m.scale (IMATH_INTERNAL_NAMESPACE::Vec3(1.5, 6.4, 2.0)); testProcrustesWithMatrix (m); IMATH_INTERNAL_NAMESPACE::Eulerd rot2 (1.0, M_PI, M_PI/3.0); m = m * rot.toMatrix44(); m.scale (IMATH_INTERNAL_NAMESPACE::Vec3(-1, 1, 1)); testProcrustesWithMatrix (m); m.scale (IMATH_INTERNAL_NAMESPACE::Vec3(1, 0.001, 1)); testProcrustesWithMatrix (m); m.scale (IMATH_INTERNAL_NAMESPACE::Vec3(1, 1, 0)); testProcrustesWithMatrix (m); } void testProcrustes () { std::cout << "Testing Procrustes algorithms in single precision..." << std::endl; testProcrustesImp(); std::cout << "Testing Procrustes algorithms in double precision..." << std::endl; testProcrustesImp(); } openexr-2.5.7/IlmBase/ImathTest/testProcrustes.h000066400000000000000000000034351406177042200216550ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testProcrustes (); openexr-2.5.7/IlmBase/ImathTest/testQuat.cpp000066400000000000000000000147131406177042200207520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathQuat.h" #include "ImathMatrixAlgo.h" #include "ImathFun.h" #include "ImathLimits.h" #include "ImathPlatform.h" /* [i_a] M_PI_2 */ #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { template void testQuatT () { const T s = limits::smallest(); const T e = 4 * limits::epsilon(); // // constructors, r(), v() // { Quat q = Quat(); assert (q.r == 1 && q.v == Vec3 (0, 0, 0)); q = Quat (2, 3, 4, 5); assert (q.r == 2 && q.v == Vec3 (3, 4, 5)); q = Quat (6, Vec3 (7, 8, 9)); assert (q.r == 6 && q.v == Vec3 (7, 8, 9)); Quat q1 = Quat (q); assert (q1.r == 6 && q1.v == Vec3 (7, 8, 9)); } // // invert(), inverse() // { Quat q = Quat (1, 0, 0, 1); assert (q.inverse() == Quat (0.5, 0, 0, -0.5)); q.invert(); assert (q == Quat (0.5, 0, 0, -0.5)); } // // normalize(), normalized() // { Quat q = Quat (2, Vec3 (0, 0, 0)); assert (q.normalized() == Quat (1, 0, 0, 0)); q.normalize(); assert (q == Quat (1, 0, 0, 0)); q = Quat (0, Vec3 (0, 2, 0)); assert (q.normalized() == Quat (0, 0, 1, 0)); q.normalize(); assert (q == Quat (0, 0, 1, 0)); } // // length() // { Quat q = Quat (3, 0, 4, 0); assert (q.length() == 5); } // // setAxisAngle(), angle(), axis() // { Quat q; q.setAxisAngle (Vec3 (0, 0, 1), M_PI_2); Vec3 v = q.axis(); T a = q.angle(); assert (v.equalWithAbsError (Vec3 (0, 0, 1), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (a, T (M_PI_2), e)); } // // Accuracy of angle() for very small angles // and when real part is slightly greater than 1. // { T t = 10 * Math::sqrt (s); Quat q; q.setAxisAngle (Vec3 (0, 0, 1), t); Vec3 v = q.axis(); T a = q.angle(); assert (v.equalWithAbsError (Vec3 (0, 0, 1), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (a, t, t * e)); q.r *= 1.1; q.v *= 1.1; v = q.axis(); a = q.angle(); assert (v.equalWithAbsError (Vec3 (0, 0, 1), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (a, t, t * e)); } { T t = 0.001 * Math::sqrt (s); Quat q; q.setAxisAngle (Vec3 (0, 0, 1), t); Vec3 v = q.axis(); T a = q.angle(); assert (v.equalWithAbsError (Vec3 (0, 0, 1), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (a, t, t * e)); q.r *= 1.1; q.v *= 1.1; v = q.axis(); a = q.angle(); assert (v.equalWithAbsError (Vec3 (0, 0, 1), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (a, t, t * e)); } // // toMatrix33(), toMatrix44() // { Quat q; q.setRotation (Vec3 (1, 0, 0), Vec3 (0, 1, 0)); Matrix33 m1 = q.toMatrix33(); assert (m1.equalWithAbsError (Matrix33 (0, 1, 0, -1, 0, 0, 0, 0, 1), e)); Matrix44 m2 = q.toMatrix44(); assert (m2.equalWithAbsError (Matrix44 (0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), e)); } // // +, - (unary and binary), ~ *, /, ^ // assert (Quat (1, 2, 3, 4) + Quat (5, 6, 7, 8) == Quat (6, 8, 10, 12)); assert (Quat (-1, -2, -3, -4) - Quat (5, 6, 7, 8) == Quat (-6, -8, -10, -12)); assert (-Quat (1, 2, 3, 4) == Quat (-1, -2, -3, -4)); assert (~Quat (1, 2, 3, 4) == Quat (1, -2, -3, -4)); assert (T (2) * Quat (1, 2, 3, 4) == Quat (2, 4, 6, 8)); assert (Quat (1, 2, 3, 4) * T (2 )== Quat (2, 4, 6, 8)); assert (Quat (1, 0, 0, 1) * Quat (1, 1, 0, 0) == Quat (1, 1, 1, 1)); assert (Quat (1, 1, 0, 0) * Quat (1, 0, 0, 1) == Quat (1, 1, -1, 1)); assert (Quat (1, 0, 0, 1) / Quat (0.5, -0.5, 0, 0) == Quat (1, 1, 1, 1)); assert (Quat (2, 4, 6, 8) / T (2) == Quat (1, 2, 3, 4)); assert ((Quat (1, 2, 3, 4) ^ Quat (2, 2, 2, 2)) == 20); // // extract() // { Vec3 vFrom (1, 0, 0); Vec3 vTo (0, 1, 1); Matrix44 m1 = rotationMatrix (vFrom, vTo); Quat q = extractQuat (m1);; Matrix44 m2 = q.toMatrix44(); assert (m2.equalWithAbsError (m1, 2 * e)); } } void testQuatConversions () { { Quatf q (1, V3f (2, 3, 4)); Quatd q1 = Quatd (q); assert (q1.r == 1 && q1.v == V3d (2, 3, 4)); } { Quatd q (1, V3d (2, 3, 4)); Quatf q1 = Quatf (q); assert (q1.r == 1 && q1.v == V3f (2, 3, 4)); } } } // namespace void testQuat () { cout << "Testing basic quaternion operations" << endl; testQuatT(); testQuatT(); testQuatConversions(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testQuat.h000066400000000000000000000034311406177042200204120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testQuat (); openexr-2.5.7/IlmBase/ImathTest/testQuatSetRotation.cpp000066400000000000000000000133131406177042200231410ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathQuat.h" #include "ImathRandom.h" #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { void testRotation (const V3f &from, const V3f &to) { // // Build a quaternion. // Quatf Q; Q.setRotation (from, to); M44f M = Q.toMatrix44(); // // Verify that the quaternion rotates vector from into vector to. // float e = 20 * limits::epsilon(); V3f fromM = from * M; V3f fromQ = from * Q; V3f t0 = to.normalized(); V3f fM0 = fromM.normalized(); V3f fQ0 = fromQ.normalized(); assert (t0.equalWithAbsError (fM0, e)); assert (t0.equalWithAbsError (fQ0, e)); // // Verify that the rotation axis is the cross product of from and to. // V3f f0 = from.normalized(); if (abs (f0 ^ t0) < 0.9) { V3f n0 = (from % to).normalized(); V3f n0M = n0 * M; assert (n0.equalWithAbsError (n0M, e)); } } void specificVectors () { cout << " exact 90-degree rotations" << endl; testRotation (V3f (1, 0, 0), V3f (0, 1, 0)); testRotation (V3f (1, 0, 0), V3f (0, 0, 1)); testRotation (V3f (0, 1, 0), V3f (1, 0, 0)); testRotation (V3f (0, 1, 0), V3f (0, 0, 1)); testRotation (V3f (0, 0, 1), V3f (1, 0, 0)); testRotation (V3f (0, 0, 1), V3f (0, 1, 0)); cout << " exact zero-degree rotations" << endl; testRotation (V3f (1, 0, 0), V3f (1, 0, 0)); testRotation (V3f (0, 1, 0), V3f (0, 1, 0)); testRotation (V3f (0, 0, 1), V3f (0, 0, 1)); testRotation (V3f (1, 2, 3), V3f (2, 4, 6)); cout << " exact 180-degree rotations" << endl; testRotation (V3f (1, 0, 0), V3f (-1, 0, 0)); testRotation (V3f (0, 1, 0), V3f (0, -1, 0)); testRotation (V3f (0, 0, 1), V3f (0, 0, -1)); testRotation (V3f (1, 2, 3), V3f (-2, -4, -6)); testRotation (V3f (1, 3, 2), V3f (-2, -6, -4)); testRotation (V3f (2, 1, 3), V3f (-4, -2, -6)); testRotation (V3f (3, 1, 2), V3f (-6, -2, -4)); testRotation (V3f (2, 3, 1), V3f (-4, -6, -2)); testRotation (V3f (3, 2, 1), V3f (-6, -4, -2)); cout << " other angles" << endl; testRotation (V3f (1, 2, 3), V3f (4, 5, 6)); testRotation (V3f (1, 2, 3), V3f (4, 6, 5)); testRotation (V3f (1, 2, 3), V3f (5, 4, 6)); testRotation (V3f (1, 2, 3), V3f (6, 4, 5)); testRotation (V3f (1, 2, 3), V3f (5, 6, 4)); testRotation (V3f (1, 2, 3), V3f (6, 5, 4)); testRotation (V3f (1, 2, 3), V3f (-4, -5, -6)); testRotation (V3f (1, 2, 3), V3f (-4, -6, -5)); testRotation (V3f (1, 2, 3), V3f (-5, -4, -6)); testRotation (V3f (1, 2, 3), V3f (-6, -4, -5)); testRotation (V3f (1, 2, 3), V3f (-5, -6, -4)); testRotation (V3f (1, 2, 3), V3f (-6, -5, -4)); } void randomVectors () { cout << " random from and to vectors" << endl; Rand48 rand (17); for (int i = 0; i < 500000; ++i) { V3f from = hollowSphereRand (rand) * rand.nextf (0.1, 10.0); V3f to = hollowSphereRand (rand) * rand.nextf (0.1, 10.0); testRotation (from, to); } } void nearlyEqualVectors () { cout << " nearly equal from and to vectors" << endl; Rand48 rand (19); float e = 100 * limits::epsilon(); for (int i = 0; i < 500000; ++i) { V3f from = hollowSphereRand (rand); V3f to = from + e * hollowSphereRand (rand); testRotation (from, to); } } void nearlyOppositeVectors () { cout << " nearly opposite from and to vectors" << endl; Rand48 rand (19); float e = 100 * limits::epsilon(); for (int i = 0; i < 500000; ++i) { V3f from = hollowSphereRand (rand); V3f to = -from + e * hollowSphereRand (rand); testRotation (from, to); } } } // namespace void testQuatSetRotation () { cout << "Testing quaternion rotations" << endl; specificVectors(); randomVectors(); nearlyEqualVectors(); nearlyOppositeVectors(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testQuatSetRotation.h000066400000000000000000000034431406177042200226110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testQuatSetRotation (); openexr-2.5.7/IlmBase/ImathTest/testQuatSlerp.cpp000066400000000000000000000117721406177042200217620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathQuat.h" #include "ImathRandom.h" #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { void compareQuats (const Quatf &q1, const Quatf &q2, float e) { assert (equalWithAbsError (q1.v.x, q2.v.x, e)); assert (equalWithAbsError (q1.v.y, q2.v.y, e)); assert (equalWithAbsError (q1.v.z, q2.v.z, e)); assert (equalWithAbsError (q1.r, q2.r, e)); } Quatd pow (const Quatd q, int n) { Quatd result; for (int i = 0; i < n; ++i) result *= q; return result; } void testSlerp (const Quatf q1, const Quatf q2, int m, int n) { // // For two quaternions, q1 and q2, and the identity quaternion, qi, // // slerp (q1, q2, f) == q1 * slerp (qi, q1.inverse() * q2, f); (1) // // In addition, for integers m and n, with m >= 0, n > 0, // // pow (slerp (qi, q3, m/n), n) == pow (q3, m) (2) // // This allows us to test if slerp (q1, q2, m/n) works correctly. // Thanks to Dan Piponi for pointing this out. // // Note that e2, our upper bound for the numerical error in (2) is // fairly large. The reason for this is that testSlerp() will be // called with m and n up to 16. Taking quaternions to the 16th // power amplifies any inaccuracies. // Quatf qi; Quatf q3 = q1.inverse() * q2; Quatf q1q2 = slerp (q1, q2, float (m) / float (n)); Quatf qiq3 = slerp (qi, q3, float (m) / float (n)); float e1 = 60 * limits::epsilon(); float e2 = 600 * limits::epsilon(); compareQuats (q1q2, q1 * qiq3, e1); compareQuats (pow (qiq3, n), pow (q3, m), e2); } void testSlerp (const Quatf q1, const Quatf q2) { const int n = 16; for (int m = 0; m <= n; ++m) testSlerp (q1, q2, m, n); } void specificRotations () { cout << " combinations of 90-degree rotations around x, y and z" << endl; for (int x1 = 0; x1 < 3; ++x1) { V3f axis1 (0, 0, 0); axis1[x1] = 1; for (int n1 = 0; n1 < 4; ++n1) { float angle1 = n1 * M_PI / 2; Quatf q1; q1.setAxisAngle (axis1, angle1); for (int x2 = 0; x2 < 3; ++x2) { V3f axis2 (0, 0, 0); axis2[x2] = 1; for (int n2 = 0; n2 < 4; ++n2) { float angle2 = n2 * M_PI / 2; Quatf q2; q2.setAxisAngle (axis2, angle2); testSlerp (q1, q2); testSlerp (-q1, -q2); if ((q1 ^ q2) < 0.99) { testSlerp (q1, -q2); testSlerp (-q1, q2); } } } } } } void randomRotations () { cout << " random rotations" << endl; Rand48 rand (53); for (int i = 0; i < 10000; ++i) { V3f axis1 = hollowSphereRand (rand); V3f axis2 = hollowSphereRand (rand); float angle1 = rand.nextf (0, M_PI); float angle2 = rand.nextf (0, M_PI); Quatf q1, q2; q1.setAxisAngle (axis1, angle1); q2.setAxisAngle (axis2, angle2); testSlerp (q1, q2); testSlerp (-q1, -q2); if ((q1 ^ q2) < 0.99) { testSlerp (q1, -q2); testSlerp (-q1, q2); } } } } // namespace void testQuatSlerp () { cout << "Testing quaternion spherical linear interpolation" << endl; specificRotations(); randomRotations(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testQuatSlerp.h000066400000000000000000000034361406177042200214250ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testQuatSlerp (); openexr-2.5.7/IlmBase/ImathTest/testRandom.cpp000066400000000000000000000147461406177042200212660ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathRandom.h" #include "ImathVec.h" #include "ImathFun.h" #include #include #include using namespace std; using IMATH_INTERNAL_NAMESPACE::abs; namespace { void testErand48 () { // // Our implementation of erand48(), nrand48(), etc. // assumes that sizeof (unsigned short) == 2. // assert (sizeof (unsigned short) == 2); // // starting with a given seed, erand48() and nrand48() // must generate the same sequence as the standard // Unix/Linux functions. // unsigned short state[3]; state[0] = 0; state[1] = 1; state[2] = 2; assert (abs (IMATH_INTERNAL_NAMESPACE::erand48 (state) - 0.671004) < 0.00001); assert (abs (IMATH_INTERNAL_NAMESPACE::erand48 (state) - 0.786905) < 0.00001); assert (abs (IMATH_INTERNAL_NAMESPACE::erand48 (state) - 0.316850) < 0.00001); assert (abs (IMATH_INTERNAL_NAMESPACE::erand48 (state) - 0.384870) < 0.00001); assert (abs (IMATH_INTERNAL_NAMESPACE::erand48 (state) - 0.854650) < 0.00001); assert (IMATH_INTERNAL_NAMESPACE::nrand48 (state) == 0x4f4e8cb0); assert (IMATH_INTERNAL_NAMESPACE::nrand48 (state) == 0x063e864b); assert (IMATH_INTERNAL_NAMESPACE::nrand48 (state) == 0x2d10f1dd); assert (IMATH_INTERNAL_NAMESPACE::nrand48 (state) == 0x1aadc122); assert (IMATH_INTERNAL_NAMESPACE::nrand48 (state) == 0x1836a71f); assert (state[0] == 0x2a42); assert (state[1] == 0x4e3e); assert (state[2] == 0x306d); } template void testGenerator () { // // Test if the values, and the differences between // successive values, are evenly distributed. // const int N = 10; const int M = 100000; int values[N + 1]; int diffs[2 * N + 3]; int *v = &values[0]; int *d = &diffs[N + 2]; for (int i = 0; i <= N; ++i) v[i] = 0; for (int i = -N; i <= N; ++i) d[i] = 0; Rand rand (0); float previous = 0; for (int i = 0; i < M * N; ++i) { float r = rand.nextf (0.0, 1.0); float diff = r - previous; previous = r; v[int (r * N)] += 1; d[IMATH_INTERNAL_NAMESPACE::floor (diff * N + 0.5)] += 1; } cout << " values" << endl; for (int i = 0; i < N; ++i) { // cout << setw (4) << i << ' ' << setw(6) << v[i] << ' '; assert (abs (v[i] - M) < 0.01 * M); // for (int j = 0; j < v[i] * 60 / M; ++j) // cout << '*'; // cout << endl; } assert (v[N] == 0); cout << " differences between successive values" << endl; for (int i = -N; i <= N; ++i) { // cout << setw (4) << i << ' ' << setw (6) << d[i] << ' '; assert (abs ((N - abs (i)) * M / N - d[i]) < 0.05 * M); // for (int j = 0; j < d[i] * 60 / M; ++j) // cout << '*'; // cout << endl; } cout << " range" << endl; double rMin = 1.0; double rMax = 0.0; for (int i = 0; i <= 10000000; ++i) { double r = rand.nextf (0.0, 1.0); if (rMin > r) rMin = r; if (rMax < r) rMax = r; } assert (rMin < 0.0001 && rMax > 0.9999); const double pow_2_60 = double (1073741824) * double (1073741824); for (int i = 0; i <= 10000000; ++i) { double r0 = rand.nextf (-2.0, 3.0); assert (r0 >= -2.0 && r0 <= 3.0); double r1 = rand.nextf (-pow_2_60, 1); assert (r1 >= -pow_2_60 && r1 <= 1); double r2 = rand.nextf (-1, pow_2_60); assert (r2 >= -1 && r2 <= pow_2_60); } } template void testSolidSphere () { const int N = 10; const int M = 10000; int v[N + 1]; for (int i = 0; i <= N; ++i) v[i] = 0; Rand rand (0); for (int i = 0; i < M * N; ++i) { IMATH_INTERNAL_NAMESPACE::V3f p = IMATH_INTERNAL_NAMESPACE::solidSphereRand (rand); float l = p.length(); v[IMATH_INTERNAL_NAMESPACE::floor (l * N)] += 1; assert (l < 1.00001); } for (int i = 0; i < N; ++i) assert (v[i] > 0); } template void testHollowSphere () { const int M = 100000; Rand rand (0); for (int i = 0; i < M; ++i) { IMATH_INTERNAL_NAMESPACE::V3f p = IMATH_INTERNAL_NAMESPACE::hollowSphereRand (rand); float l = p.length(); assert (abs (l - 1) < 0.00001); } } } // namespace void testRandom () { cout << "Testing random number generators" << endl; cout << "erand48(), nrand48()" << endl; testErand48(); cout << "Rand32" << endl; testGenerator(); cout << "Rand48" << endl; testGenerator(); cout << "solidSphereRand()" << endl; testSolidSphere(); cout << "hollowSphereRand()" << endl; testHollowSphere(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testRandom.h000066400000000000000000000034341406177042200207230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testRandom (); openexr-2.5.7/IlmBase/ImathTest/testRoots.cpp000066400000000000000000000166011406177042200211440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathRoots.h" #include "ImathFun.h" #include #include #include #include using namespace std; void sort (int nx, double &x0, double &x1, double &x2) { if (nx == 2) { if (x0 > x1) swap (x0, x1); } if (nx == 3) { if (x0 > x1) swap (x0, x1); if (x1 > x2) swap (x1, x2); if (x0 > x1) swap (x0, x1); } } void sort (int nx, double x[]) { if (nx == 2) { if (x[0] > x[1]) swap (x[0], x[1]); } if (nx == 3) { if (x[0] > x[1]) swap (x[0], x[1]); if (x[1] > x[2]) swap (x[1], x[2]); if (x[0] > x[1]) swap (x[0], x[1]); } } void solve (double a, double b, double c, double d, // coefficients int nx, // number of expected solutions double x0, double x1, double x2) // expected solutions { cout << "coefficients: " << setw(3) << a << ' ' << setw(3) << b << ' ' << setw(3) << c << ' ' << setw(3) << d << ' '; // // Solve the equation a*x^3 + b*x^2 + c*x +d // double x[3]; int n = IMATH_INTERNAL_NAMESPACE::solveCubic (a, b, c, d, x); // // Sort the numerical solutions. // Sorte the expected solutions. // sort (nx, x0, x1, x2); sort (n, x); // // Compare the numerical and the expected solutions. // assert (n == nx); cout << " solutions: "; if (n == -1) cout << "[-inf, inf]"; if (n == 0) cout << "none"; const double e = 0.0000001; // maximum expected error for // the test cases listed below if (n >= 1) { cout << x[0]; assert (IMATH_INTERNAL_NAMESPACE::equal (x[0], x0, e)); } if (n >= 2) { cout << ' ' << x[1]; assert (IMATH_INTERNAL_NAMESPACE::equal (x[1], x1, e)); } if (n >= 3) { cout << ' ' << x[2]; assert (IMATH_INTERNAL_NAMESPACE::equal (x[2], x2, e)); } cout << endl; } void solve (double a, double b, double c, // coefficients int nx, // number of expected solutions double x0, double x1) // expected solutions { cout << "coefficients: " << setw(3) << a << ' ' << setw(3) << b << ' ' << setw(3) << c << ' '; // // Solve the equation a*x^2 + b*x^1 + c*x // double x[2] = {0.0, 0.0}; int n = IMATH_INTERNAL_NAMESPACE::solveQuadratic (a, b, c, x); // // Sort the numerical solutions. // Sort the expected solutions. // // Dummy variable for sort double x2 = 0; sort (nx, x0, x1, x2); sort (n, x); // // Compare the numerical and the expected solutions. // assert (n == nx); cout << " solutions: "; if (n == -1) cout << "[-inf, inf]"; if (n == 0) cout << "none"; const double e = 0.0000001; // maximum expected error for // the test cases listed below if (n >= 1) { cout << x[0]; assert (IMATH_INTERNAL_NAMESPACE::equal (x[0], x0, e)); } if (n >= 2) { cout << ' ' << x[1]; assert (IMATH_INTERNAL_NAMESPACE::equal (x[1], x1, e)); } cout << endl; } void testRoots () { cout << "Testing functions in ImathRoots.h" << endl; cout << endl << "solveCubic" << endl; // Solve cubiec equations // // coefficients number of expected solutions // | | // | | expected solutions // | | | // +-------+--------+ | +------+-----+ // | | | | | solve (1, 6, 11, 6, 3, -1, -2, -3); // real solutions: -1, -2, -3 solve (2, 2, -20, 16, 3, 1, -4, 2); // real solutions: 1, -4, 2 solve (3, -3, 1, -1, 1, 1, 0, 0); // real solutions: 1 solve (2, 0, -24, -32, 2, 4, -2, 0); // real solutions: 4, -2 solve (1, 0, 0, 0, 1, 0, 0, 0); // real solutions: 0 solve (8, -24, 24, -8, 1, 1, 0, 0); // real solutions: 1 solve (0, 2, -10, 12, 2, 2, 3, 0); // real solutions: 2, 3 solve (0, 1, -1, -20, 2, 5, -4, 0); // real solutions: 5, -4 solve (0, 3, -12, 12, 1, 2, 0, 0); // real solutions: 2 solve (0, 1, 0, 0, 1, 0, 0, 0); // real solutions: 0 solve (0, 1, 0, 1, 0, 0, 0, 0); // real solutions: none solve (0, 0, 3, -6, 1, 2, 0, 0); // real solutions: 2 solve (0, 0, 5, 15, 1, -3, 0, 0); // real solutions: -3 solve (0, 0, 1, 0, 1, 0, 0, 0); // real solutions: 0 solve (0, 0, 0, 1, 0, 0, 0, 0); // real solutions: none solve (0, 0, 0, 0, -1, 0, 0, 0); // real solutions: [-inf, inf] cout << endl << "solveQuadratic" << endl; // Solve quadratic equations // // coefficients number of expected solutions // | | // | | expected solutions // | | | // +-----+-----+ | +---+---+ // | | | | | solve (1, 3, 2, 2, -1, -2); // real solutions: -1, -2 solve (1, 0, -9, 2, -3, 3); // real solutions: -3, 3 solve (1, -4, 0, 2, 4, 0); // real solutions: 0, 4 solve (2, -4, 2, 1, 1, 0); // real solutions: 1 solve (0, -4, 8, 1, 2, 0); // real solutions: 2 solve (0, 7, 0, 1, 0, 0); // real solutions: 0 solve (10, 0, 0, 1, 0, 0); // real solutions: 0 solve (0, 0, 0, -1, 0, 0); // real solutions: [-inf, inf] solve (0, 0, 1, 0, 0, 0); // real solutions: none solve (3, -6, 30, 0, 0, 0); // real solutions: none cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testRoots.h000066400000000000000000000034331406177042200206100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testRoots (); openexr-2.5.7/IlmBase/ImathTest/testShear.cpp000066400000000000000000000233021406177042200210740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathShear.h" #include "ImathLimits.h" #include "ImathMath.h" #include #include using namespace std; void testShear () { cout << "Testing functions in ImathShear.h" << endl; cout << "Imath::Shear6 constructors" << endl; const float epsilon = IMATH_INTERNAL_NAMESPACE::limits< float >::epsilon(); IMATH_INTERNAL_NAMESPACE::Shear6f testConstructor1; IMATH_INTERNAL_NAMESPACE::Shear6f testConstructor2( testConstructor1 ); testConstructor1 = testConstructor2; IMATH_INTERNAL_NAMESPACE::Shear6f testConstructor3( 52, 128, 254, 127, 12, -20 ); IMATH_INTERNAL_NAMESPACE::Shear6f A( testConstructor3 ); IMATH_INTERNAL_NAMESPACE::Shear6f B = A; IMATH_INTERNAL_NAMESPACE::Shear6f X, Y, tmp; assert ( A == B ); cout << "Imath::Shear6 * f" << endl; assert ( ( IMATH_INTERNAL_NAMESPACE::Shear6f( 0.330f, 0.710f, 0.010f, 0.999f, -0.531f, -0.012f ) * 0.999f ) == IMATH_INTERNAL_NAMESPACE::Shear6f( 0.330f * 0.999f, 0.710f * 0.999f, 0.010f * 0.999f, 0.999f * 0.999f, -0.531f * 0.999f, -0.012f * 0.999f ) ); cout << "Imath::Shear6 / f" << endl; assert ( ( IMATH_INTERNAL_NAMESPACE::Shear6f( 0.330f, 0.710f, 0.010f, 0.999f, -0.531f, -0.012f ) / 0.999f ) == IMATH_INTERNAL_NAMESPACE::Shear6f( 0.330f / 0.999f, 0.710f / 0.999f, 0.010f / 0.999f, 0.999f / 0.999f, -0.531f / 0.999f, -0.012f / 0.999f ) ); cout << "Assignment and comparison" << endl; B = A; assert( B == A ); assert( !( B != A ) ); X = Y = IMATH_INTERNAL_NAMESPACE::Shear6f( 0.123f, -0.420f, 0.501f, 0.998f, -0.231f, -0.034f ); X *= 0.001f; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.xy * 0.001f ) - X.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.xz * 0.001f ) - X.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.yz * 0.001f ) - X.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.yx * 0.001f ) - X.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.zx * 0.001f ) - X.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.zy * 0.001f ) - X.zy ) <= epsilon ); X = Y = IMATH_INTERNAL_NAMESPACE::Shear6f( 0.123f, -0.420f, 0.501f, 0.998f, -0.231f, -0.034f ); X /= -1.001f; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.xy / -1.001f ) - X.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.xz / -1.001f ) - X.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.yz / -1.001f ) - X.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.yx / -1.001f ) - X.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.zx / -1.001f ) - X.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( Y.zy / -1.001f ) - X.zy ) <= epsilon ); Y = IMATH_INTERNAL_NAMESPACE::Shear6f( 0.998f, -0.001f, 0.501f, 1.001f, -0.231f, -0.034f ); X = IMATH_INTERNAL_NAMESPACE::Shear6f( 0.011f, -0.420f, -0.501f, 0.998f, -0.231f, -0.034f ); tmp = X + Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy + Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz + Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz + Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx + Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx + Y.zx ) - tmp.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy + Y.zy ) - tmp.zy ) <= epsilon ); tmp = X - Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy - Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz - Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz - Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx - Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx - Y.zx ) - tmp.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy - Y.zy ) - tmp.zy ) <= epsilon ); tmp = X * Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy * Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz * Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz * Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx * Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx * Y.zx ) - tmp.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy * Y.zy ) - tmp.zy ) <= epsilon ); tmp = X / Y; // // epsilon doesn't work here. // assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy / Y.xy ) - tmp.xy ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz / Y.xz ) - tmp.xz ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz / Y.yz ) - tmp.yz ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx / Y.yx ) - tmp.yx ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx / Y.zx ) - tmp.zx ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy / Y.zy ) - tmp.zy ) <= 1e-5f ); tmp = X; tmp += Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy + Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz + Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz + Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx + Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx + Y.zx ) - tmp.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy + Y.zy ) - tmp.zy ) <= epsilon ); tmp = X; tmp -= Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy - Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz - Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz - Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx - Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz - Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz - Y.yz ) - tmp.yz ) <= epsilon ); tmp = X; tmp *= Y; assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy * Y.xy ) - tmp.xy ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz * Y.xz ) - tmp.xz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz * Y.yz ) - tmp.yz ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx * Y.yx ) - tmp.yx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx * Y.zx ) - tmp.zx ) <= epsilon && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy * Y.zy ) - tmp.zy ) <= epsilon ); tmp = X; tmp /= Y; // // epsilon doesn't work here. // assert( IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xy / Y.xy ) - tmp.xy ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.xz / Y.xz ) - tmp.xz ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yz / Y.yz ) - tmp.yz ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.yx / Y.yx ) - tmp.yx ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zx / Y.zx ) - tmp.zx ) <= 1e-5f && IMATH_INTERNAL_NAMESPACE::Math::fabs( ( X.zy / Y.zy ) - tmp.zy ) <= 1e-5f ); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testShear.h000066400000000000000000000034331406177042200205440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testShear (); openexr-2.5.7/IlmBase/ImathTest/testTinySVD.cpp000066400000000000000000000327731406177042200213460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include "ImathMatrixAlgo.h" #include #include #include #include #include template void verifyOrthonormal (const IMATH_INTERNAL_NAMESPACE::Matrix33& A) { const T valueEps = T(100) * std::numeric_limits::epsilon(); const IMATH_INTERNAL_NAMESPACE::Matrix33 prod = A * A.transposed(); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (i == j) assert (std::abs (prod[i][j] - 1) < valueEps); else assert (std::abs (prod[i][j]) < valueEps); } } } template void verifyOrthonormal (const IMATH_INTERNAL_NAMESPACE::Matrix44& A) { const T valueEps = T(100) * std::numeric_limits::epsilon(); const IMATH_INTERNAL_NAMESPACE::Matrix44 prod = A * A.transposed(); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (i == j) assert (std::abs (prod[i][j] - 1) <= valueEps); else assert (std::abs (prod[i][j]) <= valueEps); } } } template void verifyTinySVD_3x3 (const IMATH_INTERNAL_NAMESPACE::Matrix33& A) { T maxEntry = 0; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) maxEntry = std::max (maxEntry, std::abs (A[i][j])); const T eps = std::numeric_limits::epsilon(); const T valueEps = maxEntry * T(10) * eps; for (int i = 0; i < 2; ++i) { const bool posDet = (i == 0); IMATH_INTERNAL_NAMESPACE::Matrix33 U, V; IMATH_INTERNAL_NAMESPACE::Vec3 S; IMATH_INTERNAL_NAMESPACE::jacobiSVD (A, U, S, V, eps, posDet); IMATH_INTERNAL_NAMESPACE::Matrix33 S_times_Vt; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) S_times_Vt[i][j] = S[j] * V[i][j]; S_times_Vt.transpose(); // Verify that the product of the matrices is A: const IMATH_INTERNAL_NAMESPACE::Matrix33 product = U * S_times_Vt; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) assert (std::abs (product[i][j] - A[i][j]) <= valueEps); // Verify that U and V are orthogonal: if (posDet) { assert (U.determinant() > 0.9); assert (V.determinant() > 0.9); } // Verify that the singular values are sorted: for (int i = 0; i < 2; ++i) assert (S[i] >= S[i+1]); // Verify that all the SVs except maybe the last one are positive: for (int i = 0; i < 2; ++i) assert (S[i] >= T(0)); if (!posDet) assert (S[2] >= T(0)); verifyOrthonormal (U); verifyOrthonormal (V); } } template void verifyTinySVD_4x4 (const IMATH_INTERNAL_NAMESPACE::Matrix44& A) { T maxEntry = 0; for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) maxEntry = std::max (maxEntry, std::abs (A[i][j])); const T eps = std::numeric_limits::epsilon(); const T valueEps = maxEntry * T(100) * eps; for (int i = 0; i < 2; ++i) { const bool posDet = (i == 0); IMATH_INTERNAL_NAMESPACE::Matrix44 U, V; IMATH_INTERNAL_NAMESPACE::Vec4 S; IMATH_INTERNAL_NAMESPACE::jacobiSVD (A, U, S, V, eps, posDet); IMATH_INTERNAL_NAMESPACE::Matrix44 S_times_Vt; for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) S_times_Vt[i][j] = S[j] * V[i][j]; S_times_Vt.transpose(); // Verify that the product of the matrices is A: const IMATH_INTERNAL_NAMESPACE::Matrix44 product = U * S_times_Vt; for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) assert (std::abs (product[i][j] - A[i][j]) <= valueEps); // Verify that U and V have positive determinant if requested: if (posDet) { assert (U.determinant() > 0.99); assert (V.determinant() > 0.99); } // Verify that the singular values are sorted: for (int i = 0; i < 3; ++i) assert (S[i] >= S[i+1]); // Verify that all the SVs except maybe the last one are positive: for (int i = 0; i < 3; ++i) assert (S[i] >= T(0)); if (!posDet) assert (S[3] >= T(0)); verifyOrthonormal (U); verifyOrthonormal (V); } } template void testTinySVD_3x3 (const IMATH_INTERNAL_NAMESPACE::Matrix33& A) { std::cout << "Verifying SVD for [[" << A[0][0] << ", " << A[0][1] << ", " << A[0][2] << "], " << "[" << A[1][0] << ", " << A[1][1] << ", " << A[1][2] << "], " << "[" << A[2][0] << ", " << A[2][1] << ", " << A[2][2] << "]]\n"; verifyTinySVD_3x3 (A); verifyTinySVD_3x3 (A.transposed()); // Try all different orderings of the columns of A: int cols[3] = { 0, 1, 2 }; do { IMATH_INTERNAL_NAMESPACE::Matrix33 B; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) B[i][j] = A[i][cols[j]]; verifyTinySVD_3x3 (B); } while (std::next_permutation (cols, cols + 3)); } template void testTinySVD_3x3 (const T a, const T b, const T c, const T d, const T e, const T f, const T g, const T h, const T i) { const IMATH_INTERNAL_NAMESPACE::Matrix33 A (a, b, c, d, e, f, g, h, i); testTinySVD_3x3 (A); } template void testTinySVD_4x4 (const IMATH_INTERNAL_NAMESPACE::Matrix44& A) { std::cout << "Verifying SVD for [[" << A[0][0] << ", " << A[0][1] << ", " << A[0][2] << ", " << A[0][3] << "], " << "[" << A[1][0] << ", " << A[1][1] << ", " << A[1][2] << ", " << A[1][3] << "], " << "[" << A[2][0] << ", " << A[2][1] << ", " << A[2][2] << ", " << A[2][3] << "], " << "[" << A[3][0] << ", " << A[3][1] << ", " << A[3][2] << ", " << A[3][3] << "]]\n"; verifyTinySVD_4x4 (A); verifyTinySVD_4x4 (A.transposed()); // Try all different orderings of the columns of A: int cols[4] = { 0, 1, 2, 3 }; do { IMATH_INTERNAL_NAMESPACE::Matrix44 B; for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) B[i][j] = A[i][cols[j]]; verifyTinySVD_4x4 (B); } while (std::next_permutation (cols, cols + 4)); } template void testTinySVD_4x4 (const T a, const T b, const T c, const T d, const T e, const T f, const T g, const T h, const T i, const T j, const T k, const T l, const T m, const T n, const T o, const T p) { const IMATH_INTERNAL_NAMESPACE::Matrix44 A (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p); testTinySVD_4x4 (A); } template void testTinySVDImp() { // Try a bunch of 3x3 matrices: testTinySVD_3x3 (1, 0, 0, 0, 1, 0, 0, 0, 1); testTinySVD_3x3 (1, 0, 0, 0, -1, 0, 0, 0, 1); testTinySVD_3x3 (0, 0, 0, 0, 0, 0, 0, 0, 0); testTinySVD_3x3 (0, 0, 0, 0, 0, 0, 0, 0, 1); testTinySVD_3x3 (1, 0, 0, 0, 1, 0, 0, 0, 0); testTinySVD_3x3 (1, 0, 0, 0, 0, 0, 0, 0, 0); testTinySVD_3x3 (1, 0, 0, 1e-10, 0, 0, 0, 0, 0); testTinySVD_3x3 (1, 0, 0, 1e-10, 0, 0, 0, 0, 100000); testTinySVD_3x3 (1, 2, 3, 4, 5, 6, 7, 8, 9); testTinySVD_3x3 (1, 2, 3, 4, 5, 6, 7, 8, 9); testTinySVD_3x3 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3 (100, 1e-5, 0), IMATH_INTERNAL_NAMESPACE::Vec3 (100, 1e-5, 0))); testTinySVD_3x3 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3 (245, 20, 1), IMATH_INTERNAL_NAMESPACE::Vec3 (256, 300, 20))); testTinySVD_3x3 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3 (245, 20, 1), IMATH_INTERNAL_NAMESPACE::Vec3 (245, 20, 1)) + outerProduct (IMATH_INTERNAL_NAMESPACE::Vec3 (1, 2, 3), IMATH_INTERNAL_NAMESPACE::Vec3 (1, 2, 3))); // Some problematic matrices from SVDTest: testTinySVD_3x3 ( 0.0023588321752040036, -0.0096558131480729038, 0.0010959850449366493, 0.0088671829608044754, 0.0016771794267033666, -0.0043081475729438235, 0.003976050440932701, 0.0019880497026345716, 0.0089576046614601966); testTinySVD_3x3 ( 2.3588321752040035e-09, -9.6558131480729038e-09, 1.0959850449366498e-09, 8.8671829608044748e-09, 1.6771794267033661e-09, -4.3081475729438225e-09, 3.9760504409327016e-09, 1.9880497026345722e-09, 8.9576046614601957e-09); testTinySVD_3x3 ( -0.46673855799602715, 0.67466260360310948, 0.97646986796448998, -0.032460753747103721, 0.046584527749418278, 0.067431228641151142, -0.088885055229687815, 0.1280389179308779, 0.18532617511453064); testTinySVD_3x3 ( 1e-8, 0, 0, 0, 1e-8, 0, 0, 0, 1e-8); testTinySVD_3x3 ( 1, 0, 0, 0, .00036, 0, 1e-18, 0, .00018); testTinySVD_3x3 ( 1.3, 0, 0, 0, .0003, 0, 1e-17, 0, 0); testTinySVD_3x3 ( 1, 0, 0, 0, 1e-2, 0, 0, 0, 1e-2); testTinySVD_3x3 ( 1,0,0, 0,1,0, 0,0,0); testTinySVD_3x3 ( 1, 0, 0, 0, 1e-3, 0, 0, 0, 1e-6); testTinySVD_3x3 ( 0.59588638570136332, -0.79761234126107794, -1, 0.39194500425202045, 0.91763115383440363, -0.341818175044664, -0.45056075218951946, -0.71259057727425101, 0.47125008216720271); testTinySVD_3x3 ( 4.38805348e-09, -2.53189691e-09, -4.65678607e-09, -3.23000099e-10, 1.86370294e-10, 3.42781192e-10, -4.61572824e-09, 2.6632645e-09, 4.89840346e-09); // problematic 2x2 one for lapack on suse (see below), padded with 0's testTinySVD_3x3 ( 0, -1.00000003e-22, 0, 1.00000001e-07, 0, 0, 0, 0, 0); // problematic 2x2 one for lapack on suse (see below), padded with 0's and 1 testTinySVD_3x3 ( 0, -1.00000003e-22, 0, 1.00000001e-07, 0, 0, 0, 0, 1); // Now, 4x4 matrices: testTinySVD_4x4 (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); testTinySVD_4x4 (1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); testTinySVD_4x4 (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0); testTinySVD_4x4 (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); testTinySVD_4x4 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); testTinySVD_4x4 (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); testTinySVD_4x4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); testTinySVD_4x4 (0, -1.00000003e-22, 0, 0, 00000001e-07, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); testTinySVD_4x4 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4 (100, 1e-5, 0, 0), IMATH_INTERNAL_NAMESPACE::Vec4 (100, 1e-5, 0, 0))); testTinySVD_4x4 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4 (245, 20, 1, 0.5), IMATH_INTERNAL_NAMESPACE::Vec4 (256, 300, 20, 10))); testTinySVD_4x4 (outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4 (245, 20, 1, 0.5), IMATH_INTERNAL_NAMESPACE::Vec4 (256, 300, 20, 10)) + outerProduct (IMATH_INTERNAL_NAMESPACE::Vec4 (30, 10, 10, 10), IMATH_INTERNAL_NAMESPACE::Vec4 (1, 2, 3, 3))); } void testTinySVD () { std::cout << "Testing TinySVD algorithms in single precision..." << std::endl; testTinySVDImp(); std::cout << "Testing TinySVD algorithms in double precision..." << std::endl; testTinySVDImp(); } openexr-2.5.7/IlmBase/ImathTest/testTinySVD.h000066400000000000000000000034321406177042200210010ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2010, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testTinySVD (); openexr-2.5.7/IlmBase/ImathTest/testVec.cpp000066400000000000000000000262321406177042200205540ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include "ImathVec.h" #include "ImathFun.h" #include "ImathLimits.h" #include #include #include using namespace std; using namespace IMATH_INTERNAL_NAMESPACE; namespace { template void testLength2T () { const T s = Math::sqrt (limits::smallest()); const T e = 4 * limits::epsilon(); Vec2 v; v = Vec2 (0, 0); assert (v.length() == 0); assert (v.normalized().length() == 0); v = Vec2 (3, 4); assert (v.length() == 5); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (3000, 4000); assert (v.length() == 5000); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); T t = s * (1 << 4); v = Vec2 (t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (-t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (2), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 4); v = Vec2 (t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (-t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (2), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 20); v = Vec2 (t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec2 (-t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (2), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); } template void testLength3T () { const T s = Math::sqrt (limits::smallest()); const T e = 4 * limits::epsilon(); Vec3 v; v = Vec3 (0, 0, 0); assert (v.length() == 0); assert (v.normalized().length() == 0); v = Vec3 (3, 4, 0); assert (v.length() == 5); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (3000, 4000, 0); assert (v.length() == 5000); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (1, -1, 1); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), 1 * Math::sqrt (3), e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (1000, -1000, 1000); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), 1000 * Math::sqrt (3), 1000 * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); T t = s * (1 << 4); v = Vec3 (t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (-t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (3), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 4); v = Vec3 (t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (-t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (3), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 20); v = Vec3 (t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec3 (-t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * Math::sqrt (3), t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); } template void testLength4T () { const T s = Math::sqrt (limits::smallest()); const T e = 4 * limits::epsilon(); Vec4 v; v = Vec4 (0, 0, 0, 0); assert (v.length() == 0); assert (v.normalized().length() == 0); v = Vec4 (3, 4, 0, 0); assert (v.length() == 5); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (3000, 4000, 0, 0); assert (v.length() == 5000); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (1, -1, 1, 1); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), 2, e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (1000, -1000, 1000, 1000); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), 2000, 1000 * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); T t = s * (1 << 4); v = Vec4 (t, 0, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (-t, -t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * 2, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 4); v = Vec4 (t, 0, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (-t, -t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * 2, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); t = s / (1 << 20); v = Vec4 (t, 0, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, t, 0, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, t, 0); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (0, 0, 0, t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); v = Vec4 (-t, -t, -t, -t); assert (IMATH_INTERNAL_NAMESPACE::equal (v.length(), t * 2, t * e)); assert (IMATH_INTERNAL_NAMESPACE::equal (v.normalized().length(), 1, e)); } } // namespace void testVec () { cout << "Testing some basic vector operations" << endl; testLength2T(); testLength2T(); testLength3T(); testLength3T(); testLength4T(); testLength4T(); cout << "ok\n" << endl; } openexr-2.5.7/IlmBase/ImathTest/testVec.h000066400000000000000000000034301406177042200202140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testVec (); openexr-2.5.7/IlmBase/Makefile.am000066400000000000000000000007161406177042200165640ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in ACLOCAL_AMFLAGS = -I m4 SUBDIRS = \ Half HalfTest \ Iex IexMath IexTest \ Imath ImathTest \ IlmThread \ config DIST_SUBDIRS = \ $(SUBDIRS) EXTRA_DIST = \ AUTHORS ChangeLog LICENSE NEWS \ README.md \ bootstrap \ CMakeLists.txt pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = IlmBase.pc openexr-2.5.7/IlmBase/README.md000066400000000000000000000016431406177042200160070ustar00rootroot00000000000000# The IlmBase Libraries The IlmBase libraries are a part of the OpenEXR project and include the following: * **Half** - a class that encapsulates our 16-bit floating-point format. * **Imath** - 2D and 3D vectors, 3x3 and 4x4 matrices, quaternions and other useful 2D and 3D math functions. * **Iex** - an exception-handling library. * **IexMath** - math exception types. * **IlmThread** - a thread abstraction library for use with OpenEXR and other software packages. It currently supports pthreads and Windows threads. In addition, the distribution also includes confidence test libaries: * **HalfTest** * **IexTest** * **ImathTest**. ## License These libraries are covered under the [BSD-3-Clause](https://www.openexr.com/license.html) license of the OpenEXR project. ## Building and Installation See the top-level [INSTALL](../INSTALL.md) file for information about building and installing the OpenEXR libraries. openexr-2.5.7/IlmBase/bootstrap000077500000000000000000000041441406177042200164720ustar00rootroot00000000000000#!/bin/sh ## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## # If we're on OS X, use glibtoolize instead of toolize when available HOSTTYPE=`uname` if [ "$HOSTTYPE" = "Darwin" ] && $(which glibtoolize > /dev/null 2>&1) ; then LIBTOOLIZE=glibtoolize else LIBTOOLIZE=libtoolize fi # Check Autoconf version if [ -x `which autoconf` ]; then AC_VER=`autoconf --version | head -n 1 | sed 's/^[^0-9]*//'` AC_VER_MAJOR=`echo $AC_VER | cut -f1 -d'.'` AC_VER_MINOR=`echo $AC_VER | cut -f2 -d'.' | sed 's/[^0-9]*$//'` if [ "$AC_VER_MAJOR" -lt "2" ]; then echo "Autoconf 2.13 or greater needed to build configure." exit 1 fi if [ "$AC_VER_MINOR" -lt "13" ]; then echo "Autoconf 2.13 or greater needed to build configure." exit 1 fi if [ "$AC_VER_MINOR" -lt "50" ]; then if [ ! -e configure.in ]; then ln -s configure.ac configure.in fi echo "If you see some warnings about cross-compiling, don't worry; this is normal." else rm -f configure.in fi else echo autoconf not found. IlmBase CVS requires autoconf to bootstrap itself. exit 1 fi run_cmd() { echo running $* ... if ! $*; then echo failed! exit 1 fi } # Check if /usr/local/share/aclocal exists if [ -d /usr/local/share/aclocal ]; then ACLOCAL_INCLUDE="$ACLOCAL_INCLUDE -I /usr/local/share/aclocal" fi run_cmd aclocal -I m4 $ACLOCAL_INCLUDE # Injects an additional naming scheme so we have # libFoo.so -> libFoo-SUFFIX.so # libFoo-SUFFIX.so -> libFoo-SUFFIX.so.MAJ # libFoo-SUFFIX.so.MAJ -> libFoo-SUFFIX.so.FULL_SO_VERSION # (or short cut from libFoo-SUFFIX to FULL_SO_VERSION depending # on libtool, but link file names are the same. sed -e 's/shared_ext\$major \$libname\$shared_ext/shared_ext\$major \$libname\$release\$shared_ext \$libname\$shared_ext/' -i aclocal.m4 run_cmd $LIBTOOLIZE --automake --copy sed -e 's/shared_ext\$major \$libname\$shared_ext/shared_ext\$major \$libname\$release\$shared_ext \$libname\$shared_ext/' -i m4/libtool.m4 run_cmd automake --add-missing --copy --foreign run_cmd autoconf echo echo "Now type './configure' to configure IlmBase." echo openexr-2.5.7/IlmBase/config/000077500000000000000000000000001406177042200157715ustar00rootroot00000000000000openexr-2.5.7/IlmBase/config/CMakeLists.txt000066400000000000000000000112411406177042200205300ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. include(CheckIncludeFiles) include(CheckSymbolExists) include(CheckLibraryExists) include(CheckStructHasMember) check_include_files(ucontext.h ILMBASE_HAVE_UCONTEXT_H) if(ILMBASE_HAVE_UCONTEXT_H) # TODO: remove this once we cleanly have ILMBASE_ prefix on all #defines set(HAVE_UCONTEXT_H ON) check_struct_has_member("struct _libc_fpstate" mxcsr ucontext.h ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT) if(NOT ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT) check_include_files(asm/sigcontext.h ILMBASE_HAVE_SIGCONTEXT_H) if(ILMBASE_HAVE_SIGCONTEXT_H) check_struct_has_member("struct _fpstate" mxcsr asm/sigcontext.h ILMBASE_HAVE_SIGCONTEXT_CONTROL_REGISTER_SUPPORT) endif() endif() endif() ###check_include_files(pthread.h ILMBASE_HAVE_PTHREAD) if(Threads_FOUND) if(CMAKE_HAVE_PTHREAD_H OR CMAKE_USE_PTHREADS_INIT OR CMAKE_HP_PTHREAD_INIT) set(ILMBASE_HAVE_PTHREAD ON) # TODO: remove this once we cleanly have ILMBASE_ prefix on all #defines set(HAVE_PTHREAD ON) endif() # we have threads, but do we have posix semaphores for sem_init? # should be in pthreads if(NOT (APPLE OR (WIN32 AND (NOT MINGW)))) if(MINGW) check_include_files("pthread_unistd.h;semaphore.h" ILMBASE_HAVE_SEMAPHORE_H) else() check_include_files(semaphore.h ILMBASE_HAVE_SEMAPHORE_H) endif() if(ILMBASE_HAVE_SEMAPHORE_H AND ILMBASE_HAVE_PTHREAD) # should just be in libc, so no need for check_library_exists set(CMAKE_REQUIRED_FLAGS ${CMAKE_THREAD_LIBS_INIT}) check_library_exists(pthread sem_init "" ILMBASE_HAVE_POSIX_SEMAPHORES) # TODO: remove this once we cleanly have ILMBASE_ prefix on all #defines if(ILMBASE_HAVE_POSIX_SEMAPHORES) set(HAVE_POSIX_SEMAPHORES ON) endif() set(CMAKE_REQUIRED_FLAGS) endif() endif() endif() if (ILMBASE_ENABLE_LARGE_STACK) set(ILMBASE_HAVE_LARGE_STACK ON) endif() configure_file(IlmBaseConfig.h.in_cmake ${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfig.h) configure_file(IlmBaseConfigInternal.h.in_cmake ${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfigInternal.h) add_library(IlmBaseConfig INTERFACE) target_include_directories(IlmBaseConfig INTERFACE $ $ $) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfig.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${ILMBASE_OUTPUT_SUBDIR} ) install(TARGETS IlmBaseConfig EXPORT ${PROJECT_NAME}) add_library(IlmBase::Config ALIAS IlmBaseConfig) if(ILMBASE_INSTALL_PKG_CONFIG) # use a helper function to avoid variable pollution, but pretty simple function(ilmbase_pkg_config_help pcinfile) set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix "\${prefix}") set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) set(LIB_SUFFIX_DASH ${ILMBASE_LIB_SUFFIX}${CMAKE_${uppercase_CMAKE_BUILD_TYPE}_POSTFIX}) if(TARGET Threads::Threads) # hrm, can't use properties as they end up as generator expressions # which don't seem to evaluate if(THREADS_HAVE_PTHREAD_ARG) set(PTHREAD_CFLAGS "-pthread") endif() set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT}) endif() string(REPLACE ".in" "" pcout ${pcinfile}) configure_file(${pcinfile} ${CMAKE_CURRENT_BINARY_DIR}/${pcout} @ONLY) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${pcout} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) endfunction() ilmbase_pkg_config_help(../IlmBase.pc.in) else() message(NOTICE "-- WARNING pkg-config generation disabled") endif() # The main export of the configuration - This is the # moral equivalent of a pkg-config file for cmake # and replaces the Find*.cmake of the "old" cmake include(CMakePackageConfigHelpers) configure_package_config_file(IlmBaseConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" VERSION ${ILMBASE_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) install(EXPORT ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} FILE ${PROJECT_NAME}Targets.cmake NAMESPACE ${PROJECT_NAME}:: EXPORT_LINK_INTERFACE_LIBRARIES ) openexr-2.5.7/IlmBase/config/IlmBaseConfig.cmake.in000066400000000000000000000001751406177042200220450ustar00rootroot00000000000000@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") check_required_components("@PROJECT_NAME@") openexr-2.5.7/IlmBase/config/IlmBaseConfig.h.in000066400000000000000000000034431406177042200212150ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // This file is auto-generated by the configure step #ifndef INCLUDED_ILMBASE_CONFIG_H #define INCLUDED_ILMBASE_CONFIG_H 1 #pragma once // // Define and set to 1 if the target system has c++11/14 support // and you want IlmBase to NOT use it's features // #undef ILMBASE_FORCE_CXX03 // // Define and set to 1 if the target system has POSIX thread support // and you want IlmBase to use it for multithreaded file I/O. // #undef HAVE_PTHREAD // // Define and set to 1 if the target system supports POSIX semaphores // and you want OpenEXR to use them; otherwise, OpenEXR will use its // own semaphore implementation. // #undef HAVE_POSIX_SEMAPHORES // // Define and set to 1 if the target system has support for large // stack sizes. // #undef ILMBASE_HAVE_LARGE_STACK // // Current (internal) library namepace name and corresponding public // client namespaces. // #undef ILMBASE_INTERNAL_NAMESPACE_CUSTOM #undef IMATH_INTERNAL_NAMESPACE #undef IEX_INTERNAL_NAMESPACE #undef ILMTHREAD_INTERNAL_NAMESPACE #undef ILMBASE_NAMESPACE_CUSTOM #undef IMATH_NAMESPACE #undef IEX_NAMESPACE #undef ILMTHREAD_NAMESPACE // // Define and set to 1 if the target system has support for large // stack sizes. // #undef ILMBASE_HAVE_LARGE_STACK // // Version information // #undef ILMBASE_VERSION_STRING #undef ILMBASE_PACKAGE_STRING #undef ILMBASE_VERSION_MAJOR #undef ILMBASE_VERSION_MINOR #undef ILMBASE_VERSION_PATCH // Version as a single hex number, e.g. 0x01000300 == 1.0.3 #define ILMBASE_VERSION_HEX ((uint32_t(ILMBASE_VERSION_MAJOR) << 24) | \ (uint32_t(ILMBASE_VERSION_MINOR) << 16) | \ (uint32_t(ILMBASE_VERSION_PATCH) << 8)) #endif // INCLUDED_ILMBASE_CONFIG_H openexr-2.5.7/IlmBase/config/IlmBaseConfig.h.in_cmake000066400000000000000000000032611406177042200223530ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // This file is auto-generated by the cmake configure step #ifndef INCLUDED_ILMBASE_CONFIG_H #define INCLUDED_ILMBASE_CONFIG_H 1 #pragma once // // Options / configuration based on O.S. / compiler ///////////////////// #cmakedefine HAVE_PTHREAD 1 #cmakedefine HAVE_POSIX_SEMAPHORES 1 // // Define and set to 1 if the target system has support for large // stack sizes. // #cmakedefine ILMBASE_HAVE_LARGE_STACK ////////////////////// // // C++ namespace configuration / options // Current (internal) library namepace name and corresponding public // client namespaces. #define ILMBASE_INTERNAL_NAMESPACE_CUSTOM @ILMBASE_NAMESPACE_CUSTOM@ #define IMATH_INTERNAL_NAMESPACE @ILMBASE_INTERNAL_IMATH_NAMESPACE@ #define IEX_INTERNAL_NAMESPACE @ILMBASE_INTERNAL_IEX_NAMESPACE@ #define ILMTHREAD_INTERNAL_NAMESPACE @ILMBASE_INTERNAL_ILMTHREAD_NAMESPACE@ #define ILMBASE_NAMESPACE_CUSTOM @ILMBASE_NAMESPACE_CUSTOM@ #define IMATH_NAMESPACE @ILMBASE_IMATH_NAMESPACE@ #define IEX_NAMESPACE @ILMBASE_IEX_NAMESPACE@ #define ILMTHREAD_NAMESPACE @ILMBASE_ILMTHREAD_NAMESPACE@ // // Version information // #define ILMBASE_VERSION_STRING "@ILMBASE_VERSION@" #define ILMBASE_PACKAGE_STRING "@ILMBASE_PACKAGE_NAME@" #define ILMBASE_VERSION_MAJOR @ILMBASE_VERSION_MAJOR@ #define ILMBASE_VERSION_MINOR @ILMBASE_VERSION_MINOR@ #define ILMBASE_VERSION_PATCH @ILMBASE_VERSION_PATCH@ #define ILMBASE_VERSION_HEX ((uint32_t(ILMBASE_VERSION_MAJOR) << 24) | \ (uint32_t(ILMBASE_VERSION_MINOR) << 16) | \ (uint32_t(ILMBASE_VERSION_PATCH) << 8)) #endif // INCLUDED_ILMBASE_CONFIG_H openexr-2.5.7/IlmBase/config/IlmBaseConfigInternal.h.in000066400000000000000000000003201406177042200227010ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // #pragma once // // Dealing with FPEs // #undef HAVE_UCONTEXT_H #undef ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT openexr-2.5.7/IlmBase/config/IlmBaseConfigInternal.h.in_cmake000066400000000000000000000004311406177042200240440ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. #pragma once // // Dealing with FPEs // #cmakedefine HAVE_UCONTEXT_H 1 #cmakedefine ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT 1 #cmakedefine ILMBASE_HAVE_SIGCONTEXT_CONTROL_REGISTER_SUPPORT 1 openexr-2.5.7/IlmBase/config/IlmBaseSetup.cmake000066400000000000000000000137101406177042200213320ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. include(GNUInstallDirs) ######################## ## Target configuration # This is primarily for the halfFunction code that enables a stack # object (if you enable this) that contains a LUT of the function option(ILMBASE_ENABLE_LARGE_STACK "Enables code to take advantage of large stack support" OFF) # What C++ standard to compile for # VFX Platform 18 is c++14, so let's enable that by default set(tmp 14) if(CMAKE_CXX_STANDARD) set(tmp ${CMAKE_CXX_STANDARD}) endif() set(OPENEXR_CXX_STANDARD "${tmp}" CACHE STRING "C++ standard to compile against") set(tmp) # Namespace-related settings, allows one to customize the # namespace generated, and to version the namespaces set(ILMBASE_NAMESPACE_CUSTOM "0" CACHE STRING "Whether the namespace has been customized (so external users know)") set(ILMBASE_INTERNAL_IMATH_NAMESPACE "Imath_${ILMBASE_VERSION_API}" CACHE STRING "Real namespace for Imath that will end up in compiled symbols") set(ILMBASE_INTERNAL_IEX_NAMESPACE "Iex_${ILMBASE_VERSION_API}" CACHE STRING "Real namespace for Iex that will end up in compiled symbols") set(ILMBASE_INTERNAL_ILMTHREAD_NAMESPACE "IlmThread_${ILMBASE_VERSION_API}" CACHE STRING "Real namespace for IlmThread that will end up in compiled symbols") set(ILMBASE_IMATH_NAMESPACE "Imath" CACHE STRING "Public namespace alias for Imath") set(ILMBASE_IEX_NAMESPACE "Iex" CACHE STRING "Public namespace alias for Iex") set(ILMBASE_ILMTHREAD_NAMESPACE "IlmThread" CACHE STRING "Public namespace alias for IlmThread") set(ILMBASE_PACKAGE_NAME "IlmBase ${ILMBASE_VERSION}" CACHE STRING "Public string / label for displaying package") # Whether to generate and install a pkg-config file IlmBase.pc on if(WIN32) option(ILMBASE_INSTALL_PKG_CONFIG "Install IlmBase.pc file" OFF) else() option(ILMBASE_INSTALL_PKG_CONFIG "Install IlmBase.pc file" ON) endif() ######################## ## Build related options # This is a variable here for use in install lines. Care must be taken # when changing this, as many things assume this is OpenEXR set(ILMBASE_OUTPUT_SUBDIR OpenEXR CACHE STRING "Destination sub-folder of the include path for install") # This does not seem to be available as a per-target property, # but is pretty harmless to set globally set(CMAKE_INCLUDE_CURRENT_DIR ON) # Suffix for debug configuration libraries # (if you should choose to install those) set(CMAKE_DEBUG_POSTFIX "_d" CACHE STRING "Suffix for debug builds") # Usual cmake option to build shared libraries or not option(BUILD_SHARED_LIBS "Build shared library" ON) # This allows a "double library" setup, where we compile both # a dynamic and shared library option(ILMBASE_BUILD_BOTH_STATIC_SHARED "Build both static and shared libraries in one step (otherwise follows BUILD_SHARED_LIBS)" OFF) if (ILMBASE_BUILD_BOTH_STATIC_SHARED) set(BUILD_SHARED_LIBS ON) endif() # Suffix to append to root name, this helps with version management # but can be turned off if you don't care, or otherwise customized set(ILMBASE_LIB_SUFFIX "-${ILMBASE_VERSION_API}" CACHE STRING "string added to the end of all the libraries") # when building both dynamic and static, the additional string to # add to the library name, such that to get static linkage, you # would use -lImath_static (or target_link_libraries(xxx IlmBase::Imath_static)) set(ILMBASE_STATIC_LIB_SUFFIX "_static" CACHE STRING "When building both static and shared, name to append to static library (in addition to normal suffix)") # rpath related setup # make sure we force an rpath to the rpath we're compiling set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # adds the automatically determined parts of the rpath # which point to directories outside the build tree to the install RPATH set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) if(APPLE) set(CMAKE_MACOSX_RPATH ON) endif() # if the user sets an install rpath # then just use that, or otherwise set one for them if(NOT CMAKE_INSTALL_RPATH) list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) if("${isSystemDir}" STREQUAL "-1") if("${CMAKE_SYSTEM}" MATCHES "Linux") get_filename_component(tmpSysPath "${CMAKE_INSTALL_FULL_LIBDIR}" NAME) if(NOT tmpSysPath) set(tmpSysPath "lib") endif() set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../${tmpSysPath};${CMAKE_INSTALL_FULL_LIBDIR}") set(tmpSysPath) elseif(APPLE) set(CMAKE_INSTALL_RPATH "@loader_path/../lib;@executable_path/../lib;${CMAKE_INSTALL_FULL_LIBDIR}") else() set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") endif() endif() set(isSystemDir) endif() ######################## # set a default build type if not set if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() # Code check related features option(OPENEXR_USE_CLANG_TIDY "Check if clang-tidy is available, and enable that" OFF) if(OPENEXR_USE_CLANG_TIDY) find_program(OPENEXR_CLANG_TIDY_BIN clang-tidy) if(OPENEXR_CLANG_TIDY_BIN-NOTFOUND) message(FATAL_ERROR "clang-tidy processing requested, but no clang-tidy found") endif() # TODO: Need to define the list of valid checks and add a file with said list set(CMAKE_CXX_CLANG_TIDY ${OPENEXR_CLANG_TIDY_BIN}; -header-filter=.; -checks=*; ) endif() ############################### # Dependent libraries # so we know how to link / use threads and don't have to have a -pthread # everywhere... if(NOT TARGET Threads::Threads) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads) if(NOT Threads_FOUND) message(FATAL_ERROR "Unable to find a threading library which is required for IlmThread") endif() endif() openexr-2.5.7/IlmBase/config/LibraryDefine.cmake000066400000000000000000000137451406177042200215240ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # NB: This function has a number if IlmBase specific names / variables # in it, so be careful copying... function(ILMBASE_DEFINE_LIBRARY libname) set(options) set(oneValueArgs PRIV_EXPORT CURDIR CURBINDIR) set(multiValueArgs SOURCES HEADERS DEPENDENCIES PRIVATE_DEPS) cmake_parse_arguments(ILMBASE_CURLIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) # only do the object library mechanism in a few cases: # - xcode doesn't handle "empty" targets (i.e. add_library with # an object lib only) # - if we're not compiling both, don't add the extra layer to prevent # extra compiles since we aren't doing that anyway if(ILMBASE_BUILD_BOTH_STATIC_SHARED AND NOT (APPLE OR WIN32)) set(use_objlib TRUE) else() set(use_objlib) endif() if (MSVC) set(_ilmbase_extra_flags "/EHsc") endif() if(use_objlib) set(objlib ${libname}_Object) add_library(${objlib} OBJECT ${ILMBASE_CURLIB_HEADERS} ${ILMBASE_CURLIB_SOURCES}) else() set(objlib ${libname}) add_library(${objlib} ${ILMBASE_CURLIB_HEADERS} ${ILMBASE_CURLIB_SOURCES}) endif() target_compile_features(${objlib} PUBLIC cxx_std_${OPENEXR_CXX_STANDARD}) if(ILMBASE_CURLIB_PRIV_EXPORT AND BUILD_SHARED_LIBS) target_compile_definitions(${objlib} PRIVATE ${ILMBASE_CURLIB_PRIV_EXPORT}) if(WIN32 AND NOT ILMBASE_BUILD_BOTH_STATIC_SHARED) target_compile_definitions(${objlib} PUBLIC OPENEXR_DLL) endif() endif() if(ILMBASE_CURLIB_CURDIR) target_include_directories(${objlib} INTERFACE $) endif() if(ILMBASE_CURLIB_CURBINDIR) target_include_directories(${objlib} PRIVATE $) endif() target_link_libraries(${objlib} PUBLIC ${PROJECT_NAME}::Config ${ILMBASE_CURLIB_DEPENDENCIES}) if(ILMBASE_CURLIB_PRIVATE_DEPS) target_link_libraries(${objlib} PRIVATE ${ILMBASE_CURLIB_PRIVATE_DEPS}) endif() set_target_properties(${objlib} PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON ) if (_ilmbase_extra_flags) target_compile_options(${objlib} PUBLIC ${_ilmbase_extra_flags}) endif() set_property(TARGET ${objlib} PROPERTY PUBLIC_HEADER ${ILMBASE_CURLIB_HEADERS}) if(use_objlib) install(TARGETS ${objlib} EXPORT ${PROJECT_NAME} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${ILMBASE_OUTPUT_SUBDIR} ) endif() # let the default behaviour BUILD_SHARED_LIBS control the # disposition of the default library... if(use_objlib) add_library(${libname} $) target_link_libraries(${libname} PUBLIC ${objlib}) endif() if(BUILD_SHARED_LIBS) set_target_properties(${libname} PROPERTIES SOVERSION ${ILMBASE_SOVERSION} VERSION ${ILMBASE_LIB_VERSION} ) endif() set_target_properties(${libname} PROPERTIES OUTPUT_NAME "${libname}${ILMBASE_LIB_SUFFIX}" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) add_library(${PROJECT_NAME}::${libname} ALIAS ${libname}) install(TARGETS ${libname} EXPORT ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${ILMBASE_OUTPUT_SUBDIR} ) if(BUILD_SHARED_LIBS AND (NOT "${ILMBASE_LIB_SUFFIX}" STREQUAL "") AND NOT WIN32) string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) set(verlibname ${CMAKE_SHARED_LIBRARY_PREFIX}${libname}${ILMBASE_LIB_SUFFIX}${CMAKE_${uppercase_CMAKE_BUILD_TYPE}_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}) set(baselibname ${CMAKE_SHARED_LIBRARY_PREFIX}${libname}${CMAKE_${uppercase_CMAKE_BUILD_TYPE}_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}) install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E chdir \"\$ENV\{DESTDIR\}${CMAKE_INSTALL_FULL_LIBDIR}\" ${CMAKE_COMMAND} -E create_symlink ${verlibname} ${baselibname})") install(CODE "message(\"-- Creating symlink in ${CMAKE_INSTALL_FULL_LIBDIR} ${baselibname} -> ${verlibname}\")") set(verlibname) set(baselibname) endif() if(ILMBASE_BUILD_BOTH_STATIC_SHARED) if(use_objlib) add_library(${libname}_static STATIC $) target_link_libraries(${libname}_static INTERFACE ${objlib}) else() # have to build multiple times... but have different flags anyway (i.e. no dll) target_compile_definitions(${libname} PRIVATE OPENEXR_DLL) set(curlib ${libname}_static) add_library(${curlib} STATIC ${ILMBASE_CURLIB_SOURCES}) target_compile_features(${curlib} PUBLIC cxx_std_${OPENEXR_CXX_STANDARD}) if(ILMBASE_CURLIB_CURDIR) target_include_directories(${curlib} INTERFACE $) endif() if(ILMBASE_CURLIB_CURBINDIR) target_include_directories(${curlib} PRIVATE $) endif() target_link_libraries(${curlib} PUBLIC ${PROJECT_NAME}::Config ${ILMBASE_CURLIB_DEPENDENCIES}) if(ILMBASE_CURLIB_PRIVATE_DEPS) target_link_libraries(${curlib} PRIVATE ${ILMBASE_CURLIB_PRIVATE_DEPS}) endif() set(curlib) endif() set_target_properties(${libname}_static PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON SOVERSION ${ILMBASE_SOVERSION} VERSION ${ILMBASE_LIB_VERSION} OUTPUT_NAME "${libname}${ILMBASE_LIB_SUFFIX}${ILMBASE_STATIC_LIB_SUFFIX}" ) add_library(${PROJECT_NAME}::${libname}_static ALIAS ${libname}_static) install(TARGETS ${libname}_static EXPORT ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) endif() endfunction() openexr-2.5.7/IlmBase/config/Makefile.am000066400000000000000000000007301406177042200200250ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in configincludedir = $(includedir)/OpenEXR nodist_configinclude_HEADERS = IlmBaseConfig.h IlmBaseConfigInternal.h EXTRA_DIST = IlmBaseConfig.h.in IlmBaseConfig.h.in_cmake \ IlmBaseConfigInternal.h.in IlmBaseConfigInternal.h.in_cmake \ CMakeLists.txt IlmBaseSetup.cmake LibraryDefine.cmake \ ParseConfigure.cmake openexr-2.5.7/IlmBase/config/ParseConfigure.cmake000066400000000000000000000022341406177042200217100ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. file(READ configure.ac CONFIGURE_AC_CONTENTS) string(REGEX MATCH "AC_INIT\\(IlmBase,[ ]*([0-9]+).([0-9]+).([0-9]+)" DUMMY ${CONFIGURE_AC_CONTENTS}) set(ILMBASE_VERSION_MAJOR ${CMAKE_MATCH_1}) set(ILMBASE_VERSION_MINOR ${CMAKE_MATCH_2}) set(ILMBASE_VERSION_PATCH ${CMAKE_MATCH_3}) set(ILMBASE_VERSION ${ILMBASE_VERSION_MAJOR}.${ILMBASE_VERSION_MINOR}.${ILMBASE_VERSION_PATCH}) set(ILMBASE_VERSION_API ${ILMBASE_VERSION_MAJOR}_${ILMBASE_VERSION_MINOR}) string(REGEX MATCH "LIBTOOL_CURRENT=([0-9]+)" DUMMY ${CONFIGURE_AC_CONTENTS}) set(ILMBASE_SOCURRENT ${CMAKE_MATCH_1}) string(REGEX MATCH "LIBTOOL_REVISION=([0-9]+)" DUMMY ${CONFIGURE_AC_CONTENTS}) set(ILMBASE_SOREVISION ${CMAKE_MATCH_1}) string(REGEX MATCH "LIBTOOL_AGE=([0-9]+)" DUMMY ${CONFIGURE_AC_CONTENTS}) set(ILMBASE_SOAGE ${CMAKE_MATCH_1}) math(EXPR ILMBASE_SOVERSION "${ILMBASE_SOCURRENT} - ${ILMBASE_SOAGE}") set(ILMBASE_LIB_VERSION "${ILMBASE_SOVERSION}.${ILMBASE_SOAGE}.${ILMBASE_SOREVISION}") message(STATUS "Configure ILMBASE Version: ${ILMBASE_VERSION} Lib API: ${ILMBASE_LIB_VERSION}") unset(CONFIGURE_AC_CONTENTS) openexr-2.5.7/IlmBase/configure.ac000066400000000000000000000311701406177042200170140ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl dnl Process this file with autoconf to produce a configure script. AC_INIT(IlmBase, 2.5.7) AC_SUBST(ILMBASE_VERSION_MAJOR, 2) AC_SUBST(ILMBASE_VERSION_MINOR, 5) AC_SUBST(ILMBASE_VERSION_PATCH, 7) AC_SUBST(ILMBASE_VERSION, ${ILMBASE_VERSION_MAJOR}.${ILMBASE_VERSION_MINOR}.${ILMBASE_VERSION_PATCH}) AC_SUBST(ILMBASE_VERSION_API, ${ILMBASE_VERSION_MAJOR}_${ILMBASE_VERSION_MINOR}) AC_CANONICAL_HOST AC_CONFIG_SRCDIR(ImathTest/main.cpp) AC_CONFIG_HEADER(config/IlmBaseConfig.h) AC_CONFIG_HEADER(config/IlmBaseConfigInternal.h) AM_INIT_AUTOMAKE(1.6.3) dnl Require automake 1.6.3 or better AM_MAINTAINER_MODE LIBTOOL_CURRENT=25 LIBTOOL_REVISION=6 LIBTOOL_AGE=0 LIBTOOL_VERSION=$LIBTOOL_CURRENT:$LIBTOOL_REVISION:$LIBTOOL_AGE AC_SUBST(LIBTOOL_VERSION) dnl Checks for programs. AC_PROG_CXX AC_PROG_INSTALL AC_PROG_CC AC_PROG_LN_S AC_PROG_LIBTOOL AC_PROG_MAKE_SET dnl dnl PKGCONFIG preparations dnl if test -z "${PKG_CONFIG_PATH}"; then PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig fi export PKG_CONFIG_PATH dnl Enable and choose c++ standard AC_ARG_ENABLE(cxxstd, AC_HELP_STRING([--enable-cxxstd=14], [enable ISO c++ standard 11/14 [[default=auto]]]), [cxxstd="${enableval}"], [cxxstd=14]) if test "${cxxstd}" = 17 ; then AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) CXXFLAGS="$CXXFLAGS -std=c++17" else if test "${cxxstd}" = 14 ; then AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory]) CXXFLAGS="$CXXFLAGS -std=c++14" else if test "${cxxstd}" = 11 ; then AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) CXXFLAGS="$CXXFLAGS -std=c++11" else if test "${cxxstd}" = 03 ; then AC_DEFINE(ILMBASE_FORCE_CXX03) CXXFLAGS="$CXXFLAGS -std=c++03" else dnl automatically determine... AX_CXX_COMPILE_STDCXX([11], [noext], [optional]) AX_CXX_COMPILE_STDCXX([14], [noext], [optional]) AX_CXX_COMPILE_STDCXX([17], [noext], [optional]) if test "$HAVE_CXX14" = 1 ; then CXXFLAGS="$CXXFLAGS -std=c++14" cxxstd = 14 else if test "$HAVE_CXX11" = 1 ; then CXXFLAGS="$CXXFLAGS -std=c++11" cxxstd = 11 fi fi fi fi fi fi dnl Checks for libraries. dnl --enable-threading AC_ARG_ENABLE(threading, AC_HELP_STRING([--enable-threading], [enable multi-threading [[default=yes]]]), [multithread="${enableval}"], [multithread=yes]) if test "${multithread}" != no ; then ACX_PTHREAD( [ AC_DEFINE(HAVE_PTHREAD) LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" AM_POSIX_SEM() ], [AC_MSG_ERROR([POSIX thread support required])]) AC_MSG_NOTICE([multithread true, LIBS = $LIBS, CC = $CC, CXXFLAGS = $CXXFLAGS]) fi dnl dnl Checks for header files. dnl AC_HEADER_STDC AC_CHECK_HEADERS(limits.h unistd.h ucontext.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T dnl Checks for library functions. AC_CHECK_FUNCS(strerror) dnl dnl Checks for std::right etc. in iomanip dnl AC_MSG_CHECKING(for complete iomanip support in C++ standard library) complete_iomanip="no" AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include ],[ std::right; ], AC_DEFINE(HAVE_COMPLETE_IOMANIP) complete_iomanip=yes) AC_MSG_RESULT($complete_iomanip) dnl dnl Checks for dealing with fpe handling dnl AC_MSG_CHECKING(for fpe support handling) control_register_support="no" AC_TRY_COMPILE([ #include #include ],[ ucontext_t ucon; uint32_t mxcsr = ucon.uc_mcontext.fpregs->mxcsr; uint16_t cw = ucon.uc_mcontext.fpregs->cwd; ], AC_DEFINE(ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT) control_register_support=yes) AC_MSG_RESULT($control_register_support) AC_LANG_RESTORE dnl --enable-large-stack case "$host" in *linux*) AC_ARG_ENABLE(large-stack, AC_HELP_STRING([--enable-large-stack], [enable optimizations for systems that support large stack sizes [[default=yes]]]), [large_stack="${enableval}"], [large_stack=yes]) ;; *) AC_ARG_ENABLE(large-stack, AC_HELP_STRING([--enable-large-stack], [enable optimizations for systems that support large stack sizes [[default=no]]]), [large_stack="${enableval}"], [large_stack=no]) ;; esac if test "x${large_stack}" != xno ; then AC_DEFINE(ILMBASE_HAVE_LARGE_STACK) fi dnl Define the version string AC_DEFINE_UNQUOTED(ILMBASE_VERSION_STRING, "${VERSION}") AC_DEFINE_UNQUOTED(ILMBASE_PACKAGE_STRING, "${PACKAGE_STRING}") AC_DEFINE_UNQUOTED(ILMBASE_VERSION_MAJOR, ${ILMBASE_VERSION_MAJOR}) AC_DEFINE_UNQUOTED(ILMBASE_VERSION_MINOR, ${ILMBASE_VERSION_MINOR}) AC_DEFINE_UNQUOTED(ILMBASE_VERSION_PATCH, ${ILMBASE_VERSION_PATCH}) AC_MSG_CHECKING(for gcc optimization flags) old_cflags=$CFLAGS CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE([#include ], [ printf ("hello, world"); ], [ EXTRA_OPT_CFLAGS="-pipe"],[ EXTRA_OPT_CFLAGS=""]) CFLAGS=$old_cflags AC_MSG_RESULT([$EXTRA_OPT_CFLAGS]) dnl dnl Handle namespacing configuration : internal library namespace dnl public namespace dnl library_namespace_versioning="yes" AC_ARG_ENABLE(namespaceversioning, AC_HELP_STRING([--enable-namespaceversioning], [enable symbol versioning via versioned/custom namespace to prevent runtime conflicts [[default=yes]]] ), [library_namespace_versioning="${enableval}"], [library_namespace_versioning=yes]) dnl Suffix for the shared library via the '-release' option LIB_SUFFIX="" lib_suffix_valid="no" dnl Internal library namespace dnl lib_namespace="" if test "x${library_namespace_versioning}" == xyes ; then AC_DEFINE_UNQUOTED(IMATH_INTERNAL_NAMESPACE, Imath_${ILMBASE_VERSION_API}) AC_DEFINE_UNQUOTED(IEX_INTERNAL_NAMESPACE, Iex_${ILMBASE_VERSION_API}) AC_DEFINE_UNQUOTED(ILMTHREAD_INTERNAL_NAMESPACE, IlmThread_${ILMBASE_VERSION_API}) AC_DEFINE(ILMBASE_INTERNAL_NAMESPACE_CUSTOM) lib_namespace="${ILMBASE_VERSION_API}" LIB_SUFFIX="${ILMBASE_VERSION_API}" lib_suffix_valid="yes" elif test "x${library_namespace_versioning}" == xno ; then AC_DEFINE_UNQUOTED(IMATH_INTERNAL_NAMESPACE, Imath) AC_DEFINE_UNQUOTED(IEX_INTERNAL_NAMESPACE, Iex) AC_DEFINE_UNQUOTED(ILMTHREAD_INTERNAL_NAMESPACE, IlmThread) lib_namespace="" else AC_DEFINE_UNQUOTED(IMATH_INTERNAL_NAMESPACE, Imath_${library_namespace_versioning}) AC_DEFINE_UNQUOTED(IEX_INTERNAL_NAMESPACE, Iex_${library_namespace_versioning}) AC_DEFINE_UNQUOTED(ILMTHREAD_INTERNAL_NAMESPACE, IlmThread_${library_namespace_versioning}) AC_DEFINE(ILMBASE_INTERNAL_NAMESPACE_CUSTOM) lib_namespace="${library_namespace_versioning}" LIB_SUFFIX="${library_namespace_versioning}" lib_suffix_valid="yes" fi AC_SUBST(LIB_SUFFIX) if test "x${lib_suffix_valid}" == xyes ; then AC_SUBST(LIB_SUFFIX_DASH,"-${LIB_SUFFIX}") AM_CONDITIONAL(LIB_SUFFIX_EXISTS,true) else AC_SUBST(LIB_SUFFIX_DASH,"") AM_CONDITIONAL(LIB_SUFFIX_EXISTS,false) fi dnl Public User namespace dnl custom_public_namespace="no" public_namespace="" AC_ARG_ENABLE(customusernamespace, AC_HELP_STRING([--enable-customusernamespace], [user namespace; this is the namespace into which the library namespace will be exported to [[default=Imf]]] ), [custom_public_namespace="${enableval}"], [custom_public_namespace=no]) if test "x${custom_public_namespace}" = xyes ; then AC_MSG_WARN([Enabling 'custom user namespace' requires an additional argument, reverting to default]) AC_DEFINE(IMATH_NAMESPACE, Imath) AC_DEFINE(IEX_NAMESPACE, Iex) AC_DEFINE(ILMTHREAD_NAMESPACE, IlmThread) public_namespace="" custom_public_namespace=no elif test "x${custom_public_namespace}" = xno ; then AC_DEFINE(IMATH_NAMESPACE, Imath) AC_DEFINE(IEX_NAMESPACE, Iex) AC_DEFINE(ILMTHREAD_NAMESPACE, IlmThread) public_namespace="" else AC_DEFINE_UNQUOTED(IMATH_NAMESPACE, Imath_${custom_public_namespace}) AC_DEFINE_UNQUOTED(IEX_NAMESPACE, Iex_${custom_public_namespace}) AC_DEFINE_UNQUOTED(ILMTHREAD_NAMESPACE, IlmThread_${custom_public_namespace}) AC_DEFINE(ILMBASE_NAMESPACE_CUSTOM) public_namespace=${custom_public_namespace} fi dnl Platform-specific stuff case "$host" in *darwin*) dnl Compiler flags for all OS X builds dnl OSX architectures specification dnl NOTE: multiple architectures requires --disable-dependency-tracking dnl For more information: http://developer.apple.com/documentation/Porting/Conceptual/PortingUNIX/compiling/chapter_4_section_3.html AC_ARG_ENABLE(osx-arch, AC_HELP_STRING([--enable-osx-arch], [specify the architecture(s) for OS X builds. Ex: --enable-osx-arch="ppc i386"]), [osx_arch="${enableval}"], [osx_arch=default]) if test "${osx_arch}" != default ; then osx_arch_flags=$(printf ' -arch %s' ${osx_arch}) CXXFLAGS="$CXXFLAGS $osx_arch_flags" dnl If multiple archs specified, make sure that --disable-dependency-tracking was also specified if test "$enable_dependency_tracking" != no ; then if echo "$osx_arch" | grep >/dev/null " " ; then AC_MSG_ERROR([building multiple OS X architectures requires --disable-dependency-tracking. Please re-run configure with these options: --enable-osx-arch="${osx_arch}" --disable-dependency-tracking ]) fi fi fi dnl OSX SDK specification AC_ARG_ENABLE(osx-sdk, AC_HELP_STRING([--enable-osx-sdk], [specify the sdk (sysroot) for use with OS X. Ex: --enable-osx-sdk=MacOSX10.5]), [osx_sdk="${enableval}"], [osx_sdk=default]) if test "${osx_sdk}" != default ; then CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/${osx_sdk}" fi dnl OS X universal binary support, requires --disable-dependency-tracking dnl NOTE: this argument is obsolete, and has been replaced by --enable-osx-sdk and --enable-osx-arch dnl This is equivalent to --enable-osx-sdk=MacOSX10.4u.sdk --enable-osx-arch="ppc i386" AC_ARG_ENABLE(osx-universal-binaries, AC_HELP_STRING([--enable-osx-universal-binaries], [build two-way universal (ppc, i386) binaries on OS X. OBSOLETE: Consider using --enable-osx-sdk and --enable-osx-arch instead. [[default=no]]]), [build_osxuniversal="${enableval}"], [build_osxuniversal=no]) if test "${build_osxuniversal}" != no ; then if test "$enable_dependency_tracking" != no ; then AC_MSG_ERROR([--enable-osx-universal-binary requires --disable-dependency-tracking. Please re-run configure with these options: --disable-dependency-tracking --enable-osx-universal-binary ]) fi CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" dnl LDFLAGS="$LDFLAGS -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" fi ;; esac AM_CFLAGS="$EXTRA_OPT_CFLAGS" AM_CXXFLAGS="$EXTRA_OPT_CFLAGS" AC_SUBST(AM_CFLAGS) AC_SUBST(AM_CXXFLAGS) AC_SUBST(HAVE_UCONTEXT_H) AC_OUTPUT([ Makefile IlmBase.pc config/Makefile Half/Makefile HalfTest/Makefile Iex/Makefile IexMath/Makefile IexTest/Makefile IlmThread/Makefile Imath/Makefile ImathTest/Makefile ]) dnl dnl Summary Configuration Messages dnl AC_MSG_RESULT([ --------------------------------------------- Summary for IlmBase features: enable large stack optimizations $large_stack ISO C++ Standard $cxxstd]) if test "x${library_namespace_versioning}" != xno ; then AC_MSG_RESULT([ internal library namespaces Imath_$lib_namespace Iex_$lib_namespace IlmThread_$lib_namespace]) else AC_MSG_RESULT([ internal library namespaces Imath Iex IlmThread]) fi if test "x${custom_public_namespace}" != xno ; then AC_MSG_RESULT([ public namespaces Imath_$public_namespace Iex_$public_namespace IlmThread_$public_namespace]) else AC_MSG_RESULT([ public namespaces Imath Iex IlmThread]) fi if test "$osx_arch"; then AC_MSG_RESULT([ OS X architectures $osx_arch OS X SDK $osx_sdk OS X two-way universal build (deprecated) $build_osxuniversal]) fi AC_MSG_RESULT([ --------------------------------------------- ]) openexr-2.5.7/IlmBase/m4/000077500000000000000000000000001406177042200150445ustar00rootroot00000000000000openexr-2.5.7/IlmBase/m4/ax_cxx_compile_stdcxx.m4000066400000000000000000000474241406177042200217200ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and # CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) # or '14' (for the C++14 standard). # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is # required and that the macro should error out if no mode with that # support is found. If specified 'optional', then configuration proceeds # regardless, after defining HAVE_CXX${VERSION} if and only if a # supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016 Krzesimir Nowak # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). AX_REQUIRE_DEFINED([AC_MSG_WARN]) AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], [$2], [noext], [], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [ax_cv_cxx_compile_cxx$1=yes], [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes fi m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) m4_if([$2], [ext], [], [dnl if test x$ac_success = xno; then dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx$1_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi fi if test x$ac_success = xno; then HAVE_CXX$1=0 AC_MSG_NOTICE([No compiler with C++$1 support was found]) else HAVE_CXX$1=1 AC_DEFINE(HAVE_CXX$1,1, [define if the compiler supports basic C++$1 syntax]) fi AC_SUBST(HAVE_CXX$1) m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])]) ]) dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 ) dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual void f() {} }; struct Derived : public Base { virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L ]]) dnl Tests for new features in C++14 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L ]]) dnl Tests for new features in C++17 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus <= 201402L #error "This is not a C++17 compiler" #else #if defined(__clang__) #define REALLY_CLANG #else #if defined(__GNUC__) #define REALLY_GCC #endif #endif #include #include #include namespace cxx17 { #if !defined(REALLY_CLANG) namespace test_constexpr_lambdas { // TODO: test it with clang++ from git constexpr int foo = [](){return 42;}(); } #endif // !defined(REALLY_CLANG) namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } #if !defined(REALLY_CLANG) namespace test_template_argument_deduction_for_class_templates { // TODO: test it with clang++ from git template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } #endif // !defined(REALLY_CLANG) namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } #if !defined(REALLY_CLANG) namespace test_structured_bindings { // TODO: test it with clang++ from git int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } #endif // !defined(REALLY_CLANG) #if !defined(REALLY_CLANG) namespace test_exception_spec_type_system { // TODO: test it with clang++ from git struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } #endif // !defined(REALLY_CLANG) namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus <= 201402L ]]) openexr-2.5.7/IlmBase/m4/threads.m4000066400000000000000000000254621406177042200167510ustar00rootroot00000000000000dnl dnl SPDX-License-Identifier: BSD-3-Clause dnl Copyright Contributors to the OpenEXR Project. dnl dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl Modified by Wojciech Jarosz (2005) to include check for POSIX dnl semaphore usability. Defines HAVE_POSIX_SEMAPHORES if found. dnl dnl This macro figures out how to build C programs using POSIX threads. dnl It sets the PTHREAD_LIBS output variable to the threads library and dnl linker flags, and the PTHREAD_CFLAGS output variable to any special dnl C compiler flags that are needed. (The user can also force certain dnl compiler flags/libs to be tested by setting these environment dnl variables.) dnl dnl Also sets PTHREAD_CC to any special C compiler that is needed for dnl multi-threaded programs (defaults to the value of CC otherwise). dnl (This is necessary on AIX to use the special cc_r compiler alias.) dnl dnl NOTE: You are assumed to not only compile your program with these dnl flags, but also link it with them as well. e.g. you should link dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS dnl $LIBS dnl dnl If you are only building threads programs, you may wish to use dnl these variables in your default LIBS, CFLAGS, and CC: dnl dnl LIBS="$PTHREAD_LIBS $LIBS" dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl CC="$PTHREAD_CC" dnl dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a threads dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the dnl default action will define HAVE_PTHREAD. dnl dnl Please let the authors know if this macro fails on any platform, or dnl if you have any other suggestions or comments. This macro was based dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. dnl We are also grateful for the helpful feedback of numerous users. dnl dnl @category InstalledPackages dnl @author Steven G. Johnson dnl @version 2005-01-14 dnl @license GPLWithACException AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthread or # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" PTHREAD_LIBS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD dnl dnl Posix Semaphore support dnl AC_DEFUN([AM_POSIX_SEM], [ AC_ARG_ENABLE([posix-sem], AC_HELP_STRING([--disable-posix-sem], [do not attempt to use POSIX unnamed semaphores])) am_posix_sem_ok=no if test "${enable_posix_sem:-yes}" != "no"; then AC_CHECK_HEADERS([semaphore.h], [ AC_SEARCH_LIBS(sem_init, [posix4 pthread], [ AC_MSG_CHECKING([whether to use POSIX unnamed semaphores]) if test "${cross_compiling}" == "yes"; then AC_LINK_IFELSE([ AC_LANG_PROGRAM([#include ], [ sem_t mysem; if (sem_init (&mysem, 1, 1) == 0) { if (sem_wait (&mysem) == 0) { sem_post (&mysem); sem_destroy (&mysem); return 0; } } return 1; ]) ], [ AC_MSG_RESULT([yes]) am_posix_sem_ok=yes], [ AC_MSG_RESULT([no (pshared not usable)])]) else AC_RUN_IFELSE([ AC_LANG_PROGRAM([#include ], [ sem_t mysem; if (sem_init (&mysem, 1, 1) == 0) { if (sem_wait (&mysem) == 0) { sem_post (&mysem); sem_destroy (&mysem); return 0; } } return 1; ]) ], [ AC_MSG_RESULT([yes]) am_posix_sem_ok=yes], [ AC_MSG_RESULT([no (pshared not usable)])], [ AC_MSG_RESULT([no (we are cross-compiling, and this test should have only tried to link, not run.))])]) fi ]) ]) fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$am_posix_sem_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_POSIX_SEMAPHORES),[$1]) : else am_posix_sem_ok=no $2 fi ]) openexr-2.5.7/LICENSE.md000066400000000000000000000027311406177042200146170ustar00rootroot00000000000000Copyright Contributors to the OpenEXR Project. 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. openexr-2.5.7/OpenEXR/000077500000000000000000000000001406177042200144705ustar00rootroot00000000000000openexr-2.5.7/OpenEXR/.cproject000066400000000000000000000274501406177042200163120ustar00rootroot00000000000000 make IlmImfTest true true true openexr-2.5.7/OpenEXR/.gitignore000066400000000000000000000006761406177042200164710ustar00rootroot00000000000000IlmImf/b44ExpLogTable IlmImf/dwaLookups OpenEXR.pc autom4te.cache/ config.guess config.log config.status config.sub config/OpenEXRConfig.h config/stamp-h1 configure depcomp exr2aces/exr2aces exrbuild/exrbuild exrenvmap/exrenvmap exrbuild/exrbuild exrheader/exrheader exrmakepreview/exrmakepreview exrmaketiled/exrmaketiled exrmultipart/exrmultipart exrmultiview/exrmultiview exrstdattr/exrstdattr install-sh libtool ltmain.sh missing .metadata/ openexr-2.5.7/OpenEXR/.project000066400000000000000000000044411406177042200161420ustar00rootroot00000000000000 openexr org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, ?name? org.eclipse.cdt.make.core.append_environment true org.eclipse.cdt.make.core.autoBuildTarget all org.eclipse.cdt.make.core.buildArguments -j3 org.eclipse.cdt.make.core.buildCommand make org.eclipse.cdt.make.core.cleanBuildTarget clean org.eclipse.cdt.make.core.contents org.eclipse.cdt.make.core.activeConfigSettings org.eclipse.cdt.make.core.enableAutoBuild false org.eclipse.cdt.make.core.enableCleanBuild true org.eclipse.cdt.make.core.enableFullBuild true org.eclipse.cdt.make.core.fullBuildTarget all org.eclipse.cdt.make.core.stopOnError true org.eclipse.cdt.make.core.useDefaultBuildCmd true org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder full,incremental, org.eclipse.cdt.core.cnature org.eclipse.cdt.core.ccnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature openexr-2.5.7/OpenEXR/CMakeLists.txt000066400000000000000000000050351406177042200172330ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. # We require this to get object library link library support and # combined python 2 + 3 support if(OPENEXR_BUILD_BOTH_STATIC_SHARED) if (${CMAKE_VERSION} VERSION_LESS "3.12.0") message(FATAL_ERROR "CMake 3.12 or newer is required for object library support when building both static and shared libraries") endif() cmake_minimum_required(VERSION 3.12) else() cmake_minimum_required(VERSION 3.10) endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() # we include this first to parse configure.ac and extract the version # numbers include(config/ParseConfigure.cmake) project(OpenEXR VERSION ${OPENEXR_VERSION} LANGUAGES C CXX) ####################################### ####################################### # This declares all the configuration variables visible # in cmake-gui or similar and the rest of the global # project setup # # Please look at this file to see what is configurable ####################################### ####################################### include(config/OpenEXRSetup.cmake) # Everyone depends on IlmBase, and we currently rely on # the version matched with our release find_package(IlmBase ${OPENEXR_VERSION} EXACT REQUIRED CONFIG) # generates config headers, package config files add_subdirectory(config) # utility function for the repeated boilerplate of defining # the libraries include(config/LibraryDefine.cmake) ########################## add_subdirectory( IlmImf ) add_subdirectory( IlmImfUtil ) option(INSTALL_OPENEXR_EXAMPLES "Install OpenEXR examples" ON) if(INSTALL_OPENEXR_EXAMPLES) add_subdirectory( IlmImfExamples ) endif() ########################## # Tests ########################## # Can't seem to do EXCLUDE_FROM_ALL on the test executables # since you can't then create a dependency on the internal # "test" target such that it is auto built include(CTest) if(BUILD_TESTING) enable_testing() add_subdirectory( IlmImfTest ) add_subdirectory( IlmImfUtilTest ) add_subdirectory( IlmImfFuzzTest ) endif() ########################## # Binaries / Utilities ########################## if(OPENEXR_BUILD_UTILS) add_subdirectory( exr2aces ) add_subdirectory( exrheader ) add_subdirectory( exrmaketiled ) add_subdirectory( exrstdattr ) add_subdirectory( exrmakepreview ) add_subdirectory( exrenvmap ) add_subdirectory( exrmultiview ) add_subdirectory( exrmultipart ) endif() option(INSTALL_OPENEXR_DOCS "Install OpenEXR documentation" ON) if(INSTALL_OPENEXR_DOCS) add_subdirectory(doc) endif() openexr-2.5.7/OpenEXR/IlmImf/000077500000000000000000000000001406177042200156455ustar00rootroot00000000000000openexr-2.5.7/OpenEXR/IlmImf/CMakeLists.txt000066400000000000000000000107361406177042200204140ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. openexr_define_library(IlmImf PRIV_EXPORT ILMIMF_EXPORTS CURDIR ${CMAKE_CURRENT_SOURCE_DIR} SOURCES b44ExpLogTable.h dwaLookups.h ImfAttribute.cpp ImfBoxAttribute.cpp ImfCRgbaFile.cpp ImfChannelList.cpp ImfChannelListAttribute.cpp ImfFloatAttribute.cpp ImfFrameBuffer.cpp ImfHeader.cpp ImfIO.cpp ImfInputFile.cpp ImfIntAttribute.cpp ImfLineOrderAttribute.cpp ImfMatrixAttribute.cpp ImfOpaqueAttribute.cpp ImfOutputFile.cpp ImfRgbaFile.cpp ImfStringAttribute.cpp ImfVecAttribute.cpp ImfHuf.cpp ImfThreading.cpp ImfWav.cpp ImfLut.cpp ImfCompressor.cpp ImfRleCompressor.cpp ImfZipCompressor.cpp ImfPizCompressor.cpp ImfB44Compressor.cpp ImfDwaCompressor.cpp ImfMisc.cpp ImfCompressionAttribute.cpp ImfDoubleAttribute.cpp ImfConvert.cpp ImfPreviewImage.cpp ImfPreviewImageAttribute.cpp ImfVersion.cpp ImfChromaticities.cpp ImfChromaticitiesAttribute.cpp ImfKeyCode.cpp ImfKeyCodeAttribute.cpp ImfTimeCode.cpp ImfTimeCodeAttribute.cpp ImfRational.cpp ImfRationalAttribute.cpp ImfFramesPerSecond.cpp ImfStandardAttributes.cpp ImfStdIO.cpp ImfEnvmap.cpp ImfEnvmapAttribute.cpp ImfScanLineInputFile.cpp ImfTiledInputFile.cpp ImfTiledMisc.cpp ImfTiledOutputFile.cpp ImfTiledRgbaFile.cpp ImfTileDescriptionAttribute.cpp ImfTileOffsets.cpp ImfRgbaYca.cpp ImfPxr24Compressor.cpp ImfTestFile.cpp ImfStringVectorAttribute.cpp ImfMultiView.cpp ImfAcesFile.cpp ImfMultiPartOutputFile.cpp ImfGenericOutputFile.cpp ImfOutputPartData.cpp ImfMultiPartInputFile.cpp ImfGenericInputFile.cpp ImfPartType.cpp ImfInputPartData.cpp ImfOutputPart.cpp ImfTiledOutputPart.cpp ImfInputPart.cpp ImfTiledInputPart.cpp ImfDeepScanLineInputPart.cpp ImfDeepScanLineOutputPart.cpp ImfDeepScanLineInputFile.cpp ImfDeepScanLineOutputFile.cpp ImfDeepTiledInputPart.cpp ImfDeepTiledOutputPart.cpp ImfDeepTiledInputFile.cpp ImfDeepTiledOutputFile.cpp ImfDeepFrameBuffer.cpp ImfDeepCompositing.cpp ImfCompositeDeepScanLine.cpp ImfDeepImageStateAttribute.cpp ImfFastHuf.cpp ImfFloatVectorAttribute.cpp ImfRle.cpp ImfSystemSpecific.cpp ImfZip.cpp HEADERS ImfForward.h ImfExport.h ImfAttribute.h ImfBoxAttribute.h ImfCRgbaFile.h ImfChannelList.h ImfChannelListAttribute.h ImfCompressionAttribute.h ImfDoubleAttribute.h ImfFloatAttribute.h ImfFrameBuffer.h ImfHeader.h ImfIO.h ImfInputFile.h ImfIntAttribute.h ImfLineOrderAttribute.h ImfMatrixAttribute.h ImfOpaqueAttribute.h ImfOutputFile.h ImfRgbaFile.h ImfStringAttribute.h ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h ImfArray.h ImfCompression.h ImfLineOrder.h ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h ImfConvert.h ImfPreviewImage.h ImfPreviewImageAttribute.h ImfChromaticities.h ImfChromaticitiesAttribute.h ImfKeyCode.h ImfKeyCodeAttribute.h ImfTimeCode.h ImfTimeCodeAttribute.h ImfRational.h ImfRationalAttribute.h ImfFramesPerSecond.h ImfStandardAttributes.h ImfStdIO.h ImfEnvmap.h ImfEnvmapAttribute.h ImfInt64.h ImfRgba.h ImfTileDescription.h ImfTileDescriptionAttribute.h ImfTiledInputFile.h ImfTiledOutputFile.h ImfTiledRgbaFile.h ImfRgbaYca.h ImfTestFile.h ImfThreading.h ImfB44Compressor.h ImfStringVectorAttribute.h ImfMultiView.h ImfAcesFile.h ImfMultiPartOutputFile.h ImfGenericOutputFile.h ImfMultiPartInputFile.h ImfGenericInputFile.h ImfPartType.h ImfPartHelper.h ImfOutputPart.h ImfTiledOutputPart.h ImfInputPart.h ImfTiledInputPart.h ImfDeepScanLineOutputFile.h ImfDeepScanLineOutputPart.h ImfDeepScanLineInputFile.h ImfDeepScanLineInputPart.h ImfDeepTiledInputFile.h ImfDeepTiledInputPart.h ImfDeepTiledOutputFile.h ImfDeepTiledOutputPart.h ImfDeepFrameBuffer.h ImfDeepCompositing.h ImfCompositeDeepScanLine.h ImfNamespace.h ImfDeepImageState.h ImfDeepImageStateAttribute.h ImfFloatVectorAttribute.h DEPENDENCIES OpenEXR::Config IlmBase::Iex IlmBase::Half IlmBase::Imath IlmBase::IlmThread ZLIB::ZLIB ) openexr-2.5.7/OpenEXR/IlmImf/ImfAcesFile.cpp000066400000000000000000000326731406177042200204730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // ACES image file I/O. // //----------------------------------------------------------------------------- #include #include #include #include #include using namespace std; using namespace IMATH_NAMESPACE; using namespace IEX_NAMESPACE; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER const Chromaticities & acesChromaticities () { static const Chromaticities acesChr (V2f (0.73470, 0.26530), // red V2f (0.00000, 1.00000), // green V2f (0.00010, -0.07700), // blue V2f (0.32168, 0.33767)); // white return acesChr; } class AcesOutputFile::Data { public: Data(); ~Data(); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; RgbaOutputFile * rgbaFile; }; AcesOutputFile::Data::Data (): rgbaFile (0) { // empty } AcesOutputFile::Data::~Data () { delete rgbaFile; } namespace { void checkCompression (Compression compression) { // // Not all compression methods are allowed in ACES files. // switch (compression) { case NO_COMPRESSION: case PIZ_COMPRESSION: case B44A_COMPRESSION: break; default: throw ArgExc ("Invalid compression type for ACES file."); } } } // namespace AcesOutputFile::AcesOutputFile (const std::string &name, const Header &header, RgbaChannels rgbaChannels, int numThreads) : _data (new Data) { checkCompression (header.compression()); Header newHeader = header; addChromaticities (newHeader, acesChromaticities()); addAdoptedNeutral (newHeader, acesChromaticities().white); _data->rgbaFile = new RgbaOutputFile (name.c_str(), newHeader, rgbaChannels, numThreads); _data->rgbaFile->setYCRounding (7, 6); } AcesOutputFile::AcesOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels, int numThreads) : _data (new Data) { checkCompression (header.compression()); Header newHeader = header; addChromaticities (newHeader, acesChromaticities()); addAdoptedNeutral (newHeader, acesChromaticities().white); _data->rgbaFile = new RgbaOutputFile (os, header, rgbaChannels, numThreads); _data->rgbaFile->setYCRounding (7, 6); } AcesOutputFile::AcesOutputFile (const std::string &name, const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads) : _data (new Data) { checkCompression (compression); Header newHeader (displayWindow, dataWindow.isEmpty()? displayWindow: dataWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); addChromaticities (newHeader, acesChromaticities()); addAdoptedNeutral (newHeader, acesChromaticities().white); _data->rgbaFile = new RgbaOutputFile (name.c_str(), newHeader, rgbaChannels, numThreads); _data->rgbaFile->setYCRounding (7, 6); } AcesOutputFile::AcesOutputFile (const std::string &name, int width, int height, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads) : _data (new Data) { checkCompression (compression); Header newHeader (width, height, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); addChromaticities (newHeader, acesChromaticities()); addAdoptedNeutral (newHeader, acesChromaticities().white); _data->rgbaFile = new RgbaOutputFile (name.c_str(), newHeader, rgbaChannels, numThreads); _data->rgbaFile->setYCRounding (7, 6); } AcesOutputFile::~AcesOutputFile () { delete _data; } void AcesOutputFile::setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride) { _data->rgbaFile->setFrameBuffer (base, xStride, yStride); } void AcesOutputFile::writePixels (int numScanLines) { _data->rgbaFile->writePixels (numScanLines); } int AcesOutputFile::currentScanLine () const { return _data->rgbaFile->currentScanLine(); } const Header & AcesOutputFile::header () const { return _data->rgbaFile->header(); } const IMATH_NAMESPACE::Box2i & AcesOutputFile::displayWindow () const { return _data->rgbaFile->displayWindow(); } const IMATH_NAMESPACE::Box2i & AcesOutputFile::dataWindow () const { return _data->rgbaFile->dataWindow(); } float AcesOutputFile::pixelAspectRatio () const { return _data->rgbaFile->pixelAspectRatio(); } const IMATH_NAMESPACE::V2f AcesOutputFile::screenWindowCenter () const { return _data->rgbaFile->screenWindowCenter(); } float AcesOutputFile::screenWindowWidth () const { return _data->rgbaFile->screenWindowWidth(); } LineOrder AcesOutputFile::lineOrder () const { return _data->rgbaFile->lineOrder(); } Compression AcesOutputFile::compression () const { return _data->rgbaFile->compression(); } RgbaChannels AcesOutputFile::channels () const { return _data->rgbaFile->channels(); } void AcesOutputFile::updatePreviewImage (const PreviewRgba pixels[]) { _data->rgbaFile->updatePreviewImage (pixels); } class AcesInputFile::Data { public: Data(); ~Data(); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; void initColorConversion (); RgbaInputFile * rgbaFile; Rgba * fbBase; size_t fbXStride; size_t fbYStride; int minX; int maxX; bool mustConvertColor; M44f fileToAces; }; AcesInputFile::Data::Data (): rgbaFile (0), fbBase (0), fbXStride (0), fbYStride (0), minX (0), maxX (0), mustConvertColor (false) { // empty } AcesInputFile::Data::~Data () { delete rgbaFile; } void AcesInputFile::Data::initColorConversion () { const Header &header = rgbaFile->header(); Chromaticities fileChr; if (hasChromaticities (header)) fileChr = chromaticities (header); V2f fileNeutral = fileChr.white; if (hasAdoptedNeutral (header)) { fileNeutral = adoptedNeutral (header); fileChr.white = fileNeutral; // for RGBtoXYZ() purposes. } const Chromaticities acesChr = acesChromaticities(); V2f acesNeutral = acesChr.white; if (fileChr.red == acesChr.red && fileChr.green == acesChr.green && fileChr.blue == acesChr.blue && fileChr.white == acesChr.white) { // // The file already contains ACES data, // color conversion is not necessary. return; } mustConvertColor = true; minX = header.dataWindow().min.x; maxX = header.dataWindow().max.x; // // Create a matrix that transforms colors from the // RGB space of the input file into the ACES space // using a color adaptation transform to move the // white point. // // // We'll need the Bradford cone primary matrix and its inverse // static const M44f bradfordCPM (0.895100, -0.750200, 0.038900, 0.000000, 0.266400, 1.713500, -0.068500, 0.000000, -0.161400, 0.036700, 1.029600, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000); const static M44f inverseBradfordCPM (0.986993, 0.432305, -0.008529, 0.000000, -0.147054, 0.518360, 0.040043, 0.000000, 0.159963, 0.049291, 0.968487, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000); // // Convert the white points of the two RGB spaces to XYZ // float fx = fileNeutral.x; float fy = fileNeutral.y; V3f fileNeutralXYZ (fx / fy, 1, (1 - fx - fy) / fy); float ax = acesNeutral.x; float ay = acesNeutral.y; V3f acesNeutralXYZ (ax / ay, 1, (1 - ax - ay) / ay); // // Compute the Bradford transformation matrix // V3f ratio ((acesNeutralXYZ * bradfordCPM) / (fileNeutralXYZ * bradfordCPM)); M44f ratioMat (ratio[0], 0, 0, 0, 0, ratio[1], 0, 0, 0, 0, ratio[2], 0, 0, 0, 0, 1); M44f bradfordTrans = bradfordCPM * ratioMat * inverseBradfordCPM; // // Build a combined file-RGB-to-ACES-RGB conversion matrix // fileToAces = RGBtoXYZ (fileChr, 1) * bradfordTrans * XYZtoRGB (acesChr, 1); } AcesInputFile::AcesInputFile (const std::string &name, int numThreads): _data (new Data) { _data->rgbaFile = new RgbaInputFile (name.c_str(), numThreads); _data->initColorConversion(); } AcesInputFile::AcesInputFile (IStream &is, int numThreads): _data (new Data) { _data->rgbaFile = new RgbaInputFile (is, numThreads); _data->initColorConversion(); } AcesInputFile::~AcesInputFile () { delete _data; } void AcesInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) { _data->rgbaFile->setFrameBuffer (base, xStride, yStride); _data->fbBase = base; _data->fbXStride = xStride; _data->fbYStride = yStride; } void AcesInputFile::readPixels (int scanLine1, int scanLine2) { // // Copy the pixels from the RgbaInputFile into the frame buffer. // _data->rgbaFile->readPixels (scanLine1, scanLine2); // // If the RGB space of the input file is not the same as the ACES // RGB space, then the pixels in the frame buffer must be transformed // into the ACES RGB space. // if (!_data->mustConvertColor) return; int minY = min (scanLine1, scanLine2); int maxY = max (scanLine1, scanLine2); for (int y = minY; y <= maxY; ++y) { Rgba *base = _data->fbBase + _data->fbXStride * _data->minX + _data->fbYStride * y; for (int x = _data->minX; x <= _data->maxX; ++x) { V3f aces = V3f (base->r, base->g, base->b) * _data->fileToAces; base->r = aces[0]; base->g = aces[1]; base->b = aces[2]; base += _data->fbXStride; } } } void AcesInputFile::readPixels (int scanLine) { readPixels (scanLine, scanLine); } const Header & AcesInputFile::header () const { return _data->rgbaFile->header(); } const IMATH_NAMESPACE::Box2i & AcesInputFile::displayWindow () const { return _data->rgbaFile->displayWindow(); } const IMATH_NAMESPACE::Box2i & AcesInputFile::dataWindow () const { return _data->rgbaFile->dataWindow(); } float AcesInputFile::pixelAspectRatio () const { return _data->rgbaFile->pixelAspectRatio(); } const IMATH_NAMESPACE::V2f AcesInputFile::screenWindowCenter () const { return _data->rgbaFile->screenWindowCenter(); } float AcesInputFile::screenWindowWidth () const { return _data->rgbaFile->screenWindowWidth(); } LineOrder AcesInputFile::lineOrder () const { return _data->rgbaFile->lineOrder(); } Compression AcesInputFile::compression () const { return _data->rgbaFile->compression(); } RgbaChannels AcesInputFile::channels () const { return _data->rgbaFile->channels(); } const char * AcesInputFile::fileName () const { return _data->rgbaFile->fileName(); } bool AcesInputFile::isComplete () const { return _data->rgbaFile->isComplete(); } int AcesInputFile::version () const { return _data->rgbaFile->version(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfAcesFile.h000066400000000000000000000257131406177042200201350ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ACES_FILE_H #define INCLUDED_IMF_ACES_FILE_H //----------------------------------------------------------------------------- // // ACES image file I/O. // // This header file declares two classes that directly support // image file input and output according to the Academy Image // Interchange Framework. // // The Academy Image Interchange file format is a subset of OpenEXR: // // - Images are stored as scanlines. Tiles are not allowed. // // - Images contain three color channels, either // R, G, B (red, green, blue) or // Y, RY, BY (luminance, sub-sampled chroma) // // - Images may optionally contain an alpha channel. // // - Only three compression types are allowed: // - NO_COMPRESSION (file is not compressed) // - PIZ_COMPRESSION (lossless) // - B44A_COMPRESSION (lossy) // // - The "chromaticities" header attribute must specify // the ACES RGB primaries and white point. // // class AcesOutputFile writes an OpenEXR file, enforcing the // restrictions listed above. Pixel data supplied by application // software must already be in the ACES RGB space. // // class AcesInputFile reads an OpenEXR file. Pixel data delivered // to application software is guaranteed to be in the ACES RGB space. // If the RGB space of the file is not the same as the ACES space, // then the pixels are automatically converted: the pixels are // converted to CIE XYZ, a color adaptation transform shifts the // white point, and the result is converted to ACES RGB. // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfRgba.h" #include "ImathVec.h" #include "ImathBox.h" #include "ImfThreading.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // ACES red, green, blue and white-point chromaticities. // const Chromaticities & acesChromaticities (); // // ACES output file. // class AcesOutputFile { public: //--------------------------------------------------- // Constructor -- header is constructed by the caller //--------------------------------------------------- IMF_EXPORT AcesOutputFile (const std::string &name, const Header &header, RgbaChannels rgbaChannels = WRITE_RGBA, int numThreads = globalThreadCount()); //---------------------------------------------------- // Constructor -- header is constructed by the caller, // file is opened by the caller, destructor will not // automatically close the file. //---------------------------------------------------- IMF_EXPORT AcesOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels = WRITE_RGBA, int numThreads = globalThreadCount()); //---------------------------------------------------------------- // Constructor -- header data are explicitly specified as function // call arguments (empty dataWindow means "same as displayWindow") //---------------------------------------------------------------- IMF_EXPORT AcesOutputFile (const std::string &name, const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = PIZ_COMPRESSION, int numThreads = globalThreadCount()); //----------------------------------------------- // Constructor -- like the previous one, but both // the display window and the data window are // Box2i (V2i (0, 0), V2i (width - 1, height -1)) //----------------------------------------------- IMF_EXPORT AcesOutputFile (const std::string &name, int width, int height, RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = PIZ_COMPRESSION, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~AcesOutputFile (); //------------------------------------------------ // Define a frame buffer as the pixel data source: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //------------------------------------------------ IMF_EXPORT void setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride); //------------------------------------------------- // Write pixel data (see class Imf::OutputFile) // The pixels are assumed to contain ACES RGB data. //------------------------------------------------- IMF_EXPORT void writePixels (int numScanLines = 1); IMF_EXPORT int currentScanLine () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; // -------------------------------------------------------------------- // Update the preview image (see Imf::OutputFile::updatePreviewImage()) // -------------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba[]); private: AcesOutputFile (const AcesOutputFile &) = delete; AcesOutputFile & operator = (const AcesOutputFile &) = delete; AcesOutputFile (AcesOutputFile &&) = delete; AcesOutputFile & operator = (AcesOutputFile &&) = delete; class Data; Data * _data; }; // // ACES input file // class AcesInputFile { public: //------------------------------------------------------- // Constructor -- opens the file with the specified name, // destructor will automatically close the file. //------------------------------------------------------- IMF_EXPORT AcesInputFile (const std::string &name, int numThreads = globalThreadCount()); //----------------------------------------------------------- // Constructor -- attaches the new AcesInputFile object to a // file that has already been opened by the caller. // Destroying the AcesInputFile object will not automatically // close the file. //----------------------------------------------------------- IMF_EXPORT AcesInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~AcesInputFile (); //----------------------------------------------------- // Define a frame buffer as the pixel data destination: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //----------------------------------------------------- IMF_EXPORT void setFrameBuffer (Rgba *base, size_t xStride, size_t yStride); //-------------------------------------------- // Read pixel data (see class Imf::InputFile) // Pixels returned will contain ACES RGB data. //-------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; IMF_EXPORT const char * fileName () const; IMF_EXPORT bool isComplete () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; private: AcesInputFile (const AcesInputFile &) = delete; AcesInputFile & operator = (const AcesInputFile &) = delete; AcesInputFile (AcesInputFile &&) = delete; AcesInputFile & operator = (AcesInputFile &&) = delete; class Data; Data * _data; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfArray.h000066400000000000000000000156031406177042200175350ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ARRAY_H #define INCLUDED_IMF_ARRAY_H #include "ImfForward.h" //------------------------------------------------------------------------- // // class Array // class Array2D // // "Arrays of T" whose sizes are not known at compile time. // When an array goes out of scope, its elements are automatically // deleted. // // Usage example: // // struct C // { // C () {std::cout << "C::C (" << this << ")\n";}; // virtual ~C () {std::cout << "C::~C (" << this << ")\n";}; // }; // // int // main () // { // Array a(3); // // C &b = a[1]; // const C &c = a[1]; // C *d = a + 2; // const C *e = a; // // return 0; // } // //------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER template class Array { public: //----------------------------- // Constructors and destructors //----------------------------- Array () {_data = 0; _size = 0;} Array (long size) {_data = new T[size]; _size = size;} ~Array () {delete [] _data;} //----------------------------- // Access to the array elements //----------------------------- operator T * () {return _data;} operator const T * () const {return _data;} //------------------------------------------------------ // Resize and clear the array (the contents of the array // are not preserved across the resize operation). // // resizeEraseUnsafe() is more memory efficient than // resizeErase() because it deletes the old memory block // before allocating a new one, but if allocating the // new block throws an exception, resizeEraseUnsafe() // leaves the array in an unusable state. // //------------------------------------------------------ void resizeErase (long size); void resizeEraseUnsafe (long size); //------------------------------- // Return the size of this array. //------------------------------- long size() const {return _size;} private: Array (const Array &) = delete; Array & operator = (const Array &) = delete; Array (Array &&) = delete; Array & operator = (Array &&) = delete; long _size; T * _data; }; template class Array2D { public: //----------------------------- // Constructors and destructors //----------------------------- Array2D (); // empty array, 0 by 0 elements Array2D (long sizeX, long sizeY); // sizeX by sizeY elements ~Array2D (); //----------------------------- // Access to the array elements //----------------------------- T * operator [] (long x); const T * operator [] (long x) const; //------------------------------------------------------ // Resize and clear the array (the contents of the array // are not preserved across the resize operation). // // resizeEraseUnsafe() is more memory efficient than // resizeErase() because it deletes the old memory block // before allocating a new one, but if allocating the // new block throws an exception, resizeEraseUnsafe() // leaves the array in an unusable state. // //------------------------------------------------------ void resizeErase (long sizeX, long sizeY); void resizeEraseUnsafe (long sizeX, long sizeY); //------------------------------- // Return the size of this array. //------------------------------- long height() const {return _sizeX;} long width() const {return _sizeY;} private: Array2D (const Array2D &) = delete; Array2D & operator = (const Array2D &) = delete; Array2D (Array2D &&) = delete; Array2D & operator = (Array2D &&) = delete; long _sizeX; long _sizeY; T * _data; }; //--------------- // Implementation //--------------- template inline void Array::resizeErase (long size) { T *tmp = new T[size]; delete [] _data; _size = size; _data = tmp; } template inline void Array::resizeEraseUnsafe (long size) { delete [] _data; _data = 0; _size = 0; _data = new T[size]; _size = size; } template inline Array2D::Array2D (): _sizeX(0), _sizeY (0), _data (0) { // emtpy } template inline Array2D::Array2D (long sizeX, long sizeY): _sizeX (sizeX), _sizeY (sizeY), _data (new T[sizeX * sizeY]) { // emtpy } template inline Array2D::~Array2D () { delete [] _data; } template inline T * Array2D::operator [] (long x) { return _data + x * _sizeY; } template inline const T * Array2D::operator [] (long x) const { return _data + x * _sizeY; } template inline void Array2D::resizeErase (long sizeX, long sizeY) { T *tmp = new T[sizeX * sizeY]; delete [] _data; _sizeX = sizeX; _sizeY = sizeY; _data = tmp; } template inline void Array2D::resizeEraseUnsafe (long sizeX, long sizeY) { delete [] _data; _data = 0; _sizeX = 0; _sizeY = 0; _data = new T[sizeX * sizeY]; _sizeX = sizeX; _sizeY = sizeY; } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfAttribute.cpp000066400000000000000000000074621406177042200207610ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Attribute // //----------------------------------------------------------------------------- #include #include "IlmThreadMutex.h" #include "Iex.h" #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; Attribute::Attribute () {} Attribute::~Attribute () {} namespace { struct NameCompare { bool operator () (const char *x, const char *y) const { return strcmp (x, y) < 0; } }; typedef Attribute* (*Constructor)(); typedef std::map TypeMap; class LockedTypeMap: public TypeMap { public: Mutex mutex; }; LockedTypeMap & typeMap () { static LockedTypeMap tMap; return tMap; } } // namespace bool Attribute::knownType (const char typeName[]) { LockedTypeMap& tMap = typeMap(); Lock lock (tMap.mutex); return tMap.find (typeName) != tMap.end(); } void Attribute::registerAttributeType (const char typeName[], Attribute *(*newAttribute)()) { LockedTypeMap& tMap = typeMap(); Lock lock (tMap.mutex); if (tMap.find (typeName) != tMap.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot register image file attribute " "type \"" << typeName << "\". " "The type has already been registered."); tMap.insert (TypeMap::value_type (typeName, newAttribute)); } void Attribute::unRegisterAttributeType (const char typeName[]) { LockedTypeMap& tMap = typeMap(); Lock lock (tMap.mutex); tMap.erase (typeName); } Attribute * Attribute::newAttribute (const char typeName[]) { LockedTypeMap& tMap = typeMap(); Lock lock (tMap.mutex); TypeMap::const_iterator i = tMap.find (typeName); if (i == tMap.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot create image file attribute of " "unknown type \"" << typeName << "\"."); return (i->second)(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfAttribute.h000066400000000000000000000247551406177042200204320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ATTRIBUTE_H #define INCLUDED_IMF_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class Attribute // //----------------------------------------------------------------------------- #include "IexBaseExc.h" #include "ImfIO.h" #include "ImfXdr.h" #include "ImfForward.h" #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Attribute { public: //--------------------------- // Constructor and destructor //--------------------------- IMF_EXPORT Attribute (); IMF_EXPORT virtual ~Attribute (); //------------------------------- // Get this attribute's type name //------------------------------- virtual const char * typeName () const = 0; //------------------------------ // Make a copy of this attribute //------------------------------ virtual Attribute * copy () const = 0; //---------------------------------------- // Type-specific attribute I/O and copying //---------------------------------------- virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const = 0; virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) = 0; virtual void copyValueFrom (const Attribute &other) = 0; //------------------ // Attribute factory //------------------ IMF_EXPORT static Attribute * newAttribute (const char typeName[]); //----------------------------------------------------------- // Test if a given attribute type has already been registered //----------------------------------------------------------- IMF_EXPORT static bool knownType (const char typeName[]); protected: //-------------------------------------------------- // Register an attribute type so that newAttribute() // knows how to make objects of this type. //-------------------------------------------------- IMF_EXPORT static void registerAttributeType (const char typeName[], Attribute *(*newAttribute)()); //------------------------------------------------------ // Un-register an attribute type so that newAttribute() // no longer knows how to make objects of this type (for // debugging only). //------------------------------------------------------ IMF_EXPORT static void unRegisterAttributeType (const char typeName[]); }; //------------------------------------------------- // Class template for attributes of a specific type //------------------------------------------------- template class TypedAttribute: public Attribute { public: //------------------------------------------------------------ // Constructors and destructor: default behavior. This assumes // that the type T is copyable/assignable/moveable. //------------------------------------------------------------ TypedAttribute () = default; TypedAttribute (const T &value); TypedAttribute (const TypedAttribute &other) = default; TypedAttribute (TypedAttribute &&other) = default; virtual ~TypedAttribute () = default; TypedAttribute& operator = (const TypedAttribute& other) = default; TypedAttribute& operator = (TypedAttribute&& other) = default; //-------------------------------- // Access to the attribute's value //-------------------------------- T & value (); const T & value () const; //-------------------------------- // Get this attribute's type name. //-------------------------------- virtual const char * typeName () const; //--------------------------------------------------------- // Static version of typeName() // This function must be specialized for each value type T. //--------------------------------------------------------- static const char * staticTypeName (); //--------------------- // Make a new attribute //--------------------- static Attribute * makeNewAttribute (); //------------------------------ // Make a copy of this attribute //------------------------------ virtual Attribute * copy () const; //----------------------------------------------------------------- // Type-specific attribute I/O and copying. // Depending on type T, these functions may have to be specialized. //----------------------------------------------------------------- virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const; virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version); virtual void copyValueFrom (const Attribute &other); //------------------------------------------------------------ // Dynamic casts that throw exceptions instead of returning 0. //------------------------------------------------------------ static TypedAttribute * cast (Attribute *attribute); static const TypedAttribute * cast (const Attribute *attribute); static TypedAttribute & cast (Attribute &attribute); static const TypedAttribute & cast (const Attribute &attribute); //--------------------------------------------------------------- // Register this attribute type so that Attribute::newAttribute() // knows how to make objects of this type. // // Note that this function is not thread-safe because it modifies // a global variable in the IlmIlm library. A thread in a multi- // threaded program may call registerAttributeType() only when no // other thread is accessing any functions or classes in the // IlmImf library. // //--------------------------------------------------------------- static void registerAttributeType (); //----------------------------------------------------- // Un-register this attribute type (for debugging only) //----------------------------------------------------- static void unRegisterAttributeType (); private: T _value; }; //------------------------------------ // Implementation of TypedAttribute //------------------------------------ template TypedAttribute::TypedAttribute (const T & value): Attribute (), _value (value) { // empty } template inline T & TypedAttribute::value () { return _value; } template inline const T & TypedAttribute::value () const { return _value; } template const char * TypedAttribute::typeName () const { return staticTypeName(); } template Attribute * TypedAttribute::makeNewAttribute () { return new TypedAttribute(); } template Attribute * TypedAttribute::copy () const { Attribute * attribute = new TypedAttribute(); attribute->copyValueFrom (*this); return attribute; } template void TypedAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, _value); } template void TypedAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, _value); } template void TypedAttribute::copyValueFrom (const Attribute &other) { _value = cast(other)._value; } template TypedAttribute * TypedAttribute::cast (Attribute *attribute) { TypedAttribute *t = dynamic_cast *> (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); return t; } template const TypedAttribute * TypedAttribute::cast (const Attribute *attribute) { const TypedAttribute *t = dynamic_cast *> (attribute); if (t == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); return t; } template inline TypedAttribute & TypedAttribute::cast (Attribute &attribute) { return *cast (&attribute); } template inline const TypedAttribute & TypedAttribute::cast (const Attribute &attribute) { return *cast (&attribute); } template inline void TypedAttribute::registerAttributeType () { Attribute::registerAttributeType (staticTypeName(), makeNewAttribute); } template inline void TypedAttribute::unRegisterAttributeType () { Attribute::unRegisterAttributeType (staticTypeName()); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfAutoArray.h000066400000000000000000000060041406177042200203610ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_AUTO_ARRAY_H #define INCLUDED_IMF_AUTO_ARRAY_H //----------------------------------------------------------------------------- // // class AutoArray -- a workaround for systems with // insufficient stack space for large auto arrays. // //----------------------------------------------------------------------------- #include "ImfNamespace.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER #if !defined (HAVE_LARGE_STACK) template class AutoArray { public: AutoArray (): _data (new T [size]) { memset(_data, 0, size*sizeof(T)); } ~AutoArray () {delete [] _data;} AutoArray (const AutoArray& other) = delete; AutoArray& operator = (const AutoArray& other) = delete; AutoArray (AutoArray&& other) = delete; AutoArray& operator = (AutoArray&& other) = delete; operator T * () {return _data;} operator const T * () const {return _data;} private: T *_data; }; #else template class AutoArray { public: operator T * () {return _data;} operator const T * () const {return _data;} private: T _data[size]; }; #endif OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfB44Compressor.cpp000066400000000000000000000621721406177042200214230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class B44Compressor // // This compressor is lossy for HALF channels; the compression rate // is fixed at 32/14 (approximately 2.28). FLOAT and UINT channels // are not compressed; their data are preserved exactly. // // Each HALF channel is split into blocks of 4 by 4 pixels. An // uncompressed block occupies 32 bytes, which are re-interpreted // as sixteen 16-bit unsigned integers, t[0] ... t[15]. Compression // shrinks the block to 14 bytes. The compressed 14-byte block // contains // // - t[0] // // - a 6-bit shift value // // - 15 densely packed 6-bit values, r[0] ... r[14], which are // computed by subtracting adjacent pixel values and right- // shifting the differences according to the stored shift value. // // Differences between adjacent pixels are computed according // to the following diagram: // // 0 --------> 1 --------> 2 --------> 3 // | 3 7 11 // | // | 0 // | // v // 4 --------> 5 --------> 6 --------> 7 // | 4 8 12 // | // | 1 // | // v // 8 --------> 9 --------> 10 --------> 11 // | 5 9 13 // | // | 2 // | // v // 12 --------> 13 --------> 14 --------> 15 // 6 10 14 // // Here // // 5 ---------> 6 // 8 // // means that r[8] is the difference between t[5] and t[6]. // // - optionally, a 4-by-4 pixel block where all pixels have the // same value can be treated as a special case, where the // compressed block contains only 3 instead of 14 bytes: // t[0], followed by an "impossible" 6-bit shift value and // two padding bits. // // This compressor can handle positive and negative pixel values. // NaNs and infinities are replaced with zeroes before compression. // //----------------------------------------------------------------------------- #include "ImfB44Compressor.h" #include "ImfHeader.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfCheckedArithmetic.h" #include #include #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using std::min; namespace { // // Lookup tables for // y = exp (x / 8) // and // x = 8 * log (y) // #include "b44ExpLogTable.h" inline void convertFromLinear (unsigned short s[16]) { for (int i = 0; i < 16; ++i) s[i] = expTable[s[i]]; } inline void convertToLinear (unsigned short s[16]) { for (int i = 0; i < 16; ++i) s[i] = logTable[s[i]]; } inline int shiftAndRound (int x, int shift) { // // Compute // // y = x * pow (2, -shift), // // then round y to the nearest integer. // In case of a tie, where y is exactly // halfway between two integers, round // to the even one. // x <<= 1; int a = (1 << shift) - 1; shift += 1; int b = (x >> shift) & 1; return (x + a + b) >> shift; } int pack (const unsigned short s[16], unsigned char b[14], bool optFlatFields, bool exactMax) { // // Pack a block of 4 by 4 16-bit pixels (32 bytes) into // either 14 or 3 bytes. // // // Integers s[0] ... s[15] represent floating-point numbers // in what is essentially a sign-magnitude format. Convert // s[0] .. s[15] into a new set of integers, t[0] ... t[15], // such that if t[i] is greater than t[j], the floating-point // number that corresponds to s[i] is always greater than // the floating-point number that corresponds to s[j]. // // Also, replace any bit patterns that represent NaNs or // infinities with bit patterns that represent floating-point // zeroes. // // bit pattern floating-point bit pattern // in s[i] value in t[i] // // 0x7fff NAN 0x8000 // 0x7ffe NAN 0x8000 // ... ... // 0x7c01 NAN 0x8000 // 0x7c00 +infinity 0x8000 // 0x7bff +HALF_MAX 0xfbff // 0x7bfe 0xfbfe // 0x7bfd 0xfbfd // ... ... // 0x0002 +2 * HALF_MIN 0x8002 // 0x0001 +HALF_MIN 0x8001 // 0x0000 +0.0 0x8000 // 0x8000 -0.0 0x7fff // 0x8001 -HALF_MIN 0x7ffe // 0x8002 -2 * HALF_MIN 0x7ffd // ... ... // 0xfbfd 0x0f02 // 0xfbfe 0x0401 // 0xfbff -HALF_MAX 0x0400 // 0xfc00 -infinity 0x8000 // 0xfc01 NAN 0x8000 // ... ... // 0xfffe NAN 0x8000 // 0xffff NAN 0x8000 // unsigned short t[16]; for (int i = 0; i < 16; ++i) { if ((s[i] & 0x7c00) == 0x7c00) t[i] = 0x8000; else if (s[i] & 0x8000) t[i] = ~s[i]; else t[i] = s[i] | 0x8000; } // // Find the maximum, tMax, of t[0] ... t[15]. // unsigned short tMax = 0; for (int i = 0; i < 16; ++i) if (tMax < t[i]) tMax = t[i]; // // Compute a set of running differences, r[0] ... r[14]: // Find a shift value such that after rounding off the // rightmost bits and shifting all differenes are between // -32 and +31. Then bias the differences so that they // end up between 0 and 63. // int shift = -1; int d[16]; int r[15]; int rMin; int rMax; const int bias = 0x20; do { shift += 1; // // Compute absolute differences, d[0] ... d[15], // between tMax and t[0] ... t[15]. // // Shift and round the absolute differences. // for (int i = 0; i < 16; ++i) d[i] = shiftAndRound (tMax - t[i], shift); // // Convert d[0] .. d[15] into running differences // r[ 0] = d[ 0] - d[ 4] + bias; r[ 1] = d[ 4] - d[ 8] + bias; r[ 2] = d[ 8] - d[12] + bias; r[ 3] = d[ 0] - d[ 1] + bias; r[ 4] = d[ 4] - d[ 5] + bias; r[ 5] = d[ 8] - d[ 9] + bias; r[ 6] = d[12] - d[13] + bias; r[ 7] = d[ 1] - d[ 2] + bias; r[ 8] = d[ 5] - d[ 6] + bias; r[ 9] = d[ 9] - d[10] + bias; r[10] = d[13] - d[14] + bias; r[11] = d[ 2] - d[ 3] + bias; r[12] = d[ 6] - d[ 7] + bias; r[13] = d[10] - d[11] + bias; r[14] = d[14] - d[15] + bias; rMin = r[0]; rMax = r[0]; for (int i = 1; i < 15; ++i) { if (rMin > r[i]) rMin = r[i]; if (rMax < r[i]) rMax = r[i]; } } while (rMin < 0 || rMax > 0x3f); if (rMin == bias && rMax == bias && optFlatFields) { // // Special case - all pixels have the same value. // We encode this in 3 instead of 14 bytes by // storing the value 0xfc in the third output byte, // which cannot occur in the 14-byte encoding. // b[0] = (t[0] >> 8); b[1] = (unsigned char) t[0]; b[2] = 0xfc; return 3; } if (exactMax) { // // Adjust t[0] so that the pixel whose value is equal // to tMax gets represented as accurately as possible. // t[0] = tMax - (d[0] << shift); } // // Pack t[0], shift and r[0] ... r[14] into 14 bytes: // b[ 0] = (t[0] >> 8); b[ 1] = (unsigned char) t[0]; b[ 2] = (unsigned char) ((shift << 2) | (r[ 0] >> 4)); b[ 3] = (unsigned char) ((r[ 0] << 4) | (r[ 1] >> 2)); b[ 4] = (unsigned char) ((r[ 1] << 6) | r[ 2] ); b[ 5] = (unsigned char) ((r[ 3] << 2) | (r[ 4] >> 4)); b[ 6] = (unsigned char) ((r[ 4] << 4) | (r[ 5] >> 2)); b[ 7] = (unsigned char) ((r[ 5] << 6) | r[ 6] ); b[ 8] = (unsigned char) ((r[ 7] << 2) | (r[ 8] >> 4)); b[ 9] = (unsigned char) ((r[ 8] << 4) | (r[ 9] >> 2)); b[10] = (unsigned char) ((r[ 9] << 6) | r[10] ); b[11] = (unsigned char) ((r[11] << 2) | (r[12] >> 4)); b[12] = (unsigned char) ((r[12] << 4) | (r[13] >> 2)); b[13] = (unsigned char) ((r[13] << 6) | r[14] ); return 14; } inline void unpack14 (const unsigned char b[14], unsigned short s[16]) { // // Unpack a 14-byte block into 4 by 4 16-bit pixels. // #if defined (DEBUG) assert (b[2] != 0xfc); #endif s[ 0] = (b[0] << 8) | b[1]; unsigned short shift = (b[ 2] >> 2); unsigned short bias = (0x20u << shift); s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3fu) << shift) - bias; s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3fu) << shift) - bias; s[12] = s[ 8] + ((b[ 4] & 0x3fu) << shift) - bias; s[ 1] = s[ 0] + ((unsigned int) (b[ 5] >> 2) << shift) - bias; s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3fu) << shift) - bias; s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3fu) << shift) - bias; s[13] = s[12] + ((b[ 7] & 0x3fu) << shift) - bias; s[ 2] = s[ 1] + ((unsigned int)(b[ 8] >> 2) << shift) - bias; s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3fu) << shift) - bias; s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3fu) << shift) - bias; s[14] = s[13] + ((b[10] & 0x3fu) << shift) - bias; s[ 3] = s[ 2] + ((unsigned int)(b[11] >> 2) << shift) - bias; s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3fu) << shift) - bias; s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3fu) << shift) - bias; s[15] = s[14] + ((b[13] & 0x3fu) << shift) - bias; for (int i = 0; i < 16; ++i) { if (s[i] & 0x8000) s[i] &= 0x7fff; else s[i] = ~s[i]; } } inline void unpack3 (const unsigned char b[3], unsigned short s[16]) { // // Unpack a 3-byte block into 4 by 4 identical 16-bit pixels. // #if defined (DEBUG) assert (b[2] == 0xfc); #endif s[0] = (b[0] << 8) | b[1]; if (s[0] & 0x8000) s[0] &= 0x7fff; else s[0] = ~s[0]; for (int i = 1; i < 16; ++i) s[i] = s[0]; } void notEnoughData () { throw IEX_NAMESPACE::InputExc ("Error decompressing data " "(input data are shorter than expected)."); } void tooMuchData () { throw IEX_NAMESPACE::InputExc ("Error decompressing data " "(input data are longer than expected)."); } } // namespace struct B44Compressor::ChannelData { unsigned short * start; unsigned short * end; int nx; int ny; int ys; PixelType type; bool pLinear; int size; }; B44Compressor::B44Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines, bool optFlatFields) : Compressor (hdr), _maxScanLineSize (maxScanLineSize), _optFlatFields (optFlatFields), _format (XDR), _numScanLines (numScanLines), _tmpBuffer (0), _outBuffer (0), _numChans (0), _channels (hdr.channels()), _channelData (0) { // TODO: Remove this when we can change the ABI (void)_maxScanLineSize; // // Allocate buffers for compressed an uncompressed pixel data, // allocate a set of ChannelData structs to help speed up the // compress() and uncompress() functions, below, and determine // if uncompressed pixel data should be in native or Xdr format. // _tmpBuffer = new unsigned short [checkArraySize (uiMult (maxScanLineSize / sizeof(unsigned short), numScanLines), sizeof (unsigned short))]; const ChannelList &channels = header().channels(); int numHalfChans = 0; for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c) { assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); ++_numChans; if (c.channel().type == HALF) ++numHalfChans; } // // Compressed data may be larger than the input data // size_t padding = 12 * numHalfChans * (numScanLines + 3) / 4; _outBuffer = new char [uiAdd (uiMult (maxScanLineSize, numScanLines), padding)]; _channelData = new ChannelData[_numChans]; int i = 0; for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c, ++i) { _channelData[i].ys = c.channel().ySampling; _channelData[i].type = c.channel().type; _channelData[i].pLinear = c.channel().pLinear; _channelData[i].size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); } const Box2i &dataWindow = hdr.dataWindow(); _minX = dataWindow.min.x; _maxX = dataWindow.max.x; _maxY = dataWindow.max.y; // // We can support uncompressed data in the machine's native // format only if all image channels are of type HALF. // assert (sizeof (unsigned short) == pixelTypeSize (HALF)); if (_numChans == numHalfChans) _format = NATIVE; } B44Compressor::~B44Compressor () { delete [] _tmpBuffer; delete [] _outBuffer; delete [] _channelData; } int B44Compressor::numScanLines () const { return _numScanLines; } Compressor::Format B44Compressor::format () const { return _format; } int B44Compressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return compress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + numScanLines() - 1)), outPtr); } int B44Compressor::compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { return compress (inPtr, inSize, range, outPtr); } int B44Compressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return uncompress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + numScanLines() - 1)), outPtr); } int B44Compressor::uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { return uncompress (inPtr, inSize, range, outPtr); } int B44Compressor::compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { // // Compress a block of pixel data: First copy the input pixels // from the input buffer into _tmpBuffer, rearranging them such // that blocks of 4x4 pixels of a single channel can be accessed // conveniently. Then compress each 4x4 block of HALF pixel data // and append the result to the output buffer. Copy UINT and // FLOAT data to the output buffer without compressing them. // outPtr = _outBuffer; if (inSize == 0) { // // Special case - empty input buffer. // return 0; } // // For each channel, detemine how many pixels are stored // in the input buffer, and where those pixels will be // placed in _tmpBuffer. // int minX = range.min.x; int maxX = min (range.max.x, _maxX); int minY = range.min.y; int maxY = min (range.max.y, _maxY); unsigned short *tmpBufferEnd = _tmpBuffer; int i = 0; for (ChannelList::ConstIterator c = _channels.begin(); c != _channels.end(); ++c, ++i) { ChannelData &cd = _channelData[i]; cd.start = tmpBufferEnd; cd.end = cd.start; cd.nx = numSamples (c.channel().xSampling, minX, maxX); cd.ny = numSamples (c.channel().ySampling, minY, maxY); tmpBufferEnd += cd.nx * cd.ny * cd.size; } if (_format == XDR) { // // The data in the input buffer are in the machine-independent // Xdr format. Copy the HALF channels into _tmpBuffer and // convert them back into native format for compression. // Copy UINT and FLOAT channels verbatim into _tmpBuffer. // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; if (cd.type == HALF) { for (int x = cd.nx; x > 0; --x) { Xdr::read (inPtr, *cd.end); ++cd.end; } } else { int n = cd.nx * cd.size; memcpy (cd.end, inPtr, n * sizeof (unsigned short)); inPtr += n * sizeof (unsigned short); cd.end += n; } } } } else { // // The input buffer contains only HALF channels, and they // are in native, machine-dependent format. Copy the pixels // into _tmpBuffer. // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; #if defined (DEBUG) assert (cd.type == HALF); #endif if (modp (y, cd.ys) != 0) continue; int n = cd.nx * cd.size; memcpy (cd.end, inPtr, n * sizeof (unsigned short)); inPtr += n * sizeof (unsigned short); cd.end += n; } } } // // The pixels for each channel have been packed into a contiguous // block in _tmpBuffer. HALF channels are in native format; UINT // and FLOAT channels are in Xdr format. // #if defined (DEBUG) for (int i = 1; i < _numChans; ++i) assert (_channelData[i-1].end == _channelData[i].start); assert (_channelData[_numChans-1].end == tmpBufferEnd); #endif // // For each HALF channel, split the data in _tmpBuffer into 4x4 // pixel blocks. Compress each block and append the compressed // data to the output buffer. // // UINT and FLOAT channels are copied from _tmpBuffer into the // output buffer without further processing. // char *outEnd = _outBuffer; for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (cd.type != HALF) { // // UINT or FLOAT channel. // int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); memcpy (outEnd, cd.start, n); outEnd += n; continue; } // // HALF channel // for (int y = 0; y < cd.ny; y += 4) { // // Copy the next 4x4 pixel block into array s. // If the width, cd.nx, or the height, cd.ny, of // the pixel data in _tmpBuffer is not divisible // by 4, then pad the data by repeating the // rightmost column and the bottom row. // unsigned short *row0 = cd.start + y * cd.nx; unsigned short *row1 = row0 + cd.nx; unsigned short *row2 = row1 + cd.nx; unsigned short *row3 = row2 + cd.nx; if (y + 3 >= cd.ny) { if (y + 1 >= cd.ny) row1 = row0; if (y + 2 >= cd.ny) row2 = row1; row3 = row2; } for (int x = 0; x < cd.nx; x += 4) { unsigned short s[16]; if (x + 3 >= cd.nx) { int n = cd.nx - x; for (int i = 0; i < 4; ++i) { int j = min (i, n - 1); s[i + 0] = row0[j]; s[i + 4] = row1[j]; s[i + 8] = row2[j]; s[i + 12] = row3[j]; } } else { memcpy (&s[ 0], row0, 4 * sizeof (unsigned short)); memcpy (&s[ 4], row1, 4 * sizeof (unsigned short)); memcpy (&s[ 8], row2, 4 * sizeof (unsigned short)); memcpy (&s[12], row3, 4 * sizeof (unsigned short)); } row0 += 4; row1 += 4; row2 += 4; row3 += 4; // // Compress the contents of array s and append the // results to the output buffer. // if (cd.pLinear) convertFromLinear (s); outEnd += pack (s, (unsigned char *) outEnd, _optFlatFields, !cd.pLinear); } } } return outEnd - _outBuffer; } int B44Compressor::uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { // // This function is the reverse of the compress() function, // above. First all pixels are moved from the input buffer // into _tmpBuffer. UINT and FLOAT channels are copied // verbatim; HALF channels are uncompressed in blocks of // 4x4 pixels. Then the pixels in _tmpBuffer are copied // into the output buffer and rearranged such that the data // for for each scan line form a contiguous block. // outPtr = _outBuffer; if (inSize == 0) { return 0; } int minX = range.min.x; int maxX = min (range.max.x, _maxX); int minY = range.min.y; int maxY = min (range.max.y, _maxY); unsigned short *tmpBufferEnd = _tmpBuffer; int i = 0; for (ChannelList::ConstIterator c = _channels.begin(); c != _channels.end(); ++c, ++i) { ChannelData &cd = _channelData[i]; cd.start = tmpBufferEnd; cd.end = cd.start; cd.nx = numSamples (c.channel().xSampling, minX, maxX); cd.ny = numSamples (c.channel().ySampling, minY, maxY); tmpBufferEnd += cd.nx * cd.ny * cd.size; } for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (cd.type != HALF) { // // UINT or FLOAT channel. // int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); if (inSize < n) notEnoughData(); memcpy (cd.start, inPtr, n); inPtr += n; inSize -= n; continue; } // // HALF channel // for (int y = 0; y < cd.ny; y += 4) { unsigned short *row0 = cd.start + y * cd.nx; unsigned short *row1 = row0 + cd.nx; unsigned short *row2 = row1 + cd.nx; unsigned short *row3 = row2 + cd.nx; for (int x = 0; x < cd.nx; x += 4) { unsigned short s[16]; if (inSize < 3) notEnoughData(); // // If shift exponent is 63, call unpack14 (ignoring unused bits) // if (((const unsigned char *)inPtr)[2] >= (13<<2) ) { unpack3 ((const unsigned char *)inPtr, s); inPtr += 3; inSize -= 3; } else { if (inSize < 14) notEnoughData(); unpack14 ((const unsigned char *)inPtr, s); inPtr += 14; inSize -= 14; } if (cd.pLinear) convertToLinear (s); int n = (x + 3 < cd.nx)? 4 * sizeof (unsigned short) : (cd.nx - x) * sizeof (unsigned short); if (y + 3 < cd.ny) { memcpy (row0, &s[ 0], n); memcpy (row1, &s[ 4], n); memcpy (row2, &s[ 8], n); memcpy (row3, &s[12], n); } else { memcpy (row0, &s[ 0], n); if (y + 1 < cd.ny) memcpy (row1, &s[ 4], n); if (y + 2 < cd.ny) memcpy (row2, &s[ 8], n); } row0 += 4; row1 += 4; row2 += 4; row3 += 4; } } } char *outEnd = _outBuffer; if (_format == XDR) { for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; if (cd.type == HALF) { for (int x = cd.nx; x > 0; --x) { Xdr::write (outEnd, *cd.end); ++cd.end; } } else { int n = cd.nx * cd.size; memcpy (outEnd, cd.end, n * sizeof (unsigned short)); outEnd += n * sizeof (unsigned short); cd.end += n; } } } } else { for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; #if defined (DEBUG) assert (cd.type == HALF); #endif if (modp (y, cd.ys) != 0) continue; int n = cd.nx * cd.size; memcpy (outEnd, cd.end, n * sizeof (unsigned short)); outEnd += n * sizeof (unsigned short); cd.end += n; } } } #if defined (DEBUG) for (int i = 1; i < _numChans; ++i) assert (_channelData[i-1].end == _channelData[i].start); assert (_channelData[_numChans-1].end == tmpBufferEnd); #endif if (inSize > 0) tooMuchData(); outPtr = _outBuffer; return outEnd - _outBuffer; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfB44Compressor.h000066400000000000000000000100271406177042200210600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_B44_COMPRESSOR_H #define INCLUDED_IMF_B44_COMPRESSOR_H //----------------------------------------------------------------------------- // // class B44Compressor -- lossy compression of 4x4 pixel blocks // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class B44Compressor: public Compressor { public: IMF_EXPORT B44Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines, bool optFlatFields); IMF_EXPORT virtual ~B44Compressor (); B44Compressor (const B44Compressor& other) = delete; B44Compressor& operator = (const B44Compressor& other) = delete; B44Compressor (B44Compressor&& other) = delete; B44Compressor& operator = (B44Compressor&& other) = delete; IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual Format format () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); private: struct ChannelData; int compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int _maxScanLineSize; bool _optFlatFields; Format _format; int _numScanLines; unsigned short * _tmpBuffer; char * _outBuffer; int _numChans; const ChannelList & _channels; ChannelData * _channelData; int _minX; int _maxX; int _maxY; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfBoxAttribute.cpp000066400000000000000000000067461406177042200214360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Box2iAttribute // class Box2fAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * Box2iAttribute::staticTypeName () { return "box2i"; } template <> void Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.min.x); Xdr::write (os, _value.min.y); Xdr::write (os, _value.max.x); Xdr::write (os, _value.max.y); } template <> void Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.min.x); Xdr::read (is, _value.min.y); Xdr::read (is, _value.max.x); Xdr::read (is, _value.max.y); } template <> const char * Box2fAttribute::staticTypeName () { return "box2f"; } template <> void Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.min.x); Xdr::write (os, _value.min.y); Xdr::write (os, _value.max.x); Xdr::write (os, _value.max.y); } template <> void Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.min.x); Xdr::read (is, _value.min.y); Xdr::read (is, _value.max.x); Xdr::read (is, _value.max.y); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfBoxAttribute.h000066400000000000000000000061441406177042200210730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_BOX_ATTRIBUTE_H #define INCLUDED_IMF_BOX_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class Box2iAttribute // class Box2fAttribute // //----------------------------------------------------------------------------- #include "ImfForward.h" #include "ImfExport.h" #include "ImfAttribute.h" #include "ImathBox.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute Box2iAttribute; template <> IMF_EXPORT const char *Box2iAttribute::staticTypeName (); template <> IMF_EXPORT void Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute Box2fAttribute; template <> IMF_EXPORT const char *Box2fAttribute::staticTypeName (); template <> IMF_EXPORT void Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCRgbaFile.cpp000066400000000000000000000637521406177042200206000ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // C interface to C++ classes Imf::RgbaOutputFile and Imf::RgbaInputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include "half.h" #include "ImfNamespace.h" #include "ImathForward.h" #include using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::Box2f; using IMATH_NAMESPACE::V2i; using IMATH_NAMESPACE::V2f; using IMATH_NAMESPACE::V3i; using IMATH_NAMESPACE::V3f; using IMATH_NAMESPACE::M33f; using IMATH_NAMESPACE::M44f; namespace { const int MAX_ERR_LENGTH = 1024; char errorMessage[MAX_ERR_LENGTH]; void setErrorMessage (const std::exception &e) { strncpy (errorMessage, e.what(), MAX_ERR_LENGTH - 1); errorMessage[MAX_ERR_LENGTH - 1] = 0; } inline OPENEXR_IMF_INTERNAL_NAMESPACE::Header * header (ImfHeader *hdr) { return (OPENEXR_IMF_INTERNAL_NAMESPACE::Header *)(hdr); } inline const OPENEXR_IMF_INTERNAL_NAMESPACE::Header * header (const ImfHeader *hdr) { return (const OPENEXR_IMF_INTERNAL_NAMESPACE::Header *)(hdr); } inline OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile * outfile (ImfOutputFile *out) { return (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile *) out; } inline const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile * outfile (const ImfOutputFile *out) { return (const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile *) out; } inline OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile * outfile (ImfTiledOutputFile *out) { return (OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile *) out; } inline const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile * outfile (const ImfTiledOutputFile *out) { return (const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile *) out; } inline OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile * infile (ImfInputFile *in) { return (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile *) in; } inline const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile * infile (const ImfInputFile *in) { return (const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile *) in; } inline OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile * infile (ImfTiledInputFile *in) { return (OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile *) in; } inline const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile * infile (const ImfTiledInputFile *in) { return (const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile *) in; } } // namespace void ImfFloatToHalf (float f, ImfHalf *h) { *h = half(f).bits(); } void ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/]) { for (int i = 0; i < n; ++i) h[i] = half(f[i]).bits(); } float ImfHalfToFloat (ImfHalf h) { return float (*((half *)&h)); } void ImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/]) { for (int i = 0; i < n; ++i) f[i] = float (*((half *)(h + i))); } ImfHeader * ImfNewHeader (void) { try { return (ImfHeader *) new OPENEXR_IMF_INTERNAL_NAMESPACE::Header; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } void ImfDeleteHeader (ImfHeader *hdr) { delete header (hdr); } ImfHeader * ImfCopyHeader (const ImfHeader *hdr) { try { return (ImfHeader *) new OPENEXR_IMF_INTERNAL_NAMESPACE::Header (*header (hdr)); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } void ImfHeaderSetDisplayWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax) { header(hdr)->displayWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); } void ImfHeaderDisplayWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax) { const Box2i dw = header(hdr)->displayWindow(); *xMin = dw.min.x; *yMin = dw.min.y; *xMax = dw.max.x; *yMax = dw.max.y; } void ImfHeaderSetDataWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax) { header(hdr)->dataWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); } void ImfHeaderDataWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax) { const Box2i dw = header(hdr)->dataWindow(); *xMin = dw.min.x; *yMin = dw.min.y; *xMax = dw.max.x; *yMax = dw.max.y; } void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio) { header(hdr)->pixelAspectRatio() = pixelAspectRatio; } float ImfHeaderPixelAspectRatio (const ImfHeader *hdr) { return header(hdr)->pixelAspectRatio(); } void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y) { header(hdr)->screenWindowCenter() = V2f (x, y); } void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y) { const V2i &swc = header(hdr)->screenWindowCenter(); *x = (float) swc.x; *y = (float) swc.y; } void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width) { header(hdr)->screenWindowWidth() = width; } float ImfHeaderScreenWindowWidth (const ImfHeader *hdr) { return header(hdr)->screenWindowWidth(); } void ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder) { header(hdr)->lineOrder() = OPENEXR_IMF_INTERNAL_NAMESPACE::LineOrder (lineOrder); } int ImfHeaderLineOrder (const ImfHeader *hdr) { return header(hdr)->lineOrder(); } void ImfHeaderSetCompression (ImfHeader *hdr, int compression) { header(hdr)->compression() = OPENEXR_IMF_INTERNAL_NAMESPACE::Compression (compression); } int ImfHeaderCompression (const ImfHeader *hdr) { return header(hdr)->compression(); } int ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value) { try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::IntAttribute (value)); } else { header(hdr)->typedAttribute(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value) { try { *value = header(hdr)->typedAttribute(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value) { try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::FloatAttribute (value)); } else { header(hdr)->typedAttribute(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value) { try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::DoubleAttribute (value)); } else { header(hdr)->typedAttribute(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value) { try { *value = header(hdr)->typedAttribute(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderDoubleAttribute (const ImfHeader *hdr, const char name[], double *value) { try { *value = header(hdr)-> typedAttribute(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetStringAttribute (ImfHeader *hdr, const char name[], const char value[]) { try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::StringAttribute (value)); } else { header(hdr)->typedAttribute(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderStringAttribute (const ImfHeader *hdr, const char name[], const char **value) { try { *value = header(hdr)-> typedAttribute(name).value().c_str(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetBox2iAttribute (ImfHeader *hdr, const char name[], int xMin, int yMin, int xMax, int yMax) { try { Box2i box (V2i (xMin, yMin), V2i (xMax, yMax)); if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::Box2iAttribute (box)); } else { header(hdr)->typedAttribute(name).value() = box; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderBox2iAttribute (const ImfHeader *hdr, const char name[], int *xMin, int *yMin, int *xMax, int *yMax) { try { const Box2i &box = header(hdr)->typedAttribute(name).value(); *xMin = box.min.x; *yMin = box.min.y; *xMax = box.max.x; *yMax = box.max.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetBox2fAttribute (ImfHeader *hdr, const char name[], float xMin, float yMin, float xMax, float yMax) { try { Box2f box (V2f (xMin, yMin), V2f (xMax, yMax)); if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::Box2fAttribute (box)); } else { header(hdr)->typedAttribute(name).value() = box; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderBox2fAttribute (const ImfHeader *hdr, const char name[], float *xMin, float *yMin, float *xMax, float *yMax) { try { const Box2f &box = header(hdr)->typedAttribute(name).value(); *xMin = box.min.x; *yMin = box.min.y; *xMax = box.max.x; *yMax = box.max.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetV2iAttribute (ImfHeader *hdr, const char name[], int x, int y) { try { V2i v (x, y); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V2iAttribute (v)); else header(hdr)->typedAttribute(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderV2iAttribute (const ImfHeader *hdr, const char name[], int *x, int *y) { try { const V2i &v = header(hdr)->typedAttribute(name).value(); *x = v.x; *y = v.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetV2fAttribute (ImfHeader *hdr, const char name[], float x, float y) { try { V2f v (x, y); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V2fAttribute (v)); else header(hdr)->typedAttribute(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderV2fAttribute (const ImfHeader *hdr, const char name[], float *x, float *y) { try { const V2f &v = header(hdr)->typedAttribute(name).value(); *x = v.x; *y = v.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetV3iAttribute (ImfHeader *hdr, const char name[], int x, int y, int z) { try { V3i v (x, y, z); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V3iAttribute (v)); else header(hdr)->typedAttribute(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderV3iAttribute (const ImfHeader *hdr, const char name[], int *x, int *y, int *z) { try { const V3i &v = header(hdr)->typedAttribute(name).value(); *x = v.x; *y = v.y; *z = v.z; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetV3fAttribute (ImfHeader *hdr, const char name[], float x, float y, float z) { try { V3f v (x, y, z); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V3fAttribute (v)); else header(hdr)->typedAttribute(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderV3fAttribute (const ImfHeader *hdr, const char name[], float *x, float *y, float *z) { try { const V3f &v = header(hdr)->typedAttribute(name).value(); *x = v.x; *y = v.y; *z = v.z; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetM33fAttribute (ImfHeader *hdr, const char name[], const float m[3][3]) { try { M33f m3 (m); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::M33fAttribute (m3)); else header(hdr)->typedAttribute(name).value() = m3; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderM33fAttribute (const ImfHeader *hdr, const char name[], float m[3][3]) { try { const M33f &m3 = header(hdr)->typedAttribute(name).value(); m[0][0] = m3[0][0]; m[0][1] = m3[0][1]; m[0][2] = m3[0][2]; m[1][0] = m3[1][0]; m[1][1] = m3[1][1]; m[1][2] = m3[1][2]; m[2][0] = m3[2][0]; m[2][1] = m3[2][1]; m[2][2] = m3[2][2]; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderSetM44fAttribute (ImfHeader *hdr, const char name[], const float m[4][4]) { try { M44f m4 (m); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::M44fAttribute (m4)); else header(hdr)->typedAttribute(name).value() = m4; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfHeaderM44fAttribute (const ImfHeader *hdr, const char name[], float m[4][4]) { try { const M44f &m4 = header(hdr)->typedAttribute(name).value(); m[0][0] = m4[0][0]; m[0][1] = m4[0][1]; m[0][2] = m4[0][2]; m[0][3] = m4[0][3]; m[1][0] = m4[1][0]; m[1][1] = m4[1][1]; m[1][2] = m4[1][2]; m[1][3] = m4[1][3]; m[2][0] = m4[2][0]; m[2][1] = m4[2][1]; m[2][2] = m4[2][2]; m[2][3] = m4[2][3]; m[3][0] = m4[3][0]; m[3][1] = m4[3][1]; m[3][2] = m4[3][2]; m[3][3] = m4[3][3]; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } ImfOutputFile * ImfOpenOutputFile (const char name[], const ImfHeader *hdr, int channels) { try { return (ImfOutputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile (name, *header(hdr), OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfCloseOutputFile (ImfOutputFile *out) { try { delete outfile (out); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfOutputSetFrameBuffer (ImfOutputFile *out, const ImfRgba *base, size_t xStride, size_t yStride) { try { outfile(out)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)base, xStride, yStride); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfOutputWritePixels (ImfOutputFile *out, int numScanLines) { try { outfile(out)->writePixels (numScanLines); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfOutputCurrentScanLine (const ImfOutputFile *out) { return outfile(out)->currentScanLine(); } const ImfHeader * ImfOutputHeader (const ImfOutputFile *out) { return (const ImfHeader *) &outfile(out)->header(); } int ImfOutputChannels (const ImfOutputFile *out) { return outfile(out)->channels(); } ImfTiledOutputFile * ImfOpenTiledOutputFile (const char name[], const ImfHeader *hdr, int channels, int xSize, int ySize, int mode, int rmode) { try { return (ImfTiledOutputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile (name, *header(hdr), OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels), xSize, ySize, OPENEXR_IMF_INTERNAL_NAMESPACE::LevelMode (mode), OPENEXR_IMF_INTERNAL_NAMESPACE::LevelRoundingMode (rmode)); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfCloseTiledOutputFile (ImfTiledOutputFile *out) { try { delete outfile (out); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, const ImfRgba *base, size_t xStride, size_t yStride) { try { outfile(out)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)base, xStride, yStride); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledOutputWriteTile (ImfTiledOutputFile *out, int dx, int dy, int lx, int ly) { try { outfile(out)->writeTile (dx, dy, lx, ly); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) { try { outfile(out)->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } const ImfHeader * ImfTiledOutputHeader (const ImfTiledOutputFile *out) { return (const ImfHeader *) &outfile(out)->header(); } int ImfTiledOutputChannels (const ImfTiledOutputFile *out) { return outfile(out)->channels(); } int ImfTiledOutputTileXSize (const ImfTiledOutputFile *out) { return outfile(out)->tileXSize(); } int ImfTiledOutputTileYSize (const ImfTiledOutputFile *out) { return outfile(out)->tileYSize(); } int ImfTiledOutputLevelMode (const ImfTiledOutputFile *out) { return outfile(out)->levelMode(); } int ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out) { return outfile(out)->levelRoundingMode(); } ImfInputFile * ImfOpenInputFile (const char name[]) { try { return (ImfInputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile (name); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfCloseInputFile (ImfInputFile *in) { try { delete infile (in); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfInputSetFrameBuffer (ImfInputFile *in, ImfRgba *base, size_t xStride, size_t yStride) { try { infile(in)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *) base, xStride, yStride); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfInputReadPixels (ImfInputFile *in, int scanLine1, int scanLine2) { try { infile(in)->readPixels (scanLine1, scanLine2); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } const ImfHeader * ImfInputHeader (const ImfInputFile *in) { return (const ImfHeader *) &infile(in)->header(); } int ImfInputChannels (const ImfInputFile *in) { return infile(in)->channels(); } const char * ImfInputFileName (const ImfInputFile *in) { return infile(in)->fileName(); } ImfTiledInputFile * ImfOpenTiledInputFile (const char name[]) { try { return (ImfTiledInputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile (name); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfCloseTiledInputFile (ImfTiledInputFile *in) { try { delete infile (in); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, ImfRgba *base, size_t xStride, size_t yStride) { try { infile(in)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *) base, xStride, yStride); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledInputReadTile (ImfTiledInputFile *in, int dx, int dy, int lx, int ly) { try { infile(in)->readTile (dx, dy, lx, ly); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } int ImfTiledInputReadTiles (ImfTiledInputFile *in, int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) { try { infile(in)->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; } } const ImfHeader * ImfTiledInputHeader (const ImfTiledInputFile *in) { return (const ImfHeader *) &infile(in)->header(); } int ImfTiledInputChannels (const ImfTiledInputFile *in) { return infile(in)->channels(); } const char * ImfTiledInputFileName (const ImfTiledInputFile *in) { return infile(in)->fileName(); } int ImfTiledInputTileXSize (const ImfTiledInputFile *in) { return infile(in)->tileXSize(); } int ImfTiledInputTileYSize (const ImfTiledInputFile *in) { return infile(in)->tileYSize(); } int ImfTiledInputLevelMode (const ImfTiledInputFile *in) { return infile(in)->levelMode(); } int ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in) { return infile(in)->levelRoundingMode(); } ImfLut * ImfNewRound12logLut (int channels) { try { return (ImfLut *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut (OPENEXR_IMF_INTERNAL_NAMESPACE::round12log, OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } ImfLut * ImfNewRoundNBitLut (unsigned int n, int channels) { try { return (ImfLut *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut (OPENEXR_IMF_INTERNAL_NAMESPACE::roundNBit (n), OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); } catch (const std::exception &e) { setErrorMessage (e); return 0; } } void ImfDeleteLut (ImfLut *lut) { delete (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut *) lut; } void ImfApplyLut (ImfLut *lut, ImfRgba *data, int nData, int stride) { ((OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut *)lut)->apply ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)data, nData, stride); } const char * ImfErrorMessage () { return errorMessage; } openexr-2.5.7/OpenEXR/IlmImf/ImfCRgbaFile.h000066400000000000000000000311571406177042200202370ustar00rootroot00000000000000/* Copyright (c) 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Industrial Light & Magic 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 OWNER 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. */ #ifndef INCLUDED_IMF_C_RGBA_FILE_H #define INCLUDED_IMF_C_RGBA_FILE_H #include "ImfExport.h" #include #ifdef __cplusplus extern "C" { #endif /* ** Interpreting unsigned shorts as 16-bit floating point numbers */ typedef unsigned short ImfHalf; IMF_EXPORT void ImfFloatToHalf (float f, ImfHalf *h); IMF_EXPORT void ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/]); IMF_EXPORT float ImfHalfToFloat (ImfHalf h); IMF_EXPORT void ImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/]); /* ** RGBA pixel; memory layout must be the same as struct Imf::Rgba. */ struct ImfRgba { ImfHalf r; ImfHalf g; ImfHalf b; ImfHalf a; }; typedef struct ImfRgba ImfRgba; /* ** Magic number; this must be the same as Imf::MAGIC */ #define IMF_MAGIC 20000630 /* ** Version number; this must be the same as Imf::EXR_VERSION */ #define IMF_VERSION_NUMBER 2 /* ** Line order; values must the the same as in Imf::LineOrder. */ #define IMF_INCREASING_Y 0 #define IMF_DECREASING_Y 1 #define IMF_RANDOM_Y 2 /* ** Compression types; values must be the same as in Imf::Compression. */ #define IMF_NO_COMPRESSION 0 #define IMF_RLE_COMPRESSION 1 #define IMF_ZIPS_COMPRESSION 2 #define IMF_ZIP_COMPRESSION 3 #define IMF_PIZ_COMPRESSION 4 #define IMF_PXR24_COMPRESSION 5 #define IMF_B44_COMPRESSION 6 #define IMF_B44A_COMPRESSION 7 #define IMF_DWAA_COMPRESSION 8 #define IMF_DWAB_COMPRESSION 9 /* ** Channels; values must be the same as in Imf::RgbaChannels. */ #define IMF_WRITE_R 0x01 #define IMF_WRITE_G 0x02 #define IMF_WRITE_B 0x04 #define IMF_WRITE_A 0x08 #define IMF_WRITE_Y 0x10 #define IMF_WRITE_C 0x20 #define IMF_WRITE_RGB 0x07 #define IMF_WRITE_RGBA 0x0f #define IMF_WRITE_YC 0x30 #define IMF_WRITE_YA 0x18 #define IMF_WRITE_YCA 0x38 /* ** Level modes; values must be the same as in Imf::LevelMode */ #define IMF_ONE_LEVEL 0 #define IMF_MIPMAP_LEVELS 1 #define IMF_RIPMAP_LEVELS 2 /* ** Level rounding modes; values must be the same as in Imf::LevelRoundingMode */ #define IMF_ROUND_DOWN 0 #define IMF_ROUND_UP 1 /* ** RGBA file header */ struct ImfHeader; typedef struct ImfHeader ImfHeader; IMF_EXPORT ImfHeader * ImfNewHeader (void); IMF_EXPORT void ImfDeleteHeader (ImfHeader *hdr); IMF_EXPORT ImfHeader * ImfCopyHeader (const ImfHeader *hdr); IMF_EXPORT void ImfHeaderSetDisplayWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax); IMF_EXPORT void ImfHeaderDisplayWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax); IMF_EXPORT void ImfHeaderSetDataWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax); IMF_EXPORT void ImfHeaderDataWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax); IMF_EXPORT void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio); IMF_EXPORT float ImfHeaderPixelAspectRatio (const ImfHeader *hdr); IMF_EXPORT void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y); IMF_EXPORT void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y); IMF_EXPORT void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width); IMF_EXPORT float ImfHeaderScreenWindowWidth (const ImfHeader *hdr); IMF_EXPORT void ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder); IMF_EXPORT int ImfHeaderLineOrder (const ImfHeader *hdr); IMF_EXPORT void ImfHeaderSetCompression (ImfHeader *hdr, int compression); IMF_EXPORT int ImfHeaderCompression (const ImfHeader *hdr); IMF_EXPORT int ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value); IMF_EXPORT int ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value); IMF_EXPORT int ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value); IMF_EXPORT int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value); IMF_EXPORT int ImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value); IMF_EXPORT int ImfHeaderDoubleAttribute (const ImfHeader *hdr, const char name[], double *value); IMF_EXPORT int ImfHeaderSetStringAttribute (ImfHeader *hdr, const char name[], const char value[]); IMF_EXPORT int ImfHeaderStringAttribute (const ImfHeader *hdr, const char name[], const char **value); IMF_EXPORT int ImfHeaderSetBox2iAttribute (ImfHeader *hdr, const char name[], int xMin, int yMin, int xMax, int yMax); IMF_EXPORT int ImfHeaderBox2iAttribute (const ImfHeader *hdr, const char name[], int *xMin, int *yMin, int *xMax, int *yMax); IMF_EXPORT int ImfHeaderSetBox2fAttribute (ImfHeader *hdr, const char name[], float xMin, float yMin, float xMax, float yMax); IMF_EXPORT int ImfHeaderBox2fAttribute (const ImfHeader *hdr, const char name[], float *xMin, float *yMin, float *xMax, float *yMax); IMF_EXPORT int ImfHeaderSetV2iAttribute (ImfHeader *hdr, const char name[], int x, int y); IMF_EXPORT int ImfHeaderV2iAttribute (const ImfHeader *hdr, const char name[], int *x, int *y); IMF_EXPORT int ImfHeaderSetV2fAttribute (ImfHeader *hdr, const char name[], float x, float y); IMF_EXPORT int ImfHeaderV2fAttribute (const ImfHeader *hdr, const char name[], float *x, float *y); IMF_EXPORT int ImfHeaderSetV3iAttribute (ImfHeader *hdr, const char name[], int x, int y, int z); IMF_EXPORT int ImfHeaderV3iAttribute (const ImfHeader *hdr, const char name[], int *x, int *y, int *z); IMF_EXPORT int ImfHeaderSetV3fAttribute (ImfHeader *hdr, const char name[], float x, float y, float z); IMF_EXPORT int ImfHeaderV3fAttribute (const ImfHeader *hdr, const char name[], float *x, float *y, float *z); IMF_EXPORT int ImfHeaderSetM33fAttribute (ImfHeader *hdr, const char name[], const float m[3][3]); IMF_EXPORT int ImfHeaderM33fAttribute (const ImfHeader *hdr, const char name[], float m[3][3]); IMF_EXPORT int ImfHeaderSetM44fAttribute (ImfHeader *hdr, const char name[], const float m[4][4]); IMF_EXPORT int ImfHeaderM44fAttribute (const ImfHeader *hdr, const char name[], float m[4][4]); /* ** RGBA output file */ struct ImfOutputFile; typedef struct ImfOutputFile ImfOutputFile; IMF_EXPORT ImfOutputFile * ImfOpenOutputFile (const char name[], const ImfHeader *hdr, int channels); IMF_EXPORT int ImfCloseOutputFile (ImfOutputFile *out); IMF_EXPORT int ImfOutputSetFrameBuffer (ImfOutputFile *out, const ImfRgba *base, size_t xStride, size_t yStride); IMF_EXPORT int ImfOutputWritePixels (ImfOutputFile *out, int numScanLines); IMF_EXPORT int ImfOutputCurrentScanLine (const ImfOutputFile *out); IMF_EXPORT const ImfHeader * ImfOutputHeader (const ImfOutputFile *out); IMF_EXPORT int ImfOutputChannels (const ImfOutputFile *out); /* ** Tiled RGBA output file */ struct ImfTiledOutputFile; typedef struct ImfTiledOutputFile ImfTiledOutputFile; IMF_EXPORT ImfTiledOutputFile * ImfOpenTiledOutputFile (const char name[], const ImfHeader *hdr, int channels, int xSize, int ySize, int mode, int rmode); IMF_EXPORT int ImfCloseTiledOutputFile (ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, const ImfRgba *base, size_t xStride, size_t yStride); IMF_EXPORT int ImfTiledOutputWriteTile (ImfTiledOutputFile *out, int dx, int dy, int lx, int ly); IMF_EXPORT int ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly); IMF_EXPORT const ImfHeader * ImfTiledOutputHeader (const ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputChannels (const ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputTileXSize (const ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputTileYSize (const ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputLevelMode (const ImfTiledOutputFile *out); IMF_EXPORT int ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out); /* ** RGBA input file */ struct ImfInputFile; typedef struct ImfInputFile ImfInputFile; IMF_EXPORT ImfInputFile * ImfOpenInputFile (const char name[]); IMF_EXPORT int ImfCloseInputFile (ImfInputFile *in); IMF_EXPORT int ImfInputSetFrameBuffer (ImfInputFile *in, ImfRgba *base, size_t xStride, size_t yStride); IMF_EXPORT int ImfInputReadPixels (ImfInputFile *in, int scanLine1, int scanLine2); IMF_EXPORT const ImfHeader * ImfInputHeader (const ImfInputFile *in); IMF_EXPORT int ImfInputChannels (const ImfInputFile *in); IMF_EXPORT const char * ImfInputFileName (const ImfInputFile *in); /* ** Tiled RGBA input file */ struct ImfTiledInputFile; typedef struct ImfTiledInputFile ImfTiledInputFile; IMF_EXPORT ImfTiledInputFile * ImfOpenTiledInputFile (const char name[]); IMF_EXPORT int ImfCloseTiledInputFile (ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, ImfRgba *base, size_t xStride, size_t yStride); IMF_EXPORT int ImfTiledInputReadTile (ImfTiledInputFile *in, int dx, int dy, int lx, int ly); IMF_EXPORT int ImfTiledInputReadTiles (ImfTiledInputFile *in, int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly); IMF_EXPORT const ImfHeader * ImfTiledInputHeader (const ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputChannels (const ImfTiledInputFile *in); IMF_EXPORT const char * ImfTiledInputFileName (const ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputTileXSize (const ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputTileYSize (const ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputLevelMode (const ImfTiledInputFile *in); IMF_EXPORT int ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in); /* ** Lookup tables */ struct ImfLut; typedef struct ImfLut ImfLut; IMF_EXPORT ImfLut * ImfNewRound12logLut (int channels); IMF_EXPORT ImfLut * ImfNewRoundNBitLut (unsigned int n, int channels); IMF_EXPORT void ImfDeleteLut (ImfLut *lut); IMF_EXPORT void ImfApplyLut (ImfLut *lut, ImfRgba *data, int nData, int stride); /* ** Most recent error message */ IMF_EXPORT const char * ImfErrorMessage (void); #ifdef __cplusplus } /* extern "C" */ #endif #endif openexr-2.5.7/OpenEXR/IlmImf/ImfChannelList.cpp000066400000000000000000000153031406177042200212130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Channel // class ChannelList // //----------------------------------------------------------------------------- #include #include using std::string; using std::set; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER Channel::Channel (PixelType t, int xs, int ys, bool pl): type (t), xSampling (xs), ySampling (ys), pLinear (pl) { // empty } bool Channel::operator == (const Channel &other) const { return type == other.type && xSampling == other.xSampling && ySampling == other.ySampling && pLinear == other.pLinear; } void ChannelList::insert (const char name[], const Channel &channel) { if (name[0] == 0) THROW (IEX_NAMESPACE::ArgExc, "Image channel name cannot be an empty string."); _map[name] = channel; } void ChannelList::insert (const string &name, const Channel &channel) { insert (name.c_str(), channel); } Channel & ChannelList::operator [] (const char name[]) { ChannelMap::iterator i = _map.find (name); if (i == _map.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\"."); return i->second; } const Channel & ChannelList::operator [] (const char name[]) const { ChannelMap::const_iterator i = _map.find (name); if (i == _map.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\"."); return i->second; } Channel & ChannelList::operator [] (const string &name) { return this->operator[] (name.c_str()); } const Channel & ChannelList::operator [] (const string &name) const { return this->operator[] (name.c_str()); } Channel * ChannelList::findChannel (const char name[]) { ChannelMap::iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } const Channel * ChannelList::findChannel (const char name[]) const { ChannelMap::const_iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } Channel * ChannelList::findChannel (const string &name) { return findChannel (name.c_str()); } const Channel * ChannelList::findChannel (const string &name) const { return findChannel (name.c_str()); } ChannelList::Iterator ChannelList::begin () { return _map.begin(); } ChannelList::ConstIterator ChannelList::begin () const { return _map.begin(); } ChannelList::Iterator ChannelList::end () { return _map.end(); } ChannelList::ConstIterator ChannelList::end () const { return _map.end(); } ChannelList::Iterator ChannelList::find (const char name[]) { return _map.find (name); } ChannelList::ConstIterator ChannelList::find (const char name[]) const { return _map.find (name); } ChannelList::Iterator ChannelList::find (const string &name) { return find (name.c_str()); } ChannelList::ConstIterator ChannelList::find (const string &name) const { return find (name.c_str()); } void ChannelList::layers (set &layerNames) const { layerNames.clear(); for (ConstIterator i = begin(); i != end(); ++i) { string layerName = i.name(); size_t pos = layerName.rfind ('.'); if (pos != string::npos && pos != 0 && pos + 1 < layerName.size()) { layerName.erase (pos); layerNames.insert (layerName); } } } void ChannelList::channelsInLayer (const string &layerName, Iterator &first, Iterator &last) { channelsWithPrefix (layerName + '.', first, last); } void ChannelList::channelsInLayer (const string &layerName, ConstIterator &first, ConstIterator &last) const { channelsWithPrefix (layerName + '.', first, last); } void ChannelList::channelsWithPrefix (const char prefix[], Iterator &first, Iterator &last) { first = last = _map.lower_bound (prefix); size_t n = int(strlen (prefix)); while (last != Iterator (_map.end()) && strncmp (last.name(), prefix, n) <= 0) { ++last; } } void ChannelList::channelsWithPrefix (const char prefix[], ConstIterator &first, ConstIterator &last) const { first = last = _map.lower_bound (prefix); size_t n = strlen (prefix); while (last != ConstIterator (_map.end()) && strncmp (last.name(), prefix, n) <= 0) { ++last; } } void ChannelList::channelsWithPrefix (const string &prefix, Iterator &first, Iterator &last) { return channelsWithPrefix (prefix.c_str(), first, last); } void ChannelList::channelsWithPrefix (const string &prefix, ConstIterator &first, ConstIterator &last) const { return channelsWithPrefix (prefix.c_str(), first, last); } bool ChannelList::operator == (const ChannelList &other) const { ConstIterator i = begin(); ConstIterator j = other.begin(); while (i != end() && j != other.end()) { if (!(i.channel() == j.channel())) return false; ++i; ++j; } return i == end() && j == other.end(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfChannelList.h000066400000000000000000000274321406177042200206660ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CHANNEL_LIST_H #define INCLUDED_IMF_CHANNEL_LIST_H //----------------------------------------------------------------------------- // // class Channel // class ChannelList // //----------------------------------------------------------------------------- #include "ImfName.h" #include "ImfPixelType.h" #include "ImfNamespace.h" #include "ImfExport.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct Channel { //------------------------------ // Data type; see ImfPixelType.h //------------------------------ PixelType type; //-------------------------------------------- // Subsampling: pixel (x, y) is present in the // channel only if // // x % xSampling == 0 && y % ySampling == 0 // //-------------------------------------------- int xSampling; int ySampling; //-------------------------------------------------------------- // Hint to lossy compression methods that indicates whether // human perception of the quantity represented by this channel // is closer to linear or closer to logarithmic. Compression // methods may optimize image quality by adjusting pixel data // quantization acording to this hint. // For example, perception of red, green, blue and luminance is // approximately logarithmic; the difference between 0.1 and 0.2 // is perceived to be roughly the same as the difference between // 1.0 and 2.0. Perception of chroma coordinates tends to be // closer to linear than logarithmic; the difference between 0.1 // and 0.2 is perceived to be roughly the same as the difference // between 1.0 and 1.1. //-------------------------------------------------------------- bool pLinear; //------------ // Constructor //------------ IMF_EXPORT Channel (PixelType type = HALF, int xSampling = 1, int ySampling = 1, bool pLinear = false); //------------ // Operator == //------------ IMF_EXPORT bool operator == (const Channel &other) const; }; class ChannelList { public: //-------------- // Add a channel //-------------- IMF_EXPORT void insert (const char name[], const Channel &channel); IMF_EXPORT void insert (const std::string &name, const Channel &channel); //------------------------------------------------------------------ // Access to existing channels: // // [n] Returns a reference to the channel with name n. // If no channel with name n exists, an IEX_NAMESPACE::ArgExc // is thrown. // // findChannel(n) Returns a pointer to the channel with name n, // or 0 if no channel with name n exists. // //------------------------------------------------------------------ IMF_EXPORT Channel & operator [] (const char name[]); IMF_EXPORT const Channel & operator [] (const char name[]) const; IMF_EXPORT Channel & operator [] (const std::string &name); IMF_EXPORT const Channel & operator [] (const std::string &name) const; IMF_EXPORT Channel * findChannel (const char name[]); IMF_EXPORT const Channel * findChannel (const char name[]) const; IMF_EXPORT Channel * findChannel (const std::string &name); IMF_EXPORT const Channel * findChannel (const std::string &name) const; //------------------------------------------- // Iterator-style access to existing channels //------------------------------------------- typedef std::map ChannelMap; class Iterator; class ConstIterator; IMF_EXPORT Iterator begin (); IMF_EXPORT ConstIterator begin () const; IMF_EXPORT Iterator end (); IMF_EXPORT ConstIterator end () const; IMF_EXPORT Iterator find (const char name[]); IMF_EXPORT ConstIterator find (const char name[]) const; IMF_EXPORT Iterator find (const std::string &name); IMF_EXPORT ConstIterator find (const std::string &name) const; //----------------------------------------------------------------- // Support for image layers: // // In an image file with many channels it is sometimes useful to // group the channels into "layers", that is, into sets of channels // that logically belong together. Grouping channels into layers // is done using a naming convention: channel C in layer L is // called "L.C". // // For example, a computer graphic image may contain separate // R, G and B channels for light that originated at each of // several different virtual light sources. The channels in // this image might be called "light1.R", "light1.G", "light1.B", // "light2.R", "light2.G", "light2.B", etc. // // Note that this naming convention allows layers to be nested; // for example, "light1.specular.R" identifies the "R" channel // in the "specular" sub-layer of layer "light1". // // Channel names that don't contain a "." or that contain a // "." only at the beginning or at the end are not considered // to be part of any layer. // // layers(lns) sorts the channels in this ChannelList // into layers and stores the names of // all layers, sorted alphabetically, // into string set lns. // // channelsInLayer(ln,f,l) stores a pair of iterators in f and l // such that the loop // // for (ConstIterator i = f; i != l; ++i) // ... // // iterates over all channels in layer ln. // channelsInLayer (ln, l, p) calls // channelsWithPrefix (ln + ".", l, p). // //----------------------------------------------------------------- IMF_EXPORT void layers (std::set &layerNames) const; IMF_EXPORT void channelsInLayer (const std::string &layerName, Iterator &first, Iterator &last); IMF_EXPORT void channelsInLayer (const std::string &layerName, ConstIterator &first, ConstIterator &last) const; //------------------------------------------------------------------- // Find all channels whose name begins with a given prefix: // // channelsWithPrefix(p,f,l) stores a pair of iterators in f and l // such that the following loop iterates over all channels whose name // begins with string p: // // for (ConstIterator i = f; i != l; ++i) // ... // //------------------------------------------------------------------- IMF_EXPORT void channelsWithPrefix (const char prefix[], Iterator &first, Iterator &last); IMF_EXPORT void channelsWithPrefix (const char prefix[], ConstIterator &first, ConstIterator &last) const; IMF_EXPORT void channelsWithPrefix (const std::string &prefix, Iterator &first, Iterator &last); IMF_EXPORT void channelsWithPrefix (const std::string &prefix, ConstIterator &first, ConstIterator &last) const; //------------ // Operator == //------------ IMF_EXPORT bool operator == (const ChannelList &other) const; private: ChannelMap _map; }; //---------- // Iterators //---------- class ChannelList::Iterator { public: IMF_EXPORT Iterator (); IMF_EXPORT Iterator (const ChannelList::ChannelMap::iterator &i); IMF_EXPORT Iterator & operator ++ (); IMF_EXPORT Iterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT Channel & channel () const; private: friend class ChannelList::ConstIterator; ChannelList::ChannelMap::iterator _i; }; class ChannelList::ConstIterator { public: IMF_EXPORT ConstIterator (); IMF_EXPORT ConstIterator (const ChannelList::ChannelMap::const_iterator &i); IMF_EXPORT ConstIterator (const ChannelList::Iterator &other); IMF_EXPORT ConstIterator & operator ++ (); IMF_EXPORT ConstIterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT const Channel & channel () const; private: friend bool operator == (const ConstIterator &, const ConstIterator &); friend bool operator != (const ConstIterator &, const ConstIterator &); ChannelList::ChannelMap::const_iterator _i; }; //----------------- // Inline Functions //----------------- inline ChannelList::Iterator::Iterator (): _i() { // empty } inline ChannelList::Iterator::Iterator (const ChannelList::ChannelMap::iterator &i): _i (i) { // empty } inline ChannelList::Iterator & ChannelList::Iterator::operator ++ () { ++_i; return *this; } inline ChannelList::Iterator ChannelList::Iterator::operator ++ (int) { Iterator tmp = *this; ++_i; return tmp; } inline const char * ChannelList::Iterator::name () const { return *_i->first; } inline Channel & ChannelList::Iterator::channel () const { return _i->second; } inline ChannelList::ConstIterator::ConstIterator (): _i() { // empty } inline ChannelList::ConstIterator::ConstIterator (const ChannelList::ChannelMap::const_iterator &i): _i (i) { // empty } inline ChannelList::ConstIterator::ConstIterator (const ChannelList::Iterator &other): _i (other._i) { // empty } inline ChannelList::ConstIterator & ChannelList::ConstIterator::operator ++ () { ++_i; return *this; } inline ChannelList::ConstIterator ChannelList::ConstIterator::operator ++ (int) { ConstIterator tmp = *this; ++_i; return tmp; } inline const char * ChannelList::ConstIterator::name () const { return *_i->first; } inline const Channel & ChannelList::ConstIterator::channel () const { return _i->second; } inline bool operator == (const ChannelList::ConstIterator &x, const ChannelList::ConstIterator &y) { return x._i == y._i; } inline bool operator != (const ChannelList::ConstIterator &x, const ChannelList::ConstIterator &y) { return !(x == y); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfChannelListAttribute.cpp000066400000000000000000000111041406177042200230720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class ChannelListAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { template void checkIsNullTerminated (const char (&str)[N], const char *what) { for (size_t i = 0; i < N; ++i) { if (str[i] == '\0') return; } std::stringstream s; s << "Invalid " << what << ": it is more than " << (N - 1) << " characters long."; throw IEX_NAMESPACE::InputExc(s); } } // namespace template <> const char * ChannelListAttribute::staticTypeName () { return "chlist"; } using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> void ChannelListAttribute::writeValueTo (OStream &os, int version) const { for (ChannelList::ConstIterator i = _value.begin(); i != _value.end(); ++i) { // // Write name // Xdr::write (os, i.name()); // // Write Channel struct // Xdr::write (os, int (i.channel().type)); Xdr::write (os, i.channel().pLinear); Xdr::pad (os, 3); Xdr::write (os, i.channel().xSampling); Xdr::write (os, i.channel().ySampling); } // // Write end of list marker // Xdr::write (os, ""); } template <> void ChannelListAttribute::readValueFrom (IStream &is, int size, int version) { while (true) { // // Read name; zero length name means end of channel list // char name[Name::SIZE]; Xdr::read (is,Name::MAX_LENGTH,name); if (name[0] == 0) break; checkIsNullTerminated (name, "channel name"); // // Read Channel struct // int type; bool pLinear; int xSampling; int ySampling; Xdr::read (is, type); Xdr::read (is, pLinear); Xdr::skip (is, 3); Xdr::read (is, xSampling); Xdr::read (is, ySampling); // // prevent invalid values being written to PixelType enum // by forcing all unknown types to NUM_PIXELTYPES which is also an invalid // pixel type, but can be used as a PixelType enum value // (Header::sanityCheck will throw an exception when files with invalid PixelTypes are read) // if (type != OPENEXR_IMF_INTERNAL_NAMESPACE::UINT && type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF && type != OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) { type = OPENEXR_IMF_INTERNAL_NAMESPACE::NUM_PIXELTYPES; } _value.insert (name, Channel (PixelType (type), xSampling, ySampling, pLinear)); } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfChannelListAttribute.h000066400000000000000000000053051406177042200225450ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H #define INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class ChannelListAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfChannelList.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute ChannelListAttribute; template <> IMF_EXPORT const char *ChannelListAttribute::staticTypeName (); template <> IMF_EXPORT void ChannelListAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void ChannelListAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCheckedArithmetic.h000066400000000000000000000111101406177042200220040ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CHECKED_ARITHMETIC_H #define INCLUDED_IMF_CHECKED_ARITHMETIC_H //----------------------------------------------------------------------------- // // Integer arithmetic operations that throw exceptions // on overflow, underflow or division by zero. // //----------------------------------------------------------------------------- #include #include "IexMathExc.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER template struct StaticAssertionFailed; template <> struct StaticAssertionFailed {}; #define IMF_STATIC_ASSERT(x) \ do {StaticAssertionFailed staticAssertionFailed; ((void) staticAssertionFailed);} while (false) template T uiMult (T a, T b) { // // Unsigned integer multiplication // IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && std::numeric_limits::is_integer); if (a > 0 && b > std::numeric_limits::max() / a) throw IEX_NAMESPACE::OverflowExc ("Integer multiplication overflow."); return a * b; } template T uiDiv (T a, T b) { // // Unsigned integer division // IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && std::numeric_limits::is_integer); if (b == 0) throw IEX_NAMESPACE::DivzeroExc ("Integer division by zero."); return a / b; } template T uiAdd (T a, T b) { // // Unsigned integer addition // IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && std::numeric_limits::is_integer); if (a > std::numeric_limits::max() - b) throw IEX_NAMESPACE::OverflowExc ("Integer addition overflow."); return a + b; } template T uiSub (T a, T b) { // // Unsigned integer subtraction // IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && std::numeric_limits::is_integer); if (a < b) throw IEX_NAMESPACE::UnderflowExc ("Integer subtraction underflow."); return a - b; } template size_t checkArraySize (T n, size_t s) { // // Verify that the size, in bytes, of an array with n elements // of size s can be computed without overflowing: // // If computing // // size_t (n) * s // // would overflow, then throw an IEX_NAMESPACE::OverflowExc exception. // Otherwise return // // size_t (n). // IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && std::numeric_limits::is_integer); IMF_STATIC_ASSERT (sizeof (T) <= sizeof (size_t)); if (size_t (n) > std::numeric_limits::max() / s) throw IEX_NAMESPACE::OverflowExc ("Integer multiplication overflow."); return size_t (n); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfChromaticities.cpp000066400000000000000000000115121406177042200217540ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // CIE (x,y) chromaticities, and conversions between // RGB tiples and CIE XYZ tristimulus values. // //----------------------------------------------------------------------------- #include #include "ImfNamespace.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER Chromaticities::Chromaticities (const IMATH_NAMESPACE::V2f &red, const IMATH_NAMESPACE::V2f &green, const IMATH_NAMESPACE::V2f &blue, const IMATH_NAMESPACE::V2f &white) : red (red), green (green), blue (blue), white (white) { // empty } bool Chromaticities::operator == (const Chromaticities & c) const { return red == c.red && green == c.green && blue == c.blue && white == c.white; } bool Chromaticities::operator != (const Chromaticities & c) const { return red != c.red || green != c.green || blue != c.blue || white != c.white; } IMATH_NAMESPACE::M44f RGBtoXYZ (const Chromaticities &chroma, float Y) { // // For an explanation of how the color conversion matrix is derived, // see Roy Hall, "Illumination and Color in Computer Generated Imagery", // Springer-Verlag, 1989, chapter 3, "Perceptual Response"; and // Charles A. Poynton, "A Technical Introduction to Digital Video", // John Wiley & Sons, 1996, chapter 7, "Color science for video". // // // X and Z values of RGB value (1, 1, 1), or "white" // float X = chroma.white.x * Y / chroma.white.y; float Z = (1 - chroma.white.x - chroma.white.y) * Y / chroma.white.y; // // Scale factors for matrix rows // float d = chroma.red.x * (chroma.blue.y - chroma.green.y) + chroma.blue.x * (chroma.green.y - chroma.red.y) + chroma.green.x * (chroma.red.y - chroma.blue.y); float Sr = (X * (chroma.blue.y - chroma.green.y) - chroma.green.x * (Y * (chroma.blue.y - 1) + chroma.blue.y * (X + Z)) + chroma.blue.x * (Y * (chroma.green.y - 1) + chroma.green.y * (X + Z))) / d; float Sg = (X * (chroma.red.y - chroma.blue.y) + chroma.red.x * (Y * (chroma.blue.y - 1) + chroma.blue.y * (X + Z)) - chroma.blue.x * (Y * (chroma.red.y - 1) + chroma.red.y * (X + Z))) / d; float Sb = (X * (chroma.green.y - chroma.red.y) - chroma.red.x * (Y * (chroma.green.y - 1) + chroma.green.y * (X + Z)) + chroma.green.x * (Y * (chroma.red.y - 1) + chroma.red.y * (X + Z))) / d; // // Assemble the matrix // IMATH_NAMESPACE::M44f M; M[0][0] = Sr * chroma.red.x; M[0][1] = Sr * chroma.red.y; M[0][2] = Sr * (1 - chroma.red.x - chroma.red.y); M[1][0] = Sg * chroma.green.x; M[1][1] = Sg * chroma.green.y; M[1][2] = Sg * (1 - chroma.green.x - chroma.green.y); M[2][0] = Sb * chroma.blue.x; M[2][1] = Sb * chroma.blue.y; M[2][2] = Sb * (1 - chroma.blue.x - chroma.blue.y); return M; } IMATH_NAMESPACE::M44f XYZtoRGB (const Chromaticities &chroma, float Y) { return RGBtoXYZ (chroma, Y).inverse(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfChromaticities.h000066400000000000000000000107561406177042200214320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CHROMATICITIES_H #define INCLUDED_IMF_CHROMATICITIES_H //----------------------------------------------------------------------------- // // CIE (x,y) chromaticities, and conversions between // RGB tiples and CIE XYZ tristimulus values. // //----------------------------------------------------------------------------- #include "ImathVec.h" #include "ImathMatrix.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct Chromaticities { //----------------------------------------------- // The CIE x and y coordinates of the RGB triples // (1,0,0), (0,1,0), (0,0,1) and (1,1,1). //----------------------------------------------- IMATH_NAMESPACE::V2f red; IMATH_NAMESPACE::V2f green; IMATH_NAMESPACE::V2f blue; IMATH_NAMESPACE::V2f white; //-------------------------------------------- // Default constructor produces chromaticities // according to Rec. ITU-R BT.709-3 //-------------------------------------------- IMF_EXPORT Chromaticities (const IMATH_NAMESPACE::V2f &red = IMATH_NAMESPACE::V2f (0.6400f, 0.3300f), const IMATH_NAMESPACE::V2f &green = IMATH_NAMESPACE::V2f (0.3000f, 0.6000f), const IMATH_NAMESPACE::V2f &blue = IMATH_NAMESPACE::V2f (0.1500f, 0.0600f), const IMATH_NAMESPACE::V2f &white = IMATH_NAMESPACE::V2f (0.3127f, 0.3290f)); //--------- // Equality //--------- IMF_EXPORT bool operator == (const Chromaticities &v) const; IMF_EXPORT bool operator != (const Chromaticities &v) const; }; // // Conversions between RGB and CIE XYZ // // RGB to XYZ: // // Given a set of chromaticities, c, and the luminance, Y, of the RGB // triple (1,1,1), or "white", RGBtoXYZ(c,Y) computes a matrix, M, so // that multiplying an RGB value, v, with M produces an equivalent // XYZ value, w. (w == v * M) // // If we define that // // (Xr, Yr, Zr) == (1, 0, 0) * M // (Xg, Yg, Zg) == (0, 1, 0) * M // (Xb, Yb, Zb) == (0, 0, 1) * M // (Xw, Yw, Zw) == (1, 1, 1) * M, // // then the following statements are true: // // Xr / (Xr + Yr + Zr) == c.red.x // Yr / (Xr + Yr + Zr) == c.red.y // // Xg / (Xg + Yg + Zg) == c.red.x // Yg / (Xg + Yg + Zg) == c.red.y // // Xb / (Xb + Yb + Zb) == c.red.x // Yb / (Xb + Yb + Zb) == c.red.y // // Xw / (Xw + Yw + Zw) == c.red.x // Yw / (Xw + Yw + Zw) == c.red.y // // Yw == Y. // // XYZ to RGB: // // XYZtoRGB(c,Y) returns RGBtoXYZ(c,Y).inverse(). // IMF_EXPORT IMATH_NAMESPACE::M44f RGBtoXYZ (const Chromaticities &chroma, float Y); IMF_EXPORT IMATH_NAMESPACE::M44f XYZtoRGB (const Chromaticities &chroma, float Y); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp000066400000000000000000000063251406177042200236460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class ChromaticitiesAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * ChromaticitiesAttribute::staticTypeName () { return "chromaticities"; } template <> void ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.red.x); Xdr::write (os, _value.red.y); Xdr::write (os, _value.green.x); Xdr::write (os, _value.green.y); Xdr::write (os, _value.blue.x); Xdr::write (os, _value.blue.y); Xdr::write (os, _value.white.x); Xdr::write (os, _value.white.y); } template <> void ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.red.x); Xdr::read (is, _value.red.y); Xdr::read (is, _value.green.x); Xdr::read (is, _value.green.y); Xdr::read (is, _value.blue.x); Xdr::read (is, _value.blue.y); Xdr::read (is, _value.white.x); Xdr::read (is, _value.white.y); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h000066400000000000000000000053711406177042200233130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H #define INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class ChromaticitiesAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfChromaticities.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute ChromaticitiesAttribute; template <> IMF_EXPORT const char *ChromaticitiesAttribute::staticTypeName (); template <> IMF_EXPORT void ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp000066400000000000000000000435451406177042200231750ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfCompositeDeepScanLine.h" #include "ImfDeepScanLineInputPart.h" #include "ImfDeepScanLineInputFile.h" #include "ImfChannelList.h" #include "ImfFrameBuffer.h" #include "ImfDeepFrameBuffer.h" #include "ImfDeepCompositing.h" #include "ImfPixelType.h" #include "IlmThreadPool.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using std::vector; using std::string; using IMATH_NAMESPACE::Box2i; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; struct CompositeDeepScanLine::Data{ public : vector _file; // array of files vector _part; // array of parts FrameBuffer _outputFrameBuffer; // output frame buffer provided bool _zback; // true if we are using zback (otherwise channel 1 = channel 0) vector< vector > _channeldata; // pixel values, read from the input, one array per channel vector< int > _sampleCounts; // total per-pixel sample counts, Box2i _dataWindow; // data window of combined inputs DeepCompositing * _comp; // user-provided compositor vector _channels; // names of channels that will be composited vector _bufferMap; // entry _outputFrameBuffer[n].name() == _channels[ _bufferMap[n] ].name() void check_valid(const Header & header); // check newly added part/file is OK; on first good call, set _zback/_dataWindow // // set up the given deep frame buffer to contain the required channels // resize counts and pointers to the width of _dataWindow // zero-out all counts, since the datawindow may be smaller than/not include this part // void handleDeepFrameBuffer (DeepFrameBuffer & buf, vector & counts, //per-pixel counts vector< vector > & pointers, //per-channel-per-pixel pointers to data const Header & header, int start, int end); Data(); }; CompositeDeepScanLine::Data::Data() : _zback(false) , _comp(NULL) {} CompositeDeepScanLine::CompositeDeepScanLine() : _Data(new Data) {} CompositeDeepScanLine::~CompositeDeepScanLine() { delete _Data; } void CompositeDeepScanLine::addSource(DeepScanLineInputPart* part) { _Data->check_valid(part->header()); _Data->_part.push_back(part); } void CompositeDeepScanLine::addSource(DeepScanLineInputFile* file) { _Data->check_valid(file->header()); _Data->_file.push_back(file); } int CompositeDeepScanLine::sources() const { return int(_Data->_part.size())+int(_Data->_file.size()); } void CompositeDeepScanLine::Data::check_valid(const Header & header) { bool has_z=false; bool has_alpha=false; // check good channel names for( ChannelList::ConstIterator i=header.channels().begin();i!=header.channels().end();++i) { std::string n(i.name()); if(n=="ZBack") { _zback=true; } else if(n=="Z") { has_z=true; } else if(n=="A") { has_alpha=true; } } if(!has_z) { throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine is missing a Z channel"); } if(!has_alpha) { throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine is missing an alpha channel"); } if(_part.size()==0 && _file.size()==0) { // first in - update and return _dataWindow = header.dataWindow(); return; } const Header * const match_header = _part.size()>0 ? &_part[0]->header() : &_file[0]->header(); // check the sizes match if(match_header->displayWindow() != header.displayWindow()) { throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine has a different displayWindow to previously provided data"); } _dataWindow.extendBy(header.dataWindow()); } void CompositeDeepScanLine::Data::handleDeepFrameBuffer (DeepFrameBuffer& buf, std::vector< unsigned int > & counts, vector< std::vector< float* > > & pointers, const Header& header, int start, int end) { ptrdiff_t width=_dataWindow.size().x+1; size_t pixelcount = width * (end-start+1); pointers.resize(_channels.size()); counts.resize(pixelcount); buf.insertSampleCountSlice (Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::UINT, (char *) (&counts[0]-_dataWindow.min.x-start*width), sizeof(unsigned int), sizeof(unsigned int)*width)); pointers[0].resize(pixelcount); buf.insert ("Z", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, (char *)(&pointers[0][0]-_dataWindow.min.x-start*width), sizeof(float *), sizeof(float *)*width, sizeof(float) )); if(_zback) { pointers[1].resize(pixelcount); buf.insert ("ZBack", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, (char *)(&pointers[1][0]-_dataWindow.min.x-start*width), sizeof(float *), sizeof(float *)*width, sizeof(float) )); } pointers[2].resize(pixelcount); buf.insert ("A", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, (char *)(&pointers[2][0]-_dataWindow.min.x-start*width), sizeof(float *), sizeof(float *)*width, sizeof(float) )); size_t i =0; for(FrameBuffer::ConstIterator qt = _outputFrameBuffer.begin(); qt != _outputFrameBuffer.end(); qt++) { int channel_in_source = _bufferMap[i]; if(channel_in_source>2) { // not dealt with yet (0,1,2 previously inserted) pointers[channel_in_source].resize(pixelcount); buf.insert (qt.name(), DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, (char *)(&pointers[channel_in_source][0]-_dataWindow.min.x-start*width), sizeof(float *), sizeof(float *)*width, sizeof(float) )); } i++; } } void CompositeDeepScanLine::setCompositing(DeepCompositing* c) { _Data->_comp=c; } const IMATH_NAMESPACE::Box2i& CompositeDeepScanLine::dataWindow() const { return _Data->_dataWindow; } void CompositeDeepScanLine::setFrameBuffer(const FrameBuffer& fr) { // // count channels; build map between channels in frame buffer // and channels in internal buffers // _Data->_channels.resize(3); _Data->_channels[0]="Z"; _Data->_channels[1]=_Data->_zback ? "ZBack" : "Z"; _Data->_channels[2]="A"; _Data->_bufferMap.resize(0); for(FrameBuffer::ConstIterator q=fr.begin();q!=fr.end();q++) { string name(q.name()); if(name=="ZBack") { _Data->_bufferMap.push_back(1); }else if(name=="Z") { _Data->_bufferMap.push_back(0); }else if(name=="A") { _Data->_bufferMap.push_back(2); }else{ _Data->_bufferMap.push_back(_Data->_channels.size()); _Data->_channels.push_back(name); } } _Data->_outputFrameBuffer=fr; } namespace { class LineCompositeTask : public Task { public: LineCompositeTask ( TaskGroup* group , CompositeDeepScanLine::Data * data, int y, int start, vector* names, vector > >* pointers, vector* total_sizes, vector* num_sources ) : Task(group) , _Data(data), _y(y), _start(start), _names(names), _pointers(pointers), _total_sizes(total_sizes), _num_sources(num_sources) {} virtual ~LineCompositeTask () {} virtual void execute (); CompositeDeepScanLine::Data* _Data; int _y; int _start; vector* _names; vector > >* _pointers; vector* _total_sizes; vector* _num_sources; }; void composite_line(int y, int start, CompositeDeepScanLine::Data * _Data, vector & names, const vector > > & pointers, const vector & total_sizes, const vector & num_sources ) { vector output_pixel(names.size()); //the pixel we'll output to vector inputs(names.size()); DeepCompositing d; // fallback compositing engine DeepCompositing * comp= _Data->_comp ? _Data->_comp : &d; int pixel = (y-start)*(_Data->_dataWindow.max.x+1-_Data->_dataWindow.min.x); for(int x=_Data->_dataWindow.min.x;x<=_Data->_dataWindow.max.x;x++) { // set inputs[] to point to the first sample of the first part of each channel // if there's a zback, set all channel independently... if(_Data->_zback) { for(size_t channel=0;channelcomposite_pixel(&output_pixel[0], &inputs[0], &names[0], names.size(), total_sizes[pixel], num_sources[pixel] ); size_t channel_number=0; // // write out composited value into internal frame buffer // for(FrameBuffer::Iterator it = _Data->_outputFrameBuffer.begin();it !=_Data->_outputFrameBuffer.end();it++) { float value = output_pixel[ _Data->_bufferMap[channel_number] ]; // value to write // cast to half float if necessary if(it.slice().type==OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) { * (float *)(it.slice().base + y*it.slice().yStride + x*it.slice().xStride) = value; } else if(it.slice().type==HALF) { * (half *)(it.slice().base + y*it.slice().yStride + x*it.slice().xStride) = half(value); } channel_number++; } pixel++; }// next pixel on row } void LineCompositeTask::execute() { composite_line(_y,_start,_Data,*_names,*_pointers,*_total_sizes,*_num_sources); } } void CompositeDeepScanLine::readPixels(int start, int end) { size_t parts = _Data->_file.size() + _Data->_part.size(); // total of files+parts vector framebuffers(parts); vector< vector > counts(parts); // // for each part, a pointer to an array of channels // vector > > pointers(parts); vector headers(parts); { size_t i; for(i=0;i<_Data->_file.size();i++) { headers[i] = &_Data->_file[i]->header(); } for(size_t j=0;j<_Data->_part.size();j++) { headers[i+j] = &_Data->_part[j]->header(); } } for(size_t i=0;ihandleDeepFrameBuffer(framebuffers[i],counts[i],pointers[i],*headers[i],start,end); } // // set frame buffers and read scanlines from all parts // TODO what happens if SCANLINE not in data window? // { size_t i=0; for(i=0;i<_Data->_file.size();i++) { _Data->_file[i]->setFrameBuffer(framebuffers[i]); _Data->_file[i]->readPixelSampleCounts(start,end); } for(size_t j=0;j<_Data->_part.size();j++) { _Data->_part[j]->setFrameBuffer(framebuffers[i+j]); _Data->_part[j]->readPixelSampleCounts(start,end); } } // // total width // size_t total_width = _Data->_dataWindow.size().x+1; size_t total_pixels = total_width*(end-start+1); vector total_sizes(total_pixels); vector num_sources(total_pixels); //number of parts with non-zero sample count size_t overall_sample_count=0; // sum of all samples in all images between start and end // // accumulate pixel counts // for(size_t ptr=0;ptr0) num_sources[ptr]++; } overall_sample_count+=total_sizes[ptr]; } // // allocate arrays for pixel data // samples array accessed as in pixels[channel][sample] // vector > samples( _Data->_channels.size() ); for(size_t channel=0;channel<_Data->_channels.size();channel++) { if( channel!=1 || _Data->_zback) { samples[channel].resize(overall_sample_count); } } for(size_t channel=0;channel_zback) { samples[channel].resize(overall_sample_count); // // allocate pointers for channel data // size_t offset=0; for(size_t pixel=0;pixel_file.size();i++) { _Data->_file[i]->readPixels(start,end); } for(size_t j=0;j<_Data->_part.size();j++) { _Data->_part[j]->readPixels(start,end); } // // composite pixels and write back to framebuffer // // turn vector of strings into array of char * // and make sure 'ZBack' channel is correct vector names(_Data->_channels.size()); for(size_t i=0;i_channels[i].c_str(); } if(!_Data->_zback) names[1]=names[0]; // no zback channel, so make it point to z TaskGroup g; for(int y=start;y<=end;y++) { ThreadPool::addGlobalTask(new LineCompositeTask(&g,_Data,y,start,&names,&pointers,&total_sizes,&num_sources)); }//next row } const FrameBuffer& CompositeDeepScanLine::frameBuffer() const { return _Data->_outputFrameBuffer; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h000066400000000000000000000132441406177042200226330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_COMPOSITEDEEPSCANLINE_H #define INCLUDED_IMF_COMPOSITEDEEPSCANLINE_H //----------------------------------------------------------------------------- // // Class to composite deep samples into a frame buffer // Initialise with a deep input part or deep inputfile // (also supports multiple files and parts, and will // composite them together, as long as their sizes and channelmaps agree) // // Then call setFrameBuffer, and readPixels, exactly as for reading // regular scanline images. // // Restrictions - source file(s) must contain at least Z and alpha channels // - if multiple files/parts are provided, sizes must match // - all requested channels will be composited as premultiplied // - only half and float channels can be requested // // This object should not be considered threadsafe // // The default compositing engine will give spurious results with overlapping // volumetric samples - you may derive from DeepCompositing class, override the // sort_pixel() and composite_pixel() functions, and pass an instance to // setCompositing(). // //----------------------------------------------------------------------------- #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class CompositeDeepScanLine { public: IMF_EXPORT CompositeDeepScanLine(); IMF_EXPORT virtual ~CompositeDeepScanLine(); /// set the source data as a part ///@note all parts must remain valid until after last interaction with DeepComp IMF_EXPORT void addSource(DeepScanLineInputPart * part); /// set the source data as a file ///@note all file must remain valid until after last interaction with DeepComp IMF_EXPORT void addSource(DeepScanLineInputFile * file); ///////////////////////////////////////// // // set the frame buffer for output values // the buffers specified must be large enough // to handle the dataWindow() // ///////////////////////////////////////// IMF_EXPORT void setFrameBuffer(const FrameBuffer & fr); ///////////////////////////////////////// // // retrieve frameBuffer // //////////////////////////////////////// IMF_EXPORT const FrameBuffer & frameBuffer() const; ////////////////////////////////////////////////// // // read scanlines start to end from the source(s) // storing the result in the frame buffer provided // ////////////////////////////////////////////////// IMF_EXPORT void readPixels(int start,int end); IMF_EXPORT int sources() const; // return number of sources ///////////////////////////////////////////////// // // retrieve the datawindow // If multiple parts are specified, this will // be the union of the dataWindow of all parts // //////////////////////////////////////////////// IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow() const; // // override default sorting/compositing operation // (otherwise an instance of the base class will be used) // IMF_EXPORT void setCompositing(DeepCompositing *); struct Data; private : struct Data *_Data; CompositeDeepScanLine(const CompositeDeepScanLine &) = delete; CompositeDeepScanLine & operator=(const CompositeDeepScanLine &) = delete; CompositeDeepScanLine(CompositeDeepScanLine &&) = delete; CompositeDeepScanLine & operator=(CompositeDeepScanLine &&) = delete; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCompression.h000066400000000000000000000064011406177042200207540ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_COMPRESSION_H #define INCLUDED_IMF_COMPRESSION_H //----------------------------------------------------------------------------- // // enum Compression // //----------------------------------------------------------------------------- #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum Compression { NO_COMPRESSION = 0, // no compression RLE_COMPRESSION = 1, // run length encoding ZIPS_COMPRESSION = 2, // zlib compression, one scan line at a time ZIP_COMPRESSION = 3, // zlib compression, in blocks of 16 scan lines PIZ_COMPRESSION = 4, // piz-based wavelet compression PXR24_COMPRESSION = 5, // lossy 24-bit float compression B44_COMPRESSION = 6, // lossy 4-by-4 pixel block compression, // fixed compression rate B44A_COMPRESSION = 7, // lossy 4-by-4 pixel block compression, // flat fields are compressed more DWAA_COMPRESSION = 8, // lossy DCT based compression, in blocks // of 32 scanlines. More efficient for partial // buffer access. DWAB_COMPRESSION = 9, // lossy DCT based compression, in blocks // of 256 scanlines. More efficient space // wise and faster to decode full frames // than DWAA_COMPRESSION. NUM_COMPRESSION_METHODS // number of different compression methods }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCompressionAttribute.cpp000066400000000000000000000064751406177042200232060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class CompressionAttribute // //----------------------------------------------------------------------------- #include "ImfCompressionAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * CompressionAttribute::staticTypeName () { return "compression"; } template <> void CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { unsigned char tmp = _value; Xdr::write (os, tmp); } template <> void CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; Xdr::read (is, tmp); // // prevent invalid values being written to Compressin enum // by forcing all unknown types to NUM_COMPRESSION_METHODS which is also an invalid // pixel type, but can be used as a PixelType enum value // (Header::sanityCheck will throw an exception when files with invalid Compression types are read) // if (tmp!= NO_COMPRESSION && tmp != RLE_COMPRESSION && tmp != ZIPS_COMPRESSION && tmp != ZIP_COMPRESSION && tmp != PIZ_COMPRESSION && tmp != PXR24_COMPRESSION && tmp != B44_COMPRESSION && tmp != B44A_COMPRESSION && tmp != DWAA_COMPRESSION && tmp != DWAB_COMPRESSION) { tmp = NUM_COMPRESSION_METHODS; } _value = Compression (tmp); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfCompressionAttribute.h000066400000000000000000000053661406177042200226510ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H #define INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class CompressionAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfCompression.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute CompressionAttribute; template <> IMF_EXPORT const char *CompressionAttribute::staticTypeName (); template <> IMF_EXPORT void CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfCompressor.cpp000066400000000000000000000126431406177042200211470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Compressor // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfRleCompressor.h" #include "ImfZipCompressor.h" #include "ImfPizCompressor.h" #include "ImfPxr24Compressor.h" #include "ImfB44Compressor.h" #include "ImfDwaCompressor.h" #include "ImfCheckedArithmetic.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; Compressor::Compressor (const Header &hdr): _header (hdr) {} Compressor::~Compressor () {} Compressor::Format Compressor::format () const { return XDR; } int Compressor::compressTile (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { return compress (inPtr, inSize, range.min.y, outPtr); } int Compressor::uncompressTile (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { return uncompress (inPtr, inSize, range.min.y, outPtr); } bool isValidCompression (Compression c) { switch (c) { case NO_COMPRESSION: case RLE_COMPRESSION: case ZIPS_COMPRESSION: case ZIP_COMPRESSION: case PIZ_COMPRESSION: case PXR24_COMPRESSION: case B44_COMPRESSION: case B44A_COMPRESSION: case DWAA_COMPRESSION: case DWAB_COMPRESSION: return true; default: return false; } } bool isValidDeepCompression(Compression c) { switch(c) { case NO_COMPRESSION: case RLE_COMPRESSION: case ZIPS_COMPRESSION: return true; default : return false; } } Compressor * newCompressor (Compression c, size_t maxScanLineSize, const Header &hdr) { switch (c) { case RLE_COMPRESSION: return new RleCompressor (hdr, maxScanLineSize); case ZIPS_COMPRESSION: return new ZipCompressor (hdr, maxScanLineSize, 1); case ZIP_COMPRESSION: return new ZipCompressor (hdr, maxScanLineSize, 16); case PIZ_COMPRESSION: return new PizCompressor (hdr, maxScanLineSize, 32); case PXR24_COMPRESSION: return new Pxr24Compressor (hdr, maxScanLineSize, 16); case B44_COMPRESSION: return new B44Compressor (hdr, maxScanLineSize, 32, false); case B44A_COMPRESSION: return new B44Compressor (hdr, maxScanLineSize, 32, true); case DWAA_COMPRESSION: return new DwaCompressor (hdr, maxScanLineSize, 32, DwaCompressor::STATIC_HUFFMAN); case DWAB_COMPRESSION: return new DwaCompressor (hdr, maxScanLineSize, 256, DwaCompressor::STATIC_HUFFMAN); default: return 0; } } Compressor * newTileCompressor (Compression c, size_t tileLineSize, size_t numTileLines, const Header &hdr) { switch (c) { case RLE_COMPRESSION: return new RleCompressor (hdr, uiMult (tileLineSize, numTileLines)); case ZIPS_COMPRESSION: case ZIP_COMPRESSION: return new ZipCompressor (hdr, tileLineSize, numTileLines); case PIZ_COMPRESSION: return new PizCompressor (hdr, tileLineSize, numTileLines); case PXR24_COMPRESSION: return new Pxr24Compressor (hdr, tileLineSize, numTileLines); case B44_COMPRESSION: return new B44Compressor (hdr, tileLineSize, numTileLines, false); case B44A_COMPRESSION: return new B44Compressor (hdr, tileLineSize, numTileLines, true); case DWAA_COMPRESSION: case DWAB_COMPRESSION: return new DwaCompressor (hdr, tileLineSize, numTileLines, DwaCompressor::DEFLATE); default: return 0; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfCompressor.h000066400000000000000000000177451406177042200206240ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_COMPRESSOR_H #define INCLUDED_IMF_COMPRESSOR_H //----------------------------------------------------------------------------- // // class Compressor // //----------------------------------------------------------------------------- #include "ImfCompression.h" #include "ImathBox.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Compressor { public: //--------------------------------------------- // Constructor -- hdr is the header of the file // that will be compressed or uncompressed //--------------------------------------------- IMF_EXPORT Compressor (const Header &hdr); //----------- // Destructor //----------- IMF_EXPORT virtual ~Compressor (); //---------------------------------------------- // Maximum number of scan lines processed by // a single call to compress() and uncompress(). //---------------------------------------------- IMF_EXPORT virtual int numScanLines () const = 0; //-------------------------------------------- // Format of the pixel data read and written // by the compress() and uncompress() methods. // The default implementation of format() // returns XDR. //-------------------------------------------- enum Format { NATIVE, // the machine's native format XDR // Xdr format }; IMF_EXPORT virtual Format format () const; //---------------------------- // Access to the file's header //---------------------------- const Header & header () const {return _header;} //------------------------------------------------------------------------- // Compress an array of bytes that represents the contents of up to // numScanLines() scan lines: // // inPtr Input buffer (uncompressed data). // // inSize Number of bytes in the input buffer // // minY Minimum y coordinate of the scan lines to // be compressed // // outPtr Pointer to output buffer // // return value Size of compressed data in output buffer // // Arrangement of uncompressed pixel data in the input buffer: // // Before calling // // compress (buf, size, minY, ...); // // the InputFile::writePixels() method gathers pixel data from the // frame buffer, fb, and places them in buffer buf, like this: // // char *endOfBuf = buf; // // for (int y = minY; // y <= min (minY + numScanLines() - 1, header().dataWindow().max.y); // ++y) // { // for (ChannelList::ConstIterator c = header().channels().begin(); // c != header().channels().end(); // ++c) // { // if (modp (y, c.channel().ySampling) != 0) // continue; // // for (int x = header().dataWindow().min.x; // x <= header().dataWindow().max.x; // ++x) // { // if (modp (x, c.channel().xSampling) != 0) // continue; // // Xdr::write (endOfBuf, fb.pixel (c, x, y)); // } // } // } // // int size = endOfBuf - buf; // //------------------------------------------------------------------------- IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr) = 0; IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); //------------------------------------------------------------------------- // Uncompress an array of bytes that has been compressed by compress(): // // inPtr Input buffer (compressed data). // // inSize Number of bytes in the input buffer // // minY Minimum y coordinate of the scan lines to // be uncompressed // // outPtr Pointer to output buffer // // return value Size of uncompressed data in output buffer // //------------------------------------------------------------------------- IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) = 0; IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); private: const Header & _header; }; //-------------------------------------- // Test if c is a valid compression type //-------------------------------------- IMF_EXPORT bool isValidCompression (Compression c); //-------------------------------------- // Test if c is valid for deep data //-------------------------------------- IMF_EXPORT bool isValidDeepCompression (Compression c); //----------------------------------------------------------------- // Construct a Compressor for compression type c: // // maxScanLineSize Maximum number of bytes per uncompressed // scan line. // // header Header of the input or output file whose // pixels will be compressed or uncompressed. // // return value A pointer to a new Compressor object (it // is the caller's responsibility to delete // the object), or 0 (if c is NO_COMPRESSION). // //----------------------------------------------------------------- IMF_EXPORT Compressor * newCompressor (Compression c, size_t maxScanLineSize, const Header &hdr); //----------------------------------------------------------------- // Construct a Compressor for compression type c for a tiled image: // // tileLineSize Maximum number of bytes per uncompressed // line in a tile. // // numTileLines Maximum number of lines in a tile. // // header Header of the input or output file whose // pixels will be compressed or uncompressed. // // return value A pointer to a new Compressor object (it // is the caller's responsibility to delete // the object), or 0 (if c is NO_COMPRESSION). // //----------------------------------------------------------------- IMF_EXPORT Compressor * newTileCompressor (Compression c, size_t tileLineSize, size_t numTileLines, const Header &hdr); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfConvert.cpp000066400000000000000000000065101406177042200204270ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Routines for converting between pixel data types, // with well-defined behavior for exceptional cases. // //----------------------------------------------------------------------------- #include "ImfConvert.h" #include "ImfNamespace.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { inline bool isNegative (float f) { union {float f; int i;} u; u.f = f; return (u.i & 0x80000000) != 0; } inline bool isNan (float f) { union {float f; int i;} u; u.f = f; return (u.i & 0x7fffffff) > 0x7f800000; } inline bool isInfinity (float f) { union {float f; int i;} u; u.f = f; return (u.i & 0x7fffffff) == 0x7f800000; } inline bool isFinite (float f) { union {float f; int i;} u; u.f = f; return (u.i & 0x7f800000) != 0x7f800000; } } // namespace unsigned int halfToUint (half h) { if (h.isNegative() || h.isNan()) return 0; if (h.isInfinity()) return UINT_MAX; return (unsigned int) h; } unsigned int floatToUint (float f) { if (isNegative (f) || isNan (f)) return 0; if (isInfinity (f) || f > UINT_MAX) return UINT_MAX; return (unsigned int) f; } half uintToHalf (unsigned int ui) { if (ui > HALF_MAX) return half::posInf(); return half ((float) ui); } half floatToHalf (float f) { if (isFinite (f)) { if (f > HALF_MAX) return half::posInf(); if (f < -HALF_MAX) return half::negInf(); } return half (f); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfConvert.h000066400000000000000000000066161406177042200201030ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_CONVERT_H #define INCLUDED_IMF_CONVERT_H //----------------------------------------------------------------------------- // // Routines for converting between pixel data types, // with well-defined behavior for exceptional cases, // without depending on how hardware and operating // system handle integer overflows and floating-point // exceptions. // //----------------------------------------------------------------------------- #include "half.h" #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //--------------------------------------------------------- // Conversion from half or float to unsigned int: // // input result // --------------------------------------------------- // // finite, >= 0 input, cast to unsigned int // (rounds towards zero) // // finite, < 0 0 // // NaN 0 // // +infinity UINT_MAX // // -infinity 0 // //--------------------------------------------------------- IMF_EXPORT unsigned int halfToUint (half h); IMF_EXPORT unsigned int floatToUint (float f); //--------------------------------------------------------- // Conversion from unsigned int or float to half: // // input result // --------------------------------------------------- // // finite, closest possible half // magnitude <= HALF_MAX // // finite, > HALF_MAX +infinity // // finite, < -HALF_MAX -infinity // // NaN NaN // // +infinity +infinity // // -infinity -infinity // //--------------------------------------------------------- IMF_EXPORT half uintToHalf (unsigned int ui); IMF_EXPORT half floatToHalf (float f); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepCompositing.cpp000066400000000000000000000070171406177042200221030ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfDeepCompositing.h" #include "ImfNamespace.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using std::sort; using std::vector; DeepCompositing::DeepCompositing() { } DeepCompositing::~DeepCompositing() { } void DeepCompositing::composite_pixel (float outputs[], const float* inputs[], const char*channel_names[], int num_channels, int num_samples, int sources) { for(int i=0;i sort_order; if(sources>1) { sort_order.resize(num_samples); for(int i=0;i1) ? sort_order[i] : i; float alpha=outputs[2]; if(alpha>=1.0) return; for(int c=0;c inputs[0][b]) return false; if(inputs[1][a] < inputs[1][b]) return true; if(inputs[1][a] > inputs[1][b]) return false; return asecond; } const DeepSlice & DeepFrameBuffer::operator [] (const char name[]) const { SliceMap::const_iterator i = _map.find (name); if (i == _map.end()) { THROW (IEX_NAMESPACE::ArgExc, "Cannot find frame buffer slice \"" << name << "\"."); } return i->second; } DeepSlice & DeepFrameBuffer::operator [] (const string &name) { return this->operator[] (name.c_str()); } const DeepSlice & DeepFrameBuffer::operator [] (const string &name) const { return this->operator[] (name.c_str()); } DeepSlice * DeepFrameBuffer::findSlice (const char name[]) { SliceMap::iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } const DeepSlice * DeepFrameBuffer::findSlice (const char name[]) const { SliceMap::const_iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } DeepSlice * DeepFrameBuffer::findSlice (const string &name) { return findSlice (name.c_str()); } const DeepSlice * DeepFrameBuffer::findSlice (const string &name) const { return findSlice (name.c_str()); } DeepFrameBuffer::Iterator DeepFrameBuffer::begin () { return _map.begin(); } DeepFrameBuffer::ConstIterator DeepFrameBuffer::begin () const { return _map.begin(); } DeepFrameBuffer::Iterator DeepFrameBuffer::end () { return _map.end(); } DeepFrameBuffer::ConstIterator DeepFrameBuffer::end () const { return _map.end(); } DeepFrameBuffer::Iterator DeepFrameBuffer::find (const char name[]) { return _map.find (name); } DeepFrameBuffer::ConstIterator DeepFrameBuffer::find (const char name[]) const { return _map.find (name); } DeepFrameBuffer::Iterator DeepFrameBuffer::find (const string &name) { return find (name.c_str()); } DeepFrameBuffer::ConstIterator DeepFrameBuffer::find (const string &name) const { return find (name.c_str()); } void DeepFrameBuffer::insertSampleCountSlice(const Slice & slice) { if (slice.type != UINT) { throw IEX_NAMESPACE::ArgExc("The type of sample count slice should be UINT."); } _sampleCounts = slice; } const Slice & DeepFrameBuffer::getSampleCountSlice() const { return _sampleCounts; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepFrameBuffer.h000066400000000000000000000224171406177042200214420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFDEEPFRAMEBUFFER_H_ #define IMFDEEPFRAMEBUFFER_H_ #include "ImfFrameBuffer.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //-------------------------------------------------------- // Description of a single deep slice of the frame buffer: //-------------------------------------------------------- struct DeepSlice : public Slice { //--------------------------------------------------------------------- // The stride for each sample in this slice. // // Memory layout: The address of sample i in pixel (x, y) is // // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride // + i * sampleStride // // where xp and yp are computed as follows: // // * If we are reading or writing a scanline-based file: // // xp = x // yp = y // // * If we are reading a tile whose upper left coorner is at (xt, yt): // // if xTileCoords is true then xp = x - xt, else xp = x // if yTileCoords is true then yp = y - yt, else yp = y // //--------------------------------------------------------------------- int sampleStride; //------------ // Constructor //------------ IMF_EXPORT DeepSlice (PixelType type = HALF, char * base = 0, size_t xStride = 0, size_t yStride = 0, size_t sampleStride = 0, int xSampling = 1, int ySampling = 1, double fillValue = 0.0, bool xTileCoords = false, bool yTileCoords = false); }; //----------------- // DeepFrameBuffer. //----------------- class DeepFrameBuffer { public: //------------ // Add a slice //------------ IMF_EXPORT void insert (const char name[], const DeepSlice &slice); IMF_EXPORT void insert (const std::string &name, const DeepSlice &slice); //---------------------------------------------------------------- // Access to existing slices: // // [n] Returns a reference to the slice with name n. // If no slice with name n exists, an IEX_NAMESPACE::ArgExc // is thrown. // // findSlice(n) Returns a pointer to the slice with name n, // or 0 if no slice with name n exists. // //---------------------------------------------------------------- IMF_EXPORT DeepSlice & operator [] (const char name[]); IMF_EXPORT const DeepSlice & operator [] (const char name[]) const; IMF_EXPORT DeepSlice & operator [] (const std::string &name); IMF_EXPORT const DeepSlice & operator [] (const std::string &name) const; IMF_EXPORT DeepSlice * findSlice (const char name[]); IMF_EXPORT const DeepSlice * findSlice (const char name[]) const; IMF_EXPORT DeepSlice * findSlice (const std::string &name); IMF_EXPORT const DeepSlice * findSlice (const std::string &name) const; //----------------------------------------- // Iterator-style access to existing slices //----------------------------------------- typedef std::map SliceMap; class Iterator; class ConstIterator; IMF_EXPORT Iterator begin (); IMF_EXPORT ConstIterator begin () const; IMF_EXPORT Iterator end (); IMF_EXPORT ConstIterator end () const; IMF_EXPORT Iterator find (const char name[]); IMF_EXPORT ConstIterator find (const char name[]) const; IMF_EXPORT Iterator find (const std::string &name); IMF_EXPORT ConstIterator find (const std::string &name) const; //---------------------------------------------------- // Public function for accessing a sample count slice. //---------------------------------------------------- IMF_EXPORT void insertSampleCountSlice(const Slice & slice); IMF_EXPORT const Slice & getSampleCountSlice() const; private: SliceMap _map; Slice _sampleCounts; }; //---------- // Iterators //---------- class DeepFrameBuffer::Iterator { public: IMF_EXPORT Iterator (); IMF_EXPORT Iterator (const DeepFrameBuffer::SliceMap::iterator &i); IMF_EXPORT Iterator & operator ++ (); IMF_EXPORT Iterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT DeepSlice & slice () const; private: friend class DeepFrameBuffer::ConstIterator; DeepFrameBuffer::SliceMap::iterator _i; }; class DeepFrameBuffer::ConstIterator { public: IMF_EXPORT ConstIterator (); IMF_EXPORT ConstIterator (const DeepFrameBuffer::SliceMap::const_iterator &i); IMF_EXPORT ConstIterator (const DeepFrameBuffer::Iterator &other); IMF_EXPORT ConstIterator & operator ++ (); IMF_EXPORT ConstIterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT const DeepSlice & slice () const; private: friend bool operator == (const ConstIterator &, const ConstIterator &); friend bool operator != (const ConstIterator &, const ConstIterator &); DeepFrameBuffer::SliceMap::const_iterator _i; }; //----------------- // Inline Functions //----------------- inline DeepFrameBuffer::Iterator::Iterator (): _i() { // empty } inline DeepFrameBuffer::Iterator::Iterator (const DeepFrameBuffer::SliceMap::iterator &i): _i (i) { // empty } inline DeepFrameBuffer::Iterator & DeepFrameBuffer::Iterator::operator ++ () { ++_i; return *this; } inline DeepFrameBuffer::Iterator DeepFrameBuffer::Iterator::operator ++ (int) { Iterator tmp = *this; ++_i; return tmp; } inline const char * DeepFrameBuffer::Iterator::name () const { return *_i->first; } inline DeepSlice & DeepFrameBuffer::Iterator::slice () const { return _i->second; } inline DeepFrameBuffer::ConstIterator::ConstIterator (): _i() { // empty } inline DeepFrameBuffer::ConstIterator::ConstIterator (const DeepFrameBuffer::SliceMap::const_iterator &i): _i (i) { // empty } inline DeepFrameBuffer::ConstIterator::ConstIterator (const DeepFrameBuffer::Iterator &other): _i (other._i) { // empty } inline DeepFrameBuffer::ConstIterator & DeepFrameBuffer::ConstIterator::operator ++ () { ++_i; return *this; } inline DeepFrameBuffer::ConstIterator DeepFrameBuffer::ConstIterator::operator ++ (int) { ConstIterator tmp = *this; ++_i; return tmp; } inline const char * DeepFrameBuffer::ConstIterator::name () const { return *_i->first; } inline const DeepSlice & DeepFrameBuffer::ConstIterator::slice () const { return _i->second; } inline bool operator == (const DeepFrameBuffer::ConstIterator &x, const DeepFrameBuffer::ConstIterator &y) { return x._i == y._i; } inline bool operator != (const DeepFrameBuffer::ConstIterator &x, const DeepFrameBuffer::ConstIterator &y) { return !(x == y); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFDEEPFRAMEBUFFER_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfDeepImageState.h000066400000000000000000000072571406177042200213060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEPIMAGESTATE_H #define INCLUDED_IMF_DEEPIMAGESTATE_H //----------------------------------------------------------------------------- // // enum DeepImageState -- describes how orderly the pixel data // in a deep image are // // The samples in a deep image pixel may be sorted according to // depth, and the sample depths or depth ranges may or may not // overlap each other. A pixel is // // - SORTED if for every i and j with i < j // // (Z[i] < Z[j]) || (Z[i] == Z[j] && ZBack[i] < ZBack[j]), // // - NON_OVERLAPPING if for every i and j with i != j // // (Z[i] < Z[j] && ZBack[i] <= Z[j]) || // (Z[j] < Z[i] && ZBack[j] <= Z[i]) || // (Z[i] == Z[j] && ZBack[i] <= Z[i] & ZBack[j] > Z[j]) || // (Z[i] == Z[j] && ZBack[j] <= Z[j] & ZBack[i] > Z[i]), // // - TIDY if it is SORTED and NON_OVERLAPPING, // // - MESSY if it is neither SORTED nor NON_OVERLAPPING. // // A deep image is // // - MESSY if at least one of its pixels is MESSY, // - SORTED if all of its pixels are SORTED, // - NON_OVERLAPPING if all of its pixels are NON_OVERLAPPING, // - TIDY if all of its pixels are TIDY. // // Note: the rather complicated definition of NON_OVERLAPPING prohibits // overlapping volume samples, coincident point samples and point samples // in the middle of a volume sample, but it does allow point samples at // the front or back of a volume sample. // //----------------------------------------------------------------------------- #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum DeepImageState { DIS_MESSY = 0, DIS_SORTED = 1, DIS_NON_OVERLAPPING = 2, DIS_TIDY = 3, DIS_NUMSTATES // Number of different image states }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp000066400000000000000000000064171406177042200235220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DeepImageStateAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * DeepImageStateAttribute::staticTypeName () { return "deepImageState"; } template <> void DeepImageStateAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const #if defined (__clang__) // _value may be an invalid value, which the clang sanitizer reports // as undefined behavior, even though the value is acceptable in this // context. __attribute__((no_sanitize ("undefined"))) #endif { unsigned char tmp = _value; Xdr::write (os, tmp); } template <> void DeepImageStateAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; Xdr::read (is, tmp); _value = DeepImageState (tmp); } template <> void DeepImageStateAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other) #if defined (__clang__) // _value may be an invalid value, which the clang sanitizer reports // as undefined behavior, even though the value is acceptable in this // context. __attribute__((no_sanitize ("undefined"))) #endif { _value = cast(other).value(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h000066400000000000000000000054211406177042200231610ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEPIMAGESTATE_ATTRIBUTE_H #define INCLUDED_IMF_DEEPIMAGESTATE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class DeepImageStateAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfDeepImageState.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute DeepImageStateAttribute; template <> IMF_EXPORT const char *DeepImageStateAttribute::staticTypeName (); template <> IMF_EXPORT void DeepImageStateAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void DeepImageStateAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); template <> IMF_EXPORT void DeepImageStateAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp000066400000000000000000002043271406177042200231270ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DeepScanLineInputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "ImfMultiPartInputFile.h" #include "ImfDeepFrameBuffer.h" #include "ImfInputStreamMutex.h" #include "ImfInputPartData.h" #include "ImathBox.h" #include "ImathFun.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "Iex.h" #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using std::string; using std::vector; using std::min; using std::max; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct InSliceInfo { PixelType typeInFrameBuffer; PixelType typeInFile; char * base; char* pointerArrayBase; size_t xPointerStride; size_t yPointerStride; size_t sampleStride; int xSampling; int ySampling; bool fill; bool skip; double fillValue; InSliceInfo (PixelType typeInFrameBuffer = HALF, char * base = NULL, PixelType typeInFile = HALF, size_t xPointerStride = 0, size_t yPointerStride = 0, size_t sampleStride = 0, int xSampling = 1, int ySampling = 1, bool fill = false, bool skip = false, double fillValue = 0.0); }; InSliceInfo::InSliceInfo (PixelType tifb, char * b, PixelType tifl, size_t xpst, size_t ypst, size_t spst, int xsm, int ysm, bool f, bool s, double fv) : typeInFrameBuffer (tifb), typeInFile (tifl), base(b), xPointerStride (xpst), yPointerStride (ypst), sampleStride (spst), xSampling (xsm), ySampling (ysm), fill (f), skip (s), fillValue (fv) { // empty } struct LineBuffer { const char * uncompressedData; char * buffer; Int64 packedDataSize; Int64 unpackedDataSize; int minY; int maxY; Compressor * compressor; Compressor::Format format; int number; bool hasException; string exception; LineBuffer (); ~LineBuffer (); inline void wait () {_sem.wait();} inline void post () {_sem.post();} private: Semaphore _sem; }; LineBuffer::LineBuffer (): uncompressedData (0), buffer (0), packedDataSize (0), compressor (0), format (defaultFormat(compressor)), number (-1), hasException (false), exception (), _sem (1) { // empty } LineBuffer::~LineBuffer () { if (compressor != 0) delete compressor; } } // namespace struct DeepScanLineInputFile::Data: public Mutex { Header header; // the image header int version; // file's version DeepFrameBuffer frameBuffer; // framebuffer to write into LineOrder lineOrder; // order of the scanlines in file int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord vector lineOffsets; // stores offsets in file for // each line bool fileIsComplete; // True if no scanlines are missing // in the file int nextLineBufferMinY; // minimum y of the next linebuffer vector bytesPerLine; // combined size of a line over all // channels vector offsetInLineBuffer; // offset for each scanline in its // linebuffer vector slices; // info about channels in file vector lineBuffers; // each holds one line buffer int linesInBuffer; // number of scanlines each buffer // holds int partNumber; // part number int numThreads; // number of threads bool multiPartBackwardSupport; // if we are reading a multipart file using single file API MultiPartInputFile* multiPartFile; // for multipart files opened as single part bool memoryMapped; // if the stream is memory mapped Array2D sampleCount; // the number of samples // in each pixel Array lineSampleCount; // the number of samples // in each line Array gotSampleCount; // for each scanline, indicating if // we have got its sample count table char* sampleCountSliceBase; // pointer to the start of // the sample count array int sampleCountXStride; // x stride of the sample count array int sampleCountYStride; // y stride of the sample count array bool frameBufferValid; // set by setFrameBuffer: excepts if readPixelSampleCounts if false Array sampleCountTableBuffer; // the buffer for sample count table Compressor* sampleCountTableComp; // the decompressor for sample count table int combinedSampleSize; // total size of all channels combined: used to sanity check sample table size int maxSampleCountTableSize; // the max size in bytes for a pixel // sample count table InputStreamMutex* _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& data) = delete; Data& operator = (const Data& data) = delete; Data (Data&& data) = delete; Data& operator = (Data&& data) = delete; inline LineBuffer * getLineBuffer (int number); // hash function from line // buffer indices into our // vector of line buffers }; DeepScanLineInputFile::Data::Data (int numThreads): partNumber(-1), numThreads(numThreads), multiPartBackwardSupport(false), multiPartFile(NULL), memoryMapped(false), frameBufferValid(false), _streamData(NULL), _deleteStream(false) { // // We need at least one lineBuffer, but if threading is used, // to keep n threads busy we need 2*n lineBuffers // lineBuffers.resize (max (1, 2 * numThreads)); for (size_t i = 0; i < lineBuffers.size(); i++) lineBuffers[i] = 0; sampleCountTableComp = 0; } DeepScanLineInputFile::Data::~Data () { for (size_t i = 0; i < lineBuffers.size(); i++) if (lineBuffers[i] != 0) delete lineBuffers[i]; for (size_t i = 0; i < slices.size(); i++) delete slices[i]; if (sampleCountTableComp != 0) delete sampleCountTableComp; if (multiPartBackwardSupport) delete multiPartFile; } inline LineBuffer * DeepScanLineInputFile::Data::getLineBuffer (int lineBufferNumber) { return lineBuffers[lineBufferNumber % lineBuffers.size()]; } namespace { void reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, LineOrder lineOrder, vector &lineOffsets) { Int64 position = is.tellg(); try { for (unsigned int i = 0; i < lineOffsets.size(); i++) { Int64 lineOffset = is.tellg(); int y; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y); Int64 packed_offset; Int64 packed_sample; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); //next is unpacked sample table size - skip this too Xdr::skip (is, packed_offset+packed_sample+8); if (lineOrder == INCREASING_Y) lineOffsets[i] = lineOffset; else lineOffsets[lineOffsets.size() - i - 1] = lineOffset; } } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // Suppress all exceptions. This functions is // called only to reconstruct the line offset // table for incomplete files, and exceptions // are likely. // } is.clear(); is.seekg (position); } void readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, LineOrder lineOrder, vector &lineOffsets, bool &complete) { for (unsigned int i = 0; i < lineOffsets.size(); i++) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, lineOffsets[i]); } complete = true; for (unsigned int i = 0; i < lineOffsets.size(); i++) { if (lineOffsets[i] <= 0) { // // Invalid data in the line offset table mean that // the file is probably incomplete (the table is // the last thing written to the file). Either // some process is still busy writing the file, // or writing the file was aborted. // // We should still be able to read the existing // parts of the file. In order to do this, we // have to make a sequential scan over the scan // line data to reconstruct the line offset table. // complete = false; reconstructLineOffsets (is, lineOrder, lineOffsets); break; } } } void readPixelData (InputStreamMutex *streamData, DeepScanLineInputFile::Data *ifd, int minY, char *&buffer, Int64 &packedDataSize, Int64 &unpackedDataSize) { // // Read a single line buffer from the input file. // // If the input file is not memory-mapped, we copy the pixel data into // into the array pointed to by buffer. If the file is memory-mapped, // then we change where buffer points to instead of writing into the // array (hence buffer needs to be a reference to a char *). // int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer; Int64 lineOffset = ifd->lineOffsets[lineBufferNumber]; if (lineOffset == 0) THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); // // Seek to the start of the scan line in the file, // if necessary. // if (!isMultiPart(ifd->version)) { if (ifd->nextLineBufferMinY != minY) streamData->is->seekg (lineOffset); } else { // // In a multi-part file, the file pointer may have been moved by // other parts, so we have to ask tellg() where we are. // if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber]) streamData->is->seekg (lineOffset); } // // Read the data block's header. // int yInFile; // // Read the part number when we are dealing with a multi-part file. // if (isMultiPart(ifd->version)) { int partNumber; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); if (partNumber != ifd->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << ifd->partNumber << "."); } } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, yInFile); if (yInFile != minY) throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); Int64 sampleCountTableSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, sampleCountTableSize); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, packedDataSize); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, unpackedDataSize); // // We make a check on the data size requirements here. // Whilst we wish to store 64bit sizes on disk, not all the compressors // have been made to work with such data sizes and are still limited to // using signed 32 bit (int) for the data size. As such, this version // insists that we validate that the data size does not exceed the data // type max limit. // @TODO refactor the compressor code to ensure full 64-bit support. // int compressorMaxDataSize = std::numeric_limits::max(); if (packedDataSize > Int64(compressorMaxDataSize) || unpackedDataSize > Int64(compressorMaxDataSize)) { THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not support " << "the allocation of data with size > " << compressorMaxDataSize << " file unpacked size :" << unpackedDataSize << " file packed size :" << packedDataSize << ".\n"); } // // Skip the pixel sample count table because we have read this data. // Xdr::skip (*streamData->is, sampleCountTableSize); // // Read the pixel data. // if (streamData->is->isMemoryMapped ()) buffer = streamData->is->readMemoryMapped (packedDataSize); else { // (TODO) check if the packed data size is too big? // (TODO) better memory management. Don't delete buffer all the time. if (buffer != 0) delete[] buffer; buffer = new char[packedDataSize]; streamData->is->read (buffer, packedDataSize); } // // Keep track of which scan line is the next one in // the file, so that we can avoid redundant seekg() // operations (seekg() can be fairly expensive). // if (ifd->lineOrder == INCREASING_Y) ifd->nextLineBufferMinY = minY + ifd->linesInBuffer; else ifd->nextLineBufferMinY = minY - ifd->linesInBuffer; } // // A LineBufferTask encapsulates the task uncompressing a set of // scanlines (line buffer) and copying them into the frame buffer. // class LineBufferTask : public Task { public: LineBufferTask (TaskGroup *group, DeepScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax); virtual ~LineBufferTask (); virtual void execute (); private: DeepScanLineInputFile::Data * _ifd; LineBuffer * _lineBuffer; int _scanLineMin; int _scanLineMax; }; LineBufferTask::LineBufferTask (TaskGroup *group, DeepScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax) : Task (group), _ifd (ifd), _lineBuffer (lineBuffer), _scanLineMin (scanLineMin), _scanLineMax (scanLineMax) { // empty } LineBufferTask::~LineBufferTask () { // // Signal that the line buffer is now free // _lineBuffer->post (); } void LineBufferTask::execute () { try { // // Uncompress the data, if necessary // if (_lineBuffer->uncompressedData == 0) { Int64 uncompressedSize = 0; int maxY = min (_lineBuffer->maxY, _ifd->maxY); for (int i = _lineBuffer->minY - _ifd->minY; i <= maxY - _ifd->minY; ++i) { uncompressedSize += (int) _ifd->bytesPerLine[i]; } // // Create the compressor everytime when we want to use it, // because we don't know maxBytesPerLine beforehand. // (TODO) optimize this. don't do this every time. // if (_lineBuffer->compressor != 0) delete _lineBuffer->compressor; Int64 maxBytesPerLine = 0; for (int i = _lineBuffer->minY - _ifd->minY; i <= maxY - _ifd->minY; ++i) { if (_ifd->bytesPerLine[i] > maxBytesPerLine) maxBytesPerLine = _ifd->bytesPerLine[i]; } _lineBuffer->compressor = newCompressor(_ifd->header.compression(), maxBytesPerLine, _ifd->header); if (_lineBuffer->compressor && _lineBuffer->packedDataSize < uncompressedSize) { _lineBuffer->format = _lineBuffer->compressor->format(); _lineBuffer->packedDataSize = _lineBuffer->compressor->uncompress (_lineBuffer->buffer, _lineBuffer->packedDataSize, _lineBuffer->minY, _lineBuffer->uncompressedData); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // _lineBuffer->format = Compressor::XDR; _lineBuffer->uncompressedData = _lineBuffer->buffer; if(_lineBuffer->packedDataSize!=maxBytesPerLine) { THROW (IEX_NAMESPACE::InputExc, "Incorrect size for uncompressed data. Expected " << maxBytesPerLine << " got " << _lineBuffer->packedDataSize << " bytes"); } } } int yStart, yStop, dy; if (_ifd->lineOrder == INCREASING_Y) { yStart = _scanLineMin; yStop = _scanLineMax + 1; dy = 1; } else { yStart = _scanLineMax; yStop = _scanLineMin - 1; dy = -1; } for (int y = yStart; y != yStop; y += dy) { // // Convert one scan line's worth of pixel data back // from the machine-independent representation, and // store the result in the frame buffer. // const char *readPtr = _lineBuffer->uncompressedData + _ifd->offsetInLineBuffer[y - _ifd->minY]; // // Iterate over all image channels. // for (unsigned int i = 0; i < _ifd->slices.size(); ++i) { // // Test if scan line y of this channel contains any data // (the scan line contains data only if y % ySampling == 0). // InSliceInfo &slice = *_ifd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Find the x coordinates of the leftmost and rightmost // sampled pixels (i.e. pixels within the data window // for which x % xSampling == 0). // // // Fill the frame buffer with pixel data. // if (slice.skip) { // // The file contains data for this channel, but // the frame buffer contains no slice for this channel. // skipChannel (readPtr, slice.typeInFile, _ifd->lineSampleCount[y - _ifd->minY]); } else { // // The frame buffer contains a slice for this channel. // int width = (_ifd->maxX - _ifd->minX + 1); ptrdiff_t base = reinterpret_cast(&_ifd->sampleCount[0][0]); base -= sizeof(unsigned int)*_ifd->minX; base -= sizeof(unsigned int)*static_cast(_ifd->minY) * static_cast(width); copyIntoDeepFrameBuffer (readPtr, slice.base, reinterpret_cast(base), sizeof(unsigned int) * 1, sizeof(unsigned int) * width, y, _ifd->minX, _ifd->maxX, 0, 0, 0, 0, slice.sampleStride, slice.xPointerStride, slice.yPointerStride, slice.fill, slice.fillValue, _lineBuffer->format, slice.typeInFrameBuffer, slice.typeInFile); } } } } catch (std::exception &e) { if (!_lineBuffer->hasException) { _lineBuffer->exception = e.what(); _lineBuffer->hasException = true; } } catch (...) { if (!_lineBuffer->hasException) { _lineBuffer->exception = "unrecognized exception"; _lineBuffer->hasException = true; } } } LineBufferTask * newLineBufferTask (TaskGroup *group, DeepScanLineInputFile::Data *ifd, int number, int scanLineMin, int scanLineMax) { // // Wait for a line buffer to become available, fill the line // buffer with raw data from the file if necessary, and create // a new LineBufferTask whose execute() method will uncompress // the contents of the buffer and copy the pixels into the // frame buffer. // LineBuffer *lineBuffer = ifd->getLineBuffer (number); try { lineBuffer->wait (); if (lineBuffer->number != number) { lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer; lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1; lineBuffer->number = number; lineBuffer->uncompressedData = 0; readPixelData (ifd->_streamData, ifd, lineBuffer->minY, lineBuffer->buffer, lineBuffer->packedDataSize, lineBuffer->unpackedDataSize); } } catch (std::exception &e) { if (!lineBuffer->hasException) { lineBuffer->exception = e.what(); lineBuffer->hasException = true; } lineBuffer->number = -1; lineBuffer->post(); throw; } catch (...) { // // Reading from the file caused an exception. // Signal that the line buffer is free, and // re-throw the exception. // lineBuffer->exception = "unrecognized exception"; lineBuffer->hasException = true; lineBuffer->number = -1; lineBuffer->post(); throw; } scanLineMin = max (lineBuffer->minY, scanLineMin); scanLineMax = min (lineBuffer->maxY, scanLineMax); return new LineBufferTask (group, ifd, lineBuffer, scanLineMin, scanLineMax); } } // namespace void DeepScanLineInputFile::initialize(const Header& header) { try { if (header.type() != DEEPSCANLINE) throw IEX_NAMESPACE::ArgExc("Can't build a DeepScanLineInputFile from " "a type-mismatched part."); if(header.version()!=1) { THROW(IEX_NAMESPACE::ArgExc, "Version " << header.version() << " not supported for deepscanline images in this version of the library"); } _data->header = header; _data->lineOrder = _data->header.lineOrder(); const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->sampleCount.resizeErase(_data->maxY - _data->minY + 1, _data->maxX - _data->minX + 1); _data->lineSampleCount.resizeErase(_data->maxY - _data->minY + 1); Compressor* compressor = newCompressor(_data->header.compression(), 0, _data->header); _data->linesInBuffer = numLinesInBuffer (compressor); delete compressor; _data->nextLineBufferMinY = _data->minY - 1; int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + _data->linesInBuffer) / _data->linesInBuffer; _data->lineOffsets.resize (lineOffsetSize); for (size_t i = 0; i < _data->lineBuffers.size(); i++) _data->lineBuffers[i] = new LineBuffer (); _data->gotSampleCount.resizeErase(_data->maxY - _data->minY + 1); for (int i = 0; i < _data->maxY - _data->minY + 1; i++) _data->gotSampleCount[i] = false; _data->maxSampleCountTableSize = min(_data->linesInBuffer, _data->maxY - _data->minY + 1) * (_data->maxX - _data->minX + 1) * sizeof(unsigned int); _data->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); _data->sampleCountTableComp = newCompressor(_data->header.compression(), _data->maxSampleCountTableSize, _data->header); _data->bytesPerLine.resize (_data->maxY - _data->minY + 1); const ChannelList & c=header.channels(); _data->combinedSampleSize=0; for(ChannelList::ConstIterator i=c.begin();i!=c.end();i++) { switch(i.channel().type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : _data->combinedSampleSize+=Xdr::size(); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : _data->combinedSampleSize+=Xdr::size(); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : _data->combinedSampleSize+=Xdr::size(); break; default : THROW(IEX_NAMESPACE::ArgExc, "Bad type for channel " << i.name() << " initializing deepscanline reader"); } } } catch (...) { // Don't delete _data here, leave that to caller throw; } } DeepScanLineInputFile::DeepScanLineInputFile(InputPartData* part) { _data = new Data(part->numThreads); _data->_deleteStream=false; _data->_streamData = part->mutex; _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); _data->version = part->version; try { initialize(part->header); } catch(...) { delete _data; throw; } _data->lineOffsets = part->chunkOffsets; _data->partNumber = part->partNumber; } DeepScanLineInputFile::DeepScanLineInputFile (const char fileName[], int numThreads) : _data (new Data (numThreads)) { _data->_deleteStream = true; OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0; try { is = new StdIFStream (fileName); readMagicNumberAndVersionField(*is, _data->version); // // Backward compatibility to read multpart file. // multiPartInitialize will create _streamData if (isMultiPart(_data->version)) { compatibilityInitialize(*is); return; } } catch (IEX_NAMESPACE::BaseExc &e) { if (is) delete is; if (_data) delete _data; REPLACE_EXC (e, "Cannot read image file " "\"" << fileName << "\". " << e.what()); throw; } // // not multiPart - allocate stream data and intialise as normal // try { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = is; _data->memoryMapped = is->isMemoryMapped(); _data->header.readFrom (*_data->_streamData->is, _data->version); _data->header.sanityCheck (isTiled (_data->version)); initialize(_data->header); readLineOffsets (*_data->_streamData->is, _data->lineOrder, _data->lineOffsets, _data->fileIsComplete); } catch (IEX_NAMESPACE::BaseExc &e) { if (is) delete is; if (_data && _data->_streamData) { delete _data->_streamData; } if (_data) delete _data; REPLACE_EXC (e, "Cannot read image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { if (is) delete is; if (_data && _data->_streamData) { delete _data->_streamData; } if (_data) delete _data; throw; } } DeepScanLineInputFile::DeepScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new InputStreamMutex(); _data->_deleteStream=false; _data->_streamData->is = is; _data->memoryMapped = is->isMemoryMapped(); _data->version =version; try { initialize (header); } catch (...) { if (_data && _data->_streamData) { delete _data->_streamData; } if (_data) delete _data; throw; } readLineOffsets (*_data->_streamData->is, _data->lineOrder, _data->lineOffsets, _data->fileIsComplete); } DeepScanLineInputFile::~DeepScanLineInputFile () { if (_data->_deleteStream) delete _data->_streamData->is; if (_data) { if (!_data->memoryMapped) for (size_t i = 0; i < _data->lineBuffers.size(); i++) delete [] _data->lineBuffers[i]->buffer; // // Unless this file was opened via the multipart API, delete the streamdata // object too. // (TODO) it should be "isMultiPart(data->version)", but when there is only // single part, // (see the above constructor) the version field is not set. // // (TODO) we should have a way to tell if the stream data is owned by this // file or by a parent multipart file. // if (_data->partNumber == -1 && _data->_streamData) { delete _data->_streamData; } delete _data; } } void DeepScanLineInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) { is.seekg(0); // // Construct a MultiPartInputFile, initialize TiledInputFile // with the part 0 data. // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. // _data->multiPartBackwardSupport = true; _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); InputPartData* part = _data->multiPartFile->getPart(0); multiPartInitialize(part); } void DeepScanLineInputFile::multiPartInitialize(InputPartData* part) { _data->_streamData = part->mutex; _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); _data->version = part->version; initialize(part->header); _data->lineOffsets = part->chunkOffsets; _data->partNumber = part->partNumber; } const char * DeepScanLineInputFile::fileName () const { return _data->_streamData->is->fileName(); } const Header & DeepScanLineInputFile::header () const { return _data->header; } int DeepScanLineInputFile::version () const { return _data->version; } void DeepScanLineInputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Check if the new frame buffer descriptor is // compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { ChannelList::ConstIterator i = channels.find (j.name()); if (i == channels.end()) continue; if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of input file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } // // Store the pixel sample count table. // (TODO) Support for different sampling rates? // const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); if (sampleCountSlice.base == 0) { throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); } else { _data->sampleCountSliceBase = sampleCountSlice.base; _data->sampleCountXStride = sampleCountSlice.xStride; _data->sampleCountYStride = sampleCountSlice.yStride; } // // Initialize the slice table for readPixels(). // vector slices; ChannelList::ConstIterator i = channels.begin(); for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { while (i != channels.end() && strcmp (i.name(), j.name()) < 0) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (new InSliceInfo (i.channel().type, NULL, i.channel().type, 0, 0, 0, // sampleStride i.channel().xSampling, i.channel().ySampling, false, // fill true, // skip 0.0)); // fillValue ++i; } bool fill = false; if (i == channels.end() || strcmp (i.name(), j.name()) > 0) { // // Channel i is present in the frame buffer, but not in the file. // In the frame buffer, slice j will be filled with a default value. // fill = true; } slices.push_back (new InSliceInfo (j.slice().type, j.slice().base, fill? j.slice().type: i.channel().type, j.slice().xStride, j.slice().yStride, j.slice().sampleStride, j.slice().xSampling, j.slice().ySampling, fill, false, // skip j.slice().fillValue)); if (i != channels.end() && !fill) ++i; } // // Client may want data to be filled in multiple arrays, // so we reset gotSampleCount and bytesPerLine. // for (long i = 0; i < _data->gotSampleCount.size(); i++) _data->gotSampleCount[i] = false; for (size_t i = 0; i < _data->bytesPerLine.size(); i++) _data->bytesPerLine[i] = 0; // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; for (size_t i = 0; i < _data->slices.size(); i++) delete _data->slices[i]; _data->slices = slices; _data->frameBufferValid = true; } const DeepFrameBuffer & DeepScanLineInputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } bool DeepScanLineInputFile::isComplete () const { return _data->fileIsComplete; } void DeepScanLineInputFile::readPixels (int scanLine1, int scanLine2) { try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data destination."); int scanLineMin = min (scanLine1, scanLine2); int scanLineMax = max (scanLine1, scanLine2); if (scanLineMin < _data->minY || scanLineMax > _data->maxY) throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " "the image file's data window."); for (int i = scanLineMin; i <= scanLineMax; i++) { if (_data->gotSampleCount[i - _data->minY] == false) throw IEX_NAMESPACE::ArgExc ("Tried to read scan line without " "knowing the sample counts, please" "read the sample counts first."); } // // We impose a numbering scheme on the lineBuffers where the first // scanline is contained in lineBuffer 1. // // Determine the first and last lineBuffer numbers in this scanline // range. We always attempt to read the scanlines in the order that // they are stored in the file. // int start, stop, dl; if (_data->lineOrder == INCREASING_Y) { start = (scanLineMin - _data->minY) / _data->linesInBuffer; stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1; dl = 1; } else { start = (scanLineMax - _data->minY) / _data->linesInBuffer; stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1; dl = -1; } // // Create a task group for all line buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; // // Add the line buffer tasks. // // The tasks will execute in the order that they are created // because we lock the line buffers during construction and the // constructors are called by the main thread. Hence, in order // for a successive task to execute the previous task which // used that line buffer must have completed already. // for (int l = start; l != stop; l += dl) { ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup, _data, l, scanLineMin, scanLineMax)); } // // finish all tasks // } // // Exeption handling: // // LineBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to ScanLineInputFile::readPixels(). // LineBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the line buffers. // Now we check if any line buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple line buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { LineBuffer *lineBuffer = _data->lineBuffers[i]; if (lineBuffer->hasException && !exception) exception = &lineBuffer->exception; lineBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void DeepScanLineInputFile::readPixels (int scanLine) { readPixels (scanLine, scanLine); } void DeepScanLineInputFile::rawPixelData (int firstScanLine, char *pixelData, Int64 &pixelDataSize) { int minY = lineBufferMinY (firstScanLine, _data->minY, _data->linesInBuffer); int lineBufferNumber = (minY - _data->minY) / _data->linesInBuffer; Int64 lineOffset = _data->lineOffsets[lineBufferNumber]; if (lineOffset == 0) THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); // enter the lock here - prevent another thread reseeking the file during read Lock lock (*_data->_streamData); // // Seek to the start of the scan line in the file, // if (_data->_streamData->is->tellg() != _data->lineOffsets[lineBufferNumber]) _data->_streamData->is->seekg (lineOffset); // // Read the data block's header. // int yInFile; // // Read the part number when we are dealing with a multi-part file. // if (isMultiPart(_data->version)) { int partNumber; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, partNumber); if (partNumber != _data->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << _data->partNumber << "."); } } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, yInFile); if (yInFile != minY) throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); Int64 sampleCountTableSize; Int64 packedDataSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, sampleCountTableSize); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, packedDataSize); // total requirement for reading all the data Int64 totalSizeRequired=28+sampleCountTableSize+packedDataSize; bool big_enough = totalSizeRequired<=pixelDataSize; pixelDataSize = totalSizeRequired; // was the block we were given big enough? if(!big_enough || pixelData==NULL) { // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek // in single part files) if(!isMultiPart(_data->version)) { if (_data->nextLineBufferMinY == minY) _data->_streamData->is->seekg (lineOffset); } // leave lock here - bail before reading more data return; } // copy the values we have read into the output block *(int *) pixelData = yInFile; *(Int64 *) (pixelData+4) =sampleCountTableSize; *(Int64 *) (pixelData+12) = packedDataSize; // didn't read the unpackedsize - do that now Xdr::read (*_data->_streamData->is, *(Int64 *) (pixelData+20)); // read the actual data _data->_streamData->is->read(pixelData+28, sampleCountTableSize+packedDataSize); // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek // in single part files) if(!isMultiPart(_data->version)) { if (_data->nextLineBufferMinY == minY) _data->_streamData->is->seekg (lineOffset); } // leave lock here } void DeepScanLineInputFile::readPixels (const char* rawPixelData, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const { // // read header from block - already converted from Xdr to native format // int data_scanline = *(int *) rawPixelData; Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4); Int64 packedDataSize = *(Int64 *) (rawPixelData+12); Int64 unpackedDataSize = *(Int64 *) (rawPixelData+20); // // Uncompress the data, if necessary // Compressor * decomp = NULL; const char * uncompressed_data; Compressor::Format format = Compressor::XDR; if(packedDataSize header.compression(), unpackedDataSize, _data->header); decomp->uncompress(rawPixelData+28+sampleCountTableDataSize, packedDataSize, data_scanline, uncompressed_data); format = decomp->format(); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // format = Compressor::XDR; uncompressed_data = rawPixelData+28+sampleCountTableDataSize; } int yStart, yStop, dy; if (_data->lineOrder == INCREASING_Y) { yStart = scanLine1; yStop = scanLine2 + 1; dy = 1; } else { yStart = scanLine2; yStop = scanLine1 - 1; dy = -1; } const char* samplecount_base = frameBuffer.getSampleCountSlice().base; int samplecount_xstride = frameBuffer.getSampleCountSlice().xStride; int samplecount_ystride = frameBuffer.getSampleCountSlice().yStride; // // For each line within the block, get the count of bytes. // int minYInLineBuffer = data_scanline; int maxYInLineBuffer = min(minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY); vector bytesPerLine(1+_data->maxY-_data->minY); bytesPerDeepLineTable (_data->header, minYInLineBuffer, maxYInLineBuffer, samplecount_base, samplecount_xstride, samplecount_ystride, bytesPerLine); // // For each scanline within the block, get the offset. // vector offsetInLineBuffer; offsetInLineBufferTable (bytesPerLine, minYInLineBuffer - _data->minY, maxYInLineBuffer - _data->minY, _data->linesInBuffer, offsetInLineBuffer); const ChannelList & channels=header().channels(); for (int y = yStart; y != yStop; y += dy) { const char *readPtr =uncompressed_data + offsetInLineBuffer[y - _data->minY]; // // need to know the total number of samples on a scanline to skip channels // compute on demand: -1 means uncomputed // int lineSampleCount = -1; // // Iterate over all image channels in frame buffer // ChannelList::ConstIterator i = channels.begin(); for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { while (i != channels.end() && strcmp (i.name(), j.name()) < 0) { // // Channel i is present in the file but not // in the frame buffer; skip if(lineSampleCount==-1) { lineSampleCount=0; const char * ptr = (samplecount_base+y*samplecount_ystride + samplecount_xstride*_data->minX); for(int x=_data->minX;x<=_data->maxX;x++) { lineSampleCount+=*(const unsigned int *) ptr; ptr+=samplecount_xstride; } } skipChannel (readPtr, i.channel().type, lineSampleCount ); ++i; } bool fill = false; if (i == channels.end() || strcmp (i.name(), j.name()) > 0) { // // Channel i is present in the frame buffer, but not in the file. // In the frame buffer, slice j will be filled with a default value. // fill = true; } if (modp (y, i.channel().ySampling) == 0) { copyIntoDeepFrameBuffer (readPtr, j.slice().base, samplecount_base, samplecount_xstride, samplecount_ystride, y, _data->minX, _data->maxX, 0, 0, 0, 0, j.slice().sampleStride, j.slice().xStride, j.slice().yStride, fill, j.slice().fillValue, format, j.slice().type, i.channel().type); ++i; } }//next slice in framebuffer }//next row in image // // clean up // delete decomp; } void DeepScanLineInputFile::readPixelSampleCounts (const char* rawPixelData, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const { // // read header from block - already converted from Xdr to native format // int data_scanline = *(int *) rawPixelData; Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4); int maxY; maxY = min(data_scanline + _data->linesInBuffer - 1, _data->maxY); if(scanLine1 != data_scanline) { THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect start scanline - should be " << data_scanline ); } if(scanLine2 != maxY) { THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect end scanline - should be " << maxY ); } // // If the sample count table is compressed, we'll uncompress it. // Int64 rawSampleCountTableSize = (maxY - data_scanline + 1) * (_data->maxX - _data->minX + 1) * Xdr::size (); Compressor * decomp=NULL; const char* readPtr; if (sampleCountTableDataSize < rawSampleCountTableSize) { decomp = newCompressor(_data->header.compression(), rawSampleCountTableSize, _data->header); decomp->uncompress(rawPixelData+28, sampleCountTableDataSize, data_scanline, readPtr); } else readPtr = rawPixelData+28; char* base = frameBuffer.getSampleCountSlice().base; int xStride = frameBuffer.getSampleCountSlice().xStride; int yStride = frameBuffer.getSampleCountSlice().yStride; for (int y = scanLine1; y <= scanLine2; y++) { int lastAccumulatedCount = 0; for (int x = _data->minX; x <= _data->maxX; x++) { int accumulatedCount, count; // // Read the sample count for pixel (x, y). // Xdr::read (readPtr, accumulatedCount); if (x == _data->minX) count = accumulatedCount; else count = accumulatedCount - lastAccumulatedCount; lastAccumulatedCount = accumulatedCount; // // Store the data in both internal and external data structure. // sampleCount(base, xStride, yStride, x, y) = count; } } if(decomp) { delete decomp; } } namespace { void readSampleCountForLineBlock(InputStreamMutex* streamData, DeepScanLineInputFile::Data* data, int lineBlockId) { streamData->is->seekg(data->lineOffsets[lineBlockId]); if (isMultiPart(data->version)) { int partNumber; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); if (partNumber != data->partNumber) throw IEX_NAMESPACE::ArgExc("Unexpected part number."); } int minY; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, minY); // // Check the correctness of minY. // if (minY != data->minY + lineBlockId * data->linesInBuffer) throw IEX_NAMESPACE::ArgExc("Unexpected data block y coordinate."); int maxY; maxY = min(minY + data->linesInBuffer - 1, data->maxY); Int64 sampleCountTableDataSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, sampleCountTableDataSize); if(sampleCountTableDataSize>static_cast(data->maxSampleCountTableSize)) { THROW (IEX_NAMESPACE::ArgExc, "Bad sampleCountTableDataSize read from chunk "<< lineBlockId << ": expected " << data->maxSampleCountTableSize << " or less, got "<< sampleCountTableDataSize); } Int64 packedDataSize; Int64 unpackedDataSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, packedDataSize); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, unpackedDataSize); // // We make a check on the data size requirements here. // Whilst we wish to store 64bit sizes on disk, not all the compressors // have been made to work with such data sizes and are still limited to // using signed 32 bit (int) for the data size. As such, this version // insists that we validate that the data size does not exceed the data // type max limit. // @TODO refactor the compressor code to ensure full 64-bit support. // int compressorMaxDataSize = std::numeric_limits::max(); if (sampleCountTableDataSize > Int64(compressorMaxDataSize)) { THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not " << "support the allocation of data with size > " << compressorMaxDataSize << " file table size :" << sampleCountTableDataSize << ".\n"); } streamData->is->read(data->sampleCountTableBuffer, sampleCountTableDataSize); const char* readPtr; // // If the sample count table is compressed, we'll uncompress it. // if (sampleCountTableDataSize < static_cast(data->maxSampleCountTableSize)) { if(!data->sampleCountTableComp) { THROW(IEX_NAMESPACE::ArgExc,"Deep scanline data corrupt at chunk " << lineBlockId << " (sampleCountTableDataSize error)"); } data->sampleCountTableComp->uncompress(data->sampleCountTableBuffer, sampleCountTableDataSize, minY, readPtr); } else readPtr = data->sampleCountTableBuffer; char* base = data->sampleCountSliceBase; int xStride = data->sampleCountXStride; int yStride = data->sampleCountYStride; // total number of samples in block: used to check samplecount table doesn't // reference more data than exists size_t cumulative_total_samples=0; for (int y = minY; y <= maxY; y++) { int yInDataWindow = y - data->minY; data->lineSampleCount[yInDataWindow] = 0; int lastAccumulatedCount = 0; for (int x = data->minX; x <= data->maxX; x++) { int accumulatedCount, count; // // Read the sample count for pixel (x, y). // Xdr::read (readPtr, accumulatedCount); // sample count table should always contain monotonically // increasing values. if (accumulatedCount < lastAccumulatedCount) { THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << " (negative sample count detected)"); } count = accumulatedCount - lastAccumulatedCount; lastAccumulatedCount = accumulatedCount; // // Store the data in both internal and external data structure. // data->sampleCount[yInDataWindow][x - data->minX] = count; data->lineSampleCount[yInDataWindow] += count; sampleCount(base, xStride, yStride, x, y) = count; } cumulative_total_samples+=data->lineSampleCount[yInDataWindow]; if(cumulative_total_samples*data->combinedSampleSize > unpackedDataSize) { THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << ": pixel data only contains " << unpackedDataSize << " bytes of data but table references at least " << cumulative_total_samples*data->combinedSampleSize << " bytes of sample data" ); } data->gotSampleCount[y - data->minY] = true; } } void fillSampleCountFromCache(int y, DeepScanLineInputFile::Data* data) { int yInDataWindow = y - data->minY; char* base = data->sampleCountSliceBase; int xStride = data->sampleCountXStride; int yStride = data->sampleCountYStride; for (int x = data->minX; x <= data->maxX; x++) { unsigned int count = data->sampleCount[yInDataWindow][x - data->minX]; sampleCount(base, xStride, yStride, x, y) = count; } } } // namespace void DeepScanLineInputFile::readPixelSampleCounts (int scanline1, int scanline2) { Int64 savedFilePos = 0; if(!_data->frameBufferValid) { throw IEX_NAMESPACE::ArgExc("readPixelSampleCounts called with no valid frame buffer"); } try { Lock lock (*_data->_streamData); savedFilePos = _data->_streamData->is->tellg(); int scanLineMin = min (scanline1, scanline2); int scanLineMax = max (scanline1, scanline2); if (scanLineMin < _data->minY || scanLineMax > _data->maxY) throw IEX_NAMESPACE::ArgExc ("Tried to read scan line sample counts outside " "the image file's data window."); for (int i = scanLineMin; i <= scanLineMax; i++) { // // if scanline is already read, it'll be in the cache // otherwise, read from file, store in cache and in caller's framebuffer // if (_data->gotSampleCount[i - _data->minY]) { fillSampleCountFromCache(i,_data); }else{ int lineBlockId = ( i - _data->minY ) / _data->linesInBuffer; readSampleCountForLineBlock ( _data->_streamData, _data, lineBlockId ); int minYInLineBuffer = lineBlockId * _data->linesInBuffer + _data->minY; int maxYInLineBuffer = min ( minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY ); // // For each line within the block, get the count of bytes. // bytesPerDeepLineTable ( _data->header, minYInLineBuffer, maxYInLineBuffer, _data->sampleCountSliceBase, _data->sampleCountXStride, _data->sampleCountYStride, _data->bytesPerLine ); // // For each scanline within the block, get the offset. // offsetInLineBufferTable ( _data->bytesPerLine, minYInLineBuffer - _data->minY, maxYInLineBuffer - _data->minY, _data->linesInBuffer, _data->offsetInLineBuffer ); } } _data->_streamData->is->seekg(savedFilePos); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading sample count data from image " "file \"" << fileName() << "\". " << e.what()); _data->_streamData->is->seekg(savedFilePos); throw; } } void DeepScanLineInputFile::readPixelSampleCounts(int scanline) { readPixelSampleCounts(scanline, scanline); } int DeepScanLineInputFile::firstScanLineInChunk(int y) const { return int((y-_data->minY)/_data->linesInBuffer)*_data->linesInBuffer + _data->minY; } int DeepScanLineInputFile::lastScanLineInChunk(int y) const { int minY = firstScanLineInChunk(y); return min(minY+_data->linesInBuffer-1,_data->maxY); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h000066400000000000000000000270731406177042200225750ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEP_SCAN_LINE_INPUT_FILE_H #define INCLUDED_IMF_DEEP_SCAN_LINE_INPUT_FILE_H //----------------------------------------------------------------------------- // // class DeepScanLineInputFile // //----------------------------------------------------------------------------- #include "ImfThreading.h" #include "ImfGenericInputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" #include "ImfDeepScanLineOutputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepScanLineInputFile : public GenericInputFile { public: //------------ // Constructor //------------ IMF_EXPORT DeepScanLineInputFile (const char fileName[], int numThreads = globalThreadCount()); IMF_EXPORT DeepScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, /*version field from file*/ int numThreads = globalThreadCount()); DeepScanLineInputFile (const DeepScanLineInputFile& other) = delete; DeepScanLineInputFile& operator = (const DeepScanLineInputFile& other) = delete; DeepScanLineInputFile (DeepScanLineInputFile&& other) = delete; DeepScanLineInputFile& operator = (DeepScanLineInputFile&& other) = delete; //----------------------------------------- // Destructor -- deallocates internal data // structures, but does not close the file. //----------------------------------------- IMF_EXPORT virtual ~DeepScanLineInputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the InputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readPixels() is called. // The current frame buffer can be changed after each call // to readPixels(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //--------------------------------------------------------------- // Check if the file is complete: // // isComplete() returns true if all pixels in the data window are // present in the input file, or false if any pixels are missing. // (Another program may still be busy writing the file, or file // writing may have been aborted prematurely.) //--------------------------------------------------------------- IMF_EXPORT bool isComplete () const; //--------------------------------------------------------------- // Read pixel data: // // readPixels(s1,s2) reads all scan lines with y coordinates // in the interval [min (s1, s2), max (s1, s2)] from the file, // and stores them in the current frame buffer. // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header.dataWindow().max.y] // // The scan lines can be read from the file in random order, and // individual scan lines may be skipped or read multiple times. // For maximum efficiency, the scan lines should be read in the // order in which they were written to the file. // // readPixels(s) calls readPixels(s,s). // // If threading is enabled, readPixels (s1, s2) tries to perform // decopmression of multiple scanlines in parallel. // //--------------------------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); //--------------------------------------------------------------- // Extract pixel data from pre-read block // // readPixels(rawPixelData,frameBuffer,s1,s2) reads all scan lines with y coordinates // in the interval [min (s1, s2), max (s1, s2)] from the data provided and // stores them in the provided frameBuffer. // the data can be obtained from a call to rawPixelData() // // // Both s1 and s2 must be within the data specified // // you must provide a frameBuffer with a samplecountslice, which must have been read // and the data valid - readPixels uses your sample count buffer to compute // offsets to the data it needs // // This call does not block, and is thread safe for clients with an existing // threading model. The InputFile's frameBuffer is not used in this call. // // This call is only provided for clients which have an existing threading model in place // and unpredictable access patterns to the data. // The fastest way to read an entire image is to enable threading,use setFrameBuffer then // readPixels(header().dataWindow().min.y, header.dataWindow().max.y) // //--------------------------------------------------------------- IMF_EXPORT void readPixels (const char * rawPixelData, const DeepFrameBuffer & frameBuffer, int scanLine1, int scanLine2) const; //---------------------------------------------- // Read a block of raw pixel data from the file, // without uncompressing it (this function is // used to implement OutputFile::copyPixels()). // note: returns the entire payload of the relevant chunk of data, not including part number // including compressed and uncompressed sizes // on entry, if pixelDataSize is insufficiently large, no bytes are read (pixelData can safely be NULL) // on exit, pixelDataSize is the number of bytes required to read the chunk // //---------------------------------------------- IMF_EXPORT void rawPixelData (int firstScanLine, char * pixelData, Int64 &pixelDataSize); //------------------------------------------------- // firstScanLineInChunk() returns the row number of the first row that's stored in the // same chunk as scanline y. Depending on the compression mode, this may not be the same as y // // lastScanLineInChunk() returns the row number of the last row that's stored in the same // chunk as scanline y. Depending on the compression mode, this may not be the same as y. // The last chunk in the file may be smaller than all the others // //------------------------------------------------ IMF_EXPORT int firstScanLineInChunk(int y) const; IMF_EXPORT int lastScanLineInChunk (int y) const; //----------------------------------------------------------- // Read pixel sample counts into a slice in the frame buffer. // // readPixelSampleCounts(s1, s2) reads all the counts of // pixel samples with y coordinates in the interval // [min (s1, s2), max (s1, s2)] from the file, and stores // them in the slice naming "sample count". // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header.dataWindow().max.y] // // readPixelSampleCounts(s) calls readPixelSampleCounts(s,s). // //----------------------------------------------------------- IMF_EXPORT void readPixelSampleCounts (int scanline1, int scanline2); IMF_EXPORT void readPixelSampleCounts (int scanline); //---------------------------------------------------------- // Read pixel sample counts into the provided frameBuffer // using a block read of data read by rawPixelData // for multi-scanline compression schemes, you must decode the entire block // so scanline1=firstScanLineInChunk(y) and scanline2=lastScanLineInChunk(y) // // This call does not block, and is thread safe for clients with an existing // threading model. The InputFile's frameBuffer is not used in this call. // // The fastest way to read an entire image is to enable threading in OpenEXR, use setFrameBuffer then // readPixelSampleCounts(header().dataWindow().min.y, header.dataWindow().max.y) // //---------------------------------------------------------- IMF_EXPORT void readPixelSampleCounts (const char * rawdata , const DeepFrameBuffer & frameBuffer, int scanLine1 , int scanLine2) const; struct Data; private: Data * _data; DeepScanLineInputFile (InputPartData* part); void initialize(const Header& header); void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream & is); void multiPartInitialize(InputPartData* part); friend class InputFile; friend class MultiPartInputFile; friend void DeepScanLineOutputFile::copyPixels(DeepScanLineInputFile &); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp000066400000000000000000000100141406177042200231420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfDeepScanLineInputPart.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER DeepScanLineInputPart::DeepScanLineInputPart(MultiPartInputFile& multiPartFile, int partNumber) { file = multiPartFile.getInputPart(partNumber); } const char * DeepScanLineInputPart::fileName () const { return file->fileName(); } const Header & DeepScanLineInputPart::header () const { return file->header(); } int DeepScanLineInputPart::version () const { return file->version(); } void DeepScanLineInputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const DeepFrameBuffer & DeepScanLineInputPart::frameBuffer () const { return file->frameBuffer(); } bool DeepScanLineInputPart::isComplete () const { return file->isComplete(); } void DeepScanLineInputPart::readPixels (int scanLine1, int scanLine2) { file->readPixels(scanLine1, scanLine2); } void DeepScanLineInputPart::readPixels (int scanLine) { file->readPixels(scanLine); } void DeepScanLineInputPart::rawPixelData (int firstScanLine, char *pixelData, Int64 &pixelDataSize) { file->rawPixelData(firstScanLine, pixelData, pixelDataSize); } void DeepScanLineInputPart::readPixelSampleCounts(int scanline1, int scanline2) { file->readPixelSampleCounts(scanline1, scanline2); } void DeepScanLineInputPart::readPixelSampleCounts(int scanline) { file->readPixelSampleCounts(scanline); } int DeepScanLineInputPart::firstScanLineInChunk(int y) const { return file->firstScanLineInChunk(y); } int DeepScanLineInputPart::lastScanLineInChunk(int y) const { return file->lastScanLineInChunk(y); } void DeepScanLineInputPart::readPixels(const char* rawPixelData, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const { return file->readPixels(rawPixelData,frameBuffer,scanLine1,scanLine2); } void DeepScanLineInputPart::readPixelSampleCounts(const char* rawdata, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const { return file->readPixelSampleCounts(rawdata,frameBuffer,scanLine1,scanLine2); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h000066400000000000000000000161731406177042200226230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFDEEPSCANLINEINPUTPART_H_ #define IMFDEEPSCANLINEINPUTPART_H_ #include "ImfMultiPartInputFile.h" #include "ImfDeepScanLineInputFile.h" #include "ImfDeepScanLineOutputFile.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepScanLineInputPart { public: IMF_EXPORT DeepScanLineInputPart(MultiPartInputFile& file, int partNumber); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the InputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readPixels() is called. // The current frame buffer can be changed after each call // to readPixels(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //--------------------------------------------------------------- // Check if the file is complete: // // isComplete() returns true if all pixels in the data window are // present in the input file, or false if any pixels are missing. // (Another program may still be busy writing the file, or file // writing may have been aborted prematurely.) //--------------------------------------------------------------- IMF_EXPORT bool isComplete () const; //--------------------------------------------------------------- // Read pixel data: // // readPixels(s1,s2) reads all scan lines with y coordinates // in the interval [min (s1, s2), max (s1, s2)] from the file, // and stores them in the current frame buffer. // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header.dataWindow().max.y] // // The scan lines can be read from the file in random order, and // individual scan lines may be skipped or read multiple times. // For maximum efficiency, the scan lines should be read in the // order in which they were written to the file. // // readPixels(s) calls readPixels(s,s). // // If threading is enabled, readPixels (s1, s2) tries to perform // decopmression of multiple scanlines in parallel. // //--------------------------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); IMF_EXPORT void readPixels (const char * rawPixelData,const DeepFrameBuffer & frameBuffer, int scanLine1,int scanLine2) const; //---------------------------------------------- // Read a block of raw pixel data from the file, // without uncompressing it (this function is // used to implement OutputFile::copyPixels()). //---------------------------------------------- IMF_EXPORT void rawPixelData (int firstScanLine, char * pixelData, Int64 &pixelDataSize); //----------------------------------------------------------- // Read pixel sample counts into a slice in the frame buffer. // // readPixelSampleCounts(s1, s2) reads all the counts of // pixel samples with y coordinates in the interval // [min (s1, s2), max (s1, s2)] from the file, and stores // them in the slice naming "sample count". // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header.dataWindow().max.y] // // readPixelSampleCounts(s) calls readPixelSampleCounts(s,s). //----------------------------------------------------------- IMF_EXPORT void readPixelSampleCounts(int scanline1, int scanline2); IMF_EXPORT void readPixelSampleCounts(int scanline); IMF_EXPORT void readPixelSampleCounts( const char * rawdata , const DeepFrameBuffer & frameBuffer, int scanLine1 , int scanLine2) const; IMF_EXPORT int firstScanLineInChunk(int y) const; IMF_EXPORT int lastScanLineInChunk (int y) const; private: DeepScanLineInputFile *file; // needed for copyPixels friend void DeepScanLineOutputFile::copyPixels(DeepScanLineInputPart &); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFDEEPSCANLINEINPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp000066400000000000000000001422541406177042200233300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DeepScanLineOutputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "ImathBox.h" #include "ImathFun.h" #include #include #include #include #include "ImfDeepFrameBuffer.h" #include "ImfOutputStreamMutex.h" #include "ImfOutputPartData.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "Iex.h" #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using std::string; using std::vector; using std::min; using std::max; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct OutSliceInfo { PixelType type; const char * base; ptrdiff_t sampleStride; ptrdiff_t xStride; ptrdiff_t yStride; int xSampling; int ySampling; bool zero; OutSliceInfo (PixelType type = HALF, const char * base =NULL, ptrdiff_t sampleStride = 0, ptrdiff_t xStride = 0, ptrdiff_t yStride =0, int xSampling = 1, int ySampling = 1, bool zero = false); }; OutSliceInfo::OutSliceInfo (PixelType t, const char * base, ptrdiff_t spstride, ptrdiff_t xst, ptrdiff_t yst, int xsm, int ysm, bool z) : type (t), base (base), sampleStride (spstride), xStride(xst), yStride(yst), xSampling (xsm), ySampling (ysm), zero (z) { // empty } struct LineBuffer { Array< Array > buffer; Array consecutiveBuffer; const char * dataPtr; Int64 uncompressedDataSize; Int64 dataSize; Array sampleCountTableBuffer; const char * sampleCountTablePtr; Int64 sampleCountTableSize; Compressor* sampleCountTableCompressor; int minY; // the min y scanline stored int maxY; // the max y scanline stored int scanLineMin; // the min y scanline writing out int scanLineMax; // the max y scanline writing out Compressor * compressor; bool partiallyFull; // has incomplete data bool hasException; string exception; LineBuffer (int linesInBuffer); ~LineBuffer (); void wait () {_sem.wait();} void post () {_sem.post();} private: Semaphore _sem; }; LineBuffer::LineBuffer (int linesInBuffer) : dataPtr (0), dataSize (0), sampleCountTablePtr (0), sampleCountTableCompressor (0), compressor (0), partiallyFull (false), hasException (false), exception (), _sem (1) { buffer.resizeErase(linesInBuffer); } LineBuffer::~LineBuffer () { if (compressor != 0) delete compressor; if (sampleCountTableCompressor != 0) delete sampleCountTableCompressor; } } // namespace struct DeepScanLineOutputFile::Data { Header header; // the image header int version; // file format version bool multipart; // from a multipart file Int64 previewPosition; // file position for preview DeepFrameBuffer frameBuffer; // framebuffer to write into int currentScanLine; // next scanline to be written int missingScanLines; // number of lines to write LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord vector lineOffsets; // stores offsets in file for // each scanline vector bytesPerLine; // combined size of a line over // all channels Compressor::Format format; // compressor's data format vector slices; // info about channels in file Int64 lineOffsetsPosition; // file position for line // offset table vector lineBuffers; // each holds one line buffer int linesInBuffer; // number of scanlines each // buffer holds int partNumber; // the output part number char* sampleCountSliceBase; // the pointer to the number // of samples in each pixel int sampleCountXStride; // the x stride for sampleCountSliceBase int sampleCountYStride; // the y stride for sampleCountSliceBase Array lineSampleCount; // the number of samples // in each line Int64 maxSampleCountTableSize; // the max size in bytes for a pixel // sample count table OutputStreamMutex* _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline LineBuffer * getLineBuffer (int number);// hash function from line // buffer indices into our // vector of line buffers inline int& getSampleCount(int x, int y); // get the number of samples // in each pixel }; DeepScanLineOutputFile::Data::Data (int numThreads): lineOffsetsPosition (0), partNumber (-1) , _streamData(NULL), _deleteStream(false) { // // We need at least one lineBuffer, but if threading is used, // to keep n threads busy we need 2*n lineBuffers. // lineBuffers.resize (max (1, 2 * numThreads)); for (size_t i = 0; i < lineBuffers.size(); i++) lineBuffers[i] = 0; } DeepScanLineOutputFile::Data::~Data () { for (size_t i = 0; i < lineBuffers.size(); i++) if (lineBuffers[i] != 0) delete lineBuffers[i]; for (size_t i = 0; i < slices.size(); i++) delete slices[i]; } int& DeepScanLineOutputFile::Data::getSampleCount(int x, int y) { return sampleCount(sampleCountSliceBase, sampleCountXStride, sampleCountYStride, x, y); } LineBuffer* DeepScanLineOutputFile::Data::getLineBuffer (int number) { return lineBuffers[number % lineBuffers.size()]; } namespace { Int64 writeLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const vector &lineOffsets) { Int64 pos = os.tellp(); if (pos == static_cast(-1)) IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); for (unsigned int i = 0; i < lineOffsets.size(); i++) OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, lineOffsets[i]); return pos; } void writePixelData (OutputStreamMutex *filedata, DeepScanLineOutputFile::Data *partdata, int lineBufferMinY, const char pixelData[], Int64 packedDataSize, Int64 unpackedDataSize, const char sampleCountTableData[], Int64 sampleCountTableSize) { // // Store a block of pixel data in the output file, and try // to keep track of the current writing position the file // without calling tellp() (tellp() can be fairly expensive). // Int64 currentPosition = filedata->currentPosition; filedata->currentPosition = 0; if (currentPosition == 0) currentPosition = filedata->os->tellp(); partdata->lineOffsets[(partdata->currentScanLine - partdata->minY) / partdata->linesInBuffer] = currentPosition; #ifdef DEBUG assert (filedata->os->tellp() == currentPosition); #endif // // Write the optional part number. // if (partdata->multipart) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, partdata->partNumber); } // // Write the y coordinate of the first scanline in the chunk. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, lineBufferMinY); // // Write the packed size of the pixel sample count table. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, sampleCountTableSize); // // Write the packed pixel data size. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, packedDataSize); // // Write the unpacked pixel data size. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, unpackedDataSize); // // Write the packed pixel sample count table. // filedata->os->write (sampleCountTableData, sampleCountTableSize); // // Write the compressed data. // filedata->os->write (pixelData, packedDataSize); // // Update stream position. // filedata->currentPosition = currentPosition + Xdr::size() + // y coordinate Xdr::size() + // packed sample count table size Xdr::size() + // packed data size Xdr::size() + // unpacked data size sampleCountTableSize + // pixel sample count table packedDataSize; // pixel data if (partdata->multipart) { filedata->currentPosition += Xdr::size(); // optional part number } } inline void writePixelData (OutputStreamMutex* filedata, DeepScanLineOutputFile::Data *partdata, const LineBuffer *lineBuffer) { writePixelData (filedata, partdata, lineBuffer->minY, lineBuffer->dataPtr, lineBuffer->dataSize, lineBuffer->uncompressedDataSize, lineBuffer->sampleCountTablePtr, lineBuffer->sampleCountTableSize); } void convertToXdr (DeepScanLineOutputFile::Data *ofd, Array &lineBuffer, int lineBufferMinY, int lineBufferMaxY, int inSize) { // // Convert the contents of a lineBuffer from the machine's native // representation to Xdr format. This function is called by // CompressLineBuffer::execute(), below, if the compressor wanted // its input pixel data in the machine's native format, but then // failed to compress the data (most compressors will expand rather // than compress random input data). // // Note that this routine assumes that the machine's native // representation of the pixel data has the same size as the // Xdr representation. This makes it possible to convert the // pixel data in place, without an intermediate temporary buffer. // // // Iterate over all scanlines in the lineBuffer to convert. // char* writePtr = &lineBuffer[0]; for (int y = lineBufferMinY; y <= lineBufferMaxY; y++) { // // Set these to point to the start of line y. // We will write to writePtr from readPtr. // const char *readPtr = writePtr; // // Iterate over all slices in the file. // for (unsigned int i = 0; i < ofd->slices.size(); ++i) { // // Test if scan line y of this channel is // contains any data (the scan line contains // data only if y % ySampling == 0). // const OutSliceInfo &slice = *ofd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Find the number of sampled pixels, dMaxX-dMinX+1, for // slice i in scan line y (i.e. pixels within the data window // for which x % xSampling == 0). // int xSampleCount = ofd->lineSampleCount[y - ofd->minY]; // // Convert the samples in place. // convertInPlace (writePtr, readPtr, slice.type, xSampleCount); } } } // // A LineBufferTask encapsulates the task of copying a set of scanlines // from the user's frame buffer into a LineBuffer object, compressing // the data if necessary. // class LineBufferTask: public Task { public: LineBufferTask (TaskGroup *group, DeepScanLineOutputFile::Data *ofd, int number, int scanLineMin, int scanLineMax); virtual ~LineBufferTask (); virtual void execute (); private: DeepScanLineOutputFile::Data * _ofd; LineBuffer * _lineBuffer; }; LineBufferTask::LineBufferTask (TaskGroup *group, DeepScanLineOutputFile::Data *ofd, int number, int scanLineMin, int scanLineMax) : Task (group), _ofd (ofd), _lineBuffer (_ofd->getLineBuffer(number)) { // // Wait for the lineBuffer to become available // _lineBuffer->wait (); // // Initialize the lineBuffer data if necessary // if (!_lineBuffer->partiallyFull) { _lineBuffer->minY = _ofd->minY + number * _ofd->linesInBuffer; _lineBuffer->maxY = min (_lineBuffer->minY + _ofd->linesInBuffer - 1, _ofd->maxY); _lineBuffer->partiallyFull = true; } _lineBuffer->scanLineMin = max (_lineBuffer->minY, scanLineMin); _lineBuffer->scanLineMax = min (_lineBuffer->maxY, scanLineMax); } LineBufferTask::~LineBufferTask () { // // Signal that the line buffer is now free // _lineBuffer->post (); } void LineBufferTask::execute () { try { // // First copy the pixel data from the // frame buffer into the line buffer // int yStart, yStop, dy; if (_ofd->lineOrder == INCREASING_Y) { yStart = _lineBuffer->scanLineMin; yStop = _lineBuffer->scanLineMax + 1; dy = 1; } else { yStart = _lineBuffer->scanLineMax; yStop = _lineBuffer->scanLineMin - 1; dy = -1; } // // Allocate buffers for scanlines. // And calculate the sample counts for each line. // bytesPerDeepLineTable (_ofd->header, _lineBuffer->scanLineMin, _lineBuffer->scanLineMax, _ofd->sampleCountSliceBase, _ofd->sampleCountXStride, _ofd->sampleCountYStride, _ofd->bytesPerLine); for (int i = _lineBuffer->scanLineMin; i <= _lineBuffer->scanLineMax; i++) { // (TODO) don't do this all the time. _lineBuffer->buffer[i - _lineBuffer->minY].resizeErase( _ofd->bytesPerLine[i - _ofd->minY]); for (int j = _ofd->minX; j <= _ofd->maxX; j++) _ofd->lineSampleCount[i - _ofd->minY] += _ofd->getSampleCount(j, i); } // // Copy data from frame buffer to line buffer. // int y; for (y = yStart; y != yStop; y += dy) { // // Gather one scan line's worth of pixel data and store // them in _ofd->lineBuffer. // char *writePtr = &_lineBuffer->buffer[y - _lineBuffer->minY][0]; // // Iterate over all image channels. // for (unsigned int i = 0; i < _ofd->slices.size(); ++i) { // // Test if scan line y of this channel contains any data // (the scan line contains data only if y % ySampling == 0). // const OutSliceInfo &slice = *_ofd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Fill the line buffer with with pixel data. // if (slice.zero) { // // The frame buffer contains no data for this channel. // Store zeroes in _lineBuffer->buffer. // fillChannelWithZeroes (writePtr, _ofd->format, slice.type, _ofd->lineSampleCount[y - _ofd->minY]); } else { copyFromDeepFrameBuffer (writePtr, slice.base, _ofd->sampleCountSliceBase, _ofd->sampleCountXStride, _ofd->sampleCountYStride, y, _ofd->minX, _ofd->maxX, 0, 0,//offsets for samplecount 0, 0,//offsets for data slice.sampleStride, slice.xStride, slice.yStride, _ofd->format, slice.type); } } } // // If the next scanline isn't past the bounds of the lineBuffer // then we have partially filled the linebuffer, // otherwise the whole linebuffer is filled and then // we compress the linebuffer and write it out. // if (y >= _lineBuffer->minY && y <= _lineBuffer->maxY) return; // // Copy all data into a consecutive buffer. // Int64 totalBytes = 0; Int64 maxBytesPerLine = 0; for (int i = 0; i < _lineBuffer->maxY - _lineBuffer->minY + 1; i++) { totalBytes += _lineBuffer->buffer[i].size(); if (Int64(_lineBuffer->buffer[i].size()) > maxBytesPerLine) maxBytesPerLine = _lineBuffer->buffer[i].size(); } _lineBuffer->consecutiveBuffer.resizeErase(totalBytes); int pos = 0; for (int i = 0; i < _lineBuffer->maxY - _lineBuffer->minY + 1; i++) { memcpy(_lineBuffer->consecutiveBuffer + pos, &_lineBuffer->buffer[i][0], _lineBuffer->buffer[i].size()); pos += _lineBuffer->buffer[i].size(); } _lineBuffer->dataPtr = _lineBuffer->consecutiveBuffer; _lineBuffer->dataSize = totalBytes; _lineBuffer->uncompressedDataSize = _lineBuffer->dataSize; // // Compress the pixel sample count table. // char* ptr = _lineBuffer->sampleCountTableBuffer; Int64 tableDataSize = 0; for (int i = _lineBuffer->minY; i <= _lineBuffer->maxY; i++) { int count = 0; for (int j = _ofd->minX; j <= _ofd->maxX; j++) { count += _ofd->getSampleCount(j, i); Xdr::write (ptr, count); tableDataSize += sizeof (int); } } if(_lineBuffer->sampleCountTableCompressor) { _lineBuffer->sampleCountTableSize = _lineBuffer->sampleCountTableCompressor->compress ( _lineBuffer->sampleCountTableBuffer, tableDataSize, _lineBuffer->minY, _lineBuffer->sampleCountTablePtr); } // // If we can't make data shrink (or we weren't compressing), then just use the raw data. // if (!_lineBuffer->sampleCountTableCompressor || _lineBuffer->sampleCountTableSize >= tableDataSize) { _lineBuffer->sampleCountTableSize = tableDataSize; _lineBuffer->sampleCountTablePtr = _lineBuffer->sampleCountTableBuffer; } // // Compress the sample data // // (TODO) don't do this all the time. if (_lineBuffer->compressor != 0) delete _lineBuffer->compressor; _lineBuffer->compressor = newCompressor (_ofd->header.compression(), maxBytesPerLine, _ofd->header); Compressor *compressor = _lineBuffer->compressor; if (compressor) { const char *compPtr; Int64 compSize = compressor->compress (_lineBuffer->dataPtr, _lineBuffer->dataSize, _lineBuffer->minY, compPtr); if (compSize < _lineBuffer->dataSize) { _lineBuffer->dataSize = compSize; _lineBuffer->dataPtr = compPtr; } else if (_ofd->format == Compressor::NATIVE) { // // The data did not shrink during compression, but // we cannot write to the file using the machine's // native format, so we need to convert the lineBuffer // to Xdr. // convertToXdr (_ofd, _lineBuffer->consecutiveBuffer, _lineBuffer->minY, _lineBuffer->maxY, _lineBuffer->dataSize); } } _lineBuffer->partiallyFull = false; } catch (std::exception &e) { if (!_lineBuffer->hasException) { _lineBuffer->exception = e.what (); _lineBuffer->hasException = true; } } catch (...) { if (!_lineBuffer->hasException) { _lineBuffer->exception = "unrecognized exception"; _lineBuffer->hasException = true; } } } } // namespace DeepScanLineOutputFile::DeepScanLineOutputFile (const char fileName[], const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new OutputStreamMutex (); _data->_deleteStream=true; try { header.sanityCheck(); _data->_streamData->os = new StdOFStream (fileName); initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os); _data->lineOffsetsPosition = writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); _data->multipart=false;// not multipart; only one header } catch (IEX_NAMESPACE::BaseExc &e) { delete _data->_streamData->os; delete _data->_streamData; delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { delete _data->_streamData->os; delete _data->_streamData; delete _data; throw; } } DeepScanLineOutputFile::DeepScanLineOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData = new OutputStreamMutex (); _data->_deleteStream = false; try { header.sanityCheck(); _data->_streamData->os = &os; initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os); _data->lineOffsetsPosition = writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); _data->multipart=false; } catch (IEX_NAMESPACE::BaseExc &e) { delete _data->_streamData; delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << os.fileName() << "\". " << e.what()); throw; } catch (...) { delete _data->_streamData; delete _data; throw; } } DeepScanLineOutputFile::DeepScanLineOutputFile(const OutputPartData* part) { try { if (part->header.type() != DEEPSCANLINE) throw IEX_NAMESPACE::ArgExc("Can't build a DeepScanLineOutputFile from a type-mismatched part."); _data = new Data (part->numThreads); _data->_streamData = part->mutex; _data->_deleteStream=false; initialize (part->header); _data->partNumber = part->partNumber; _data->lineOffsetsPosition = part->chunkOffsetTablePosition; _data->previewPosition = part->previewPosition; _data->multipart=part->multipart; } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot initialize output part " "\"" << part->partNumber << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } void DeepScanLineOutputFile::initialize (const Header &header) { _data->header = header; _data->header.setType(DEEPSCANLINE); const Box2i &dataWindow = header.dataWindow(); _data->currentScanLine = (header.lineOrder() == INCREASING_Y)? dataWindow.min.y: dataWindow.max.y; _data->missingScanLines = dataWindow.max.y - dataWindow.min.y + 1; _data->lineOrder = header.lineOrder(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->lineSampleCount.resizeErase(_data->maxY - _data->minY + 1); Compressor* compressor = newCompressor (_data->header.compression(), 0, _data->header); _data->format = defaultFormat (compressor); _data->linesInBuffer = numLinesInBuffer (compressor); if (compressor != 0) delete compressor; int lineOffsetSize = (_data->maxY - _data->minY + _data->linesInBuffer) / _data->linesInBuffer; _data->header.setChunkCount(lineOffsetSize); _data->lineOffsets.resize (lineOffsetSize); _data->bytesPerLine.resize (_data->maxY - _data->minY + 1); _data->maxSampleCountTableSize = min(_data->linesInBuffer, _data->maxY - _data->minY + 1) * (_data->maxX - _data->minX + 1) * sizeof(unsigned int); for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { _data->lineBuffers[i] = new LineBuffer (_data->linesInBuffer); _data->lineBuffers[i]->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); _data->lineBuffers[i]->sampleCountTableCompressor = newCompressor (_data->header.compression(), _data->maxSampleCountTableSize, _data->header); } } DeepScanLineOutputFile::~DeepScanLineOutputFile () { { Lock lock(*_data->_streamData); Int64 originalPosition = _data->_streamData->os->tellp(); if (_data->lineOffsetsPosition > 0) { try { _data->_streamData->os->seekp (_data->lineOffsetsPosition); writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); // // Restore the original position. // _data->_streamData->os->seekp (originalPosition); } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // We cannot safely throw any exceptions from here. // This destructor may have been called because the // stack is currently being unwound for another // exception. // } } } if (_data->_deleteStream) delete _data->_streamData->os; // // (TODO) we should have a way to tell if the stream data is owned by this file or // by a parent multipart file. // if (_data->partNumber == -1) delete _data->_streamData; delete _data; } const char * DeepScanLineOutputFile::fileName () const { return _data->_streamData->os->fileName(); } const Header & DeepScanLineOutputFile::header () const { return _data->header; } void DeepScanLineOutputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Check if the new frame buffer descriptor // is compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) continue; if (i.channel().type != j.slice().type) { THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" is " "not compatible with the frame buffer's " "pixel type."); } if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) { THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } } // // Store the pixel sample count table. // (TODO) Support for different sampling rates? // const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); if (sampleCountSlice.base == 0) { throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); } else { _data->sampleCountSliceBase = sampleCountSlice.base; _data->sampleCountXStride = sampleCountSlice.xStride; _data->sampleCountYStride = sampleCountSlice.yStride; } // // Initialize slice table for writePixels(). // Pixel sample count slice is not presented in the header, // so it wouldn't be added here. // Store the pixel base pointer table. // (TODO) Support for different sampling rates? // vector slices; for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) { // // Channel i is not present in the frame buffer. // In the file, channel i will contain only zeroes. // slices.push_back (new OutSliceInfo (i.channel().type, NULL,// base 0,// sampleStride, 0,// xStride 0,// yStride i.channel().xSampling, i.channel().ySampling, true)); // zero } else { // // Channel i is present in the frame buffer. // slices.push_back (new OutSliceInfo (j.slice().type, j.slice().base, j.slice().sampleStride, j.slice().xStride, j.slice().yStride, j.slice().xSampling, j.slice().ySampling, false)); // zero } } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; for (size_t i = 0; i < _data->slices.size(); i++) delete _data->slices[i]; _data->slices = slices; } const DeepFrameBuffer & DeepScanLineOutputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } void DeepScanLineOutputFile::writePixels (int numScanLines) { try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data source."); // // Maintain two iterators: // nextWriteBuffer: next linebuffer to be written to the file // nextCompressBuffer: next linebuffer to compress // int first = (_data->currentScanLine - _data->minY) / _data->linesInBuffer; int nextWriteBuffer = first; int nextCompressBuffer; int stop; int step; int scanLineMin; int scanLineMax; { // // Create a task group for all line buffer tasks. When the // taskgroup goes out of scope, the destructor waits until // all tasks are complete. // TaskGroup taskGroup; // // Determine the range of lineBuffers that intersect the scan // line range. Then add the initial compression tasks to the // thread pool. We always add in at least one task but the // individual task might not do anything if numScanLines == 0. // if (_data->lineOrder == INCREASING_Y) { int last = (_data->currentScanLine + (numScanLines - 1) - _data->minY) / _data->linesInBuffer; scanLineMin = _data->currentScanLine; scanLineMax = _data->currentScanLine + numScanLines - 1; int numTasks = max (min ((int)_data->lineBuffers.size(), last - first + 1), 1); for (int i = 0; i < numTasks; i++) { ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, first + i, scanLineMin, scanLineMax)); } nextCompressBuffer = first + numTasks; stop = last + 1; step = 1; } else { int last = (_data->currentScanLine - (numScanLines - 1) - _data->minY) / _data->linesInBuffer; scanLineMax = _data->currentScanLine; scanLineMin = _data->currentScanLine - numScanLines + 1; int numTasks = max (min ((int)_data->lineBuffers.size(), first - last + 1), 1); for (int i = 0; i < numTasks; i++) { ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, first - i, scanLineMin, scanLineMax)); } nextCompressBuffer = first - numTasks; stop = last - 1; step = -1; } while (true) { if (_data->missingScanLines <= 0) { throw IEX_NAMESPACE::ArgExc ("Tried to write more scan lines " "than specified by the data window."); } // // Wait until the next line buffer is ready to be written // LineBuffer *writeBuffer = _data->getLineBuffer (nextWriteBuffer); writeBuffer->wait(); int numLines = writeBuffer->scanLineMax - writeBuffer->scanLineMin + 1; _data->missingScanLines -= numLines; // // If the line buffer is only partially full, then it is // not complete and we cannot write it to disk yet. // if (writeBuffer->partiallyFull) { _data->currentScanLine = _data->currentScanLine + step * numLines; writeBuffer->post(); return; } // // Write the line buffer // writePixelData (_data->_streamData, _data, writeBuffer); nextWriteBuffer += step; _data->currentScanLine = _data->currentScanLine + step * numLines; #ifdef DEBUG assert (_data->currentScanLine == ((_data->lineOrder == INCREASING_Y) ? writeBuffer->scanLineMax + 1: writeBuffer->scanLineMin - 1)); #endif // // Release the lock on the line buffer // writeBuffer->post(); // // If this was the last line buffer in the scanline range // if (nextWriteBuffer == stop) break; // // If there are no more line buffers to compress, // then only continue to write out remaining lineBuffers // if (nextCompressBuffer == stop) continue; // // Add nextCompressBuffer as a compression task // ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, nextCompressBuffer, scanLineMin, scanLineMax)); // // Update the next line buffer we need to compress // nextCompressBuffer += step; } // // Finish all tasks // } // // Exeption handling: // // LineBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to OutputFile::writePixels(). // LineBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the line buffers. // Now we check if any line buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple line buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { LineBuffer *lineBuffer = _data->lineBuffers[i]; if (lineBuffer->hasException && !exception) exception = &lineBuffer->exception; lineBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Failed to write pixel data to image " "file \"" << fileName() << "\". " << e.what()); throw; } } int DeepScanLineOutputFile::currentScanLine () const { Lock lock (*_data->_streamData); return _data->currentScanLine; } void DeepScanLineOutputFile::copyPixels (DeepScanLineInputPart &in) { copyPixels(*in.file); } void DeepScanLineOutputFile::copyPixels (DeepScanLineInputFile &in) { Lock lock (*_data->_streamData); // // Check if this file's and and the InputFile's // headers are compatible. // const Header &hdr = _data->header; const Header &inHdr = in.header(); if(!inHdr.hasType() || inHdr.type()!=DEEPSCANLINE) { THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\": the input needs to be a deep scanline image"); } if (!(hdr.dataWindow() == inHdr.dataWindow())) THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". " "The files have different data windows."); if (!(hdr.lineOrder() == inHdr.lineOrder())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different line orders."); if (!(hdr.compression() == inHdr.compression())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files use different compression methods."); if (!(hdr.channels() == inHdr.channels())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different channel lists."); // // Verify that no pixel data have been written to this file yet. // const Box2i &dataWindow = hdr.dataWindow(); if (_data->missingScanLines != dataWindow.max.y - dataWindow.min.y + 1) THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "\"" << fileName() << "\" already contains " "pixel data."); // // Copy the pixel data. // vector data(4096); while (_data->missingScanLines > 0) { Int64 dataSize = (Int64) data.size(); in.rawPixelData(_data->currentScanLine, &data[0], dataSize); if(dataSize > data.size()) { // block wasn't big enough - go again with enough memory this time data.resize(dataSize); in.rawPixelData(_data->currentScanLine, &data[0], dataSize); } // extract header from block to pass to writePixelData Int64 packedSampleCountSize = *(Int64 *) (&data[4]); Int64 packedDataSize = *(Int64 *) (&data[12]); Int64 unpackedDataSize = *(Int64 *) (&data[20]); const char * sampleCountTable = &data[0]+28; const char * pixelData = sampleCountTable + packedSampleCountSize; writePixelData (_data->_streamData, _data, lineBufferMinY (_data->currentScanLine, _data->minY, _data->linesInBuffer), pixelData, packedDataSize, unpackedDataSize,sampleCountTable,packedSampleCountSize); _data->currentScanLine += (_data->lineOrder == INCREASING_Y)? _data->linesInBuffer: -_data->linesInBuffer; _data->missingScanLines -= _data->linesInBuffer; } } void DeepScanLineOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { Lock lock (*_data->_streamData); if (_data->previewPosition <= 0) THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " "File \"" << fileName() << "\" does not " "contain a preview image."); // // Store the new pixels in the header's preview image attribute. // PreviewImageAttribute &pia = _data->header.typedAttribute ("preview"); PreviewImage &pi = pia.value(); PreviewRgba *pixels = pi.pixels(); int numPixels = pi.width() * pi.height(); for (int i = 0; i < numPixels; ++i) pixels[i] = newPixels[i]; // // Save the current file position, jump to the position in // the file where the preview image starts, store the new // preview image, and jump back to the saved file position. // Int64 savedPosition = _data->_streamData->os->tellp(); try { _data->_streamData->os->seekp (_data->previewPosition); pia.writeValueTo (*_data->_streamData->os, _data->version); _data->_streamData->os->seekp (savedPosition); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot update preview image pixels for " "file \"" << fileName() << "\". " << e.what()); throw; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h000066400000000000000000000232031406177042200227650ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEP_SCAN_LINE_OUTPUT_FILE_H #define INCLUDED_IMF_DEEP_SCAN_LINE_OUTPUT_FILE_H //----------------------------------------------------------------------------- // // class DeepScanLineOutputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfThreading.h" #include "ImfGenericOutputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct PreviewRgba; class DeepScanLineOutputFile : public GenericOutputFile { public: //----------------------------------------------------------- // Constructor -- opens the file and writes the file header. // The file header is also copied into the DeepScanLineOutputFile // object, and can later be accessed via the header() method. // Destroying this DeepScanLineOutputFile object automatically closes // the file. // // numThreads determines the number of threads that will be // used to write the file (see ImfThreading.h). //----------------------------------------------------------- IMF_EXPORT DeepScanLineOutputFile (const char fileName[], const Header &header, int numThreads = globalThreadCount()); //------------------------------------------------------------ // Constructor -- attaches the new DeepScanLineOutputFile object // to a file that has already been opened, and writes the file header. // The file header is also copied into the DeepScanLineOutputFile // object, and can later be accessed via the header() method. // Destroying this DeepScanLineOutputFile object does not automatically // close the file. // // numThreads determines the number of threads that will be // used to write the file (see ImfThreading.h). //------------------------------------------------------------ IMF_EXPORT DeepScanLineOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads = globalThreadCount()); //------------------------------------------------- // Destructor // // Destroying the DeepScanLineOutputFile object // before writing all scan lines within the data // window results in an incomplete file. //------------------------------------------------- IMF_EXPORT virtual ~DeepScanLineOutputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the OutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writePixels() is // called. The current frame buffer can be changed // after each call to writePixels. //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------------------------------------------------------- // Write pixel data: // // writePixels(n) retrieves the next n scan lines worth of data from // the current frame buffer, starting with the scan line indicated by // currentScanLine(), and stores the data in the output file, and // progressing in the direction indicated by header.lineOrder(). // // To produce a complete and correct file, exactly m scan lines must // be written, where m is equal to // header().dataWindow().max.y - header().dataWindow().min.y + 1. //------------------------------------------------------------------- IMF_EXPORT void writePixels (int numScanLines = 1); //------------------------------------------------------------------ // Access to the current scan line: // // currentScanLine() returns the y coordinate of the first scan line // that will be read from the current frame buffer during the next // call to writePixels(). // // If header.lineOrder() == INCREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().min.y. After writing each scan line, // the current scan line is incremented by 1. // // If header.lineOrder() == DECREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().max.y. After writing each scan line, // the current scan line is decremented by 1. // //------------------------------------------------------------------ IMF_EXPORT int currentScanLine () const; //-------------------------------------------------------------- // Shortcut to copy all pixels from an InputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the InputFile's // header: The two header's "dataWindow", "compression", // "lineOrder" and "channels" attributes must be the same. //-------------------------------------------------------------- IMF_EXPORT void copyPixels (DeepScanLineInputFile &in); // -------------------------------------------------------------- // Shortcut to copy pixels from a given part of a multipart file // -------------------------------------------------------------- IMF_EXPORT void copyPixels (DeepScanLineInputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few scan lines at a // time, while the image is being generated. Since the preview // image is an attribute in the file's header, it gets stored in // the file as soon as the file is opened, but we may not know // what the preview image should look like until we have written // the last scan line of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); struct Data; private: //------------------------------------------------------------ // Constructor -- attaches the OutputStreamMutex to the // given one from MultiPartOutputFile. Set the previewPosition // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. //------------------------------------------------------------ DeepScanLineOutputFile (const OutputPartData* part); DeepScanLineOutputFile (const DeepScanLineOutputFile &) = delete; DeepScanLineOutputFile & operator = (const DeepScanLineOutputFile &) = delete; DeepScanLineOutputFile (DeepScanLineOutputFile &&) = delete; DeepScanLineOutputFile & operator = (DeepScanLineOutputFile &&) = delete; void initialize (const Header &header); void initializeLineBuffer(); Data * _data; friend class MultiPartOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp000066400000000000000000000057651406177042200233640ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfDeepScanLineOutputPart.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER DeepScanLineOutputPart::DeepScanLineOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) { file = multiPartFile.getOutputPart(partNumber); } const char * DeepScanLineOutputPart::fileName () const { return file->fileName(); } const Header & DeepScanLineOutputPart::header () const { return file->header(); } void DeepScanLineOutputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const DeepFrameBuffer & DeepScanLineOutputPart::frameBuffer () const { return file->frameBuffer(); } void DeepScanLineOutputPart::writePixels (int numScanLines) { file->writePixels(numScanLines); } int DeepScanLineOutputPart::currentScanLine () const { return file->currentScanLine(); } void DeepScanLineOutputPart::copyPixels (DeepScanLineInputFile &in) { file->copyPixels(in); } void DeepScanLineOutputPart::copyPixels (DeepScanLineInputPart &in) { file->copyPixels(in); } void DeepScanLineOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) { file->updatePreviewImage(newPixels); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h000066400000000000000000000150551406177042200230220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFDEEPSCANLINEOUTPUTPART_H_ #define IMFDEEPSCANLINEOUTPUTPART_H_ #include "ImfDeepScanLineOutputFile.h" #include "ImfMultiPartOutputFile.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepScanLineOutputPart { public: IMF_EXPORT DeepScanLineOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the OutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writePixels() is // called. The current frame buffer can be changed // after each call to writePixels. //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------------------------------------------------------- // Write pixel data: // // writePixels(n) retrieves the next n scan lines worth of data from // the current frame buffer, starting with the scan line indicated by // currentScanLine(), and stores the data in the output file, and // progressing in the direction indicated by header.lineOrder(). // // To produce a complete and correct file, exactly m scan lines must // be written, where m is equal to // header().dataWindow().max.y - header().dataWindow().min.y + 1. //------------------------------------------------------------------- IMF_EXPORT void writePixels (int numScanLines = 1); //------------------------------------------------------------------ // Access to the current scan line: // // currentScanLine() returns the y coordinate of the first scan line // that will be read from the current frame buffer during the next // call to writePixels(). // // If header.lineOrder() == INCREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().min.y. After writing each scan line, // the current scan line is incremented by 1. // // If header.lineOrder() == DECREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().max.y. After writing each scan line, // the current scan line is decremented by 1. // //------------------------------------------------------------------ IMF_EXPORT int currentScanLine () const; //-------------------------------------------------------------- // Shortcut to copy all pixels from an InputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the InputFile's // header: The two header's "dataWindow", "compression", // "lineOrder" and "channels" attributes must be the same. //-------------------------------------------------------------- IMF_EXPORT void copyPixels (DeepScanLineInputFile &in); IMF_EXPORT void copyPixels (DeepScanLineInputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few scan lines at a // time, while the image is being generated. Since the preview // image is an attribute in the file's header, it gets stored in // the file as soon as the file is opened, but we may not know // what the preview image should look like until we have written // the last scan line of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); private: DeepScanLineOutputFile* file; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFDEEPSCANLINEOUTPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp000066400000000000000000001677371406177042200225110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DeepTiledInputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "ImathBox.h" #include #include #include #include #include #include #include #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "ImfInputStreamMutex.h" #include "ImfInputPartData.h" #include "ImathVec.h" #include "Iex.h" #include #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using std::string; using std::vector; using std::min; using std::max; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct TInSliceInfo { PixelType typeInFrameBuffer; PixelType typeInFile; char* pointerArrayBase; size_t xStride; size_t yStride; ptrdiff_t sampleStride; bool fill; bool skip; double fillValue; int xTileCoords; int yTileCoords; TInSliceInfo (PixelType typeInFrameBuffer = HALF, char * base = NULL, PixelType typeInFile = HALF, size_t xStride = 0, size_t yStride = 0, ptrdiff_t sampleStride = 0, bool fill = false, bool skip = false, double fillValue = 0.0, int xTileCoords = 0, int yTileCoords = 0); }; TInSliceInfo::TInSliceInfo (PixelType tifb, char * b, PixelType tifl, size_t xs, size_t ys, ptrdiff_t spst, bool f, bool s, double fv, int xtc, int ytc) : typeInFrameBuffer (tifb), typeInFile (tifl), pointerArrayBase (b), xStride (xs), yStride (ys), sampleStride (spst), fill (f), skip (s), fillValue (fv), xTileCoords (xtc), yTileCoords (ytc) { // empty } struct TileBuffer { Array2D sampleCount; const char * uncompressedData; char * buffer; Int64 dataSize; Int64 uncompressedDataSize; Compressor * compressor; Compressor::Format format; int dx; int dy; int lx; int ly; bool hasException; string exception; TileBuffer (); ~TileBuffer (); inline void wait () {_sem.wait();} inline void post () {_sem.post();} protected: Semaphore _sem; }; TileBuffer::TileBuffer (): uncompressedData (0), buffer (0), dataSize (0), compressor (0), format (defaultFormat (compressor)), dx (-1), dy (-1), lx (-1), ly (-1), hasException (false), exception (), _sem (1) { // empty } TileBuffer::~TileBuffer () { delete compressor; } } // namespace class MultiPartInputFile; // // struct TiledInputFile::Data stores things that will be // needed between calls to readTile() // struct DeepTiledInputFile::Data: public Mutex { Header header; // the image header TileDescription tileDesc; // describes the tile layout int version; // file's version DeepFrameBuffer frameBuffer; // framebuffer to write into LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord int numXLevels; // number of x levels int numYLevels; // number of y levels int * numXTiles; // number of x tiles at a level int * numYTiles; // number of y tiles at a level TileOffsets tileOffsets; // stores offsets in file for // each tile bool fileIsComplete; // True if no tiles are missing // in the file vector slices; // info about channels in file // ourselves? or does someone // else do it? int partNumber; // part number bool multiPartBackwardSupport; // if we are reading a multipart file // using OpenEXR 1.7 API int numThreads; // number of threads MultiPartInputFile* multiPartFile; // the MultiPartInputFile used to // support backward compatibility vector tileBuffers; // each holds a single tile bool memoryMapped; // if the stream is memory mapped char* sampleCountSliceBase; // pointer to the start of // the sample count array ptrdiff_t sampleCountXStride; // x stride of the sample count array ptrdiff_t sampleCountYStride; // y stride of the sample count array int sampleCountXTileCoords; // the value of xTileCoords from the // sample count slice int sampleCountYTileCoords; // the value of yTileCoords from the // sample count slice Array sampleCountTableBuffer; // the buffer for sample count table Compressor* sampleCountTableComp; // the decompressor for sample count table Int64 maxSampleCountTableSize; // the max size in bytes for a pixel // sample count table int combinedSampleSize; // total size of all channels combined to check sampletable size InputStreamMutex * _streamData; bool _deleteStream; // should we delete the stream Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline TileBuffer * getTileBuffer (int number); // hash function from tile indices // into our vector of tile buffers int& getSampleCount(int x, int y); // get the number of samples // in each pixel }; DeepTiledInputFile::Data::Data (int numThreads): numXTiles (0), numYTiles (0), partNumber (-1), multiPartBackwardSupport(false), numThreads(numThreads), memoryMapped(false), sampleCountTableComp(nullptr), _streamData(nullptr), _deleteStream(false) { // // We need at least one tileBuffer, but if threading is used, // to keep n threads busy we need 2*n tileBuffers // tileBuffers.resize (max (1, 2 * numThreads)); } DeepTiledInputFile::Data::~Data () { delete [] numXTiles; delete [] numYTiles; for (size_t i = 0; i < tileBuffers.size(); i++) delete tileBuffers[i]; if (multiPartBackwardSupport) delete multiPartFile; for (size_t i = 0; i < slices.size(); i++) delete slices[i]; delete sampleCountTableComp; } TileBuffer* DeepTiledInputFile::Data::getTileBuffer (int number) { return tileBuffers[number % tileBuffers.size()]; } int& DeepTiledInputFile::Data::getSampleCount(int x, int y) { return sampleCount(sampleCountSliceBase, sampleCountXStride, sampleCountYStride, x, y); } namespace { void readTileData (InputStreamMutex *streamData, DeepTiledInputFile::Data *ifd, int dx, int dy, int lx, int ly, char *&buffer, Int64 &dataSize, Int64 &unpackedDataSize) { // // Read a single tile block from the file and into the array pointed // to by buffer. If the file is memory-mapped, then we change where // buffer points instead of writing into the array (hence buffer needs // to be a reference to a char *). // // // Look up the location for this tile in the Index and // seek to that position if necessary // Int64 tileOffset = ifd->tileOffsets (dx, dy, lx, ly); if (tileOffset == 0) { THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << lx << ", " << ly << ") is missing."); } // // In a multi-part file, the next chunk does not need to // belong to the same part, so we have to compare the // offset here. // if ( !isMultiPart(ifd->version) ) { if (streamData->currentPosition != tileOffset) streamData->is->seekg(tileOffset); } else { // // In a multi-part file, the file pointer may be moved by other // parts, so we have to ask tellg() where we are. // if (streamData->is->tellg() != tileOffset) streamData->is->seekg (tileOffset); } // // Read the first few bytes of the tile (the header). // Verify that the tile coordinates and the level number // are correct. // int tileXCoord, tileYCoord, levelX, levelY; if (isMultiPart(ifd->version)) { int partNumber; Xdr::read (*streamData->is, partNumber); if (partNumber != ifd->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << ifd->partNumber << "."); } } Xdr::read (*streamData->is, tileXCoord); Xdr::read (*streamData->is, tileYCoord); Xdr::read (*streamData->is, levelX); Xdr::read (*streamData->is, levelY); Int64 tableSize; Xdr::read (*streamData->is, tableSize); Xdr::read (*streamData->is, dataSize); Xdr::read (*streamData->is, unpackedDataSize); // // Skip the pixel sample count table because we have read this data. // Xdr::skip (*streamData->is, tableSize); if (tileXCoord != dx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); if (tileYCoord != dy) throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); if (levelX != lx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); if (levelY != ly) throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); // // Read the pixel data. // if (streamData->is->isMemoryMapped ()) buffer = streamData->is->readMemoryMapped (dataSize); else { // (TODO) check if the packed data size is too big? // (TODO) better memory management here. Don't delete buffer everytime. if (buffer != 0) delete[] buffer; buffer = new char[dataSize]; streamData->is->read (buffer, dataSize); } // // Keep track of which tile is the next one in // the file, so that we can avoid redundant seekg() // operations (seekg() can be fairly expensive). // streamData->currentPosition = tileOffset + 4 * Xdr::size() + 3 * Xdr::size() + tableSize + dataSize; } // // A TileBufferTask encapsulates the task of uncompressing // a single tile and copying it into the frame buffer. // class TileBufferTask : public Task { public: TileBufferTask (TaskGroup *group, DeepTiledInputFile::Data *ifd, TileBuffer *tileBuffer); virtual ~TileBufferTask (); virtual void execute (); private: DeepTiledInputFile::Data * _ifd; TileBuffer * _tileBuffer; }; TileBufferTask::TileBufferTask (TaskGroup *group, DeepTiledInputFile::Data *ifd, TileBuffer *tileBuffer) : Task (group), _ifd (ifd), _tileBuffer (tileBuffer) { // empty } TileBufferTask::~TileBufferTask () { // // Signal that the tile buffer is now free // _tileBuffer->post (); } void TileBufferTask::execute () { try { // // Calculate information about the tile // Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _ifd->tileDesc, _ifd->minX, _ifd->maxX, _ifd->minY, _ifd->maxY, _tileBuffer->dx, _tileBuffer->dy, _tileBuffer->lx, _tileBuffer->ly); // // Get the size of the tile. // Array numPixelsPerScanLine; numPixelsPerScanLine.resizeErase(tileRange.max.y - tileRange.min.y + 1); int sizeOfTile = 0; int maxBytesPerTileLine = 0; for (int y = tileRange.min.y; y <= tileRange.max.y; y++) { numPixelsPerScanLine[y - tileRange.min.y] = 0; int bytesPerLine = 0; for (int x = tileRange.min.x; x <= tileRange.max.x; x++) { int xOffset = _ifd->sampleCountXTileCoords * tileRange.min.x; int yOffset = _ifd->sampleCountYTileCoords * tileRange.min.y; int count = _ifd->getSampleCount(x - xOffset, y - yOffset); for (unsigned int c = 0; c < _ifd->slices.size(); ++c) { // This slice does not exist in the file. if ( !_ifd->slices[c]->fill) { sizeOfTile += count * pixelTypeSize(_ifd->slices[c]->typeInFile); bytesPerLine += count * pixelTypeSize(_ifd->slices[c]->typeInFile); } } numPixelsPerScanLine[y - tileRange.min.y] += count; } if (bytesPerLine > maxBytesPerTileLine) maxBytesPerTileLine = bytesPerLine; } // (TODO) don't do this every time. if (_tileBuffer->compressor != 0) delete _tileBuffer->compressor; _tileBuffer->compressor = newTileCompressor (_ifd->header.compression(), maxBytesPerTileLine, _ifd->tileDesc.ySize, _ifd->header); // // Uncompress the data, if necessary // if (_tileBuffer->compressor && _tileBuffer->dataSize < static_cast(sizeOfTile)) { _tileBuffer->format = _tileBuffer->compressor->format(); _tileBuffer->dataSize = _tileBuffer->compressor->uncompressTile (_tileBuffer->buffer, _tileBuffer->dataSize, tileRange, _tileBuffer->uncompressedData); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // _tileBuffer->format = Compressor::XDR; _tileBuffer->uncompressedData = _tileBuffer->buffer; } // // sanity check data size: the uncompressed data should be exactly // 'sizeOfTile' (if it's less, the file is corrupt and there'll be a buffer overrun) // if (_tileBuffer->dataSize != static_cast(sizeOfTile)) { THROW (IEX_NAMESPACE::InputExc, "size mismatch when reading deep tile: expected " << sizeOfTile << "bytes of uncompressed data but got " << _tileBuffer->dataSize); } // // Convert the tile of pixel data back from the machine-independent // representation, and store the result in the frame buffer. // const char *readPtr = _tileBuffer->uncompressedData; // points to where we // read from in the // tile block // // Iterate over the scan lines in the tile. // for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) { // // Iterate over all image channels. // for (unsigned int i = 0; i < _ifd->slices.size(); ++i) { TInSliceInfo &slice = *_ifd->slices[i]; // // These offsets are used to facilitate both // absolute and tile-relative pixel coordinates. // int xOffsetForData = (slice.xTileCoords == 0) ? 0 : tileRange.min.x; int yOffsetForData = (slice.yTileCoords == 0) ? 0 : tileRange.min.y; int xOffsetForSampleCount = (_ifd->sampleCountXTileCoords == 0) ? 0 : tileRange.min.x; int yOffsetForSampleCount = (_ifd->sampleCountYTileCoords == 0) ? 0 : tileRange.min.y; // // Fill the frame buffer with pixel data. // if (slice.skip) { // // The file contains data for this channel, but // the frame buffer contains no slice for this channel. // skipChannel (readPtr, slice.typeInFile, numPixelsPerScanLine[y - tileRange.min.y]); } else { // // The frame buffer contains a slice for this channel. // copyIntoDeepFrameBuffer (readPtr, slice.pointerArrayBase, _ifd->sampleCountSliceBase, _ifd->sampleCountXStride, _ifd->sampleCountYStride, y, tileRange.min.x, tileRange.max.x, xOffsetForSampleCount, yOffsetForSampleCount, xOffsetForData, yOffsetForData, slice.sampleStride, slice.xStride, slice.yStride, slice.fill, slice.fillValue, _tileBuffer->format, slice.typeInFrameBuffer, slice.typeInFile); } } } } catch (std::exception &e) { if (!_tileBuffer->hasException) { _tileBuffer->exception = e.what (); _tileBuffer->hasException = true; } } catch (...) { if (!_tileBuffer->hasException) { _tileBuffer->exception = "unrecognized exception"; _tileBuffer->hasException = true; } } } TileBufferTask * newTileBufferTask (TaskGroup *group, DeepTiledInputFile::Data *ifd, int number, int dx, int dy, int lx, int ly) { // // Wait for a tile buffer to become available, // fill the buffer with raw data from the file, // and create a new TileBufferTask whose execute() // method will uncompress the tile and copy the // tile's pixels into the frame buffer. // TileBuffer *tileBuffer = ifd->getTileBuffer (number); try { tileBuffer->wait(); tileBuffer->dx = dx; tileBuffer->dy = dy; tileBuffer->lx = lx; tileBuffer->ly = ly; tileBuffer->uncompressedData = 0; readTileData (ifd->_streamData, ifd, dx, dy, lx, ly, tileBuffer->buffer, tileBuffer->dataSize, tileBuffer->uncompressedDataSize); } catch (...) { // // Reading from the file caused an exception. // Signal that the tile buffer is free, and // re-throw the exception. // tileBuffer->post(); throw; } return new TileBufferTask (group, ifd, tileBuffer); } } // namespace DeepTiledInputFile::DeepTiledInputFile (const char fileName[], int numThreads): _data (new Data (numThreads)) { _data->_deleteStream=true; // // This constructor is called when a user // explicitly wants to read a tiled file. // IStream* is = 0; try { is = new StdIFStream (fileName); readMagicNumberAndVersionField(*is, _data->version); // // Compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(*is); } else { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = is; _data->header.readFrom (*_data->_streamData->is, _data->version); initialize(); _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,true); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } } catch (IEX_NAMESPACE::BaseExc &e) { if (is) delete is; if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { if (is) delete is; if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; throw; } } DeepTiledInputFile::DeepTiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _data (new Data (numThreads)) { _data->_streamData=0; _data->_deleteStream=false; // // This constructor is called when a user // explicitly wants to read a tiled file. // try { readMagicNumberAndVersionField(is, _data->version); // // Backward compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(is); } else { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = &is; _data->header.readFrom (*_data->_streamData->is, _data->version); initialize(); // file is guaranteed not to be multipart, but is deep _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete, false,true); _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } } catch (IEX_NAMESPACE::BaseExc &e) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << is.fileName() << "\". " << e.what()); throw; } catch (...) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; throw; } } DeepTiledInputFile::DeepTiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads) : _data (new Data (numThreads)) { _data->_streamData->is = is; _data->_deleteStream=false; // // This constructor called by class Imf::InputFile // when a user wants to just read an image file, and // doesn't care or know if the file is tiled. // No need to have backward compatibility here, because // we have the header. // _data->header = header; _data->version = version; initialize(); _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,true); _data->memoryMapped = is->isMemoryMapped(); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } DeepTiledInputFile::DeepTiledInputFile (InputPartData* part) : _data (new Data (part->numThreads)) { _data->_deleteStream=false; try { multiPartInitialize(part); } catch(...) { delete _data; throw; } } void DeepTiledInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) { is.seekg(0); // // Construct a MultiPartInputFile, initialize TiledInputFile // with the part 0 data. // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. // _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); _data->multiPartBackwardSupport = true; InputPartData* part = _data->multiPartFile->getPart(0); multiPartInitialize(part); } void DeepTiledInputFile::multiPartInitialize(InputPartData* part) { if (part->header.type() != DEEPTILE) THROW (IEX_NAMESPACE::ArgExc, "Can't build a DeepTiledInputFile from a part of type " << part->header.type()); _data->_streamData = part->mutex; _data->header = part->header; _data->version = part->version; _data->partNumber = part->partNumber; _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); initialize(); _data->tileOffsets.readFrom(part->chunkOffsets , _data->fileIsComplete); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } void DeepTiledInputFile::initialize () { if (_data->partNumber == -1) if (_data->header.type() != DEEPTILE) throw IEX_NAMESPACE::ArgExc ("Expected a deep tiled file but the file is not deep tiled."); if(_data->header.version()!=1) { THROW(IEX_NAMESPACE::ArgExc, "Version " << _data->header.version() << " not supported for deeptiled images in this version of the library"); } _data->header.sanityCheck (true); _data->tileDesc = _data->header.tileDescription(); _data->lineOrder = _data->header.lineOrder(); // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; // // Precompute level and tile information to speed up utility functions // precalculateTileInfo (_data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, _data->numXTiles, _data->numYTiles, _data->numXLevels, _data->numYLevels); // // Create all the TileBuffers and allocate their internal buffers // _data->tileOffsets = TileOffsets (_data->tileDesc.mode, _data->numXLevels, _data->numYLevels, _data->numXTiles, _data->numYTiles); for (size_t i = 0; i < _data->tileBuffers.size(); i++) _data->tileBuffers[i] = new TileBuffer (); _data->maxSampleCountTableSize = static_cast(_data->tileDesc.ySize) * static_cast(_data->tileDesc.xSize) * sizeof(int); _data->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); _data->sampleCountTableComp = newCompressor(_data->header.compression(), _data->maxSampleCountTableSize, _data->header); const ChannelList & c=_data->header.channels(); _data->combinedSampleSize=0; for(ChannelList::ConstIterator i=c.begin();i!=c.end();i++) { switch( i.channel().type ) { case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : _data->combinedSampleSize+=Xdr::size(); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : _data->combinedSampleSize+=Xdr::size(); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : _data->combinedSampleSize+=Xdr::size(); break; default : THROW(IEX_NAMESPACE::ArgExc, "Bad type for channel " << i.name() << " initializing deepscanline reader"); } } } DeepTiledInputFile::~DeepTiledInputFile () { if (!_data->memoryMapped) for (size_t i = 0; i < _data->tileBuffers.size(); i++) if (_data->tileBuffers[i]->buffer != 0) delete [] _data->tileBuffers[i]->buffer; if (_data->_deleteStream) delete _data->_streamData->is; // // (TODO) we should have a way to tell if the stream data is owned by this file or // by a parent multipart file. // if (_data->partNumber == -1) delete _data->_streamData; delete _data; } const char * DeepTiledInputFile::fileName () const { return _data->_streamData->is->fileName(); } const Header & DeepTiledInputFile::header () const { return _data->header; } int DeepTiledInputFile::version () const { return _data->version; } void DeepTiledInputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Set the frame buffer // // // Check if the new frame buffer descriptor is // compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { ChannelList::ConstIterator i = channels.find (j.name()); if (i == channels.end()) continue; if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of input file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } // // Store the pixel sample count table. // (TODO) Support for different sampling rates? // const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); if (sampleCountSlice.base == 0) { throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); } else { _data->sampleCountSliceBase = sampleCountSlice.base; _data->sampleCountXStride = sampleCountSlice.xStride; _data->sampleCountYStride = sampleCountSlice.yStride; _data->sampleCountXTileCoords = sampleCountSlice.xTileCoords; _data->sampleCountYTileCoords = sampleCountSlice.yTileCoords; } // // Initialize the slice table for readPixels(). // vector slices; ChannelList::ConstIterator i = channels.begin(); for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { while (i != channels.end() && strcmp (i.name(), j.name()) < 0) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (new TInSliceInfo (i.channel().type, NULL, i.channel().type, 0, // xStride 0, // yStride 0, // sampleStride false, // fill true, // skip 0.0)); // fillValue ++i; } bool fill = false; if (i == channels.end() || strcmp (i.name(), j.name()) > 0) { // // Channel i is present in the frame buffer, but not in the file. // In the frame buffer, slice j will be filled with a default value. // fill = true; } slices.push_back (new TInSliceInfo (j.slice().type, j.slice().base, fill? j.slice().type: i.channel().type, j.slice().xStride, j.slice().yStride, j.slice().sampleStride, fill, false, // skip j.slice().fillValue, (j.slice().xTileCoords)? 1: 0, (j.slice().yTileCoords)? 1: 0)); if (i != channels.end() && !fill) ++i; } // (TODO) inspect the following code. It's additional to the scanline input file. // Is this needed? while (i != channels.end()) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (new TInSliceInfo (i.channel().type, NULL, i.channel().type, 0, // xStride 0, // yStride 0, // sampleStride false, // fill true, // skip 0.0)); // fillValue ++i; } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; for (size_t i = 0; i < _data->slices.size(); i++) delete _data->slices[i]; _data->slices = slices; } const DeepFrameBuffer & DeepTiledInputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } bool DeepTiledInputFile::isComplete () const { return _data->fileIsComplete; } void DeepTiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { // // Read a range of tiles from the file into the framebuffer // try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data destination."); if (!isValidLevel (lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Level coordinate " "(" << lx << ", " << ly << ") " "is invalid."); // // Determine the first and last tile coordinates in both dimensions. // We always attempt to read the range of tiles in the order that // they are stored in the file. // if (dx1 > dx2) std::swap (dx1, dx2); if (dy1 > dy2) std::swap (dy1, dy2); int dyStart = dy1; int dyStop = dy2 + 1; int dY = 1; if (_data->lineOrder == DECREASING_Y) { dyStart = dy2; dyStop = dy1 - 1; dY = -1; } // // Create a task group for all tile buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; int tileNumber = 0; for (int dy = dyStart; dy != dyStop; dy += dY) { for (int dx = dx1; dx <= dx2; dx++) { if (!isValidTile (dx, dy, lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Tile (" << dx << ", " << dy << ", " << lx << "," << ly << ") is not a valid tile."); ThreadPool::addGlobalTask (newTileBufferTask (&taskGroup, _data, tileNumber++, dx, dy, lx, ly)); } } // // finish all tasks // } // // Exeption handling: // // TileBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to TiledInputFile::readTiles(). // TileBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the tile buffers. // Now we check if any tile buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple tile buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->tileBuffers.size(); ++i) { TileBuffer *tileBuffer = _data->tileBuffers[i]; if (tileBuffer->hasException && !exception) exception = &tileBuffer->exception; tileBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void DeepTiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int l) { readTiles (dx1, dx2, dy1, dy2, l, l); } void DeepTiledInputFile::readTile (int dx, int dy, int lx, int ly) { readTiles (dx, dx, dy, dy, lx, ly); } void DeepTiledInputFile::readTile (int dx, int dy, int l) { readTile (dx, dy, l, l); } void DeepTiledInputFile::rawTileData (int &dx, int &dy, int &lx, int &ly, char * pixelData, Int64 &pixelDataSize) const { if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Tried to read a tile outside " "the image file's data window."); Int64 tileOffset = _data->tileOffsets (dx, dy, lx, ly); if(tileOffset == 0) { THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << lx << ", " << ly << ") is missing."); } Lock lock(*_data->_streamData); if (_data->_streamData->is->tellg() != tileOffset) _data->_streamData->is->seekg (tileOffset); // // Read the first few bytes of the tile (the header). // Verify that the tile coordinates and the level number // are correct. // int tileXCoord, tileYCoord, levelX, levelY; if (isMultiPart(_data->version)) { int partNumber; Xdr::read (*_data->_streamData->is, partNumber); if (partNumber != _data->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << _data->partNumber << "."); } } Xdr::read (*_data->_streamData->is, tileXCoord); Xdr::read (*_data->_streamData->is, tileYCoord); Xdr::read (*_data->_streamData->is, levelX); Xdr::read (*_data->_streamData->is, levelY); Int64 sampleCountTableSize; Int64 packedDataSize; Xdr::read (*_data->_streamData->is, sampleCountTableSize); Xdr::read (*_data->_streamData->is, packedDataSize); if (tileXCoord != dx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); if (tileYCoord != dy) throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); if (levelX != lx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); if (levelY != ly) throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); // total requirement for reading all the data Int64 totalSizeRequired=40+sampleCountTableSize+packedDataSize; bool big_enough = totalSizeRequired<=pixelDataSize; pixelDataSize = totalSizeRequired; // was the block we were given big enough? if(!big_enough || pixelData==NULL) { // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek // in single part files) if(!isMultiPart(_data->version)) { _data->_streamData->is->seekg(_data->_streamData->currentPosition); } // leave lock here - bail before reading more data return; } // copy the values we have read into the output block *(int *) (pixelData+0) = dx; *(int *) (pixelData+4) = dy; *(int *) (pixelData+8) = levelX; *(int *) (pixelData+12) = levelY; *(Int64 *) (pixelData+16) =sampleCountTableSize; *(Int64 *) (pixelData+24) = packedDataSize; // didn't read the unpackedsize - do that now Xdr::read (*_data->_streamData->is, *(Int64 *) (pixelData+32)); // read the actual data _data->_streamData->is->read(pixelData+40, sampleCountTableSize+packedDataSize); if(!isMultiPart(_data->version)) { _data->_streamData->currentPosition+=sampleCountTableSize+packedDataSize+40; } // leave lock here } unsigned int DeepTiledInputFile::tileXSize () const { return _data->tileDesc.xSize; } unsigned int DeepTiledInputFile::tileYSize () const { return _data->tileDesc.ySize; } LevelMode DeepTiledInputFile::levelMode () const { return _data->tileDesc.mode; } LevelRoundingMode DeepTiledInputFile::levelRoundingMode () const { return _data->tileDesc.roundingMode; } int DeepTiledInputFile::numLevels () const { if (levelMode() == RIPMAP_LEVELS) THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " "file \"" << fileName() << "\" " "(numLevels() is not defined for files " "with RIPMAP level mode)."); return _data->numXLevels; } int DeepTiledInputFile::numXLevels () const { return _data->numXLevels; } int DeepTiledInputFile::numYLevels () const { return _data->numYLevels; } bool DeepTiledInputFile::isValidLevel (int lx, int ly) const { if (lx < 0 || ly < 0) return false; if (levelMode() == MIPMAP_LEVELS && lx != ly) return false; if (lx >= numXLevels() || ly >= numYLevels()) return false; return true; } int DeepTiledInputFile::levelWidth (int lx) const { try { return levelSize (_data->minX, _data->maxX, lx, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelWidth() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int DeepTiledInputFile::levelHeight (int ly) const { try { return levelSize (_data->minY, _data->maxY, ly, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelHeight() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int DeepTiledInputFile::numXTiles (int lx) const { if (lx < 0 || lx >= _data->numXLevels) { THROW (IEX_NAMESPACE::ArgExc, "Error calling numXTiles() on image " "file \"" << _data->_streamData->is->fileName() << "\" " "(Argument is not in valid range)."); } return _data->numXTiles[lx]; } int DeepTiledInputFile::numYTiles (int ly) const { if (ly < 0 || ly >= _data->numYLevels) { THROW (IEX_NAMESPACE::ArgExc, "Error calling numYTiles() on image " "file \"" << _data->_streamData->is->fileName() << "\" " "(Argument is not in valid range)."); } return _data->numYTiles[ly]; } Box2i DeepTiledInputFile::dataWindowForLevel (int l) const { return dataWindowForLevel (l, l); } Box2i DeepTiledInputFile::dataWindowForLevel (int lx, int ly) const { try { return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } Box2i DeepTiledInputFile::dataWindowForTile (int dx, int dy, int l) const { return dataWindowForTile (dx, dy, l, l); } Box2i DeepTiledInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { try { if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, dx, dy, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForTile() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } bool DeepTiledInputFile::isValidTile (int dx, int dy, int lx, int ly) const { return ((lx < _data->numXLevels && lx >= 0) && (ly < _data->numYLevels && ly >= 0) && (dx < _data->numXTiles[lx] && dx >= 0) && (dy < _data->numYTiles[ly] && dy >= 0)); } void DeepTiledInputFile::readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { Int64 savedFilePos = 0; try { Lock lock (*_data->_streamData); savedFilePos = _data->_streamData->is->tellg(); if (!isValidLevel (lx, ly)) { THROW (IEX_NAMESPACE::ArgExc, "Level coordinate " "(" << lx << ", " << ly << ") " "is invalid."); } if (dx1 > dx2) std::swap (dx1, dx2); if (dy1 > dy2) std::swap (dy1, dy2); int dyStart = dy1; int dyStop = dy2 + 1; int dY = 1; if (_data->lineOrder == DECREASING_Y) { dyStart = dy2; dyStop = dy1 - 1; dY = -1; } // (TODO) Check if we have read the sample counts for those tiles, // if we have, no need to read again. for (int dy = dyStart; dy != dyStop; dy += dY) { for (int dx = dx1; dx <= dx2; dx++) { if (!isValidTile (dx, dy, lx, ly)) { THROW (IEX_NAMESPACE::ArgExc, "Tile (" << dx << ", " << dy << ", " << lx << "," << ly << ") is not a valid tile."); } Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, dx, dy, lx, ly); int xOffset = _data->sampleCountXTileCoords * tileRange.min.x; int yOffset = _data->sampleCountYTileCoords * tileRange.min.y; // // Skip and check the tile coordinates. // _data->_streamData->is->seekg(_data->tileOffsets(dx, dy, lx, ly)); if (isMultiPart(_data->version)) { int partNumber; Xdr::read (*_data->_streamData->is, partNumber); if (partNumber != _data->partNumber) throw IEX_NAMESPACE::InputExc ("Unexpected part number."); } int xInFile, yInFile, lxInFile, lyInFile; Xdr::read (*_data->_streamData->is, xInFile); Xdr::read (*_data->_streamData->is, yInFile); Xdr::read (*_data->_streamData->is, lxInFile); Xdr::read (*_data->_streamData->is, lyInFile); if (xInFile != dx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); if (yInFile != dy) throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); if (lxInFile != lx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); if (lyInFile != ly) throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); Int64 tableSize, dataSize, unpackedDataSize; Xdr::read (*_data->_streamData->is, tableSize); Xdr::read (*_data->_streamData->is, dataSize); Xdr::read (*_data->_streamData->is, unpackedDataSize); if(tableSize>_data->maxSampleCountTableSize) { THROW (IEX_NAMESPACE::ArgExc, "Bad sampleCountTableDataSize read from tile "<< dx << ',' << dy << ',' << lx << ',' << ly << ": expected " << _data->maxSampleCountTableSize << " or less, got "<< tableSize); } // // We make a check on the data size requirements here. // Whilst we wish to store 64bit sizes on disk, not all the compressors // have been made to work with such data sizes and are still limited to // using signed 32 bit (int) for the data size. As such, this version // insists that we validate that the data size does not exceed the data // type max limit. // @TODO refactor the compressor code to ensure full 64-bit support. // Int64 compressorMaxDataSize = static_cast(std::numeric_limits::max()); if (dataSize > compressorMaxDataSize || unpackedDataSize > compressorMaxDataSize || tableSize > compressorMaxDataSize) { THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not" << "support the allocation of data with size > " << compressorMaxDataSize << " file table size :" << tableSize << " file unpacked size :" << unpackedDataSize << " file packed size :" << dataSize << ".\n"); } // // Read and uncompress the pixel sample count table. // _data->_streamData->is->read(_data->sampleCountTableBuffer, tableSize); const char* readPtr; if (tableSize < _data->maxSampleCountTableSize) { if(!_data->sampleCountTableComp) { THROW(IEX_NAMESPACE::ArgExc,"Deep scanline data corrupt at tile " << dx << ',' << dy << ',' << lx << ',' << ly << " (sampleCountTableDataSize error)"); } _data->sampleCountTableComp->uncompress(_data->sampleCountTableBuffer, tableSize, tileRange.min.y, readPtr); } else readPtr = _data->sampleCountTableBuffer; size_t cumulative_total_samples =0; int lastAccumulatedCount; for (int j = tileRange.min.y; j <= tileRange.max.y; j++) { lastAccumulatedCount = 0; for (int i = tileRange.min.x; i <= tileRange.max.x; i++) { int accumulatedCount; Xdr::read (readPtr, accumulatedCount); if (accumulatedCount < lastAccumulatedCount) { THROW(IEX_NAMESPACE::ArgExc,"Deep tile sampleCount data corrupt at tile " << dx << ',' << dy << ',' << lx << ',' << ly << " (negative sample count detected)"); } int count = accumulatedCount - lastAccumulatedCount; lastAccumulatedCount = accumulatedCount; _data->getSampleCount(i - xOffset, j - yOffset) =count; } cumulative_total_samples += lastAccumulatedCount; } if(cumulative_total_samples * _data->combinedSampleSize > unpackedDataSize) { THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at tile " << dx << ',' << dy << ',' << lx << ',' << ly << ": pixel data only contains " << unpackedDataSize << " bytes of data but table references at least " << cumulative_total_samples*_data->combinedSampleSize << " bytes of sample data" ); } } } _data->_streamData->is->seekg(savedFilePos); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading sample count data from image " "file \"" << fileName() << "\". " << e.what()); _data->_streamData->is->seekg(savedFilePos); throw; } } void DeepTiledInputFile::readPixelSampleCount (int dx, int dy, int l) { readPixelSampleCount (dx, dy, l, l); } void DeepTiledInputFile::readPixelSampleCount (int dx, int dy, int lx, int ly) { readPixelSampleCounts (dx, dx, dy, dy, lx, ly); } void DeepTiledInputFile::readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int l) { readPixelSampleCounts (dx1, dx2, dy1, dy2, l, l); } size_t DeepTiledInputFile::totalTiles() const { // // Calculate the total number of tiles in the file // int numAllTiles = 0; switch (levelMode ()) { case ONE_LEVEL: case MIPMAP_LEVELS: for (int i_l = 0; i_l < numLevels (); ++i_l) numAllTiles += numXTiles (i_l) * numYTiles (i_l); break; case RIPMAP_LEVELS: for (int i_ly = 0; i_ly < numYLevels (); ++i_ly) for (int i_lx = 0; i_lx < numXLevels (); ++i_lx) numAllTiles += numXTiles (i_lx) * numYTiles (i_ly); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } return numAllTiles; } void DeepTiledInputFile::getTileOrder(int dx[],int dy[],int lx[],int ly[]) const { return _data->tileOffsets.getTileOrder(dx,dy,lx,ly); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledInputFile.h000066400000000000000000000412661406177042200221420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEP_TILED_INPUT_FILE_H #define INCLUDED_IMF_DEEP_TILED_INPUT_FILE_H //----------------------------------------------------------------------------- // // class DeepTiledInputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImathBox.h" #include "ImfTileDescription.h" #include "ImfThreading.h" #include "ImfGenericInputFile.h" #include "ImfDeepFrameBuffer.h" #include "ImfDeepTiledOutputFile.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepTiledInputFile : public GenericInputFile { public: //-------------------------------------------------------------------- // A constructor that opens the file with the specified name, and // reads the file header. The constructor throws an IEX_NAMESPACE::ArgExc // exception if the file is not tiled. // The numThreads parameter specifies how many worker threads this // file will try to keep busy when decompressing individual tiles. // Destroying TiledInputFile objects constructed with this constructor // automatically closes the corresponding files. //-------------------------------------------------------------------- IMF_EXPORT DeepTiledInputFile (const char fileName[], int numThreads = globalThreadCount ()); // ---------------------------------------------------------- // A constructor that attaches the new TiledInputFile object // to a file that has already been opened. // Destroying TiledInputFile objects constructed with this // constructor does not automatically close the corresponding // files. // ---------------------------------------------------------- IMF_EXPORT DeepTiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); //----------- // Destructor //----------- IMF_EXPORT virtual ~DeepTiledInputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledInputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readTile() is called. // The current frame buffer can be changed after each call // to readTile(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------------------------------------------------ // Check if the file is complete: // // isComplete() returns true if all pixels in the data window // (in all levels) are present in the input file, or false if // any pixels are missing. (Another program may still be busy // writing the file, or file writing may have been aborted // prematurely.) //------------------------------------------------------------ IMF_EXPORT bool isComplete () const; //-------------------------------------------------- // Utility functions: //-------------------------------------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with // MIPMAP_LEVELS files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // // totalTiles() returns the total number of tiles in the image // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; IMF_EXPORT size_t totalTiles() const; //---------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //---------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //-------------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //-------------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional region of // valid pixel coordinates for a level with level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------ // Read pixel data: // // readTile(dx, dy, lx, ly) reads the tile with tile // coordinates (dx, dy), and level number (lx, ly), // and stores it in the current frame buffer. // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readTile(dx, dy, level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It calls // readTile(dx, dy, level, level). // // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow // reading multiple tiles at once. If multi-threading is used // the multiple tiles are read concurrently. // // Pixels that are outside the pixel coordinate range for the // tile's level, are never accessed by readTile(). // // Attempting to access a tile that is not present in the file // throws an InputExc exception. // //------------------------------------------------------------ IMF_EXPORT void readTile (int dx, int dy, int l = 0); IMF_EXPORT void readTile (int dx, int dy, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //-------------------------------------------------- // Read a tile of raw pixel data from the file, // without uncompressing it (this function is // used to implement TiledOutputFile::copyPixels()). //-------------------------------------------------- IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, char *pixelData, Int64 &dataSize) const; //------------------------------------------------------------------ // Read pixel sample counts into a slice in the frame buffer. // // readPixelSampleCount(dx, dy, lx, ly) reads the sample counts // for tile (dx, dy) in level (lx, ly). // // readPixelSampleCount(dx, dy, l) calls // readPixelSampleCount(dx, dy, lx = l, ly = l) // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly) reads all // the sample counts for tiles within range // [(min(dx1, dx2), min(dy1, dy2))...(max(dx1, dx2), max(dy1, dy2)], // and on level (lx, ly) // // readPixelSampleCounts(dx1, dx2, dy1, dy2, l) calls // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx = l, ly = l). //------------------------------------------------------------------ IMF_EXPORT void readPixelSampleCount (int dx, int dy, int l = 0); IMF_EXPORT void readPixelSampleCount (int dx, int dy, int lx, int ly); IMF_EXPORT void readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int l = 0); struct Data; private: friend class InputFile; friend class MultiPartInputFile; DeepTiledInputFile (InputPartData* part); DeepTiledInputFile (const DeepTiledInputFile &) = delete; DeepTiledInputFile & operator = (const DeepTiledInputFile &) = delete; DeepTiledInputFile (DeepTiledInputFile &&) = delete; DeepTiledInputFile & operator = (DeepTiledInputFile &&) = delete; DeepTiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads); void initialize (); void multiPartInitialize(InputPartData* part); void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); bool isValidTile (int dx, int dy, int lx, int ly) const; size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; void getTileOrder(int dx[],int dy[],int lx[],int ly[]) const; Data * _data; // needed for copyPixels friend void DeepTiledOutputFile::copyPixels(DeepTiledInputFile &); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp000066400000000000000000000134521406177042200225200ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfDeepTiledInputPart.h" #include "ImfMultiPartInputFile.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER DeepTiledInputPart::DeepTiledInputPart(MultiPartInputFile& multiPartFile, int partNumber) { file = multiPartFile.getInputPart(partNumber); } const char * DeepTiledInputPart::fileName () const { return file->fileName(); } const Header & DeepTiledInputPart::header () const { return file->header(); } int DeepTiledInputPart::version () const { return file->version(); } void DeepTiledInputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const DeepFrameBuffer & DeepTiledInputPart::frameBuffer () const { return file->frameBuffer(); } bool DeepTiledInputPart::isComplete () const { return file->isComplete(); } unsigned int DeepTiledInputPart::tileXSize () const { return file->tileXSize(); } unsigned int DeepTiledInputPart::tileYSize () const { return file->tileYSize(); } LevelMode DeepTiledInputPart::levelMode () const { return file->levelMode(); } LevelRoundingMode DeepTiledInputPart::levelRoundingMode () const { return file->levelRoundingMode(); } int DeepTiledInputPart::numLevels () const { return file->numLevels(); } int DeepTiledInputPart::numXLevels () const { return file->numXLevels(); } int DeepTiledInputPart::numYLevels () const { return file->numYLevels(); } bool DeepTiledInputPart::isValidLevel (int lx, int ly) const { return file->isValidLevel(lx, ly); } int DeepTiledInputPart::levelWidth (int lx) const { return file->levelWidth(lx); } int DeepTiledInputPart::levelHeight (int ly) const { return file->levelHeight(ly); } int DeepTiledInputPart::numXTiles (int lx) const { return file->numXTiles(lx); } int DeepTiledInputPart::numYTiles (int ly) const { return file->numYTiles(ly); } IMATH_NAMESPACE::Box2i DeepTiledInputPart::dataWindowForLevel (int l) const { return file->dataWindowForLevel(l); } IMATH_NAMESPACE::Box2i DeepTiledInputPart::dataWindowForLevel (int lx, int ly) const { return file->dataWindowForLevel(lx, ly); } IMATH_NAMESPACE::Box2i DeepTiledInputPart::dataWindowForTile (int dx, int dy, int l) const { return file->dataWindowForTile(dx, dy, l); } IMATH_NAMESPACE::Box2i DeepTiledInputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const { return file->dataWindowForTile(dx, dy, lx, ly); } void DeepTiledInputPart::readTile (int dx, int dy, int l) { file->readTile(dx, dy, l); } void DeepTiledInputPart::readTile (int dx, int dy, int lx, int ly) { file->readTile(dx, dy, lx, ly); } void DeepTiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { file->readTiles(dx1, dx2, dy1, dy2, lx, ly); } void DeepTiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int l) { file->readTiles(dx1, dx2, dy1, dy2, l); } void DeepTiledInputPart::rawTileData (int &dx, int &dy, int &lx, int &ly, char * pixelData, Int64 & dataSize) const { file->rawTileData(dx, dy, lx, ly, pixelData, dataSize ); } void DeepTiledInputPart::readPixelSampleCount (int dx, int dy, int l) { file->readPixelSampleCount(dx, dy, l); } void DeepTiledInputPart::readPixelSampleCount (int dx, int dy, int lx, int ly) { file->readPixelSampleCount(dx, dy, lx, ly); } void DeepTiledInputPart::readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { file->readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly); } void DeepTiledInputPart::readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int l) { file->readPixelSampleCounts(dx1, dx2, dy1, dy2, l); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledInputPart.h000066400000000000000000000333521406177042200221660ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFDEEPTILEDINPUTPART_H_ #define IMFDEEPTILEDINPUTPART_H_ #include "ImfDeepTiledInputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepTiledInputPart { public: IMF_EXPORT DeepTiledInputPart(MultiPartInputFile& multiPartFile, int partNumber); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledInputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readTile() is called. // The current frame buffer can be changed after each call // to readTile(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------------------------------------------------ // Check if the file is complete: // // isComplete() returns true if all pixels in the data window // (in all levels) are present in the input file, or false if // any pixels are missing. (Another program may still be busy // writing the file, or file writing may have been aborted // prematurely.) //------------------------------------------------------------ IMF_EXPORT bool isComplete () const; //-------------------------------------------------- // Utility functions: //-------------------------------------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with // MIPMAP_LEVELS files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; //---------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //---------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //-------------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //-------------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional region of // valid pixel coordinates for a level with level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------ // Read pixel data: // // readTile(dx, dy, lx, ly) reads the tile with tile // coordinates (dx, dy), and level number (lx, ly), // and stores it in the current frame buffer. // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readTile(dx, dy, level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It calls // readTile(dx, dy, level, level). // // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow // reading multiple tiles at once. If multi-threading is used // the multiple tiles are read concurrently. // // Pixels that are outside the pixel coordinate range for the // tile's level, are never accessed by readTile(). // // Attempting to access a tile that is not present in the file // throws an InputExc exception. // //------------------------------------------------------------ IMF_EXPORT void readTile (int dx, int dy, int l = 0); IMF_EXPORT void readTile (int dx, int dy, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //-------------------------------------------------- // Read a tile of raw pixel data from the file, // without uncompressing it (this function is // used to implement TiledOutputFile::copyPixels()). //-------------------------------------------------- IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, char *data, Int64 &dataSize ) const; //------------------------------------------------------------------ // Read pixel sample counts into a slice in the frame buffer. // // readPixelSampleCount(dx, dy, lx, ly) reads the sample counts // for tile (dx, dy) in level (lx, ly). // // readPixelSampleCount(dx, dy, l) calls // readPixelSampleCount(dx, dy, lx = l, ly = l) // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly) reads all // the sample counts for tiles within range // [(min(dx1, dx2), min(dy1, dy2))...(max(dx1, dx2), max(dy1, dy2)], // and on level (lx, ly) // // readPixelSampleCounts(dx1, dx2, dy1, dy2, l) calls // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx = l, ly = l). //------------------------------------------------------------------ IMF_EXPORT void readPixelSampleCount (int dx, int dy, int l = 0); IMF_EXPORT void readPixelSampleCount (int dx, int dy, int lx, int ly); IMF_EXPORT void readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readPixelSampleCounts (int dx1, int dx2, int dy1, int dy2, int l = 0); private: DeepTiledInputFile* file; friend void DeepTiledOutputFile::copyPixels(DeepTiledInputPart &); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFDEEPTILEDINPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp000066400000000000000000001706771406177042200227070ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DeepTiledOutputFile // //----------------------------------------------------------------------------- #include "ImfDeepTiledOutputFile.h" #include "ImfDeepTiledInputFile.h" #include "ImfDeepTiledInputPart.h" #include "ImfInputFile.h" #include "ImfTileDescriptionAttribute.h" #include "ImfPreviewImageAttribute.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfTiledMisc.h" #include "ImfStdIO.h" #include "ImfCompressor.h" #include "ImfOutputStreamMutex.h" #include "ImfOutputPartData.h" #include "ImfArray.h" #include "ImfXdr.h" #include "ImfVersion.h" #include "ImfTileOffsets.h" #include "ImfThreading.h" #include "ImfPartType.h" #include "ImathBox.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "Iex.h" #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using std::string; using std::vector; using std::map; using std::min; using std::max; using std::swap; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct TOutSliceInfo { PixelType type; const char * base; size_t sampleStride; size_t xStride; size_t yStride; bool zero; int xTileCoords; int yTileCoords; TOutSliceInfo (PixelType type = HALF, size_t sampleStride = 0, size_t xStride = 0, size_t yStride = 0, bool zero = false, int xTileCoords = 0, int yTileCoords = 0); }; TOutSliceInfo::TOutSliceInfo (PixelType t, size_t spst, size_t xStride, size_t yStride, bool z, int xtc, int ytc) : type (t), sampleStride (spst), xStride(xStride), yStride(yStride), zero (z), xTileCoords (xtc), yTileCoords (ytc) { // empty } struct TileCoord { int dx; int dy; int lx; int ly; TileCoord (int xTile = 0, int yTile = 0, int xLevel = 0, int yLevel = 0) : dx (xTile), dy (yTile), lx (xLevel), ly (yLevel) { // empty } bool operator < (const TileCoord &other) const { return (ly < other.ly) || (ly == other.ly && lx < other.lx) || ((ly == other.ly && lx == other.lx) && ((dy < other.dy) || (dy == other.dy && dx < other.dx))); } bool operator == (const TileCoord &other) const { return lx == other.lx && ly == other.ly && dx == other.dx && dy == other.dy; } }; struct BufferedTile { char * pixelData; Int64 pixelDataSize; Int64 unpackedDataSize; char * sampleCountTableData; Int64 sampleCountTableSize; BufferedTile (const char *data, int size, int unpackedSize, const char *tableData, int tableSize): pixelData (0), pixelDataSize(size), unpackedDataSize(unpackedSize), sampleCountTableData(0), sampleCountTableSize(tableSize) { pixelData = new char[pixelDataSize]; memcpy (pixelData, data, pixelDataSize); sampleCountTableData = new char[tableSize]; memcpy (sampleCountTableData, tableData, tableSize); } ~BufferedTile() { delete [] pixelData; delete [] sampleCountTableData; } BufferedTile (const BufferedTile& other) = delete; BufferedTile& operator = (const BufferedTile& other) = delete; BufferedTile (BufferedTile&& other) = delete; BufferedTile& operator = (BufferedTile&& other) = delete; }; typedef map TileMap; struct TileBuffer { Array buffer; const char * dataPtr; Int64 dataSize; Int64 uncompressedSize; Compressor * compressor; Array sampleCountTableBuffer; const char * sampleCountTablePtr; Int64 sampleCountTableSize; Compressor* sampleCountTableCompressor; TileCoord tileCoord; bool hasException; string exception; TileBuffer (); ~TileBuffer (); inline void wait () {_sem.wait();} inline void post () {_sem.post();} protected: Semaphore _sem; }; TileBuffer::TileBuffer (): dataPtr (0), dataSize (0), compressor (0), sampleCountTablePtr (0), sampleCountTableCompressor (0), hasException (false), exception (), _sem (1) { // empty } TileBuffer::~TileBuffer () { if (compressor != 0) delete compressor; if (sampleCountTableCompressor != 0) delete sampleCountTableCompressor; } } // namespace struct DeepTiledOutputFile::Data { Header header; // the image header int version; // file format version bool multipart; // file is multipart TileDescription tileDesc; // describes the tile layout DeepFrameBuffer frameBuffer; // framebuffer to write into Int64 previewPosition; LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord int numXLevels; // number of x levels int numYLevels; // number of y levels int * numXTiles; // number of x tiles at a level int * numYTiles; // number of y tiles at a level TileOffsets tileOffsets; // stores offsets in file for // each tile Compressor::Format format; // compressor's data format vector slices; // info about channels in file vector tileBuffers; Int64 tileOffsetsPosition; // position of the tile index TileMap tileMap; // the map of buffered tiles TileCoord nextTileToWrite; int partNumber; // the output part number char* sampleCountSliceBase; // the pointer to the number // of samples in each pixel int sampleCountXStride; // the x stride for sampleCountSliceBase int sampleCountYStride; // the y stride for sampleCountSliceBase int sampleCountXTileCoords; // using x coordinates relative to current tile int sampleCountYTileCoords; // using y coordinates relative to current tile Int64 maxSampleCountTableSize;// the max size in bytes for a pixel // sample count table OutputStreamMutex* _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline TileBuffer * getTileBuffer (int number); // hash function from tile // buffer coords into our // vector of tile buffers int& getSampleCount(int x, int y); // get the number of samples // in each pixel TileCoord nextTileCoord (const TileCoord &a); }; DeepTiledOutputFile::Data::Data (int numThreads): numXTiles(0), numYTiles(0), tileOffsetsPosition (0), partNumber(-1), _streamData(NULL), _deleteStream(true) { // // We need at least one tileBuffer, but if threading is used, // to keep n threads busy we need 2*n tileBuffers // tileBuffers.resize (max (1, 2 * numThreads)); for (size_t i = 0; i < tileBuffers.size(); i++) tileBuffers[i] = 0; } DeepTiledOutputFile::Data::~Data () { delete [] numXTiles; delete [] numYTiles; // // Delete all the tile buffers, if any still happen to exist // for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i) delete i->second; for (size_t i = 0; i < tileBuffers.size(); i++) if (tileBuffers[i] != 0) delete tileBuffers[i]; for (size_t i = 0; i < slices.size(); i++) delete slices[i]; } int& DeepTiledOutputFile::Data::getSampleCount(int x, int y) { return sampleCount(sampleCountSliceBase, sampleCountXStride, sampleCountYStride, x, y); } TileBuffer* DeepTiledOutputFile::Data::getTileBuffer (int number) { return tileBuffers[number % tileBuffers.size()]; } TileCoord DeepTiledOutputFile::Data::nextTileCoord (const TileCoord &a) { TileCoord b = a; if (lineOrder == INCREASING_Y) { b.dx++; if (b.dx >= numXTiles[b.lx]) { b.dx = 0; b.dy++; if (b.dy >= numYTiles[b.ly]) { // // the next tile is in the next level // b.dy = 0; switch (tileDesc.mode) { case ONE_LEVEL: case MIPMAP_LEVELS: b.lx++; b.ly++; break; case RIPMAP_LEVELS: b.lx++; if (b.lx >= numXLevels) { b.lx = 0; b.ly++; #ifdef DEBUG assert (b.ly <= numYLevels); #endif } break; case NUM_LEVELMODES : throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord"); } } } } else if (lineOrder == DECREASING_Y) { b.dx++; if (b.dx >= numXTiles[b.lx]) { b.dx = 0; b.dy--; if (b.dy < 0) { // // the next tile is in the next level // switch (tileDesc.mode) { case ONE_LEVEL: case MIPMAP_LEVELS: b.lx++; b.ly++; break; case RIPMAP_LEVELS: b.lx++; if (b.lx >= numXLevels) { b.lx = 0; b.ly++; #ifdef DEBUG assert (b.ly <= numYLevels); #endif } break; case NUM_LEVELMODES : throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord"); } if (b.ly < numYLevels) b.dy = numYTiles[b.ly] - 1; } } }else if(lineOrder==RANDOM_Y) { THROW (IEX_NAMESPACE::ArgExc, "can't compute next tile from randomly ordered image: use getTilesInOrder instead"); } return b; } namespace { void writeTileData (DeepTiledOutputFile::Data *ofd, int dx, int dy, int lx, int ly, const char pixelData[], Int64 pixelDataSize, Int64 unpackedDataSize, const char sampleCountTableData[], Int64 sampleCountTableSize) { // // Store a block of pixel data in the output file, and try // to keep track of the current writing position the file, // without calling tellp() (tellp() can be fairly expensive). // Int64 currentPosition = ofd->_streamData->currentPosition; ofd->_streamData->currentPosition = 0; if (currentPosition == 0) currentPosition = ofd->_streamData->os->tellp(); ofd->tileOffsets (dx, dy, lx, ly) = currentPosition; #ifdef DEBUG assert (ofd->_streamData->os->tellp() == currentPosition); #endif // // Write the tile header. // if (ofd->multipart) { Xdr::write (*ofd->_streamData->os, ofd->partNumber); } Xdr::write (*ofd->_streamData->os, dx); Xdr::write (*ofd->_streamData->os, dy); Xdr::write (*ofd->_streamData->os, lx); Xdr::write (*ofd->_streamData->os, ly); // // Write the packed size of the pixel sample count table (64 bits) // Xdr::write (*ofd->_streamData->os, sampleCountTableSize); // // Write the packed and unpacked data size (64 bits each) // Xdr::write (*ofd->_streamData->os, pixelDataSize); Xdr::write (*ofd->_streamData->os, unpackedDataSize); // // Write the compressed pixel sample count table. // ofd->_streamData->os->write (sampleCountTableData, sampleCountTableSize); // // Write the compressed data. // ofd->_streamData->os->write (pixelData, pixelDataSize); // // Keep current position in the file so that we can avoid // redundant seekg() operations (seekg() can be fairly expensive). // ofd->_streamData->currentPosition = currentPosition + 4 * Xdr::size() + // dx, dy, lx, ly, 3 * Xdr::size() + // sampleCountTableSize, // pixelDataSize, // unpackedDataSize sampleCountTableSize + pixelDataSize; if (ofd->multipart) { ofd->_streamData->currentPosition += Xdr::size(); } } void bufferedTileWrite ( DeepTiledOutputFile::Data *ofd, int dx, int dy, int lx, int ly, const char pixelData[], Int64 pixelDataSize, Int64 unpackedDataSize, const char sampleCountTableData[], Int64 sampleCountTableSize) { // // Check if a tile with coordinates (dx,dy,lx,ly) has already been written. // if (ofd->tileOffsets (dx, dy, lx, ly)) { THROW (IEX_NAMESPACE::ArgExc, "Attempt to write tile " "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " "more than once."); } // // If tiles can be written in random order, then don't buffer anything. // if (ofd->lineOrder == RANDOM_Y) { writeTileData (ofd, dx, dy, lx, ly, pixelData, pixelDataSize, unpackedDataSize, sampleCountTableData, sampleCountTableSize); return; } // // If the tiles cannot be written in random order, then check if a // tile with coordinates (dx,dy,lx,ly) has already been buffered. // TileCoord currentTile = TileCoord(dx, dy, lx, ly); if (ofd->tileMap.find (currentTile) != ofd->tileMap.end()) { THROW (IEX_NAMESPACE::ArgExc, "Attempt to write tile " "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " "more than once."); } // // If all the tiles before this one have already been written to the file, // then write this tile immediately and check if we have buffered tiles // that can be written after this tile. // // Otherwise, buffer the tile so it can be written to file later. // if (ofd->nextTileToWrite == currentTile) { writeTileData (ofd, dx, dy, lx, ly, pixelData, pixelDataSize, unpackedDataSize, sampleCountTableData, sampleCountTableSize); ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite); // // Step through the tiles and write all successive buffered tiles after // the current one. // while(i != ofd->tileMap.end()) { // // Write the tile, and then delete the tile's buffered data // writeTileData (ofd, i->first.dx, i->first.dy, i->first.lx, i->first.ly, i->second->pixelData, i->second->pixelDataSize, i->second->unpackedDataSize, i->second->sampleCountTableData, i->second->sampleCountTableSize); delete i->second; ofd->tileMap.erase (i); // // Proceed to the next tile // ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); i = ofd->tileMap.find (ofd->nextTileToWrite); } } else { // // Create a new BufferedTile, copy the pixelData into it, and // insert it into the tileMap. // ofd->tileMap[currentTile] = new BufferedTile ((const char *)pixelData, pixelDataSize, unpackedDataSize, sampleCountTableData, sampleCountTableSize); } } void convertToXdr (DeepTiledOutputFile::Data *ofd, Array& tileBuffer, int numScanLines, vector& bytesPerLine) { // // Convert the contents of a TiledOutputFile's tileBuffer from the // machine's native representation to Xdr format. This function is called // by writeTile(), below, if the compressor wanted its input pixel data // in the machine's native format, but then failed to compress the data // (most compressors will expand rather than compress random input data). // // Note that this routine assumes that the machine's native representation // of the pixel data has the same size as the Xdr representation. This // makes it possible to convert the pixel data in place, without an // intermediate temporary buffer. // // // Set these to point to the start of the tile. // We will write to toPtr, and read from fromPtr. // char *writePtr = tileBuffer; const char *readPtr = writePtr; // // Iterate over all scan lines in the tile. // for (int y = 0; y < numScanLines; ++y) { // // Iterate over all slices in the file. // for (unsigned int i = 0; i < ofd->slices.size(); ++i) { const TOutSliceInfo &slice = *ofd->slices[i]; // // Convert the samples in place. // Int64 numPixelsPerScanLine = bytesPerLine[y]; convertInPlace (writePtr, readPtr, slice.type, numPixelsPerScanLine); } } #ifdef DEBUG assert (writePtr == readPtr); #endif } // // A TileBufferTask encapsulates the task of copying a tile from // the user's framebuffer into a LineBuffer and compressing the data // if necessary. // class TileBufferTask: public Task { public: TileBufferTask (TaskGroup *group, DeepTiledOutputFile::Data *ofd, int number, int dx, int dy, int lx, int ly); virtual ~TileBufferTask (); virtual void execute (); private: DeepTiledOutputFile::Data * _ofd; TileBuffer * _tileBuffer; }; TileBufferTask::TileBufferTask (TaskGroup *group, DeepTiledOutputFile::Data *ofd, int number, int dx, int dy, int lx, int ly) : Task (group), _ofd (ofd), _tileBuffer (_ofd->getTileBuffer (number)) { // // Wait for the tileBuffer to become available // _tileBuffer->wait (); _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly); } TileBufferTask::~TileBufferTask () { // // Signal that the tile buffer is now free // _tileBuffer->post (); } void TileBufferTask::execute () { try { // // First copy the pixel data from the frame buffer // into the tile buffer // // Convert one tile's worth of pixel data to // a machine-independent representation, and store // the result in _tileBuffer->buffer. // Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _ofd->tileDesc, _ofd->minX, _ofd->maxX, _ofd->minY, _ofd->maxY, _tileBuffer->tileCoord.dx, _tileBuffer->tileCoord.dy, _tileBuffer->tileCoord.lx, _tileBuffer->tileCoord.ly); int numScanLines = tileRange.max.y - tileRange.min.y + 1; // int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; // // Get the bytes for each line. // vector bytesPerLine(_ofd->tileDesc.ySize); vector xOffsets(_ofd->slices.size()); vector yOffsets(_ofd->slices.size()); for (size_t i = 0; i < _ofd->slices.size(); i++) { const TOutSliceInfo &slice = *_ofd->slices[i]; xOffsets[i] = slice.xTileCoords * tileRange.min.x; yOffsets[i] = slice.yTileCoords * tileRange.min.y; } calculateBytesPerLine(_ofd->header, _ofd->sampleCountSliceBase, _ofd->sampleCountXStride, _ofd->sampleCountYStride, tileRange.min.x, tileRange.max.x, tileRange.min.y, tileRange.max.y, xOffsets, yOffsets, bytesPerLine); // // Allocate the memory for internal buffer. // (TODO) more efficient memory management? // Int64 totalBytes = 0; Int64 maxBytesPerTileLine = 0; for (size_t i = 0; i < bytesPerLine.size(); i++) { totalBytes += bytesPerLine[i]; if (bytesPerLine[i] > maxBytesPerTileLine) maxBytesPerTileLine = bytesPerLine[i]; } _tileBuffer->buffer.resizeErase(totalBytes); char *writePtr = _tileBuffer->buffer; // // Iterate over the scan lines in the tile. // int xOffsetForSampleCount = (_ofd->sampleCountXTileCoords == 0) ? 0 : tileRange.min.x; int yOffsetForSampleCount = (_ofd->sampleCountYTileCoords == 0) ? 0 : tileRange.min.y; for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) { // // Iterate over all image channels. // for (unsigned int i = 0; i < _ofd->slices.size(); ++i) { const TOutSliceInfo &slice = *_ofd->slices[i]; // // Fill the tile buffer with pixel data. // if (slice.zero) { // // The frame buffer contains no data for this channel. // Store zeroes in _data->tileBuffer. // fillChannelWithZeroes (writePtr, _ofd->format, slice.type, bytesPerLine[y - tileRange.min.y]); } else { // // The frame buffer contains data for this channel. // int xOffsetForData = slice.xTileCoords ? tileRange.min.x : 0; int yOffsetForData = slice.yTileCoords ? tileRange.min.y : 0; // (TOOD) treat sample count offsets differently. copyFromDeepFrameBuffer (writePtr, slice.base, _ofd->sampleCountSliceBase, _ofd->sampleCountXStride, _ofd->sampleCountYStride, y, tileRange.min.x, tileRange.max.x, xOffsetForSampleCount, yOffsetForSampleCount, xOffsetForData, yOffsetForData, slice.sampleStride, slice.xStride, slice.yStride, _ofd->format, slice.type); #if defined(DEBUG) assert(writePtr-_tileBuffer->buffer<=totalBytes); #endif } } } // // Compress the pixel sample count table. // char* ptr = _tileBuffer->sampleCountTableBuffer; Int64 tableDataSize = 0; for (int i = tileRange.min.y; i <= tileRange.max.y; i++) { int count = 0; for (int j = tileRange.min.x; j <= tileRange.max.x; j++) { count += _ofd->getSampleCount(j - xOffsetForSampleCount, i - yOffsetForSampleCount); Xdr::write (ptr, count); tableDataSize += sizeof (int); } } if(_tileBuffer->sampleCountTableCompressor) { _tileBuffer->sampleCountTableSize = _tileBuffer->sampleCountTableCompressor->compress ( _tileBuffer->sampleCountTableBuffer, tableDataSize, tileRange.min.y, _tileBuffer->sampleCountTablePtr); } // // If we can't make data shrink (or compression was disabled), then just use the raw data. // if ( ! _tileBuffer->sampleCountTableCompressor || _tileBuffer->sampleCountTableSize >= _ofd->maxSampleCountTableSize) { _tileBuffer->sampleCountTableSize = _ofd->maxSampleCountTableSize; _tileBuffer->sampleCountTablePtr = _tileBuffer->sampleCountTableBuffer; } // // Compress the contents of the tileBuffer, // and store the compressed data in the output file. // _tileBuffer->dataSize = writePtr - _tileBuffer->buffer; _tileBuffer->uncompressedSize = _tileBuffer->dataSize; _tileBuffer->dataPtr = _tileBuffer->buffer; // (TODO) don't do this all the time. if (_tileBuffer->compressor != 0) delete _tileBuffer->compressor; _tileBuffer->compressor = newTileCompressor (_ofd->header.compression(), maxBytesPerTileLine, _ofd->tileDesc.ySize, _ofd->header); if (_tileBuffer->compressor) { const char *compPtr; Int64 compSize = _tileBuffer->compressor->compressTile (_tileBuffer->dataPtr, _tileBuffer->dataSize, tileRange, compPtr); if (compSize < _tileBuffer->dataSize) { _tileBuffer->dataSize = compSize; _tileBuffer->dataPtr = compPtr; } else if (_ofd->format == Compressor::NATIVE) { // // The data did not shrink during compression, but // we cannot write to the file using native format, // so we need to convert the lineBuffer to Xdr. // convertToXdr (_ofd, _tileBuffer->buffer, numScanLines, bytesPerLine); } } } catch (std::exception &e) { if (!_tileBuffer->hasException) { _tileBuffer->exception = e.what (); _tileBuffer->hasException = true; } } catch (...) { if (!_tileBuffer->hasException) { _tileBuffer->exception = "unrecognized exception"; _tileBuffer->hasException = true; } } } } // namespace DeepTiledOutputFile::DeepTiledOutputFile (const char fileName[], const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new OutputStreamMutex(); _data->_deleteStream =true; try { header.sanityCheck (true); _data->_streamData->os = new StdOFStream (fileName); initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true); _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os); _data->multipart = false; } catch (IEX_NAMESPACE::BaseExc &e) { if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os; if (_data && _data->_streamData) delete _data->_streamData; if (_data) delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os; if (_data->_streamData) delete _data->_streamData; if (_data) delete _data; throw; } } DeepTiledOutputFile::DeepTiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new OutputStreamMutex(); _data->_deleteStream=false; try { header.sanityCheck(true); _data->_streamData->os = &os; initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true); _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os); _data->multipart = false; } catch (IEX_NAMESPACE::BaseExc &e) { if (_data && _data->_streamData) delete _data->_streamData; if (_data) delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << os.fileName() << "\". " << e.what()); throw; } catch (...) { if (_data && _data->_streamData) delete _data->_streamData; if (_data) delete _data; throw; } } DeepTiledOutputFile::DeepTiledOutputFile(const OutputPartData* part) { try { if (part->header.type() != DEEPTILE) throw IEX_NAMESPACE::ArgExc("Can't build a DeepTiledOutputFile from " "a type-mismatched part."); _data = new Data (part->numThreads); _data->_streamData=part->mutex; _data->_deleteStream=false; initialize(part->header); _data->partNumber = part->partNumber; _data->tileOffsetsPosition = part->chunkOffsetTablePosition; _data->previewPosition = part->previewPosition; _data->multipart = part->multipart; } catch (IEX_NAMESPACE::BaseExc &e) { if (_data) delete _data; REPLACE_EXC (e, "Cannot initialize output part " "\"" << part->partNumber << "\". " << e.what()); throw; } catch (...) { if (_data) delete _data; throw; } } void DeepTiledOutputFile::initialize (const Header &header) { _data->header = header; _data->header.setType(DEEPTILE); _data->lineOrder = _data->header.lineOrder(); // // Check that the file is indeed tiled // _data->tileDesc = _data->header.tileDescription(); // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; // // Precompute level and tile information to speed up utility functions // precalculateTileInfo (_data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, _data->numXTiles, _data->numYTiles, _data->numXLevels, _data->numYLevels); // // Determine the first tile coordinate that we will be writing // if the file is not RANDOM_Y. // _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)? TileCoord (0, 0, 0, 0): TileCoord (0, _data->numYTiles[0] - 1, 0, 0); Compressor* compressor = newTileCompressor (_data->header.compression(), 0, _data->tileDesc.ySize, _data->header); _data->format = defaultFormat (compressor); if (compressor != 0) delete compressor; _data->tileOffsets = TileOffsets (_data->tileDesc.mode, _data->numXLevels, _data->numYLevels, _data->numXTiles, _data->numYTiles); //ignore the existing value of chunkCount - correct it if it's wrong _data->header.setChunkCount(getChunkOffsetTableSize(_data->header)); _data->maxSampleCountTableSize = _data->tileDesc.ySize * _data->tileDesc.xSize * sizeof(int); for (size_t i = 0; i < _data->tileBuffers.size(); i++) { _data->tileBuffers[i] = new TileBuffer (); _data->tileBuffers[i]->sampleCountTableBuffer. resizeErase(_data->maxSampleCountTableSize); char * p = &(_data->tileBuffers[i]->sampleCountTableBuffer[0]); memset (p, 0, _data->maxSampleCountTableSize); _data->tileBuffers[i]->sampleCountTableCompressor = newCompressor (_data->header.compression(), _data->maxSampleCountTableSize, _data->header); } } DeepTiledOutputFile::~DeepTiledOutputFile () { if (_data) { { Lock lock(*_data->_streamData); Int64 originalPosition = _data->_streamData->os->tellp(); if (_data->tileOffsetsPosition > 0) { try { _data->_streamData->os->seekp (_data->tileOffsetsPosition); _data->tileOffsets.writeTo (*_data->_streamData->os); // // Restore the original position. // _data->_streamData->os->seekp (originalPosition); } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // We cannot safely throw any exceptions from here. // This destructor may have been called because the // stack is currently being unwound for another // exception. // } } } if (_data->_deleteStream && _data->_streamData) delete _data->_streamData->os; // // (TODO) we should have a way to tell if the stream data is owned by // this file or by a parent multipart file. // if (_data->partNumber == -1 && _data->_streamData) delete _data->_streamData; delete _data; } } const char * DeepTiledOutputFile::fileName () const { return _data->_streamData->os->fileName(); } const Header & DeepTiledOutputFile::header () const { return _data->header; } void DeepTiledOutputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Check if the new frame buffer descriptor // is compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) continue; if (i.channel().type != j.slice().type) THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" is " "not compatible with the frame buffer's " "pixel type."); if (j.slice().xSampling != 1 || j.slice().ySampling != 1) THROW (IEX_NAMESPACE::ArgExc, "All channels in a tiled file must have" "sampling (1,1)."); } // // Store the pixel sample count table. // const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); if (sampleCountSlice.base == 0) { throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); } else { _data->sampleCountSliceBase = sampleCountSlice.base; _data->sampleCountXStride = sampleCountSlice.xStride; _data->sampleCountYStride = sampleCountSlice.yStride; _data->sampleCountXTileCoords = sampleCountSlice.xTileCoords; _data->sampleCountYTileCoords = sampleCountSlice.yTileCoords; } // // Initialize slice table for writePixels(). // Pixel sample count slice is not presented in the header, // so it wouldn't be added here. // Store the pixel base pointer table. // vector slices; for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) { // // Channel i is not present in the frame buffer. // In the file, channel i will contain only zeroes. // slices.push_back (new TOutSliceInfo (i.channel().type, 0, // sampleStride, 0, // xStride 0, // yStride true)); // zero } else { // // Channel i is present in the frame buffer. // slices.push_back (new TOutSliceInfo (j.slice().type, j.slice().sampleStride, j.slice().xStride, j.slice().yStride, false, // zero (j.slice().xTileCoords)? 1: 0, (j.slice().yTileCoords)? 1: 0)); TOutSliceInfo* slice = slices.back(); slice->base = j.slice().base; } } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; for (size_t i = 0; i < _data->slices.size(); i++) delete _data->slices[i]; _data->slices = slices; } const DeepFrameBuffer & DeepTiledOutputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } void DeepTiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data source."); if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Tile coordinates are invalid."); if (!isValidLevel (lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Level coordinate " "(" << lx << ", " << ly << ") " "is invalid."); // // Determine the first and last tile coordinates in both dimensions // based on the file's lineOrder // if (dx1 > dx2) swap (dx1, dx2); if (dy1 > dy2) swap (dy1, dy2); int dyStart = dy1; int dY = 1; if (_data->lineOrder == DECREASING_Y) { dyStart = dy2; dY = -1; } int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); int numTasks = min ((int)_data->tileBuffers.size(), numTiles); // // Create a task group for all tile buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; // // Add in the initial compression tasks to the thread pool // int nextCompBuffer = 0; int dxComp = dx1; int dyComp = dyStart; while (nextCompBuffer < numTasks) { ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, _data, nextCompBuffer++, dxComp, dyComp, lx, ly)); dxComp++; if (dxComp > dx2) { dxComp = dx1; dyComp += dY; } } // // Write the compressed buffers and add in more compression // tasks until done // int nextWriteBuffer = 0; int dxWrite = dx1; int dyWrite = dyStart; while (nextWriteBuffer < numTiles) { // // Wait until the nextWriteBuffer is ready to be written // TileBuffer* writeBuffer = _data->getTileBuffer (nextWriteBuffer); writeBuffer->wait(); // // Write the tilebuffer // bufferedTileWrite ( _data, dxWrite, dyWrite, lx, ly, writeBuffer->dataPtr, writeBuffer->dataSize, writeBuffer->uncompressedSize, writeBuffer->sampleCountTablePtr, writeBuffer->sampleCountTableSize); // // Release the lock on nextWriteBuffer // writeBuffer->post(); // // If there are no more tileBuffers to compress, then // only continue to write out remaining tileBuffers, // otherwise keep adding compression tasks. // if (nextCompBuffer < numTiles) { // // add nextCompBuffer as a compression Task // ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, _data, nextCompBuffer, dxComp, dyComp, lx, ly)); } nextWriteBuffer++; dxWrite++; if (dxWrite > dx2) { dxWrite = dx1; dyWrite += dY; } nextCompBuffer++; dxComp++; if (dxComp > dx2) { dxComp = dx1; dyComp += dY; } } // // finish all tasks // } // // Exeption handling: // // TileBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to TiledOutputFile::writeTiles(). // TileBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the tile buffers. // Now we check if any tile buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple tile buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->tileBuffers.size(); ++i) { TileBuffer *tileBuffer = _data->tileBuffers[i]; if (tileBuffer->hasException && !exception) exception = &tileBuffer->exception; tileBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Failed to write pixel data to image " "file \"" << fileName() << "\". " << e.what()); throw; } } void DeepTiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l) { writeTiles (dx1, dxMax, dyMin, dyMax, l, l); } void DeepTiledOutputFile::writeTile (int dx, int dy, int lx, int ly) { writeTiles (dx, dx, dy, dy, lx, ly); } void DeepTiledOutputFile::writeTile (int dx, int dy, int l) { writeTile(dx, dy, l, l); } void DeepTiledOutputFile::copyPixels (DeepTiledInputFile &in) { // // Check if this file's and and the InputFile's // headers are compatible. // const Header &hdr = _data->header; const Header &inHdr = in.header(); if (!(hdr.tileDescription() == inHdr.tileDescription())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different tile descriptions."); if (!(hdr.dataWindow() == inHdr.dataWindow())) THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". The " "files have different data windows."); if (!(hdr.lineOrder() == inHdr.lineOrder())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different line orders."); if (!(hdr.compression() == inHdr.compression())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files use different compression methods."); if (!(hdr.channels() == inHdr.channels())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" " "failed. The files have different channel " "lists."); // Verify that no pixel data have been written to this file yet. // if (!_data->tileOffsets.isEmpty()) THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << _data->_streamData->os->fileName() << "\" " "failed. \"" << fileName() << "\" " "already contains pixel data."); int numAllTiles = in.totalTiles(); Lock lock (*_data->_streamData); // // special handling for random tiles // vector dx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); vector dy_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); vector lx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); vector ly_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); if(_data->lineOrder==RANDOM_Y) { in.getTileOrder(&dx_list[0],&dy_list[0],&lx_list[0],&ly_list[0]); _data->nextTileToWrite.dx=dx_list[0]; _data->nextTileToWrite.dy=dy_list[0]; _data->nextTileToWrite.lx=lx_list[0]; _data->nextTileToWrite.ly=ly_list[0]; } vector data(4096); for (int i = 0; i < numAllTiles; ++i) { int dx = _data->nextTileToWrite.dx; int dy = _data->nextTileToWrite.dy; int lx = _data->nextTileToWrite.lx; int ly = _data->nextTileToWrite.ly; Int64 dataSize = data.size(); in.rawTileData (dx, dy, lx, ly, &data[0], dataSize); if(dataSize>data.size()) { data.resize(dataSize); in.rawTileData (dx, dy, lx, ly, &data[0], dataSize); } Int64 sampleCountTableSize = *(Int64 *)(&data[0] + 16); Int64 pixelDataSize = *(Int64 *)(&data[0] + 24); Int64 unpackedPixelDataSize = *(Int64 *)(&data[0] + 32); char * sampleCountTable = &data[0]+40; char * pixelData = sampleCountTable + sampleCountTableSize; writeTileData (_data, dx, dy, lx, ly, pixelData, pixelDataSize,unpackedPixelDataSize,sampleCountTable,sampleCountTableSize); if(_data->lineOrder==RANDOM_Y) { if(inextTileToWrite.dx=dx_list[i+1]; _data->nextTileToWrite.dy=dy_list[i+1]; _data->nextTileToWrite.lx=lx_list[i+1]; _data->nextTileToWrite.ly=ly_list[i+1]; } }else{ _data->nextTileToWrite = _data->nextTileCoord (_data->nextTileToWrite); } } } void DeepTiledOutputFile::copyPixels (DeepTiledInputPart &in) { copyPixels(*in.file); } unsigned int DeepTiledOutputFile::tileXSize () const { return _data->tileDesc.xSize; } unsigned int DeepTiledOutputFile::tileYSize () const { return _data->tileDesc.ySize; } LevelMode DeepTiledOutputFile::levelMode () const { return _data->tileDesc.mode; } LevelRoundingMode DeepTiledOutputFile::levelRoundingMode () const { return _data->tileDesc.roundingMode; } int DeepTiledOutputFile::numLevels () const { if (levelMode() == RIPMAP_LEVELS) THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " "file \"" << fileName() << "\" " "(numLevels() is not defined for RIPMAPs)."); return _data->numXLevels; } int DeepTiledOutputFile::numXLevels () const { return _data->numXLevels; } int DeepTiledOutputFile::numYLevels () const { return _data->numYLevels; } bool DeepTiledOutputFile::isValidLevel (int lx, int ly) const { if (lx < 0 || ly < 0) return false; if (levelMode() == MIPMAP_LEVELS && lx != ly) return false; if (lx >= numXLevels() || ly >= numYLevels()) return false; return true; } int DeepTiledOutputFile::levelWidth (int lx) const { try { int retVal = levelSize (_data->minX, _data->maxX, lx, _data->tileDesc.roundingMode); return retVal; } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelWidth() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int DeepTiledOutputFile::levelHeight (int ly) const { try { return levelSize (_data->minY, _data->maxY, ly, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelHeight() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int DeepTiledOutputFile::numXTiles (int lx) const { if (lx < 0 || lx >= _data->numXLevels) THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " "file \"" << _data->_streamData->os->fileName() << "\" " "(Argument is not in valid range)."); return _data->numXTiles[lx]; } int DeepTiledOutputFile::numYTiles (int ly) const { if (ly < 0 || ly >= _data->numYLevels) THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " "file \"" << _data->_streamData->os->fileName() << "\" " "(Argument is not in valid range)."); return _data->numYTiles[ly]; } Box2i DeepTiledOutputFile::dataWindowForLevel (int l) const { return dataWindowForLevel (l, l); } Box2i DeepTiledOutputFile::dataWindowForLevel (int lx, int ly) const { try { return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } Box2i DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int l) const { return dataWindowForTile (dx, dy, l, l); } Box2i DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { try { if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, dx, dy, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForTile() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } bool DeepTiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const { return ((lx < _data->numXLevels && lx >= 0) && (ly < _data->numYLevels && ly >= 0) && (dx < _data->numXTiles[lx] && dx >= 0) && (dy < _data->numYTiles[ly] && dy >= 0)); } void DeepTiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { Lock lock (*_data->_streamData); if (_data->previewPosition <= 0) THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " "File \"" << fileName() << "\" does not " "contain a preview image."); // // Store the new pixels in the header's preview image attribute. // PreviewImageAttribute &pia = _data->header.typedAttribute ("preview"); PreviewImage &pi = pia.value(); PreviewRgba *pixels = pi.pixels(); int numPixels = pi.width() * pi.height(); for (int i = 0; i < numPixels; ++i) pixels[i] = newPixels[i]; // // Save the current file position, jump to the position in // the file where the preview image starts, store the new // preview image, and jump back to the saved file position. // Int64 savedPosition = _data->_streamData->os->tellp(); try { _data->_streamData->os->seekp (_data->previewPosition); pia.writeValueTo (*_data->_streamData->os, _data->version); _data->_streamData->os->seekp (savedPosition); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot update preview image pixels for " "file \"" << fileName() << "\". " << e.what()); throw; } } void DeepTiledOutputFile::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) { Lock lock (*_data->_streamData); Int64 position = _data->tileOffsets (dx, dy, lx, ly); if (!position) THROW (IEX_NAMESPACE::ArgExc, "Cannot overwrite tile " "(" << dx << ", " << dy << ", " << lx << "," << ly << "). " "The tile has not yet been stored in " "file \"" << fileName() << "\"."); _data->_streamData->currentPosition = 0; _data->_streamData->os->seekp (position + offset); for (int i = 0; i < length; ++i) _data->_streamData->os->write (&c, 1); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h000066400000000000000000000452121406177042200223360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DEEP_TILED_OUTPUT_FILE_H #define INCLUDED_IMF_DEEP_TILED_OUTPUT_FILE_H //----------------------------------------------------------------------------- // // class DeepTiledOutputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImathBox.h" #include "ImfThreading.h" #include "ImfGenericOutputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepTiledOutputFile : public GenericOutputFile { public: //------------------------------------------------------------------- // A constructor that opens the file with the specified name, and // writes the file header. The file header is also copied into the // TiledOutputFile object, and can later be accessed via the header() // method. // // Destroying TiledOutputFile constructed with this constructor // automatically closes the corresponding files. // // The header must contain a TileDescriptionAttribute called "tiles". // // The x and y subsampling factors for all image channels must be 1; // subsampling is not supported. // // Tiles can be written to the file in arbitrary order. The line // order attribute can be used to cause the tiles to be sorted in // the file. When the file is read later, reading the tiles in the // same order as they are in the file tends to be significantly // faster than reading the tiles in random order (see writeTile, // below). //------------------------------------------------------------------- IMF_EXPORT DeepTiledOutputFile (const char fileName[], const Header &header, int numThreads = globalThreadCount ()); // ---------------------------------------------------------------- // A constructor that attaches the new TiledOutputFile object to // a file that has already been opened. Destroying TiledOutputFile // objects constructed with this constructor does not automatically // close the corresponding files. // ---------------------------------------------------------------- IMF_EXPORT DeepTiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads = globalThreadCount ()); //----------------------------------------------------- // Destructor // // Destroying a TiledOutputFile object before all tiles // have been written results in an incomplete file. //----------------------------------------------------- IMF_EXPORT virtual ~DeepTiledOutputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledOutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writeTile() is // called. The current frame buffer can be changed // after each call to writeTile(). //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------- // Utility functions: //------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with MIPMAP_LEVELS // files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; //--------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //--------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //---------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //---------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a level with // level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------------ // Write pixel data: // // writeTile(dx, dy, lx, ly) writes the tile with tile // coordinates (dx, dy), and level number (lx, ly) to // the file. // // dx must lie in the interval [0, numXTiles(lx) - 1] // dy must lie in the interval [0, numYTiles(ly) - 1] // // lx must lie in the interval [0, numXLevels() - 1] // ly must lie in the inverval [0, numYLevels() - 1] // // writeTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls // writeTile(dx, dy, level, level). // // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow // writing multiple tiles at once. If multi-threading is used // multiple tiles are written concurrently. The tile coordinates, // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the // tiles are always written in the order specified by the line // order attribute. Hence, it is not possible to specify an // "invalid" or empty tile range. // // Pixels that are outside the pixel coordinate range for the tile's // level, are never accessed by writeTile(). // // Each tile in the file must be written exactly once. // // The file's line order attribute determines the order of the tiles // in the file: // // INCREASING_Y In the file, the tiles for each level are stored // in a contiguous block. The levels are ordered // like this: // // (0, 0) (1, 0) ... (nx-1, 0) // (0, 1) (1, 1) ... (nx-1, 1) // ... // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) // // where nx = numXLevels(), and ny = numYLevels(). // In an individual level, (lx, ly), the tiles // are stored in the following order: // // (0, 0) (1, 0) ... (tx-1, 0) // (0, 1) (1, 1) ... (tx-1, 1) // ... // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // // where tx = numXTiles(lx), // and ty = numYTiles(ly). // // DECREASING_Y As for INCREASING_Y, the tiles for each level // are stored in a contiguous block. The levels // are ordered the same way as for INCREASING_Y, // but within an individual level, the tiles // are stored in this order: // // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // ... // (0, 1) (1, 1) ... (tx-1, 1) // (0, 0) (1, 0) ... (tx-1, 0) // // // RANDOM_Y The order of the calls to writeTile() determines // the order of the tiles in the file. // //------------------------------------------------------------------ IMF_EXPORT void writeTile (int dx, int dy, int l = 0); IMF_EXPORT void writeTile (int dx, int dy, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //------------------------------------------------------------------ // Shortcut to copy all pixels from a TiledInputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the TiledInputFile's // header: The two header's "dataWindow", "compression", // "lineOrder", "channels", and "tiles" attributes must be the same. //------------------------------------------------------------------ IMF_EXPORT void copyPixels (DeepTiledInputFile &in); IMF_EXPORT void copyPixels (DeepTiledInputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few tiles at a time, // while the image is being generated. Since the preview image // is an attribute in the file's header, it gets stored in the // file as soon as the file is opened, but we may not know what // the preview image should look like until we have written the // last tile of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); //------------------------------------------------------------- // Break a tile -- for testing and debugging only: // // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the // output file by writing n copies of character c, starting // p bytes from the beginning of the tile with tile coordinates // (dx, dy) and level number (lx, ly). // // Warning: Calling this function usually results in a broken // image file. The file or parts of it may not be readable, // or the file may contain bad data. // //------------------------------------------------------------- IMF_EXPORT void breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c); struct Data; private: // ---------------------------------------------------------------- // A constructor attaches the OutputStreamMutex to the // given one from MultiPartOutputFile. Set the previewPosition // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. // ---------------------------------------------------------------- DeepTiledOutputFile (const OutputPartData* part); DeepTiledOutputFile (const DeepTiledOutputFile &) = delete; DeepTiledOutputFile & operator = (const DeepTiledOutputFile &) = delete; DeepTiledOutputFile (DeepTiledOutputFile &&) = delete; DeepTiledOutputFile & operator = (DeepTiledOutputFile &&) = delete; void initialize (const Header &header); bool isValidTile (int dx, int dy, int lx, int ly) const; size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; Data * _data; friend class MultiPartOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp000066400000000000000000000125011406177042200227130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfDeepTiledOutputPart.h" #include "ImfMultiPartOutputFile.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER DeepTiledOutputPart::DeepTiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) { file = multiPartFile.getOutputPart(partNumber); } const char * DeepTiledOutputPart::fileName () const { return file->fileName(); } const Header & DeepTiledOutputPart::header () const { return file->header(); } void DeepTiledOutputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const DeepFrameBuffer & DeepTiledOutputPart::frameBuffer () const { return file->frameBuffer(); } unsigned int DeepTiledOutputPart::tileXSize () const { return file->tileXSize(); } unsigned int DeepTiledOutputPart::tileYSize () const { return file->tileYSize(); } LevelMode DeepTiledOutputPart::levelMode () const { return file->levelMode(); } LevelRoundingMode DeepTiledOutputPart::levelRoundingMode () const { return file->levelRoundingMode(); } int DeepTiledOutputPart::numLevels () const { return file->numLevels(); } int DeepTiledOutputPart::numXLevels () const { return file->numXLevels(); } int DeepTiledOutputPart::numYLevels () const { return file->numYLevels(); } bool DeepTiledOutputPart::isValidLevel (int lx, int ly) const { return file->isValidLevel(lx, ly); } int DeepTiledOutputPart::levelWidth (int lx) const { return file->levelWidth(lx); } int DeepTiledOutputPart::levelHeight (int ly) const { return file->levelHeight(ly); } int DeepTiledOutputPart::numXTiles (int lx) const { return file->numXTiles(lx); } int DeepTiledOutputPart::numYTiles (int ly) const { return file->numYTiles(ly); } IMATH_NAMESPACE::Box2i DeepTiledOutputPart::dataWindowForLevel (int l) const { return file->dataWindowForLevel(l); } IMATH_NAMESPACE::Box2i DeepTiledOutputPart::dataWindowForLevel (int lx, int ly) const { return file->dataWindowForLevel(lx, ly); } IMATH_NAMESPACE::Box2i DeepTiledOutputPart::dataWindowForTile (int dx, int dy, int l) const { return file->dataWindowForTile(dx, dy, l); } IMATH_NAMESPACE::Box2i DeepTiledOutputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const { return file->dataWindowForTile(dx, dy, lx, ly); } void DeepTiledOutputPart::writeTile (int dx, int dy, int l) { file->writeTile(dx, dy, l); } void DeepTiledOutputPart::writeTile (int dx, int dy, int lx, int ly) { file->writeTile(dx, dy, lx, ly); } void DeepTiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { file->writeTiles(dx1, dx2, dy1, dy2, lx, ly); } void DeepTiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int l) { file->writeTiles(dx1, dx2, dy1, dy2, l); } void DeepTiledOutputPart::copyPixels (DeepTiledInputFile &in) { file->copyPixels(in); } void DeepTiledOutputPart::copyPixels (DeepTiledInputPart &in) { file->copyPixels(in); } void DeepTiledOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) { file->updatePreviewImage(newPixels); } void DeepTiledOutputPart::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) { file->breakTile(dx, dy, lx, ly, offset, length, c); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h000066400000000000000000000363701406177042200223720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFDEEPTILEDOUTPUTPART_H_ #define IMFDEEPTILEDOUTPUTPART_H_ #include "ImfForward.h" #include "ImfDeepTiledInputFile.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DeepTiledOutputPart { public: IMF_EXPORT DeepTiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledOutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writeTile() is // called. The current frame buffer can be changed // after each call to writeTile(). //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const DeepFrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const DeepFrameBuffer & frameBuffer () const; //------------------- // Utility functions: //------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with MIPMAP_LEVELS // files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; //--------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //--------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //---------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //---------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a level with // level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------------ // Write pixel data: // // writeTile(dx, dy, lx, ly) writes the tile with tile // coordinates (dx, dy), and level number (lx, ly) to // the file. // // dx must lie in the interval [0, numXTiles(lx) - 1] // dy must lie in the interval [0, numYTiles(ly) - 1] // // lx must lie in the interval [0, numXLevels() - 1] // ly must lie in the inverval [0, numYLevels() - 1] // // writeTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls // writeTile(dx, dy, level, level). // // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow // writing multiple tiles at once. If multi-threading is used // multiple tiles are written concurrently. The tile coordinates, // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the // tiles are always written in the order specified by the line // order attribute. Hence, it is not possible to specify an // "invalid" or empty tile range. // // Pixels that are outside the pixel coordinate range for the tile's // level, are never accessed by writeTile(). // // Each tile in the file must be written exactly once. // // The file's line order attribute determines the order of the tiles // in the file: // // INCREASING_Y In the file, the tiles for each level are stored // in a contiguous block. The levels are ordered // like this: // // (0, 0) (1, 0) ... (nx-1, 0) // (0, 1) (1, 1) ... (nx-1, 1) // ... // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) // // where nx = numXLevels(), and ny = numYLevels(). // In an individual level, (lx, ly), the tiles // are stored in the following order: // // (0, 0) (1, 0) ... (tx-1, 0) // (0, 1) (1, 1) ... (tx-1, 1) // ... // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // // where tx = numXTiles(lx), // and ty = numYTiles(ly). // // DECREASING_Y As for INCREASING_Y, the tiles for each level // are stored in a contiguous block. The levels // are ordered the same way as for INCREASING_Y, // but within an individual level, the tiles // are stored in this order: // // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // ... // (0, 1) (1, 1) ... (tx-1, 1) // (0, 0) (1, 0) ... (tx-1, 0) // // // RANDOM_Y The order of the calls to writeTile() determines // the order of the tiles in the file. // //------------------------------------------------------------------ IMF_EXPORT void writeTile (int dx, int dy, int l = 0); IMF_EXPORT void writeTile (int dx, int dy, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //------------------------------------------------------------------ // Shortcut to copy all pixels from a TiledInputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the TiledInputFile's // header: The two header's "dataWindow", "compression", // "lineOrder", "channels", and "tiles" attributes must be the same. //------------------------------------------------------------------ IMF_EXPORT void copyPixels (DeepTiledInputFile &in); IMF_EXPORT void copyPixels (DeepTiledInputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few tiles at a time, // while the image is being generated. Since the preview image // is an attribute in the file's header, it gets stored in the // file as soon as the file is opened, but we may not know what // the preview image should look like until we have written the // last tile of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); //------------------------------------------------------------- // Break a tile -- for testing and debugging only: // // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the // output file by writing n copies of character c, starting // p bytes from the beginning of the tile with tile coordinates // (dx, dy) and level number (lx, ly). // // Warning: Calling this function usually results in a broken // image file. The file or parts of it may not be readable, // or the file may contain bad data. // //------------------------------------------------------------- IMF_EXPORT void breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c); private: DeepTiledOutputFile* file; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFDEEPTILEDOUTPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfDoubleAttribute.cpp000066400000000000000000000042311406177042200221030ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class DoubleAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER template <> const char * DoubleAttribute::staticTypeName () { return "double"; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDoubleAttribute.h000066400000000000000000000044441406177042200215560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DOUBLE_ATTRIBUTE_H #define INCLUDED_IMF_DOUBLE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class DoubleAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute DoubleAttribute; template <> IMF_EXPORT const char *DoubleAttribute::staticTypeName (); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDwaCompressor.cpp000066400000000000000000003175361406177042200216140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //--------------------------------------------------- // // class DwaCompressor -- Store lossy RGB data by quantizing // DCT components. // // First, we try and figure out what compression strategy to take // based in channel name. For RGB channels, we want a lossy method // described below. But, if we have alpha, we should do something // different (and probably using RLE). If we have depth, or velocity, // or something else, just fall back to ZIP. The rules for deciding // which strategy to use are setup in initializeDefaultChannelRules(). // When writing a file, the relevant rules needed to decode are written // into the start of the data block, making a self-contained file. // If initializeDefaultChannelRules() doesn't quite suite your naming // conventions, you can adjust the rules without breaking decoder // compatability. // // If we're going to lossy compress R, G, or B channels, it's easier // to toss bits in a more perceptual uniform space. One could argue // at length as to what constitutes perceptually uniform, expecially // when storing either scene/input/focal plane referred and output referred // data. // // We'll compromise. For values <= 1, we use a traditional power function // (without any of that straight-line business at the bottom). For values > 1, // we want something more like a log function, since power functions blow // up. At 1, we want a smooth blend between the functions. So, we use a // piecewise function that does just that - see dwaLookups.cpp for // a little more detail. // // Also, if we find that we have R, G, and B channels from the same layer, // we can get a bit more compression efficiency by transforming to a Y'CbCr // space. We use the 709 transform, but with Cb,Cr = 0 for an input of // (0, 0, 0), instead of the traditional Cb,Cr = .5. Shifting the zero point // makes no sense with large range data. Transforms are done to from // the perceptual space data, not the linear-light space data (R'G'B' -> // (Y'CbCr, not RGB -> YCbCr). // // Next, we forward DCT the data. This is done with a floating // point DCT, as we don't really have control over the src range. The // resulting values are dropped to half-float precision. // // Now, we need to quantize. Quantization departs from the usual way // of dividing and rounding. Instead, we start with some floating // point "base-error" value. From this, we can derive quantization // error for each DCT component. Take the standard JPEG quantization // tables and normalize them by the smallest value. Then, multiply // the normalized quant tables by our base-error value. This gives // a range of errors for each DCT component. // // For each DCT component, we want to find a quantized value that // is within +- the per-component error. Pick the quantized value // that has the fewest bits set in its' binary representation. // Brute-forcing the search would make for extremly inefficient // compression. Fortunatly, we can precompute a table to assist // with this search. // // For each 16-bit float value, there are at most 15 other values with // fewer bits set. We can precompute these values in a compact form, since // many source values have far fewer that 15 possible quantized values. // Now, instead of searching the entire range +- the component error, // we can just search at most 15 quantization candidates. The search can // be accelerated a bit more by sorting the candidates by the // number of bits set, in increasing order. Then, the search can stop // once a candidate is found w/i the per-component quantization // error range. // // The quantization strategy has the side-benefit that there is no // de-quantization step upon decode, so we don't bother recording // the quantization table. // // Ok. So we now have quantized values. Time for entropy coding. We // can use either static Huffman or zlib/DEFLATE. The static Huffman // is more efficient at compacting data, but can have a greater // overhead, especially for smaller tile/strip sizes. // // There is some additional fun, like ZIP compressing the DC components // instead of Huffman/zlib, which helps make things slightly smaller. // // Compression level is controlled by setting an int/float/double attribute // on the header named "dwaCompressionLevel". This is a thinly veiled name for // the "base-error" value mentioned above. The "base-error" is just // dwaCompressionLevel / 100000. The default value of 45.0 is generally // pretty good at generating "visually lossless" values at reasonable // data rates. Setting dwaCompressionLevel to 0 should result in no additional // quantization at the quantization stage (though there may be // quantization in practice at the CSC/DCT steps). But if you really // want lossless compression, there are pleanty of other choices // of compressors ;) // // When dealing with FLOAT source buffers, we first quantize the source // to HALF and continue down as we would for HALF source. // //--------------------------------------------------- #include "ImfDwaCompressor.h" #include "ImfDwaCompressorSimd.h" #include "ImfChannelList.h" #include "ImfStandardAttributes.h" #include "ImfHeader.h" #include "ImfHuf.h" #include "ImfInt64.h" #include "ImfIntAttribute.h" #include "ImfIO.h" #include "ImfMisc.h" #include "ImfNamespace.h" #include "ImfRle.h" #include "ImfSimd.h" #include "ImfSystemSpecific.h" #include "ImfXdr.h" #include "ImfZip.h" #include "ImathFun.h" #include "ImathBox.h" #include "ImathVec.h" #include "half.h" #include "halfLimits.h" #include #include #include #include #include #include #include // Windows specific addition to prevent the indirect import of the redefined min/max macros #if defined _WIN32 || defined _WIN64 #ifdef NOMINMAX #undef NOMINMAX #endif #define NOMINMAX #endif #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER #include "dwaLookups.h" namespace { // // Function pointer to dispatch to an approprate // convertFloatToHalf64_* impl, based on runtime cpu checking. // Should be initialized in DwaCompressor::initializeFuncs() // void (*convertFloatToHalf64)(unsigned short*, float*) = convertFloatToHalf64_scalar; // // Function pointer for dispatching a fromHalfZigZag_ impl // void (*fromHalfZigZag)(unsigned short*, float*) = fromHalfZigZag_scalar; // // Dispatch the inverse DCT on an 8x8 block, where the last // n rows can be all zeros. The n=0 case converts the full block. // void (*dctInverse8x8_0)(float*) = dctInverse8x8_scalar<0>; void (*dctInverse8x8_1)(float*) = dctInverse8x8_scalar<1>; void (*dctInverse8x8_2)(float*) = dctInverse8x8_scalar<2>; void (*dctInverse8x8_3)(float*) = dctInverse8x8_scalar<3>; void (*dctInverse8x8_4)(float*) = dctInverse8x8_scalar<4>; void (*dctInverse8x8_5)(float*) = dctInverse8x8_scalar<5>; void (*dctInverse8x8_6)(float*) = dctInverse8x8_scalar<6>; void (*dctInverse8x8_7)(float*) = dctInverse8x8_scalar<7>; } // namespace struct DwaCompressor::ChannelData { std::string name; CompressorScheme compression; int xSampling; int ySampling; PixelType type; bool pLinear; int width; int height; // // Incoming and outgoing data is scanline interleaved, and it's much // easier to operate on contiguous data. Assuming the planare unc // buffer is to hold RLE data, we need to rearrange to make bytes // adjacent. // char *planarUncBuffer; char *planarUncBufferEnd; char *planarUncRle[4]; char *planarUncRleEnd[4]; PixelType planarUncType; int planarUncSize; }; struct DwaCompressor::CscChannelSet { int idx[3]; }; struct DwaCompressor::Classifier { Classifier (std::string suffix, CompressorScheme scheme, PixelType type, int cscIdx, bool caseInsensitive): _suffix(suffix), _scheme(scheme), _type(type), _cscIdx(cscIdx), _caseInsensitive(caseInsensitive) { if (caseInsensitive) std::transform(_suffix.begin(), _suffix.end(), _suffix.begin(), tolower); } Classifier (const char *&ptr, int size) { if (size <= 0) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (truncated rule)."); { // maximum length of string plus one byte for terminating NULL char suffix[Name::SIZE+1]; memset (suffix, 0, Name::SIZE+1); Xdr::read (ptr, std::min(size, Name::SIZE-1), suffix); _suffix = std::string(suffix); } if (static_cast(size) < _suffix.length() + 1 + 2*Xdr::size()) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (truncated rule)."); char value; Xdr::read (ptr, value); _cscIdx = (int)(value >> 4) - 1; if (_cscIdx < -1 || _cscIdx >= 3) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (corrupt cscIdx rule)."); _scheme = (CompressorScheme)((value >> 2) & 3); if (_scheme < 0 || _scheme >= NUM_COMPRESSOR_SCHEMES) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (corrupt scheme rule)."); _caseInsensitive = (value & 1 ? true : false); Xdr::read (ptr, value); if (value < 0 || value >= NUM_PIXELTYPES) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (corrupt rule)."); _type = (PixelType)value; } bool match (const std::string &suffix, const PixelType type) const { if (_type != type) return false; if (_caseInsensitive) { std::string tmp(suffix); std::transform(tmp.begin(), tmp.end(), tmp.begin(), tolower); return tmp == _suffix; } return suffix == _suffix; } size_t size () const { // string length + \0 size_t sizeBytes = _suffix.length() + 1; // 1 byte for scheme / cscIdx / caseInsensitive, and 1 byte for type sizeBytes += 2 * Xdr::size(); return sizeBytes; } void write (char *&ptr) const { Xdr::write (ptr, _suffix.c_str()); // Encode _cscIdx (-1-3) in the upper 4 bits, // _scheme (0-2) in the next 2 bits // _caseInsen in the bottom bit unsigned char value = 0; value |= ((unsigned char)(_cscIdx+1) & 15) << 4; value |= ((unsigned char)_scheme & 3) << 2; value |= (unsigned char)_caseInsensitive & 1; Xdr::write (ptr, value); Xdr::write (ptr, (unsigned char)_type); } std::string _suffix; CompressorScheme _scheme; PixelType _type; int _cscIdx; bool _caseInsensitive; }; // // Base class for the LOSSY_DCT decoder classes // class DwaCompressor::LossyDctDecoderBase { public: LossyDctDecoderBase (char *packedAc, char *packedDc, const unsigned short *toLinear, int width, int height); virtual ~LossyDctDecoderBase (); void execute(); // // These return number of items, not bytes. Each item // is an unsigned short // int numAcValuesEncoded() const { return _packedAcCount; } int numDcValuesEncoded() const { return _packedDcCount; } protected: // // Un-RLE the packed AC components into // a half buffer. The half block should // be the full 8x8 block (in zig-zag order // still), not the first AC component. // // currAcComp is advanced as bytes are decoded. // // This returns the index of the last non-zero // value in the buffer - with the index into zig zag // order data. If we return 0, we have DC only data. // int unRleAc (unsigned short *&currAcComp, unsigned short *halfZigBlock); // // if NATIVE and XDR are really the same values, we can // skip some processing and speed things along // bool _isNativeXdr; // // Counts of how many items have been packed into the // AC and DC buffers // int _packedAcCount; int _packedDcCount; // // AC and DC buffers to pack // char *_packedAc; char *_packedDc; // // half -> half LUT to transform from nonlinear to linear // const unsigned short *_toLinear; // // image dimensions // int _width; int _height; // // Pointers to the start of each scanlines, to be filled on decode // Generally, these will be filled by the subclasses. // std::vector< std::vector > _rowPtrs; // // The type of each data that _rowPtrs[i] is referring. Layout // is in the same order as _rowPtrs[]. // std::vector _type; std::vector _dctData; }; // // Used to decode a single channel of LOSSY_DCT data. // class DwaCompressor::LossyDctDecoder: public LossyDctDecoderBase { public: // // toLinear is a half-float LUT to convert the encoded values // back to linear light. If you want to skip this step, pass // in NULL here. // LossyDctDecoder (std::vector &rowPtrs, char *packedAc, char *packedDc, const unsigned short *toLinear, int width, int height, PixelType type) : LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height) { _rowPtrs.push_back(rowPtrs); _type.push_back(type); } virtual ~LossyDctDecoder () {} }; // // Used to decode 3 channels of LOSSY_DCT data that // are grouped together and color space converted. // class DwaCompressor::LossyDctDecoderCsc: public LossyDctDecoderBase { public: // // toLinear is a half-float LUT to convert the encoded values // back to linear light. If you want to skip this step, pass // in NULL here. // LossyDctDecoderCsc (std::vector &rowPtrsR, std::vector &rowPtrsG, std::vector &rowPtrsB, char *packedAc, char *packedDc, const unsigned short *toLinear, int width, int height, PixelType typeR, PixelType typeG, PixelType typeB) : LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height) { _rowPtrs.push_back(rowPtrsR); _rowPtrs.push_back(rowPtrsG); _rowPtrs.push_back(rowPtrsB); _type.push_back(typeR); _type.push_back(typeG); _type.push_back(typeB); } virtual ~LossyDctDecoderCsc () {} }; // // Base class for encoding using the lossy DCT scheme // class DwaCompressor::LossyDctEncoderBase { public: LossyDctEncoderBase (float quantBaseError, char *packedAc, char *packedDc, const unsigned short *toNonlinear, int width, int height); virtual ~LossyDctEncoderBase (); void execute (); // // These return number of items, not bytes. Each item // is an unsigned short // int numAcValuesEncoded () const {return _numAcComp;} int numDcValuesEncoded () const {return _numDcComp;} protected: void toZigZag (half *dst, half *src); int countSetBits (unsigned short src); half quantize (half src, float errorTolerance); void rleAc (half *block, unsigned short *&acPtr); float _quantBaseError; int _width, _height; const unsigned short *_toNonlinear; int _numAcComp, _numDcComp; std::vector< std::vector > _rowPtrs; std::vector _type; std::vector _dctData; // // Pointers to the buffers where AC and DC // DCT components should be packed for // lossless compression downstream // char *_packedAc; char *_packedDc; // // Our "quantization tables" - the example JPEG tables, // normalized so that the smallest value in each is 1.0. // This gives us a relationship between error in DCT // components // float _quantTableY[64]; float _quantTableCbCr[64]; }; // // Single channel lossy DCT encoder // class DwaCompressor::LossyDctEncoder: public LossyDctEncoderBase { public: LossyDctEncoder (float quantBaseError, std::vector &rowPtrs, char *packedAc, char *packedDc, const unsigned short *toNonlinear, int width, int height, PixelType type) : LossyDctEncoderBase (quantBaseError, packedAc, packedDc, toNonlinear, width, height) { _rowPtrs.push_back(rowPtrs); _type.push_back(type); } virtual ~LossyDctEncoder () {} }; // // RGB channel lossy DCT encoder // class DwaCompressor::LossyDctEncoderCsc: public LossyDctEncoderBase { public: LossyDctEncoderCsc (float quantBaseError, std::vector &rowPtrsR, std::vector &rowPtrsG, std::vector &rowPtrsB, char *packedAc, char *packedDc, const unsigned short *toNonlinear, int width, int height, PixelType typeR, PixelType typeG, PixelType typeB) : LossyDctEncoderBase (quantBaseError, packedAc, packedDc, toNonlinear, width, height) { _type.push_back(typeR); _type.push_back(typeG); _type.push_back(typeB); _rowPtrs.push_back(rowPtrsR); _rowPtrs.push_back(rowPtrsG); _rowPtrs.push_back(rowPtrsB); } virtual ~LossyDctEncoderCsc () {} }; // ============================================================== // // LossyDctDecoderBase // // -------------------------------------------------------------- DwaCompressor::LossyDctDecoderBase::LossyDctDecoderBase (char *packedAc, char *packedDc, const unsigned short *toLinear, int width, int height) : _isNativeXdr(false), _packedAcCount(0), _packedDcCount(0), _packedAc(packedAc), _packedDc(packedDc), _toLinear(toLinear), _width(width), _height(height) { if (_toLinear == 0) _toLinear = dwaCompressorNoOp; _isNativeXdr = GLOBAL_SYSTEM_LITTLE_ENDIAN; } DwaCompressor::LossyDctDecoderBase::~LossyDctDecoderBase () {} void DwaCompressor::LossyDctDecoderBase::execute () { size_t numComp = _rowPtrs.size(); int lastNonZero = 0; int numBlocksX = (int) ceil ((float)_width / 8.0f); int numBlocksY = (int) ceil ((float)_height / 8.0f); int leftoverX = _width - (numBlocksX-1) * 8; int leftoverY = _height - (numBlocksY-1) * 8; int numFullBlocksX = (int)floor ((float)_width / 8.0f); unsigned short tmpShortNative = 0; unsigned short tmpShortXdr = 0; const char *tmpConstCharPtr = 0; unsigned short *currAcComp = (unsigned short *)_packedAc; std::vector currDcComp (_rowPtrs.size()); std::vector halfZigBlock (_rowPtrs.size()); if (_type.size() != _rowPtrs.size()) throw IEX_NAMESPACE::BaseExc ("Row pointers and types mismatch in count"); if ((_rowPtrs.size() != 3) && (_rowPtrs.size() != 1)) throw IEX_NAMESPACE::NoImplExc ("Only 1 and 3 channel encoding is supported"); _dctData.resize(numComp); // // Allocate a temp aligned buffer to hold a rows worth of full // 8x8 half-float blocks // unsigned char *rowBlockHandle = new unsigned char [numComp * numBlocksX * 64 * sizeof(unsigned short) + _SSE_ALIGNMENT]; unsigned short *rowBlock[3]; rowBlock[0] = (unsigned short*)rowBlockHandle; for (int i = 0; i < _SSE_ALIGNMENT; ++i) { if ((reinterpret_cast(rowBlockHandle + i) & _SSE_ALIGNMENT_MASK) == 0) rowBlock[0] = (unsigned short *)(rowBlockHandle + i); } for (size_t comp = 1; comp < numComp; ++comp) rowBlock[comp] = rowBlock[comp - 1] + numBlocksX * 64; // // Pack DC components together by common plane, so we can get // a little more out of differencing them. We'll always have // one component per block, so we can computed offsets. // currDcComp[0] = (unsigned short *)_packedDc; for (size_t comp = 1; comp < numComp; ++comp) currDcComp[comp] = currDcComp[comp - 1] + numBlocksX * numBlocksY; for (int blocky = 0; blocky < numBlocksY; ++blocky) { int maxY = 8; if (blocky == numBlocksY-1) maxY = leftoverY; int maxX = 8; for (int blockx = 0; blockx < numBlocksX; ++blockx) { if (blockx == numBlocksX-1) maxX = leftoverX; // // If we can detect that the block is constant values // (all components only have DC values, and all AC is 0), // we can do everything only on 1 value, instead of all // 64. // // This won't really help for regular images, but it is // meant more for layers with large swaths of black // bool blockIsConstant = true; for (size_t comp = 0; comp < numComp; ++comp) { // // DC component is stored separately // #ifdef IMF_HAVE_SSE2 { __m128i *dst = (__m128i*)halfZigBlock[comp]._buffer; dst[7] = _mm_setzero_si128(); dst[6] = _mm_setzero_si128(); dst[5] = _mm_setzero_si128(); dst[4] = _mm_setzero_si128(); dst[3] = _mm_setzero_si128(); dst[2] = _mm_setzero_si128(); dst[1] = _mm_setzero_si128(); dst[0] = _mm_insert_epi16 (_mm_setzero_si128(), *currDcComp[comp]++, 0); } #else /* IMF_HAVE_SSE2 */ memset (halfZigBlock[comp]._buffer, 0, 64 * 2); halfZigBlock[comp]._buffer[0] = *currDcComp[comp]++; #endif /* IMF_HAVE_SSE2 */ _packedDcCount++; // // UnRLE the AC. This will modify currAcComp // lastNonZero = unRleAc (currAcComp, halfZigBlock[comp]._buffer); // // Convert from XDR to NATIVE // if (!_isNativeXdr) { for (int i = 0; i < 64; ++i) { tmpShortXdr = halfZigBlock[comp]._buffer[i]; tmpConstCharPtr = (const char *)&tmpShortXdr; Xdr::read (tmpConstCharPtr, tmpShortNative); halfZigBlock[comp]._buffer[i] = tmpShortNative; } } if (lastNonZero == 0) { // // DC only case - AC components are all 0 // half h; h.setBits (halfZigBlock[comp]._buffer[0]); _dctData[comp]._buffer[0] = (float)h; dctInverse8x8DcOnly (_dctData[comp]._buffer); } else { // // We have some AC components that are non-zero. // Can't use the 'constant block' optimization // blockIsConstant = false; // // Un-Zig zag // (*fromHalfZigZag) (halfZigBlock[comp]._buffer, _dctData[comp]._buffer); // // Zig-Zag indices in normal layout are as follows: // // 0 1 5 6 14 15 27 28 // 2 4 7 13 16 26 29 42 // 3 8 12 17 25 30 41 43 // 9 11 18 24 31 40 44 53 // 10 19 23 32 39 45 52 54 // 20 22 33 38 46 51 55 60 // 21 34 37 47 50 56 59 61 // 35 36 48 49 57 58 62 63 // // If lastNonZero is less than the first item on // each row, we know that the whole row is zero and // can be skipped in the row-oriented part of the // iDCT. // // The unrolled logic here is: // // if lastNonZero < rowStartIdx[i], // zeroedRows = rowsEmpty[i] // // where: // // const int rowStartIdx[] = {2, 3, 9, 10, 20, 21, 35}; // const int rowsEmpty[] = {7, 6, 5, 4, 3, 2, 1}; // if (lastNonZero < 2) dctInverse8x8_7(_dctData[comp]._buffer); else if (lastNonZero < 3) dctInverse8x8_6(_dctData[comp]._buffer); else if (lastNonZero < 9) dctInverse8x8_5(_dctData[comp]._buffer); else if (lastNonZero < 10) dctInverse8x8_4(_dctData[comp]._buffer); else if (lastNonZero < 20) dctInverse8x8_3(_dctData[comp]._buffer); else if (lastNonZero < 21) dctInverse8x8_2(_dctData[comp]._buffer); else if (lastNonZero < 35) dctInverse8x8_1(_dctData[comp]._buffer); else dctInverse8x8_0(_dctData[comp]._buffer); } } // // Perform the CSC // if (numComp == 3) { if (!blockIsConstant) { csc709Inverse64 (_dctData[0]._buffer, _dctData[1]._buffer, _dctData[2]._buffer); } else { csc709Inverse (_dctData[0]._buffer[0], _dctData[1]._buffer[0], _dctData[2]._buffer[0]); } } // // Float -> Half conversion. // // If the block has a constant value, just convert the first pixel. // for (size_t comp = 0; comp < numComp; ++comp) { if (!blockIsConstant) { (*convertFloatToHalf64) (&rowBlock[comp][blockx*64], _dctData[comp]._buffer); } else { #ifdef IMF_HAVE_SSE2 __m128i *dst = (__m128i*)&rowBlock[comp][blockx*64]; dst[0] = _mm_set1_epi16 (((half)_dctData[comp]._buffer[0]).bits()); dst[1] = dst[0]; dst[2] = dst[0]; dst[3] = dst[0]; dst[4] = dst[0]; dst[5] = dst[0]; dst[6] = dst[0]; dst[7] = dst[0]; #else /* IMF_HAVE_SSE2 */ unsigned short *dst = &rowBlock[comp][blockx*64]; dst[0] = ((half)_dctData[comp]._buffer[0]).bits(); for (int i = 1; i < 64; ++i) { dst[i] = dst[0]; } #endif /* IMF_HAVE_SSE2 */ } // blockIsConstant } // comp } // blockx // // At this point, we have half-float nonlinear value blocked // in rowBlock[][]. We need to unblock the data, transfer // back to linear, and write the results in the _rowPtrs[]. // // There is a fast-path for aligned rows, which helps // things a little. Since this fast path is only valid // for full 8-element wide blocks, the partial x blocks // are broken into a separate loop below. // // At the moment, the fast path requires: // * sse support // * aligned row pointers // * full 8-element wide blocks // for (size_t comp = 0; comp < numComp; ++comp) { // // Test if we can use the fast path // #ifdef IMF_HAVE_SSE2 bool fastPath = true; for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) { if (reinterpret_cast(_rowPtrs[comp][y]) & _SSE_ALIGNMENT_MASK) fastPath = false; } if (fastPath) { // // Handle all the full X blocks, in a fast path with sse2 and // aligned row pointers // for (int y=8*blocky; y<8*blocky+maxY; ++y) { __m128i *dst = (__m128i *)_rowPtrs[comp][y]; __m128i *src = (__m128i *)&rowBlock[comp][(y & 0x7) * 8]; for (int blockx = 0; blockx < numFullBlocksX; ++blockx) { // // These may need some twiddling. // Run with multiples of 8 // _mm_prefetch ((char *)(src + 16), _MM_HINT_NTA); unsigned short i0 = _mm_extract_epi16 (*src, 0); unsigned short i1 = _mm_extract_epi16 (*src, 1); unsigned short i2 = _mm_extract_epi16 (*src, 2); unsigned short i3 = _mm_extract_epi16 (*src, 3); unsigned short i4 = _mm_extract_epi16 (*src, 4); unsigned short i5 = _mm_extract_epi16 (*src, 5); unsigned short i6 = _mm_extract_epi16 (*src, 6); unsigned short i7 = _mm_extract_epi16 (*src, 7); i0 = _toLinear[i0]; i1 = _toLinear[i1]; i2 = _toLinear[i2]; i3 = _toLinear[i3]; i4 = _toLinear[i4]; i5 = _toLinear[i5]; i6 = _toLinear[i6]; i7 = _toLinear[i7]; *dst = _mm_insert_epi16 (_mm_setzero_si128(), i0, 0); *dst = _mm_insert_epi16 (*dst, i1, 1); *dst = _mm_insert_epi16 (*dst, i2, 2); *dst = _mm_insert_epi16 (*dst, i3, 3); *dst = _mm_insert_epi16 (*dst, i4, 4); *dst = _mm_insert_epi16 (*dst, i5, 5); *dst = _mm_insert_epi16 (*dst, i6, 6); *dst = _mm_insert_epi16 (*dst, i7, 7); src += 8; dst++; } } } else { #endif /* IMF_HAVE_SSE2 */ // // Basic scalar kinda slow path for handling the full X blocks // for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) { unsigned short *dst = (unsigned short *)_rowPtrs[comp][y]; for (int blockx = 0; blockx < numFullBlocksX; ++blockx) { unsigned short *src = &rowBlock[comp][blockx * 64 + ((y & 0x7) * 8)]; dst[0] = _toLinear[src[0]]; dst[1] = _toLinear[src[1]]; dst[2] = _toLinear[src[2]]; dst[3] = _toLinear[src[3]]; dst[4] = _toLinear[src[4]]; dst[5] = _toLinear[src[5]]; dst[6] = _toLinear[src[6]]; dst[7] = _toLinear[src[7]]; dst += 8; } } #ifdef IMF_HAVE_SSE2 } #endif /* IMF_HAVE_SSE2 */ // // If we have partial X blocks, deal with all those now // Since this should be minimal work, there currently // is only one path that should work for everyone. // if (numFullBlocksX != numBlocksX) { for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) { unsigned short *src = (unsigned short *) &rowBlock[comp][numFullBlocksX * 64 + ((y & 0x7) * 8)]; unsigned short *dst = (unsigned short *)_rowPtrs[comp][y]; dst += 8 * numFullBlocksX; for (int x = 0; x < maxX; ++x) { *dst++ = _toLinear[*src++]; } } } } // comp } // blocky // // Walk over all the channels that are of type FLOAT. // Convert from HALF XDR back to FLOAT XDR. // for (size_t chan = 0; chan < numComp; ++chan) { if (_type[chan] != FLOAT) continue; std::vector halfXdr (_width); for (int y=0; y<_height; ++y) { char *floatXdrPtr = _rowPtrs[chan][y]; memcpy(&halfXdr[0], floatXdrPtr, _width*sizeof(unsigned short)); const char *halfXdrPtr = (const char *)(&halfXdr[0]); for (int x=0; x<_width; ++x) { half tmpHalf; Xdr::read (halfXdrPtr, tmpHalf); Xdr::write (floatXdrPtr, (float)tmpHalf); // // Xdr::write and Xdr::read will advance the ptrs // } } } delete[] rowBlockHandle; } // // Un-RLE the packed AC components into // a half buffer. The half block should // be the full 8x8 block (in zig-zag order // still), not the first AC component. // // currAcComp is advanced as bytes are decoded. // // This returns the index of the last non-zero // value in the buffer - with the index into zig zag // order data. If we return 0, we have DC only data. // // This is assuminging that halfZigBlock is zero'ed // prior to calling // int DwaCompressor::LossyDctDecoderBase::unRleAc (unsigned short *&currAcComp, unsigned short *halfZigBlock) { // // Un-RLE the RLE'd blocks. If we find an item whose // high byte is 0xff, then insert the number of 0's // as indicated by the low byte. // // Otherwise, just copy the number verbaitm. // int lastNonZero = 0; int dctComp = 1; // // Start with a zero'ed block, so we don't have to // write when we hit a run symbol // while (dctComp < 64) { if (*currAcComp == 0xff00) { // // End of block // dctComp = 64; } else if ((*currAcComp) >> 8 == 0xff) { // // Run detected! Insert 0's. // // Since the block has been zeroed, just advance the ptr // dctComp += (*currAcComp) & 0xff; } else { // // Not a run, just copy over the value // lastNonZero = dctComp; halfZigBlock[dctComp] = *currAcComp; dctComp++; } _packedAcCount++; currAcComp++; } return lastNonZero; } // ============================================================== // // LossyDctEncoderBase // // -------------------------------------------------------------- DwaCompressor::LossyDctEncoderBase::LossyDctEncoderBase (float quantBaseError, char *packedAc, char *packedDc, const unsigned short *toNonlinear, int width, int height) : _quantBaseError(quantBaseError), _width(width), _height(height), _toNonlinear(toNonlinear), _numAcComp(0), _numDcComp(0), _packedAc(packedAc), _packedDc(packedDc) { // // Here, we take the generic JPEG quantization tables and // normalize them by the smallest component in each table. // This gives us a relationship amongst the DCT components, // in terms of how sensitive each component is to // error. // // A higher normalized value means we can quantize more, // and a small normalized value means we can quantize less. // // Eventually, we will want an acceptable quantization // error range for each component. We find this by // multiplying some user-specified level (_quantBaseError) // by the normalized table (_quantTableY, _quantTableCbCr) to // find the acceptable quantization error range. // // The quantization table is not needed for decoding, and // is not transmitted. So, if you want to get really fancy, // you could derive some content-dependent quantization // table, and the decoder would not need to be changed. But, // for now, we'll just use statice quantization tables. // int jpegQuantTableY[] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 }; int jpegQuantTableYMin = 10; int jpegQuantTableCbCr[] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; int jpegQuantTableCbCrMin = 17; for (int idx = 0; idx < 64; ++idx) { _quantTableY[idx] = static_cast (jpegQuantTableY[idx]) / static_cast (jpegQuantTableYMin); _quantTableCbCr[idx] = static_cast (jpegQuantTableCbCr[idx]) / static_cast (jpegQuantTableCbCrMin); } if (_quantBaseError < 0) quantBaseError = 0; } DwaCompressor::LossyDctEncoderBase::~LossyDctEncoderBase () { } // // Given three channels of source data, encoding by first applying // a color space conversion to a YCbCr space. Otherwise, if we only // have one channel, just encode it as is. // // Other numbers of channels are somewhat unexpected at this point, // and will throw an exception. // void DwaCompressor::LossyDctEncoderBase::execute () { int numBlocksX = (int)ceil ((float)_width / 8.0f); int numBlocksY = (int)ceil ((float)_height/ 8.0f); half halfZigCoef[64]; half halfCoef[64]; std::vector currDcComp (_rowPtrs.size()); unsigned short *currAcComp = (unsigned short *)_packedAc; _dctData.resize (_rowPtrs.size()); _numAcComp = 0; _numDcComp = 0; assert (_type.size() == _rowPtrs.size()); assert ((_rowPtrs.size() == 3) || (_rowPtrs.size() == 1)); // // Allocate a temp half buffer to quantize into for // any FLOAT source channels. // int tmpHalfBufferElements = 0; for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) if (_type[chan] == FLOAT) tmpHalfBufferElements += _width * _height; std::vector tmpHalfBuffer (tmpHalfBufferElements); char *tmpHalfBufferPtr = 0; if (tmpHalfBufferElements) tmpHalfBufferPtr = (char *)&tmpHalfBuffer[0]; // // Run over all the float scanlines, quantizing, // and re-assigning _rowPtr[y]. We need to translate // FLOAT XDR to HALF XDR. // for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) { if (_type[chan] != FLOAT) continue; for (int y = 0; y < _height; ++y) { float src = 0; const char *srcXdr = _rowPtrs[chan][y]; char *dstXdr = tmpHalfBufferPtr; for (int x = 0; x < _width; ++x) { Xdr::read (srcXdr, src); // // Clamp to half ranges, instead of just casting. This // avoids introducing Infs which end up getting zeroed later // src = std::max ( std::min ((float) std::numeric_limits::max(), src), (float)-std::numeric_limits::max()); Xdr::write (dstXdr, ((half)src).bits()); // // Xdr::read and Xdr::write will advance the ptr // } _rowPtrs[chan][y] = (const char *)tmpHalfBufferPtr; tmpHalfBufferPtr += _width * sizeof (unsigned short); } } // // Pack DC components together by common plane, so we can get // a little more out of differencing them. We'll always have // one component per block, so we can computed offsets. // currDcComp[0] = (unsigned short *)_packedDc; for (unsigned int chan = 1; chan < _rowPtrs.size(); ++chan) currDcComp[chan] = currDcComp[chan-1] + numBlocksX * numBlocksY; for (int blocky = 0; blocky < numBlocksY; ++blocky) { for (int blockx = 0; blockx < numBlocksX; ++blockx) { half h; unsigned short tmpShortXdr, tmpShortNative; char *tmpCharPtr; for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) { // // Break the source into 8x8 blocks. If we don't // fit at the edges, mirror. // // Also, convert from linear to nonlinear representation. // Our source is assumed to be XDR, and we need to convert // to NATIVE prior to converting to float. // // If we're converting linear -> nonlinear, assume that the // XDR -> NATIVE conversion is built into the lookup. Otherwise, // we'll need to explicitly do it. // for (int y = 0; y < 8; ++y) { for (int x = 0; x < 8; ++x) { int vx = 8 * blockx + x; int vy = 8 * blocky + y; if (vx >= _width) vx = _width - (vx - (_width - 1)); if (vx < 0) vx = _width-1; if (vy >=_height) vy = _height - (vy - (_height - 1)); if (vy < 0) vy = _height-1; tmpShortXdr = ((const unsigned short *)(_rowPtrs[chan])[vy])[vx]; if (_toNonlinear) { h.setBits (_toNonlinear[tmpShortXdr]); } else { const char *tmpConstCharPtr = (const char *)(&tmpShortXdr); Xdr::read (tmpConstCharPtr, tmpShortNative); h.setBits(tmpShortNative); } _dctData[chan]._buffer[y * 8 + x] = (float)h; } // x } // y } // chan // // Color space conversion // if (_rowPtrs.size() == 3) { csc709Forward64 (_dctData[0]._buffer, _dctData[1]._buffer, _dctData[2]._buffer); } for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) { // // Forward DCT // dctForward8x8(_dctData[chan]._buffer); // // Quantize to half, and zigzag // if (chan == 0) { for (int i = 0; i < 64; ++i) { halfCoef[i] = quantize ((half)_dctData[chan]._buffer[i], _quantBaseError*_quantTableY[i]); } } else { for (int i = 0; i < 64; ++i) { halfCoef[i] = quantize ((half)_dctData[chan]._buffer[i], _quantBaseError*_quantTableCbCr[i]); } } toZigZag (halfZigCoef, halfCoef); // // Convert from NATIVE back to XDR, before we write out // for (int i = 0; i < 64; ++i) { tmpCharPtr = (char *)&tmpShortXdr; Xdr::write(tmpCharPtr, halfZigCoef[i].bits()); halfZigCoef[i].setBits(tmpShortXdr); } // // Save the DC component separately, to be compressed on // its own. // *currDcComp[chan]++ = halfZigCoef[0].bits(); _numDcComp++; // // Then RLE the AC components (which will record the count // of the resulting number of items) // rleAc (halfZigCoef, currAcComp); } // chan } // blockx } // blocky } // // Reorder from zig-zag order to normal ordering // void DwaCompressor::LossyDctEncoderBase::toZigZag (half *dst, half *src) { const int remap[] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; for (int i=0; i<64; ++i) dst[i] = src[remap[i]]; } // // Precomputing the bit count runs faster than using // the builtin instruction, at least in one case.. // // Precomputing 8-bits is no slower than 16-bits, // and saves a fair bit of overhead.. // int DwaCompressor::LossyDctEncoderBase::countSetBits (unsigned short src) { static const unsigned short numBitsSet[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; return numBitsSet[src & 0xff] + numBitsSet[src >> 8]; } // // Take a DCT coefficient, as well as an acceptable error. Search // nearby values within the error tolerance, that have fewer // bits set. // // The list of candidates has been pre-computed and sorted // in order of increasing numbers of bits set. This way, we // can stop searching as soon as we find a candidate that // is within the error tolerance. // half DwaCompressor::LossyDctEncoderBase::quantize (half src, float errorTolerance) { half tmp; float srcFloat = (float)src; int numSetBits = countSetBits(src.bits()); const unsigned short *closest = closestData + closestDataOffset[src.bits()]; for (int targetNumSetBits = numSetBits - 1; targetNumSetBits >= 0; --targetNumSetBits) { tmp.setBits (*closest); if (fabs ((float)tmp - srcFloat) < errorTolerance) return tmp; closest++; } return src; } // // RLE the zig-zag of the AC components + copy over // into another tmp buffer // // Try to do a simple RLE scheme to reduce run's of 0's. This // differs from the jpeg EOB case, since EOB just indicates that // the rest of the block is zero. In our case, we have lots of // NaN symbols, which shouldn't be allowed to occur in DCT // coefficents - so we'll use them for encoding runs. // // If the high byte is 0xff, then we have a run of 0's, of length // given by the low byte. For example, 0xff03 would be a run // of 3 0's, starting at the current location. // // block is our block of 64 coefficients // acPtr a pointer to back the RLE'd values into. // // This will advance the counter, _numAcComp. // void DwaCompressor::LossyDctEncoderBase::rleAc (half *block, unsigned short *&acPtr) { int dctComp = 1; unsigned short rleSymbol = 0x0; while (dctComp < 64) { int runLen = 1; // // If we don't have a 0, output verbatim // if (block[dctComp].bits() != rleSymbol) { *acPtr++ = block[dctComp].bits(); _numAcComp++; dctComp += runLen; continue; } // // We're sitting on a 0, so see how big the run is. // while ((dctComp+runLen < 64) && (block[dctComp+runLen].bits() == rleSymbol)) { runLen++; } // // If the run len is too small, just output verbatim // otherwise output our run token // // Originally, we wouldn't have a separate symbol for // "end of block". But in some experimentation, it looks // like using 0xff00 for "end of block" can save a bit // of space. // if (runLen == 1) { runLen = 1; *acPtr++ = block[dctComp].bits(); _numAcComp++; // // Using 0xff00 for "end of block" // } else if (runLen + dctComp == 64) { // // Signal EOB // *acPtr++ = 0xff00; _numAcComp++; } else { // // Signal normal run // *acPtr++ = 0xff00 | runLen; _numAcComp++; } // // Advance by runLen // dctComp += runLen; } } // ============================================================== // // DwaCompressor // // -------------------------------------------------------------- // // DwaCompressor() // DwaCompressor::DwaCompressor (const Header &hdr, int maxScanLineSize, int numScanLines, AcCompression acCompression) : Compressor(hdr), _acCompression(acCompression), _maxScanLineSize(maxScanLineSize), _numScanLines(numScanLines), _channels(hdr.channels()), _packedAcBuffer(0), _packedAcBufferSize(0), _packedDcBuffer(0), _packedDcBufferSize(0), _rleBuffer(0), _rleBufferSize(0), _outBuffer(0), _outBufferSize(0), _zip(0), _dwaCompressionLevel(45.0) { _min[0] = hdr.dataWindow().min.x; _min[1] = hdr.dataWindow().min.y; _max[0] = hdr.dataWindow().max.x; _max[1] = hdr.dataWindow().max.y; for (int i=0; i < NUM_COMPRESSOR_SCHEMES; ++i) { _planarUncBuffer[i] = 0; _planarUncBufferSize[i] = 0; } // // Check the header for a quality attribute // if (hasDwaCompressionLevel (hdr)) _dwaCompressionLevel = dwaCompressionLevel (hdr); } DwaCompressor::~DwaCompressor() { delete[] _packedAcBuffer; delete[] _packedDcBuffer; delete[] _rleBuffer; delete[] _outBuffer; delete _zip; for (int i=0; i channelRules; if (fileVersion >= 2) { relevantChannelRules(channelRules); channelRuleSize = Xdr::size(); for (size_t i = 0; i < channelRules.size(); ++i) channelRuleSize += channelRules[i].size(); } // // Remember to allocate _outBuffer, if we haven't done so already. // outBufferSize += channelRuleSize; if (outBufferSize > _outBufferSize) { _outBufferSize = outBufferSize; if (_outBuffer != 0) delete[] _outBuffer; _outBuffer = new char[outBufferSize]; } char *outDataPtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(OPENEXR_IMF_NAMESPACE::Int64) + channelRuleSize]; // // We might not be dealing with any color data, in which // case the AC buffer size will be 0, and deferencing // a vector will not be a good thing to do. // if (_packedAcBuffer) packedAcEnd = _packedAcBuffer; if (_packedDcBuffer) packedDcEnd = _packedDcBuffer; #define OBIDX(x) (Int64 *)&_outBuffer[x * sizeof (Int64)] Int64 *version = OBIDX (VERSION); Int64 *unknownUncompressedSize = OBIDX (UNKNOWN_UNCOMPRESSED_SIZE); Int64 *unknownCompressedSize = OBIDX (UNKNOWN_COMPRESSED_SIZE); Int64 *acCompressedSize = OBIDX (AC_COMPRESSED_SIZE); Int64 *dcCompressedSize = OBIDX (DC_COMPRESSED_SIZE); Int64 *rleCompressedSize = OBIDX (RLE_COMPRESSED_SIZE); Int64 *rleUncompressedSize = OBIDX (RLE_UNCOMPRESSED_SIZE); Int64 *rleRawSize = OBIDX (RLE_RAW_SIZE); Int64 *totalAcUncompressedCount = OBIDX (AC_UNCOMPRESSED_COUNT); Int64 *totalDcUncompressedCount = OBIDX (DC_UNCOMPRESSED_COUNT); Int64 *acCompression = OBIDX (AC_COMPRESSION); int minX = range.min.x; int maxX = std::min(range.max.x, _max[0]); int minY = range.min.y; int maxY = std::min(range.max.y, _max[1]); // // Zero all the numbers in the chunk header // memset (_outBuffer, 0, NUM_SIZES_SINGLE * sizeof (Int64)); // // Setup the AC compression strategy and the version in the data block, // then write the relevant channel classification rules if needed // *version = fileVersion; *acCompression = _acCompression; setupChannelData (minX, minY, maxX, maxY); if (fileVersion >= 2) { char *writePtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(OPENEXR_IMF_NAMESPACE::Int64)]; Xdr::write (writePtr, channelRuleSize); for (size_t i = 0; i < channelRules.size(); ++i) channelRules[i].write(writePtr); } // // Determine the start of each row in the input buffer // Channels are interleaved by scanline // std::vector encodedChannels (_channelData.size()); std::vector< std::vector > rowPtrs (_channelData.size()); for (unsigned int chan = 0; chan < _channelData.size(); ++chan) encodedChannels[chan] = false; inDataPtr = inPtr; for (int y = minY; y <= maxY; ++y) { for (unsigned int chan = 0; chan < _channelData.size(); ++chan) { ChannelData *cd = &_channelData[chan]; if (IMATH_NAMESPACE::modp(y, cd->ySampling) != 0) continue; rowPtrs[chan].push_back(inDataPtr); inDataPtr += cd->width * OPENEXR_IMF_NAMESPACE::pixelTypeSize(cd->type); } } inDataPtr = inPtr; // // Make a pass over all our CSC sets and try to encode them first // for (unsigned int csc = 0; csc < _cscSets.size(); ++csc) { LossyDctEncoderCsc encoder (_dwaCompressionLevel / 100000.f, rowPtrs[_cscSets[csc].idx[0]], rowPtrs[_cscSets[csc].idx[1]], rowPtrs[_cscSets[csc].idx[2]], packedAcEnd, packedDcEnd, dwaCompressorToNonlinear, _channelData[_cscSets[csc].idx[0]].width, _channelData[_cscSets[csc].idx[0]].height, _channelData[_cscSets[csc].idx[0]].type, _channelData[_cscSets[csc].idx[1]].type, _channelData[_cscSets[csc].idx[2]].type); encoder.execute(); *totalAcUncompressedCount += encoder.numAcValuesEncoded(); *totalDcUncompressedCount += encoder.numDcValuesEncoded(); packedAcEnd += encoder.numAcValuesEncoded() * sizeof(unsigned short); packedDcEnd += encoder.numDcValuesEncoded() * sizeof(unsigned short); encodedChannels[_cscSets[csc].idx[0]] = true; encodedChannels[_cscSets[csc].idx[1]] = true; encodedChannels[_cscSets[csc].idx[2]] = true; } for (unsigned int chan = 0; chan < _channelData.size(); ++chan) { ChannelData *cd = &_channelData[chan]; if (encodedChannels[chan]) continue; switch (cd->compression) { case LOSSY_DCT: // // For LOSSY_DCT, treat this just like the CSC'd case, // but only operate on one channel // { const unsigned short *nonlinearLut = 0; if (!cd->pLinear) nonlinearLut = dwaCompressorToNonlinear; LossyDctEncoder encoder (_dwaCompressionLevel / 100000.f, rowPtrs[chan], packedAcEnd, packedDcEnd, nonlinearLut, cd->width, cd->height, cd->type); encoder.execute(); *totalAcUncompressedCount += encoder.numAcValuesEncoded(); *totalDcUncompressedCount += encoder.numDcValuesEncoded(); packedAcEnd += encoder.numAcValuesEncoded() * sizeof (unsigned short); packedDcEnd += encoder.numDcValuesEncoded() * sizeof (unsigned short); } break; case RLE: // // For RLE, bash the bytes up so that the first bytes of each // pixel are contingous, as are the second bytes, and so on. // for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y) { const char *row = rowPtrs[chan][y]; for (int x = 0; x < cd->width; ++x) { for (int byte = 0; byte < OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->type); ++byte) { *cd->planarUncRleEnd[byte]++ = *row++; } } *rleRawSize += cd->width * OPENEXR_IMF_NAMESPACE::pixelTypeSize(cd->type); } break; case UNKNOWN: // // Otherwise, just copy data over verbatim // { int scanlineSize = cd->width * OPENEXR_IMF_NAMESPACE::pixelTypeSize(cd->type); for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y) { memcpy (cd->planarUncBufferEnd, rowPtrs[chan][y], scanlineSize); cd->planarUncBufferEnd += scanlineSize; } *unknownUncompressedSize += cd->planarUncSize; } break; default: assert (false); } encodedChannels[chan] = true; } // // Pack the Unknown data into the output buffer first. Instead of // just copying it uncompressed, try zlib compression at least. // if (*unknownUncompressedSize > 0) { uLongf inSize = (uLongf)(*unknownUncompressedSize); uLongf outSize = compressBound (inSize); if (Z_OK != ::compress2 ((Bytef *)outDataPtr, &outSize, (const Bytef *)_planarUncBuffer[UNKNOWN], inSize, 9)) { throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed."); } outDataPtr += outSize; *unknownCompressedSize = outSize; } // // Now, pack all the Lossy DCT coefficients into our output // buffer, with Huffman encoding. // // Also, record the compressed size and the number of // uncompressed componentns we have. // if (*totalAcUncompressedCount > 0) { switch (_acCompression) { case STATIC_HUFFMAN: *acCompressedSize = (int) hufCompress((unsigned short *)_packedAcBuffer, (int)*totalAcUncompressedCount, outDataPtr); break; case DEFLATE: { uLongf destLen = compressBound ( (*totalAcUncompressedCount) * sizeof (unsigned short)); if (Z_OK != ::compress2 ((Bytef *)outDataPtr, &destLen, (Bytef *)_packedAcBuffer, (uLong)(*totalAcUncompressedCount * sizeof (unsigned short)), 9)) { throw IEX_NAMESPACE::InputExc ("Data compression (zlib) failed."); } *acCompressedSize = destLen; } break; default: assert (false); } outDataPtr += *acCompressedSize; } // // Handle the DC components separately // if (*totalDcUncompressedCount > 0) { *dcCompressedSize = _zip->compress (_packedDcBuffer, (int)(*totalDcUncompressedCount) * sizeof (unsigned short), outDataPtr); outDataPtr += *dcCompressedSize; } // // If we have RLE data, first RLE encode it and set the uncompressed // size. Then, deflate the results and set the compressed size. // if (*rleRawSize > 0) { *rleUncompressedSize = rleCompress ((int)(*rleRawSize), _planarUncBuffer[RLE], (signed char *)_rleBuffer); uLongf dstLen = compressBound ((uLongf)*rleUncompressedSize); if (Z_OK != ::compress2 ((Bytef *)outDataPtr, &dstLen, (Bytef *)_rleBuffer, (uLong)(*rleUncompressedSize), 9)) { throw IEX_NAMESPACE::BaseExc ("Error compressing RLE'd data."); } *rleCompressedSize = dstLen; outDataPtr += *rleCompressedSize; } // // Flip the counters to XDR format // for (int i = 0; i < NUM_SIZES_SINGLE; ++i) { Int64 src = *(((Int64 *)_outBuffer) + i); char *dst = (char *)(((Int64 *)_outBuffer) + i); Xdr::write (dst, src); } // // We're done - compute the number of bytes we packed // outPtr = _outBuffer; return static_cast(outDataPtr - _outBuffer + 1); } int DwaCompressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return uncompress (inPtr, inSize, IMATH_NAMESPACE::Box2i (IMATH_NAMESPACE::V2i (_min[0], minY), IMATH_NAMESPACE::V2i (_max[0], minY + numScanLines() - 1)), outPtr); } int DwaCompressor::uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { return uncompress (inPtr, inSize, range, outPtr); } int DwaCompressor::uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { int minX = range.min.x; int maxX = std::min (range.max.x, _max[0]); int minY = range.min.y; int maxY = std::min (range.max.y, _max[1]); Int64 iSize = static_cast( inSize ); Int64 headerSize = NUM_SIZES_SINGLE*sizeof(Int64); if (iSize < headerSize) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(truncated header)."); } // // Flip the counters from XDR to NATIVE // for (int i = 0; i < NUM_SIZES_SINGLE; ++i) { Int64 *dst = (((Int64 *)inPtr) + i); const char *src = (char *)(((Int64 *)inPtr) + i); Xdr::read (src, *dst); } // // Unwind all the counter info // const Int64 *inPtr64 = (const Int64*) inPtr; Int64 version = *(inPtr64 + VERSION); Int64 unknownUncompressedSize = *(inPtr64 + UNKNOWN_UNCOMPRESSED_SIZE); Int64 unknownCompressedSize = *(inPtr64 + UNKNOWN_COMPRESSED_SIZE); Int64 acCompressedSize = *(inPtr64 + AC_COMPRESSED_SIZE); Int64 dcCompressedSize = *(inPtr64 + DC_COMPRESSED_SIZE); Int64 rleCompressedSize = *(inPtr64 + RLE_COMPRESSED_SIZE); Int64 rleUncompressedSize = *(inPtr64 + RLE_UNCOMPRESSED_SIZE); Int64 rleRawSize = *(inPtr64 + RLE_RAW_SIZE); Int64 totalAcUncompressedCount = *(inPtr64 + AC_UNCOMPRESSED_COUNT); Int64 totalDcUncompressedCount = *(inPtr64 + DC_UNCOMPRESSED_COUNT); Int64 acCompression = *(inPtr64 + AC_COMPRESSION); Int64 compressedSize = unknownCompressedSize + acCompressedSize + dcCompressedSize + rleCompressedSize; const char *dataPtr = inPtr + NUM_SIZES_SINGLE * sizeof(Int64); /* Both the sum and individual sizes are checked in case of overflow. */ if (iSize < (headerSize + compressedSize) || iSize < unknownCompressedSize || iSize < acCompressedSize || iSize < dcCompressedSize || iSize < rleCompressedSize) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(truncated file)."); } if ((SInt64)unknownUncompressedSize < 0 || (SInt64)unknownCompressedSize < 0 || (SInt64)acCompressedSize < 0 || (SInt64)dcCompressedSize < 0 || (SInt64)rleCompressedSize < 0 || (SInt64)rleUncompressedSize < 0 || (SInt64)rleRawSize < 0 || (SInt64)totalAcUncompressedCount < 0 || (SInt64)totalDcUncompressedCount < 0) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (corrupt header)."); } if (version < 2) initializeLegacyChannelRules(); else { unsigned short ruleSize = 0; Xdr::read(dataPtr, ruleSize); if (ruleSize < Xdr::size() ) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (corrupt header file)."); headerSize += ruleSize; if (iSize < headerSize + compressedSize) throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" " (truncated file)."); _channelRules.clear(); ruleSize -= Xdr::size (); while (ruleSize > 0) { Classifier rule(dataPtr, ruleSize); _channelRules.push_back(rule); ruleSize -= rule.size(); } } size_t outBufferSize = 0; initializeBuffers(outBufferSize); // // Allocate _outBuffer, if we haven't done so already // if (static_cast(_maxScanLineSize * numScanLines()) > _outBufferSize) { _outBufferSize = static_cast(_maxScanLineSize * numScanLines()); if (_outBuffer != 0) delete[] _outBuffer; _outBuffer = new char[_maxScanLineSize * numScanLines()]; } char *outBufferEnd = _outBuffer; // // Find the start of the RLE packed AC components and // the DC components for each channel. This will be handy // if you want to decode the channels in parallel later on. // char *packedAcBufferEnd = 0; if (_packedAcBuffer) packedAcBufferEnd = _packedAcBuffer; char *packedDcBufferEnd = 0; if (_packedDcBuffer) packedDcBufferEnd = _packedDcBuffer; // // UNKNOWN data is packed first, followed by the // Huffman-compressed AC, then the DC values, // and then the zlib compressed RLE data. // const char *compressedUnknownBuf = dataPtr; const char *compressedAcBuf = compressedUnknownBuf + static_cast(unknownCompressedSize); const char *compressedDcBuf = compressedAcBuf + static_cast(acCompressedSize); const char *compressedRleBuf = compressedDcBuf + static_cast(dcCompressedSize); // // Sanity check that the version is something we expect. Right now, // we can decode version 0, 1, and 2. v1 adds 'end of block' symbols // to the AC RLE. v2 adds channel classification rules at the // start of the data block. // if (version > 2) throw IEX_NAMESPACE::InputExc ("Invalid version of compressed data block"); setupChannelData(minX, minY, maxX, maxY); // // Uncompress the UNKNOWN data into _planarUncBuffer[UNKNOWN] // if (unknownCompressedSize > 0) { if (unknownUncompressedSize > _planarUncBufferSize[UNKNOWN]) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(corrupt header)."); } uLongf outSize = (uLongf)unknownUncompressedSize; if (Z_OK != ::uncompress ((Bytef *)_planarUncBuffer[UNKNOWN], &outSize, (Bytef *)compressedUnknownBuf, (uLong)unknownCompressedSize)) { throw IEX_NAMESPACE::BaseExc("Error uncompressing UNKNOWN data."); } } // // Uncompress the AC data into _packedAcBuffer // if (acCompressedSize > 0) { if ( !_packedAcBuffer || totalAcUncompressedCount*sizeof(unsigned short) > _packedAcBufferSize) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(corrupt header)."); } // // Don't trust the user to get it right, look in the file. // switch (acCompression) { case STATIC_HUFFMAN: hufUncompress (compressedAcBuf, (int)acCompressedSize, (unsigned short *)_packedAcBuffer, (int)totalAcUncompressedCount); break; case DEFLATE: { uLongf destLen = (int)(totalAcUncompressedCount) * sizeof (unsigned short); if (Z_OK != ::uncompress ((Bytef *)_packedAcBuffer, &destLen, (Bytef *)compressedAcBuf, (uLong)acCompressedSize)) { throw IEX_NAMESPACE::InputExc ("Data decompression (zlib) failed."); } if (totalAcUncompressedCount * sizeof (unsigned short) != destLen) { throw IEX_NAMESPACE::InputExc ("AC data corrupt."); } } break; default: throw IEX_NAMESPACE::NoImplExc ("Unknown AC Compression"); break; } } // // Uncompress the DC data into _packedDcBuffer // if (dcCompressedSize > 0) { if (totalDcUncompressedCount*sizeof(unsigned short) > _packedDcBufferSize) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(corrupt header)."); } if (static_cast(_zip->uncompress (compressedDcBuf, (int)dcCompressedSize, _packedDcBuffer)) != totalDcUncompressedCount * sizeof (unsigned short)) { throw IEX_NAMESPACE::BaseExc("DC data corrupt."); } } else { // if the compressed size is 0, then the uncompressed size must also be zero if (totalDcUncompressedCount!=0) { throw IEX_NAMESPACE::BaseExc("DC data corrupt."); } } // // Uncompress the RLE data into _rleBuffer, then unRLE the results // into _planarUncBuffer[RLE] // if (rleRawSize > 0) { if (rleUncompressedSize > _rleBufferSize || rleRawSize > _planarUncBufferSize[RLE]) { throw IEX_NAMESPACE::InputExc("Error uncompressing DWA data" "(corrupt header)."); } uLongf dstLen = (uLongf)rleUncompressedSize; if (Z_OK != ::uncompress ((Bytef *)_rleBuffer, &dstLen, (Bytef *)compressedRleBuf, (uLong)rleCompressedSize)) { throw IEX_NAMESPACE::BaseExc("Error uncompressing RLE data."); } if (dstLen != rleUncompressedSize) throw IEX_NAMESPACE::BaseExc("RLE data corrupted"); if (static_cast(rleUncompress ((int)rleUncompressedSize, (int)rleRawSize, (signed char *)_rleBuffer, _planarUncBuffer[RLE])) != rleRawSize) { throw IEX_NAMESPACE::BaseExc("RLE data corrupted"); } } // // Determine the start of each row in the output buffer // std::vector decodedChannels (_channelData.size()); std::vector< std::vector > rowPtrs (_channelData.size()); for (unsigned int chan = 0; chan < _channelData.size(); ++chan) decodedChannels[chan] = false; outBufferEnd = _outBuffer; for (int y = minY; y <= maxY; ++y) { for (unsigned int chan = 0; chan < _channelData.size(); ++chan) { ChannelData *cd = &_channelData[chan]; if (IMATH_NAMESPACE::modp (y, cd->ySampling) != 0) continue; rowPtrs[chan].push_back (outBufferEnd); outBufferEnd += cd->width * OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->type); } } // // Setup to decode each block of 3 channels that need to // be handled together // for (unsigned int csc = 0; csc < _cscSets.size(); ++csc) { int rChan = _cscSets[csc].idx[0]; int gChan = _cscSets[csc].idx[1]; int bChan = _cscSets[csc].idx[2]; if (_channelData[rChan].compression != LOSSY_DCT || _channelData[gChan].compression != LOSSY_DCT || _channelData[bChan].compression != LOSSY_DCT) { throw IEX_NAMESPACE::BaseExc("Bad DWA compression type detected"); } LossyDctDecoderCsc decoder (rowPtrs[rChan], rowPtrs[gChan], rowPtrs[bChan], packedAcBufferEnd, packedDcBufferEnd, dwaCompressorToLinear, _channelData[rChan].width, _channelData[rChan].height, _channelData[rChan].type, _channelData[gChan].type, _channelData[bChan].type); decoder.execute(); packedAcBufferEnd += decoder.numAcValuesEncoded() * sizeof (unsigned short); packedDcBufferEnd += decoder.numDcValuesEncoded() * sizeof (unsigned short); decodedChannels[rChan] = true; decodedChannels[gChan] = true; decodedChannels[bChan] = true; } // // Setup to handle the remaining channels by themselves // for (unsigned int chan = 0; chan < _channelData.size(); ++chan) { if (decodedChannels[chan]) continue; ChannelData *cd = &_channelData[chan]; int pixelSize = OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->type); switch (cd->compression) { case LOSSY_DCT: // // Setup a single-channel lossy DCT decoder pointing // at the output buffer // { const unsigned short *linearLut = 0; if (!cd->pLinear) linearLut = dwaCompressorToLinear; LossyDctDecoder decoder (rowPtrs[chan], packedAcBufferEnd, packedDcBufferEnd, linearLut, cd->width, cd->height, cd->type); decoder.execute(); packedAcBufferEnd += decoder.numAcValuesEncoded() * sizeof (unsigned short); packedDcBufferEnd += decoder.numDcValuesEncoded() * sizeof (unsigned short); } break; case RLE: // // For the RLE case, the data has been un-RLE'd into // planarUncRleEnd[], but is still split out by bytes. // We need to rearrange the bytes back into the correct // order in the output buffer; // { int row = 0; for (int y = minY; y <= maxY; ++y) { if (IMATH_NAMESPACE::modp (y, cd->ySampling) != 0) continue; char *dst = rowPtrs[chan][row]; if (pixelSize == 2) { interleaveByte2 (dst, cd->planarUncRleEnd[0], cd->planarUncRleEnd[1], cd->width); cd->planarUncRleEnd[0] += cd->width; cd->planarUncRleEnd[1] += cd->width; } else { for (int x = 0; x < cd->width; ++x) { for (int byte = 0; byte < pixelSize; ++byte) { *dst++ = *cd->planarUncRleEnd[byte]++; } } } row++; } } break; case UNKNOWN: // // In the UNKNOWN case, data is already in planarUncBufferEnd // and just needs to copied over to the output buffer // { int row = 0; int dstScanlineSize = cd->width * OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->type); for (int y = minY; y <= maxY; ++y) { if (IMATH_NAMESPACE::modp (y, cd->ySampling) != 0) continue; // // sanity check for buffer data lying within range // if ((cd->planarUncBufferEnd + static_cast(dstScanlineSize)) > (_planarUncBuffer[UNKNOWN] + _planarUncBufferSize[UNKNOWN]) ) { throw Iex::InputExc("DWA data corrupt"); } memcpy (rowPtrs[chan][row], cd->planarUncBufferEnd, dstScanlineSize); cd->planarUncBufferEnd += dstScanlineSize; row++; } } break; default: throw IEX_NAMESPACE::NoImplExc ("Unhandled compression scheme case"); break; } decodedChannels[chan] = true; } // // Return a ptr to _outBuffer // outPtr = _outBuffer; return (int)(outBufferEnd - _outBuffer); } // static void DwaCompressor::initializeFuncs() { convertFloatToHalf64 = convertFloatToHalf64_scalar; fromHalfZigZag = fromHalfZigZag_scalar; CpuId cpuId; // // Setup HALF <-> FLOAT conversion implementations // if (cpuId.avx && cpuId.f16c) { convertFloatToHalf64 = convertFloatToHalf64_f16c; fromHalfZigZag = fromHalfZigZag_f16c; } // // Setup inverse DCT implementations // dctInverse8x8_0 = dctInverse8x8_scalar<0>; dctInverse8x8_1 = dctInverse8x8_scalar<1>; dctInverse8x8_2 = dctInverse8x8_scalar<2>; dctInverse8x8_3 = dctInverse8x8_scalar<3>; dctInverse8x8_4 = dctInverse8x8_scalar<4>; dctInverse8x8_5 = dctInverse8x8_scalar<5>; dctInverse8x8_6 = dctInverse8x8_scalar<6>; dctInverse8x8_7 = dctInverse8x8_scalar<7>; if (cpuId.avx) { dctInverse8x8_0 = dctInverse8x8_avx<0>; dctInverse8x8_1 = dctInverse8x8_avx<1>; dctInverse8x8_2 = dctInverse8x8_avx<2>; dctInverse8x8_3 = dctInverse8x8_avx<3>; dctInverse8x8_4 = dctInverse8x8_avx<4>; dctInverse8x8_5 = dctInverse8x8_avx<5>; dctInverse8x8_6 = dctInverse8x8_avx<6>; dctInverse8x8_7 = dctInverse8x8_avx<7>; } else if (cpuId.sse2) { dctInverse8x8_0 = dctInverse8x8_sse2<0>; dctInverse8x8_1 = dctInverse8x8_sse2<1>; dctInverse8x8_2 = dctInverse8x8_sse2<2>; dctInverse8x8_3 = dctInverse8x8_sse2<3>; dctInverse8x8_4 = dctInverse8x8_sse2<4>; dctInverse8x8_5 = dctInverse8x8_sse2<5>; dctInverse8x8_6 = dctInverse8x8_sse2<6>; dctInverse8x8_7 = dctInverse8x8_sse2<7>; } } // // Handle channel classification and buffer allocation once we know // how to classify channels // void DwaCompressor::initializeBuffers (size_t &outBufferSize) { classifyChannels (_channels, _channelData, _cscSets); // // _outBuffer needs to be big enough to hold all our // compressed data - which could vary depending on what sort // of channels we have. // Int64 maxOutBufferSize = 0; Int64 numLossyDctChans = 0; Int64 unknownBufferSize = 0; Int64 rleBufferSize = 0; Int64 maxLossyDctAcSize = static_cast(ceil ((float)numScanLines() / 8.0f)) * static_cast(ceil ((float)(_max[0] - _min[0] + 1) / 8.0f)) * 63 * sizeof (unsigned short); Int64 maxLossyDctDcSize = static_cast(ceil ((float)numScanLines() / 8.0f)) * static_cast(ceil ((float)(_max[0] - _min[0] + 1) / 8.0f)) * sizeof (unsigned short); Int64 pixelCount = static_cast(numScanLines()) * static_cast(_max[0] - _min[0] + 1); for (unsigned int chan = 0; chan < _channelData.size(); ++chan) { switch (_channelData[chan].compression) { case LOSSY_DCT: // // This is the size of the number of packed // components, plus the requirements for // maximum Huffman encoding size (for STATIC_HUFFMAN) // or for zlib compression (for DEFLATE) // maxOutBufferSize += std::max( 2lu * maxLossyDctAcSize + 65536lu, static_cast(compressBound (maxLossyDctAcSize)) ); numLossyDctChans++; break; case RLE: { // // RLE, if gone horribly wrong, could double the size // of the source data. // Int64 rleAmount = 2 * pixelCount * OPENEXR_IMF_NAMESPACE::pixelTypeSize (_channelData[chan].type); rleBufferSize += rleAmount; } break; case UNKNOWN: unknownBufferSize += pixelCount * OPENEXR_IMF_NAMESPACE::pixelTypeSize (_channelData[chan].type); break; default: throw IEX_NAMESPACE::NoImplExc ("Unhandled compression scheme case"); break; } } // // Also, since the results of the RLE are packed into // the output buffer, we need the extra room there. But // we're going to zlib compress() the data we pack, // which could take slightly more space // maxOutBufferSize += static_cast(compressBound (rleBufferSize)); // // And the same goes for the UNKNOWN data // maxOutBufferSize += static_cast(compressBound (unknownBufferSize)); // // Allocate a zip/deflate compressor big enought to hold the DC data // and include it's compressed results in the size requirements // for our output buffer // if (_zip == 0) _zip = new Zip (maxLossyDctDcSize * numLossyDctChans); else if (_zip->maxRawSize() < static_cast(maxLossyDctDcSize * numLossyDctChans)) { delete _zip; _zip = new Zip (maxLossyDctDcSize * numLossyDctChans); } maxOutBufferSize += _zip->maxCompressedSize(); // // We also need to reserve space at the head of the buffer to // write out the size of our various packed and compressed data. // maxOutBufferSize += NUM_SIZES_SINGLE * sizeof (Int64); // // Later, we're going to hijack outBuffer for the result of // both encoding and decoding. So it needs to be big enough // to hold either a buffers' worth of uncompressed or // compressed data // // For encoding, we'll need _outBuffer to hold maxOutBufferSize bytes, // but for decoding, we only need it to be maxScanLineSize*numScanLines. // Cache the max size for now, and alloc the buffer when we either // encode or decode. // outBufferSize = maxOutBufferSize; // // _packedAcBuffer holds the quantized DCT coefficients prior // to Huffman encoding // if (maxLossyDctAcSize * numLossyDctChans > _packedAcBufferSize) { _packedAcBufferSize = maxLossyDctAcSize * numLossyDctChans; if (_packedAcBuffer != 0) delete[] _packedAcBuffer; _packedAcBuffer = new char[_packedAcBufferSize]; } // // _packedDcBuffer holds one quantized DCT coef per 8x8 block // if (maxLossyDctDcSize * numLossyDctChans > _packedDcBufferSize) { _packedDcBufferSize = maxLossyDctDcSize * numLossyDctChans; if (_packedDcBuffer != 0) delete[] _packedDcBuffer; _packedDcBuffer = new char[_packedDcBufferSize]; } if ( rleBufferSize > _rleBufferSize ) { _rleBufferSize = rleBufferSize; if (_rleBuffer != 0) delete[] _rleBuffer; _rleBuffer = new char[rleBufferSize]; } // // The planar uncompressed buffer will hold float data for LOSSY_DCT // compressed values, and whatever the native type is for other // channels. We're going to use this to hold data in a planar // format, as opposed to the native interleaved format we take // into compress() and give back from uncompress(). // // This also makes it easier to compress the UNKNOWN and RLE data // all in one swoop (for each compression scheme). // Int64 planarUncBufferSize[NUM_COMPRESSOR_SCHEMES]; for (int i=0; i 0) { planarUncBufferSize[UNKNOWN] = static_cast( compressBound (planarUncBufferSize[UNKNOWN]) ); } for (int i = 0; i < NUM_COMPRESSOR_SCHEMES; ++i) { if ( planarUncBufferSize[i] > _planarUncBufferSize[i]) { _planarUncBufferSize[i] = planarUncBufferSize[i]; if (_planarUncBuffer[i] != 0) delete[] _planarUncBuffer[i]; if (planarUncBufferSize[i] > std::numeric_limits::max()) { throw IEX_NAMESPACE::ArgExc("DWA buffers too large"); } _planarUncBuffer[i] = new char[planarUncBufferSize[i]]; } } } // // Setup channel classification rules to use when writing files // void DwaCompressor::initializeDefaultChannelRules () { _channelRules.clear(); _channelRules.push_back (Classifier ("R", LOSSY_DCT, HALF, 0, false)); _channelRules.push_back (Classifier ("R", LOSSY_DCT, FLOAT, 0, false)); _channelRules.push_back (Classifier ("G", LOSSY_DCT, HALF, 1, false)); _channelRules.push_back (Classifier ("G", LOSSY_DCT, FLOAT, 1, false)); _channelRules.push_back (Classifier ("B", LOSSY_DCT, HALF, 2, false)); _channelRules.push_back (Classifier ("B", LOSSY_DCT, FLOAT, 2, false)); _channelRules.push_back (Classifier ("Y", LOSSY_DCT, HALF, -1, false)); _channelRules.push_back (Classifier ("Y", LOSSY_DCT, FLOAT, -1, false)); _channelRules.push_back (Classifier ("BY", LOSSY_DCT, HALF, -1, false)); _channelRules.push_back (Classifier ("BY", LOSSY_DCT, FLOAT, -1, false)); _channelRules.push_back (Classifier ("RY", LOSSY_DCT, HALF, -1, false)); _channelRules.push_back (Classifier ("RY", LOSSY_DCT, FLOAT, -1, false)); _channelRules.push_back (Classifier ("A", RLE, UINT, -1, false)); _channelRules.push_back (Classifier ("A", RLE, HALF, -1, false)); _channelRules.push_back (Classifier ("A", RLE, FLOAT, -1, false)); } // // Setup channel classification rules when reading files with VERSION < 2 // void DwaCompressor::initializeLegacyChannelRules () { _channelRules.clear(); _channelRules.push_back (Classifier ("r", LOSSY_DCT, HALF, 0, true)); _channelRules.push_back (Classifier ("r", LOSSY_DCT, FLOAT, 0, true)); _channelRules.push_back (Classifier ("red", LOSSY_DCT, HALF, 0, true)); _channelRules.push_back (Classifier ("red", LOSSY_DCT, FLOAT, 0, true)); _channelRules.push_back (Classifier ("g", LOSSY_DCT, HALF, 1, true)); _channelRules.push_back (Classifier ("g", LOSSY_DCT, FLOAT, 1, true)); _channelRules.push_back (Classifier ("grn", LOSSY_DCT, HALF, 1, true)); _channelRules.push_back (Classifier ("grn", LOSSY_DCT, FLOAT, 1, true)); _channelRules.push_back (Classifier ("green", LOSSY_DCT, HALF, 1, true)); _channelRules.push_back (Classifier ("green", LOSSY_DCT, FLOAT, 1, true)); _channelRules.push_back (Classifier ("b", LOSSY_DCT, HALF, 2, true)); _channelRules.push_back (Classifier ("b", LOSSY_DCT, FLOAT, 2, true)); _channelRules.push_back (Classifier ("blu", LOSSY_DCT, HALF, 2, true)); _channelRules.push_back (Classifier ("blu", LOSSY_DCT, FLOAT, 2, true)); _channelRules.push_back (Classifier ("blue", LOSSY_DCT, HALF, 2, true)); _channelRules.push_back (Classifier ("blue", LOSSY_DCT, FLOAT, 2, true)); _channelRules.push_back (Classifier ("y", LOSSY_DCT, HALF, -1, true)); _channelRules.push_back (Classifier ("y", LOSSY_DCT, FLOAT, -1, true)); _channelRules.push_back (Classifier ("by", LOSSY_DCT, HALF, -1, true)); _channelRules.push_back (Classifier ("by", LOSSY_DCT, FLOAT, -1, true)); _channelRules.push_back (Classifier ("ry", LOSSY_DCT, HALF, -1, true)); _channelRules.push_back (Classifier ("ry", LOSSY_DCT, FLOAT, -1, true)); _channelRules.push_back (Classifier ("a", RLE, UINT, -1, true)); _channelRules.push_back (Classifier ("a", RLE, HALF, -1, true)); _channelRules.push_back (Classifier ("a", RLE, FLOAT, -1, true)); } // // Given a set of rules and ChannelData, figure out which rules apply // void DwaCompressor::relevantChannelRules (std::vector &rules) const { rules.clear(); std::vector suffixes; for (size_t cd = 0; cd < _channelData.size(); ++cd) { std::string suffix = _channelData[cd].name; size_t lastDot = suffix.find_last_of ('.'); if (lastDot != std::string::npos) suffix = suffix.substr (lastDot+1, std::string::npos); suffixes.push_back(suffix); } for (size_t i = 0; i < _channelRules.size(); ++i) { for (size_t cd = 0; cd < _channelData.size(); ++cd) { if (_channelRules[i].match (suffixes[cd], _channelData[cd].type )) { rules.push_back (_channelRules[i]); break; } } } } // // Take our initial list of channels, and cache the contents. // // Determine approprate compression schemes for each channel, // and figure out which sets should potentially be CSC'ed // prior to lossy compression. // void DwaCompressor::classifyChannels (ChannelList channels, std::vector &chanData, std::vector &cscData) { // // prefixMap used to map channel name prefixes to // potential CSC-able sets of channels. // std::map prefixMap; std::vector tmpCscSet; unsigned int numChan = 0; for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c) numChan++; if (numChan) chanData.resize (numChan); // // Cache the relevant data from the channel structs. // unsigned int offset = 0; for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c) { chanData[offset].name = std::string (c.name()); chanData[offset].compression = UNKNOWN; chanData[offset].xSampling = c.channel().xSampling; chanData[offset].ySampling = c.channel().ySampling; chanData[offset].type = c.channel().type; chanData[offset].pLinear = c.channel().pLinear; offset++; } // // Try and figure out which channels should be // compressed by which means. // for (offset = 0; offset::iterator theSet = prefixMap.find (prefix); if (theSet == prefixMap.end()) { DwaCompressor::CscChannelSet tmpSet; tmpSet.idx[0] = tmpSet.idx[1] = tmpSet.idx[2] = -1; prefixMap[prefix] = tmpSet; } // // Check the suffix against the list of classifications // we defined previously. If the _cscIdx is not negative, // it indicates that we should be part of a CSC group. // for (std::vector::iterator i = _channelRules.begin(); i != _channelRules.end(); ++i) { if ( i->match(suffix, chanData[offset].type) ) { chanData[offset].compression = i->_scheme; if ( i->_cscIdx >= 0) prefixMap[prefix].idx[i->_cscIdx] = offset; } } } // // Finally, try and find RGB sets of channels which // can be CSC'ed to a Y'CbCr space prior to loss, for // better compression. // // Walk over our set of candidates, and see who has // all three channels defined (and has common sampling // patterns, etc). // for (std::map::iterator theItem = prefixMap.begin(); theItem != prefixMap.end(); ++theItem) { int red = (*theItem).second.idx[0]; int grn = (*theItem).second.idx[1]; int blu = (*theItem).second.idx[2]; if ((red < 0) || (grn < 0) || (blu < 0)) continue; if ((chanData[red].xSampling != chanData[grn].xSampling) || (chanData[red].xSampling != chanData[blu].xSampling) || (chanData[grn].xSampling != chanData[blu].xSampling) || (chanData[red].ySampling != chanData[grn].ySampling) || (chanData[red].ySampling != chanData[blu].ySampling) || (chanData[grn].ySampling != chanData[blu].ySampling)) { continue; } tmpCscSet.push_back ((*theItem).second); } size_t numCsc = tmpCscSet.size(); if (numCsc) cscData.resize(numCsc); for (offset = 0; offset < numCsc; ++offset) cscData[offset] = tmpCscSet[offset]; } // // Setup some buffer pointers, determine channel sizes, things // like that. // void DwaCompressor::setupChannelData (int minX, int minY, int maxX, int maxY) { char *planarUncBuffer[NUM_COMPRESSOR_SCHEMES]; for (int i=0; iwidth = OPENEXR_IMF_NAMESPACE::numSamples (cd->xSampling, minX, maxX); cd->height = OPENEXR_IMF_NAMESPACE::numSamples (cd->ySampling, minY, maxY); cd->planarUncSize = cd->width * cd->height * OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->type); cd->planarUncBuffer = planarUncBuffer[cd->compression]; cd->planarUncBufferEnd = cd->planarUncBuffer; cd->planarUncRle[0] = cd->planarUncBuffer; cd->planarUncRleEnd[0] = cd->planarUncRle[0]; for (int byte = 1; byte < OPENEXR_IMF_NAMESPACE::pixelTypeSize(cd->type); ++byte) { cd->planarUncRle[byte] = cd->planarUncRle[byte-1] + cd->width * cd->height; cd->planarUncRleEnd[byte] = cd->planarUncRle[byte]; } cd->planarUncType = cd->type; if (cd->compression == LOSSY_DCT) { cd->planarUncType = FLOAT; } else { planarUncBuffer[cd->compression] += cd->width * cd->height * OPENEXR_IMF_NAMESPACE::pixelTypeSize (cd->planarUncType); } } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfDwaCompressor.h000066400000000000000000000167211406177042200212510ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_DWA_COMRESSOR_H #define INCLUDED_IMF_DWA_COMRESSOR_H //------------------------------------------------------------------------------ // // class DwaCompressor -- Store lossy RGB data by quantizing DCT components. // //------------------------------------------------------------------------------ #include #include #include "ImfInt64.h" #include "ImfZip.h" #include "ImfChannelList.h" #include "ImfCompressor.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class DwaCompressor: public Compressor { public: enum AcCompression { STATIC_HUFFMAN, DEFLATE, }; IMF_EXPORT DwaCompressor (const Header &hdr, int maxScanLineSize, int numScanLines, // ideally is a multiple of 8 AcCompression acCompression); IMF_EXPORT virtual ~DwaCompressor (); DwaCompressor (const DwaCompressor& other) = delete; DwaCompressor& operator = (const DwaCompressor& other) = delete; DwaCompressor (DwaCompressor&& other) = delete; DwaCompressor& operator = (DwaCompressor&& other) = delete; IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual OPENEXR_IMF_NAMESPACE::Compressor::Format format () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); IMF_EXPORT static void initializeFuncs (); private: struct ChannelData; struct CscChannelSet; struct Classifier; class LossyDctDecoderBase; class LossyDctDecoder; class LossyDctDecoderCsc; class LossyDctEncoderBase; class LossyDctEncoder; class LossyDctEncoderCsc; enum CompressorScheme { UNKNOWN = 0, LOSSY_DCT, RLE, NUM_COMPRESSOR_SCHEMES }; // // Per-chunk compressed data sizes, one value per chunk // enum DataSizesSingle { VERSION = 0, // Version number: // 0: classic // 1: adds "end of block" to the AC RLE UNKNOWN_UNCOMPRESSED_SIZE, // Size of leftover data, uncompressed. UNKNOWN_COMPRESSED_SIZE, // Size of leftover data, zlib compressed. AC_COMPRESSED_SIZE, // AC RLE + Huffman size DC_COMPRESSED_SIZE, // DC + Deflate size RLE_COMPRESSED_SIZE, // RLE + Deflate data size RLE_UNCOMPRESSED_SIZE, // RLE'd data size RLE_RAW_SIZE, // Un-RLE'd data size AC_UNCOMPRESSED_COUNT, // AC RLE number of elements DC_UNCOMPRESSED_COUNT, // DC number of elements AC_COMPRESSION, // AC compression strategy NUM_SIZES_SINGLE }; AcCompression _acCompression; int _maxScanLineSize; int _numScanLines; int _min[2], _max[2]; ChannelList _channels; std::vector _channelData; std::vector _cscSets; std::vector _channelRules; char* _packedAcBuffer; Int64 _packedAcBufferSize; char* _packedDcBuffer; Int64 _packedDcBufferSize; char* _rleBuffer; Int64 _rleBufferSize; char* _outBuffer; Int64 _outBufferSize; char* _planarUncBuffer[NUM_COMPRESSOR_SCHEMES]; Int64 _planarUncBufferSize[NUM_COMPRESSOR_SCHEMES]; Zip *_zip; float _dwaCompressionLevel; int compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); void initializeBuffers (size_t&); void initializeDefaultChannelRules (); void initializeLegacyChannelRules (); void relevantChannelRules( std::vector &) const; // // Populate our cached version of the channel data with // data from the real channel list. We want to // copy over attributes, determine compression schemes // releveant for the channel type, and find sets of // channels to be compressed from Y'CbCr data instead // of R'G'B'. // void classifyChannels (ChannelList channels, std::vector &chanData, std::vector &cscData); // // Compute various buffer pointers for each channel // void setupChannelData (int minX, int minY, int maxX, int maxY); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfDwaCompressorSimd.h000066400000000000000000002421501406177042200220630ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMF_DWACOMPRESSORSIMD_H_HAS_BEEN_INCLUDED #define IMF_DWACOMPRESSORSIMD_H_HAS_BEEN_INCLUDED // // Various SSE accelerated functions, used by Imf::DwaCompressor. // These have been separated into a separate .h file, as the fast // paths are done with template specialization. // // Unless otherwise noted, all pointers are assumed to be 32-byte // aligned. Unaligned pointers may risk seg-faulting. // #include "ImfNamespace.h" #include "ImfSimd.h" #include "ImfSystemSpecific.h" #include "OpenEXRConfig.h" #include "OpenEXRConfigInternal.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER #define _SSE_ALIGNMENT 32 #define _SSE_ALIGNMENT_MASK 0x0F #define _AVX_ALIGNMENT_MASK 0x1F // // A simple 64-element array, aligned properly for SIMD access. // template class SimdAlignedBuffer64 { public: SimdAlignedBuffer64(): _buffer (0), _handle (0) { alloc(); } SimdAlignedBuffer64(const SimdAlignedBuffer64 &rhs): _buffer (0), _handle(0) { alloc(); memcpy (_buffer, rhs._buffer, 64 * sizeof (T)); } SimdAlignedBuffer64 &operator=(const SimdAlignedBuffer64 &rhs) { memcpy (_buffer, rhs._buffer, 64 * sizeof (T)); return *this; } #if __cplusplus >= 201103L SimdAlignedBuffer64(SimdAlignedBuffer64 &&rhs) noexcept : _buffer(rhs._buffer), _handle(rhs._handle) { rhs._handle = nullptr; rhs._buffer = nullptr; } SimdAlignedBuffer64 &operator=(SimdAlignedBuffer64 &&rhs) noexcept { std::swap(_handle, rhs._handle); std::swap(_buffer, rhs._buffer); return *this; } #endif ~SimdAlignedBuffer64 () { if (_handle) EXRFreeAligned (_handle); _handle = 0; _buffer = 0; } void alloc() { // // Try EXRAllocAligned first - but it might fallback to // unaligned allocs. If so, overalloc. // _handle = (char *) EXRAllocAligned (64 * sizeof(T), _SSE_ALIGNMENT); if (((size_t)_handle & (_SSE_ALIGNMENT - 1)) == 0) { _buffer = (T *)_handle; return; } EXRFreeAligned(_handle); _handle = (char *) EXRAllocAligned (64 * sizeof(T) + _SSE_ALIGNMENT, _SSE_ALIGNMENT); char *aligned = _handle; while ((size_t)aligned & (_SSE_ALIGNMENT - 1)) aligned++; _buffer = (T *)aligned; } T *_buffer; private: char *_handle; }; typedef SimdAlignedBuffer64 SimdAlignedBuffer64f; typedef SimdAlignedBuffer64 SimdAlignedBuffer64us; namespace { // // Color space conversion, Inverse 709 CSC, Y'CbCr -> R'G'B' // void csc709Inverse (float &comp0, float &comp1, float &comp2) { float src[3]; src[0] = comp0; src[1] = comp1; src[2] = comp2; comp0 = src[0] + 1.5747f * src[2]; comp1 = src[0] - 0.1873f * src[1] - 0.4682f * src[2]; comp2 = src[0] + 1.8556f * src[1]; } #ifndef IMF_HAVE_SSE2 // // Scalar color space conversion, based on 709 primiary chromaticies. // No scaling or offsets, just the matrix // void csc709Inverse64 (float *comp0, float *comp1, float *comp2) { for (int i = 0; i < 64; ++i) csc709Inverse (comp0[i], comp1[i], comp2[i]); } #else /* IMF_HAVE_SSE2 */ // // SSE2 color space conversion // void csc709Inverse64 (float *comp0, float *comp1, float *comp2) { __m128 c0 = { 1.5747f, 1.5747f, 1.5747f, 1.5747f}; __m128 c1 = { 1.8556f, 1.8556f, 1.8556f, 1.8556f}; __m128 c2 = {-0.1873f, -0.1873f, -0.1873f, -0.1873f}; __m128 c3 = {-0.4682f, -0.4682f, -0.4682f, -0.4682f}; __m128 *r = (__m128 *)comp0; __m128 *g = (__m128 *)comp1; __m128 *b = (__m128 *)comp2; __m128 src[3]; #define CSC_INVERSE_709_SSE2_LOOP(i) \ src[0] = r[i]; \ src[1] = g[i]; \ src[2] = b[i]; \ \ r[i] = _mm_add_ps (r[i], _mm_mul_ps (src[2], c0)); \ \ g[i] = _mm_mul_ps (g[i], c2); \ src[2] = _mm_mul_ps (src[2], c3); \ g[i] = _mm_add_ps (g[i], src[0]); \ g[i] = _mm_add_ps (g[i], src[2]); \ \ b[i] = _mm_mul_ps (c1, src[1]); \ b[i] = _mm_add_ps (b[i], src[0]); CSC_INVERSE_709_SSE2_LOOP (0) CSC_INVERSE_709_SSE2_LOOP (1) CSC_INVERSE_709_SSE2_LOOP (2) CSC_INVERSE_709_SSE2_LOOP (3) CSC_INVERSE_709_SSE2_LOOP (4) CSC_INVERSE_709_SSE2_LOOP (5) CSC_INVERSE_709_SSE2_LOOP (6) CSC_INVERSE_709_SSE2_LOOP (7) CSC_INVERSE_709_SSE2_LOOP (8) CSC_INVERSE_709_SSE2_LOOP (9) CSC_INVERSE_709_SSE2_LOOP (10) CSC_INVERSE_709_SSE2_LOOP (11) CSC_INVERSE_709_SSE2_LOOP (12) CSC_INVERSE_709_SSE2_LOOP (13) CSC_INVERSE_709_SSE2_LOOP (14) CSC_INVERSE_709_SSE2_LOOP (15) } #endif /* IMF_HAVE_SSE2 */ // // Color space conversion, Forward 709 CSC, R'G'B' -> Y'CbCr // // Simple FPU color space conversion. Based on the 709 // primary chromaticies, with no scaling or offsets. // void csc709Forward64 (float *comp0, float *comp1, float *comp2) { float src[3]; for (int i = 0; i<64; ++i) { src[0] = comp0[i]; src[1] = comp1[i]; src[2] = comp2[i]; comp0[i] = 0.2126f * src[0] + 0.7152f * src[1] + 0.0722f * src[2]; comp1[i] = -0.1146f * src[0] - 0.3854f * src[1] + 0.5000f * src[2]; comp2[i] = 0.5000f * src[0] - 0.4542f * src[1] - 0.0458f * src[2]; } } // // Byte interleaving of 2 byte arrays: // src0 = AAAA // src1 = BBBB // dst = ABABABAB // // numBytes is the size of each of the source buffers // #ifndef IMF_HAVE_SSE2 // // Scalar default implementation // void interleaveByte2 (char *dst, char *src0, char *src1, int numBytes) { for (int x = 0; x < numBytes; ++x) { dst[2 * x] = src0[x]; dst[2 * x + 1] = src1[x]; } } #else /* IMF_HAVE_SSE2 */ // // SSE2 byte interleaving // void interleaveByte2 (char *dst, char *src0, char *src1, int numBytes) { int dstAlignment = (size_t)dst % 16; int src0Alignment = (size_t)src0 % 16; int src1Alignment = (size_t)src1 % 16; __m128i *dst_epi8 = (__m128i*)dst; __m128i *src0_epi8 = (__m128i*)src0; __m128i *src1_epi8 = (__m128i*)src1; int sseWidth = numBytes / 16; if ((!dstAlignment) && (!src0Alignment) && (!src1Alignment)) { __m128i tmp0, tmp1; // // Aligned loads and stores // for (int x = 0; x < sseWidth; ++x) { tmp0 = src0_epi8[x]; tmp1 = src1_epi8[x]; _mm_stream_si128 (&dst_epi8[2 * x], _mm_unpacklo_epi8 (tmp0, tmp1)); _mm_stream_si128 (&dst_epi8[2 * x + 1], _mm_unpackhi_epi8 (tmp0, tmp1)); } // // Then do run the leftovers one at a time // for (int x = 16 * sseWidth; x < numBytes; ++x) { dst[2 * x] = src0[x]; dst[2 * x + 1] = src1[x]; } } else if ((!dstAlignment) && (src0Alignment == 8) && (src1Alignment == 8)) { // // Aligned stores, but catch up a few values so we can // use aligned loads // for (int x = 0; x < std::min (numBytes, 8); ++x) { dst[2 * x] = src0[x]; dst[2 * x + 1] = src1[x]; } if (numBytes > 8) { dst_epi8 = (__m128i*)&dst[16]; src0_epi8 = (__m128i*)&src0[8]; src1_epi8 = (__m128i*)&src1[8]; sseWidth = (numBytes - 8) / 16; for (int x=0; x half float conversion // // To enable F16C based conversion, we can't rely on compile-time // detection, hence the multiple defined versions. Pick one based // on runtime cpuid detection. // // // Default boring conversion // void convertFloatToHalf64_scalar (unsigned short *dst, float *src) { for (int i=0; i<64; ++i) dst[i] = ((half)src[i]).bits(); } // // F16C conversion - Assumes aligned src and dst // void convertFloatToHalf64_f16c (unsigned short *dst, float *src) { // // Ordinarly, I'd avoid using inline asm and prefer intrinsics. // However, in order to get the intrinsics, we need to tell // the compiler to generate VEX instructions. // // (On the GCC side, -mf16c goes ahead and activates -mavc, // resulting in VEX code. Without -mf16c, no intrinsics..) // // Now, it's quite likely that we'll find ourselves in situations // where we want to build *without* VEX, in order to maintain // maximum compatability. But to get there with intrinsics, // we'd need to break out code into a separate file. Bleh. // I'll take the asm. // #if defined IMF_HAVE_GCC_INLINEASM_X86 __asm__ ("vmovaps (%0), %%ymm0 \n" "vmovaps 0x20(%0), %%ymm1 \n" "vmovaps 0x40(%0), %%ymm2 \n" "vmovaps 0x60(%0), %%ymm3 \n" "vcvtps2ph $0, %%ymm0, %%xmm0 \n" "vcvtps2ph $0, %%ymm1, %%xmm1 \n" "vcvtps2ph $0, %%ymm2, %%xmm2 \n" "vcvtps2ph $0, %%ymm3, %%xmm3 \n" "vmovdqa %%xmm0, 0x00(%1) \n" "vmovdqa %%xmm1, 0x10(%1) \n" "vmovdqa %%xmm2, 0x20(%1) \n" "vmovdqa %%xmm3, 0x30(%1) \n" "vmovaps 0x80(%0), %%ymm0 \n" "vmovaps 0xa0(%0), %%ymm1 \n" "vmovaps 0xc0(%0), %%ymm2 \n" "vmovaps 0xe0(%0), %%ymm3 \n" "vcvtps2ph $0, %%ymm0, %%xmm0 \n" "vcvtps2ph $0, %%ymm1, %%xmm1 \n" "vcvtps2ph $0, %%ymm2, %%xmm2 \n" "vcvtps2ph $0, %%ymm3, %%xmm3 \n" "vmovdqa %%xmm0, 0x40(%1) \n" "vmovdqa %%xmm1, 0x50(%1) \n" "vmovdqa %%xmm2, 0x60(%1) \n" "vmovdqa %%xmm3, 0x70(%1) \n" #ifndef __AVX__ "vzeroupper \n" #endif /* __AVX__ */ : /* Output */ : /* Input */ "r"(src), "r"(dst) #ifndef __AVX__ : /* Clobber */ "%xmm0", "%xmm1", "%xmm2", "%xmm3", "memory" #else : /* Clobber */ "%ymm0", "%ymm1", "%ymm2", "%ymm3", "memory" #endif /* __AVX__ */ ); #else convertFloatToHalf64_scalar (dst, src); #endif /* IMF_HAVE_GCC_INLINEASM_X86 */ } // // Convert an 8x8 block of HALF from zig-zag order to // FLOAT in normal order. The order we want is: // // src dst // 0 1 2 3 4 5 6 7 0 1 5 6 14 15 27 28 // 8 9 10 11 12 13 14 15 2 4 7 13 16 26 29 42 // 16 17 18 19 20 21 22 23 3 8 12 17 25 30 41 43 // 24 25 26 27 28 29 30 31 9 11 18 24 31 40 44 53 // 32 33 34 35 36 37 38 39 10 19 23 32 39 45 52 54 // 40 41 42 43 44 45 46 47 20 22 33 38 46 51 55 60 // 48 49 50 51 52 53 54 55 21 34 37 47 50 56 59 61 // 56 57 58 59 60 61 62 63 35 36 48 49 57 58 62 63 // void fromHalfZigZag_scalar (unsigned short *src, float *dst) { half *srcHalf = (half *)src; dst[0] = (float)srcHalf[0]; dst[1] = (float)srcHalf[1]; dst[2] = (float)srcHalf[5]; dst[3] = (float)srcHalf[6]; dst[4] = (float)srcHalf[14]; dst[5] = (float)srcHalf[15]; dst[6] = (float)srcHalf[27]; dst[7] = (float)srcHalf[28]; dst[8] = (float)srcHalf[2]; dst[9] = (float)srcHalf[4]; dst[10] = (float)srcHalf[7]; dst[11] = (float)srcHalf[13]; dst[12] = (float)srcHalf[16]; dst[13] = (float)srcHalf[26]; dst[14] = (float)srcHalf[29]; dst[15] = (float)srcHalf[42]; dst[16] = (float)srcHalf[3]; dst[17] = (float)srcHalf[8]; dst[18] = (float)srcHalf[12]; dst[19] = (float)srcHalf[17]; dst[20] = (float)srcHalf[25]; dst[21] = (float)srcHalf[30]; dst[22] = (float)srcHalf[41]; dst[23] = (float)srcHalf[43]; dst[24] = (float)srcHalf[9]; dst[25] = (float)srcHalf[11]; dst[26] = (float)srcHalf[18]; dst[27] = (float)srcHalf[24]; dst[28] = (float)srcHalf[31]; dst[29] = (float)srcHalf[40]; dst[30] = (float)srcHalf[44]; dst[31] = (float)srcHalf[53]; dst[32] = (float)srcHalf[10]; dst[33] = (float)srcHalf[19]; dst[34] = (float)srcHalf[23]; dst[35] = (float)srcHalf[32]; dst[36] = (float)srcHalf[39]; dst[37] = (float)srcHalf[45]; dst[38] = (float)srcHalf[52]; dst[39] = (float)srcHalf[54]; dst[40] = (float)srcHalf[20]; dst[41] = (float)srcHalf[22]; dst[42] = (float)srcHalf[33]; dst[43] = (float)srcHalf[38]; dst[44] = (float)srcHalf[46]; dst[45] = (float)srcHalf[51]; dst[46] = (float)srcHalf[55]; dst[47] = (float)srcHalf[60]; dst[48] = (float)srcHalf[21]; dst[49] = (float)srcHalf[34]; dst[50] = (float)srcHalf[37]; dst[51] = (float)srcHalf[47]; dst[52] = (float)srcHalf[50]; dst[53] = (float)srcHalf[56]; dst[54] = (float)srcHalf[59]; dst[55] = (float)srcHalf[61]; dst[56] = (float)srcHalf[35]; dst[57] = (float)srcHalf[36]; dst[58] = (float)srcHalf[48]; dst[59] = (float)srcHalf[49]; dst[60] = (float)srcHalf[57]; dst[61] = (float)srcHalf[58]; dst[62] = (float)srcHalf[62]; dst[63] = (float)srcHalf[63]; } // // If we can form the correct ordering in xmm registers, // we can use F16C to convert from HALF -> FLOAT. However, // making the correct order isn't trivial. // // We want to re-order a source 8x8 matrix from: // // 0 1 2 3 4 5 6 7 0 1 5 6 14 15 27 28 // 8 9 10 11 12 13 14 15 2 4 7 13 16 26 29 42 // 16 17 18 19 20 21 22 23 3 8 12 17 25 30 41 43 // 24 25 26 27 28 29 30 31 9 11 18 24 31 40 44 53 (A) // 32 33 34 35 36 37 38 39 --> 10 19 23 32 39 45 52 54 // 40 41 42 43 44 45 46 47 20 22 33 38 46 51 55 60 // 48 49 50 51 52 53 54 55 21 34 37 47 50 56 59 61 // 56 57 58 59 60 61 62 63 35 36 48 49 57 58 62 63 // // Which looks like a mess, right? // // Now, check out the NE/SW diagonals of (A). Along those lines, // we have runs of contiguous values! If we rewrite (A) a bit, we get: // // 0 // 1 2 // 5 4 3 // 6 7 8 9 // 14 13 12 11 10 // 15 16 17 18 19 20 // 27 26 25 24 23 22 21 (B) // 28 29 30 31 32 33 34 35 // 42 41 40 39 38 37 36 // 43 44 45 46 47 48 // 53 52 51 50 49 // 54 55 56 57 // 60 59 58 // 61 62 // 63 // // In this ordering, the columns are the rows (A). If we can 'transpose' // (B), we'll achieve our goal. But we want this to fit nicely into // xmm registers and still be able to load large runs efficiently. // Also, notice that the odd rows are in ascending order, while // the even rows are in descending order. // // If we 'fold' the bottom half up into the top, we can preserve ordered // runs accross rows, and still keep all the correct values in columns. // After transposing, we'll need to rotate things back into place. // This gives us: // // 0 | 42 41 40 39 38 37 36 // 1 2 | 43 44 45 46 47 48 // 5 4 3 | 53 52 51 50 49 // 6 7 8 9 | 54 55 56 57 (C) // 14 13 12 11 10 | 60 59 58 // 15 16 17 18 19 20 | 61 62 // 27 26 25 24 23 22 21 | 61 // 28 29 30 31 32 33 34 35 // // But hang on. We still have the backwards descending rows to deal with. // Lets reverse the even rows so that all values are in ascending order // // 36 37 38 39 40 41 42 | 0 // 1 2 | 43 44 45 46 47 48 // 49 50 51 52 53 | 3 4 5 // 6 7 8 9 | 54 55 56 57 (D) // 58 59 60 | 10 11 12 13 14 // 15 16 17 18 19 20 | 61 62 // 61 | 21 22 23 24 25 26 27 // 28 29 30 31 32 33 34 35 // // If we can form (D), we will then: // 1) Reverse the even rows // 2) Transpose // 3) Rotate the rows // // and we'll have (A). // void fromHalfZigZag_f16c (unsigned short *src, float *dst) { #if defined IMF_HAVE_GCC_INLINEASM_X86_64 __asm__ /* x3 <- 0 * x8 <- [ 0- 7] * x6 <- [56-63] * x9 <- [21-28] * x7 <- [28-35] * x3 <- [ 6- 9] (lower half) */ ("vpxor %%xmm3, %%xmm3, %%xmm3 \n" "vmovdqa (%0), %%xmm8 \n" "vmovdqa 112(%0), %%xmm6 \n" "vmovdqu 42(%0), %%xmm9 \n" "vmovdqu 56(%0), %%xmm7 \n" "vmovq 12(%0), %%xmm3 \n" /* Setup rows 0-2 of A in xmm0-xmm2 * x1 <- x8 >> 16 (1 value) * x2 <- x8 << 32 (2 values) * x0 <- alignr([35-42], x8, 2) * x1 <- blend(x1, [41-48]) * x2 <- blend(x2, [49-56]) */ "vpsrldq $2, %%xmm8, %%xmm1 \n" "vpslldq $4, %%xmm8, %%xmm2 \n" "vpalignr $2, 70(%0), %%xmm8, %%xmm0 \n" "vpblendw $0xfc, 82(%0), %%xmm1, %%xmm1 \n" "vpblendw $0x1f, 98(%0), %%xmm2, %%xmm2 \n" /* Setup rows 4-6 of A in xmm4-xmm6 * x4 <- x6 >> 32 (2 values) * x5 <- x6 << 16 (1 value) * x6 <- alignr(x6,x9,14) * x4 <- blend(x4, [ 7-14]) * x5 <- blend(x5, [15-22]) */ "vpsrldq $4, %%xmm6, %%xmm4 \n" "vpslldq $2, %%xmm6, %%xmm5 \n" "vpalignr $14, %%xmm6, %%xmm9, %%xmm6 \n" "vpblendw $0xf8, 14(%0), %%xmm4, %%xmm4 \n" "vpblendw $0x3f, 30(%0), %%xmm5, %%xmm5 \n" /* Load the upper half of row 3 into xmm3 * x3 <- [54-57] (upper half) */ "vpinsrq $1, 108(%0), %%xmm3, %%xmm3\n" /* Reverse the even rows. We're not using PSHUFB as * that requires loading an extra constant all the time, * and we're alreadly pretty memory bound. */ "vpshuflw $0x1b, %%xmm0, %%xmm0 \n" "vpshuflw $0x1b, %%xmm2, %%xmm2 \n" "vpshuflw $0x1b, %%xmm4, %%xmm4 \n" "vpshuflw $0x1b, %%xmm6, %%xmm6 \n" "vpshufhw $0x1b, %%xmm0, %%xmm0 \n" "vpshufhw $0x1b, %%xmm2, %%xmm2 \n" "vpshufhw $0x1b, %%xmm4, %%xmm4 \n" "vpshufhw $0x1b, %%xmm6, %%xmm6 \n" "vpshufd $0x4e, %%xmm0, %%xmm0 \n" "vpshufd $0x4e, %%xmm2, %%xmm2 \n" "vpshufd $0x4e, %%xmm4, %%xmm4 \n" "vpshufd $0x4e, %%xmm6, %%xmm6 \n" /* Transpose xmm0-xmm7 into xmm8-xmm15 */ "vpunpcklwd %%xmm1, %%xmm0, %%xmm8 \n" "vpunpcklwd %%xmm3, %%xmm2, %%xmm9 \n" "vpunpcklwd %%xmm5, %%xmm4, %%xmm10 \n" "vpunpcklwd %%xmm7, %%xmm6, %%xmm11 \n" "vpunpckhwd %%xmm1, %%xmm0, %%xmm12 \n" "vpunpckhwd %%xmm3, %%xmm2, %%xmm13 \n" "vpunpckhwd %%xmm5, %%xmm4, %%xmm14 \n" "vpunpckhwd %%xmm7, %%xmm6, %%xmm15 \n" "vpunpckldq %%xmm9, %%xmm8, %%xmm0 \n" "vpunpckldq %%xmm11, %%xmm10, %%xmm1 \n" "vpunpckhdq %%xmm9, %%xmm8, %%xmm2 \n" "vpunpckhdq %%xmm11, %%xmm10, %%xmm3 \n" "vpunpckldq %%xmm13, %%xmm12, %%xmm4 \n" "vpunpckldq %%xmm15, %%xmm14, %%xmm5 \n" "vpunpckhdq %%xmm13, %%xmm12, %%xmm6 \n" "vpunpckhdq %%xmm15, %%xmm14, %%xmm7 \n" "vpunpcklqdq %%xmm1, %%xmm0, %%xmm8 \n" "vpunpckhqdq %%xmm1, %%xmm0, %%xmm9 \n" "vpunpcklqdq %%xmm3, %%xmm2, %%xmm10 \n" "vpunpckhqdq %%xmm3, %%xmm2, %%xmm11 \n" "vpunpcklqdq %%xmm4, %%xmm5, %%xmm12 \n" "vpunpckhqdq %%xmm5, %%xmm4, %%xmm13 \n" "vpunpcklqdq %%xmm7, %%xmm6, %%xmm14 \n" "vpunpckhqdq %%xmm7, %%xmm6, %%xmm15 \n" /* Rotate the rows to get the correct final order. * Rotating xmm12 isn't needed, as we can handle * the rotation in the PUNPCKLQDQ above. Rotating * xmm8 isn't needed as it's already in the right order */ "vpalignr $2, %%xmm9, %%xmm9, %%xmm9 \n" "vpalignr $4, %%xmm10, %%xmm10, %%xmm10 \n" "vpalignr $6, %%xmm11, %%xmm11, %%xmm11 \n" "vpalignr $10, %%xmm13, %%xmm13, %%xmm13 \n" "vpalignr $12, %%xmm14, %%xmm14, %%xmm14 \n" "vpalignr $14, %%xmm15, %%xmm15, %%xmm15 \n" /* Convert from half -> float */ "vcvtph2ps %%xmm8, %%ymm8 \n" "vcvtph2ps %%xmm9, %%ymm9 \n" "vcvtph2ps %%xmm10, %%ymm10 \n" "vcvtph2ps %%xmm11, %%ymm11 \n" "vcvtph2ps %%xmm12, %%ymm12 \n" "vcvtph2ps %%xmm13, %%ymm13 \n" "vcvtph2ps %%xmm14, %%ymm14 \n" "vcvtph2ps %%xmm15, %%ymm15 \n" /* Move float values to dst */ "vmovaps %%ymm8, (%1) \n" "vmovaps %%ymm9, 32(%1) \n" "vmovaps %%ymm10, 64(%1) \n" "vmovaps %%ymm11, 96(%1) \n" "vmovaps %%ymm12, 128(%1) \n" "vmovaps %%ymm13, 160(%1) \n" "vmovaps %%ymm14, 192(%1) \n" "vmovaps %%ymm15, 224(%1) \n" #ifndef __AVX__ "vzeroupper \n" #endif /* __AVX__ */ : /* Output */ : /* Input */ "r"(src), "r"(dst) : /* Clobber */ "memory", #ifndef __AVX__ "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", "%xmm15" #else "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", "%ymm7", "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", "%ymm14", "%ymm15" #endif /* __AVX__ */ ); #else fromHalfZigZag_scalar(src, dst); #endif /* defined IMF_HAVE_GCC_INLINEASM_X86_64 */ } // // Inverse 8x8 DCT, only inverting the DC. This assumes that // all AC frequencies are 0. // #ifndef IMF_HAVE_SSE2 void dctInverse8x8DcOnly (float *data) { float val = data[0] * 3.535536e-01f * 3.535536e-01f; for (int i = 0; i < 64; ++i) data[i] = val; } #else /* IMF_HAVE_SSE2 */ void dctInverse8x8DcOnly (float *data) { __m128 src = _mm_set1_ps (data[0] * 3.535536e-01f * 3.535536e-01f); __m128 *dst = (__m128 *)data; for (int i = 0; i < 16; ++i) dst[i] = src; } #endif /* IMF_HAVE_SSE2 */ // // Full 8x8 Inverse DCT: // // Simple inverse DCT on an 8x8 block, with scalar ops only. // Operates on data in-place. // // This is based on the iDCT formuation (y = frequency domain, // x = spatial domain) // // [x0] [ ][y0] [ ][y1] // [x1] = [ M1 ][y2] + [ M2 ][y3] // [x2] [ ][y4] [ ][y5] // [x3] [ ][y6] [ ][y7] // // [x7] [ ][y0] [ ][y1] // [x6] = [ M1 ][y2] - [ M2 ][y3] // [x5] [ ][y4] [ ][y5] // [x4] [ ][y6] [ ][y7] // // where M1: M2: // // [a c a f] [b d e g] // [a f -a -c] [d -g -b -e] // [a -f -a c] [e -b g d] // [a -c a -f] [g -e d -b] // // and the constants are as defined below.. // // If you know how many of the lower rows are zero, that can // be passed in to help speed things up. If you don't know, // just set zeroedRows=0. // // // Default implementation // template void dctInverse8x8_scalar (float *data) { const float a = .5f * cosf (3.14159f / 4.0f); const float b = .5f * cosf (3.14159f / 16.0f); const float c = .5f * cosf (3.14159f / 8.0f); const float d = .5f * cosf (3.f*3.14159f / 16.0f); const float e = .5f * cosf (5.f*3.14159f / 16.0f); const float f = .5f * cosf (3.f*3.14159f / 8.0f); const float g = .5f * cosf (7.f*3.14159f / 16.0f); float alpha[4], beta[4], theta[4], gamma[4]; float *rowPtr = NULL; // // First pass - row wise. // // This looks less-compact than the description above in // an attempt to fold together common sub-expressions. // for (int row = 0; row < 8 - zeroedRows; ++row) { rowPtr = data + row * 8; alpha[0] = c * rowPtr[2]; alpha[1] = f * rowPtr[2]; alpha[2] = c * rowPtr[6]; alpha[3] = f * rowPtr[6]; beta[0] = b * rowPtr[1] + d * rowPtr[3] + e * rowPtr[5] + g * rowPtr[7]; beta[1] = d * rowPtr[1] - g * rowPtr[3] - b * rowPtr[5] - e * rowPtr[7]; beta[2] = e * rowPtr[1] - b * rowPtr[3] + g * rowPtr[5] + d * rowPtr[7]; beta[3] = g * rowPtr[1] - e * rowPtr[3] + d * rowPtr[5] - b * rowPtr[7]; theta[0] = a * (rowPtr[0] + rowPtr[4]); theta[3] = a * (rowPtr[0] - rowPtr[4]); theta[1] = alpha[0] + alpha[3]; theta[2] = alpha[1] - alpha[2]; gamma[0] = theta[0] + theta[1]; gamma[1] = theta[3] + theta[2]; gamma[2] = theta[3] - theta[2]; gamma[3] = theta[0] - theta[1]; rowPtr[0] = gamma[0] + beta[0]; rowPtr[1] = gamma[1] + beta[1]; rowPtr[2] = gamma[2] + beta[2]; rowPtr[3] = gamma[3] + beta[3]; rowPtr[4] = gamma[3] - beta[3]; rowPtr[5] = gamma[2] - beta[2]; rowPtr[6] = gamma[1] - beta[1]; rowPtr[7] = gamma[0] - beta[0]; } // // Second pass - column wise. // for (int column = 0; column < 8; ++column) { alpha[0] = c * data[16+column]; alpha[1] = f * data[16+column]; alpha[2] = c * data[48+column]; alpha[3] = f * data[48+column]; beta[0] = b * data[8+column] + d * data[24+column] + e * data[40+column] + g * data[56+column]; beta[1] = d * data[8+column] - g * data[24+column] - b * data[40+column] - e * data[56+column]; beta[2] = e * data[8+column] - b * data[24+column] + g * data[40+column] + d * data[56+column]; beta[3] = g * data[8+column] - e * data[24+column] + d * data[40+column] - b * data[56+column]; theta[0] = a * (data[column] + data[32+column]); theta[3] = a * (data[column] - data[32+column]); theta[1] = alpha[0] + alpha[3]; theta[2] = alpha[1] - alpha[2]; gamma[0] = theta[0] + theta[1]; gamma[1] = theta[3] + theta[2]; gamma[2] = theta[3] - theta[2]; gamma[3] = theta[0] - theta[1]; data[ column] = gamma[0] + beta[0]; data[ 8 + column] = gamma[1] + beta[1]; data[16 + column] = gamma[2] + beta[2]; data[24 + column] = gamma[3] + beta[3]; data[32 + column] = gamma[3] - beta[3]; data[40 + column] = gamma[2] - beta[2]; data[48 + column] = gamma[1] - beta[1]; data[56 + column] = gamma[0] - beta[0]; } } // // SSE2 Implementation // template void dctInverse8x8_sse2 (float *data) { #ifdef IMF_HAVE_SSE2 __m128 a = {3.535536e-01f,3.535536e-01f,3.535536e-01f,3.535536e-01f}; __m128 b = {4.903927e-01f,4.903927e-01f,4.903927e-01f,4.903927e-01f}; __m128 c = {4.619398e-01f,4.619398e-01f,4.619398e-01f,4.619398e-01f}; __m128 d = {4.157349e-01f,4.157349e-01f,4.157349e-01f,4.157349e-01f}; __m128 e = {2.777855e-01f,2.777855e-01f,2.777855e-01f,2.777855e-01f}; __m128 f = {1.913422e-01f,1.913422e-01f,1.913422e-01f,1.913422e-01f}; __m128 g = {9.754573e-02f,9.754573e-02f,9.754573e-02f,9.754573e-02f}; __m128 c0 = {3.535536e-01f, 3.535536e-01f, 3.535536e-01f, 3.535536e-01f}; __m128 c1 = {4.619398e-01f, 1.913422e-01f,-1.913422e-01f,-4.619398e-01f}; __m128 c2 = {3.535536e-01f,-3.535536e-01f,-3.535536e-01f, 3.535536e-01f}; __m128 c3 = {1.913422e-01f,-4.619398e-01f, 4.619398e-01f,-1.913422e-01f}; __m128 c4 = {4.903927e-01f, 4.157349e-01f, 2.777855e-01f, 9.754573e-02f}; __m128 c5 = {4.157349e-01f,-9.754573e-02f,-4.903927e-01f,-2.777855e-01f}; __m128 c6 = {2.777855e-01f,-4.903927e-01f, 9.754573e-02f, 4.157349e-01f}; __m128 c7 = {9.754573e-02f,-2.777855e-01f, 4.157349e-01f,-4.903927e-01f}; __m128 *srcVec = (__m128 *)data; __m128 x[8], evenSum, oddSum; __m128 in[8], alpha[4], beta[4], theta[4], gamma[4]; // // Rows - // // Treat this just like matrix-vector multiplication. The // trick is to note that: // // [M00 M01 M02 M03][v0] [(v0 M00) + (v1 M01) + (v2 M02) + (v3 M03)] // [M10 M11 M12 M13][v1] = [(v0 M10) + (v1 M11) + (v2 M12) + (v3 M13)] // [M20 M21 M22 M23][v2] [(v0 M20) + (v1 M21) + (v2 M22) + (v3 M23)] // [M30 M31 M32 M33][v3] [(v0 M30) + (v1 M31) + (v2 M32) + (v3 M33)] // // Then, we can fill a register with v_i and multiply by the i-th column // of M, accumulating across all i-s. // // The kids refer to the populating of a register with a single value // "broadcasting", and it can be done with a shuffle instruction. It // seems to be the slowest part of the whole ordeal. // // Our matrix columns are stored above in c0-c7. c0-3 make up M1, and // c4-7 are from M2. // #define DCT_INVERSE_8x8_SS2_ROW_LOOP(i) \ /* \ * Broadcast the components of the row \ */ \ \ x[0] = _mm_shuffle_ps (srcVec[2 * i], \ srcVec[2 * i], \ _MM_SHUFFLE (0, 0, 0, 0)); \ \ x[1] = _mm_shuffle_ps (srcVec[2 * i], \ srcVec[2 * i], \ _MM_SHUFFLE (1, 1, 1, 1)); \ \ x[2] = _mm_shuffle_ps (srcVec[2 * i], \ srcVec[2 * i], \ _MM_SHUFFLE (2, 2, 2, 2)); \ \ x[3] = _mm_shuffle_ps (srcVec[2 * i], \ srcVec[2 * i], \ _MM_SHUFFLE (3, 3, 3, 3)); \ \ x[4] = _mm_shuffle_ps (srcVec[2 * i + 1], \ srcVec[2 * i + 1], \ _MM_SHUFFLE (0, 0, 0, 0)); \ \ x[5] = _mm_shuffle_ps (srcVec[2 * i + 1], \ srcVec[2 * i + 1], \ _MM_SHUFFLE (1, 1, 1, 1)); \ \ x[6] = _mm_shuffle_ps (srcVec[2 * i + 1], \ srcVec[2 * i + 1], \ _MM_SHUFFLE (2, 2, 2, 2)); \ \ x[7] = _mm_shuffle_ps (srcVec[2 * i + 1], \ srcVec[2 * i + 1], \ _MM_SHUFFLE (3, 3, 3, 3)); \ /* \ * Multiply the components by each column of the matrix \ */ \ \ x[0] = _mm_mul_ps (x[0], c0); \ x[2] = _mm_mul_ps (x[2], c1); \ x[4] = _mm_mul_ps (x[4], c2); \ x[6] = _mm_mul_ps (x[6], c3); \ \ x[1] = _mm_mul_ps (x[1], c4); \ x[3] = _mm_mul_ps (x[3], c5); \ x[5] = _mm_mul_ps (x[5], c6); \ x[7] = _mm_mul_ps (x[7], c7); \ \ /* \ * Add across \ */ \ \ evenSum = _mm_setzero_ps(); \ evenSum = _mm_add_ps (evenSum, x[0]); \ evenSum = _mm_add_ps (evenSum, x[2]); \ evenSum = _mm_add_ps (evenSum, x[4]); \ evenSum = _mm_add_ps (evenSum, x[6]); \ \ oddSum = _mm_setzero_ps(); \ oddSum = _mm_add_ps (oddSum, x[1]); \ oddSum = _mm_add_ps (oddSum, x[3]); \ oddSum = _mm_add_ps (oddSum, x[5]); \ oddSum = _mm_add_ps (oddSum, x[7]); \ \ /* \ * Final Sum: \ * out [0, 1, 2, 3] = evenSum + oddSum \ * out [7, 6, 5, 4] = evenSum - oddSum \ */ \ \ srcVec[2 * i] = _mm_add_ps (evenSum, oddSum); \ srcVec[2 * i + 1] = _mm_sub_ps (evenSum, oddSum); \ srcVec[2 * i + 1] = _mm_shuffle_ps (srcVec[2 * i + 1], \ srcVec[2 * i + 1], \ _MM_SHUFFLE (0, 1, 2, 3)); switch (zeroedRows) { case 0: default: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) DCT_INVERSE_8x8_SS2_ROW_LOOP (3) DCT_INVERSE_8x8_SS2_ROW_LOOP (4) DCT_INVERSE_8x8_SS2_ROW_LOOP (5) DCT_INVERSE_8x8_SS2_ROW_LOOP (6) DCT_INVERSE_8x8_SS2_ROW_LOOP (7) break; case 1: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) DCT_INVERSE_8x8_SS2_ROW_LOOP (3) DCT_INVERSE_8x8_SS2_ROW_LOOP (4) DCT_INVERSE_8x8_SS2_ROW_LOOP (5) DCT_INVERSE_8x8_SS2_ROW_LOOP (6) break; case 2: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) DCT_INVERSE_8x8_SS2_ROW_LOOP (3) DCT_INVERSE_8x8_SS2_ROW_LOOP (4) DCT_INVERSE_8x8_SS2_ROW_LOOP (5) break; case 3: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) DCT_INVERSE_8x8_SS2_ROW_LOOP (3) DCT_INVERSE_8x8_SS2_ROW_LOOP (4) break; case 4: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) DCT_INVERSE_8x8_SS2_ROW_LOOP (3) break; case 5: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) DCT_INVERSE_8x8_SS2_ROW_LOOP (2) break; case 6: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) DCT_INVERSE_8x8_SS2_ROW_LOOP (1) break; case 7: DCT_INVERSE_8x8_SS2_ROW_LOOP (0) break; } // // Columns - // // This is slightly more straightforward, if less readable. Here // we just operate on 4 columns at a time, in two batches. // // The slight mess is to try and cache sub-expressions, which // we ignore in the row-wise pass. // for (int col = 0; col < 2; ++col) { for (int i = 0; i < 8; ++i) in[i] = srcVec[2 * i + col]; alpha[0] = _mm_mul_ps (c, in[2]); alpha[1] = _mm_mul_ps (f, in[2]); alpha[2] = _mm_mul_ps (c, in[6]); alpha[3] = _mm_mul_ps (f, in[6]); beta[0] = _mm_add_ps (_mm_add_ps (_mm_mul_ps (in[1], b), _mm_mul_ps (in[3], d)), _mm_add_ps (_mm_mul_ps (in[5], e), _mm_mul_ps (in[7], g))); beta[1] = _mm_sub_ps (_mm_sub_ps (_mm_mul_ps (in[1], d), _mm_mul_ps (in[3], g)), _mm_add_ps (_mm_mul_ps (in[5], b), _mm_mul_ps (in[7], e))); beta[2] = _mm_add_ps (_mm_sub_ps (_mm_mul_ps (in[1], e), _mm_mul_ps (in[3], b)), _mm_add_ps (_mm_mul_ps (in[5], g), _mm_mul_ps (in[7], d))); beta[3] = _mm_add_ps (_mm_sub_ps (_mm_mul_ps (in[1], g), _mm_mul_ps (in[3], e)), _mm_sub_ps (_mm_mul_ps (in[5], d), _mm_mul_ps (in[7], b))); theta[0] = _mm_mul_ps (a, _mm_add_ps (in[0], in[4])); theta[3] = _mm_mul_ps (a, _mm_sub_ps (in[0], in[4])); theta[1] = _mm_add_ps (alpha[0], alpha[3]); theta[2] = _mm_sub_ps (alpha[1], alpha[2]); gamma[0] = _mm_add_ps (theta[0], theta[1]); gamma[1] = _mm_add_ps (theta[3], theta[2]); gamma[2] = _mm_sub_ps (theta[3], theta[2]); gamma[3] = _mm_sub_ps (theta[0], theta[1]); srcVec[ col] = _mm_add_ps (gamma[0], beta[0]); srcVec[2+col] = _mm_add_ps (gamma[1], beta[1]); srcVec[4+col] = _mm_add_ps (gamma[2], beta[2]); srcVec[6+col] = _mm_add_ps (gamma[3], beta[3]); srcVec[ 8+col] = _mm_sub_ps (gamma[3], beta[3]); srcVec[10+col] = _mm_sub_ps (gamma[2], beta[2]); srcVec[12+col] = _mm_sub_ps (gamma[1], beta[1]); srcVec[14+col] = _mm_sub_ps (gamma[0], beta[0]); } #else /* IMF_HAVE_SSE2 */ dctInverse8x8_scalar (data); #endif /* IMF_HAVE_SSE2 */ } // // AVX Implementation // #define STR(A) #A #define IDCT_AVX_SETUP_2_ROWS(_DST0, _DST1, _TMP0, _TMP1, \ _OFF00, _OFF01, _OFF10, _OFF11) \ "vmovaps " STR(_OFF00) "(%0), %%xmm" STR(_TMP0) " \n" \ "vmovaps " STR(_OFF01) "(%0), %%xmm" STR(_TMP1) " \n" \ " \n" \ "vinsertf128 $1, " STR(_OFF10) "(%0), %%ymm" STR(_TMP0) ", %%ymm" STR(_TMP0) " \n" \ "vinsertf128 $1, " STR(_OFF11) "(%0), %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP1) " \n" \ " \n" \ "vunpcklpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST0) " \n" \ "vunpckhpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST1) " \n" \ " \n" \ "vunpcklps %%ymm" STR(_DST1) ", %%ymm" STR(_DST0) ", %%ymm" STR(_TMP0) " \n" \ "vunpckhps %%ymm" STR(_DST1) ", %%ymm" STR(_DST0) ", %%ymm" STR(_TMP1) " \n" \ " \n" \ "vunpcklpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST0) " \n" \ "vunpckhpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST1) " \n" #define IDCT_AVX_MMULT_ROWS(_SRC) \ /* Broadcast the source values into y12-y15 */ \ "vpermilps $0x00, " STR(_SRC) ", %%ymm12 \n" \ "vpermilps $0x55, " STR(_SRC) ", %%ymm13 \n" \ "vpermilps $0xaa, " STR(_SRC) ", %%ymm14 \n" \ "vpermilps $0xff, " STR(_SRC) ", %%ymm15 \n" \ \ /* Multiple coefs and the broadcasted values */ \ "vmulps %%ymm12, %%ymm8, %%ymm12 \n" \ "vmulps %%ymm13, %%ymm9, %%ymm13 \n" \ "vmulps %%ymm14, %%ymm10, %%ymm14 \n" \ "vmulps %%ymm15, %%ymm11, %%ymm15 \n" \ \ /* Accumulate the result back into the source */ \ "vaddps %%ymm13, %%ymm12, %%ymm12 \n" \ "vaddps %%ymm15, %%ymm14, %%ymm14 \n" \ "vaddps %%ymm14, %%ymm12, " STR(_SRC) "\n" #define IDCT_AVX_EO_TO_ROW_HALVES(_EVEN, _ODD, _FRONT, _BACK) \ "vsubps " STR(_ODD) "," STR(_EVEN) "," STR(_BACK) "\n" \ "vaddps " STR(_ODD) "," STR(_EVEN) "," STR(_FRONT) "\n" \ /* Reverse the back half */ \ "vpermilps $0x1b," STR(_BACK) "," STR(_BACK) "\n" /* In order to allow for path paths when we know certain rows * of the 8x8 block are zero, most of the body of the DCT is * in the following macro. Statements are wrapped in a ROWn() * macro, where n is the lowest row in the 8x8 block in which * they depend. * * This should work for the cases where we have 2-8 full rows. * the 1-row case is special, and we'll handle it seperately. */ #define IDCT_AVX_BODY \ /* ============================================== * Row 1D DCT * ---------------------------------------------- */ \ \ /* Setup for the row-oriented 1D DCT. Assuming that (%0) holds * the row-major 8x8 block, load ymm0-3 with the even columns * and ymm4-7 with the odd columns. The lower half of the ymm * holds one row, while the upper half holds the next row. * * If our source is: * a0 a1 a2 a3 a4 a5 a6 a7 * b0 b1 b2 b3 b4 b5 b6 b7 * * We'll be forming: * a0 a2 a4 a6 b0 b2 b4 b6 * a1 a3 a5 a7 b1 b3 b5 b7 */ \ ROW0( IDCT_AVX_SETUP_2_ROWS(0, 4, 14, 15, 0, 16, 32, 48) ) \ ROW2( IDCT_AVX_SETUP_2_ROWS(1, 5, 12, 13, 64, 80, 96, 112) ) \ ROW4( IDCT_AVX_SETUP_2_ROWS(2, 6, 10, 11, 128, 144, 160, 176) ) \ ROW6( IDCT_AVX_SETUP_2_ROWS(3, 7, 8, 9, 192, 208, 224, 240) ) \ \ /* Multiple the even columns (ymm0-3) by the matrix M1 * storing the results back in ymm0-3 * * Assume that (%1) holds the matrix in column major order */ \ "vbroadcastf128 (%1), %%ymm8 \n" \ "vbroadcastf128 16(%1), %%ymm9 \n" \ "vbroadcastf128 32(%1), %%ymm10 \n" \ "vbroadcastf128 48(%1), %%ymm11 \n" \ \ ROW0( IDCT_AVX_MMULT_ROWS(%%ymm0) ) \ ROW2( IDCT_AVX_MMULT_ROWS(%%ymm1) ) \ ROW4( IDCT_AVX_MMULT_ROWS(%%ymm2) ) \ ROW6( IDCT_AVX_MMULT_ROWS(%%ymm3) ) \ \ /* Repeat, but with the odd columns (ymm4-7) and the * matrix M2 */ \ "vbroadcastf128 64(%1), %%ymm8 \n" \ "vbroadcastf128 80(%1), %%ymm9 \n" \ "vbroadcastf128 96(%1), %%ymm10 \n" \ "vbroadcastf128 112(%1), %%ymm11 \n" \ \ ROW0( IDCT_AVX_MMULT_ROWS(%%ymm4) ) \ ROW2( IDCT_AVX_MMULT_ROWS(%%ymm5) ) \ ROW4( IDCT_AVX_MMULT_ROWS(%%ymm6) ) \ ROW6( IDCT_AVX_MMULT_ROWS(%%ymm7) ) \ \ /* Sum the M1 (ymm0-3) and M2 (ymm4-7) results to get the * front halves of the results, and difference to get the * back halves. The front halfs end up in ymm0-3, the back * halves end up in ymm12-15. */ \ ROW0( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm0, %%ymm4, %%ymm0, %%ymm12) ) \ ROW2( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm1, %%ymm5, %%ymm1, %%ymm13) ) \ ROW4( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm2, %%ymm6, %%ymm2, %%ymm14) ) \ ROW6( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm3, %%ymm7, %%ymm3, %%ymm15) ) \ \ /* Reassemble the rows halves into ymm0-7 */ \ ROW7( "vperm2f128 $0x13, %%ymm3, %%ymm15, %%ymm7 \n" ) \ ROW6( "vperm2f128 $0x02, %%ymm3, %%ymm15, %%ymm6 \n" ) \ ROW5( "vperm2f128 $0x13, %%ymm2, %%ymm14, %%ymm5 \n" ) \ ROW4( "vperm2f128 $0x02, %%ymm2, %%ymm14, %%ymm4 \n" ) \ ROW3( "vperm2f128 $0x13, %%ymm1, %%ymm13, %%ymm3 \n" ) \ ROW2( "vperm2f128 $0x02, %%ymm1, %%ymm13, %%ymm2 \n" ) \ ROW1( "vperm2f128 $0x13, %%ymm0, %%ymm12, %%ymm1 \n" ) \ ROW0( "vperm2f128 $0x02, %%ymm0, %%ymm12, %%ymm0 \n" ) \ \ \ /* ============================================== * Column 1D DCT * ---------------------------------------------- */ \ \ /* Rows should be in ymm0-7, and M2 columns should still be * preserved in ymm8-11. M2 has 4 unique values (and +- * versions of each), and all (positive) values appear in * the first column (and row), which is in ymm8. * * For the column-wise DCT, we need to: * 1) Broadcast each element a row of M2 into 4 vectors * 2) Multiple the odd rows (ymm1,3,5,7) by the broadcasts. * 3) Accumulate into ymm12-15 for the odd outputs. * * Instead of doing 16 broadcasts for each element in M2, * do 4, filling y8-11 with: * * ymm8: [ b b b b | b b b b ] * ymm9: [ d d d d | d d d d ] * ymm10: [ e e e e | e e e e ] * ymm11: [ g g g g | g g g g ] * * And deal with the negative values by subtracting during accum. */ \ "vpermilps $0xff, %%ymm8, %%ymm11 \n" \ "vpermilps $0xaa, %%ymm8, %%ymm10 \n" \ "vpermilps $0x55, %%ymm8, %%ymm9 \n" \ "vpermilps $0x00, %%ymm8, %%ymm8 \n" \ \ /* This one is easy, since we have ymm12-15 open for scratch * ymm12 = b ymm1 + d ymm3 + e ymm5 + g ymm7 */ \ ROW1( "vmulps %%ymm1, %%ymm8, %%ymm12 \n" ) \ ROW3( "vmulps %%ymm3, %%ymm9, %%ymm13 \n" ) \ ROW5( "vmulps %%ymm5, %%ymm10, %%ymm14 \n" ) \ ROW7( "vmulps %%ymm7, %%ymm11, %%ymm15 \n" ) \ \ ROW3( "vaddps %%ymm12, %%ymm13, %%ymm12 \n" ) \ ROW7( "vaddps %%ymm14, %%ymm15, %%ymm14 \n" ) \ ROW5( "vaddps %%ymm12, %%ymm14, %%ymm12 \n" ) \ \ /* Tricker, since only y13-15 are open for scratch * ymm13 = d ymm1 - g ymm3 - b ymm5 - e ymm7 */ \ ROW1( "vmulps %%ymm1, %%ymm9, %%ymm13 \n" ) \ ROW3( "vmulps %%ymm3, %%ymm11, %%ymm14 \n" ) \ ROW5( "vmulps %%ymm5, %%ymm8, %%ymm15 \n" ) \ \ ROW5( "vaddps %%ymm14, %%ymm15, %%ymm14 \n" ) \ ROW3( "vsubps %%ymm14, %%ymm13, %%ymm13 \n" ) \ \ ROW7( "vmulps %%ymm7, %%ymm10, %%ymm15 \n" ) \ ROW7( "vsubps %%ymm15, %%ymm13, %%ymm13 \n" ) \ \ /* Tricker still, as only y14-15 are open for scratch * ymm14 = e ymm1 - b ymm3 + g ymm5 + d ymm7 */ \ ROW1( "vmulps %%ymm1, %%ymm10, %%ymm14 \n" ) \ ROW3( "vmulps %%ymm3, %%ymm8, %%ymm15 \n" ) \ \ ROW3( "vsubps %%ymm15, %%ymm14, %%ymm14 \n" ) \ \ ROW5( "vmulps %%ymm5, %%ymm11, %%ymm15 \n" ) \ ROW5( "vaddps %%ymm15, %%ymm14, %%ymm14 \n" ) \ \ ROW7( "vmulps %%ymm7, %%ymm9, %%ymm15 \n" ) \ ROW7( "vaddps %%ymm15, %%ymm14, %%ymm14 \n" ) \ \ \ /* Easy, as we can blow away ymm1,3,5,7 for scratch * ymm15 = g ymm1 - e ymm3 + d ymm5 - b ymm7 */ \ ROW1( "vmulps %%ymm1, %%ymm11, %%ymm15 \n" ) \ ROW3( "vmulps %%ymm3, %%ymm10, %%ymm3 \n" ) \ ROW5( "vmulps %%ymm5, %%ymm9, %%ymm5 \n" ) \ ROW7( "vmulps %%ymm7, %%ymm8, %%ymm7 \n" ) \ \ ROW5( "vaddps %%ymm15, %%ymm5, %%ymm15 \n" ) \ ROW7( "vaddps %%ymm3, %%ymm7, %%ymm3 \n" ) \ ROW3( "vsubps %%ymm3, %%ymm15, %%ymm15 \n" ) \ \ \ /* Load coefs for M1. Because we're going to broadcast * coefs, we don't need to load the actual structure from * M1. Instead, just load enough that we can broadcast. * There are only 6 unique values in M1, but they're in +- * pairs, leaving only 3 unique coefs if we add and subtract * properly. * * Fill ymm1 with coef[2] = [ a a c f | a a c f ] * Broadcast ymm5 with [ f f f f | f f f f ] * Broadcast ymm3 with [ c c c c | c c c c ] * Broadcast ymm1 with [ a a a a | a a a a ] */ \ "vbroadcastf128 8(%1), %%ymm1 \n" \ "vpermilps $0xff, %%ymm1, %%ymm5 \n" \ "vpermilps $0xaa, %%ymm1, %%ymm3 \n" \ "vpermilps $0x00, %%ymm1, %%ymm1 \n" \ \ /* If we expand E = [M1] [x0 x2 x4 x6]^t, we get the following * common expressions: * * E_0 = ymm8 = (a ymm0 + a ymm4) + (c ymm2 + f ymm6) * E_3 = ymm11 = (a ymm0 + a ymm4) - (c ymm2 + f ymm6) * * E_1 = ymm9 = (a ymm0 - a ymm4) + (f ymm2 - c ymm6) * E_2 = ymm10 = (a ymm0 - a ymm4) - (f ymm2 - c ymm6) * * Afterwards, ymm8-11 will hold the even outputs. */ \ \ /* ymm11 = (a ymm0 + a ymm4), ymm1 = (a ymm0 - a ymm4) */ \ ROW0( "vmulps %%ymm1, %%ymm0, %%ymm11 \n" ) \ ROW4( "vmulps %%ymm1, %%ymm4, %%ymm4 \n" ) \ ROW0( "vmovaps %%ymm11, %%ymm1 \n" ) \ ROW4( "vaddps %%ymm4, %%ymm11, %%ymm11 \n" ) \ ROW4( "vsubps %%ymm4, %%ymm1, %%ymm1 \n" ) \ \ /* ymm7 = (c ymm2 + f ymm6) */ \ ROW2( "vmulps %%ymm3, %%ymm2, %%ymm7 \n" ) \ ROW6( "vmulps %%ymm5, %%ymm6, %%ymm9 \n" ) \ ROW6( "vaddps %%ymm9, %%ymm7, %%ymm7 \n" ) \ \ /* E_0 = ymm8 = (a ymm0 + a ymm4) + (c ymm2 + f ymm6) * E_3 = ymm11 = (a ymm0 + a ymm4) - (c ymm2 + f ymm6) */ \ ROW0( "vmovaps %%ymm11, %%ymm8 \n" ) \ ROW2( "vaddps %%ymm7, %%ymm8, %%ymm8 \n" ) \ ROW2( "vsubps %%ymm7, %%ymm11, %%ymm11 \n" ) \ \ /* ymm7 = (f ymm2 - c ymm6) */ \ ROW2( "vmulps %%ymm5, %%ymm2, %%ymm7 \n" ) \ ROW6( "vmulps %%ymm3, %%ymm6, %%ymm9 \n" ) \ ROW6( "vsubps %%ymm9, %%ymm7, %%ymm7 \n" ) \ \ /* E_1 = ymm9 = (a ymm0 - a ymm4) + (f ymm2 - c ymm6) * E_2 = ymm10 = (a ymm0 - a ymm4) - (f ymm2 - c ymm6) */ \ ROW0( "vmovaps %%ymm1, %%ymm9 \n" ) \ ROW0( "vmovaps %%ymm1, %%ymm10 \n" ) \ ROW2( "vaddps %%ymm7, %%ymm1, %%ymm9 \n" ) \ ROW2( "vsubps %%ymm7, %%ymm1, %%ymm10 \n" ) \ \ /* Add the even (ymm8-11) and the odds (ymm12-15), * placing the results into ymm0-7 */ \ "vaddps %%ymm12, %%ymm8, %%ymm0 \n" \ "vaddps %%ymm13, %%ymm9, %%ymm1 \n" \ "vaddps %%ymm14, %%ymm10, %%ymm2 \n" \ "vaddps %%ymm15, %%ymm11, %%ymm3 \n" \ \ "vsubps %%ymm12, %%ymm8, %%ymm7 \n" \ "vsubps %%ymm13, %%ymm9, %%ymm6 \n" \ "vsubps %%ymm14, %%ymm10, %%ymm5 \n" \ "vsubps %%ymm15, %%ymm11, %%ymm4 \n" \ \ /* Copy out the results from ymm0-7 */ \ "vmovaps %%ymm0, (%0) \n" \ "vmovaps %%ymm1, 32(%0) \n" \ "vmovaps %%ymm2, 64(%0) \n" \ "vmovaps %%ymm3, 96(%0) \n" \ "vmovaps %%ymm4, 128(%0) \n" \ "vmovaps %%ymm5, 160(%0) \n" \ "vmovaps %%ymm6, 192(%0) \n" \ "vmovaps %%ymm7, 224(%0) \n" /* Output, input, and clobber (OIC) sections of the inline asm */ #define IDCT_AVX_OIC(_IN0) \ : /* Output */ \ : /* Input */ "r"(_IN0), "r"(sAvxCoef) \ : /* Clobber */ "memory", \ "%xmm0", "%xmm1", "%xmm2", "%xmm3", \ "%xmm4", "%xmm5", "%xmm6", "%xmm7", \ "%xmm8", "%xmm9", "%xmm10", "%xmm11",\ "%xmm12", "%xmm13", "%xmm14", "%xmm15" /* Include vzeroupper for non-AVX builds */ #ifndef __AVX__ #define IDCT_AVX_ASM(_IN0) \ __asm__( \ IDCT_AVX_BODY \ "vzeroupper \n" \ IDCT_AVX_OIC(_IN0) \ ); #else /* __AVX__ */ #define IDCT_AVX_ASM(_IN0) \ __asm__( \ IDCT_AVX_BODY \ IDCT_AVX_OIC(_IN0) \ ); #endif /* __AVX__ */ template void dctInverse8x8_avx (float *data) { #if defined IMF_HAVE_GCC_INLINEASM_X86_64 /* The column-major version of M1, followed by the * column-major version of M2: * * [ a c a f ] [ b d e g ] * M1 = [ a f -a -c ] M2 = [ d -g -b -e ] * [ a -f -a c ] [ e -b g d ] * [ a -c a -f ] [ g -e d -b ] */ const float sAvxCoef[32] __attribute__((aligned(32))) = { 3.535536e-01, 3.535536e-01, 3.535536e-01, 3.535536e-01, /* a a a a */ 4.619398e-01, 1.913422e-01, -1.913422e-01, -4.619398e-01, /* c f -f -c */ 3.535536e-01, -3.535536e-01, -3.535536e-01, 3.535536e-01, /* a -a -a a */ 1.913422e-01, -4.619398e-01, 4.619398e-01, -1.913422e-01, /* f -c c -f */ 4.903927e-01, 4.157349e-01, 2.777855e-01, 9.754573e-02, /* b d e g */ 4.157349e-01, -9.754573e-02, -4.903927e-01, -2.777855e-01, /* d -g -b -e */ 2.777855e-01, -4.903927e-01, 9.754573e-02, 4.157349e-01, /* e -b g d */ 9.754573e-02, -2.777855e-01, 4.157349e-01, -4.903927e-01 /* g -e d -b */ }; #define ROW0(_X) _X #define ROW1(_X) _X #define ROW2(_X) _X #define ROW3(_X) _X #define ROW4(_X) _X #define ROW5(_X) _X #define ROW6(_X) _X #define ROW7(_X) _X if (zeroedRows == 0) { IDCT_AVX_ASM(data) } else if (zeroedRows == 1) { #undef ROW7 #define ROW7(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 2) { #undef ROW6 #define ROW6(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 3) { #undef ROW5 #define ROW5(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 4) { #undef ROW4 #define ROW4(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 5) { #undef ROW3 #define ROW3(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 6) { #undef ROW2 #define ROW2(_X) IDCT_AVX_ASM(data) } else if (zeroedRows == 7) { __asm__( /* ============================================== * Row 1D DCT * ---------------------------------------------- */ IDCT_AVX_SETUP_2_ROWS(0, 4, 14, 15, 0, 16, 32, 48) "vbroadcastf128 (%1), %%ymm8 \n" "vbroadcastf128 16(%1), %%ymm9 \n" "vbroadcastf128 32(%1), %%ymm10 \n" "vbroadcastf128 48(%1), %%ymm11 \n" /* Stash a vector of [a a a a | a a a a] away in ymm2 */ "vinsertf128 $1, %%xmm8, %%ymm8, %%ymm2 \n" IDCT_AVX_MMULT_ROWS(%%ymm0) "vbroadcastf128 64(%1), %%ymm8 \n" "vbroadcastf128 80(%1), %%ymm9 \n" "vbroadcastf128 96(%1), %%ymm10 \n" "vbroadcastf128 112(%1), %%ymm11 \n" IDCT_AVX_MMULT_ROWS(%%ymm4) IDCT_AVX_EO_TO_ROW_HALVES(%%ymm0, %%ymm4, %%ymm0, %%ymm12) "vperm2f128 $0x02, %%ymm0, %%ymm12, %%ymm0 \n" /* ============================================== * Column 1D DCT * ---------------------------------------------- */ /* DC only, so multiple by a and we're done */ "vmulps %%ymm2, %%ymm0, %%ymm0 \n" /* Copy out results */ "vmovaps %%ymm0, (%0) \n" "vmovaps %%ymm0, 32(%0) \n" "vmovaps %%ymm0, 64(%0) \n" "vmovaps %%ymm0, 96(%0) \n" "vmovaps %%ymm0, 128(%0) \n" "vmovaps %%ymm0, 160(%0) \n" "vmovaps %%ymm0, 192(%0) \n" "vmovaps %%ymm0, 224(%0) \n" #ifndef __AVX__ "vzeroupper \n" #endif /* __AVX__ */ IDCT_AVX_OIC(data) ); } else { assert(false); // Invalid template instance parameter } #else /* IMF_HAVE_GCC_INLINEASM_X86_64 */ dctInverse8x8_scalar(data); #endif /* IMF_HAVE_GCC_INLINEASM_X86_64 */ } // // Full 8x8 Forward DCT: // // Base forward 8x8 DCT implementation. Works on the data in-place // // The implementation describedin Pennebaker + Mitchell, // section 4.3.2, and illustrated in figure 4-7 // // The basic idea is that the 1D DCT math reduces to: // // 2*out_0 = c_4 [(s_07 + s_34) + (s_12 + s_56)] // 2*out_4 = c_4 [(s_07 + s_34) - (s_12 + s_56)] // // {2*out_2, 2*out_6} = rot_6 ((d_12 - d_56), (s_07 - s_34)) // // {2*out_3, 2*out_5} = rot_-3 (d_07 - c_4 (s_12 - s_56), // d_34 - c_4 (d_12 + d_56)) // // {2*out_1, 2*out_7} = rot_-1 (d_07 + c_4 (s_12 - s_56), // -d_34 - c_4 (d_12 + d_56)) // // where: // // c_i = cos(i*pi/16) // s_i = sin(i*pi/16) // // s_ij = in_i + in_j // d_ij = in_i - in_j // // rot_i(x, y) = {c_i*x + s_i*y, -s_i*x + c_i*y} // // We'll run the DCT in two passes. First, run the 1D DCT on // the rows, in-place. Then, run over the columns in-place, // and be done with it. // #ifndef IMF_HAVE_SSE2 // // Default implementation // void dctForward8x8 (float *data) { float A0, A1, A2, A3, A4, A5, A6, A7; float K0, K1, rot_x, rot_y; float *srcPtr = data; float *dstPtr = data; const float c1 = cosf (3.14159f * 1.0f / 16.0f); const float c2 = cosf (3.14159f * 2.0f / 16.0f); const float c3 = cosf (3.14159f * 3.0f / 16.0f); const float c4 = cosf (3.14159f * 4.0f / 16.0f); const float c5 = cosf (3.14159f * 5.0f / 16.0f); const float c6 = cosf (3.14159f * 6.0f / 16.0f); const float c7 = cosf (3.14159f * 7.0f / 16.0f); const float c1Half = .5f * c1; const float c2Half = .5f * c2; const float c3Half = .5f * c3; const float c5Half = .5f * c5; const float c6Half = .5f * c6; const float c7Half = .5f * c7; // // First pass - do a 1D DCT over the rows and write the // results back in place // for (int row=0; row<8; ++row) { float *srcRowPtr = srcPtr + 8 * row; float *dstRowPtr = dstPtr + 8 * row; A0 = srcRowPtr[0] + srcRowPtr[7]; A1 = srcRowPtr[1] + srcRowPtr[2]; A2 = srcRowPtr[1] - srcRowPtr[2]; A3 = srcRowPtr[3] + srcRowPtr[4]; A4 = srcRowPtr[3] - srcRowPtr[4]; A5 = srcRowPtr[5] + srcRowPtr[6]; A6 = srcRowPtr[5] - srcRowPtr[6]; A7 = srcRowPtr[0] - srcRowPtr[7]; K0 = c4 * (A0 + A3); K1 = c4 * (A1 + A5); dstRowPtr[0] = .5f * (K0 + K1); dstRowPtr[4] = .5f * (K0 - K1); // // (2*dst2, 2*dst6) = rot 6 (d12 - d56, s07 - s34) // rot_x = A2 - A6; rot_y = A0 - A3; dstRowPtr[2] = c6Half * rot_x + c2Half * rot_y; dstRowPtr[6] = c6Half * rot_y - c2Half * rot_x; // // K0, K1 are active until after dst[1],dst[7] // as well as dst[3], dst[5] are computed. // K0 = c4 * (A1 - A5); K1 = -1 * c4 * (A2 + A6); // // Two ways to do a rotation: // // rot i (x, y) = // X = c_i*x + s_i*y // Y = -s_i*x + c_i*y // // OR // // X = c_i*(x+y) + (s_i-c_i)*y // Y = c_i*y - (s_i+c_i)*x // // the first case has 4 multiplies, but fewer constants, // while the 2nd case has fewer multiplies but takes more space. // // (2*dst3, 2*dst5) = rot -3 ( d07 - K0, d34 + K1 ) // rot_x = A7 - K0; rot_y = A4 + K1; dstRowPtr[3] = c3Half * rot_x - c5Half * rot_y; dstRowPtr[5] = c5Half * rot_x + c3Half * rot_y; // // (2*dst1, 2*dst7) = rot -1 ( d07 + K0, K1 - d34 ) // rot_x = A7 + K0; rot_y = K1 - A4; // // A: 4, 7 are inactive. All A's are inactive // dstRowPtr[1] = c1Half * rot_x - c7Half * rot_y; dstRowPtr[7] = c7Half * rot_x + c1Half * rot_y; } // // Second pass - do the same, but on the columns // for (int column = 0; column < 8; ++column) { A0 = srcPtr[ column] + srcPtr[56 + column]; A7 = srcPtr[ column] - srcPtr[56 + column]; A1 = srcPtr[ 8 + column] + srcPtr[16 + column]; A2 = srcPtr[ 8 + column] - srcPtr[16 + column]; A3 = srcPtr[24 + column] + srcPtr[32 + column]; A4 = srcPtr[24 + column] - srcPtr[32 + column]; A5 = srcPtr[40 + column] + srcPtr[48 + column]; A6 = srcPtr[40 + column] - srcPtr[48 + column]; K0 = c4 * (A0 + A3); K1 = c4 * (A1 + A5); dstPtr[ column] = .5f * (K0 + K1); dstPtr[32+column] = .5f * (K0 - K1); // // (2*dst2, 2*dst6) = rot 6 ( d12 - d56, s07 - s34 ) // rot_x = A2 - A6; rot_y = A0 - A3; dstPtr[16+column] = .5f * (c6 * rot_x + c2 * rot_y); dstPtr[48+column] = .5f * (c6 * rot_y - c2 * rot_x); // // K0, K1 are active until after dst[1],dst[7] // as well as dst[3], dst[5] are computed. // K0 = c4 * (A1 - A5); K1 = -1 * c4 * (A2 + A6); // // (2*dst3, 2*dst5) = rot -3 ( d07 - K0, d34 + K1 ) // rot_x = A7 - K0; rot_y = A4 + K1; dstPtr[24+column] = .5f * (c3 * rot_x - c5 * rot_y); dstPtr[40+column] = .5f * (c5 * rot_x + c3 * rot_y); // // (2*dst1, 2*dst7) = rot -1 ( d07 + K0, K1 - d34 ) // rot_x = A7 + K0; rot_y = K1 - A4; dstPtr[ 8+column] = .5f * (c1 * rot_x - c7 * rot_y); dstPtr[56+column] = .5f * (c7 * rot_x + c1 * rot_y); } } #else /* IMF_HAVE_SSE2 */ // // SSE2 implementation // // Here, we're always doing a column-wise operation // plus transposes. This might be faster to do differently // between rows-wise and column-wise // void dctForward8x8 (float *data) { __m128 *srcVec = (__m128 *)data; __m128 a0Vec, a1Vec, a2Vec, a3Vec, a4Vec, a5Vec, a6Vec, a7Vec; __m128 k0Vec, k1Vec, rotXVec, rotYVec; __m128 transTmp[4], transTmp2[4]; __m128 c4Vec = { .70710678f, .70710678f, .70710678f, .70710678f}; __m128 c4NegVec = {-.70710678f, -.70710678f, -.70710678f, -.70710678f}; __m128 c1HalfVec = {.490392640f, .490392640f, .490392640f, .490392640f}; __m128 c2HalfVec = {.461939770f, .461939770f, .461939770f, .461939770f}; __m128 c3HalfVec = {.415734810f, .415734810f, .415734810f, .415734810f}; __m128 c5HalfVec = {.277785120f, .277785120f, .277785120f, .277785120f}; __m128 c6HalfVec = {.191341720f, .191341720f, .191341720f, .191341720f}; __m128 c7HalfVec = {.097545161f, .097545161f, .097545161f, .097545161f}; __m128 halfVec = {.5f, .5f, .5f, .5f}; for (int iter = 0; iter < 2; ++iter) { // // Operate on 4 columns at a time. The // offsets into our row-major array are: // 0: 0 1 // 1: 2 3 // 2: 4 5 // 3: 6 7 // 4: 8 9 // 5: 10 11 // 6: 12 13 // 7: 14 15 // for (int pass=0; pass<2; ++pass) { a0Vec = _mm_add_ps (srcVec[ 0 + pass], srcVec[14 + pass]); a1Vec = _mm_add_ps (srcVec[ 2 + pass], srcVec[ 4 + pass]); a3Vec = _mm_add_ps (srcVec[ 6 + pass], srcVec[ 8 + pass]); a5Vec = _mm_add_ps (srcVec[10 + pass], srcVec[12 + pass]); a7Vec = _mm_sub_ps (srcVec[ 0 + pass], srcVec[14 + pass]); a2Vec = _mm_sub_ps (srcVec[ 2 + pass], srcVec[ 4 + pass]); a4Vec = _mm_sub_ps (srcVec[ 6 + pass], srcVec[ 8 + pass]); a6Vec = _mm_sub_ps (srcVec[10 + pass], srcVec[12 + pass]); // // First stage; Compute out_0 and out_4 // k0Vec = _mm_add_ps (a0Vec, a3Vec); k1Vec = _mm_add_ps (a1Vec, a5Vec); k0Vec = _mm_mul_ps (c4Vec, k0Vec); k1Vec = _mm_mul_ps (c4Vec, k1Vec); srcVec[0 + pass] = _mm_add_ps (k0Vec, k1Vec); srcVec[8 + pass] = _mm_sub_ps (k0Vec, k1Vec); srcVec[0 + pass] = _mm_mul_ps (srcVec[0 + pass], halfVec ); srcVec[8 + pass] = _mm_mul_ps (srcVec[8 + pass], halfVec ); // // Second stage; Compute out_2 and out_6 // k0Vec = _mm_sub_ps (a2Vec, a6Vec); k1Vec = _mm_sub_ps (a0Vec, a3Vec); srcVec[ 4 + pass] = _mm_add_ps (_mm_mul_ps (c6HalfVec, k0Vec), _mm_mul_ps (c2HalfVec, k1Vec)); srcVec[12 + pass] = _mm_sub_ps (_mm_mul_ps (c6HalfVec, k1Vec), _mm_mul_ps (c2HalfVec, k0Vec)); // // Precompute K0 and K1 for the remaining stages // k0Vec = _mm_mul_ps (_mm_sub_ps (a1Vec, a5Vec), c4Vec); k1Vec = _mm_mul_ps (_mm_add_ps (a2Vec, a6Vec), c4NegVec); // // Third Stage, compute out_3 and out_5 // rotXVec = _mm_sub_ps (a7Vec, k0Vec); rotYVec = _mm_add_ps (a4Vec, k1Vec); srcVec[ 6 + pass] = _mm_sub_ps (_mm_mul_ps (c3HalfVec, rotXVec), _mm_mul_ps (c5HalfVec, rotYVec)); srcVec[10 + pass] = _mm_add_ps (_mm_mul_ps (c5HalfVec, rotXVec), _mm_mul_ps (c3HalfVec, rotYVec)); // // Fourth Stage, compute out_1 and out_7 // rotXVec = _mm_add_ps (a7Vec, k0Vec); rotYVec = _mm_sub_ps (k1Vec, a4Vec); srcVec[ 2 + pass] = _mm_sub_ps (_mm_mul_ps (c1HalfVec, rotXVec), _mm_mul_ps (c7HalfVec, rotYVec)); srcVec[14 + pass] = _mm_add_ps (_mm_mul_ps (c7HalfVec, rotXVec), _mm_mul_ps (c1HalfVec, rotYVec)); } // // Transpose the matrix, in 4x4 blocks. So, if we have our // 8x8 matrix divied into 4x4 blocks: // // M0 | M1 M0t | M2t // ----+--- --> -----+------ // M2 | M3 M1t | M3t // // // M0t, done in place, the first half. // transTmp[0] = _mm_shuffle_ps (srcVec[0], srcVec[2], 0x44); transTmp[1] = _mm_shuffle_ps (srcVec[4], srcVec[6], 0x44); transTmp[3] = _mm_shuffle_ps (srcVec[4], srcVec[6], 0xEE); transTmp[2] = _mm_shuffle_ps (srcVec[0], srcVec[2], 0xEE); // // M3t, also done in place, the first half. // transTmp2[0] = _mm_shuffle_ps (srcVec[ 9], srcVec[11], 0x44); transTmp2[1] = _mm_shuffle_ps (srcVec[13], srcVec[15], 0x44); transTmp2[2] = _mm_shuffle_ps (srcVec[ 9], srcVec[11], 0xEE); transTmp2[3] = _mm_shuffle_ps (srcVec[13], srcVec[15], 0xEE); // // M0t, the second half. // srcVec[0] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0x88); srcVec[4] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0x88); srcVec[2] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0xDD); srcVec[6] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0xDD); // // M3t, the second half. // srcVec[ 9] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0x88); srcVec[13] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0x88); srcVec[11] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0xDD); srcVec[15] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0xDD); // // M1 and M2 need to be done at the same time, because we're // swapping. // // First, the first half of M1t // transTmp[0] = _mm_shuffle_ps (srcVec[1], srcVec[3], 0x44); transTmp[1] = _mm_shuffle_ps (srcVec[5], srcVec[7], 0x44); transTmp[2] = _mm_shuffle_ps (srcVec[1], srcVec[3], 0xEE); transTmp[3] = _mm_shuffle_ps (srcVec[5], srcVec[7], 0xEE); // // And the first half of M2t // transTmp2[0] = _mm_shuffle_ps (srcVec[ 8], srcVec[10], 0x44); transTmp2[1] = _mm_shuffle_ps (srcVec[12], srcVec[14], 0x44); transTmp2[2] = _mm_shuffle_ps (srcVec[ 8], srcVec[10], 0xEE); transTmp2[3] = _mm_shuffle_ps (srcVec[12], srcVec[14], 0xEE); // // Second half of M1t // srcVec[ 8] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0x88); srcVec[12] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0x88); srcVec[10] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0xDD); srcVec[14] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0xDD); // // Second half of M2 // srcVec[1] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0x88); srcVec[5] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0x88); srcVec[3] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0xDD); srcVec[7] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0xDD); } } #endif /* IMF_HAVE_SSE2 */ } // namespace OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfEnvmap.cpp000066400000000000000000000160751406177042200202440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Environment maps // //----------------------------------------------------------------------------- #include "ImfEnvmap.h" #include "ImathFun.h" #include "ImfNamespace.h" #include #include using namespace std; using namespace IMATH_NAMESPACE; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace LatLongMap { V2f latLong (const V3f &dir) { float r = sqrt (dir.z * dir.z + dir.x * dir.x); float latitude = (r < abs (dir.y))? acos (r / dir.length()) * sign (dir.y): asin (dir.y / dir.length()); float longitude = (dir.z == 0 && dir.x == 0)? 0: atan2 (dir.x, dir.z); return V2f (latitude, longitude); } V2f latLong (const Box2i &dataWindow, const V2f &pixelPosition) { float latitude, longitude; if (dataWindow.max.y > dataWindow.min.y) { latitude = -1 * float(M_PI) * ((pixelPosition.y - dataWindow.min.y) / (dataWindow.max.y - dataWindow.min.y) - 0.5f); } else { latitude = 0; } if (dataWindow.max.x > dataWindow.min.x) { longitude = -2 * float(M_PI) * ((pixelPosition.x - dataWindow.min.x) / (dataWindow.max.x - dataWindow.min.x) - 0.5f); } else { longitude = 0; } return V2f (latitude, longitude); } V2f pixelPosition (const Box2i &dataWindow, const V2f &latLong) { float x = latLong.y / (-2 * float(M_PI)) + 0.5f; float y = latLong.x / (-1 * float(M_PI)) + 0.5f; return V2f (x * (dataWindow.max.x - dataWindow.min.x) + dataWindow.min.x, y * (dataWindow.max.y - dataWindow.min.y) + dataWindow.min.y); } V2f pixelPosition (const Box2i &dataWindow, const V3f &direction) { return pixelPosition (dataWindow, latLong (direction)); } V3f direction (const Box2i &dataWindow, const V2f &pixelPosition) { V2f ll = latLong (dataWindow, pixelPosition); return V3f (sin (ll.y) * cos (ll.x), sin (ll.x), cos (ll.y) * cos (ll.x)); } } // namespace LatLongMap namespace CubeMap { int sizeOfFace (const Box2i &dataWindow) { return min ((dataWindow.max.x - dataWindow.min.x + 1), (dataWindow.max.y - dataWindow.min.y + 1) / 6); } Box2i dataWindowForFace (CubeMapFace face, const Box2i &dataWindow) { int sof = sizeOfFace (dataWindow); Box2i dwf; dwf.min.x = 0; dwf.min.y = int (face) * sof; dwf.max.x = dwf.min.x + sof - 1; dwf.max.y = dwf.min.y + sof - 1; return dwf; } V2f pixelPosition (CubeMapFace face, const Box2i &dataWindow, V2f positionInFace) { Box2i dwf = dataWindowForFace (face, dataWindow); V2f pos (0, 0); switch (face) { case CUBEFACE_POS_X: pos.x = dwf.min.x + positionInFace.y; pos.y = dwf.max.y - positionInFace.x; break; case CUBEFACE_NEG_X: pos.x = dwf.max.x - positionInFace.y; pos.y = dwf.max.y - positionInFace.x; break; case CUBEFACE_POS_Y: pos.x = dwf.min.x + positionInFace.x; pos.y = dwf.max.y - positionInFace.y; break; case CUBEFACE_NEG_Y: pos.x = dwf.min.x + positionInFace.x; pos.y = dwf.min.y + positionInFace.y; break; case CUBEFACE_POS_Z: pos.x = dwf.max.x - positionInFace.x; pos.y = dwf.max.y - positionInFace.y; break; case CUBEFACE_NEG_Z: pos.x = dwf.min.x + positionInFace.x; pos.y = dwf.max.y - positionInFace.y; break; } return pos; } void faceAndPixelPosition (const V3f &direction, const Box2i &dataWindow, CubeMapFace &face, V2f &pif) { int sof = sizeOfFace (dataWindow); float absx = abs (direction.x); float absy = abs (direction.y); float absz = abs (direction.z); if (absx >= absy && absx >= absz) { if (absx == 0) { // // Special case - direction is (0, 0, 0) // face = CUBEFACE_POS_X; pif = V2f (0, 0); return; } pif.x = (direction.y / absx + 1) / 2 * (sof - 1); pif.y = (direction.z / absx + 1) / 2 * (sof - 1); if (direction.x > 0) face = CUBEFACE_POS_X; else face = CUBEFACE_NEG_X; } else if (absy >= absz) { pif.x = (direction.x / absy + 1) / 2 * (sof - 1); pif.y = (direction.z / absy + 1) / 2 * (sof - 1); if (direction.y > 0) face = CUBEFACE_POS_Y; else face = CUBEFACE_NEG_Y; } else { pif.x = (direction.x / absz + 1) / 2 * (sof - 1); pif.y = (direction.y / absz + 1) / 2 * (sof - 1); if (direction.z > 0) face = CUBEFACE_POS_Z; else face = CUBEFACE_NEG_Z; } } V3f direction (CubeMapFace face, const Box2i &dataWindow, const V2f &positionInFace) { int sof = sizeOfFace (dataWindow); V2f pos; if (sof > 1) { pos = V2f (positionInFace.x / (sof - 1) * 2 - 1, positionInFace.y / (sof - 1) * 2 - 1); } else { pos = V2f (0, 0); } V3f dir (1, 0, 0); switch (face) { case CUBEFACE_POS_X: dir.x = 1; dir.y = pos.x; dir.z = pos.y; break; case CUBEFACE_NEG_X: dir.x = -1; dir.y = pos.x; dir.z = pos.y; break; case CUBEFACE_POS_Y: dir.x = pos.x; dir.y = 1; dir.z = pos.y; break; case CUBEFACE_NEG_Y: dir.x = pos.x; dir.y = -1; dir.z = pos.y; break; case CUBEFACE_POS_Z: dir.x = pos.x; dir.y = pos.y; dir.z = 1; break; case CUBEFACE_NEG_Z: dir.x = pos.x; dir.y = pos.y; dir.z = -1; break; } return dir; } } // namespace CubeMap OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfEnvmap.h000066400000000000000000000264451406177042200177130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ENVMAP_H #define INCLUDED_IMF_ENVMAP_H //----------------------------------------------------------------------------- // // Environment maps // // Environment maps define a mapping from 3D directions to 2D // pixel space locations. Environment maps are typically used // in 3D rendering, for effects such as quickly approximating // how shiny surfaces reflect their environment. // // Environment maps can be stored in scanline-based or in tiled // OpenEXR files. The fact that an image is an environment map // is indicated by the presence of an EnvmapAttribute whose name // is "envmap". (Convenience functions to access this attribute // are defined in header file ImfStandardAttributes.h.) // The attribute's value defines the mapping from 3D directions // to 2D pixel space locations. // // This header file defines the set of possible EnvmapAttribute // values. // // For each possible EnvmapAttribute value, this header file also // defines a set of convienience functions to convert between 3D // directions and 2D pixel locations. // // Most of the convenience functions defined below require a // dataWindow parameter. For scanline-based images, and for // tiled images with level mode ONE_LEVEL, the dataWindow // parameter should be set to the image's data window, as // defined in the image header. For tiled images with level // mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the // image level that is being accessed should be used instead. // (See the dataWindowForLevel() methods in ImfTiledInputFile.h // and ImfTiledOutputFile.h.) // //----------------------------------------------------------------------------- #include "ImathBox.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //-------------------------------- // Supported environment map types //-------------------------------- enum Envmap { ENVMAP_LATLONG = 0, // Latitude-longitude environment map ENVMAP_CUBE = 1, // Cube map NUM_ENVMAPTYPES // Number of different environment map types }; //------------------------------------------------------------------------- // Latitude-Longitude Map: // // The environment is projected onto the image using polar coordinates // (latitude and longitude). A pixel's x coordinate corresponds to // its longitude, and the y coordinate corresponds to its latitude. // Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and // longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has // latitude -pi/2 and longitude -pi. // // In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and // positive y direction. Latitude 0, longitude 0 points into positive // z direction; and latitude 0, longitude pi/2 points into positive x // direction. // // The size of the data window should be 2*N by N pixels (width by height), // where N can be any integer greater than 0. //------------------------------------------------------------------------- namespace LatLongMap { //---------------------------------------------------- // Convert a 3D direction to a 2D vector whose x and y // components represent the corresponding latitude // and longitude. //---------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V2f latLong (const IMATH_NAMESPACE::V3f &direction); //-------------------------------------------------------- // Convert the position of a pixel to a 2D vector whose // x and y components represent the corresponding latitude // and longitude. //-------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V2f latLong (const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition); //------------------------------------------------------------- // Convert a 2D vector, whose x and y components represent // longitude and latitude, into a corresponding pixel position. //------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V2f pixelPosition (const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &latLong); //----------------------------------------------------- // Convert a 3D direction vector into a corresponding // pixel position. pixelPosition(dw,dir) is equivalent // to pixelPosition(dw,latLong(dw,dir)). //----------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V2f pixelPosition (const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V3f &direction); //-------------------------------------------------------- // Convert the position of a pixel in a latitude-longitude // map into a corresponding 3D direction. //-------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V3f direction (const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition); } //-------------------------------------------------------------- // Cube Map: // // The environment is projected onto the six faces of an // axis-aligned cube. The cube's faces are then arranged // in a 2D image as shown below. // // 2-----------3 // / /| // / / | Y // / / | | // 6-----------7 | | // | | | | // | | | | // | 0 | 1 *------- X // | | / / // | | / / // | |/ / // 4-----------5 Z // // dataWindow.min // / // / // +-----------+ // |3 Y 7| // | | | // | | | // | ---+---Z | +X face // | | | // | | | // |1 5| // +-----------+ // |6 Y 2| // | | | // | | | // | Z---+--- | -X face // | | | // | | | // |4 0| // +-----------+ // |6 Z 7| // | | | // | | | // | ---+---X | +Y face // | | | // | | | // |2 3| // +-----------+ // |0 1| // | | | // | | | // | ---+---X | -Y face // | | | // | | | // |4 Z 5| // +-----------+ // |7 Y 6| // | | | // | | | // | X---+--- | +Z face // | | | // | | | // |5 4| // +-----------+ // |2 Y 3| // | | | // | | | // | ---+---X | -Z face // | | | // | | | // |0 1| // +-----------+ // / // / // dataWindow.max // // The size of the data window should be N by 6*N pixels // (width by height), where N can be any integer greater // than 0. // //-------------------------------------------------------------- //------------------------------------ // Names for the six faces of the cube //------------------------------------ enum CubeMapFace { CUBEFACE_POS_X, // +X face CUBEFACE_NEG_X, // -X face CUBEFACE_POS_Y, // +Y face CUBEFACE_NEG_Y, // -Y face CUBEFACE_POS_Z, // +Z face CUBEFACE_NEG_Z // -Z face }; namespace CubeMap { //--------------------------------------------- // Width and height of a cube's face, in pixels //--------------------------------------------- IMF_EXPORT int sizeOfFace (const IMATH_NAMESPACE::Box2i &dataWindow); //------------------------------------------ // Compute the region in the environment map // that is covered by the specified face. //------------------------------------------ IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForFace (CubeMapFace face, const IMATH_NAMESPACE::Box2i &dataWindow); //---------------------------------------------------- // Convert the coordinates of a pixel within a face // [in the range from (0,0) to (s-1,s-1), where // s == sizeOfFace(dataWindow)] to pixel coordinates // in the environment map. //---------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V2f pixelPosition (CubeMapFace face, const IMATH_NAMESPACE::Box2i &dataWindow, IMATH_NAMESPACE::V2f positionInFace); //-------------------------------------------------------------- // Convert a 3D direction into a cube face, and a pixel position // within that face. // // If you have a 3D direction, dir, the following code fragment // finds the position, pos, of the corresponding pixel in an // environment map with data window dw: // // CubeMapFace f; // V2f pif, pos; // // faceAndPixelPosition (dir, dw, f, pif); // pos = pixelPosition (f, dw, pif); // //-------------------------------------------------------------- IMF_EXPORT void faceAndPixelPosition (const IMATH_NAMESPACE::V3f &direction, const IMATH_NAMESPACE::Box2i &dataWindow, CubeMapFace &face, IMATH_NAMESPACE::V2f &positionInFace); // -------------------------------------------------------- // Given a cube face and a pixel position within that face, // compute the corresponding 3D direction. // -------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::V3f direction (CubeMapFace face, const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &positionInFace); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp000066400000000000000000000063061406177042200221240ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class EnvmapAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * EnvmapAttribute::staticTypeName () { return "envmap"; } template <> void EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const #if defined (__clang__) // _value may be an invalid value, which the clang sanitizer reports // as undefined behavior, even though the value is acceptable in this // context. __attribute__((no_sanitize ("undefined"))) #endif { unsigned char tmp = _value; Xdr::write (os, tmp); } template <> void EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; Xdr::read (is, tmp); _value = Envmap (tmp); } template <> void EnvmapAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other) #if defined (__clang__) // _value may be an invalid value, which the clang sanitizer reports // as undefined behavior, even though the value is acceptable in this // context. __attribute__((no_sanitize ("undefined"))) #endif { _value = cast(other).value(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfEnvmapAttribute.h000066400000000000000000000054421406177042200215710ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ENVMAP_ATTRIBUTE_H #define INCLUDED_IMF_ENVMAP_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class EnvmapAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfEnvmap.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute EnvmapAttribute; template <> IMF_EXPORT const char *EnvmapAttribute::staticTypeName (); template <> IMF_EXPORT void EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); template <> IMF_EXPORT void EnvmapAttribute::copyValueFrom (const OPENEXR_IMF_INTERNAL_NAMESPACE::Attribute &other); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfExport.h000066400000000000000000000041651406177042200177410ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #if defined(OPENEXR_DLL) #if defined(ILMIMF_EXPORTS) #define IMF_EXPORT __declspec(dllexport) #define IMF_EXPORT_CONST extern __declspec(dllexport) #else #define IMF_EXPORT __declspec(dllimport) #define IMF_EXPORT_CONST extern __declspec(dllimport) #endif #else #define IMF_EXPORT #define IMF_EXPORT_CONST extern const #endif openexr-2.5.7/OpenEXR/IlmImf/ImfFastHuf.cpp000066400000000000000000000553171406177042200203600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfFastHuf.h" #include #include #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER // // Adapted from hufUnpackEncTable - // We don't need to reconstruct the code book, just the encoded // lengths for each symbol. From the lengths, we can build the // base + offset tables. This should be a bit more efficient // for sparse code books. // // table - ptr to the start of the code length data. Will be // updated as we decode data // // numBytes - size of the encoded table (I think)? // // minSymbol - smallest symbol in the code book // // maxSymbol - largest symbol in the code book. // // rleSymbol - the symbol to trigger RLE in the encoded bitstream // FastHufDecoder::FastHufDecoder (const char *&table, int numBytes, int minSymbol, int maxSymbol, int rleSymbol) : _rleSymbol (rleSymbol), _numSymbols (0), _minCodeLength (255), _maxCodeLength (0), _idToSymbol (0) { // // List of symbols that we find with non-zero code lengths // (listed in the order we find them). Store these in the // same format as the code book stores codes + lengths - // low 6 bits are the length, everything above that is // the symbol. // std::vector symbols; // // The 'base' table is the minimum code at each code length. base[i] // is the smallest code (numerically) of length i. // Int64 base[MAX_CODE_LEN + 1]; // // The 'offset' table is the position (in sorted order) of the first id // of a given code lenght. Array is indexed by code length, like base. // Int64 offset[MAX_CODE_LEN + 1]; // // Count of how many codes at each length there are. Array is // indexed by code length, like base and offset. // size_t codeCount[MAX_CODE_LEN + 1]; for (int i = 0; i <= MAX_CODE_LEN; ++i) { codeCount[i] = 0; base[i] = 0xffffffffffffffffULL; offset[i] = 0; } // // Count the number of codes, the min/max code lengths, the number of // codes with each length, and record symbols with non-zero code // length as we find them. // const char *currByte = table; Int64 currBits = 0; int currBitCount = 0; const int SHORT_ZEROCODE_RUN = 59; const int LONG_ZEROCODE_RUN = 63; const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; for (Int64 symbol = static_cast(minSymbol); symbol <= static_cast(maxSymbol); symbol++) { if (currByte - table >= numBytes) { throw IEX_NAMESPACE::InputExc ("Error decoding Huffman table " "(Truncated table data)."); } // // Next code length - either: // 0-58 (literal code length) // 59-62 (various lengths runs of 0) // 63 (run of n 0's, with n is the next 8 bits) // Int64 codeLen = readBits (6, currBits, currBitCount, currByte); if (codeLen == (Int64) LONG_ZEROCODE_RUN) { if (currByte - table >= numBytes) { throw IEX_NAMESPACE::InputExc ("Error decoding Huffman table " "(Truncated table data)."); } int runLen = readBits (8, currBits, currBitCount, currByte) + SHORTEST_LONG_RUN; if (symbol + runLen > static_cast(maxSymbol + 1)) { throw IEX_NAMESPACE::InputExc ("Error decoding Huffman table " "(Run beyond end of table)."); } symbol += runLen - 1; } else if (codeLen >= static_cast(SHORT_ZEROCODE_RUN)) { int runLen = codeLen - SHORT_ZEROCODE_RUN + 2; if (symbol + runLen > static_cast(maxSymbol + 1)) { throw IEX_NAMESPACE::InputExc ("Error decoding Huffman table " "(Run beyond end of table)."); } symbol += runLen - 1; } else if (codeLen != 0) { symbols.push_back ((symbol << 6) | (codeLen & 63)); if (codeLen < _minCodeLength) _minCodeLength = codeLen; if (codeLen > _maxCodeLength) _maxCodeLength = codeLen; codeCount[codeLen]++; } } for (int i = 0; i < MAX_CODE_LEN; ++i) _numSymbols += codeCount[i]; table = currByte; // // Compute base - once we have the code length counts, there // is a closed form solution for this // { double* countTmp = new double[_maxCodeLength+1]; for (int l = _minCodeLength; l <= _maxCodeLength; ++l) { countTmp[l] = (double)codeCount[l] * (double)(2ll << (_maxCodeLength-l)); } for (int l = _minCodeLength; l <= _maxCodeLength; ++l) { double tmp = 0; for (int k =l + 1; k <= _maxCodeLength; ++k) tmp += countTmp[k]; tmp /= (double)(2ll << (_maxCodeLength - l)); base[l] = (Int64)ceil (tmp); } delete [] countTmp; } // // Compute offset - these are the positions of the first // id (not symbol) that has length [i] // offset[_maxCodeLength] = 0; for (int i= _maxCodeLength - 1; i >= _minCodeLength; i--) offset[i] = offset[i + 1] + codeCount[i + 1]; // // Allocate and fill the symbol-to-id mapping. Smaller Ids should be // mapped to less-frequent symbols (which have longer codes). Use // the offset table to tell us where the id's for a given code // length start off. // _idToSymbol = new int[_numSymbols]; Int64 mapping[MAX_CODE_LEN + 1]; for (int i = 0; i < MAX_CODE_LEN + 1; ++i) mapping[i] = -1; for (int i = _minCodeLength; i <= _maxCodeLength; ++i) mapping[i] = offset[i]; for (std::vector::const_iterator i = symbols.begin(); i != symbols.end(); ++i) { int codeLen = *i & 63; int symbol = *i >> 6; if (mapping[codeLen] >= static_cast(_numSymbols)) { delete[] _idToSymbol; _idToSymbol = NULL; throw IEX_NAMESPACE::InputExc ("Huffman decode error " "(Invalid symbol in header)."); } _idToSymbol[mapping[codeLen]] = symbol; mapping[codeLen]++; } // // exceptions can be thrown whilst building tables. Delete // _idToSynmbol before re-throwing to prevent memory leak // try { buildTables(base, offset); }catch(...) { delete[] _idToSymbol; _idToSymbol = NULL; throw; } } FastHufDecoder::~FastHufDecoder() { delete[] _idToSymbol; } // // Static check if the decoder is enabled. // // ATM, I only have access to little endian hardware for testing, // so I'm not entirely sure that we are reading fom the bit stream // properly on BE. // // If you happen to have more obscure hardware, check that the // byte swapping in refill() is happening sensable, add an endian // check if needed, and fix the preprocessor magic here. // #define READ64(c) \ ((Int64)(c)[0] << 56) | ((Int64)(c)[1] << 48) | ((Int64)(c)[2] << 40) | \ ((Int64)(c)[3] << 32) | ((Int64)(c)[4] << 24) | ((Int64)(c)[5] << 16) | \ ((Int64)(c)[6] << 8) | ((Int64)(c)[7] ) #ifdef __INTEL_COMPILER // ICC built-in swap for LE hosts #if defined (__i386__) || defined(__x86_64__) #undef READ64 #define READ64(c) _bswap64 (*(const Int64*)(c)) #endif #endif bool FastHufDecoder::enabled() { #if defined(__INTEL_COMPILER) || defined(__GNUC__) // // Enabled for ICC, GCC: // __i386__ -> x86 // __x86_64__ -> 64-bit x86 // #if defined (__i386__) || defined(__x86_64__) return true; #else return false; #endif #elif defined (_MSC_VER) // // Enabled for Visual Studio: // _M_IX86 -> x86 // _M_X64 -> 64bit x86 #if defined (_M_IX86) || defined(_M_X64) return true; #else return false; #endif #else // // Unknown compiler - Be safe and disable. // return false; #endif } // // // Built the acceleration tables for lookups on the upper bits // as well as the 'LJ' tables. // void FastHufDecoder::buildTables (Int64 *base, Int64 *offset) { // // Build the 'left justified' base table, by shifting base left.. // for (int i = 0; i <= MAX_CODE_LEN; ++i) { if (base[i] != 0xffffffffffffffffULL) { _ljBase[i] = base[i] << (64 - i); } else { // // Unused code length - insert dummy values // _ljBase[i] = 0xffffffffffffffffULL; } } // // Combine some terms into a big fat constant, which for // lack of a better term we'll call the 'left justified' // offset table (because it serves the same function // as 'offset', when using the left justified base table. // _ljOffset[0] = offset[0] - _ljBase[0]; for (int i = 1; i <= MAX_CODE_LEN; ++i) _ljOffset[i] = offset[i] - (_ljBase[i] >> (64 - i)); // // Build the acceleration tables for the lookups of // short codes ( <= TABLE_LOOKUP_BITS long) // for (Int64 i = 0; i < 1 << TABLE_LOOKUP_BITS; ++i) { Int64 value = i << (64 - TABLE_LOOKUP_BITS); _tableSymbol[i] = 0xffff; _tableCodeLen[i] = 0; for (int codeLen = _minCodeLength; codeLen <= _maxCodeLength; ++codeLen) { if (_ljBase[codeLen] <= value) { _tableCodeLen[i] = codeLen; Int64 id = _ljOffset[codeLen] + (value >> (64 - codeLen)); if (id < static_cast(_numSymbols)) { _tableSymbol[i] = _idToSymbol[id]; } else { throw IEX_NAMESPACE::InputExc ("Huffman decode error " "(Overrun)."); } break; } } } // // Store the smallest value in the table that points to real data. // This should be the entry for the largest length that has // valid data (in our case, non-dummy _ljBase) // int minIdx = TABLE_LOOKUP_BITS; while (minIdx > 0 && _ljBase[minIdx] == 0xffffffffffffffffULL) minIdx--; if (minIdx < 0) { // // Error, no codes with lengths 0-TABLE_LOOKUP_BITS used. // Set the min value such that the table is never tested. // _tableMin = 0xffffffffffffffffULL; } else { _tableMin = _ljBase[minIdx]; } } // // For decoding, we're holding onto 2 Int64's. // // The first (buffer), holds the next bits from the bitstream to be // decoded. For certain paths in the decoder, we only need TABLE_LOOKUP_BITS // valid bits to decode the next symbol. For other paths, we need a full // 64-bits to decode a symbol. // // When we need to refill 'buffer', we could pull bits straight from // the bitstream. But this is very slow and requires lots of book keeping // (what's the next bit in the next byte?). Instead, we keep another Int64 // around that we use to refill from. While this doesn't cut down on the // book keeping (still need to know how many valid bits), it does cut // down on some of the bit shifting crazy and byte access. // // The refill Int64 (bufferBack) gets left-shifted after we've pulled // off bits. If we run out of bits in the input bit stream, we just // shift in 0's to bufferBack. // // The refill act takes numBits from the top of bufferBack and sticks // them in the bottom of buffer. If there arn't enough bits in bufferBack, // it gets refilled (to 64-bits) from the input bitstream. // inline void FastHufDecoder::refill (Int64 &buffer, int numBits, // number of bits to refill Int64 &bufferBack, // the next 64-bits, to refill from int &bufferBackNumBits, // number of bits left in bufferBack const unsigned char *&currByte, // current byte in the bitstream int &currBitsLeft) // number of bits left in the bitsream { // // Refill bits into the bottom of buffer, from the top of bufferBack. // Always top up buffer to be completely full. // buffer |= bufferBack >> (64 - numBits); if (bufferBackNumBits < numBits) { numBits -= bufferBackNumBits; // // Refill all of bufferBack from the bitstream. Either grab // a full 64-bit chunk, or whatever bytes are left. If we // don't have 64-bits left, pad with 0's. // if (currBitsLeft >= 64) { bufferBack = READ64 (currByte); bufferBackNumBits = 64; currByte += sizeof (Int64); currBitsLeft -= 8 * sizeof (Int64); } else { bufferBack = 0; bufferBackNumBits = 64; Int64 shift = 56; while (currBitsLeft > 0) { bufferBack |= ((Int64)(*currByte)) << shift; currByte++; shift -= 8; currBitsLeft -= 8; } // // At this point, currBitsLeft might be negative, just because // we're subtracting whole bytes. To keep anyone from freaking // out, zero the counter. // if (currBitsLeft < 0) currBitsLeft = 0; } buffer |= bufferBack >> (64 - numBits); } // // We can have cases where the previous shift of bufferBack is << 64 - // this is an undefined operation but tends to create just zeroes. // so if we won't have any bits left, zero out bufferBack insetad of computing the shift // if (bufferBackNumBits <= numBits) { bufferBack = 0; }else { bufferBack = bufferBack << numBits; } bufferBackNumBits -= numBits; } // // Read the next few bits out of a bitstream. Will be given a backing buffer // (buffer) that may still have data left over from previous reads // (bufferNumBits). Bitstream pointer (currByte) will be advanced when needed. // inline Int64 FastHufDecoder::readBits (int numBits, Int64 &buffer, // c int &bufferNumBits, // lc const char *&currByte) // in { while (bufferNumBits < numBits) { buffer = (buffer << 8) | *(unsigned char*)(currByte++); bufferNumBits += 8; } bufferNumBits -= numBits; return (buffer >> bufferNumBits) & ((1 << numBits) - 1); } // // Decode using a the 'One-Shift' strategy for decoding, with a // small-ish table to accelerate decoding of short codes. // // If possible, try looking up codes into the acceleration table. // This has a few benifits - there's no search involved; We don't // need an additional lookup to map id to symbol; we don't need // a full 64-bits (so less refilling). // void FastHufDecoder::decode (const unsigned char *src, int numSrcBits, unsigned short *dst, int numDstElems) { if (numSrcBits < 128) throw IEX_NAMESPACE::InputExc ("Error choosing Huffman decoder implementation " "(insufficient number of bits)."); // // Current position (byte/bit) in the src data stream // (after the first buffer fill) // const unsigned char *currByte = src + 2 * sizeof (Int64); numSrcBits -= 8 * 2 * sizeof (Int64); // // 64-bit buffer holding the current bits in the stream // Int64 buffer = READ64 (src); int bufferNumBits = 64; // // 64-bit buffer holding the next bits in the stream // Int64 bufferBack = READ64 ((src + sizeof (Int64))); int bufferBackNumBits = 64; int dstIdx = 0; while (dstIdx < numDstElems) { int codeLen; int symbol; // // Test if we can be table accelerated. If so, directly // lookup the output symbol. Otherwise, we need to fall // back to searching for the code. // // If we're doing table lookups, we don't really need // a re-filled buffer, so long as we have TABLE_LOOKUP_BITS // left. But for a search, we do need a refilled table. // if (_tableMin <= buffer) { int tableIdx = buffer >> (64 - TABLE_LOOKUP_BITS); // // For invalid codes, _tableCodeLen[] should return 0. This // will cause the decoder to get stuck in the current spot // until we run out of elements, then barf that the codestream // is bad. So we don't need to stick a condition like // if (codeLen > _maxCodeLength) in this inner. // codeLen = _tableCodeLen[tableIdx]; symbol = _tableSymbol[tableIdx]; } else { if (bufferNumBits < 64) { refill (buffer, 64 - bufferNumBits, bufferBack, bufferBackNumBits, currByte, numSrcBits); bufferNumBits = 64; } // // Brute force search: // Find the smallest length where _ljBase[length] <= buffer // codeLen = TABLE_LOOKUP_BITS + 1; while (_ljBase[codeLen] > buffer && codeLen <= _maxCodeLength) codeLen++; if (codeLen > _maxCodeLength) { throw IEX_NAMESPACE::InputExc ("Huffman decode error " "(Decoded an invalid symbol)."); } Int64 id = _ljOffset[codeLen] + (buffer >> (64 - codeLen)); if (id < static_cast(_numSymbols)) { symbol = _idToSymbol[id]; } else { throw IEX_NAMESPACE::InputExc ("Huffman decode error " "(Decoded an invalid symbol)."); } } // // Shift over bit stream, and update the bit count in the buffer // buffer = buffer << codeLen; bufferNumBits -= codeLen; // // If we recieved a RLE symbol (_rleSymbol), then we need // to read ahead 8 bits to know how many times to repeat // the previous symbol. Need to ensure we at least have // 8 bits of data in the buffer // if (symbol == _rleSymbol) { if (bufferNumBits < 8) { refill (buffer, 64 - bufferNumBits, bufferBack, bufferBackNumBits, currByte, numSrcBits); bufferNumBits = 64; } int rleCount = buffer >> 56; if (dstIdx < 1) { throw IEX_NAMESPACE::InputExc ("Huffman decode error (RLE code " "with no previous symbol)."); } if (dstIdx + rleCount > numDstElems) { throw IEX_NAMESPACE::InputExc ("Huffman decode error (Symbol run " "beyond expected output buffer length)."); } if (rleCount <= 0) { throw IEX_NAMESPACE::InputExc("Huffman decode error" " (Invalid RLE length)"); } for (int i = 0; i < rleCount; ++i) dst[dstIdx + i] = dst[dstIdx - 1]; dstIdx += rleCount; buffer = buffer << 8; bufferNumBits -= 8; } else { dst[dstIdx] = symbol; dstIdx++; } // // refill bit stream buffer if we're below the number of // bits needed for a table lookup // if (bufferNumBits < TABLE_LOOKUP_BITS) { refill (buffer, 64 - bufferNumBits, bufferBack, bufferBackNumBits, currByte, numSrcBits); bufferNumBits = 64; } } if (numSrcBits != 0) { throw IEX_NAMESPACE::InputExc ("Huffman decode error (Compressed data remains " "after filling expected output buffer)."); } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfFastHuf.h000066400000000000000000000143521406177042200200170ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FAST_HUF_H #define INCLUDED_IMF_FAST_HUF_H #include "ImfInt64.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Alternative Canonical Huffman decoder: // // Canonical Huffman decoder based on 'On the Implementation of Minimum // Redundancy Prefix Codes' by Moffat and Turpin - highly recommended // reading as a good description of the problem space, as well as // a fast decoding algorithm. // // The premise is that instead of working directly with the coded // symbols, we create a new ordering based on the frequency of symbols. // Less frequent symbols (and thus longer codes) are ordered earler. // We're calling the values in this ordering 'Ids', as oppsed to // 'Symbols' - which are the short values we eventually want decoded. // // With this new ordering, a few small tables can be derived ('base' // and 'offset') which drive the decoding. To cut down on the // linear scanning of these tables, you can add a small table // to directly look up short codes (as you might in a traditional // lookup-table driven decoder). // // The decoder is meant to be compatible with the encoder (and decoder) // in ImfHuf.cpp, just faster. For ease of implementation, this decoder // should only be used on compressed bitstreams >= 128 bits long. // class FastHufDecoder { public: // // Longest compressed code length that ImfHuf supports (58 bits) // static const int MAX_CODE_LEN = 58; // // Number of bits in our acceleration table. Should match all // codes up to TABLE_LOOKUP_BITS in length. // static const int TABLE_LOOKUP_BITS = 12; IMF_EXPORT FastHufDecoder (const char*& table, int numBytes, int minSymbol, int maxSymbol, int rleSymbol); IMF_EXPORT ~FastHufDecoder (); FastHufDecoder (const FastHufDecoder& other) = delete; FastHufDecoder& operator = (const FastHufDecoder& other) = delete; FastHufDecoder (FastHufDecoder&& other) = delete; FastHufDecoder& operator = (FastHufDecoder&& other) = delete; IMF_EXPORT static bool enabled (); IMF_EXPORT void decode (const unsigned char *src, int numSrcBits, unsigned short *dst, int numDstElems); private: void buildTables (Int64*, Int64*); void refill (Int64&, int, Int64&, int&, const unsigned char *&, int&); Int64 readBits (int, Int64&, int&, const char *&); int _rleSymbol; // RLE symbol written by the encoder. // This could be 65536, so beware // when you use shorts to hold things. int _numSymbols; // Number of symbols in the codebook. unsigned char _minCodeLength; // Minimum code length, in bits. unsigned char _maxCodeLength; // Maximum code length, in bits. int *_idToSymbol; // Maps Ids to symbols. Ids are a symbol // ordering sorted first in terms of // code length, and by code within // the same length. Ids run from 0 // to mNumSymbols-1. Int64 _ljBase[MAX_CODE_LEN + 1]; // the 'left justified base' table. // Takes base[i] (i = code length) // and 'left justifies' it into an Int64 Int64 _ljOffset[MAX_CODE_LEN +1 ]; // There are some other terms that can // be folded into constants when taking // the 'left justified' decode path. This // holds those constants, indexed by // code length // // We can accelerate the 'left justified' processing by running the // top TABLE_LOOKUP_BITS through a LUT, to find the symbol and code // length. These are those acceleration tables. // // Even though our evental 'symbols' are ushort's, the encoder adds // a symbol to indicate RLE. So with a dense code book, we could // have 2^16+1 codes, so both mIdToSymbol and mTableSymbol need // to be bigger than 16 bits. // int _tableSymbol[1 << TABLE_LOOKUP_BITS]; unsigned char _tableCodeLen[1 << TABLE_LOOKUP_BITS]; Int64 _tableMin; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfFloatAttribute.cpp000066400000000000000000000042251406177042200217410ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class FloatAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER template <> const char * FloatAttribute::staticTypeName () { return "float"; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfFloatAttribute.h000066400000000000000000000044071406177042200214100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FLOAT_ATTRIBUTE_H #define INCLUDED_IMF_FLOAT_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class FloatAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute FloatAttribute; template <> IMF_EXPORT const char *FloatAttribute::staticTypeName (); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp000066400000000000000000000053301406177042200231220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class FloatVectorAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * FloatVectorAttribute::staticTypeName () { return "floatvector"; } template <> void FloatVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { int n = _value.size(); for (int i = 0; i < n; ++i) Xdr::write (os, _value[i]); } template <> void FloatVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int n = size / Xdr::size(); _value.resize (n); for (int i = 0; i < n; ++i) Xdr::read (is, _value[i]); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfFloatVectorAttribute.h000066400000000000000000000051441406177042200225720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FLOATVECTOR_ATTRIBUTE_H #define INCLUDED_IMF_FLOATVECTOR_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class FloatVectorAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfNamespace.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef std::vector FloatVector; typedef TypedAttribute FloatVectorAttribute; template <> IMF_EXPORT const char *FloatVectorAttribute::staticTypeName (); template <> IMF_EXPORT void FloatVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void FloatVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfForward.h000066400000000000000000000067471406177042200200740ustar00rootroot00000000000000 /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // Portions (c) 2012 Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FORWARD_H #define INCLUDED_IMF_FORWARD_H //////////////////////////////////////////////////////////////////// // // Forward declarations for OpenEXR - correctly declares namespace // //////////////////////////////////////////////////////////////////// #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // classes for basic types; template class Array; template class Array2D; struct Channel; class ChannelList; struct Chromaticities; // attributes used in headers are TypedAttributes class Attribute; class Header; // file handling classes class OutputFile; class TiledInputFile; class ScanLineInputFile; class InputFile; class TiledOutputFile; class DeepScanLineInputFile; class DeepScanLineOutputFile; class DeepTiledInputFile; class DeepTiledOutputFile; class AcesInputFile; class AcesOutputFile; class TiledInputPart; class TiledInputFile; class TileOffsets; // multipart file handling class GenericInputFile; class GenericOutputFile; class MultiPartInputFile; class MultiPartOutputFile; class InputPart; class TiledInputPart; class DeepScanLineInputPart; class DeepTiledInputPart; class OutputPart; class ScanLineOutputPart; class TiledOutputPart; class DeepScanLineOutputPart; class DeepTiledOutputPart; // internal use only struct InputPartData; struct OutputStreamMutex; struct OutputPartData; struct InputStreamMutex; // frame buffers class FrameBuffer; class DeepFrameBuffer; struct DeepSlice; // compositing class DeepCompositing; class CompositeDeepScanLine; // preview image class PreviewImage; struct PreviewRgba; // streams class OStream; class IStream; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif // include guard openexr-2.5.7/OpenEXR/IlmImf/ImfFrameBuffer.cpp000066400000000000000000000166301406177042200211770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Slice // class FrameBuffer // //----------------------------------------------------------------------------- #include #include "Iex.h" using namespace std; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER Slice::Slice (PixelType t, char *b, size_t xst, size_t yst, int xsm, int ysm, double fv, bool xtc, bool ytc) : type (t), base (b), xStride (xst), yStride (yst), xSampling (xsm), ySampling (ysm), fillValue (fv), xTileCoords (xtc), yTileCoords (ytc) { // empty } Slice Slice::Make ( PixelType type, const void* ptr, const IMATH_NAMESPACE::V2i& origin, int64_t w, int64_t h, size_t xStride, size_t yStride, int xSampling, int ySampling, double fillValue, bool xTileCoords, bool yTileCoords) { char* base = reinterpret_cast (const_cast (ptr)); if (xStride == 0) { switch (type) { case UINT: xStride = sizeof (uint32_t); break; case HALF: xStride = sizeof (uint16_t); break; case FLOAT: xStride = sizeof (float); break; case NUM_PIXELTYPES: THROW (IEX_NAMESPACE::ArgExc, "Invalid pixel type."); } } if (yStride == 0) yStride = static_cast (w / xSampling) * xStride; // data window is an int, so force promote to higher type to avoid // overflow for off y (degenerate size checks should be in // ImfHeader::sanityCheck, but offset can be large-ish) int64_t offx = (static_cast (origin.x) / static_cast (xSampling)); offx *= static_cast (xStride); int64_t offy = (static_cast (origin.y) / static_cast (ySampling)); offy *= static_cast (yStride); return Slice ( type, base - offx - offy, xStride, yStride, xSampling, ySampling, fillValue, xTileCoords, yTileCoords); } Slice Slice::Make ( PixelType type, const void* ptr, const IMATH_NAMESPACE::Box2i& dataWindow, size_t xStride, size_t yStride, int xSampling, int ySampling, double fillValue, bool xTileCoords, bool yTileCoords) { return Make ( type, ptr, dataWindow.min, static_cast (dataWindow.max.x) - static_cast (dataWindow.min.x) + 1, static_cast (dataWindow.max.y) - static_cast (dataWindow.min.y) + 1, xStride, yStride, xSampling, ySampling, fillValue, xTileCoords, yTileCoords); } void FrameBuffer::insert (const char name[], const Slice &slice) { if (name[0] == 0) { THROW (IEX_NAMESPACE::ArgExc, "Frame buffer slice name cannot be an empty string."); } _map[name] = slice; } void FrameBuffer::insert (const string &name, const Slice &slice) { insert (name.c_str(), slice); } Slice & FrameBuffer::operator [] (const char name[]) { SliceMap::iterator i = _map.find (name); if (i == _map.end()) { THROW (IEX_NAMESPACE::ArgExc, "Cannot find frame buffer slice \"" << name << "\"."); } return i->second; } const Slice & FrameBuffer::operator [] (const char name[]) const { SliceMap::const_iterator i = _map.find (name); if (i == _map.end()) { THROW (IEX_NAMESPACE::ArgExc, "Cannot find frame buffer slice \"" << name << "\"."); } return i->second; } Slice & FrameBuffer::operator [] (const string &name) { return this->operator[] (name.c_str()); } const Slice & FrameBuffer::operator [] (const string &name) const { return this->operator[] (name.c_str()); } Slice * FrameBuffer::findSlice (const char name[]) { SliceMap::iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } const Slice * FrameBuffer::findSlice (const char name[]) const { SliceMap::const_iterator i = _map.find (name); return (i == _map.end())? 0: &i->second; } Slice * FrameBuffer::findSlice (const string &name) { return findSlice (name.c_str()); } const Slice * FrameBuffer::findSlice (const string &name) const { return findSlice (name.c_str()); } FrameBuffer::Iterator FrameBuffer::begin () { return _map.begin(); } FrameBuffer::ConstIterator FrameBuffer::begin () const { return _map.begin(); } FrameBuffer::Iterator FrameBuffer::end () { return _map.end(); } FrameBuffer::ConstIterator FrameBuffer::end () const { return _map.end(); } FrameBuffer::Iterator FrameBuffer::find (const char name[]) { return _map.find (name); } FrameBuffer::ConstIterator FrameBuffer::find (const char name[]) const { return _map.find (name); } FrameBuffer::Iterator FrameBuffer::find (const string &name) { return find (name.c_str()); } FrameBuffer::ConstIterator FrameBuffer::find (const string &name) const { return find (name.c_str()); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfFrameBuffer.h000066400000000000000000000272311406177042200206430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FRAME_BUFFER_H #define INCLUDED_IMF_FRAME_BUFFER_H //----------------------------------------------------------------------------- // // class Slice // class FrameBuffer // //----------------------------------------------------------------------------- #include "ImfName.h" #include "ImfPixelType.h" #include "ImfExport.h" #include "ImfNamespace.h" #include "ImathBox.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------------------- // Description of a single slice of the frame buffer: // // Note -- terminology: as part of a file, a component of // an image (e.g. red, green, blue, depth etc.) is called // a "channel". As part of a frame buffer, an image // component is called a "slice". //------------------------------------------------------- struct Slice { //------------------------------ // Data type; see ImfPixelType.h //------------------------------ PixelType type; //--------------------------------------------------------------------- // Memory layout: The address of pixel (x, y) is // // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride // // where xp and yp are computed as follows: // // * If we are reading or writing a scanline-based file: // // xp = x // yp = y // // * If we are reading a tile whose upper left coorner is at (xt, yt): // // if xTileCoords is true then xp = x - xt, else xp = x // if yTileCoords is true then yp = y - yt, else yp = y // //--------------------------------------------------------------------- char * base; size_t xStride; size_t yStride; //-------------------------------------------- // Subsampling: pixel (x, y) is present in the // slice only if // // x % xSampling == 0 && y % ySampling == 0 // //-------------------------------------------- int xSampling; int ySampling; //---------------------------------------------------------- // Default value, used to fill the slice when a file without // a channel that corresponds to this slice is read. //---------------------------------------------------------- double fillValue; //------------------------------------------------------- // For tiled files, the xTileCoords and yTileCoords flags // determine whether pixel addressing is performed using // absolute coordinates or coordinates relative to a // tile's upper left corner. (See the comment on base, // xStride and yStride, above.) // // For scanline-based files these flags have no effect; // pixel addressing is always done using absolute // coordinates. //------------------------------------------------------- bool xTileCoords; bool yTileCoords; //------------ // Constructor //------------ IMF_EXPORT Slice (PixelType type = HALF, char * base = 0, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, double fillValue = 0.0, bool xTileCoords = false, bool yTileCoords = false); // Does the heavy lifting of computing the base pointer for a slice, // avoiding overflow issues with large origin offsets // // if xStride == 0, assumes sizeof(pixeltype) // if yStride == 0, assumes xStride * ( w / xSampling ) IMF_EXPORT static Slice Make(PixelType type, const void *ptr, const IMATH_NAMESPACE::V2i &origin, int64_t w, int64_t h, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, double fillValue = 0.0, bool xTileCoords = false, bool yTileCoords = false); // same as above, just computes w and h for you // from a data window IMF_EXPORT static Slice Make(PixelType type, const void *ptr, const IMATH_NAMESPACE::Box2i &dataWindow, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, double fillValue = 0.0, bool xTileCoords = false, bool yTileCoords = false); }; class FrameBuffer { public: //------------ // Add a slice //------------ IMF_EXPORT void insert (const char name[], const Slice &slice); IMF_EXPORT void insert (const std::string &name, const Slice &slice); //---------------------------------------------------------------- // Access to existing slices: // // [n] Returns a reference to the slice with name n. // If no slice with name n exists, an IEX_NAMESPACE::ArgExc // is thrown. // // findSlice(n) Returns a pointer to the slice with name n, // or 0 if no slice with name n exists. // //---------------------------------------------------------------- IMF_EXPORT Slice & operator [] (const char name[]); IMF_EXPORT const Slice & operator [] (const char name[]) const; IMF_EXPORT Slice & operator [] (const std::string &name); IMF_EXPORT const Slice & operator [] (const std::string &name) const; IMF_EXPORT Slice * findSlice (const char name[]); IMF_EXPORT const Slice * findSlice (const char name[]) const; IMF_EXPORT Slice * findSlice (const std::string &name); IMF_EXPORT const Slice * findSlice (const std::string &name) const; //----------------------------------------- // Iterator-style access to existing slices //----------------------------------------- typedef std::map SliceMap; class Iterator; class ConstIterator; IMF_EXPORT Iterator begin (); IMF_EXPORT ConstIterator begin () const; IMF_EXPORT Iterator end (); IMF_EXPORT ConstIterator end () const; IMF_EXPORT Iterator find (const char name[]); IMF_EXPORT ConstIterator find (const char name[]) const; IMF_EXPORT Iterator find (const std::string &name); IMF_EXPORT ConstIterator find (const std::string &name) const; private: SliceMap _map; }; //---------- // Iterators //---------- class FrameBuffer::Iterator { public: IMF_EXPORT Iterator (); IMF_EXPORT Iterator (const FrameBuffer::SliceMap::iterator &i); IMF_EXPORT Iterator & operator ++ (); IMF_EXPORT Iterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT Slice & slice () const; private: friend class FrameBuffer::ConstIterator; FrameBuffer::SliceMap::iterator _i; }; class FrameBuffer::ConstIterator { public: IMF_EXPORT ConstIterator (); IMF_EXPORT ConstIterator (const FrameBuffer::SliceMap::const_iterator &i); IMF_EXPORT ConstIterator (const FrameBuffer::Iterator &other); IMF_EXPORT ConstIterator & operator ++ (); IMF_EXPORT ConstIterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT const Slice & slice () const; private: friend bool operator == (const ConstIterator &, const ConstIterator &); friend bool operator != (const ConstIterator &, const ConstIterator &); FrameBuffer::SliceMap::const_iterator _i; }; //----------------- // Inline Functions //----------------- inline FrameBuffer::Iterator::Iterator (): _i() { // empty } inline FrameBuffer::Iterator::Iterator (const FrameBuffer::SliceMap::iterator &i): _i (i) { // empty } inline FrameBuffer::Iterator & FrameBuffer::Iterator::operator ++ () { ++_i; return *this; } inline FrameBuffer::Iterator FrameBuffer::Iterator::operator ++ (int) { Iterator tmp = *this; ++_i; return tmp; } inline const char * FrameBuffer::Iterator::name () const { return *_i->first; } inline Slice & FrameBuffer::Iterator::slice () const { return _i->second; } inline FrameBuffer::ConstIterator::ConstIterator (): _i() { // empty } inline FrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::SliceMap::const_iterator &i): _i (i) { // empty } inline FrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::Iterator &other): _i (other._i) { // empty } inline FrameBuffer::ConstIterator & FrameBuffer::ConstIterator::operator ++ () { ++_i; return *this; } inline FrameBuffer::ConstIterator FrameBuffer::ConstIterator::operator ++ (int) { ConstIterator tmp = *this; ++_i; return tmp; } inline const char * FrameBuffer::ConstIterator::name () const { return *_i->first; } inline const Slice & FrameBuffer::ConstIterator::slice () const { return _i->second; } inline bool operator == (const FrameBuffer::ConstIterator &x, const FrameBuffer::ConstIterator &y) { return x._i == y._i; } inline bool operator != (const FrameBuffer::ConstIterator &x, const FrameBuffer::ConstIterator &y) { return !(x == y); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfFramesPerSecond.cpp000066400000000000000000000052441406177042200220320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Convenience functions related to the framesPerSecond attribute // //----------------------------------------------------------------------------- #include #include "ImathFun.h" using namespace IMATH_NAMESPACE; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER Rational guessExactFps (double fps) { return guessExactFps (Rational (fps)); } Rational guessExactFps (const Rational &fps) { const double e = 0.002; if (abs (double (fps) - double (fps_23_976())) < e) return fps_23_976(); if (abs (double (fps) - double (fps_29_97())) < e) return fps_29_97(); if (abs (double (fps) - double (fps_47_952())) < e) return fps_47_952(); if (abs (double (fps) - double (fps_59_94())) < e) return fps_59_94(); return fps; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfFramesPerSecond.h000066400000000000000000000074561406177042200215060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_FRAMES_PER_SECOND_H #define INCLUDED_IMF_FRAMES_PER_SECOND_H //----------------------------------------------------------------------------- // // Convenience functions related to the framesPerSecond attribute // // Functions that return the exact values for commonly used frame rates: // // name frames per second // // fps_23_976() 23.976023... // fps_24() 24.0 35mm film frames // fps_25() 25.0 PAL video frames // fps_29_97() 29.970029... NTSC video frames // fps_30() 30.0 60Hz HDTV frames // fps_47_952() 47.952047... // fps_48() 48.0 // fps_50() 50.0 PAL video fields // fps_59_94() 59.940059... NTSC video fields // fps_60() 60.0 60Hz HDTV fields // // Functions that try to convert inexact frame rates into exact ones: // // Given a frame rate, fps, that is close to one of the pre-defined // frame rates fps_23_976(), fps_29_97(), fps_47_952() or fps_59_94(), // guessExactFps(fps) returns the corresponding pre-defined frame // rate. If fps is not close to one of the pre-defined frame rates, // then guessExactFps(fps) returns Rational(fps). // //----------------------------------------------------------------------------- #include "ImfRational.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER inline Rational fps_23_976 () {return Rational (24000, 1001);} inline Rational fps_24 () {return Rational (24, 1);} inline Rational fps_25 () {return Rational (25, 1);} inline Rational fps_29_97 () {return Rational (30000, 1001);} inline Rational fps_30 () {return Rational (30, 1);} inline Rational fps_47_952 () {return Rational (48000, 1001);} inline Rational fps_48 () {return Rational (48, 1);} inline Rational fps_50 () {return Rational (50, 1);} inline Rational fps_59_94 () {return Rational (60000, 1001);} inline Rational fps_60 () {return Rational (60, 1);} IMF_EXPORT Rational guessExactFps (double fps); IMF_EXPORT Rational guessExactFps (const Rational &fps); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfGenericInputFile.cpp000066400000000000000000000061771406177042200222140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfGenericInputFile.h" #include #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER GenericInputFile::~GenericInputFile () {} GenericInputFile::GenericInputFile () {} void GenericInputFile::readMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int& version) { // // Read the magic number and the file format version number. // Then check if we can read the rest of this file. // int magic; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, magic); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, version); if (magic != MAGIC) { throw IEX_NAMESPACE::InputExc ("File is not an image file."); } if (getVersion (version) != EXR_VERSION) { THROW (IEX_NAMESPACE::InputExc, "Cannot read " "version " << getVersion (version) << " " "image files. Current file format version " "is " << EXR_VERSION << "."); } if (!supportsFlags (getFlags (version))) { THROW (IEX_NAMESPACE::InputExc, "The file format version number's flag field " "contains unrecognized flags."); } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfGenericInputFile.h000066400000000000000000000044641406177042200216560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFGENERICINPUTFILE_H_ #define IMFGENERICINPUTFILE_H_ #include "ImfIO.h" #include "ImfHeader.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class GenericInputFile { public: IMF_EXPORT virtual ~GenericInputFile(); protected: IMF_EXPORT GenericInputFile(); IMF_EXPORT void readMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int& version); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFGENERICINPUTFILE_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfGenericOutputFile.cpp000066400000000000000000000075111406177042200224060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfGenericOutputFile.h" #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace std; GenericOutputFile::~GenericOutputFile () {} GenericOutputFile::GenericOutputFile () {} void GenericOutputFile::writeMagicNumberAndVersionField ( OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header& header) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, MAGIC); int version = EXR_VERSION; if (header.hasType() && isDeepData(header.type())) { version |= NON_IMAGE_FLAG; } else { // (TODO) we may want to check something else in function signature // instead of hasTileDescription()? if (header.hasTileDescription()) version |= TILED_FLAG; } if (usesLongNames (header)) version |= LONG_NAMES_FLAG; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, version); } void GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header * headers, int parts) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, MAGIC); int version = EXR_VERSION; if (parts == 1) { if (headers[0].type() == TILEDIMAGE) version |= TILED_FLAG; } else { version |= MULTI_PART_FILE_FLAG; } for (int i = 0; i < parts; i++) { if (usesLongNames (headers[i])) version |= LONG_NAMES_FLAG; if (headers[i].hasType() && isImage(headers[i].type()) == false) version |= NON_IMAGE_FLAG; } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, version); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfGenericOutputFile.h000066400000000000000000000050021406177042200220440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFGENERICOUTPUTFILE_H_ #define IMFGENERICOUTPUTFILE_H_ #include "ImfVersion.h" #include "ImfIO.h" #include "ImfXdr.h" #include "ImfHeader.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class GenericOutputFile { public: IMF_EXPORT virtual ~GenericOutputFile(); protected: IMF_EXPORT GenericOutputFile(); IMF_EXPORT void writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header& header); IMF_EXPORT void writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header * headers, int parts); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* GENERICOUTPUTFILE_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfHeader.cpp000066400000000000000000000753131406177042200202060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Header // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "IlmThreadMutex.h" #include "Iex.h" #include #include #include #include #include "ImfTiledMisc.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace std; using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using IMATH_NAMESPACE::V2f; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; namespace { int maxImageWidth = 0; int maxImageHeight = 0; int maxTileWidth = 0; int maxTileHeight = 0; void initialize (Header &header, const Box2i &displayWindow, const Box2i &dataWindow, float pixelAspectRatio, const V2f &screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression) { header.insert ("displayWindow", Box2iAttribute (displayWindow)); header.insert ("dataWindow", Box2iAttribute (dataWindow)); if ( !std::isnormal (pixelAspectRatio) || pixelAspectRatio < 0.f) THROW (IEX_NAMESPACE::ArgExc, "Invalid pixel aspect ratio"); header.insert ("pixelAspectRatio", FloatAttribute (pixelAspectRatio)); header.insert ("screenWindowCenter", V2fAttribute (screenWindowCenter)); header.insert ("screenWindowWidth", FloatAttribute (screenWindowWidth)); header.insert ("lineOrder", LineOrderAttribute (lineOrder)); header.insert ("compression", CompressionAttribute (compression)); header.insert ("channels", ChannelListAttribute ()); } template void checkIsNullTerminated (const char (&str)[N], const char *what) { for (size_t i = 0; i < N; ++i) { if (str[i] == '\0') return; } std::stringstream s; s << "Invalid " << what << ": it is more than " << (N - 1) << " characters long."; throw IEX_NAMESPACE::InputExc(s); } void sanityCheckDisplayWindow (int width, int height) { // // Ensure a valid displayWindow. All values for which width-1 < 0 // are invalid, but in particular, note that if width=-INT_MAX, // width-1 will overflow. // if (width < 1 || height < 1) throw IEX_NAMESPACE::ArgExc ("Invalid display window in image header."); } } // namespace Header::Header (int width, int height, float pixelAspectRatio, const V2f &screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression) : _map() { sanityCheckDisplayWindow (width, height); staticInitialize(); Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); initialize (*this, displayWindow, displayWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); } Header::Header (int width, int height, const Box2i &dataWindow, float pixelAspectRatio, const V2f &screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression) : _map() { sanityCheckDisplayWindow (width, height); staticInitialize(); Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); initialize (*this, displayWindow, dataWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); } Header::Header (const Box2i &displayWindow, const Box2i &dataWindow, float pixelAspectRatio, const V2f &screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression) : _map() { staticInitialize(); initialize (*this, displayWindow, dataWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); } Header::Header (const Header &other): _map() { for (AttributeMap::const_iterator i = other._map.begin(); i != other._map.end(); ++i) { insert (*i->first, *i->second); } } Header::~Header () { for (AttributeMap::iterator i = _map.begin(); i != _map.end(); ++i) { delete i->second; } } Header & Header::operator = (const Header &other) { if (this != &other) { for (AttributeMap::iterator i = _map.begin(); i != _map.end(); ++i) { delete i->second; } _map.erase (_map.begin(), _map.end()); for (AttributeMap::const_iterator i = other._map.begin(); i != other._map.end(); ++i) { insert (*i->first, *i->second); } } return *this; } void Header::erase (const char name[]) { if (name[0] == 0) THROW (IEX_NAMESPACE::ArgExc, "Image attribute name cannot be an empty string."); AttributeMap::iterator i = _map.find (name); if (i != _map.end()) _map.erase (i); } void Header::erase (const string &name) { erase (name.c_str()); } void Header::insert (const char name[], const Attribute &attribute) { if (name[0] == 0) THROW (IEX_NAMESPACE::ArgExc, "Image attribute name cannot be an empty string."); AttributeMap::iterator i = _map.find (name); if (i == _map.end()) { Attribute *tmp = attribute.copy(); try { _map[name] = tmp; } catch (...) { delete tmp; throw; } } else { if (strcmp (i->second->typeName(), attribute.typeName())) THROW (IEX_NAMESPACE::TypeExc, "Cannot assign a value of " "type \"" << attribute.typeName() << "\" " "to image attribute \"" << name << "\" of " "type \"" << i->second->typeName() << "\"."); Attribute *tmp = attribute.copy(); delete i->second; i->second = tmp; } } void Header::insert (const string &name, const Attribute &attribute) { insert (name.c_str(), attribute); } Attribute & Header::operator [] (const char name[]) { AttributeMap::iterator i = _map.find (name); if (i == _map.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot find image attribute \"" << name << "\"."); return *i->second; } const Attribute & Header::operator [] (const char name[]) const { AttributeMap::const_iterator i = _map.find (name); if (i == _map.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot find image attribute \"" << name << "\"."); return *i->second; } Attribute & Header::operator [] (const string &name) { return this->operator[] (name.c_str()); } const Attribute & Header::operator [] (const string &name) const { return this->operator[] (name.c_str()); } Header::Iterator Header::begin () { return _map.begin(); } Header::ConstIterator Header::begin () const { return _map.begin(); } Header::Iterator Header::end () { return _map.end(); } Header::ConstIterator Header::end () const { return _map.end(); } Header::Iterator Header::find (const char name[]) { return _map.find (name); } Header::ConstIterator Header::find (const char name[]) const { return _map.find (name); } Header::Iterator Header::find (const string &name) { return find (name.c_str()); } Header::ConstIterator Header::find (const string &name) const { return find (name.c_str()); } IMATH_NAMESPACE::Box2i & Header::displayWindow () { return static_cast ((*this)["displayWindow"]).value(); } const IMATH_NAMESPACE::Box2i & Header::displayWindow () const { return static_cast ((*this)["displayWindow"]).value(); } IMATH_NAMESPACE::Box2i & Header::dataWindow () { return static_cast ((*this)["dataWindow"]).value(); } const IMATH_NAMESPACE::Box2i & Header::dataWindow () const { return static_cast ((*this)["dataWindow"]).value(); } float & Header::pixelAspectRatio () { return static_cast ((*this)["pixelAspectRatio"]).value(); } const float & Header::pixelAspectRatio () const { return static_cast ((*this)["pixelAspectRatio"]).value(); } IMATH_NAMESPACE::V2f & Header::screenWindowCenter () { return static_cast ((*this)["screenWindowCenter"]).value(); } const IMATH_NAMESPACE::V2f & Header::screenWindowCenter () const { return static_cast ((*this)["screenWindowCenter"]).value(); } float & Header::screenWindowWidth () { return static_cast ((*this)["screenWindowWidth"]).value(); } const float & Header::screenWindowWidth () const { return static_cast ((*this)["screenWindowWidth"]).value(); } ChannelList & Header::channels () { return static_cast ((*this)["channels"]).value(); } const ChannelList & Header::channels () const { return static_cast ((*this)["channels"]).value(); } LineOrder & Header::lineOrder () { return static_cast ((*this)["lineOrder"]).value(); } const LineOrder & Header::lineOrder () const { return static_cast ((*this)["lineOrder"]).value(); } Compression & Header::compression () { return static_cast ((*this)["compression"]).value(); } const Compression & Header::compression () const { return static_cast ((*this)["compression"]).value(); } void Header::setName(const string& name) { insert ("name", StringAttribute (name)); } bool Header::hasName() const { return findTypedAttribute ("name") != 0; } string & Header::name() { return typedAttribute ("name").value(); } const string & Header::name() const { return typedAttribute ("name").value(); } void Header::setType(const string& type) { if (isSupportedType(type) == false) { throw IEX_NAMESPACE::ArgExc (type + "is not a supported image type." + "The following are supported: " + SCANLINEIMAGE + ", " + TILEDIMAGE + ", " + DEEPSCANLINE + " or " + DEEPTILE + "."); } insert ("type", StringAttribute (type)); // (TODO) Should we do it here? if (isDeepData(type) && hasVersion() == false) { setVersion(1); } } bool Header::hasType() const { return findTypedAttribute ("type") != 0; } string & Header::type() { return typedAttribute ("type").value(); } const string & Header::type() const { return typedAttribute ("type").value(); } void Header::setView(const string& view) { insert ("view", StringAttribute (view)); } bool Header::hasView() const { return findTypedAttribute ("view") != 0; } string & Header::view() { return typedAttribute ("view").value(); } const string & Header::view() const { return typedAttribute ("view").value(); } void Header::setVersion(const int version) { if (version != 1) { throw IEX_NAMESPACE::ArgExc ("We can only process version 1"); } insert ("version", IntAttribute (version)); } bool Header::hasVersion() const { return findTypedAttribute ("version") != 0; } int & Header::version() { return typedAttribute ("version").value(); } const int & Header::version() const { return typedAttribute ("version").value(); } void Header::setChunkCount(int chunks) { insert("chunkCount",IntAttribute(chunks)); } bool Header::hasChunkCount() const { return findTypedAttribute("chunkCount") != 0; } int& Header::chunkCount() { return typedAttribute ("chunkCount").value(); } const int& Header::chunkCount() const { return typedAttribute ("chunkCount").value(); } void Header::setTileDescription(const TileDescription& td) { insert ("tiles", TileDescriptionAttribute (td)); } bool Header::hasTileDescription() const { return findTypedAttribute ("tiles") != 0; } TileDescription & Header::tileDescription () { return typedAttribute ("tiles").value(); } const TileDescription & Header::tileDescription () const { return typedAttribute ("tiles").value(); } void Header::setPreviewImage (const PreviewImage &pi) { insert ("preview", PreviewImageAttribute (pi)); } PreviewImage & Header::previewImage () { return typedAttribute ("preview").value(); } const PreviewImage & Header::previewImage () const { return typedAttribute ("preview").value(); } bool Header::hasPreviewImage () const { return findTypedAttribute ("preview") != 0; } void Header::sanityCheck (bool isTiled, bool isMultipartFile) const { // // The display window and the data window must each // contain at least one pixel. In addition, the // coordinates of the window corners must be small // enough to keep expressions like max-min+1 or // max+min from overflowing. // const Box2i &displayWindow = this->displayWindow(); if (displayWindow.min.x > displayWindow.max.x || displayWindow.min.y > displayWindow.max.y || displayWindow.min.x <= -(INT_MAX / 2) || displayWindow.min.y <= -(INT_MAX / 2) || displayWindow.max.x >= (INT_MAX / 2) || displayWindow.max.y >= (INT_MAX / 2)) { throw IEX_NAMESPACE::ArgExc ("Invalid display window in image header."); } const Box2i &dataWindow = this->dataWindow(); if (dataWindow.min.x > dataWindow.max.x || dataWindow.min.y > dataWindow.max.y || dataWindow.min.x <= -(INT_MAX / 2) || dataWindow.min.y <= -(INT_MAX / 2) || dataWindow.max.x >= (INT_MAX / 2) || dataWindow.max.y >= (INT_MAX / 2)) { throw IEX_NAMESPACE::ArgExc ("Invalid data window in image header."); } int w = (dataWindow.max.x - dataWindow.min.x + 1); if (maxImageWidth > 0 && maxImageWidth < w) { THROW (IEX_NAMESPACE::ArgExc, "The width of the data window exceeds the " "maximum width of " << maxImageWidth << "pixels."); } int h = (dataWindow.max.y - dataWindow.min.y + 1); if (maxImageHeight > 0 && maxImageHeight < h) { THROW (IEX_NAMESPACE::ArgExc, "The height of the data window exceeds the " "maximum height of " << maxImageHeight << "pixels."); } // chunk table must be smaller than the maximum image area // (only reachable for unknown types or damaged files: will have thrown earlier // for regular image types) if( maxImageHeight>0 && maxImageWidth>0 && hasChunkCount() && static_cast(chunkCount())>Int64(maxImageWidth)*Int64(maxImageHeight)) { THROW (IEX_NAMESPACE::ArgExc, "chunkCount exceeds maximum area of " << Int64(maxImageWidth)*Int64(maxImageHeight) << " pixels." ); } // // The pixel aspect ratio must be greater than 0. // In applications, numbers like the the display or // data window dimensions are likely to be multiplied // or divided by the pixel aspect ratio; to avoid // arithmetic exceptions, we limit the pixel aspect // ratio to a range that is smaller than theoretically // possible (real aspect ratios are likely to be close // to 1.0 anyway). // float pixelAspectRatio = this->pixelAspectRatio(); const float MIN_PIXEL_ASPECT_RATIO = 1e-6f; const float MAX_PIXEL_ASPECT_RATIO = 1e+6f; if (!std::isnormal(pixelAspectRatio) || pixelAspectRatio < MIN_PIXEL_ASPECT_RATIO || pixelAspectRatio > MAX_PIXEL_ASPECT_RATIO) { throw IEX_NAMESPACE::ArgExc ("Invalid pixel aspect ratio in image header."); } // // The screen window width must not be less than 0. // The size of the screen window can vary over a wide // range (fish-eye lens to astronomical telescope), // so we can't limit the screen window width to a // small range. // float screenWindowWidth = this->screenWindowWidth(); if (screenWindowWidth < 0) throw IEX_NAMESPACE::ArgExc ("Invalid screen window width in image header."); // // If the file has multiple parts, verify that each header has attribute // name and type. // (TODO) We may want to check more stuff here. // if (isMultipartFile) { if (!hasName()) { throw IEX_NAMESPACE::ArgExc ("Headers in a multipart file should" " have name attribute."); } if (!hasType()) { throw IEX_NAMESPACE::ArgExc ("Headers in a multipart file should" " have type attribute."); } } const std::string & part_type=hasType() ? type() : ""; if(part_type!="" && !isSupportedType(part_type)) { // // skip remaining sanity checks with unsupported types - they may not hold // return; } bool isDeep = isDeepData(part_type); // // If the file is tiled, verify that the tile description has reasonable // values and check to see if the lineOrder is one of the predefined 3. // If the file is not tiled, then the lineOrder can only be INCREASING_Y // or DECREASING_Y. // LineOrder lineOrder = this->lineOrder(); if (isTiled) { if (!hasTileDescription()) { throw IEX_NAMESPACE::ArgExc ("Tiled image has no tile " "description attribute."); } const TileDescription &tileDesc = tileDescription(); if (tileDesc.xSize <= 0 || tileDesc.ySize <= 0 || tileDesc.xSize > INT_MAX || tileDesc.ySize > INT_MAX ) throw IEX_NAMESPACE::ArgExc ("Invalid tile size in image header."); if (maxTileWidth > 0 && maxTileWidth < int(tileDesc.xSize)) { THROW (IEX_NAMESPACE::ArgExc, "The width of the tiles exceeds the maximum " "width of " << maxTileWidth << "pixels."); } if (maxTileHeight > 0 && maxTileHeight < int(tileDesc.ySize)) { THROW (IEX_NAMESPACE::ArgExc, "The width of the tiles exceeds the maximum " "width of " << maxTileHeight << "pixels."); } if (tileDesc.mode != ONE_LEVEL && tileDesc.mode != MIPMAP_LEVELS && tileDesc.mode != RIPMAP_LEVELS) throw IEX_NAMESPACE::ArgExc ("Invalid level mode in image header."); if (tileDesc.roundingMode != ROUND_UP && tileDesc.roundingMode != ROUND_DOWN) throw IEX_NAMESPACE::ArgExc ("Invalid level rounding mode in image header."); if (lineOrder != INCREASING_Y && lineOrder != DECREASING_Y && lineOrder != RANDOM_Y) throw IEX_NAMESPACE::ArgExc ("Invalid line order in image header."); // computes size of chunk offset table. Throws an exception if this exceeds // the maximum allowable size getTiledChunkOffsetTableSize(*this); } else { if (lineOrder != INCREASING_Y && lineOrder != DECREASING_Y) throw IEX_NAMESPACE::ArgExc ("Invalid line order in image header."); } // // The compression method must be one of the predefined values. // if (!isValidCompression (this->compression())) throw IEX_NAMESPACE::ArgExc ("Unknown compression type in image header."); if( isDeep ) { if (!isValidDeepCompression (this->compression())) throw IEX_NAMESPACE::ArgExc ("Compression type in header not valid for deep data"); } // // Check the channel list: // // If the file is tiled then for each channel, the type must be one of the // predefined values, and the x and y sampling must both be 1. // // x and y sampling must currently also be 1 for deep scanline images // // If the file is not tiled then for each channel, the type must be one // of the predefined values, the x and y coordinates of the data window's // upper left corner must be divisible by the x and y subsampling factors, // and the width and height of the data window must be divisible by the // x and y subsampling factors. // const ChannelList &channels = this->channels(); if (isTiled || isDeep) { for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { if (i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::UINT && i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF && i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) { THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" " "image channel is invalid."); } if (i.channel().xSampling != 1) { THROW (IEX_NAMESPACE::ArgExc, "The x subsampling factor for the " "\"" << i.name() << "\" channel " "is not 1."); } if (i.channel().ySampling != 1) { THROW (IEX_NAMESPACE::ArgExc, "The y subsampling factor for the " "\"" << i.name() << "\" channel " "is not 1."); } } } else { for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { if (i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::UINT && i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF && i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) { THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" " "image channel is invalid."); } if (i.channel().xSampling < 1) { THROW (IEX_NAMESPACE::ArgExc, "The x subsampling factor for the " "\"" << i.name() << "\" channel " "is invalid."); } if (i.channel().ySampling < 1) { THROW (IEX_NAMESPACE::ArgExc, "The y subsampling factor for the " "\"" << i.name() << "\" channel " "is invalid."); } if (dataWindow.min.x % i.channel().xSampling) { THROW (IEX_NAMESPACE::ArgExc, "The minimum x coordinate of the " "image's data window is not a multiple " "of the x subsampling factor of " "the \"" << i.name() << "\" channel."); } if (dataWindow.min.y % i.channel().ySampling) { THROW (IEX_NAMESPACE::ArgExc, "The minimum y coordinate of the " "image's data window is not a multiple " "of the y subsampling factor of " "the \"" << i.name() << "\" channel."); } if ((dataWindow.max.x - dataWindow.min.x + 1) % i.channel().xSampling) { THROW (IEX_NAMESPACE::ArgExc, "Number of pixels per row in the " "image's data window is not a multiple " "of the x subsampling factor of " "the \"" << i.name() << "\" channel."); } if ((dataWindow.max.y - dataWindow.min.y + 1) % i.channel().ySampling) { THROW (IEX_NAMESPACE::ArgExc, "Number of pixels per column in the " "image's data window is not a multiple " "of the y subsampling factor of " "the \"" << i.name() << "\" channel."); } } } } void Header::setMaxImageSize (int maxWidth, int maxHeight) { maxImageWidth = maxWidth; maxImageHeight = maxHeight; } void Header::setMaxTileSize (int maxWidth, int maxHeight) { maxTileWidth = maxWidth; maxTileHeight = maxHeight; } bool Header::readsNothing() { return _readsNothing; } Int64 Header::writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, bool isTiled) const { // // Write a "magic number" to identify the file as an image file. // Write the current file format version number. // int version = EXR_VERSION; // // Write all attributes. If we have a preview image attribute, // keep track of its position in the file. // Int64 previewPosition = 0; const Attribute *preview = findTypedAttribute ("preview"); for (ConstIterator i = begin(); i != end(); ++i) { // // Write the attribute's name and type. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, i.name()); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, i.attribute().typeName()); // // Write the size of the attribute value, // and the value itself. // StdOSStream oss; i.attribute().writeValueTo (oss, version); std::string s = oss.str(); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, (int) s.length()); if (&i.attribute() == preview) previewPosition = os.tellp(); os.write (s.data(), int(s.length())); } // // Write zero-length attribute name to mark the end of the header. // OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, ""); return previewPosition; } void Header::readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int &version) { // // Read all attributes. // int attrCount = 0; while (true) { // // Read the name of the attribute. // A zero-length attribute name indicates the end of the header. // char name[Name::SIZE]; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, Name::MAX_LENGTH, name); if (name[0] == 0) { if (attrCount == 0) _readsNothing = true; else _readsNothing = false; break; } attrCount++; checkIsNullTerminated (name, "attribute name"); // // Read the attribute type and the size of the attribute value. // char typeName[Name::SIZE]; int size; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, Name::MAX_LENGTH, typeName); checkIsNullTerminated (typeName, "attribute type name"); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, size); if( size < 0 ) { throw IEX_NAMESPACE::InputExc("Invalid size field in header attribute"); } AttributeMap::iterator i = _map.find (name); if (i != _map.end()) { // // The attribute already exists (for example, // because it is a predefined attribute). // Read the attribute's new value from the file. // if (strncmp (i->second->typeName(), typeName, sizeof (typeName))) THROW (IEX_NAMESPACE::InputExc, "Unexpected type for image attribute " "\"" << name << "\"."); i->second->readValueFrom (is, size, version); } else { // // The new attribute does not exist yet. // If the attribute type is of a known type, // read the attribute value. If the attribute // is of an unknown type, read its value and // store it as an OpaqueAttribute. // Attribute *attr; if (Attribute::knownType (typeName)) attr = Attribute::newAttribute (typeName); else attr = new OpaqueAttribute (typeName); try { attr->readValueFrom (is, size, version); _map[name] = attr; } catch (...) { delete attr; throw; } } } } void staticInitialize () { static Mutex criticalSection; Lock lock (criticalSection); static bool initialized = false; if (!initialized) { // // One-time initialization -- register // some predefined attribute types. // Box2fAttribute::registerAttributeType(); Box2iAttribute::registerAttributeType(); ChannelListAttribute::registerAttributeType(); CompressionAttribute::registerAttributeType(); ChromaticitiesAttribute::registerAttributeType(); DeepImageStateAttribute::registerAttributeType(); DoubleAttribute::registerAttributeType(); EnvmapAttribute::registerAttributeType(); FloatAttribute::registerAttributeType(); FloatVectorAttribute::registerAttributeType(); IntAttribute::registerAttributeType(); KeyCodeAttribute::registerAttributeType(); LineOrderAttribute::registerAttributeType(); M33dAttribute::registerAttributeType(); M33fAttribute::registerAttributeType(); M44dAttribute::registerAttributeType(); M44fAttribute::registerAttributeType(); PreviewImageAttribute::registerAttributeType(); RationalAttribute::registerAttributeType(); StringAttribute::registerAttributeType(); StringVectorAttribute::registerAttributeType(); TileDescriptionAttribute::registerAttributeType(); TimeCodeAttribute::registerAttributeType(); V2dAttribute::registerAttributeType(); V2fAttribute::registerAttributeType(); V2iAttribute::registerAttributeType(); V3dAttribute::registerAttributeType(); V3fAttribute::registerAttributeType(); V3iAttribute::registerAttributeType(); DwaCompressor::initializeFuncs(); initialized = true; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfHeader.h000066400000000000000000000510171406177042200176460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_HEADER_H #define INCLUDED_IMF_HEADER_H //----------------------------------------------------------------------------- // // class Header // //----------------------------------------------------------------------------- #include "ImfLineOrder.h" #include "ImfCompression.h" #include "ImfName.h" #include "ImfTileDescription.h" #include "ImfInt64.h" #include "ImathVec.h" #include "ImathBox.h" #include "IexBaseExc.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using std::string; class Header { public: //---------------------------------------------------------------- // Default constructor -- the display window and the data window // are both set to Box2i (V2i (0, 0), V2i (width-1, height-1). //---------------------------------------------------------------- IMF_EXPORT Header (int width = 64, int height = 64, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression = ZIP_COMPRESSION); //-------------------------------------------------------------------- // Constructor -- the data window is specified explicitly; the display // window is set to Box2i (V2i (0, 0), V2i (width-1, height-1). //-------------------------------------------------------------------- IMF_EXPORT Header (int width, int height, const IMATH_NAMESPACE::Box2i &dataWindow, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression = ZIP_COMPRESSION); //---------------------------------------------------------- // Constructor -- the display window and the data window are // both specified explicitly. //---------------------------------------------------------- IMF_EXPORT Header (const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression = ZIP_COMPRESSION); //----------------- // Copy constructor //----------------- IMF_EXPORT Header (const Header &other); //----------- // Destructor //----------- IMF_EXPORT ~Header (); //----------- // Assignment //----------- IMF_EXPORT Header & operator = (const Header &other); //--------------------------------------------------------------- // Add an attribute: // // insert(n,attr) If no attribute with name n exists, a new // attribute with name n, and the same type as // attr, is added, and the value of attr is // copied into the new attribute. // // If an attribute with name n exists, and its // type is the same as attr, the value of attr // is copied into this attribute. // // If an attribute with name n exists, and its // type is different from attr, an IEX_NAMESPACE::TypeExc // is thrown. // //--------------------------------------------------------------- IMF_EXPORT void insert (const char name[], const Attribute &attribute); IMF_EXPORT void insert (const std::string &name, const Attribute &attribute); //--------------------------------------------------------------- // Remove an attribute: // // remove(n) If an attribute with name n exists, then it // is removed from the map of present attributes. // // If no attribute with name n exists, then this // functions becomes a 'no-op' // //--------------------------------------------------------------- IMF_EXPORT void erase (const char name[]); IMF_EXPORT void erase (const std::string &name); //------------------------------------------------------------------ // Access to existing attributes: // // [n] Returns a reference to the attribute // with name n. If no attribute with // name n exists, an IEX_NAMESPACE::ArgExc is thrown. // // typedAttribute(n) Returns a reference to the attribute // with name n and type T. If no attribute // with name n exists, an IEX_NAMESPACE::ArgExc is // thrown. If an attribute with name n // exists, but its type is not T, an // IEX_NAMESPACE::TypeExc is thrown. // // findTypedAttribute(n) Returns a pointer to the attribute with // name n and type T, or 0 if no attribute // with name n and type T exists. // //------------------------------------------------------------------ IMF_EXPORT Attribute & operator [] (const char name[]); IMF_EXPORT const Attribute & operator [] (const char name[]) const; IMF_EXPORT Attribute & operator [] (const std::string &name); IMF_EXPORT const Attribute & operator [] (const std::string &name) const; template T& typedAttribute (const char name[]); template const T& typedAttribute (const char name[]) const; template T& typedAttribute (const std::string &name); template const T& typedAttribute (const std::string &name) const; template T* findTypedAttribute (const char name[]); template const T* findTypedAttribute (const char name[]) const; template T* findTypedAttribute (const std::string &name); template const T* findTypedAttribute (const std::string &name) const; //--------------------------------------------- // Iterator-style access to existing attributes //--------------------------------------------- typedef std::map AttributeMap; class Iterator; class ConstIterator; IMF_EXPORT Iterator begin (); IMF_EXPORT ConstIterator begin () const; IMF_EXPORT Iterator end (); IMF_EXPORT ConstIterator end () const; IMF_EXPORT Iterator find (const char name[]); IMF_EXPORT ConstIterator find (const char name[]) const; IMF_EXPORT Iterator find (const std::string &name); IMF_EXPORT ConstIterator find (const std::string &name) const; //-------------------------------- // Access to predefined attributes //-------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i & displayWindow (); IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT IMATH_NAMESPACE::Box2i & dataWindow (); IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float & pixelAspectRatio (); IMF_EXPORT const float & pixelAspectRatio () const; IMF_EXPORT IMATH_NAMESPACE::V2f & screenWindowCenter (); IMF_EXPORT const IMATH_NAMESPACE::V2f & screenWindowCenter () const; IMF_EXPORT float & screenWindowWidth (); IMF_EXPORT const float & screenWindowWidth () const; IMF_EXPORT ChannelList & channels (); IMF_EXPORT const ChannelList & channels () const; IMF_EXPORT LineOrder & lineOrder (); IMF_EXPORT const LineOrder & lineOrder () const; IMF_EXPORT Compression & compression (); IMF_EXPORT const Compression & compression () const; //----------------------------------------------------- // Access to required attributes for multipart files // They are optional to non-multipart files and mandatory // for multipart files. //----------------------------------------------------- IMF_EXPORT void setName (const string& name); IMF_EXPORT string& name(); IMF_EXPORT const string& name() const; IMF_EXPORT bool hasName() const; IMF_EXPORT void setType (const string& Type); IMF_EXPORT string& type(); IMF_EXPORT const string& type() const; IMF_EXPORT bool hasType() const; IMF_EXPORT void setVersion (const int version); IMF_EXPORT int& version(); IMF_EXPORT const int& version() const; IMF_EXPORT bool hasVersion() const; // // the chunkCount attribute is set automatically when a file is written. // There is no need to set it manually // IMF_EXPORT void setChunkCount(int chunks); IMF_EXPORT bool hasChunkCount() const; IMF_EXPORT const int & chunkCount() const; IMF_EXPORT int & chunkCount(); // // for multipart files, return whether the file has a view string attribute // (for the deprecated single part multiview format EXR, see ImfMultiView.h) // IMF_EXPORT void setView(const string & view); IMF_EXPORT bool hasView() const; IMF_EXPORT string & view(); IMF_EXPORT const string & view() const; //---------------------------------------------------------------------- // Tile Description: // // The tile description is a TileDescriptionAttribute whose name // is "tiles". The "tiles" attribute must be present in any tiled // image file. When present, it describes various properties of the // tiles that make up the file. // // Convenience functions: // // setTileDescription(td) // calls insert ("tiles", TileDescriptionAttribute (td)) // // tileDescription() // returns typedAttribute("tiles").value() // // hasTileDescription() // return findTypedAttribute("tiles") != 0 // //---------------------------------------------------------------------- IMF_EXPORT void setTileDescription (const TileDescription & td); IMF_EXPORT TileDescription & tileDescription (); IMF_EXPORT const TileDescription & tileDescription () const; IMF_EXPORT bool hasTileDescription() const; //---------------------------------------------------------------------- // Preview image: // // The preview image is a PreviewImageAttribute whose name is "preview". // This attribute is special -- while an image file is being written, // the pixels of the preview image can be changed repeatedly by calling // OutputFile::updatePreviewImage(). // // Convenience functions: // // setPreviewImage(p) // calls insert ("preview", PreviewImageAttribute (p)) // // previewImage() // returns typedAttribute("preview").value() // // hasPreviewImage() // return findTypedAttribute("preview") != 0 // //---------------------------------------------------------------------- IMF_EXPORT void setPreviewImage (const PreviewImage &p); IMF_EXPORT PreviewImage & previewImage (); IMF_EXPORT const PreviewImage & previewImage () const; IMF_EXPORT bool hasPreviewImage () const; //------------------------------------------------------------- // Sanity check -- examines the header, and throws an exception // if it finds something wrong (empty display window, negative // pixel aspect ratio, unknown compression sceme etc.) // // set isTiled to true if you are checking a tiled/multi-res // header //------------------------------------------------------------- IMF_EXPORT void sanityCheck (bool isTiled = false, bool isMultipartFile = false) const; //---------------------------------------------------------------- // Maximum image size and maximim tile size: // // sanityCheck() will throw an exception if the width or height of // the data window exceeds the maximum image width or height, or // if the size of a tile exceeds the maximum tile width or height. // // At program startup the maximum image and tile width and height // are set to zero, meaning that width and height are unlimited. // // Limiting image and tile width and height limits how much memory // will be allocated when a file is opened. This can help protect // applications from running out of memory while trying to read // a damaged image file. //---------------------------------------------------------------- IMF_EXPORT static void setMaxImageSize (int maxWidth, int maxHeight); IMF_EXPORT static void setMaxTileSize (int maxWidth, int maxHeight); // // Check if the header reads nothing. // IMF_EXPORT bool readsNothing(); //------------------------------------------------------------------ // Input and output: // // If the header contains a preview image attribute, then writeTo() // returns the position of that attribute in the output stream; this // information is used by OutputFile::updatePreviewImage(). // If the header contains no preview image attribute, then writeTo() // returns 0. //------------------------------------------------------------------ IMF_EXPORT Int64 writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, bool isTiled = false) const; IMF_EXPORT void readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int &version); private: AttributeMap _map; bool _readsNothing; }; //---------- // Iterators //---------- class Header::Iterator { public: IMF_EXPORT Iterator (); IMF_EXPORT Iterator (const Header::AttributeMap::iterator &i); IMF_EXPORT Iterator & operator ++ (); IMF_EXPORT Iterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT Attribute & attribute () const; private: friend class Header::ConstIterator; Header::AttributeMap::iterator _i; }; class Header::ConstIterator { public: IMF_EXPORT ConstIterator (); IMF_EXPORT ConstIterator (const Header::AttributeMap::const_iterator &i); IMF_EXPORT ConstIterator (const Header::Iterator &other); IMF_EXPORT ConstIterator & operator ++ (); IMF_EXPORT ConstIterator operator ++ (int); IMF_EXPORT const char * name () const; IMF_EXPORT const Attribute & attribute () const; private: friend bool operator == (const ConstIterator &, const ConstIterator &); friend bool operator != (const ConstIterator &, const ConstIterator &); Header::AttributeMap::const_iterator _i; }; //------------------------------------------------------------------------ // Library initialization: // // In a multithreaded program, staticInitialize() must be called once // during startup, before the program accesses any other functions or // classes in the IlmImf library. Calling staticInitialize() in this // way avoids races during initialization of the library's global // variables. // // Single-threaded programs are not required to call staticInitialize(); // initialization of the library's global variables happens automatically. // //------------------------------------------------------------------------ void IMF_EXPORT staticInitialize (); //----------------- // Inline Functions //----------------- inline Header::Iterator::Iterator (): _i() { // empty } inline Header::Iterator::Iterator (const Header::AttributeMap::iterator &i): _i (i) { // empty } inline Header::Iterator & Header::Iterator::operator ++ () { ++_i; return *this; } inline Header::Iterator Header::Iterator::operator ++ (int) { Iterator tmp = *this; ++_i; return tmp; } inline const char * Header::Iterator::name () const { return *_i->first; } inline Attribute & Header::Iterator::attribute () const { return *_i->second; } inline Header::ConstIterator::ConstIterator (): _i() { // empty } inline Header::ConstIterator::ConstIterator (const Header::AttributeMap::const_iterator &i): _i (i) { // empty } inline Header::ConstIterator::ConstIterator (const Header::Iterator &other): _i (other._i) { // empty } inline Header::ConstIterator & Header::ConstIterator::operator ++ () { ++_i; return *this; } inline Header::ConstIterator Header::ConstIterator::operator ++ (int) { ConstIterator tmp = *this; ++_i; return tmp; } inline const char * Header::ConstIterator::name () const { return *_i->first; } inline const Attribute & Header::ConstIterator::attribute () const { return *_i->second; } inline bool operator == (const Header::ConstIterator &x, const Header::ConstIterator &y) { return x._i == y._i; } inline bool operator != (const Header::ConstIterator &x, const Header::ConstIterator &y) { return !(x == y); } //--------------------- // Template definitions //--------------------- template T & Header::typedAttribute (const char name[]) { Attribute *attr = &(*this)[name]; T *tattr = dynamic_cast (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); return *tattr; } template const T & Header::typedAttribute (const char name[]) const { const Attribute *attr = &(*this)[name]; const T *tattr = dynamic_cast (attr); if (tattr == 0) throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); return *tattr; } template T & Header::typedAttribute (const std::string &name) { return typedAttribute (name.c_str()); } template const T & Header::typedAttribute (const std::string &name) const { return typedAttribute (name.c_str()); } template T * Header::findTypedAttribute (const char name[]) { AttributeMap::iterator i = _map.find (name); return (i == _map.end())? 0: dynamic_cast (i->second); } template const T * Header::findTypedAttribute (const char name[]) const { AttributeMap::const_iterator i = _map.find (name); return (i == _map.end())? 0: dynamic_cast (i->second); } template T * Header::findTypedAttribute (const std::string &name) { return findTypedAttribute (name.c_str()); } template const T * Header::findTypedAttribute (const std::string &name) const { return findTypedAttribute (name.c_str()); } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfHuf.cpp000066400000000000000000000614271406177042200175410ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // 16-bit Huffman compression and decompression. // // The source code in this file is derived from the 8-bit // Huffman compression and decompression routines written // by Christian Rouet for his PIZ image file format. // //----------------------------------------------------------------------------- #include #include #include "ImfAutoArray.h" #include "ImfFastHuf.h" #include "Iex.h" #include #include #include using namespace std; using namespace IEX_NAMESPACE; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { const int HUF_ENCBITS = 16; // literal (value) bit length const int HUF_DECBITS = 14; // decoding bit size (>= 8) const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size const int HUF_DECMASK = HUF_DECSIZE - 1; struct HufDec { // short code long code //------------------------------- int len:8; // code length 0 int lit:24; // lit p size int * p; // 0 lits }; void invalidNBits () { throw InputExc ("Error in header for Huffman-encoded data " "(invalid number of bits)."); } void tooMuchData () { throw InputExc ("Error in Huffman-encoded data " "(decoded data are longer than expected)."); } void notEnoughData () { throw InputExc ("Error in Huffman-encoded data " "(decoded data are shorter than expected)."); } void invalidCode () { throw InputExc ("Error in Huffman-encoded data " "(invalid code)."); } void invalidTableSize () { throw InputExc ("Error in Huffman-encoded data " "(invalid code table size)."); } void unexpectedEndOfTable () { throw InputExc ("Error in Huffman-encoded data " "(unexpected end of code table data)."); } void tableTooLong () { throw InputExc ("Error in Huffman-encoded data " "(code table is longer than expected)."); } void invalidTableEntry () { throw InputExc ("Error in Huffman-encoded data " "(invalid code table entry)."); } inline Int64 hufLength (Int64 code) { return code & 63; } inline Int64 hufCode (Int64 code) { return code >> 6; } inline void outputBits (int nBits, Int64 bits, Int64 &c, int &lc, char *&out) { c <<= nBits; lc += nBits; c |= bits; while (lc >= 8) *out++ = (c >> (lc -= 8)); } inline Int64 getBits (int nBits, Int64 &c, int &lc, const char *&in) { while (lc < nBits) { c = (c << 8) | *(unsigned char *)(in++); lc += 8; } lc -= nBits; return (c >> lc) & ((1 << nBits) - 1); } // // ENCODING TABLE BUILDING & (UN)PACKING // // // Build a "canonical" Huffman code table: // - for each (uncompressed) symbol, hcode contains the length // of the corresponding code (in the compressed data) // - canonical codes are computed and stored in hcode // - the rules for constructing canonical codes are as follows: // * shorter codes (if filled with zeroes to the right) // have a numerically higher value than longer codes // * for codes with the same length, numerical values // increase with numerical symbol values // - because the canonical code table can be constructed from // symbol lengths alone, the code table can be transmitted // without sending the actual code values // - see http://www.compressconsult.com/huffman/ // #if !defined (OPENEXR_IMF_HAVE_LARGE_STACK) void hufCanonicalCodeTable (Int64 *hcode) #else void hufCanonicalCodeTable (Int64 hcode[HUF_ENCSIZE]) #endif { Int64 n[59]; // // For each i from 0 through 58, count the // number of different codes of length i, and // store the count in n[i]. // for (int i = 0; i <= 58; ++i) n[i] = 0; for (int i = 0; i < HUF_ENCSIZE; ++i) n[hcode[i]] += 1; // // For each i from 58 through 1, compute the // numerically lowest code with length i, and // store that code in n[i]. // Int64 c = 0; for (int i = 58; i > 0; --i) { Int64 nc = ((c + n[i]) >> 1); n[i] = c; c = nc; } // // hcode[i] contains the length, l, of the // code for symbol i. Assign the next available // code of length l to the symbol and store both // l and the code in hcode[i]. // for (int i = 0; i < HUF_ENCSIZE; ++i) { int l = hcode[i]; if (l > 0) hcode[i] = l | (n[l]++ << 6); } } // // Compute Huffman codes (based on frq input) and store them in frq: // - code structure is : [63:lsb - 6:msb] | [5-0: bit length]; // - max code length is 58 bits; // - codes outside the range [im-iM] have a null length (unused values); // - original frequencies are destroyed; // - encoding tables are used by hufEncode() and hufBuildDecTable(); // // NB: The following code "(*a == *b) && (a > b))" was added to ensure // elements in the heap with the same value are sorted by index. // This is to ensure, the STL make_heap()/pop_heap()/push_heap() methods // produced a resultant sorted heap that is identical across OSes. // struct FHeapCompare { bool operator () (Int64 *a, Int64 *b) { return ((*a > *b) || ((*a == *b) && (a > b))); } }; void hufBuildEncTable (Int64* frq, // io: input frequencies [HUF_ENCSIZE], output table int* im, // o: min frq index int* iM) // o: max frq index { // // This function assumes that when it is called, array frq // indicates the frequency of all possible symbols in the data // that are to be Huffman-encoded. (frq[i] contains the number // of occurrences of symbol i in the data.) // // The loop below does three things: // // 1) Finds the minimum and maximum indices that point // to non-zero entries in frq: // // frq[im] != 0, and frq[i] == 0 for all i < im // frq[iM] != 0, and frq[i] == 0 for all i > iM // // 2) Fills array fHeap with pointers to all non-zero // entries in frq. // // 3) Initializes array hlink such that hlink[i] == i // for all array entries. // AutoArray hlink; AutoArray fHeap; *im = 0; while (!frq[*im]) (*im)++; int nf = 0; for (int i = *im; i < HUF_ENCSIZE; i++) { hlink[i] = i; if (frq[i]) { fHeap[nf] = &frq[i]; nf++; *iM = i; } } // // Add a pseudo-symbol, with a frequency count of 1, to frq; // adjust the fHeap and hlink array accordingly. Function // hufEncode() uses the pseudo-symbol for run-length encoding. // (*iM)++; frq[*iM] = 1; fHeap[nf] = &frq[*iM]; nf++; // // Build an array, scode, such that scode[i] contains the number // of bits assigned to symbol i. Conceptually this is done by // constructing a tree whose leaves are the symbols with non-zero // frequency: // // Make a heap that contains all symbols with a non-zero frequency, // with the least frequent symbol on top. // // Repeat until only one symbol is left on the heap: // // Take the two least frequent symbols off the top of the heap. // Create a new node that has first two nodes as children, and // whose frequency is the sum of the frequencies of the first // two nodes. Put the new node back into the heap. // // The last node left on the heap is the root of the tree. For each // leaf node, the distance between the root and the leaf is the length // of the code for the corresponding symbol. // // The loop below doesn't actually build the tree; instead we compute // the distances of the leaves from the root on the fly. When a new // node is added to the heap, then that node's descendants are linked // into a single linear list that starts at the new node, and the code // lengths of the descendants (that is, their distance from the root // of the tree) are incremented by one. // make_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); AutoArray scode; memset (scode, 0, sizeof (Int64) * HUF_ENCSIZE); while (nf > 1) { // // Find the indices, mm and m, of the two smallest non-zero frq // values in fHeap, add the smallest frq to the second-smallest // frq, and remove the smallest frq value from fHeap. // int mm = fHeap[0] - frq; pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); --nf; int m = fHeap[0] - frq; pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); frq[m ] += frq[mm]; push_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); // // The entries in scode are linked into lists with the // entries in hlink serving as "next" pointers and with // the end of a list marked by hlink[j] == j. // // Traverse the lists that start at scode[m] and scode[mm]. // For each element visited, increment the length of the // corresponding code by one bit. (If we visit scode[j] // during the traversal, then the code for symbol j becomes // one bit longer.) // // Merge the lists that start at scode[m] and scode[mm] // into a single list that starts at scode[m]. // // // Add a bit to all codes in the first list. // for (int j = m; true; j = hlink[j]) { scode[j]++; assert (scode[j] <= 58); if (hlink[j] == j) { // // Merge the two lists. // hlink[j] = mm; break; } } // // Add a bit to all codes in the second list // for (int j = mm; true; j = hlink[j]) { scode[j]++; assert (scode[j] <= 58); if (hlink[j] == j) break; } } // // Build a canonical Huffman code table, replacing the code // lengths in scode with (code, code length) pairs. Copy the // code table from scode into frq. // hufCanonicalCodeTable (scode); memcpy (frq, scode, sizeof (Int64) * HUF_ENCSIZE); } // // Pack an encoding table: // - only code lengths, not actual codes, are stored // - runs of zeroes are compressed as follows: // // unpacked packed // -------------------------------- // 1 zero 0 (6 bits) // 2 zeroes 59 // 3 zeroes 60 // 4 zeroes 61 // 5 zeroes 62 // n zeroes (6 or more) 63 n-6 (6 + 8 bits) // const int SHORT_ZEROCODE_RUN = 59; const int LONG_ZEROCODE_RUN = 63; const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN; void hufPackEncTable (const Int64* hcode, // i : encoding table [HUF_ENCSIZE] int im, // i : min hcode index int iM, // i : max hcode index char** pcode) // o: ptr to packed table (updated) { char *p = *pcode; Int64 c = 0; int lc = 0; for (; im <= iM; im++) { int l = hufLength (hcode[im]); if (l == 0) { int zerun = 1; while ((im < iM) && (zerun < LONGEST_LONG_RUN)) { if (hufLength (hcode[im+1]) > 0 ) break; im++; zerun++; } if (zerun >= 2) { if (zerun >= SHORTEST_LONG_RUN) { outputBits (6, LONG_ZEROCODE_RUN, c, lc, p); outputBits (8, zerun - SHORTEST_LONG_RUN, c, lc, p); } else { outputBits (6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p); } continue; } } outputBits (6, l, c, lc, p); } if (lc > 0) *p++ = (unsigned char) (c << (8 - lc)); *pcode = p; } // // Unpack an encoding table packed by hufPackEncTable(): // void hufUnpackEncTable (const char** pcode, // io: ptr to packed table (updated) int ni, // i : input size (in bytes) int im, // i : min hcode index int iM, // i : max hcode index Int64* hcode) // o: encoding table [HUF_ENCSIZE] { memset (hcode, 0, sizeof (Int64) * HUF_ENCSIZE); const char *p = *pcode; Int64 c = 0; int lc = 0; for (; im <= iM; im++) { if (p - *pcode > ni) unexpectedEndOfTable(); Int64 l = hcode[im] = getBits (6, c, lc, p); // code length if (l == (Int64) LONG_ZEROCODE_RUN) { if (p - *pcode > ni) unexpectedEndOfTable(); int zerun = getBits (8, c, lc, p) + SHORTEST_LONG_RUN; if (im + zerun > iM + 1) tableTooLong(); while (zerun--) hcode[im++] = 0; im--; } else if (l >= (Int64) SHORT_ZEROCODE_RUN) { int zerun = l - SHORT_ZEROCODE_RUN + 2; if (im + zerun > iM + 1) tableTooLong(); while (zerun--) hcode[im++] = 0; im--; } } *pcode = const_cast(p); hufCanonicalCodeTable (hcode); } // // DECODING TABLE BUILDING // // // Clear a newly allocated decoding table so that it contains only zeroes. // void hufClearDecTable (HufDec * hdecod) // io: (allocated by caller) // decoding table [HUF_DECSIZE] { memset (hdecod, 0, sizeof (HufDec) * HUF_DECSIZE); } // // Build a decoding hash table based on the encoding table hcode: // - short codes (<= HUF_DECBITS) are resolved with a single table access; // - long code entry allocations are not optimized, because long codes are // unfrequent; // - decoding tables are used by hufDecode(); // void hufBuildDecTable (const Int64* hcode, // i : encoding table int im, // i : min index in hcode int iM, // i : max index in hcode HufDec * hdecod) // o: (allocated by caller) // decoding table [HUF_DECSIZE] { // // Init hashtable & loop on all codes. // Assumes that hufClearDecTable(hdecod) has already been called. // for (; im <= iM; im++) { Int64 c = hufCode (hcode[im]); int l = hufLength (hcode[im]); if (c >> l) { // // Error: c is supposed to be an l-bit code, // but c contains a value that is greater // than the largest l-bit number. // invalidTableEntry(); } if (l > HUF_DECBITS) { // // Long code: add a secondary entry // HufDec *pl = hdecod + (c >> (l - HUF_DECBITS)); if (pl->len) { // // Error: a short code has already // been stored in table entry *pl. // invalidTableEntry(); } pl->lit++; if (pl->p) { int *p = pl->p; pl->p = new int [pl->lit]; for (int i = 0; i < pl->lit - 1; ++i) pl->p[i] = p[i]; delete [] p; } else { pl->p = new int [1]; } pl->p[pl->lit - 1]= im; } else if (l) { // // Short code: init all primary entries // HufDec *pl = hdecod + (c << (HUF_DECBITS - l)); for (Int64 i = 1 << (HUF_DECBITS - l); i > 0; i--, pl++) { if (pl->len || pl->p) { // // Error: a short code or a long code has // already been stored in table entry *pl. // invalidTableEntry(); } pl->len = l; pl->lit = im; } } } } // // Free the long code entries of a decoding table built by hufBuildDecTable() // void hufFreeDecTable (HufDec *hdecod) // io: Decoding table { for (int i = 0; i < HUF_DECSIZE; i++) { if (hdecod[i].p) { delete [] hdecod[i].p; hdecod[i].p = 0; } } } // // ENCODING // inline void outputCode (Int64 code, Int64 &c, int &lc, char *&out) { outputBits (hufLength (code), hufCode (code), c, lc, out); } inline void sendCode (Int64 sCode, int runCount, Int64 runCode, Int64 &c, int &lc, char *&out) { // // Output a run of runCount instances of the symbol sCount. // Output the symbols explicitly, or if that is shorter, output // the sCode symbol once followed by a runCode symbol and runCount // expressed as an 8-bit number. // if (hufLength (sCode) + hufLength (runCode) + 8 < hufLength (sCode) * runCount) { outputCode (sCode, c, lc, out); outputCode (runCode, c, lc, out); outputBits (8, runCount, c, lc, out); } else { while (runCount-- >= 0) outputCode (sCode, c, lc, out); } } // // Encode (compress) ni values based on the Huffman encoding table hcode: // int hufEncode // return: output size (in bits) (const Int64* hcode, // i : encoding table const unsigned short* in, // i : uncompressed input buffer const int ni, // i : input buffer size (in bytes) int rlc, // i : rl code char* out) // o: compressed output buffer { char *outStart = out; Int64 c = 0; // bits not yet written to out int lc = 0; // number of valid bits in c (LSB) int s = in[0]; int cs = 0; // // Loop on input values // for (int i = 1; i < ni; i++) { // // Count same values or send code // if (s == in[i] && cs < 255) { cs++; } else { sendCode (hcode[s], cs, hcode[rlc], c, lc, out); cs=0; } s = in[i]; } // // Send remaining code // sendCode (hcode[s], cs, hcode[rlc], c, lc, out); if (lc) *out = (c << (8 - lc)) & 0xff; return (out - outStart) * 8 + lc; } // // DECODING // // // In order to force the compiler to inline them, // getChar() and getCode() are implemented as macros // instead of "inline" functions. // #define getChar(c, lc, in) \ { \ c = (c << 8) | *(unsigned char *)(in++); \ lc += 8; \ } #define getCode(po, rlc, c, lc, in, out, ob, oe)\ { \ if (po == rlc) \ { \ if (lc < 8) \ getChar(c, lc, in); \ \ lc -= 8; \ \ unsigned char cs = (c >> lc); \ \ if (out + cs > oe) \ tooMuchData(); \ else if (out - 1 < ob) \ notEnoughData(); \ \ unsigned short s = out[-1]; \ \ while (cs-- > 0) \ *out++ = s; \ } \ else if (out < oe) \ { \ *out++ = po; \ } \ else \ { \ tooMuchData(); \ } \ } // // Decode (uncompress) ni bits based on encoding & decoding tables: // void hufDecode (const Int64 * hcode, // i : encoding table const HufDec * hdecod, // i : decoding table const char* in, // i : compressed input buffer int ni, // i : input size (in bits) int rlc, // i : run-length code int no, // i : expected output size (in bytes) unsigned short* out) // o: uncompressed output buffer { Int64 c = 0; int lc = 0; unsigned short * outb = out; unsigned short * oe = out + no; const char * ie = in + (ni + 7) / 8; // input byte size // // Loop on input bytes // while (in < ie) { getChar (c, lc, in); // // Access decoding table // while (lc >= HUF_DECBITS) { const HufDec pl = hdecod[(c >> (lc-HUF_DECBITS)) & HUF_DECMASK]; if (pl.len) { // // Get short code // lc -= pl.len; if ( lc < 0 ) { invalidCode(); // code length too long } getCode (pl.lit, rlc, c, lc, in, out, outb, oe); } else { if (!pl.p) invalidCode(); // wrong code // // Search long code // int j; for (j = 0; j < pl.lit; j++) { int l = hufLength (hcode[pl.p[j]]); while (lc < l && in < ie) // get more bits getChar (c, lc, in); if (lc >= l) { if (hufCode (hcode[pl.p[j]]) == ((c >> (lc - l)) & ((Int64(1) << l) - 1))) { // // Found : get long code // lc -= l; getCode (pl.p[j], rlc, c, lc, in, out, outb, oe); break; } } } if (j == pl.lit) invalidCode(); // Not found } } } // // Get remaining (short) codes // int i = (8 - ni) & 7; c >>= i; lc -= i; while (lc > 0) { const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK]; if (pl.len) { lc -= pl.len; if ( lc < 0 ) { invalidCode(); // code length too long } getCode (pl.lit, rlc, c, lc, in, out, outb, oe); } else { invalidCode(); // wrong (long) code } } if (out - outb != no) notEnoughData (); } #if !defined (OPENEXR_IMF_HAVE_LARGE_STACK) void countFrequencies (Int64 *freq, const unsigned short data[/*n*/], int n) #else void countFrequencies (Int64 freq[HUF_ENCSIZE], const unsigned short data[/*n*/], int n) #endif { for (int i = 0; i < HUF_ENCSIZE; ++i) freq[i] = 0; for (int i = 0; i < n; ++i) ++freq[data[i]]; } void writeUInt (char buf[4], unsigned int i) { unsigned char *b = (unsigned char *) buf; b[0] = i; b[1] = i >> 8; b[2] = i >> 16; b[3] = i >> 24; } unsigned int readUInt (const char buf[4]) { const unsigned char *b = (const unsigned char *) buf; return ( b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) | ((b[2] << 16) & 0x00ff0000) | ((b[3] << 24) & 0xff000000); } } // namespace // // EXTERNAL INTERFACE // int hufCompress (const unsigned short raw[], int nRaw, char compressed[]) { if (nRaw == 0) return 0; AutoArray freq; countFrequencies (freq, raw, nRaw); int im = 0; int iM = 0; hufBuildEncTable (freq, &im, &iM); char *tableStart = compressed + 20; char *tableEnd = tableStart; hufPackEncTable (freq, im, iM, &tableEnd); int tableLength = tableEnd - tableStart; char *dataStart = tableEnd; int nBits = hufEncode (freq, raw, nRaw, iM, dataStart); int dataLength = (nBits + 7) / 8; writeUInt (compressed, im); writeUInt (compressed + 4, iM); writeUInt (compressed + 8, tableLength); writeUInt (compressed + 12, nBits); writeUInt (compressed + 16, 0); // room for future extensions return dataStart + dataLength - compressed; } void hufUncompress (const char compressed[], int nCompressed, unsigned short raw[], int nRaw) { // // need at least 20 bytes for header // if (nCompressed < 20 ) { if (nRaw != 0) notEnoughData(); return; } int im = readUInt (compressed); int iM = readUInt (compressed + 4); // int tableLength = readUInt (compressed + 8); int nBits = readUInt (compressed + 12); if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) invalidTableSize(); const char *ptr = compressed + 20; uint64_t nBytes = (static_cast(nBits)+7) / 8 ; if ( ptr + nBytes > compressed+nCompressed) { notEnoughData(); return; } // // Fast decoder needs at least 2x64-bits of compressed data, and // needs to be run-able on this platform. Otherwise, fall back // to the original decoder // if (FastHufDecoder::enabled() && nBits > 128) { FastHufDecoder fhd (ptr, nCompressed - (ptr - compressed), im, iM, iM); // must be nBytes remaining in buffer if( ptr-compressed + nBytes > nCompressed) { notEnoughData(); return; } fhd.decode ((unsigned char*)ptr, nBits, raw, nRaw); } else { AutoArray freq; AutoArray hdec; hufClearDecTable (hdec); hufUnpackEncTable (&ptr, nCompressed - (ptr - compressed), im, iM, freq); try { if (nBits > 8 * (nCompressed - (ptr - compressed))) invalidNBits(); hufBuildDecTable (freq, im, iM, hdec); hufDecode (freq, hdec, ptr, nBits, iM, nRaw, raw); } catch (...) { hufFreeDecTable (hdec); throw; } hufFreeDecTable (hdec); } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfHuf.h000066400000000000000000000055631406177042200172050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_HUF_H #define INCLUDED_IMF_HUF_H #include "ImfExport.h" #include "ImfNamespace.h" //----------------------------------------------------------------------------- // // 16-bit Huffman compression and decompression: // // hufCompress (r, nr, c) // // Compresses the contents of array r (of length nr), // stores the compressed data in array c, and returns // the size of the compressed data (in bytes). // // To avoid buffer overflows, the size of array c should // be at least 2 * nr + 65536. // // hufUncompress (c, nc, r, nr) // // Uncompresses the data in array c (with length nc), // and stores the results in array r (with length nr). // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMF_EXPORT int hufCompress (const unsigned short raw[/*nRaw*/], int nRaw, char compressed[/*2 * nRaw + 65536*/]); IMF_EXPORT void hufUncompress (const char compressed[/*nCompressed*/], int nCompressed, unsigned short raw[/*nRaw*/], int nRaw); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfIO.cpp000066400000000000000000000054221406177042200173170ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Low-level file input and output for OpenEXR. // //----------------------------------------------------------------------------- #include #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER IStream::IStream (const char fileName[]): _fileName (fileName) { // empty } IStream::~IStream () { // empty } bool IStream::isMemoryMapped () const { return false; } char * IStream::readMemoryMapped (int n) { throw IEX_NAMESPACE::InputExc ("Attempt to perform a memory-mapped read " "on a file that is not memory mapped."); } void IStream::clear () { // empty } const char * IStream::fileName () const { return _fileName.c_str(); } OStream::OStream (const char fileName[]): _fileName (fileName) { // empty } OStream::~OStream () { // empty } const char * OStream::fileName () const { return _fileName.c_str(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfIO.h000066400000000000000000000172701406177042200167700ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_IO_H #define INCLUDED_IMF_IO_H //----------------------------------------------------------------------------- // // Low-level file input and output for OpenEXR. // //----------------------------------------------------------------------------- #include "ImfInt64.h" #include "ImfNamespace.h" #include "ImfExport.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------------------- // class IStream -- an abstract base class for input streams. //----------------------------------------------------------- class IStream { public: //----------- // Destructor //----------- IMF_EXPORT virtual ~IStream (); //------------------------------------------------- // Does this input stream support memory-mapped IO? // // Memory-mapped streams can avoid an extra copy; // memory-mapped read operations return a pointer // to an internal buffer instead of copying data // into a buffer supplied by the caller. //------------------------------------------------- IMF_EXPORT virtual bool isMemoryMapped () const; //------------------------------------------------------ // Read from the stream: // // read(c,n) reads n bytes from the stream, and stores // them in array c. If the stream contains less than n // bytes, or if an I/O error occurs, read(c,n) throws // an exception. If read(c,n) reads the last byte from // the file it returns false, otherwise it returns true. //------------------------------------------------------ virtual bool read (char c[/*n*/], int n) = 0; //--------------------------------------------------- // Read from a memory-mapped stream: // // readMemoryMapped(n) reads n bytes from the stream // and returns a pointer to the first byte. The // returned pointer remains valid until the stream // is closed. If there are less than n byte left to // read in the stream or if the stream is not memory- // mapped, readMemoryMapped(n) throws an exception. //--------------------------------------------------- IMF_EXPORT virtual char * readMemoryMapped (int n); //-------------------------------------------------------- // Get the current reading position, in bytes from the // beginning of the file. If the next call to read() will // read the first byte in the file, tellg() returns 0. //-------------------------------------------------------- virtual Int64 tellg () = 0; //------------------------------------------- // Set the current reading position. // After calling seekg(i), tellg() returns i. //------------------------------------------- virtual void seekg (Int64 pos) = 0; //------------------------------------------------------ // Clear error conditions after an operation has failed. //------------------------------------------------------ IMF_EXPORT virtual void clear (); //------------------------------------------------------ // Get the name of the file associated with this stream. //------------------------------------------------------ IMF_EXPORT const char * fileName () const; protected: IMF_EXPORT IStream (const char fileName[]); private: IStream (const IStream &) = delete; IStream & operator = (const IStream &) = delete; IStream (IStream &&) = delete; IStream & operator = (IStream &&) = delete; std::string _fileName; }; //----------------------------------------------------------- // class OStream -- an abstract base class for output streams //----------------------------------------------------------- class OStream { public: //----------- // Destructor //----------- IMF_EXPORT virtual ~OStream (); //---------------------------------------------------------- // Write to the stream: // // write(c,n) takes n bytes from array c, and stores them // in the stream. If an I/O error occurs, write(c,n) throws // an exception. //---------------------------------------------------------- virtual void write (const char c[/*n*/], int n) = 0; //--------------------------------------------------------- // Get the current writing position, in bytes from the // beginning of the file. If the next call to write() will // start writing at the beginning of the file, tellp() // returns 0. //--------------------------------------------------------- virtual Int64 tellp () = 0; //------------------------------------------- // Set the current writing position. // After calling seekp(i), tellp() returns i. //------------------------------------------- virtual void seekp (Int64 pos) = 0; //------------------------------------------------------ // Get the name of the file associated with this stream. //------------------------------------------------------ IMF_EXPORT const char * fileName () const; protected: IMF_EXPORT OStream (const char fileName[]); private: OStream (const OStream &) = delete; OStream & operator = (const OStream &) = delete; OStream (OStream &&) = delete; OStream & operator = (OStream &&) = delete; std::string _fileName; }; //----------------------- // Helper classes for Xdr //----------------------- struct StreamIO { static void writeChars (OStream &os, const char c[/*n*/], int n) { os.write (c, n); } static bool readChars (IStream &is, char c[/*n*/], int n) { return is.read (c, n); } }; struct CharPtrIO { static void writeChars (char *&op, const char c[/*n*/], int n) { while (n--) *op++ = *c++; } static bool readChars (const char *&ip, char c[/*n*/], int n) { while (n--) *c++ = *ip++; return true; } }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfInputFile.cpp000066400000000000000000000713761406177042200207220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class InputFile // //----------------------------------------------------------------------------- #include "ImfCheckedArithmetic.h" #include "ImfInputFile.h" #include "ImfScanLineInputFile.h" #include "ImfTiledInputFile.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfStdIO.h" #include "ImfVersion.h" #include "ImfPartType.h" #include "ImfInputPartData.h" #include "ImfMultiPartInputFile.h" #include #include #include "ImathFun.h" #include "IlmThreadMutex.h" #include "Iex.h" #include "half.h" #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; // // Struct InputFile::Data stores things that will be // needed between calls to readPixels // struct InputFile::Data : public Mutex { Header header; int version; bool isTiled; TiledInputFile * tFile; ScanLineInputFile * sFile; DeepScanLineInputFile * dsFile; LineOrder lineOrder; // the file's lineorder int minY; // data window's min y coord int maxY; // data window's max x coord FrameBuffer tFileBuffer; FrameBuffer * cachedBuffer; CompositeDeepScanLine * compositor; // for loading deep files int cachedTileY; int offset; int numThreads; int partNumber; InputPartData* part; bool multiPartBackwardSupport; MultiPartInputFile* multiPartFile; InputStreamMutex * _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; void deleteCachedBuffer(); }; InputFile::Data::Data (int numThreads): isTiled (false), tFile (0), sFile (0), dsFile(0), cachedBuffer (0), compositor(0), cachedTileY (-1), numThreads (numThreads), partNumber (-1), part(NULL), multiPartBackwardSupport (false), multiPartFile (0), _streamData(0), _deleteStream(false) { // empty } InputFile::Data::~Data () { if (tFile) delete tFile; if (sFile) delete sFile; if (dsFile) delete dsFile; if (compositor) delete compositor; deleteCachedBuffer(); if (multiPartBackwardSupport && multiPartFile) delete multiPartFile; } void InputFile::Data::deleteCachedBuffer() { // // Delete the cached frame buffer, and all memory // allocated for the slices in the cached frameBuffer. // if (cachedBuffer) { for (FrameBuffer::Iterator k = cachedBuffer->begin(); k != cachedBuffer->end(); ++k) { Slice &s = k.slice(); switch (s.type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: delete [] (((unsigned int *)s.base) + offset); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: delete [] ((half *)s.base + offset); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: delete [] (((float *)s.base) + offset); break; case NUM_PIXELTYPES : throw(IEX_NAMESPACE::ArgExc("Invalid pixel type")); } } // // delete the cached frame buffer // delete cachedBuffer; cachedBuffer = 0; } } namespace { void bufferedReadPixels (InputFile::Data* ifd, int scanLine1, int scanLine2) { // // bufferedReadPixels reads each row of tiles that intersect the // scan-line range (scanLine1 to scanLine2). The previous row of // tiles is cached in order to prevent redundent tile reads when // accessing scanlines sequentially. // int minY = std::min (scanLine1, scanLine2); int maxY = std::max (scanLine1, scanLine2); if (minY < ifd->minY || maxY > ifd->maxY) { throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " "the image file's data window."); } // // The minimum and maximum y tile coordinates that intersect this // scanline range // int minDy = (minY - ifd->minY) / ifd->tFile->tileYSize(); int maxDy = (maxY - ifd->minY) / ifd->tFile->tileYSize(); // // Figure out which one is first in the file so we can read without seeking // int yStart, yEnd, yStep; if (ifd->lineOrder == DECREASING_Y) { yStart = maxDy; yEnd = minDy - 1; yStep = -1; } else { yStart = minDy; yEnd = maxDy + 1; yStep = 1; } // // the number of pixels in a row of tiles // Box2i levelRange = ifd->tFile->dataWindowForLevel(0); // // Read the tiles into our temporary framebuffer and copy them into // the user's buffer // for (int j = yStart; j != yEnd; j += yStep) { Box2i tileRange = ifd->tFile->dataWindowForTile (0, j, 0); int minYThisRow = std::max (minY, tileRange.min.y); int maxYThisRow = std::min (maxY, tileRange.max.y); if (j != ifd->cachedTileY) { // // We don't have any valid buffered info, so we need to read in // from the file. // if no channels are being read that are present in file, cachedBuffer will be empty // if (ifd->cachedBuffer && ifd->cachedBuffer->begin() != ifd->cachedBuffer->end()) { ifd->tFile->readTiles (0, ifd->tFile->numXTiles (0) - 1, j, j); } ifd->cachedTileY = j; } // // Copy the data from our cached framebuffer into the user's // framebuffer. // for (FrameBuffer::ConstIterator k = ifd->tFileBuffer.begin(); k != ifd->tFileBuffer.end(); ++k) { Slice toSlice = k.slice(); // slice to read from char* toPtr; int xStart = levelRange.min.x; int yStart = minYThisRow; while (modp (xStart, toSlice.xSampling) != 0) ++xStart; while (modp (yStart, toSlice.ySampling) != 0) ++yStart; FrameBuffer::ConstIterator c = ifd->cachedBuffer->find(k.name()); if( c!=ifd->cachedBuffer->end()) { // // output channel was read from source image: copy to output slice // Slice fromSlice = c.slice(); // slice to write to int size = pixelTypeSize (toSlice.type); char* fromPtr; for (int y = yStart; y <= maxYThisRow; y += toSlice.ySampling) { // // Set the pointers to the start of the y scanline in // this row of tiles // fromPtr = fromSlice.base + (y - tileRange.min.y) * fromSlice.yStride + xStart * fromSlice.xStride; toPtr = toSlice.base + divp (y, toSlice.ySampling) * toSlice.yStride + divp (xStart, toSlice.xSampling) * toSlice.xStride; // // Copy all pixels for the scanline in this row of tiles // for (int x = xStart; x <= levelRange.max.x; x += toSlice.xSampling) { for (int i = 0; i < size; ++i) toPtr[i] = fromPtr[i]; fromPtr += fromSlice.xStride * toSlice.xSampling; toPtr += toSlice.xStride; } } } else { // // channel wasn't present in source file: fill output slice // for (int y = yStart; y <= maxYThisRow; y += toSlice.ySampling) { toPtr = toSlice.base + divp (y, toSlice.ySampling) * toSlice.yStride + divp (xStart, toSlice.xSampling) * toSlice.xStride; // // Copy all pixels for the scanline in this row of tiles // switch ( toSlice.type) { case UINT: { unsigned int fill = toSlice.fillValue; for (int x = xStart; x <= levelRange.max.x; x += toSlice.xSampling) { * reinterpret_cast(toPtr) = fill; toPtr += toSlice.xStride; } break; } case HALF : { half fill = toSlice.fillValue; for (int x = xStart; x <= levelRange.max.x; x += toSlice.xSampling) { * reinterpret_cast(toPtr) = fill; toPtr += toSlice.xStride; } break; } case FLOAT : { float fill = toSlice.fillValue; for (int x = xStart; x <= levelRange.max.x; x += toSlice.xSampling) { * reinterpret_cast(toPtr) = fill; toPtr += toSlice.xStride; } break; } case NUM_PIXELTYPES : { break; } } } } } } } } // namespace InputFile::InputFile (const char fileName[], int numThreads): _data (new Data (numThreads)) { _data->_streamData = NULL; _data->_deleteStream=true; OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0; try { is = new StdIFStream (fileName); readMagicNumberAndVersionField(*is, _data->version); // // compatibility to read multipart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(*is); } else { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = is; _data->header.readFrom (*_data->_streamData->is, _data->version); if(isNonImage(_data->version)) { if(!_data->header.hasType()) { throw(IEX_NAMESPACE::InputExc("Non-image files must have a 'type' attribute")); } } // fix type attribute in single part regular image types // (may be wrong if an old version of OpenEXR converts // a tiled image to scanline or vice versa) if(!isNonImage(_data->version) && !isMultiPart(_data->version) && _data->header.hasType()) { _data->header.setType(isTiled(_data->version) ? TILEDIMAGE : SCANLINEIMAGE); } _data->header.sanityCheck (isTiled (_data->version)); initialize(); } } catch (IEX_NAMESPACE::BaseExc &e) { if (is) delete is; if ( _data && !_data->multiPartBackwardSupport && _data->_streamData) { delete _data->_streamData; _data->_streamData=NULL; } if (_data) delete _data; _data=NULL; REPLACE_EXC (e, "Cannot read image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { if (is) delete is; if (_data && !_data->multiPartBackwardSupport && _data->_streamData) { delete _data->_streamData; } if (_data) delete _data; throw; } } InputFile::InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _data (new Data (numThreads)) { _data->_streamData=NULL; _data->_deleteStream=false; try { readMagicNumberAndVersionField(is, _data->version); // // Backward compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(is); } else { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = &is; _data->header.readFrom (*_data->_streamData->is, _data->version); if(isNonImage(_data->version)) { if(!_data->header.hasType()) { throw(IEX_NAMESPACE::InputExc("Non-image files must have a 'type' attribute")); } } // fix type attribute in single part regular image types // (may be wrong if an old version of OpenEXR converts // a tiled image to scanline or vice versa) if(!isNonImage(_data->version) && !isMultiPart(_data->version) && _data->header.hasType()) { _data->header.setType(isTiled(_data->version) ? TILEDIMAGE : SCANLINEIMAGE); } _data->header.sanityCheck (isTiled (_data->version)); initialize(); } } catch (IEX_NAMESPACE::BaseExc &e) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; _data=NULL; REPLACE_EXC (e, "Cannot read image file " "\"" << is.fileName() << "\". " << e.what()); throw; } catch (...) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; _data=NULL; throw; } } InputFile::InputFile (InputPartData* part) : _data (new Data (part->numThreads)) { _data->_deleteStream=false; try { multiPartInitialize (part); } catch(...) { delete _data; throw; } } void InputFile::compatibilityInitialize (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) { is.seekg(0); // // Construct a MultiPartInputFile, initialize InputFile // with the part 0 data. // (TODO) may want to have a way to set the reconstruction flag. // _data->multiPartBackwardSupport = true; _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); InputPartData* part = _data->multiPartFile->getPart(0); multiPartInitialize (part); } void InputFile::multiPartInitialize (InputPartData* part) { _data->_streamData = part->mutex; _data->version = part->version; _data->header = part->header; _data->partNumber = part->partNumber; _data->part = part; initialize(); } void InputFile::initialize () { if (!_data->part) { if(_data->header.hasType() && _data->header.type()==DEEPSCANLINE) { _data->isTiled=false; const Box2i &dataWindow = _data->header.dataWindow(); _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->dsFile = new DeepScanLineInputFile (_data->header, _data->_streamData->is, _data->version, _data->numThreads); _data->compositor = new CompositeDeepScanLine; _data->compositor->addSource(_data->dsFile); } else if (isTiled (_data->version) && !isNonImage(_data->version)) { _data->isTiled = true; _data->lineOrder = _data->header.lineOrder(); // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->tFile = new TiledInputFile (_data->header, _data->_streamData->is, _data->version, _data->numThreads); } else if(!_data->header.hasType() || _data->header.type()==SCANLINEIMAGE) { _data->sFile = new ScanLineInputFile (_data->header, _data->_streamData->is, _data->numThreads); }else{ // type set but not recognised THROW(IEX_NAMESPACE::ArgExc, "InputFile cannot handle parts of type " << _data->header.type()); } } else { if(_data->header.hasType() && _data->header.type()==DEEPSCANLINE) { _data->isTiled=false; const Box2i &dataWindow = _data->header.dataWindow(); _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->dsFile = new DeepScanLineInputFile (_data->part); _data->compositor = new CompositeDeepScanLine; _data->compositor->addSource(_data->dsFile); } else if (_data->header.hasType() && _data->header.type()==TILEDIMAGE) { _data->isTiled = true; _data->lineOrder = _data->header.lineOrder(); // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; _data->tFile = new TiledInputFile (_data->part); } else if(!_data->header.hasType() || _data->header.type()==SCANLINEIMAGE) { _data->sFile = new ScanLineInputFile (_data->part); }else{ THROW(IEX_NAMESPACE::ArgExc, "InputFile cannot handle parts of type " << _data->header.type()); } } } #include InputFile::~InputFile () { if (_data->_deleteStream) delete _data->_streamData->is; // unless this file was opened via the multipart API, // delete the streamData object too if (_data->partNumber==-1 && _data->_streamData) delete _data->_streamData; if (_data) delete _data; } const char * InputFile::fileName () const { return _data->_streamData->is->fileName(); } const Header & InputFile::header () const { return _data->header; } int InputFile::version () const { return _data->version; } void InputFile::setFrameBuffer (const FrameBuffer &frameBuffer) { if (_data->isTiled) { Lock lock (*_data); // // We must invalidate the cached buffer if the new frame // buffer has a different set of channels than the old // frame buffer, or if the type of a channel has changed. // const FrameBuffer &oldFrameBuffer = _data->tFileBuffer; FrameBuffer::ConstIterator i = oldFrameBuffer.begin(); FrameBuffer::ConstIterator j = frameBuffer.begin(); while (i != oldFrameBuffer.end() && j != frameBuffer.end()) { if (strcmp (i.name(), j.name()) || i.slice().type != j.slice().type) break; ++i; ++j; } if (i != oldFrameBuffer.end() || j != frameBuffer.end()) { // // Invalidate the cached buffer. // _data->deleteCachedBuffer (); _data->cachedTileY = -1; // // Create new a cached frame buffer. It can hold a single // row of tiles. The cached buffer can be reused for each // row of tiles because we set the yTileCoords parameter of // each Slice to true. // const Box2i &dataWindow = _data->header.dataWindow(); _data->cachedBuffer = new FrameBuffer(); _data->offset = dataWindow.min.x; unsigned int tileRowSize = uiMult(dataWindow.max.x - dataWindow.min.x + 1U, _data->tFile->tileYSize()); for (FrameBuffer::ConstIterator k = frameBuffer.begin(); k != frameBuffer.end(); ++k) { Slice s = k.slice(); // // omit adding channels that are not listed - 'fill' channels are added later // if ( _data->header.channels().find(k.name()) != _data->header.channels().end() ) { switch (s.type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: _data->cachedBuffer->insert (k.name(), Slice (UINT, (char *)(new unsigned int[tileRowSize] - _data->offset), sizeof (unsigned int), sizeof (unsigned int) * _data->tFile->levelWidth(0), 1, 1, s.fillValue, false, true)); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: _data->cachedBuffer->insert (k.name(), Slice (HALF, (char *)(new half[tileRowSize] - _data->offset), sizeof (half), sizeof (half) * _data->tFile->levelWidth(0), 1, 1, s.fillValue, false, true)); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: _data->cachedBuffer->insert (k.name(), Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, (char *)(new float[tileRowSize] - _data->offset), sizeof(float), sizeof(float) * _data->tFile->levelWidth(0), 1, 1, s.fillValue, false, true)); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } } _data->tFile->setFrameBuffer (*_data->cachedBuffer); } _data->tFileBuffer = frameBuffer; } else if(_data->compositor) { _data->compositor->setFrameBuffer(frameBuffer); }else { _data->sFile->setFrameBuffer(frameBuffer); _data->tFileBuffer = frameBuffer; } } const FrameBuffer & InputFile::frameBuffer () const { if(_data->compositor) { return _data->compositor->frameBuffer(); } else if(_data->isTiled) { Lock lock (*_data); return _data->tFileBuffer; } else { return _data->sFile->frameBuffer(); } } bool InputFile::isComplete () const { if (_data->dsFile) return _data->dsFile->isComplete(); else if (_data->isTiled) return _data->tFile->isComplete(); else return _data->sFile->isComplete(); } bool InputFile::isOptimizationEnabled() const { if(_data->sFile) { return _data->sFile->isOptimizationEnabled(); }else{ return false; } } void InputFile::readPixels (int scanLine1, int scanLine2) { if (_data->compositor) { _data->compositor->readPixels(scanLine1,scanLine2); } else if (_data->isTiled) { Lock lock (*_data); bufferedReadPixels (_data, scanLine1, scanLine2); } else { _data->sFile->readPixels (scanLine1, scanLine2); } } void InputFile::readPixels (int scanLine) { readPixels (scanLine, scanLine); } void InputFile::rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize) { try { if (_data->dsFile) { throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " "from a deep image."); } else if (_data->isTiled) { throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " "from a tiled image."); } _data->sFile->rawPixelData (firstScanLine, pixelData, pixelDataSize); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void InputFile::rawPixelDataToBuffer (int scanLine, char *pixelData, int &pixelDataSize) const { try { if (_data->dsFile) { throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " "from a deep image."); } else if (_data->isTiled) { throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " "from a tiled image."); } _data->sFile->rawPixelDataToBuffer(scanLine, pixelData, pixelDataSize); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void InputFile::rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize) { try { if (!_data->isTiled) { throw IEX_NAMESPACE::ArgExc ("Tried to read a raw tile " "from a scanline-based image."); } _data->tFile->rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading tile data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } TiledInputFile* InputFile::tFile() { if (!_data->isTiled) { throw IEX_NAMESPACE::ArgExc ("Cannot get a TiledInputFile pointer " "from an InputFile that is not tiled."); } return _data->tFile; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfInputFile.h000066400000000000000000000225031406177042200203530ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_INPUT_FILE_H #define INCLUDED_IMF_INPUT_FILE_H //----------------------------------------------------------------------------- // // class InputFile -- a scanline-based interface that can be used // to read both scanline-based and tiled OpenEXR image files. // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfTiledOutputFile.h" #include "ImfThreading.h" #include "ImfGenericInputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class InputFile : public GenericInputFile { public: //----------------------------------------------------------- // A constructor that opens the file with the specified name. // Destroying the InputFile object will close the file. // // numThreads determines the number of threads that will be // used to read the file (see ImfThreading.h). //----------------------------------------------------------- IMF_EXPORT InputFile (const char fileName[], int numThreads = globalThreadCount()); //------------------------------------------------------------- // A constructor that attaches the new InputFile object to a // file that has already been opened. Destroying the InputFile // object will not close the file. // // numThreads determines the number of threads that will be // used to read the file (see ImfThreading.h). //------------------------------------------------------------- IMF_EXPORT InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~InputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the InputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readPixels() is called. // The current frame buffer can be changed after each call // to readPixels(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const FrameBuffer & frameBuffer () const; //--------------------------------------------------------------- // Check if the file is complete: // // isComplete() returns true if all pixels in the data window are // present in the input file, or false if any pixels are missing. // (Another program may still be busy writing the file, or file // writing may have been aborted prematurely.) //--------------------------------------------------------------- IMF_EXPORT bool isComplete () const; //--------------------------------------------------------------- // Check if SSE optimization is enabled // // Call after setFrameBuffer() to query whether optimized file decoding // is available - decode times will be faster if returns true // // Optimization depends on: // the file type (only scanline data is supported), // the framebuffer channels (RGB/RGBA mono or stereo) // the framebuffer channel types (all channels half-float format only) // the file channels (RGB/RGBA mono or stereo) // the file channel types (all channel half-float format only) // whether SSE2 instruction support was detected at compile time // // Calling isOptimizationEnabled before setFrameBuffer will throw an exception // //--------------------------------------------------------------- IMF_EXPORT bool isOptimizationEnabled () const; //--------------------------------------------------------------- // Read pixel data: // // readPixels(s1,s2) reads all scan lines with y coordinates // in the interval [min (s1, s2), max (s1, s2)] from the file, // and stores them in the current frame buffer. // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header().dataWindow().max.y] // // The scan lines can be read from the file in random order, and // individual scan lines may be skipped or read multiple times. // For maximum efficiency, the scan lines should be read in the // order in which they were written to the file. // // readPixels(s) calls readPixels(s,s). // //--------------------------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); //---------------------------------------------- // Read a block of raw pixel data from the file, // without uncompressing it (this function is // used to implement OutputFile::copyPixels()). //---------------------------------------------- IMF_EXPORT void rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize); //---------------------------------------------- // Read a scanline's worth of raw pixel data // from the file, without uncompressing it, and // store in an external buffer, pixelData. // pixelData should be pre-allocated with space // for pixelDataSize chars. // // This function can be used to separate the // reading of a raw scan line from the // decompression of that scan line, for // example to allow multiple scan lines to be // decompressed in parallel by an application's // own threads, where it is not convenient to // use the threading within the library. //---------------------------------------------- IMF_EXPORT void rawPixelDataToBuffer (int scanLine, char *pixelData, int &pixelDataSize) const; //-------------------------------------------------- // Read a tile of raw pixel data from the file, // without uncompressing it (this function is // used to implement TiledOutputFile::copyPixels()). //-------------------------------------------------- IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize); struct Data; private: InputFile (InputPartData* part); InputFile (const InputFile &) = delete; InputFile & operator = (const InputFile &) = delete; InputFile (InputFile &&) = delete; InputFile & operator = (InputFile &&) = delete; void initialize (); void multiPartInitialize(InputPartData* part); void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); TiledInputFile * tFile (); friend void TiledOutputFile::copyPixels (InputFile &); Data * _data; friend class MultiPartInputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfInputPart.cpp000066400000000000000000000065031406177042200207370ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfInputPart.h" #include "ImfNamespace.h" #include "ImfMultiPartInputFile.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER InputPart::InputPart(MultiPartInputFile& multiPartFile, int partNumber) { file = multiPartFile.getInputPart(partNumber); } const char * InputPart::fileName () const { return file->fileName(); } const Header & InputPart::header () const { return file->header(); } int InputPart::version () const { return file->version(); } void InputPart::setFrameBuffer (const FrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const FrameBuffer & InputPart::frameBuffer () const { return file->frameBuffer(); } bool InputPart::isComplete () const { return file->isComplete(); } bool InputPart::isOptimizationEnabled() const { return file->isOptimizationEnabled(); } void InputPart::readPixels (int scanLine1, int scanLine2) { file->readPixels(scanLine1, scanLine2); } void InputPart::readPixels (int scanLine) { file->readPixels(scanLine); } void InputPart::rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize) { file->rawPixelData(firstScanLine, pixelData, pixelDataSize); } void InputPart::rawPixelDataToBuffer (int scanLine, char *pixelData, int &pixelDataSize) const { file->rawPixelDataToBuffer(scanLine, pixelData, pixelDataSize); } void InputPart::rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize) { file->rawTileData(dx, dy, lx, ly, pixelData, pixelDataSize); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfInputPart.h000066400000000000000000000077261406177042200204140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFINPUTPART_H_ #define IMFINPUTPART_H_ #include "ImfInputFile.h" #include "ImfOutputPart.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------------------------------- // class InputPart: // // Same interface as InputFile. Please refer to InputFile. //------------------------------------------------------------------- class InputPart { public: IMF_EXPORT InputPart(MultiPartInputFile& multiPartFile, int partNumber); IMF_EXPORT const char * fileName () const; IMF_EXPORT const Header & header () const; IMF_EXPORT int version () const; IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT bool isComplete () const; IMF_EXPORT bool isOptimizationEnabled () const; IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); IMF_EXPORT void rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize); IMF_EXPORT void rawPixelDataToBuffer (int scanLine, char *pixelData, int &pixelDataSize) const; IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize); private: InputFile* file; // for internal use - give OutputFile and TiledOutputFile access to file for copyPixels friend void OutputFile::copyPixels(InputPart&); friend void TiledOutputFile::copyPixels(InputPart&); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFINPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfInputPartData.cpp000066400000000000000000000043251406177042200215310ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfInputPartData.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER InputPartData::InputPartData(InputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, int version): header(header), numThreads(numThreads), partNumber(partNumber), version(version), mutex(mutex), completed(false) { } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfInputPartData.h000066400000000000000000000050011406177042200211660ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFINPUTPARTDATA_H_ #define IMFINPUTPARTDATA_H_ #include #include "ImfInputStreamMutex.h" #include "ImfHeader.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct InputPartData { Header header; int numThreads; int partNumber; int version; InputStreamMutex* mutex; std::vector chunkOffsets; bool completed; IMF_EXPORT InputPartData(InputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, int version); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFINPUTPARTDATA_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfInputStreamMutex.h000066400000000000000000000045021406177042200217510ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFINPUTSTREAMMUTEX_H_ #define IMFINPUTSTREAMMUTEX_H_ #include "ImfIO.h" #include "IlmThreadMutex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using ILMTHREAD_NAMESPACE::Mutex; // // Used to wrap OPENEXR_IMF_INTERNAL_NAMESPACE::IStream as a Mutex. // struct InputStreamMutex : public Mutex { OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is; Int64 currentPosition; InputStreamMutex() { is = 0; currentPosition = 0; } }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFINPUTSTREAMMUTEX_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfInt64.h000066400000000000000000000044241406177042200173620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_INT64_H #define INCLUDED_IMF_INT64_H //---------------------------------------------------------------------------- // // Int64 -- unsigned 64-bit integers, imported from namespace Imath // //---------------------------------------------------------------------------- #include "ImathInt64.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using IMATH_NAMESPACE::Int64; using IMATH_NAMESPACE::SInt64; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif // INCLUDED_IMF_INT64_H openexr-2.5.7/OpenEXR/IlmImf/ImfIntAttribute.cpp000066400000000000000000000042151406177042200214250ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class IntAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER template <> const char * IntAttribute::staticTypeName () { return "int"; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfIntAttribute.h000066400000000000000000000044241406177042200210740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_INT_ATTRIBUTE_H #define INCLUDED_IMF_INT_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class IntAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute IntAttribute; template <> IMF_EXPORT const char *IntAttribute::staticTypeName (); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfKeyCode.cpp000066400000000000000000000122261406177042200203330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class KeyCode // //----------------------------------------------------------------------------- #include #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER KeyCode::KeyCode (int filmMfcCode, int filmType, int prefix, int count, int perfOffset, int perfsPerFrame, int perfsPerCount) { setFilmMfcCode (filmMfcCode); setFilmType (filmType); setPrefix (prefix); setCount (count); setPerfOffset (perfOffset); setPerfsPerFrame (perfsPerFrame); setPerfsPerCount (perfsPerCount); } KeyCode::KeyCode (const KeyCode &other) { _filmMfcCode = other._filmMfcCode; _filmType = other._filmType; _prefix = other._prefix; _count = other._count; _perfOffset = other._perfOffset; _perfsPerFrame = other._perfsPerFrame; _perfsPerCount = other._perfsPerCount; } KeyCode & KeyCode::operator = (const KeyCode &other) { if (this != &other) { _filmMfcCode = other._filmMfcCode; _filmType = other._filmType; _prefix = other._prefix; _count = other._count; _perfOffset = other._perfOffset; _perfsPerFrame = other._perfsPerFrame; _perfsPerCount = other._perfsPerCount; } return *this; } int KeyCode::filmMfcCode () const { return _filmMfcCode; } void KeyCode::setFilmMfcCode (int filmMfcCode) { if (filmMfcCode < 0 || filmMfcCode > 99) throw IEX_NAMESPACE::ArgExc ("Invalid key code film manufacturer code " "(must be between 0 and 99)."); _filmMfcCode = filmMfcCode; } int KeyCode::filmType () const { return _filmType; } void KeyCode::setFilmType (int filmType) { if (filmType < 0 || filmType > 99) throw IEX_NAMESPACE::ArgExc ("Invalid key code film type " "(must be between 0 and 99)."); _filmType = filmType; } int KeyCode::prefix () const { return _prefix; } void KeyCode::setPrefix (int prefix) { if (prefix < 0 || prefix > 999999) throw IEX_NAMESPACE::ArgExc ("Invalid key code prefix " "(must be between 0 and 999999)."); _prefix = prefix; } int KeyCode::count () const { return _count; } void KeyCode::setCount (int count) { if (count < 0 || count > 9999) throw IEX_NAMESPACE::ArgExc ("Invalid key code count " "(must be between 0 and 9999)."); _count = count; } int KeyCode::perfOffset () const { return _perfOffset; } void KeyCode::setPerfOffset (int perfOffset) { if (perfOffset < 0 || perfOffset > 119) throw IEX_NAMESPACE::ArgExc ("Invalid key code perforation offset " "(must be between 0 and 119)."); _perfOffset = perfOffset; } int KeyCode::perfsPerFrame () const { return _perfsPerFrame; } void KeyCode::setPerfsPerFrame (int perfsPerFrame) { if (perfsPerFrame < 1 || perfsPerFrame > 15) throw IEX_NAMESPACE::ArgExc ("Invalid key code number of perforations per frame " "(must be between 1 and 15)."); _perfsPerFrame = perfsPerFrame; } int KeyCode::perfsPerCount () const { return _perfsPerCount; } void KeyCode::setPerfsPerCount (int perfsPerCount) { if (perfsPerCount < 20 || perfsPerCount > 120) throw IEX_NAMESPACE::ArgExc ("Invalid key code number of perforations per count " "(must be between 20 and 120)."); _perfsPerCount = perfsPerCount; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfKeyCode.h000066400000000000000000000122731406177042200200020ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_KEY_CODE_H #define INCLUDED_IMF_KEY_CODE_H //----------------------------------------------------------------------------- // // class KeyCode // // A KeyCode object uniquely identifies a motion picture film frame. // The following fields specifiy film manufacturer, film type, film // roll and the frame's position within the roll: // // filmMfcCode film manufacturer code // range: 0 - 99 // // filmType film type code // range: 0 - 99 // // prefix prefix to identify film roll // range: 0 - 999999 // // count count, increments once every perfsPerCount // perforations (see below) // range: 0 - 9999 // // perfOffset offset of frame, in perforations from // zero-frame reference mark // range: 0 - 119 // // perfsPerFrame number of perforations per frame // range: 1 - 15 // // typical values: // // 1 for 16mm film // 3, 4, or 8 for 35mm film // 5, 8 or 15 for 65mm film // // perfsPerCount number of perforations per count // range: 20 - 120 // // typical values: // // 20 for 16mm film // 64 for 35mm film // 80 or 120 for 65mm film // // For more information about the interpretation of those fields see // the following standards and recommended practice publications: // // SMPTE 254 Motion-Picture Film (35-mm) - Manufacturer-Printed // Latent Image Identification Information // // SMPTE 268M File Format for Digital Moving-Picture Exchange (DPX) // (section 6.1) // // SMPTE 270 Motion-Picture Film (65-mm) - Manufacturer- Printed // Latent Image Identification Information // // SMPTE 271 Motion-Picture Film (16-mm) - Manufacturer- Printed // Latent Image Identification Information // //----------------------------------------------------------------------------- #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class KeyCode { public: //------------------------------------- // Constructors and assignment operator //------------------------------------- IMF_EXPORT KeyCode (int filmMfcCode = 0, int filmType = 0, int prefix = 0, int count = 0, int perfOffset = 0, int perfsPerFrame = 4, int perfsPerCount = 64); IMF_EXPORT KeyCode (const KeyCode &other); IMF_EXPORT ~KeyCode() = default; IMF_EXPORT KeyCode & operator = (const KeyCode &other); //---------------------------- // Access to individual fields //---------------------------- IMF_EXPORT int filmMfcCode () const; IMF_EXPORT void setFilmMfcCode (int filmMfcCode); IMF_EXPORT int filmType () const; IMF_EXPORT void setFilmType (int filmType); IMF_EXPORT int prefix () const; IMF_EXPORT void setPrefix (int prefix); IMF_EXPORT int count () const; IMF_EXPORT void setCount (int count); IMF_EXPORT int perfOffset () const; IMF_EXPORT void setPerfOffset (int perfOffset); IMF_EXPORT int perfsPerFrame () const; IMF_EXPORT void setPerfsPerFrame (int perfsPerFrame); IMF_EXPORT int perfsPerCount () const; IMF_EXPORT void setPerfsPerCount (int perfsPerCount); private: int _filmMfcCode; int _filmType; int _prefix; int _count; int _perfOffset; int _perfsPerFrame; int _perfsPerCount; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp000066400000000000000000000064311406177042200222200ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class KeyCodeAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * KeyCodeAttribute::staticTypeName () { return "keycode"; } template <> void KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.filmMfcCode()); Xdr::write (os, _value.filmType()); Xdr::write (os, _value.prefix()); Xdr::write (os, _value.count()); Xdr::write (os, _value.perfOffset()); Xdr::write (os, _value.perfsPerFrame()); Xdr::write (os, _value.perfsPerCount()); } template <> void KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int tmp; Xdr::read (is, tmp); _value.setFilmMfcCode (tmp); Xdr::read (is, tmp); _value.setFilmType (tmp); Xdr::read (is, tmp); _value.setPrefix (tmp); Xdr::read (is, tmp); _value.setCount (tmp); Xdr::read (is, tmp); _value.setPerfOffset (tmp); Xdr::read (is, tmp); _value.setPerfsPerFrame (tmp); Xdr::read (is, tmp); _value.setPerfsPerCount (tmp); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfKeyCodeAttribute.h000066400000000000000000000052301406177042200216610ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H #define INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class KeyCodeAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfKeyCode.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute KeyCodeAttribute; template <> IMF_EXPORT const char *KeyCodeAttribute::staticTypeName (); template <> IMF_EXPORT void KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfLineOrder.h000066400000000000000000000046621406177042200203450ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_LINE_ORDER_H #define INCLUDED_IMF_LINE_ORDER_H //----------------------------------------------------------------------------- // // enum LineOrder // //----------------------------------------------------------------------------- #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum LineOrder { INCREASING_Y = 0, // first scan line has lowest y coordinate DECREASING_Y = 1, // first scan line has highest y coordinate RANDOM_Y = 2, // only for tiled files; tiles are written // in random order NUM_LINEORDERS // number of different line orders }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp000066400000000000000000000060051406177042200225550ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class LineOrderAttribute // //----------------------------------------------------------------------------- #include "ImfLineOrderAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * LineOrderAttribute::staticTypeName () { return "lineOrder"; } template <> void LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { unsigned char tmp = _value; Xdr::write (os, tmp); } template <> void LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned char tmp; Xdr::read (is, tmp); // // prevent invalid values being written to LineOrder enum // by forcing all unknown types to NUM_LINEORDERS which is also an invalid // value but is a legal enum. Note that Header::sanityCheck will // throw an exception when files with invalid lineOrders // if (tmp != INCREASING_Y && tmp != DECREASING_Y && tmp != RANDOM_Y) tmp = NUM_LINEORDERS; _value = LineOrder (tmp); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfLineOrderAttribute.h000066400000000000000000000052631406177042200222270ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H #define INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class LineOrderAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfLineOrder.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute LineOrderAttribute; template <> IMF_EXPORT const char *LineOrderAttribute::staticTypeName (); template <> IMF_EXPORT void LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfLut.cpp000066400000000000000000000107541406177042200175600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Lookup tables for efficient application // of half --> half functions to pixel data, // and some commonly applied functions. // //----------------------------------------------------------------------------- #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER void HalfLut::apply (half *data, int nData, int stride) const { while (nData) { *data = _lut (*data); data += stride; nData -= 1; } } void HalfLut::apply (const Slice &data, const IMATH_NAMESPACE::Box2i &dataWindow) const { assert (data.type == HALF); assert (dataWindow.min.x % data.xSampling == 0); assert (dataWindow.min.y % data.ySampling == 0); assert ((dataWindow.max.x - dataWindow.min.x + 1) % data.xSampling == 0); assert ((dataWindow.max.y - dataWindow.min.y + 1) % data.ySampling == 0); char *base = data.base + data.yStride * (dataWindow.min.y / data.ySampling); for (int y = dataWindow.min.y; y <= dataWindow.max.y; y += data.ySampling) { char *pixel = base + data.xStride * (dataWindow.min.x / data.xSampling); for (int x = dataWindow.min.x; x <= dataWindow.max.x; x += data.xSampling) { *(half *)pixel = _lut (*(half *)pixel); pixel += data.xStride; } base += data.yStride; } } void RgbaLut::apply (Rgba *data, int nData, int stride) const { while (nData) { if (_chn & WRITE_R) data->r = _lut (data->r); if (_chn & WRITE_G) data->g = _lut (data->g); if (_chn & WRITE_B) data->b = _lut (data->b); if (_chn & WRITE_A) data->a = _lut (data->a); data += stride; nData -= 1; } } void RgbaLut::apply (Rgba *base, int xStride, int yStride, const IMATH_NAMESPACE::Box2i &dataWindow) const { base += dataWindow.min.y * yStride; for (int y = dataWindow.min.y; y <= dataWindow.max.y; ++y) { Rgba *pixel = base + dataWindow.min.x * xStride; for (int x = dataWindow.min.x; x <= dataWindow.max.x; ++x) { if (_chn & WRITE_R) pixel->r = _lut (pixel->r); if (_chn & WRITE_G) pixel->g = _lut (pixel->g); if (_chn & WRITE_B) pixel->b = _lut (pixel->b); if (_chn & WRITE_A) pixel->a = _lut (pixel->a); pixel += xStride; } base += yStride; } } half round12log (half x) { const float middleval = pow (2.0, -2.5); int int12log; if (x <= 0) { return 0; } else { int12log = int (2000.5 + 200.0 * log (x / middleval) / log (2.0)); if (int12log > 4095) int12log = 4095; if (int12log < 1) int12log = 1; } return middleval * pow (2.0, (int12log - 2000.0) / 200.0); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfLut.h000066400000000000000000000122401406177042200172150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_LUT_H #define INCLUDED_IMF_LUT_H //----------------------------------------------------------------------------- // // Lookup tables for efficient application // of half --> half functions to pixel data, // and some commonly applied functions. // //----------------------------------------------------------------------------- #include "ImfRgbaFile.h" #include "ImfFrameBuffer.h" #include "ImathBox.h" #include "halfFunction.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Lookup table for individual half channels. // class HalfLut { public: //------------ // Constructor //------------ template HalfLut (Function f); //---------------------------------------------------------------------- // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] //---------------------------------------------------------------------- IMF_EXPORT void apply (half *data, int nData, int stride = 1) const; //--------------------------------------------------------------- // Apply the table to a frame buffer slice (see ImfFrameBuffer.h) //--------------------------------------------------------------- IMF_EXPORT void apply (const Slice &data, const IMATH_NAMESPACE::Box2i &dataWindow) const; private: halfFunction _lut; }; // // Lookup table for combined RGBA data. // class RgbaLut { public: //------------ // Constructor //------------ template RgbaLut (Function f, RgbaChannels chn = WRITE_RGB); //---------------------------------------------------------------------- // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] //---------------------------------------------------------------------- IMF_EXPORT void apply (Rgba *data, int nData, int stride = 1) const; //----------------------------------------------------------------------- // Apply the table to a frame buffer (see RgbaOutpuFile.setFrameBuffer()) //----------------------------------------------------------------------- IMF_EXPORT void apply (Rgba *base, int xStride, int yStride, const IMATH_NAMESPACE::Box2i &dataWindow) const; private: halfFunction _lut; RgbaChannels _chn; }; // // 12bit log rounding reduces data to 20 stops with 200 steps per stop. // That makes 4000 numbers. An extra 96 just come along for the ride. // Zero explicitly remains zero. The first non-zero half will map to 1 // in the 0-4095 12log space. A nice power of two number is placed at // the center [2000] and that number is near 0.18. // IMF_EXPORT half round12log (half x); // // Round to n-bit precision (n should be between 0 and 10). // After rounding, the significand's 10-n least significant // bits will be zero. // struct roundNBit { roundNBit (int n): n(n) {} half operator () (half x) {return x.round(n);} int n; }; // // Template definitions // template HalfLut::HalfLut (Function f): _lut(f, -HALF_MAX, HALF_MAX, half (0), half::posInf(), half::negInf(), half::qNan()) { // empty } template RgbaLut::RgbaLut (Function f, RgbaChannels chn): _lut(f, -HALF_MAX, HALF_MAX, half (0), half::posInf(), half::negInf(), half::qNan()), _chn(chn) { // empty } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfMatrixAttribute.cpp000066400000000000000000000176211406177042200221440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class M33fAttribute // class M33dAttribute // class M44fAttribute // class M44dAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * M33fAttribute::staticTypeName () { return "m33f"; } template <> void M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); Xdr::write (os, _value[0][2]); Xdr::write (os, _value[1][0]); Xdr::write (os, _value[1][1]); Xdr::write (os, _value[1][2]); Xdr::write (os, _value[2][0]); Xdr::write (os, _value[2][1]); Xdr::write (os, _value[2][2]); } template <> void M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); Xdr::read (is, _value[0][2]); Xdr::read (is, _value[1][0]); Xdr::read (is, _value[1][1]); Xdr::read (is, _value[1][2]); Xdr::read (is, _value[2][0]); Xdr::read (is, _value[2][1]); Xdr::read (is, _value[2][2]); } template <> const char * M33dAttribute::staticTypeName () { return "m33d"; } template <> void M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); Xdr::write (os, _value[0][2]); Xdr::write (os, _value[1][0]); Xdr::write (os, _value[1][1]); Xdr::write (os, _value[1][2]); Xdr::write (os, _value[2][0]); Xdr::write (os, _value[2][1]); Xdr::write (os, _value[2][2]); } template <> void M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); Xdr::read (is, _value[0][2]); Xdr::read (is, _value[1][0]); Xdr::read (is, _value[1][1]); Xdr::read (is, _value[1][2]); Xdr::read (is, _value[2][0]); Xdr::read (is, _value[2][1]); Xdr::read (is, _value[2][2]); } template <> const char * M44fAttribute::staticTypeName () { return "m44f"; } template <> void M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); Xdr::write (os, _value[0][2]); Xdr::write (os, _value[0][3]); Xdr::write (os, _value[1][0]); Xdr::write (os, _value[1][1]); Xdr::write (os, _value[1][2]); Xdr::write (os, _value[1][3]); Xdr::write (os, _value[2][0]); Xdr::write (os, _value[2][1]); Xdr::write (os, _value[2][2]); Xdr::write (os, _value[2][3]); Xdr::write (os, _value[3][0]); Xdr::write (os, _value[3][1]); Xdr::write (os, _value[3][2]); Xdr::write (os, _value[3][3]); } template <> void M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); Xdr::read (is, _value[0][2]); Xdr::read (is, _value[0][3]); Xdr::read (is, _value[1][0]); Xdr::read (is, _value[1][1]); Xdr::read (is, _value[1][2]); Xdr::read (is, _value[1][3]); Xdr::read (is, _value[2][0]); Xdr::read (is, _value[2][1]); Xdr::read (is, _value[2][2]); Xdr::read (is, _value[2][3]); Xdr::read (is, _value[3][0]); Xdr::read (is, _value[3][1]); Xdr::read (is, _value[3][2]); Xdr::read (is, _value[3][3]); } template <> const char * M44dAttribute::staticTypeName () { return "m44d"; } template <> void M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); Xdr::write (os, _value[0][2]); Xdr::write (os, _value[0][3]); Xdr::write (os, _value[1][0]); Xdr::write (os, _value[1][1]); Xdr::write (os, _value[1][2]); Xdr::write (os, _value[1][3]); Xdr::write (os, _value[2][0]); Xdr::write (os, _value[2][1]); Xdr::write (os, _value[2][2]); Xdr::write (os, _value[2][3]); Xdr::write (os, _value[3][0]); Xdr::write (os, _value[3][1]); Xdr::write (os, _value[3][2]); Xdr::write (os, _value[3][3]); } template <> void M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); Xdr::read (is, _value[0][2]); Xdr::read (is, _value[0][3]); Xdr::read (is, _value[1][0]); Xdr::read (is, _value[1][1]); Xdr::read (is, _value[1][2]); Xdr::read (is, _value[1][3]); Xdr::read (is, _value[2][0]); Xdr::read (is, _value[2][1]); Xdr::read (is, _value[2][2]); Xdr::read (is, _value[2][3]); Xdr::read (is, _value[3][0]); Xdr::read (is, _value[3][1]); Xdr::read (is, _value[3][2]); Xdr::read (is, _value[3][3]); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfMatrixAttribute.h000066400000000000000000000072271406177042200216120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_MATRIX_ATTRIBUTE_H #define INCLUDED_IMF_MATRIX_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class M33fAttribute // class M33dAttribute // class M44fAttribute // class M44dAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImathMatrix.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute M33fAttribute; template <> IMF_EXPORT const char *M33fAttribute::staticTypeName (); template <> IMF_EXPORT void M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute M33dAttribute; template <> IMF_EXPORT const char *M33dAttribute::staticTypeName (); template <> IMF_EXPORT void M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute M44fAttribute; template <> IMF_EXPORT const char *M44fAttribute::staticTypeName (); template <> IMF_EXPORT void M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute M44dAttribute; template <> IMF_EXPORT const char *M44dAttribute::staticTypeName (); template <> IMF_EXPORT void M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfMisc.cpp000066400000000000000000001762061406177042200177140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Miscellaneous helper functions for OpenEXR image file I/O // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using std::vector; int pixelTypeSize (PixelType type) { int size; switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: size = Xdr::size (); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: size = Xdr::size (); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: size = Xdr::size (); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel type."); } return size; } int numSamples (int s, int a, int b) { int a1 = divp (a, s); int b1 = divp (b, s); return b1 - a1 + ((a1 * s < a)? 0: 1); } size_t bytesPerLineTable (const Header &header, vector &bytesPerLine) { const Box2i &dataWindow = header.dataWindow(); const ChannelList &channels = header.channels(); bytesPerLine.resize (dataWindow.max.y - dataWindow.min.y + 1); for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c) { size_t nBytes = size_t(pixelTypeSize (c.channel().type)) * size_t(dataWindow.max.x - dataWindow.min.x + 1) / size_t(c.channel().xSampling); for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) if (modp (y, c.channel().ySampling) == 0) bytesPerLine[i] += nBytes; } size_t maxBytesPerLine = 0; for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) if (maxBytesPerLine < bytesPerLine[i]) maxBytesPerLine = bytesPerLine[i]; return maxBytesPerLine; } static int roundToNextMultiple(int n, int d) { return ((n + d - 1) / d) * d; } static int roundToPrevMultiple(int n, int d) { return (n / d) * d; } size_t bytesPerDeepLineTable (const Header &header, int minY, int maxY, const char* base, int xStride, int yStride, vector &bytesPerLine) { const Box2i &dataWindow = header.dataWindow(); const ChannelList &channels = header.channels(); for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c) { const int ySampling = abs(c.channel().ySampling); const int xSampling = abs(c.channel().xSampling); const int pixelSize = pixelTypeSize (c.channel().type); // Here we transform from the domain over all pixels into the domain // of actual samples. We want to sample points in [minY, maxY] where // (y % ySampling) == 0. However, doing this by rejecting samples // requires O(height*width) modulo computations, which were a // significant bottleneck in the previous implementation of this // function. For the low, low price of 4 divisions per channel, we // can tighten the y & x ranges to the least and greatest roots of the // sampling function and then stride by the sampling rate. const int sampleMinY = roundToNextMultiple(minY, ySampling); const int sampleMaxY = roundToPrevMultiple(maxY, ySampling); const int sampleMinX = roundToNextMultiple(dataWindow.min.x, xSampling); const int sampleMaxX = roundToPrevMultiple(dataWindow.max.x, xSampling); for (int y = sampleMinY; y <= sampleMaxY; y+=ySampling) { int nBytes = 0; for (int x = sampleMinX; x <= sampleMaxX; x += xSampling) { nBytes += pixelSize * sampleCount(base, xStride, yStride, x, y); } bytesPerLine[y - dataWindow.min.y] += nBytes; } } size_t maxBytesPerLine = 0; for (int y = minY; y <= maxY; ++y) if (maxBytesPerLine < bytesPerLine[y - dataWindow.min.y]) maxBytesPerLine = bytesPerLine[y - dataWindow.min.y]; return maxBytesPerLine; } size_t bytesPerDeepLineTable (const Header &header, char* base, int xStride, int yStride, vector &bytesPerLine) { return bytesPerDeepLineTable(header, header.dataWindow().min.y, header.dataWindow().max.y, base, xStride, yStride, bytesPerLine); } void offsetInLineBufferTable (const vector &bytesPerLine, int scanline1, int scanline2, int linesInLineBuffer, vector &offsetInLineBuffer) { offsetInLineBuffer.resize (bytesPerLine.size()); size_t offset = 0; for (int i = scanline1; i <= scanline2; ++i) { if (i % linesInLineBuffer == 0) offset = 0; offsetInLineBuffer[i] = offset; offset += bytesPerLine[i]; } } void offsetInLineBufferTable (const vector &bytesPerLine, int linesInLineBuffer, vector &offsetInLineBuffer) { offsetInLineBufferTable (bytesPerLine, 0, bytesPerLine.size() - 1, linesInLineBuffer, offsetInLineBuffer); } int lineBufferMinY (int y, int minY, int linesInLineBuffer) { return ((y - minY) / linesInLineBuffer) * linesInLineBuffer + minY; } int lineBufferMaxY (int y, int minY, int linesInLineBuffer) { return lineBufferMinY (y, minY, linesInLineBuffer) + linesInLineBuffer - 1; } Compressor::Format defaultFormat (Compressor * compressor) { return compressor? compressor->format(): Compressor::XDR; } //obsolete int numLinesInBuffer (Compressor * compressor) { return compressor? compressor->numScanLines(): 1; } void copyIntoFrameBuffer (const char *& readPtr, char * writePtr, char * endPtr, size_t xStride, bool fill, double fillValue, Compressor::Format format, PixelType typeInFrameBuffer, PixelType typeInFile) { // // Copy a horizontal row of pixels from an input // file's line or tile buffer to a frame buffer. // if (fill) { // // The file contains no data for this channel. // Store a default value in the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: { unsigned int fillVal = (unsigned int) (fillValue); while (writePtr <= endPtr) { *(unsigned int *) writePtr = fillVal; writePtr += xStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: { half fillVal = half (fillValue); while (writePtr <= endPtr) { *(half *) writePtr = fillVal; writePtr += xStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: { float fillVal = float (fillValue); while (writePtr <= endPtr) { *(float *) writePtr = fillVal; writePtr += xStride; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else if (format == Compressor::XDR) { // // The the line or tile buffer is in XDR format. // // Convert the pixels from the file's machine- // independent representation, and store the // results in the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { Xdr::read (readPtr, *(unsigned int *) writePtr); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (writePtr <= endPtr) { half h; Xdr::read (readPtr, h); *(unsigned int *) writePtr = halfToUint (h); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { float f; Xdr::read (readPtr, f); *(unsigned int *)writePtr = floatToUint (f); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { unsigned int ui; Xdr::read (readPtr, ui); *(half *) writePtr = uintToHalf (ui); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (writePtr <= endPtr) { Xdr::read (readPtr, *(half *) writePtr); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { float f; Xdr::read (readPtr, f); *(half *) writePtr = floatToHalf (f); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { unsigned int ui; Xdr::read (readPtr, ui); *(float *) writePtr = float (ui); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (writePtr <= endPtr) { half h; Xdr::read (readPtr, h); *(float *) writePtr = float (h); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { Xdr::read (readPtr, *(float *) writePtr); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else { // // The the line or tile buffer is in NATIVE format. // Copy the results into the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { for (size_t i = 0; i < sizeof (unsigned int); ++i) writePtr[i] = readPtr[i]; readPtr += sizeof (unsigned int); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (writePtr <= endPtr) { half h = *(half *) readPtr; *(unsigned int *) writePtr = halfToUint (h); readPtr += sizeof (half); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { float f; for (size_t i = 0; i < sizeof (float); ++i) ((char *)&f)[i] = readPtr[i]; *(unsigned int *)writePtr = floatToUint (f); readPtr += sizeof (float); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { unsigned int ui; for (size_t i = 0; i < sizeof (unsigned int); ++i) ((char *)&ui)[i] = readPtr[i]; *(half *) writePtr = uintToHalf (ui); readPtr += sizeof (unsigned int); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: // If we're tightly packed, just memcpy if (xStride == sizeof(half)) { int numBytes = endPtr-writePtr+sizeof(half); memcpy(writePtr, readPtr, numBytes); readPtr += numBytes; writePtr += numBytes; } else { while (writePtr <= endPtr) { *(half *) writePtr = *(half *)readPtr; readPtr += sizeof (half); writePtr += xStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { float f; for (size_t i = 0; i < sizeof (float); ++i) ((char *)&f)[i] = readPtr[i]; *(half *) writePtr = floatToHalf (f); readPtr += sizeof (float); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (writePtr <= endPtr) { unsigned int ui; for (size_t i = 0; i < sizeof (unsigned int); ++i) ((char *)&ui)[i] = readPtr[i]; *(float *) writePtr = float (ui); readPtr += sizeof (unsigned int); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (writePtr <= endPtr) { half h = *(half *) readPtr; *(float *) writePtr = float (h); readPtr += sizeof (half); writePtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (writePtr <= endPtr) { for (size_t i = 0; i < sizeof (float); ++i) writePtr[i] = readPtr[i]; readPtr += sizeof (float); writePtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } } void copyIntoDeepFrameBuffer (const char *& readPtr, char * base, const char* sampleCountBase, ptrdiff_t sampleCountXStride, ptrdiff_t sampleCountYStride, int y, int minX, int maxX, int xOffsetForSampleCount, int yOffsetForSampleCount, int xOffsetForData, int yOffsetForData, ptrdiff_t sampleStride, ptrdiff_t xPointerStride, ptrdiff_t yPointerStride, bool fill, double fillValue, Compressor::Format format, PixelType typeInFrameBuffer, PixelType typeInFile) { // // Copy a horizontal row of pixels from an input // file's line or tile buffer to a frame buffer. // if (fill) { // // The file contains no data for this channel. // Store a default value in the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: { unsigned int fillVal = (unsigned int) (fillValue); for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); if(writePtr) { int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); for (int i = 0; i < count; i++) { *(unsigned int *) writePtr = fillVal; writePtr += sampleStride; } } } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: { half fillVal = half (fillValue); for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); if(writePtr) { int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); for (int i = 0; i < count; i++) { *(half *) writePtr = fillVal; writePtr += sampleStride; } } } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: { float fillVal = float (fillValue); for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); if(writePtr) { int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); for (int i = 0; i < count; i++) { *(float *) writePtr = fillVal; writePtr += sampleStride; } } } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else if (format == Compressor::XDR) { // // The the line or tile buffer is in XDR format. // // Convert the pixels from the file's machine- // independent representation, and store the // results in the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { Xdr::read (readPtr, *(unsigned int *) writePtr); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { half h; Xdr::read (readPtr, h); *(unsigned int *) writePtr = halfToUint (h); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { float f; Xdr::read (readPtr, f); *(unsigned int *)writePtr = floatToUint (f); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { unsigned int ui; Xdr::read (readPtr, ui); *(half *) writePtr = uintToHalf (ui); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { Xdr::read (readPtr, *(half *) writePtr); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **) (base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { float f; Xdr::read (readPtr, f); *(half *) writePtr = floatToHalf (f); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { unsigned int ui; Xdr::read (readPtr, ui); *(float *) writePtr = float (ui); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { half h; Xdr::read (readPtr, h); *(float *) writePtr = float (h); writePtr += sampleStride; } }else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { Xdr::read (readPtr, *(float *) writePtr); writePtr += sampleStride; } } else{ Xdr::skip (readPtr,count*Xdr::size()); } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else { // // The the line or tile buffer is in NATIVE format. // Copy the results into the frame buffer. // switch (typeInFrameBuffer) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { for (size_t i = 0; i < sizeof (unsigned int); ++i) writePtr[i] = readPtr[i]; readPtr += sizeof (unsigned int); writePtr += sampleStride; } }else{ readPtr+=sizeof(unsigned int)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { half h = *(half *) readPtr; *(unsigned int *) writePtr = halfToUint (h); readPtr += sizeof (half); writePtr += sampleStride; } }else{ readPtr+=sizeof(half)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { float f; for (size_t i = 0; i < sizeof (float); ++i) ((char *)&f)[i] = readPtr[i]; *(unsigned int *)writePtr = floatToUint (f); readPtr += sizeof (float); writePtr += sampleStride; } }else{ readPtr+=sizeof(float)*count; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { unsigned int ui; for (size_t i = 0; i < sizeof (unsigned int); ++i) ((char *)&ui)[i] = readPtr[i]; *(half *) writePtr = uintToHalf (ui); readPtr += sizeof (unsigned int); writePtr += sampleStride; } }else{ readPtr+=sizeof(unsigned int)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { *(half *) writePtr = *(half *)readPtr; readPtr += sizeof (half); writePtr += sampleStride; } }else{ readPtr+=sizeof(half)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { float f; for (size_t i = 0; i < sizeof (float); ++i) ((char *)&f)[i] = readPtr[i]; *(half *) writePtr = floatToHalf (f); readPtr += sizeof (float); writePtr += sampleStride; } }else{ readPtr+=sizeof(float)*count; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { unsigned int ui; for (size_t i = 0; i < sizeof (unsigned int); ++i) ((char *)&ui)[i] = readPtr[i]; *(float *) writePtr = float (ui); readPtr += sizeof (unsigned int); writePtr += sampleStride; } }else{ readPtr+=sizeof(unsigned int)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { half h = *(half *) readPtr; *(float *) writePtr = float (h); readPtr += sizeof (half); writePtr += sampleStride; } }else{ readPtr+=sizeof(half)*count; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = minX; x <= maxX; x++) { char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); if(writePtr) { for (int i = 0; i < count; i++) { for (size_t i = 0; i < sizeof (float); ++i) writePtr[i] = readPtr[i]; readPtr += sizeof (float); writePtr += sampleStride; } }else{ readPtr+=sizeof(float)*count; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } } void skipChannel (const char *& readPtr, PixelType typeInFile, size_t xSize) { switch (typeInFile) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: Xdr::skip (readPtr, Xdr::size () * xSize); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: Xdr::skip (readPtr, Xdr::size () * xSize); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: Xdr::skip (readPtr, Xdr::size () * xSize); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } namespace { // // helper function to realign floats // for architectures that require 32-bit alignment for float reading // struct FBytes { uint8_t b[4]; }; union bytesOrFloat { FBytes b; float f; } ; } void convertInPlace (char *& writePtr, const char *& readPtr, PixelType type, size_t numPixels) { switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (size_t j = 0; j < numPixels; ++j) { Xdr::write (writePtr, *(const unsigned int *) readPtr); readPtr += sizeof(unsigned int); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (size_t j = 0; j < numPixels; ++j) { Xdr::write (writePtr, *(const half *) readPtr); readPtr += sizeof(half); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (size_t j = 0; j < numPixels; ++j) { union bytesOrFloat tmp; tmp.b = * reinterpret_cast( readPtr ); Xdr::write (writePtr, tmp.f); readPtr += sizeof(float); } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } void copyFromFrameBuffer (char *& writePtr, const char *& readPtr, const char * endPtr, size_t xStride, Compressor::Format format, PixelType type) { char * localWritePtr = writePtr; const char * localReadPtr = readPtr; // // Copy a horizontal row of pixels from a frame // buffer to an output file's line or tile buffer. // if (format == Compressor::XDR) { // // The the line or tile buffer is in XDR format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (localReadPtr <= endPtr) { Xdr::write (localWritePtr, *(const unsigned int *) localReadPtr); localReadPtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (localReadPtr <= endPtr) { Xdr::write (localWritePtr, *(const half *) localReadPtr); localReadPtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (localReadPtr <= endPtr) { Xdr::write (localWritePtr, *(const float *) localReadPtr); localReadPtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else { // // The the line or tile buffer is in NATIVE format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: while (localReadPtr <= endPtr) { for (size_t i = 0; i < sizeof (unsigned int); ++i) *localWritePtr++ = localReadPtr[i]; localReadPtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: while (localReadPtr <= endPtr) { *(half *) localWritePtr = *(const half *) localReadPtr; localWritePtr += sizeof (half); localReadPtr += xStride; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: while (localReadPtr <= endPtr) { for (size_t i = 0; i < sizeof (float); ++i) *localWritePtr++ = localReadPtr[i]; localReadPtr += xStride; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } writePtr = localWritePtr; readPtr = localReadPtr; } void copyFromDeepFrameBuffer (char *& writePtr, const char * base, char* sampleCountBase, ptrdiff_t sampleCountXStride, ptrdiff_t sampleCountYStride, int y, int xMin, int xMax, int xOffsetForSampleCount, int yOffsetForSampleCount, int xOffsetForData, int yOffsetForData, ptrdiff_t sampleStride, ptrdiff_t dataXStride, ptrdiff_t dataYStride, Compressor::Format format, PixelType type) { // // Copy a horizontal row of pixels from a frame // buffer to an output file's line or tile buffer. // if (format == Compressor::XDR) { // // The the line or tile buffer is in XDR format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { Xdr::write (writePtr, *(const unsigned int *) readPtr); readPtr += sampleStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { Xdr::write (writePtr, *(const half *) readPtr); readPtr += sampleStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { Xdr::write (writePtr, *(const float *) readPtr); readPtr += sampleStride; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else { // // The the line or tile buffer is in NATIVE format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { for (size_t j = 0; j < sizeof (unsigned int); ++j) *writePtr++ = readPtr[j]; readPtr += sampleStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { *(half *) writePtr = *(const half *) readPtr; writePtr += sizeof (half); readPtr += sampleStride; } } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (int x = xMin; x <= xMax; x++) { unsigned int count = sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x - xOffsetForSampleCount, y - yOffsetForSampleCount); const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; const char* readPtr = ((const char**) ptr)[0]; for (unsigned int i = 0; i < count; i++) { for (size_t j = 0; j < sizeof (float); ++j) *writePtr++ = readPtr[j]; readPtr += sampleStride; } } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } } void fillChannelWithZeroes (char *& writePtr, Compressor::Format format, PixelType type, size_t xSize) { if (format == Compressor::XDR) { // // Fill with data in XDR format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (size_t j = 0; j < xSize; ++j) Xdr::write (writePtr, (unsigned int) 0); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (size_t j = 0; j < xSize; ++j) Xdr::write (writePtr, (half) 0); break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (size_t j = 0; j < xSize; ++j) Xdr::write (writePtr, (float) 0); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } else { // // Fill with data in NATIVE format. // switch (type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: for (size_t j = 0; j < xSize; ++j) { static const unsigned int ui = 0; for (size_t i = 0; i < sizeof (ui); ++i) *writePtr++ = ((char *) &ui)[i]; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: for (size_t j = 0; j < xSize; ++j) { *(half *) writePtr = half (0); writePtr += sizeof (half); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: for (size_t j = 0; j < xSize; ++j) { static const float f = 0; for (size_t i = 0; i < sizeof (f); ++i) *writePtr++ = ((char *) &f)[i]; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); } } } bool usesLongNames (const Header &header) { // // If an OpenEXR file contains any attribute names, attribute type names // or channel names longer than 31 characters, then the file cannot be // read by older versions of the IlmImf library (up to OpenEXR 1.6.1). // Before writing the file header, we check if the header contains // any names longer than 31 characters; if it does, then we set the // LONG_NAMES_FLAG in the file version number. Older versions of the // IlmImf library will refuse to read files that have the LONG_NAMES_FLAG // set. Without the flag, older versions of the library would mis- // interpret the file as broken. // for (Header::ConstIterator i = header.begin(); i != header.end(); ++i) { if (strlen (i.name()) >= 32 || strlen (i.attribute().typeName()) >= 32) return true; } const ChannelList &channels = header.channels(); for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { if (strlen (i.name()) >= 32) return true; } return false; } namespace { // for a given compression type, return the number of scanlines // compressed into a single chunk // TODO add to API and move to ImfCompressor.cpp int numLinesInBuffer(Compression comp) { switch(comp) { case NO_COMPRESSION : case RLE_COMPRESSION: case ZIPS_COMPRESSION: return 1; case ZIP_COMPRESSION: return 16; case PIZ_COMPRESSION: return 32; case PXR24_COMPRESSION: return 16; case B44_COMPRESSION: case B44A_COMPRESSION: case DWAA_COMPRESSION: return 32; case DWAB_COMPRESSION: return 256; default: throw IEX_NAMESPACE::ArgExc ("Unknown compression type"); } } } int getScanlineChunkOffsetTableSize(const Header& header) { const Box2i &dataWindow = header.dataWindow(); int linesInBuffer = numLinesInBuffer ( header.compression() ); int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + linesInBuffer) / linesInBuffer; return lineOffsetSize; } // // Located in ImfTiledMisc.cpp // int getTiledChunkOffsetTableSize(const Header& header); int getChunkOffsetTableSize(const Header& header,bool) { // // if there is a type in the header which indicates the part is not a currently supported type, // use the chunkCount attribute // if(header.hasType() && !isSupportedType(header.type())) { if(header.hasChunkCount()) { return header.chunkCount(); } else { throw IEX_NAMESPACE::ArgExc ("unsupported header type to " "get chunk offset table size"); } } // // part is a known type - ignore the header attribute and compute the chunk size from the header // if (isTiled(header.type()) == false) return getScanlineChunkOffsetTableSize(header); else return getTiledChunkOffsetTableSize(header); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfMisc.h000066400000000000000000000411241406177042200173470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_MISC_H #define INCLUDED_IMF_MISC_H //----------------------------------------------------------------------------- // // Miscellaneous helper functions for OpenEXR image file I/O // //----------------------------------------------------------------------------- #include "ImfPixelType.h" #include "ImfCompressor.h" #include "ImfArray.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Return the size of a single value of the indicated type, // in the machine's native format. // IMF_EXPORT int pixelTypeSize (PixelType type); // // Return the number of samples a channel with subsampling rate // s has in the interval [a, b]. For example, a channel with // subsampling rate 2 (and samples at 0, 2, 4, 6, 8, etc.) has // 2 samples in the interval [1, 5] and three samples in the // interval [2, 6]. // IMF_EXPORT int numSamples (int s, int a, int b); // // Build a table that lists, for each scanline in a file's // data window, how many bytes are required to store all // pixels in all channels in that scanline (assuming that // the pixel data are tightly packed). // IMF_EXPORT size_t bytesPerLineTable (const Header &header, std::vector &bytesPerLine); // // Get the sample count for pixel (x, y) using the array base // pointer, xStride and yStride. // inline int& sampleCount(char* base, int xStride, int yStride, int x, int y) { char* ptr = base + y * ptrdiff_t(yStride) + x * ptrdiff_t(xStride); int* intPtr = (int*) ptr; return *intPtr; } inline const int& sampleCount(const char* base, int xStride, int yStride, int x, int y) { const char* ptr = base + y * ptrdiff_t(yStride) + x * ptrdiff_t(xStride); int* intPtr = (int*) ptr; return *intPtr; } // // Build a table that lists, for each scanline in a DEEP file's // data window, how many bytes are required to store all // pixels in all channels in scanlines ranged in [minY, maxY] // (assuming that the pixel data are tightly packed). // IMF_EXPORT size_t bytesPerDeepLineTable (const Header &header, int minY, int maxY, const char* base, int xStride, int yStride, std::vector &bytesPerLine); // // Build a table that lists, for each scanline in a DEEP file's // data window, how many bytes are required to store all // pixels in all channels in every scanline (assuming that // the pixel data are tightly packed). // IMF_EXPORT size_t bytesPerDeepLineTable (const Header &header, char* base, int xStride, int yStride, std::vector &bytesPerLine); // // For scanline-based files, pixels are read or written in // in multi-scanline blocks. Internally, class OutputFile // and class ScanLineInputFile store a block of scan lines // in a "line buffer". Function offsetInLineBufferTable() // builds a table that lists, scanlines within range // [scanline1, scanline2], the location of the pixel data // for the scanline relative to the beginning of the line buffer, // where scanline1 = 0 represents the first line in the DATA WINDOW. // The one without specifying the range will make scanline1 = 0 // and scanline2 = bytesPerLine.size(). // IMF_EXPORT void offsetInLineBufferTable (const std::vector &bytesPerLine, int scanline1, int scanline2, int linesInLineBuffer, std::vector &offsetInLineBuffer); IMF_EXPORT void offsetInLineBufferTable (const std::vector &bytesPerLine, int linesInLineBuffer, std::vector &offsetInLineBuffer); // // For a scanline-based file, compute the range of scanlines // that occupy the same line buffer as a given scanline, y. // (minY is the minimum y coordinate of the file's data window.) // IMF_EXPORT int lineBufferMinY (int y, int minY, int linesInLineBuffer); IMF_EXPORT int lineBufferMaxY (int y, int minY, int linesInLineBuffer); // // Return a compressor's data format (Compressor::NATIVE or Compressor::XDR). // If compressor is 0, return Compressor::XDR. // IMF_EXPORT Compressor::Format defaultFormat (Compressor *compressor); // // Return the number of scan lines a compressor wants to compress // or uncompress at once. If compressor is 0, return 1. // IMF_EXPORT int numLinesInBuffer (Compressor *compressor); // // Copy a single channel of a horizontal row of pixels from an // input file's internal line buffer or tile buffer into a // frame buffer slice. If necessary, perform on-the-fly data // type conversion. // // readPtr initially points to the beginning of the // data in the line or tile buffer. readPtr // is advanced as the pixel data are copied; // when copyIntoFrameBuffer() returns, // readPtr points just past the end of the // copied data. // // writePtr, endPtr point to the lefmost and rightmost pixels // in the frame buffer slice // // xStride the xStride for the frame buffer slice // // format indicates if the line or tile buffer is // in NATIVE or XDR format. // // typeInFrameBuffer the pixel data type of the frame buffer slice // // typeInFile the pixel data type in the input file's channel // IMF_EXPORT void copyIntoFrameBuffer (const char *&readPtr, char *writePtr, char *endPtr, size_t xStride, bool fill, double fillValue, Compressor::Format format, PixelType typeInFrameBuffer, PixelType typeInFile); // // Copy a single channel of a horizontal row of pixels from an // input file's internal line buffer or tile buffer into a // frame buffer slice. If necessary, perform on-the-fly data // type conversion. // // readPtr initially points to the beginning of the // data in the line or tile buffer. readPtr // is advanced as the pixel data are copied; // when copyIntoFrameBuffer() returns, // readPtr points just past the end of the // copied data. // // base point to each pixel in the framebuffer // // sampleCountBase, provide the number of samples in each pixel // sampleCountXStride, // sampleCountYStride // // y the scanline to copy. The coordinate is // relative to the datawindow.min.y. // // minX, maxX used to indicate which pixels in the scanline // will be copied. // // xOffsetForSampleCount, used to offset the sample count array // yOffsetForSampleCount, and the base array. // xOffsetForData, // yOffsetForData // // xStride the xStride for the frame buffer slice // // format indicates if the line or tile buffer is // in NATIVE or XDR format. // // typeInFrameBuffer the pixel data type of the frame buffer slice // // typeInFile the pixel data type in the input file's channel // IMF_EXPORT void copyIntoDeepFrameBuffer (const char *& readPtr, char * base, const char* sampleCountBase, ptrdiff_t sampleCountXStride, ptrdiff_t sampleCountYStride, int y, int minX, int maxX, int xOffsetForSampleCount, int yOffsetForSampleCount, int xOffsetForData, int yOffsetForData, ptrdiff_t xStride, ptrdiff_t xPointerStride, ptrdiff_t yPointerStride, bool fill, double fillValue, Compressor::Format format, PixelType typeInFrameBuffer, PixelType typeInFile); // // Given a pointer into a an input file's line buffer or tile buffer, // skip over the data for xSize pixels of type typeInFile. // readPtr initially points to the beginning of the data to be skipped; // when skipChannel() returns, readPtr points just past the end of the // skipped data. // IMF_EXPORT void skipChannel (const char *&readPtr, PixelType typeInFile, size_t xSize); // // Convert an array of pixel data from the machine's native // representation to XDR format. // // toPtr, fromPtr initially point to the beginning of the input // and output pixel data arrays; when convertInPlace() // returns, toPtr and fromPtr point just past the // end of the input and output arrays. // If the native representation of the data has the // same size as the XDR data, then the conversion // can take in place, without an intermediate // temporary buffer (toPtr and fromPtr can point // to the same location). // // type the pixel data type // // numPixels number of pixels in the input and output arrays // IMF_EXPORT void convertInPlace (char *&toPtr, const char *&fromPtr, PixelType type, size_t numPixels); // // Copy a single channel of a horizontal row of pixels from a // a frame buffer into an output file's internal line buffer or // tile buffer. // // writePtr initially points to the beginning of the // data in the line or tile buffer. writePtr // is advanced as the pixel data are copied; // when copyFromFrameBuffer() returns, // writePtr points just past the end of the // copied data. // // readPtr, endPtr point to the lefmost and rightmost pixels // in the frame buffer slice // // xStride the xStride for the frame buffer slice // // format indicates if the line or tile buffer is // in NATIVE or XDR format. // // type the pixel data type in the frame buffer // and in the output file's channel (function // copyFromFrameBuffer() doesn't do on-the-fly // data type conversion) // IMF_EXPORT void copyFromFrameBuffer (char *&writePtr, const char *&readPtr, const char *endPtr, size_t xStride, Compressor::Format format, PixelType type); // // Copy a single channel of a horizontal row of pixels from a // a frame buffer in a deep data file into an output file's // internal line buffer or tile buffer. // // writePtr initially points to the beginning of the // data in the line or tile buffer. writePtr // is advanced as the pixel data are copied; // when copyFromDeepFrameBuffer() returns, // writePtr points just past the end of the // copied data. // // base the start pointer of each pixel in this channel. // It points to the real data in FrameBuffer. // It is different for different channels. // dataWindowMinX and dataWindowMinY are involved in // locating for base. // // sampleCountBase, used to locate the position to get // sampleCountXStride, the number of samples for each pixel. // sampleCountYStride Used to determine how far we should // read based on the pointer provided by base. // // y the scanline to copy. If we are dealing // with a tiled deep file, then probably a portion // of the scanline is copied. // // xMin, xMax used to indicate which pixels in the scanline // will be copied. // // xOffsetForSampleCount, used to offset the sample count array // yOffsetForSampleCount, and the base array. // xOffsetForData, // yOffsetForData // // xStride the xStride for the frame buffer slice // // format indicates if the line or tile buffer is // in NATIVE or XDR format. // // type the pixel data type in the frame buffer // and in the output file's channel (function // copyFromFrameBuffer() doesn't do on-the-fly // data type conversion) // IMF_EXPORT void copyFromDeepFrameBuffer (char *& writePtr, const char * base, char* sampleCountBase, ptrdiff_t sampleCountXStride, ptrdiff_t sampleCountYStride, int y, int xMin, int xMax, int xOffsetForSampleCount, int yOffsetForSampleCount, int xOffsetForData, int yOffsetForData, ptrdiff_t sampleStride, ptrdiff_t xStrideForData, ptrdiff_t yStrideForData, Compressor::Format format, PixelType type); // // Fill part of an output file's line buffer or tile buffer with // zeroes. This routine is called when an output file contains // a channel for which the frame buffer contains no corresponding // slice. // // writePtr initially points to the beginning of the // data in the line or tile buffer. When // fillChannelWithZeroes() returns, writePtr // points just past the end of the zeroed // data. // // format indicates if the line or tile buffer is // in NATIVE or XDR format. // // type the pixel data type in the line or frame buffer. // // xSize number of pixels to be filled with zeroes. // IMF_EXPORT void fillChannelWithZeroes (char *&writePtr, Compressor::Format format, PixelType type, size_t xSize); IMF_EXPORT bool usesLongNames (const Header &header); // // compute size of chunk offset table - for existing types, computes // the chunk size from the image size, compression type, and tile description // (for tiled types). If the type is not supported, uses the chunkCount attribute // if present, or throws an exception otherwise // deprecated_attribute is no longer used by this function // // IMF_EXPORT int getChunkOffsetTableSize(const Header& header,bool deprecated_attribute=false); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp000066400000000000000000000614521406177042200225560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfMultiPartInputFile.h" #include "ImfTimeCodeAttribute.h" #include "ImfChromaticitiesAttribute.h" #include "ImfBoxAttribute.h" #include "ImfFloatAttribute.h" #include "ImfStdIO.h" #include "ImfTileOffsets.h" #include "ImfMisc.h" #include "ImfTiledMisc.h" #include "ImfInputStreamMutex.h" #include "ImfInputPartData.h" #include "ImfPartType.h" #include "ImfInputFile.h" #include "ImfScanLineInputFile.h" #include "ImfTiledInputFile.h" #include "ImfDeepScanLineInputFile.h" #include "ImfDeepTiledInputFile.h" #include "ImfVersion.h" #include #include #include #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using IMATH_NAMESPACE::Box2i; using std::vector; using std::map; using std::set; using std::string; namespace { // Controls whether we error out in the event of shared attribute // inconsistency in the input file static const bool strictSharedAttribute = true; } struct MultiPartInputFile::Data: public InputStreamMutex { int version; // Version of this file. bool deleteStream; // If we should delete the stream during destruction. vector parts; // Data to initialize Output files. int numThreads; // Number of threads bool reconstructChunkOffsetTable; // If we should reconstruct // the offset table if it's broken. std::map _inputFiles; std::vector
_headers; void chunkOffsetReconstruction(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, const std::vector& parts); void readChunkOffsetTables(bool reconstructChunkOffsetTable); bool checkSharedAttributesValues(const Header & src, const Header & dst, std::vector & conflictingAttributes) const; TileOffsets* createTileOffsets(const Header& header); InputPartData* getPart(int partNumber); Data (bool deleteStream, int numThreads, bool reconstructChunkOffsetTable): InputStreamMutex(), deleteStream (deleteStream), numThreads (numThreads), reconstructChunkOffsetTable(reconstructChunkOffsetTable) { } ~Data() { if (deleteStream) delete is; for (size_t i = 0; i < parts.size(); i++) delete parts[i]; } Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; template T* createInputPartT(int partNumber) { } }; MultiPartInputFile::MultiPartInputFile(const char fileName[], int numThreads, bool reconstructChunkOffsetTable): _data(new Data(true, numThreads, reconstructChunkOffsetTable)) { try { _data->is = new StdIFStream (fileName); initialize(); } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot read image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } MultiPartInputFile::MultiPartInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int numThreads, bool reconstructChunkOffsetTable): _data(new Data(false, numThreads, reconstructChunkOffsetTable)) { try { _data->is = &is; initialize(); } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot read image file " "\"" << is.fileName() << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } template T* MultiPartInputFile::getInputPart(int partNumber) { Lock lock(*_data); if (_data->_inputFiles.find(partNumber) == _data->_inputFiles.end()) { T* file = new T(_data->getPart(partNumber)); _data->_inputFiles.insert(std::make_pair(partNumber, (GenericInputFile*) file)); return file; } else return (T*) _data->_inputFiles[partNumber]; } template InputFile* MultiPartInputFile::getInputPart(int); template TiledInputFile* MultiPartInputFile::getInputPart(int); template DeepScanLineInputFile* MultiPartInputFile::getInputPart(int); template DeepTiledInputFile* MultiPartInputFile::getInputPart(int); InputPartData* MultiPartInputFile::getPart(int partNumber) { return _data->getPart(partNumber); } const Header & MultiPartInputFile::header(int n) const { return _data->_headers[n]; } MultiPartInputFile::~MultiPartInputFile() { for (map::iterator it = _data->_inputFiles.begin(); it != _data->_inputFiles.end(); it++) { delete it->second; } delete _data; } bool MultiPartInputFile::Data::checkSharedAttributesValues(const Header & src, const Header & dst, vector & conflictingAttributes) const { conflictingAttributes.clear(); bool conflict = false; // // Display Window // if (src.displayWindow() != dst.displayWindow()) { conflict = true; conflictingAttributes.push_back ("displayWindow"); } // // Pixel Aspect Ratio // if (src.pixelAspectRatio() != dst.pixelAspectRatio()) { conflict = true; conflictingAttributes.push_back ("pixelAspectRatio"); } // // Timecode // const TimeCodeAttribute * srcTimeCode = src.findTypedAttribute< TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); const TimeCodeAttribute * dstTimeCode = dst.findTypedAttribute< TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); if (dstTimeCode) { if ( (srcTimeCode && (srcTimeCode->value() != dstTimeCode->value())) || (!srcTimeCode)) { conflict = true; conflictingAttributes.push_back (TimeCodeAttribute::staticTypeName()); } } // // Chromaticities // const ChromaticitiesAttribute * srcChrom = src.findTypedAttribute< ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); const ChromaticitiesAttribute * dstChrom = dst.findTypedAttribute< ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); if (dstChrom) { if ( (srcChrom && (srcChrom->value() != dstChrom->value())) || (!srcChrom)) { conflict = true; conflictingAttributes.push_back (ChromaticitiesAttribute::staticTypeName()); } } return conflict; } void MultiPartInputFile::initialize() { readMagicNumberAndVersionField(*_data->is, _data->version); bool multipart = isMultiPart(_data->version); bool tiled = isTiled(_data->version); // // Multipart files don't have and shouldn't have the tiled bit set. // if (tiled && multipart) throw IEX_NAMESPACE::InputExc ("Multipart files cannot have the tiled bit set"); int pos = 0; while (true) { Header header; header.readFrom(*_data->is, _data->version); // // If we read nothing then we stop reading. // if (header.readsNothing()) { pos++; break; } _data->_headers.push_back(header); if(multipart == false) break; } // // Perform usual check on headers. // if ( _data->_headers.size() == 0) { throw IEX_NAMESPACE::ArgExc ("Files must contain at least one header"); } for (size_t i = 0; i < _data->_headers.size(); i++) { // // Silently invent a type if the file is a single part regular image. // if( _data->_headers[i].hasType() == false ) { if(multipart) throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a type"); _data->_headers[i].setType(tiled ? TILEDIMAGE : SCANLINEIMAGE); } else { // // Silently fix the header type if it's wrong // (happens when a regular Image file written by EXR_2.0 is rewritten by an older library, // so doesn't effect deep image types) // if(!multipart && !isNonImage(_data->version)) { _data->_headers[i].setType(tiled ? TILEDIMAGE : SCANLINEIMAGE); } } if( _data->_headers[i].hasName() == false ) { if(multipart) throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a name"); } if (isTiled(_data->_headers[i].type())) _data->_headers[i].sanityCheck(true, multipart); else _data->_headers[i].sanityCheck(false, multipart); } // // Check name uniqueness. // if (multipart) { set names; for (size_t i = 0; i < _data->_headers.size(); i++) { if (names.find(_data->_headers[i].name()) != names.end()) { throw IEX_NAMESPACE::InputExc ("Header name " + _data->_headers[i].name() + " is not a unique name."); } names.insert(_data->_headers[i].name()); } } // // Check shared attributes compliance. // if (multipart && strictSharedAttribute) { for (size_t i = 1; i < _data->_headers.size(); i++) { vector attrs; if (_data->checkSharedAttributesValues (_data->_headers[0], _data->_headers[i], attrs)) { string attrNames; for (size_t j=0; j_headers[i].name() + " has non-conforming shared attributes: "+ attrNames); } } } // // Create InputParts and read chunk offset tables. // for (size_t i = 0; i < _data->_headers.size(); i++) _data->parts.push_back( new InputPartData(_data, _data->_headers[i], i, _data->numThreads, _data->version)); _data->readChunkOffsetTables(_data->reconstructChunkOffsetTable); } TileOffsets* MultiPartInputFile::Data::createTileOffsets(const Header& header) { // // Get the dataWindow information // const Box2i &dataWindow = header.dataWindow(); int minX = dataWindow.min.x; int maxX = dataWindow.max.x; int minY = dataWindow.min.y; int maxY = dataWindow.max.y; // // Precompute level and tile information // int* numXTiles = nullptr; int* numYTiles = nullptr; int numXLevels, numYLevels; TileDescription tileDesc = header.tileDescription(); try { precalculateTileInfo (tileDesc, minX, maxX, minY, maxY, numXTiles, numYTiles, numXLevels, numYLevels); TileOffsets* tileOffsets = new TileOffsets (tileDesc.mode, numXLevels, numYLevels, numXTiles, numYTiles); delete [] numXTiles; delete [] numYTiles; return tileOffsets; } catch(...) { delete [] numXTiles; delete [] numYTiles; throw; } } void MultiPartInputFile::Data::chunkOffsetReconstruction(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, const vector& parts) { // // Reconstruct broken chunk offset tables. Stop once we received any exception. // Int64 position = is.tellg(); // // check we understand all the parts available: if not, we cannot continue // exceptions thrown here should trickle back up to the constructor // for (size_t i = 0; i < parts.size(); i++) { Header& header=parts[i]->header; // // do we have a valid type entry? // we only need them for true multipart files or single part non-image (deep) files // if(!header.hasType() && (isMultiPart(version) || isNonImage(version))) { throw IEX_NAMESPACE::ArgExc("cannot reconstruct incomplete file: part with missing type"); } if(!isSupportedType(header.type())) { throw IEX_NAMESPACE::ArgExc("cannot reconstruct incomplete file: part with unknown type "+header.type()); } } // how many chunks should we read? We should stop when we reach the end size_t total_chunks = 0; // for tiled-based parts, array of (pointers to) tileOffsets objects // to create mapping between tile coordinates and chunk table indices vector tileOffsets(parts.size()); // for scanline-based parts, number of scanlines in each chunk vector rowsizes(parts.size()); for(size_t i = 0 ; i < parts.size() ; i++) { total_chunks += parts[i]->chunkOffsets.size(); if (isTiled(parts[i]->header.type())) { tileOffsets[i] = createTileOffsets(parts[i]->header); }else{ tileOffsets[i] = NULL; // (TODO) fix this so that it doesn't need to be revised for future compression types. switch(parts[i]->header.compression()) { case DWAB_COMPRESSION : rowsizes[i] = 256; break; case PIZ_COMPRESSION : case B44_COMPRESSION : case B44A_COMPRESSION : case DWAA_COMPRESSION : rowsizes[i]=32; break; case ZIP_COMPRESSION : case PXR24_COMPRESSION : rowsizes[i]=16; break; case ZIPS_COMPRESSION : case RLE_COMPRESSION : case NO_COMPRESSION : rowsizes[i]=1; break; default : throw(IEX_NAMESPACE::ArgExc("Unknown compression method in chunk offset reconstruction")); } } } try { // // // Int64 chunk_start = position; for (size_t i = 0; i < total_chunks ; i++) { // // do we have a part number? // int partNumber = 0; if(isMultiPart(version)) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, partNumber); } if(partNumber<0 || partNumber>= static_cast(parts.size())) { throw IEX_NAMESPACE::IoExc("part number out of range"); } Header& header = parts[partNumber]->header; // size of chunk NOT including multipart field Int64 size_of_chunk=0; if (isTiled(header.type())) { // // // int tilex,tiley,levelx,levely; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tilex); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tiley); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelx); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levely); //std::cout << "chunk_start for " << tilex <<',' << tiley << ',' << levelx << ' ' << levely << ':' << chunk_start << std::endl; if(!tileOffsets[partNumber]) { // this shouldn't actually happen - we should have allocated a valid // tileOffsets for any part which isTiled throw IEX_NAMESPACE::IoExc("part not tiled"); } if(!tileOffsets[partNumber]->isValidTile(tilex,tiley,levelx,levely)) { throw IEX_NAMESPACE::IoExc("invalid tile coordinates"); } (*tileOffsets[partNumber])(tilex,tiley,levelx,levely)=chunk_start; // compute chunk sizes - different procedure for deep tiles and regular // ones if(header.type()==DEEPTILE) { Int64 packed_offset; Int64 packed_sample; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); //add 40 byte header to packed sizes (tile coordinates, packed sizes, unpacked size) size_of_chunk=packed_offset+packed_sample + 40ll; } else { // regular image has 20 bytes of header, 4 byte chunksize; int chunksize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, chunksize); size_of_chunk=static_cast(chunksize) + 20ll; } } else { int y_coordinate; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y_coordinate); if(y_coordinate < header.dataWindow().min.y || y_coordinate > header.dataWindow().max.y) { throw IEX_NAMESPACE::IoExc("y out of range"); } y_coordinate -= header.dataWindow().min.y; y_coordinate /= rowsizes[partNumber]; if(y_coordinate < 0 || y_coordinate >= int(parts[partNumber]->chunkOffsets.size())) { throw IEX_NAMESPACE::IoExc("chunk index out of range"); } parts[partNumber]->chunkOffsets[y_coordinate]=chunk_start; if(header.type()==DEEPSCANLINE) { Int64 packed_offset; Int64 packed_sample; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); size_of_chunk=packed_offset+packed_sample + 28ll; } else { int chunksize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, chunksize); size_of_chunk=static_cast(chunksize) + 8ll; } } if(isMultiPart(version)) { chunk_start+=4; } chunk_start+=size_of_chunk; is.seekg(chunk_start); } } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // Suppress all exceptions. This functions is // called only to reconstruct the line offset // table for incomplete files, and exceptions // are likely. // } // copy tiled part data back to chunk offsets for(size_t partNumber=0;partNumber > > offsets = tileOffsets[partNumber]->getOffsets(); for (size_t l = 0; l < offsets.size(); l++) for (size_t y = 0; y < offsets[l].size(); y++) for (size_t x = 0; x < offsets[l][y].size(); x++) { parts[ partNumber ]->chunkOffsets[pos] = offsets[l][y][x]; pos++; } delete tileOffsets[partNumber]; } } is.clear(); is.seekg (position); } InputPartData* MultiPartInputFile::Data::getPart(int partNumber) { if (partNumber < 0 || partNumber >= (int) parts.size()) throw IEX_NAMESPACE::ArgExc ("Part number is not in valid range."); return parts[partNumber]; } void MultiPartInputFile::Data::readChunkOffsetTables(bool reconstructChunkOffsetTable) { bool brokenPartsExist = false; for (size_t i = 0; i < parts.size(); i++) { int chunkOffsetTableSize = getChunkOffsetTableSize(parts[i]->header); parts[i]->chunkOffsets.resize(chunkOffsetTableSize); for (int j = 0; j < chunkOffsetTableSize; j++) OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*is, parts[i]->chunkOffsets[j]); // // Check chunk offsets, reconstruct if broken. // At first we assume the table is complete. // parts[i]->completed = true; for (int j = 0; j < chunkOffsetTableSize; j++) { if (parts[i]->chunkOffsets[j] <= 0) { brokenPartsExist = true; parts[i]->completed = false; break; } } } if (brokenPartsExist && reconstructChunkOffsetTable) chunkOffsetReconstruction(*is, parts); } int MultiPartInputFile::version() const { return _data->version; } bool MultiPartInputFile::partComplete(int part) const { return _data->parts[part]->completed; } int MultiPartInputFile::parts() const { return int(_data->_headers.size()); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfMultiPartInputFile.h000066400000000000000000000103351406177042200222150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFMULTIPARTINPUTFILE_H_ #define IMFMULTIPARTINPUTFILE_H_ #include "ImfGenericInputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfThreading.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class MultiPartInputFile : public GenericInputFile { public: IMF_EXPORT MultiPartInputFile(const char fileName[], int numThreads = globalThreadCount(), bool reconstructChunkOffsetTable = true); IMF_EXPORT MultiPartInputFile(IStream& is, int numThreads = globalThreadCount(), bool reconstructChunkOffsetTable = true); IMF_EXPORT virtual ~MultiPartInputFile(); // ---------------------- // Count of number of parts in file // --------------------- IMF_EXPORT int parts() const; //---------------------- // Access to the headers //---------------------- IMF_EXPORT const Header & header(int n) const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; // =---------------------------------------- // Check whether the entire chunk offset // table for the part is written correctly // ----------------------------------------- IMF_EXPORT bool partComplete(int part) const; struct Data; private: Data* _data; MultiPartInputFile(const MultiPartInputFile &) = delete; MultiPartInputFile& operator = (const MultiPartInputFile &) = delete; MultiPartInputFile(MultiPartInputFile &&) = delete; MultiPartInputFile& operator = (MultiPartInputFile &&) = delete; // // used internally by 'Part' types to access individual parts of the multipart file // template T* getInputPart(int partNumber); InputPartData* getPart(int); void initialize(); friend class InputPart; friend class ScanLineInputPart; friend class TiledInputPart; friend class DeepScanLineInputPart; friend class DeepTiledInputPart; // // For backward compatibility. // friend class InputFile; friend class TiledInputFile; friend class ScanLineInputFile; friend class DeepScanLineInputFile; friend class DeepTiledInputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFMULTIPARTINPUTFILE_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp000066400000000000000000000411461406177042200227550ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfMultiPartOutputFile.h" #include "ImfBoxAttribute.h" #include "ImfFloatAttribute.h" #include "ImfTimeCodeAttribute.h" #include "ImfChromaticitiesAttribute.h" #include "ImfOutputPartData.h" #include "ImfPartType.h" #include "ImfOutputFile.h" #include "ImfTiledOutputFile.h" #include "ImfThreading.h" #include "IlmThreadMutex.h" #include "ImfMisc.h" #include "ImfStdIO.h" #include "ImfDeepScanLineOutputFile.h" #include "ImfDeepTiledOutputFile.h" #include "ImfOutputStreamMutex.h" #include "ImfNamespace.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using ILMTHREAD_NAMESPACE::Lock; using std::vector; using std::map; using std::set; struct MultiPartOutputFile::Data: public OutputStreamMutex { vector parts; // Contains data to initialize Output files. bool deleteStream; // If we should delete the stream when destruction. int numThreads; // The number of threads. std::map _outputFiles; std::vector
_headers; void headerNameUniquenessCheck (const std::vector
&headers); void writeHeadersToFile (const std::vector
&headers); void writeChunkTableOffsets (std::vector &parts); //------------------------------------- // ensure that _headers is valid: called by constructors //------------------------------------- void do_header_sanity_checks(bool overrideSharedAttributes); // ------------------------------------------------ // Given a source header, we copy over all the 'shared attributes' to // the destination header and remove any conflicting ones. // ------------------------------------------------ void overrideSharedAttributesValues (const Header & src, Header & dst); // ------------------------------------------------ // Given a source header, we check the destination header for any // attributes that are part of the shared attribute set. For attributes // present in both we check the values. For attribute present in // destination but absent in source we return false. // For attributes present in src but missing from dst we return false // and add the attribute to dst. // We return false for all other cases. // If we return true then we also populate the conflictingAttributes // vector with the names of the attributes that failed the above. // ------------------------------------------------ bool checkSharedAttributesValues (const Header & src, const Header & dst, std::vector & conflictingAttributes) const; Data (bool deleteStream, int numThreads): OutputStreamMutex(), deleteStream (deleteStream), numThreads (numThreads) { } ~Data() { if (deleteStream) delete os; for (size_t i = 0; i < parts.size(); i++) delete parts[i]; } Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; }; void MultiPartOutputFile::Data::do_header_sanity_checks(bool overrideSharedAttributes) { size_t parts = _headers.size(); if (parts == 0) throw IEX_NAMESPACE::ArgExc ("Empty header list."); bool isMultiPart = (parts > 1); // // Do part 0 checks first. // _headers[0].sanityCheck (_headers[0].hasTileDescription(), isMultiPart); if (isMultiPart) { // multipart files must contain a chunkCount attribute _headers[0].setChunkCount(getChunkOffsetTableSize(_headers[0])); for (size_t i = 1; i < parts; i++) { if (_headers[i].hasType() == false) throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a type"); _headers[i].setChunkCount(getChunkOffsetTableSize(_headers[i])); _headers[i].sanityCheck (_headers[i].hasTileDescription(), isMultiPart); if (overrideSharedAttributes) overrideSharedAttributesValues(_headers[0],_headers[i]); else { std::vector conflictingAttributes; bool valid =checkSharedAttributesValues (_headers[0], _headers[i], conflictingAttributes); if (valid) { string excMsg("Conflicting attributes found for header :: "); excMsg += _headers[i].name(); for (size_t i=0; i_headers.resize(parts); for(int i=0;i_headers[i]=headers[i]; } try { _data->do_header_sanity_checks(overrideSharedAttributes); // // Build parts and write headers and offset tables to file. // _data->os = new StdOFStream (fileName); for (size_t i = 0; i < _data->_headers.size(); i++) _data->parts.push_back( new OutputPartData(_data, _data->_headers[i], i, numThreads, parts>1 ) ); writeMagicNumberAndVersionField(*_data->os, &_data->_headers[0],_data->_headers.size()); _data->writeHeadersToFile(_data->_headers); _data->writeChunkTableOffsets(_data->parts); } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } MultiPartOutputFile::MultiPartOutputFile(OStream& os, const Header* headers, int parts, bool overrideSharedAttributes, int numThreads): _data(new Data(false,numThreads)) { // grab headers _data->_headers.resize(parts); _data->os=&os; for(int i=0;i_headers[i]=headers[i]; } try { _data->do_header_sanity_checks(overrideSharedAttributes); // // Build parts and write headers and offset tables to file. // for (size_t i = 0; i < _data->_headers.size(); i++) _data->parts.push_back( new OutputPartData(_data, _data->_headers[i], i, numThreads, parts>1 ) ); writeMagicNumberAndVersionField(*_data->os, &_data->_headers[0],_data->_headers.size()); _data->writeHeadersToFile(_data->_headers); _data->writeChunkTableOffsets(_data->parts); } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot open image stream " "\"" << os.fileName() << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } const Header & MultiPartOutputFile::header(int n) const { if(n<0 || n>int(_data->_headers.size())) { throw IEX_NAMESPACE::ArgExc("MultiPartOutputFile::header called with invalid part number"); } return _data->_headers[n]; } int MultiPartOutputFile::parts() const { return _data->_headers.size(); } MultiPartOutputFile::~MultiPartOutputFile () { for (map::iterator it = _data->_outputFiles.begin(); it != _data->_outputFiles.end(); it++) { delete it->second; } delete _data; } template T* MultiPartOutputFile::getOutputPart(int partNumber) { Lock lock(*_data); if (_data->_outputFiles.find(partNumber) == _data->_outputFiles.end()) { T* file = new T(_data->parts[partNumber]); _data->_outputFiles.insert(std::make_pair(partNumber, (GenericOutputFile*) file)); return file; } else return (T*) _data->_outputFiles[partNumber]; } // instance above function for all four types template OutputFile* MultiPartOutputFile::getOutputPart(int); template TiledOutputFile * MultiPartOutputFile::getOutputPart(int); template DeepScanLineOutputFile * MultiPartOutputFile::getOutputPart (int); template DeepTiledOutputFile * MultiPartOutputFile::getOutputPart (int); void MultiPartOutputFile::Data::overrideSharedAttributesValues(const Header & src, Header & dst) { // // Display Window // const Box2iAttribute * displayWindow = src.findTypedAttribute ("displayWindow"); if (displayWindow) dst.insert ("displayWindow", *displayWindow); else dst.erase ("displayWindow"); // // Pixel Aspect Ratio // const FloatAttribute * pixelAspectRatio = src.findTypedAttribute ("pixelAspectRatio"); if (pixelAspectRatio) dst.insert ("pixelAspectRatio", *pixelAspectRatio); else dst.erase ("pixelAspectRatio"); // // Timecode // const TimeCodeAttribute * timeCode = src.findTypedAttribute ("timecode"); if (timeCode) dst.insert ("timecode", *timeCode); else dst.erase ("timecode"); // // Chromaticities // const ChromaticitiesAttribute * chromaticities = src.findTypedAttribute ("chromaticities"); if (chromaticities) dst.insert ("chromaticities", *chromaticities); else dst.erase ("chromaticities"); } bool MultiPartOutputFile::Data::checkSharedAttributesValues(const Header & src, const Header & dst, vector & conflictingAttributes) const { bool conflict = false; // // Display Window // if (src.displayWindow() != dst.displayWindow()) { conflict = true; conflictingAttributes.push_back ("displayWindow"); } // // Pixel Aspect Ratio // if (src.pixelAspectRatio() != dst.pixelAspectRatio()) { conflict = true; conflictingAttributes.push_back ("pixelAspectRatio"); } // // Timecode // const TimeCodeAttribute * srcTimeCode = src.findTypedAttribute< TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); const TimeCodeAttribute * dstTimeCode = dst.findTypedAttribute< TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); if (dstTimeCode) { if ((srcTimeCode && (srcTimeCode->value() != dstTimeCode->value())) || (!srcTimeCode)) { conflict = true; conflictingAttributes.push_back (TimeCodeAttribute::staticTypeName()); } } // // Chromaticities // const ChromaticitiesAttribute * srcChrom = src.findTypedAttribute< ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); const ChromaticitiesAttribute * dstChrom = dst.findTypedAttribute< ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); if (dstChrom) { if ( (srcChrom && (srcChrom->value() != dstChrom->value())) || (!srcChrom)) { conflict = true; conflictingAttributes.push_back (ChromaticitiesAttribute::staticTypeName()); } } return conflict; } void MultiPartOutputFile::Data::headerNameUniquenessCheck (const vector
&headers) { set names; for (size_t i = 0; i < headers.size(); i++) { if (names.find(headers[i].name()) != names.end()) throw IEX_NAMESPACE::ArgExc ("Each part should have a unique name."); names.insert(headers[i].name()); } } void MultiPartOutputFile::Data::writeHeadersToFile (const vector
&headers) { for (size_t i = 0; i < headers.size(); i++) { // (TODO) consider deep files' preview images here. if (headers[i].type() == TILEDIMAGE) parts[i]->previewPosition = headers[i].writeTo(*os, true); else parts[i]->previewPosition = headers[i].writeTo(*os, false); } // // If a multipart file, write zero-length attribute name to mark the end of all headers. // if (headers.size() !=1) OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*os, ""); } void MultiPartOutputFile::Data::writeChunkTableOffsets (vector &parts) { for (size_t i = 0; i < parts.size(); i++) { int chunkTableSize = getChunkOffsetTableSize(parts[i]->header); Int64 pos = os->tellp(); if (pos == static_cast(-1)) IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); parts[i]->chunkOffsetTablePosition = os->tellp(); // // Fill in empty data for now. We'll write actual offsets during destruction. // for (int j = 0; j < chunkTableSize; j++) { Int64 empty = 0; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*os, empty); } } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfMultiPartOutputFile.h000066400000000000000000000111121406177042200224100ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // Portions (c) 2012 Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef MULTIPARTOUTPUTFILE_H_ #define MULTIPARTOUTPUTFILE_H_ #include "ImfHeader.h" #include "ImfGenericOutputFile.h" #include "ImfForward.h" #include "ImfThreading.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Class responsible for handling the writing of multipart images. // // Note: Certain attributes are 'common' to all parts. Notably: // * Display Window // * Pixel Aspect Ratio // * Time Code // * Chromaticities // The first header forms the basis for the set of attributes that are shared // across the constituent parts. // // Parameters // headers - pointer to array of headers; one for each part of the image file // parts - count of number of parts // overrideSharedAttributes - toggle for the handling of shared attributes. // set false to check for inconsistencies, true // to copy the values over from the first header. // numThreads - number of threads that should be used in encoding the data. // class MultiPartOutputFile : public GenericOutputFile { public: IMF_EXPORT MultiPartOutputFile(const char fileName[], const Header * headers, int parts, bool overrideSharedAttributes = false, int numThreads = globalThreadCount()); IMF_EXPORT MultiPartOutputFile(OStream & os, const Header * headers, int parts, bool overrideSharedAttributes = false, int numThreads = globalThreadCount()); // // return number of parts in file // IMF_EXPORT int parts() const; // // return header for part n // (note: may have additional attributes compared to that passed to constructor) // IMF_EXPORT const Header & header(int n) const; IMF_EXPORT ~MultiPartOutputFile(); MultiPartOutputFile(const MultiPartOutputFile& other) = delete; MultiPartOutputFile& operator = (const MultiPartOutputFile& other) = delete; MultiPartOutputFile(MultiPartOutputFile&& other) = delete; MultiPartOutputFile& operator = (MultiPartOutputFile&& other) = delete; struct Data; private: Data* _data; template T* getOutputPart(int partNumber); friend class OutputPart; friend class TiledOutputPart; friend class DeepScanLineOutputPart; friend class DeepTiledOutputPart; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* MULTIPARTOUTPUTFILE_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfMultiView.cpp000066400000000000000000000226451406177042200207430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Functions related to accessing channels // and views in multi-view OpenEXR files. // //----------------------------------------------------------------------------- #include using namespace std; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { StringVector parseString (string name, char c = '.') { // // Turn name into a list of strings, separating // on char 'c' with whitespace stripped. // StringVector r; while (name.size() > 0) { size_t s = name.find (c); string sec = name.substr (0, s); // // Strip spaces from beginning // while (sec.size() > 0 && sec[0] == ' ') sec.erase (0, 1); // // Strip spaces from end // while (sec.size() > 0 && sec[sec.size() - 1] == ' ') sec.erase (sec.size() - 1); r.push_back (sec); // // Strip off name including ending 'c' // if (s == name.npos) name = ""; else name = name.substr (s + 1); } return r; } int viewNum (const string &view, const StringVector &multiView) { // // returns which view number is called 'view' // returns -1 if no member of multiView is 'view' // (i.e. if viewNum() returns -1, 'view' isn't a view name // if viewNum() returns 0, 'view' is the default view // otherwise, it's some other (valid) view // for (size_t i = 0; i < multiView.size(); ++i) { if (multiView[i] == view) return i; } return -1; } } // namespace string defaultViewName (const StringVector &multiView) { if (multiView.size() > 0) return multiView[0]; else return ""; } string viewFromChannelName (const string &channel, const StringVector &multiView) { // // Given the name of a channel, return the name of the view to // which it belongs. // // // View name is penultimate section of name separated by periods ('.'s) // StringVector s = parseString (channel, '.'); if (s.size() == 0) return ""; // nothing in, nothing out if (s.size() == 1) { // // Return default view name. // The rules say ALL channels with no periods // in the name belong to the default view. // return multiView[0]; } else { // // size >= 2 - the last part is the channel name, // the next-to-last part is the view name. // Check if that part of the name really is // a valid view and, if it is, return it. // const string &viewName = s[s.size() - 2]; if (viewNum (viewName, multiView) >= 0) return viewName; else return ""; // not associated with any particular view } } ChannelList channelsInView (const string & viewName, const ChannelList & channelList, const StringVector & multiView) { // // Return a list of all channels belonging to view viewName. // ChannelList q; for (ChannelList::ConstIterator i = channelList.begin(); i != channelList.end(); ++i) { // // Get view name for this channel // string view = viewFromChannelName (i.name(), multiView); // // Insert channel into q if it's a member of view viewName // if (view == viewName) q.insert (i.name(), i.channel()); } return q; } ChannelList channelsInNoView (const ChannelList &channelList, const StringVector &multiView) { // // Return a list of channels not associated with any named view. // return channelsInView ("", channelList, multiView); } bool areCounterparts (const string &channel1, const string &channel2, const StringVector &multiView) { // // Given two channels, return true if they are the same // channel in two different views. // StringVector chan1 = parseString (channel1); size_t size1 = chan1.size(); // number of SECTIONS in string // name (not string length) StringVector chan2 = parseString (channel2); size_t size2 = chan2.size(); if (size1 == 0 || size2 == 0) return false; // // channel1 and channel2 can't be counterparts // if either channel is in no view. // if (size1 > 1 && viewNum (chan1[size1 - 2], multiView) == -1) return false; if (size2 > 1 && viewNum (chan2[size2 - 2], multiView) == -1) return false; if (viewFromChannelName (channel1, multiView) == viewFromChannelName (channel2, multiView)) { // // channel1 and channel2 are not counterparts // if they are in the same view. // return false; } if (size1 == 1) { // // channel1 is a default channel - the channels will only be // counterparts if channel2 is of the form . // return size2 == 2 && chan1[0] == chan2[1]; } if (size2 == 1) { // // channel2 is a default channel - the channels will only be // counterparts if channel1 is of the form . // return size1 == 2 && chan2[0] == chan1[1]; } // // Neither channel is a default channel. To be counterparts both // channel names must have the same number of components, and // all components except the penultimate one must be the same. // if (size1 != size2) return false; for(size_t i = 0; i < size1; ++i) { if (i != size1 - 2 && chan1[i] != chan2[i]) return false; } return true; } ChannelList channelInAllViews (const string &channelName, const ChannelList &channelList, const StringVector &multiView) { // // Given the name of a channel, return a // list of the same channel in all views. // ChannelList q; for (ChannelList::ConstIterator i=channelList.begin(); i != channelList.end(); ++i) { if (i.name() == channelName || areCounterparts (i.name(), channelName, multiView)) { q.insert (i.name(), i.channel()); } } return q; } string channelInOtherView (const string &channelName, const ChannelList &channelList, const StringVector &multiView, const string &otherViewName) { // // Given the name of a channel in one view, return the // corresponding channel name for view otherViewName. // for (ChannelList::ConstIterator i=channelList.begin(); i != channelList.end(); ++i) { if (viewFromChannelName (i.name(), multiView) == otherViewName && areCounterparts (i.name(), channelName, multiView)) { return i.name(); } } return ""; } string insertViewName (const string &channel, const StringVector &multiView, int i) { // // Insert multiView[i] into the channel name if appropriate. // StringVector s = parseString (channel, '.'); if (s.size() == 0) return ""; // nothing in, nothing out if (s.size() == 1 && i == 0) { // // Channel in the default view, with no periods in its name. // Do not insert view name. // return channel; } // // View name becomes penultimate section of new channel name. // string newName; for (size_t j = 0; j < s.size(); ++j) { if (j < s.size() - 1) newName += s[j] + "."; else newName += multiView[i] + "." + s[j]; } return newName; } string removeViewName(const string & channel,const string & view) { StringVector s = parseString (channel, '.'); if (s.size() == 0) return ""; // nothing in, nothing out if (s.size() == 1) { // // Channel in the default view, since no periods in its name. // No viewname to remove // return channel; } string newName; for( size_t j = 0 ; j < s.size() ; ++j) { // only add the penultimate string part // if it doesn't match the view name if(j+2!=s.size() || s[j]!=view) { newName += s[j]; if(j+1!=s.size()) { newName += "."; } } } return newName; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfMultiView.h000066400000000000000000000144501406177042200204030ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_MULTIVIEW_H #define INCLUDED_IMF_MULTIVIEW_H #include "ImfChannelList.h" #include "ImfStringVectorAttribute.h" #include "ImfExport.h" #include "ImfNamespace.h" //----------------------------------------------------------------------------- // // Functions related to accessing channels and views in multi-view // OpenEXR files. // // A multi-view image file contains two or more views of the same // scene, as seen from different viewpoints, for example, a left-eye // and a right-eye view for stereo displays. Each view has its own // set of image channels. A naming convention identifies the channels // that belong to a given view. // // A "multiView" attribute in the file header lists the names of the // views in an image (see ImfStandardAttributes.h), and channel names // of the form // // layer.view.channel // // allow channels to be matched with views. // // For compatibility with singe-view images, the first view listed in // the multiView attribute is the "default view", and channels that // have no periods in their names are considered part of the default // view. // // For example, if a file's multiView attribute lists the views // "left" and "right", in that order, then "left" is the default // view. Channels // // "R", "left.Z", "diffuse.left.R" // // are part of the "left" view; channels // // "right.R", "right.Z", "diffuse.right.R" // // are part of the "right" view; and channels // // "tmp.R", "right.diffuse.R", "diffuse.tmp.R" // // belong to no view at all. // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Return the name of the default view given a multi-view string vector, // that is, return the first element of the string vector. If the string // vector is empty, return "". // IMF_EXPORT std::string defaultViewName (const StringVector &multiView); // // Given the name of a channel, return the name of the view to // which it belongs. Returns the empty string ("") if the channel // is not a member of any named view. // IMF_EXPORT std::string viewFromChannelName (const std::string &channel, const StringVector &multiView); // // Return whether channel1 and channel2 are the same channel but // viewed in different views. (Return false if either channel // belongs to no view or if both channels belong to the same view.) // IMF_EXPORT bool areCounterparts (const std::string &channel1, const std::string &channel2, const StringVector &multiView); // // Return a list of all channels belonging to view viewName. // IMF_EXPORT ChannelList channelsInView (const std::string &viewName, const ChannelList &channelList, const StringVector &multiView); // // Return a list of channels not associated with any view. // IMF_EXPORT ChannelList channelsInNoView (const ChannelList &channelList, const StringVector &multiView); // // Given the name of a channel, return a list of the same channel // in all views (for example, given X.left.Y return X.left.Y, // X.right.Y, X.centre.Y, etc.). // IMF_EXPORT ChannelList channelInAllViews (const std::string &channame, const ChannelList &channelList, const StringVector &multiView); // // Given the name of a channel in one view, return the corresponding // channel name for view otherViewName. Return "" if no corresponding // channel exists in view otherViewName, or if view otherViewName doesn't // exist. // IMF_EXPORT std::string channelInOtherView (const std::string &channel, const ChannelList &channelList, const StringVector &multiView, const std::string &otherViewName); // // Given a channel name that does not include a view name, insert // multiView[i] into the channel name at the appropriate location. // If i is zero and the channel name contains no periods, then do // not insert the view name. // IMF_EXPORT std::string insertViewName (const std::string &channel, const StringVector &multiView, int i); // // Given a channel name that does may include a view name, return // string without the view name. If the string does not contain // the view name, return the string unaltered. // (Will only remove the viewname if it is in the correct position // in the string) // IMF_EXPORT std::string removeViewName (const std::string &channel, const std::string &view); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfName.h000066400000000000000000000072241406177042200173370ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_NAME_H #define INCLUDED_IMF_NAME_H //----------------------------------------------------------------------------- // // class ImfName -- a zero-terminated string // with a fixed, small maximum length // //----------------------------------------------------------------------------- #include #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Name { public: //------------- // Constructors //------------- IMF_EXPORT Name (); IMF_EXPORT Name (const char text[]); //-------------------- // Assignment operator //-------------------- IMF_EXPORT Name & operator = (const char text[]); //--------------------- // Access to the string //--------------------- inline const char * text () const {return _text;} inline const char * operator * () const {return _text;} //--------------- // Maximum length //--------------- static const int SIZE = 256; static const int MAX_LENGTH = SIZE - 1; private: char _text[SIZE]; }; IMF_EXPORT bool operator == (const Name &x, const Name &y); IMF_EXPORT bool operator != (const Name &x, const Name &y); IMF_EXPORT bool operator < (const Name &x, const Name &y); //----------------- // Inline functions //----------------- inline Name & Name::operator = (const char text[]) { strncpy (_text, text, MAX_LENGTH); return *this; } inline Name::Name () { _text[0] = 0; } inline Name::Name (const char text[]) { *this = text; _text [MAX_LENGTH] = 0; } inline bool operator == (const Name &x, const Name &y) { return strcmp (*x, *y) == 0; } inline bool operator != (const Name &x, const Name &y) { return !(x == y); } inline bool operator < (const Name &x, const Name &y) { return strcmp (*x, *y) < 0; } OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfNamespace.h000066400000000000000000000107261406177042200203540ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMFNAMESPACE_H #define INCLUDED_IMFNAMESPACE_H // // The purpose of this file is to have all of the Imath symbols defined within // the OPENEXR_IMF_INTERNAL_NAMESPACE namespace rather than the standard Imath // namespace. Those symbols are made available to client code through the // OPENEXR_IMF_NAMESPACE in addition to the OPENEXR_IMF_INTERNAL_NAMESPACE. // // To ensure source code compatibility, the OPENEXR_IMF_NAMESPACE defaults to // Imath and then "using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;" brings all // of the declarations from the OPENEXR_IMF_INTERNAL_NAMESPACE into the // OPENEXR_IMF_NAMESPACE. // This means that client code can continue to use syntax like // Imf::Header, but at link time it will resolve to a // mangled symbol based on the OPENEXR_IMF_INTERNAL_NAMESPACE. // // As an example, if one needed to build against a newer version of Imath and // have it run alongside an older version in the same application, it is now // possible to use an internal namespace to prevent collisions between the // older versions of Imath symbols and the newer ones. To do this, the // following could be defined at build time: // // OPENEXR_IMF_INTERNAL_NAMESPACE = Imf_v2 // // This means that declarations inside Imath headers look like this (after // the preprocessor has done its work): // // namespace Imf_v2 { // ... // class declarations // ... // } // // namespace Imf { // using namespace IMF_NAMESPACE_v2; // } // // // Open Source version of this file pulls in the OpenEXRConfig.h file // for the configure time options. // #include "OpenEXRConfig.h" #ifndef OPENEXR_IMF_NAMESPACE #define OPENEXR_IMF_NAMESPACE Imf #endif #ifndef OPENEXR_IMF_INTERNAL_NAMESPACE #define OPENEXR_IMF_INTERNAL_NAMESPACE OPENEXR_IMF_NAMESPACE #endif // // We need to be sure that we import the internal namespace into the public one. // To do this, we use the small bit of code below which initially defines // OPENEXR_IMF_INTERNAL_NAMESPACE (so it can be referenced) and then defines // OPENEXR_IMF_NAMESPACE and pulls the internal symbols into the public // namespace. // namespace OPENEXR_IMF_INTERNAL_NAMESPACE {} namespace OPENEXR_IMF_NAMESPACE { using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; } // // There are identical pairs of HEADER/SOURCE ENTER/EXIT macros so that // future extension to the namespace mechanism is possible without changing // project source code. // #define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER namespace OPENEXR_IMF_INTERNAL_NAMESPACE { #define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT } #define OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace OPENEXR_IMF_INTERNAL_NAMESPACE { #define OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT } #endif /* INCLUDED_IMFNAMESPACE_H */ openexr-2.5.7/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp000066400000000000000000000072151406177042200221300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class OpaqueAttribute // //----------------------------------------------------------------------------- #include #include "Iex.h" #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER OpaqueAttribute::OpaqueAttribute (const char typeName[]): _typeName (typeName), _dataSize (0) { } OpaqueAttribute::OpaqueAttribute (const OpaqueAttribute &other): _typeName (other._typeName), _dataSize (other._dataSize), _data (other._dataSize) { _data.resizeErase (other._dataSize); memcpy ((char *) _data, (const char *) other._data, other._dataSize); } OpaqueAttribute::~OpaqueAttribute () { // empty } const char * OpaqueAttribute::typeName () const { return _typeName.c_str(); } Attribute * OpaqueAttribute::copy () const { return new OpaqueAttribute (*this); } void OpaqueAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _data, _dataSize); } void OpaqueAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { _data.resizeErase (size); _dataSize = size; Xdr::read (is, _data, size); } void OpaqueAttribute::copyValueFrom (const Attribute &other) { const OpaqueAttribute *oa = dynamic_cast (&other); if (oa == 0 || _typeName != oa->_typeName) { THROW (IEX_NAMESPACE::TypeExc, "Cannot copy the value of an " "image file attribute of type " "\"" << other.typeName() << "\" " "to an attribute of type " "\"" << _typeName << "\"."); } _data.resizeErase (oa->_dataSize); _dataSize = oa->_dataSize; memcpy ((char *) _data, (const char *) oa->_data, oa->_dataSize); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfOpaqueAttribute.h000066400000000000000000000074561406177042200216040ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_OPAQUE_ATTRIBUTE_H #define INCLUDED_IMF_OPAQUE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class OpaqueAttribute // // When an image file is read, OpqaqueAttribute objects are used // to hold the values of attributes whose types are not recognized // by the reading program. OpaqueAttribute objects can be read // from an image file, copied, and written back to to another image // file, but their values are inaccessible. // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfArray.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class OpaqueAttribute: public Attribute { public: //---------------------------- // Constructors and destructor //---------------------------- IMF_EXPORT OpaqueAttribute (const char typeName[]); IMF_EXPORT OpaqueAttribute (const OpaqueAttribute &other); IMF_EXPORT virtual ~OpaqueAttribute (); //------------------------------- // Get this attribute's type name //------------------------------- IMF_EXPORT virtual const char * typeName () const; //------------------------------ // Make a copy of this attribute //------------------------------ IMF_EXPORT virtual Attribute * copy () const; //---------------- // I/O and copying //---------------- IMF_EXPORT virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const; IMF_EXPORT virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version); IMF_EXPORT virtual void copyValueFrom (const Attribute &other); int dataSize() const { return _dataSize; } const Array& data() const { return _data; } private: std::string _typeName; long _dataSize; Array _data; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfOptimizedPixelReading.h000066400000000000000000000603011406177042200227120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Autodesk, Inc. // // All rights reserved. // // Implementation of IIF-specific file format and speed optimizations // provided by Innobec Technologies inc on behalf of Autodesk. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #pragma once #ifndef INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H #define INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H #include "ImfSimd.h" #include "ImfSystemSpecific.h" #include #include "ImfChannelList.h" #include "ImfFrameBuffer.h" #include "ImfStringVectorAttribute.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class OptimizationMode { public: bool _optimizable; int _ySampling; OptimizationMode() : _optimizable(false) {} }; #ifdef IMF_HAVE_SSE2 //------------------------------------------------------------------------ // Test for SSE pointer alignemnt //------------------------------------------------------------------------ EXR_FORCEINLINE bool isPointerSSEAligned (const void* EXR_RESTRICT pPointer) { uintptr_t trailingBits = ((uintptr_t)pPointer) & 15; return trailingBits == 0; } //------------------------------------------------------------------------ // Load SSE from address into register //------------------------------------------------------------------------ template EXR_FORCEINLINE __m128i loadSSE (__m128i*& loadAddress) { // throw exception :: this is not accepted return _mm_loadu_si128 (loadAddress); } template<> EXR_FORCEINLINE __m128i loadSSE (__m128i*& loadAddress) { return _mm_loadu_si128 (loadAddress); } template<> EXR_FORCEINLINE __m128i loadSSE (__m128i*& loadAddress) { return _mm_load_si128 (loadAddress); } //------------------------------------------------------------------------ // Store SSE from register into address //------------------------------------------------------------------------ template EXR_FORCEINLINE void storeSSE (__m128i*& storeAddress, __m128i& dataToStore) { } template<> EXR_FORCEINLINE void storeSSE (__m128i*& storeAddress, __m128i& dataToStore) { _mm_storeu_si128 (storeAddress, dataToStore); } template<> EXR_FORCEINLINE void storeSSE (__m128i*& storeAddress, __m128i& dataToStore) { _mm_stream_si128 (storeAddress, dataToStore); } //------------------------------------------------------------------------ // // Write to RGBA // //------------------------------------------------------------------------ // // Using SSE intrinsics // template EXR_FORCEINLINE void writeToRGBASSETemplate (__m128i*& readPtrSSERed, __m128i*& readPtrSSEGreen, __m128i*& readPtrSSEBlue, __m128i*& readPtrSSEAlpha, __m128i*& writePtrSSE, const size_t& lPixelsToCopySSE) { for (size_t i = 0; i < lPixelsToCopySSE; ++i) { __m128i redRegister = loadSSE (readPtrSSERed); __m128i greenRegister = loadSSE (readPtrSSEGreen); __m128i blueRegister = loadSSE (readPtrSSEBlue); __m128i alphaRegister = loadSSE (readPtrSSEAlpha); __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, greenRegister); __m128i blueAlphaRegister = _mm_unpacklo_epi16 (blueRegister, alphaRegister); __m128i pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, blueAlphaRegister); __m128i pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, blueAlphaRegister); storeSSE (writePtrSSE, pixel12Register); ++writePtrSSE; storeSSE (writePtrSSE, pixel34Register); ++writePtrSSE; redGreenRegister = _mm_unpackhi_epi16 (redRegister, greenRegister); blueAlphaRegister = _mm_unpackhi_epi16 (blueRegister, alphaRegister); pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, blueAlphaRegister); pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, blueAlphaRegister); storeSSE (writePtrSSE, pixel12Register); ++writePtrSSE; storeSSE (writePtrSSE, pixel34Register); ++writePtrSSE; ++readPtrSSEAlpha; ++readPtrSSEBlue; ++readPtrSSEGreen; ++readPtrSSERed; } } // // Not using SSE intrinsics. This is still faster than the alternative // because we have multiple read pointers and therefore we are able to // take advantage of data locality for write operations. // EXR_FORCEINLINE void writeToRGBANormal (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, unsigned short*& readPtrAlpha, unsigned short*& writePtr, const size_t& lPixelsToCopy) { for (size_t i = 0; i < lPixelsToCopy; ++i) { *(writePtr++) = *(readPtrRed++); *(writePtr++) = *(readPtrGreen++); *(writePtr++) = *(readPtrBlue++); *(writePtr++) = *(readPtrAlpha++); } } // // Determine which (template) version to use by checking whether pointers // are aligned // EXR_FORCEINLINE void optimizedWriteToRGBA (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, unsigned short*& readPtrAlpha, unsigned short*& writePtr, const size_t& pixelsToCopySSE, const size_t& pixelsToCopyNormal) { bool readPtrAreAligned = true; readPtrAreAligned &= isPointerSSEAligned(readPtrRed); readPtrAreAligned &= isPointerSSEAligned(readPtrGreen); readPtrAreAligned &= isPointerSSEAligned(readPtrBlue); readPtrAreAligned &= isPointerSSEAligned(readPtrAlpha); bool writePtrIsAligned = isPointerSSEAligned(writePtr); if (!readPtrAreAligned && !writePtrIsAligned) { writeToRGBASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)readPtrAlpha, (__m128i*&)writePtr, pixelsToCopySSE); } else if (!readPtrAreAligned && writePtrIsAligned) { writeToRGBASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)readPtrAlpha, (__m128i*&)writePtr, pixelsToCopySSE); } else if (readPtrAreAligned && !writePtrIsAligned) { writeToRGBASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)readPtrAlpha, (__m128i*&)writePtr, pixelsToCopySSE); } else if(readPtrAreAligned && writePtrIsAligned) { writeToRGBASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)readPtrAlpha, (__m128i*&)writePtr, pixelsToCopySSE); } writeToRGBANormal (readPtrRed, readPtrGreen, readPtrBlue, readPtrAlpha, writePtr, pixelsToCopyNormal); } //------------------------------------------------------------------------ // // Write to RGBA Fill A // //------------------------------------------------------------------------ // // Using SSE intrinsics // template EXR_FORCEINLINE void writeToRGBAFillASSETemplate (__m128i*& readPtrSSERed, __m128i*& readPtrSSEGreen, __m128i*& readPtrSSEBlue, const unsigned short& alphaFillValue, __m128i*& writePtrSSE, const size_t& pixelsToCopySSE) { const __m128i dummyAlphaRegister = _mm_set_epi16 (alphaFillValue, alphaFillValue, alphaFillValue, alphaFillValue, alphaFillValue, alphaFillValue, alphaFillValue, alphaFillValue); for (size_t pixelCounter = 0; pixelCounter < pixelsToCopySSE; ++pixelCounter) { __m128i redRegister = loadSSE (readPtrSSERed); __m128i greenRegister = loadSSE (readPtrSSEGreen); __m128i blueRegister = loadSSE (readPtrSSEBlue); __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, greenRegister); __m128i blueAlphaRegister = _mm_unpacklo_epi16 (blueRegister, dummyAlphaRegister); __m128i pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, blueAlphaRegister); __m128i pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, blueAlphaRegister); storeSSE (writePtrSSE, pixel12Register); ++writePtrSSE; storeSSE (writePtrSSE, pixel34Register); ++writePtrSSE; redGreenRegister = _mm_unpackhi_epi16 (redRegister, greenRegister); blueAlphaRegister = _mm_unpackhi_epi16 (blueRegister, dummyAlphaRegister); pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, blueAlphaRegister); pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, blueAlphaRegister); storeSSE (writePtrSSE, pixel12Register); ++writePtrSSE; storeSSE (writePtrSSE, pixel34Register); ++writePtrSSE; ++readPtrSSEBlue; ++readPtrSSEGreen; ++readPtrSSERed; } } // // Not using SSE intrinsics. This is still faster than the alternative // because we have multiple read pointers and therefore we are able to // take advantage of data locality for write operations. // EXR_FORCEINLINE void writeToRGBAFillANormal (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, const unsigned short& alphaFillValue, unsigned short*& writePtr, const size_t& pixelsToCopy) { for (size_t i = 0; i < pixelsToCopy; ++i) { *(writePtr++) = *(readPtrRed++); *(writePtr++) = *(readPtrGreen++); *(writePtr++) = *(readPtrBlue++); *(writePtr++) = alphaFillValue; } } // // Determine which (template) version to use by checking whether pointers // are aligned. // EXR_FORCEINLINE void optimizedWriteToRGBAFillA (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, const unsigned short& alphaFillValue, unsigned short*& writePtr, const size_t& pixelsToCopySSE, const size_t& pixelsToCopyNormal) { bool readPtrAreAligned = true; readPtrAreAligned &= isPointerSSEAligned (readPtrRed); readPtrAreAligned &= isPointerSSEAligned (readPtrGreen); readPtrAreAligned &= isPointerSSEAligned (readPtrBlue); bool writePtrIsAligned = isPointerSSEAligned (writePtr); if (!readPtrAreAligned && !writePtrIsAligned) { writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, alphaFillValue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (!readPtrAreAligned && writePtrIsAligned) { writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, alphaFillValue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (readPtrAreAligned && !writePtrIsAligned) { writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, alphaFillValue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (readPtrAreAligned && writePtrIsAligned) { writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, alphaFillValue, (__m128i*&)writePtr, pixelsToCopySSE); } writeToRGBAFillANormal (readPtrRed, readPtrGreen, readPtrBlue, alphaFillValue, writePtr, pixelsToCopyNormal); } //------------------------------------------------------------------------ // // Write to RGB // //------------------------------------------------------------------------ // // Using SSE intrinsics // template EXR_FORCEINLINE void writeToRGBSSETemplate (__m128i*& readPtrSSERed, __m128i*& readPtrSSEGreen, __m128i*& readPtrSSEBlue, __m128i*& writePtrSSE, const size_t& pixelsToCopySSE) { for (size_t pixelCounter = 0; pixelCounter < pixelsToCopySSE; ++pixelCounter) { // // Need to shuffle and unpack pointers to obtain my first register // We must save 8 pixels at a time, so we must have the following three registers at the end: // 1) R1 G1 B1 R2 G2 B2 R3 G3 // 2) B3 R4 G4 B4 R5 G5 B5 R6 // 3) G6 B6 R7 G7 B7 R8 G8 B8 // __m128i redRegister = loadSSE (readPtrSSERed); __m128i greenRegister = loadSSE (readPtrSSEGreen); __m128i blueRegister = loadSSE (readPtrSSEBlue); // // First register: R1 G1 B1 R2 G2 B2 R3 G3 // Construct 2 registers and then unpack them to obtain our final result: // __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, greenRegister); __m128i redBlueRegister = _mm_unpacklo_epi16 (redRegister, blueRegister); __m128i greenBlueRegister = _mm_unpacklo_epi16 (greenRegister, blueRegister); // Left Part (R1 G1 B1 R2) __m128i quarterRight = _mm_shufflelo_epi16 (redBlueRegister, _MM_SHUFFLE(3,0,2,1)); __m128i halfLeft = _mm_unpacklo_epi32 (redGreenRegister, quarterRight); // Right Part (G2 B2 R3 G3) __m128i quarterLeft = _mm_shuffle_epi32 (greenBlueRegister, _MM_SHUFFLE(3,2,0,1)); quarterRight = _mm_shuffle_epi32 (redGreenRegister, _MM_SHUFFLE(3,0,1,2)); __m128i halfRight = _mm_unpacklo_epi32 (quarterLeft, quarterRight); __m128i fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); storeSSE (writePtrSSE, fullRegister); ++writePtrSSE; // // Second register: B3 R4 G4 B4 R5 G5 B5 R6 // // Left Part (B3, R4, G4, B4) quarterLeft = _mm_shufflehi_epi16 (redBlueRegister, _MM_SHUFFLE(0, 3, 2, 1)); quarterRight = _mm_shufflehi_epi16 (greenBlueRegister, _MM_SHUFFLE(1, 0, 3, 2)); halfLeft = _mm_unpackhi_epi32 (quarterLeft, quarterRight); // Update the registers redGreenRegister = _mm_unpackhi_epi16 (redRegister, greenRegister); redBlueRegister = _mm_unpackhi_epi16 (redRegister, blueRegister); greenBlueRegister = _mm_unpackhi_epi16 (greenRegister, blueRegister); // Right Part (R5 G5 B5 R6) quarterRight = _mm_shufflelo_epi16 (redBlueRegister, _MM_SHUFFLE(3,0,2,1)); halfRight = _mm_unpacklo_epi32 (redGreenRegister, quarterRight); fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); storeSSE (writePtrSSE, fullRegister); ++writePtrSSE; // // Third register: G6 B6 R7 G7 B7 R8 G8 B8 // // Left part (G6 B6 R7 G7) quarterLeft = _mm_shuffle_epi32 (greenBlueRegister, _MM_SHUFFLE(3,2,0,1)); quarterRight = _mm_shuffle_epi32 (redGreenRegister, _MM_SHUFFLE(3,0,1,2)); halfLeft = _mm_unpacklo_epi32 (quarterLeft, quarterRight); // Right part (B7 R8 G8 B8) quarterLeft = _mm_shufflehi_epi16 (redBlueRegister, _MM_SHUFFLE(0, 3, 2, 1)); quarterRight = _mm_shufflehi_epi16 (greenBlueRegister, _MM_SHUFFLE(1, 0, 3, 2)); halfRight = _mm_unpackhi_epi32 (quarterLeft, quarterRight); fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); storeSSE (writePtrSSE, fullRegister); ++writePtrSSE; // // Increment read pointers // ++readPtrSSEBlue; ++readPtrSSEGreen; ++readPtrSSERed; } } // // Not using SSE intrinsics. This is still faster than the alternative // because we have multiple read pointers and therefore we are able to // take advantage of data locality for write operations. // EXR_FORCEINLINE void writeToRGBNormal (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, unsigned short*& writePtr, const size_t& pixelsToCopy) { for (size_t i = 0; i < pixelsToCopy; ++i) { *(writePtr++) = *(readPtrRed++); *(writePtr++) = *(readPtrGreen++); *(writePtr++) = *(readPtrBlue++); } } // // Determine which (template) version to use by checking whether pointers // are aligned // EXR_FORCEINLINE void optimizedWriteToRGB (unsigned short*& readPtrRed, unsigned short*& readPtrGreen, unsigned short*& readPtrBlue, unsigned short*& writePtr, const size_t& pixelsToCopySSE, const size_t& pixelsToCopyNormal) { bool readPtrAreAligned = true; readPtrAreAligned &= isPointerSSEAligned(readPtrRed); readPtrAreAligned &= isPointerSSEAligned(readPtrGreen); readPtrAreAligned &= isPointerSSEAligned(readPtrBlue); bool writePtrIsAligned = isPointerSSEAligned(writePtr); if (!readPtrAreAligned && !writePtrIsAligned) { writeToRGBSSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (!readPtrAreAligned && writePtrIsAligned) { writeToRGBSSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (readPtrAreAligned && !writePtrIsAligned) { writeToRGBSSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)writePtr, pixelsToCopySSE); } else if (readPtrAreAligned && writePtrIsAligned) { writeToRGBSSETemplate ((__m128i*&)readPtrRed, (__m128i*&)readPtrGreen, (__m128i*&)readPtrBlue, (__m128i*&)writePtr, pixelsToCopySSE); } writeToRGBNormal (readPtrRed, readPtrGreen, readPtrBlue, writePtr, pixelsToCopyNormal); } #else // ! defined IMF_HAVE_SSE2 #endif // defined IMF_HAVE_SSE2 OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfOutputFile.cpp000066400000000000000000001161731406177042200211160ustar00rootroot00000000000000// ///\todo: version needs fixing! // /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class OutputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include "ImathBox.h" #include "ImathFun.h" #include #include "ImfXdr.h" #include #include #include "IlmThreadPool.h" #include "ImfOutputStreamMutex.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "Iex.h" #include "ImfInputPart.h" #include "ImfNamespace.h" #include "ImfOutputPartData.h" #include #include #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using std::string; using std::vector; using std::min; using std::max; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct OutSliceInfo { PixelType type; const char * base; size_t xStride; size_t yStride; int xSampling; int ySampling; bool zero; OutSliceInfo (PixelType type = HALF, const char *base = 0, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, bool zero = false); }; OutSliceInfo::OutSliceInfo (PixelType t, const char *b, size_t xs, size_t ys, int xsm, int ysm, bool z) : type (t), base (b), xStride (xs), yStride (ys), xSampling (xsm), ySampling (ysm), zero (z) { // empty } struct LineBuffer { Array buffer; const char * dataPtr; int dataSize; char * endOfLineBufferData; int minY; int maxY; int scanLineMin; int scanLineMax; Compressor * compressor; bool partiallyFull; // has incomplete data bool hasException; string exception; LineBuffer (Compressor *comp); ~LineBuffer (); void wait () {_sem.wait();} void post () {_sem.post();} private: Semaphore _sem; }; LineBuffer::LineBuffer (Compressor *comp) : dataPtr (0), dataSize (0), compressor (comp), partiallyFull (false), hasException (false), exception (), _sem (1) { // empty } LineBuffer::~LineBuffer () { delete compressor; } } // namespace struct OutputFile::Data { Header header; // the image header bool multiPart; // is the file multipart? int version; // version attribute \todo NOT BEING WRITTEN PROPERLY Int64 previewPosition; // file position for preview FrameBuffer frameBuffer; // framebuffer to write into int currentScanLine; // next scanline to be written int missingScanLines; // number of lines to write LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord vector lineOffsets; // stores offsets in file for // each scanline vector bytesPerLine; // combined size of a line over // all channels vector offsetInLineBuffer; // offset for each scanline in // its linebuffer Compressor::Format format; // compressor's data format vector slices; // info about channels in file Int64 lineOffsetsPosition; // file position for line // offset table vector lineBuffers; // each holds one line buffer int linesInBuffer; // number of scanlines each // buffer holds size_t lineBufferSize; // size of the line buffer int partNumber; // the output part number OutputStreamMutex * _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline LineBuffer * getLineBuffer (int number); // hash function from line // buffer indices into our // vector of line buffers }; OutputFile::Data::Data (int numThreads): lineOffsetsPosition (0), partNumber (-1), _streamData(0), _deleteStream(false) { // // We need at least one lineBuffer, but if threading is used, // to keep n threads busy we need 2*n lineBuffers. // lineBuffers.resize (max (1, 2 * numThreads)); } OutputFile::Data::~Data () { for (size_t i = 0; i < lineBuffers.size(); i++) delete lineBuffers[i]; } LineBuffer* OutputFile::Data::getLineBuffer (int number) { return lineBuffers[number % lineBuffers.size()]; } namespace { Int64 writeLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const vector &lineOffsets) { Int64 pos = os.tellp(); if (pos == static_cast(-1)) IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); for (unsigned int i = 0; i < lineOffsets.size(); i++) Xdr::write (os, lineOffsets[i]); return pos; } void writePixelData (OutputStreamMutex *filedata, OutputFile::Data *partdata, int lineBufferMinY, const char pixelData[], int pixelDataSize) { // // Store a block of pixel data in the output file, and try // to keep track of the current writing position the file // without calling tellp() (tellp() can be fairly expensive). // Int64 currentPosition = filedata->currentPosition; filedata->currentPosition = 0; if (currentPosition == 0) currentPosition = filedata->os->tellp(); partdata->lineOffsets[(partdata->currentScanLine - partdata->minY) / partdata->linesInBuffer] = currentPosition; #ifdef DEBUG assert (filedata->os->tellp() == currentPosition); #endif if (partdata->multiPart) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, partdata->partNumber); } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, lineBufferMinY); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, pixelDataSize); filedata->os->write (pixelData, pixelDataSize); filedata->currentPosition = currentPosition + Xdr::size() + Xdr::size() + pixelDataSize; if (partdata->multiPart) { filedata->currentPosition += Xdr::size(); } } inline void writePixelData (OutputStreamMutex* filedata, OutputFile::Data *partdata, const LineBuffer *lineBuffer) { writePixelData (filedata, partdata, lineBuffer->minY, lineBuffer->dataPtr, lineBuffer->dataSize); } void convertToXdr (OutputFile::Data *ofd, Array &lineBuffer, int lineBufferMinY, int lineBufferMaxY, int inSize) { // // Convert the contents of a lineBuffer from the machine's native // representation to Xdr format. This function is called by // CompressLineBuffer::execute(), below, if the compressor wanted // its input pixel data in the machine's native format, but then // failed to compress the data (most compressors will expand rather // than compress random input data). // // Note that this routine assumes that the machine's native // representation of the pixel data has the same size as the // Xdr representation. This makes it possible to convert the // pixel data in place, without an intermediate temporary buffer. // // // Iterate over all scanlines in the lineBuffer to convert. // char *writePtr = &lineBuffer[0]; for (int y = lineBufferMinY; y <= lineBufferMaxY; y++) { // // Set these to point to the start of line y. // We will write to writePtr from readPtr. // const char *readPtr = writePtr; // // Iterate over all slices in the file. // for (unsigned int i = 0; i < ofd->slices.size(); ++i) { // // Test if scan line y of this channel is // contains any data (the scan line contains // data only if y % ySampling == 0). // const OutSliceInfo &slice = ofd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Find the number of sampled pixels, dMaxX-dMinX+1, for // slice i in scan line y (i.e. pixels within the data window // for which x % xSampling == 0). // int dMinX = divp (ofd->minX, slice.xSampling); int dMaxX = divp (ofd->maxX, slice.xSampling); // // Convert the samples in place. // convertInPlace (writePtr, readPtr, slice.type, dMaxX - dMinX + 1); } } } // // A LineBufferTask encapsulates the task of copying a set of scanlines // from the user's frame buffer into a LineBuffer object, compressing // the data if necessary. // class LineBufferTask: public Task { public: LineBufferTask (TaskGroup *group, OutputFile::Data *ofd, int number, int scanLineMin, int scanLineMax); virtual ~LineBufferTask (); virtual void execute (); private: OutputFile::Data * _ofd; LineBuffer * _lineBuffer; }; LineBufferTask::LineBufferTask (TaskGroup *group, OutputFile::Data *ofd, int number, int scanLineMin, int scanLineMax) : Task (group), _ofd (ofd), _lineBuffer (_ofd->getLineBuffer(number)) { // // Wait for the lineBuffer to become available // _lineBuffer->wait (); // // Initialize the lineBuffer data if necessary // if (!_lineBuffer->partiallyFull) { _lineBuffer->endOfLineBufferData = _lineBuffer->buffer; _lineBuffer->minY = _ofd->minY + number * _ofd->linesInBuffer; _lineBuffer->maxY = min (_lineBuffer->minY + _ofd->linesInBuffer - 1, _ofd->maxY); _lineBuffer->partiallyFull = true; } _lineBuffer->scanLineMin = max (_lineBuffer->minY, scanLineMin); _lineBuffer->scanLineMax = min (_lineBuffer->maxY, scanLineMax); } LineBufferTask::~LineBufferTask () { // // Signal that the line buffer is now free // _lineBuffer->post (); } void LineBufferTask::execute () { try { // // First copy the pixel data from the // frame buffer into the line buffer // int yStart, yStop, dy; if (_ofd->lineOrder == INCREASING_Y) { yStart = _lineBuffer->scanLineMin; yStop = _lineBuffer->scanLineMax + 1; dy = 1; } else { yStart = _lineBuffer->scanLineMax; yStop = _lineBuffer->scanLineMin - 1; dy = -1; } int y; for (y = yStart; y != yStop; y += dy) { // // Gather one scan line's worth of pixel data and store // them in _ofd->lineBuffer. // char *writePtr = _lineBuffer->buffer + _ofd->offsetInLineBuffer[y - _ofd->minY]; // // Iterate over all image channels. // for (unsigned int i = 0; i < _ofd->slices.size(); ++i) { // // Test if scan line y of this channel contains any data // (the scan line contains data only if y % ySampling == 0). // const OutSliceInfo &slice = _ofd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Find the x coordinates of the leftmost and rightmost // sampled pixels (i.e. pixels within the data window // for which x % xSampling == 0). // int dMinX = divp (_ofd->minX, slice.xSampling); int dMaxX = divp (_ofd->maxX, slice.xSampling); // // Fill the line buffer with with pixel data. // if (slice.zero) { // // The frame buffer contains no data for this channel. // Store zeroes in _lineBuffer->buffer. // fillChannelWithZeroes (writePtr, _ofd->format, slice.type, dMaxX - dMinX + 1); } else { // // If necessary, convert the pixel data to Xdr format. // Then store the pixel data in _ofd->lineBuffer. // const char *linePtr = slice.base + divp (y, slice.ySampling) * slice.yStride; const char *readPtr = linePtr + dMinX * slice.xStride; const char *endPtr = linePtr + dMaxX * slice.xStride; copyFromFrameBuffer (writePtr, readPtr, endPtr, slice.xStride, _ofd->format, slice.type); } } if (_lineBuffer->endOfLineBufferData < writePtr) _lineBuffer->endOfLineBufferData = writePtr; #ifdef DEBUG assert (writePtr - (_lineBuffer->buffer + _ofd->offsetInLineBuffer[y - _ofd->minY]) == (int) _ofd->bytesPerLine[y - _ofd->minY]); #endif } // // If the next scanline isn't past the bounds of the lineBuffer // then we are done, otherwise compress the linebuffer // if (y >= _lineBuffer->minY && y <= _lineBuffer->maxY) return; _lineBuffer->dataPtr = _lineBuffer->buffer; _lineBuffer->dataSize = _lineBuffer->endOfLineBufferData - _lineBuffer->buffer; // // Compress the data // Compressor *compressor = _lineBuffer->compressor; if (compressor) { const char *compPtr; int compSize = compressor->compress (_lineBuffer->dataPtr, _lineBuffer->dataSize, _lineBuffer->minY, compPtr); if (compSize < _lineBuffer->dataSize) { _lineBuffer->dataSize = compSize; _lineBuffer->dataPtr = compPtr; } else if (_ofd->format == Compressor::NATIVE) { // // The data did not shrink during compression, but // we cannot write to the file using the machine's // native format, so we need to convert the lineBuffer // to Xdr. // convertToXdr (_ofd, _lineBuffer->buffer, _lineBuffer->minY, _lineBuffer->maxY, _lineBuffer->dataSize); } } _lineBuffer->partiallyFull = false; } catch (std::exception &e) { if (!_lineBuffer->hasException) { _lineBuffer->exception = e.what (); _lineBuffer->hasException = true; } } catch (...) { if (!_lineBuffer->hasException) { _lineBuffer->exception = "unrecognized exception"; _lineBuffer->hasException = true; } } } } // namespace OutputFile::OutputFile (const char fileName[], const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new OutputStreamMutex (); _data->_deleteStream=true; try { header.sanityCheck(); _data->_streamData->os = new StdOFStream (fileName); _data->multiPart=false; // only one header, not multipart initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os); _data->lineOffsetsPosition = writeLineOffsets (*_data->_streamData->os,_data->lineOffsets); } catch (IEX_NAMESPACE::BaseExc &e) { // ~OutputFile will not run, so free memory here if (_data) { if (_data->_streamData) { delete _data->_streamData->os; delete _data->_streamData; } delete _data; } REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { // ~OutputFile will not run, so free memory here if (_data) { if (_data->_streamData) { delete _data->_streamData->os; delete _data->_streamData; } delete _data; } throw; } } OutputFile::OutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads) : _data (new Data (numThreads)) { _data->_streamData=new OutputStreamMutex (); _data->_deleteStream=false; try { header.sanityCheck(); _data->_streamData->os = &os; _data->multiPart=false; initialize (header); _data->_streamData->currentPosition = _data->_streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_data->_streamData->os); _data->lineOffsetsPosition = writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); } catch (IEX_NAMESPACE::BaseExc &e) { // ~OutputFile will not run, so free memory here if (_data) { if (_data->_streamData) delete _data->_streamData; delete _data; } REPLACE_EXC (e, "Cannot open image file " "\"" << os.fileName() << "\". " << e.what()); throw; } catch (...) { // ~OutputFile will not run, so free memory here if (_data) { if (_data->_streamData) delete _data->_streamData; delete _data; } throw; } } OutputFile::OutputFile(const OutputPartData* part) : _data(NULL) { try { if (part->header.type() != SCANLINEIMAGE) throw IEX_NAMESPACE::ArgExc("Can't build a OutputFile from a type-mismatched part."); _data = new Data (part->numThreads); _data->_streamData = part->mutex; _data->_deleteStream=false; _data->multiPart=part->multipart; initialize (part->header); _data->partNumber = part->partNumber; _data->lineOffsetsPosition = part->chunkOffsetTablePosition; _data->previewPosition = part->previewPosition; } catch (IEX_NAMESPACE::BaseExc &e) { if (_data) delete _data; REPLACE_EXC (e, "Cannot initialize output part " "\"" << part->partNumber << "\". " << e.what()); throw; } catch (...) { if (_data) delete _data; throw; } } void OutputFile::initialize (const Header &header) { _data->header = header; // "fix" the type if it happens to be set incorrectly // (attribute is optional, but ensure it is correct if it exists) if(_data->header.hasType()) { _data->header.setType(SCANLINEIMAGE); } const Box2i &dataWindow = header.dataWindow(); _data->currentScanLine = (header.lineOrder() == INCREASING_Y)? dataWindow.min.y: dataWindow.max.y; _data->missingScanLines = dataWindow.max.y - dataWindow.min.y + 1; _data->lineOrder = header.lineOrder(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; size_t maxBytesPerLine = bytesPerLineTable (_data->header, _data->bytesPerLine); for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { _data->lineBuffers[i] = new LineBuffer (newCompressor (_data->header.compression(), maxBytesPerLine, _data->header)); } LineBuffer *lineBuffer = _data->lineBuffers[0]; _data->format = defaultFormat (lineBuffer->compressor); _data->linesInBuffer = numLinesInBuffer (lineBuffer->compressor); _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; for (size_t i = 0; i < _data->lineBuffers.size(); i++) _data->lineBuffers[i]->buffer.resizeErase(_data->lineBufferSize); int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + _data->linesInBuffer) / _data->linesInBuffer; _data->lineOffsets.resize (lineOffsetSize); offsetInLineBufferTable (_data->bytesPerLine, _data->linesInBuffer, _data->offsetInLineBuffer); } OutputFile::~OutputFile () { if (_data) { { Lock lock(*_data->_streamData); Int64 originalPosition = _data->_streamData->os->tellp(); if (_data->lineOffsetsPosition > 0) { try { _data->_streamData->os->seekp (_data->lineOffsetsPosition); writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); // // Restore the original position. // _data->_streamData->os->seekp (originalPosition); } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // We cannot safely throw any exceptions from here. // This destructor may have been called because the // stack is currently being unwound for another // exception. // } } } if (_data->_deleteStream && _data->_streamData) delete _data->_streamData->os; if (_data->partNumber == -1 && _data->_streamData) delete _data->_streamData; delete _data; } } const char * OutputFile::fileName () const { return _data->_streamData->os->fileName(); } const Header & OutputFile::header () const { return _data->header; } void OutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Check if the new frame buffer descriptor // is compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) continue; if (i.channel().type != j.slice().type) { THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" is " "not compatible with the frame buffer's " "pixel type."); } if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) { THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } } // // Initialize slice table for writePixels(). // vector slices; for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) { // // Channel i is not present in the frame buffer. // In the file, channel i will contain only zeroes. // slices.push_back (OutSliceInfo (i.channel().type, 0, // base 0, // xStride, 0, // yStride, i.channel().xSampling, i.channel().ySampling, true)); // zero } else { // // Channel i is present in the frame buffer. // slices.push_back (OutSliceInfo (j.slice().type, j.slice().base, j.slice().xStride, j.slice().yStride, j.slice().xSampling, j.slice().ySampling, false)); // zero } } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; _data->slices = slices; } const FrameBuffer & OutputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } void OutputFile::writePixels (int numScanLines) { try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data source."); // // Maintain two iterators: // nextWriteBuffer: next linebuffer to be written to the file // nextCompressBuffer: next linebuffer to compress // int first = (_data->currentScanLine - _data->minY) / _data->linesInBuffer; int nextWriteBuffer = first; int nextCompressBuffer; int stop; int step; int scanLineMin; int scanLineMax; { // // Create a task group for all line buffer tasks. When the // taskgroup goes out of scope, the destructor waits until // all tasks are complete. // TaskGroup taskGroup; // // Determine the range of lineBuffers that intersect the scan // line range. Then add the initial compression tasks to the // thread pool. We always add in at least one task but the // individual task might not do anything if numScanLines == 0. // if (_data->lineOrder == INCREASING_Y) { int last = (_data->currentScanLine + (numScanLines - 1) - _data->minY) / _data->linesInBuffer; scanLineMin = _data->currentScanLine; scanLineMax = _data->currentScanLine + numScanLines - 1; int numTasks = max (min ((int)_data->lineBuffers.size(), last - first + 1), 1); for (int i = 0; i < numTasks; i++) { ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, first + i, scanLineMin, scanLineMax)); } nextCompressBuffer = first + numTasks; stop = last + 1; step = 1; } else { int last = (_data->currentScanLine - (numScanLines - 1) - _data->minY) / _data->linesInBuffer; scanLineMax = _data->currentScanLine; scanLineMin = _data->currentScanLine - numScanLines + 1; int numTasks = max (min ((int)_data->lineBuffers.size(), first - last + 1), 1); for (int i = 0; i < numTasks; i++) { ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, first - i, scanLineMin, scanLineMax)); } nextCompressBuffer = first - numTasks; stop = last - 1; step = -1; } while (true) { if (_data->missingScanLines <= 0) { throw IEX_NAMESPACE::ArgExc ("Tried to write more scan lines " "than specified by the data window."); } // // Wait until the next line buffer is ready to be written // LineBuffer *writeBuffer = _data->getLineBuffer (nextWriteBuffer); writeBuffer->wait(); int numLines = writeBuffer->scanLineMax - writeBuffer->scanLineMin + 1; _data->missingScanLines -= numLines; // // If the line buffer is only partially full, then it is // not complete and we cannot write it to disk yet. // if (writeBuffer->partiallyFull) { _data->currentScanLine = _data->currentScanLine + step * numLines; writeBuffer->post(); return; } // // Write the line buffer // writePixelData (_data->_streamData, _data, writeBuffer); nextWriteBuffer += step; _data->currentScanLine = _data->currentScanLine + step * numLines; #ifdef DEBUG assert (_data->currentScanLine == ((_data->lineOrder == INCREASING_Y) ? writeBuffer->scanLineMax + 1: writeBuffer->scanLineMin - 1)); #endif // // Release the lock on the line buffer // writeBuffer->post(); // // If this was the last line buffer in the scanline range // if (nextWriteBuffer == stop) break; // // If there are no more line buffers to compress, // then only continue to write out remaining lineBuffers // if (nextCompressBuffer == stop) continue; // // Add nextCompressBuffer as a compression task // ThreadPool::addGlobalTask (new LineBufferTask (&taskGroup, _data, nextCompressBuffer, scanLineMin, scanLineMax)); // // Update the next line buffer we need to compress // nextCompressBuffer += step; } // // Finish all tasks // } // // Exeption handling: // // LineBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to OutputFile::writePixels(). // LineBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the line buffers. // Now we check if any line buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple line buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { LineBuffer *lineBuffer = _data->lineBuffers[i]; if (lineBuffer->hasException && !exception) exception = &lineBuffer->exception; lineBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Failed to write pixel data to image " "file \"" << fileName() << "\". " << e.what()); throw; } } int OutputFile::currentScanLine () const { Lock lock (*_data->_streamData); return _data->currentScanLine; } void OutputFile::copyPixels (InputFile &in) { Lock lock (*_data->_streamData); // // Check if this file's and and the InputFile's // headers are compatible. // const Header &hdr = _data->header; const Header &inHdr = in.header(); if (inHdr.find("tiles") != inHdr.end()) THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". " "The input file is tiled, but the output file is " "not. Try using TiledOutputFile::copyPixels " "instead."); if (!(hdr.dataWindow() == inHdr.dataWindow())) THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". " "The files have different data windows."); if (!(hdr.lineOrder() == inHdr.lineOrder())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different line orders."); if (!(hdr.compression() == inHdr.compression())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files use different compression methods."); if (!(hdr.channels() == inHdr.channels())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different channel lists."); // // Verify that no pixel data have been written to this file yet. // const Box2i &dataWindow = hdr.dataWindow(); if (_data->missingScanLines != dataWindow.max.y - dataWindow.min.y + 1) THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "\"" << fileName() << "\" already contains " "pixel data."); // // Copy the pixel data. // while (_data->missingScanLines > 0) { const char *pixelData; int pixelDataSize; in.rawPixelData (_data->currentScanLine, pixelData, pixelDataSize); writePixelData (_data->_streamData, _data, lineBufferMinY (_data->currentScanLine, _data->minY, _data->linesInBuffer), pixelData, pixelDataSize); _data->currentScanLine += (_data->lineOrder == INCREASING_Y)? _data->linesInBuffer: -_data->linesInBuffer; _data->missingScanLines -= _data->linesInBuffer; } } void OutputFile::copyPixels( InputPart & in) { copyPixels(*in.file); } void OutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { Lock lock (*_data->_streamData); if (_data->previewPosition <= 0) THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " "File \"" << fileName() << "\" does not " "contain a preview image."); // // Store the new pixels in the header's preview image attribute. // PreviewImageAttribute &pia = _data->header.typedAttribute ("preview"); PreviewImage &pi = pia.value(); PreviewRgba *pixels = pi.pixels(); int numPixels = pi.width() * pi.height(); for (int i = 0; i < numPixels; ++i) pixels[i] = newPixels[i]; // // Save the current file position, jump to the position in // the file where the preview image starts, store the new // preview image, and jump back to the saved file position. // Int64 savedPosition = _data->_streamData->os->tellp(); try { _data->_streamData->os->seekp (_data->previewPosition); pia.writeValueTo (*_data->_streamData->os, _data->version); _data->_streamData->os->seekp (savedPosition); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot update preview image pixels for " "file \"" << fileName() << "\". " << e.what()); throw; } } void OutputFile::breakScanLine (int y, int offset, int length, char c) { Lock lock (*_data->_streamData); Int64 position = _data->lineOffsets[(y - _data->minY) / _data->linesInBuffer]; if (!position) THROW (IEX_NAMESPACE::ArgExc, "Cannot overwrite scan line " << y << ". " "The scan line has not yet been stored in " "file \"" << fileName() << "\"."); _data->_streamData->currentPosition = 0; _data->_streamData->os->seekp (position + offset); for (int i = 0; i < length; ++i) _data->_streamData->os->write (&c, 1); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfOutputFile.h000066400000000000000000000236431406177042200205620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_OUTPUT_FILE_H #define INCLUDED_IMF_OUTPUT_FILE_H //----------------------------------------------------------------------------- // // class OutputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfThreading.h" #include "ImfGenericOutputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class OutputFile : public GenericOutputFile { public: //----------------------------------------------------------- // Constructor -- opens the file and writes the file header. // The file header is also copied into the OutputFile object, // and can later be accessed via the header() method. // Destroying this OutputFile object automatically closes // the file. // // numThreads determines the number of threads that will be // used to write the file (see ImfThreading.h). //----------------------------------------------------------- IMF_EXPORT OutputFile (const char fileName[], const Header &header, int numThreads = globalThreadCount()); //------------------------------------------------------------ // Constructor -- attaches the new OutputFile object to a file // that has already been opened, and writes the file header. // The file header is also copied into the OutputFile object, // and can later be accessed via the header() method. // Destroying this OutputFile object does not automatically // close the file. // // numThreads determines the number of threads that will be // used to write the file (see ImfThreading.h). //------------------------------------------------------------ IMF_EXPORT OutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads = globalThreadCount()); //------------------------------------------------- // Destructor // // Destroying the OutputFile object before writing // all scan lines within the data window results in // an incomplete file. //------------------------------------------------- IMF_EXPORT virtual ~OutputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the OutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writePixels() is // called. The current frame buffer can be changed // after each call to writePixels. //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const FrameBuffer & frameBuffer () const; //------------------------------------------------------------------- // Write pixel data: // // writePixels(n) retrieves the next n scan lines worth of data from // the current frame buffer, starting with the scan line indicated by // currentScanLine(), and stores the data in the output file, and // progressing in the direction indicated by header.lineOrder(). // // To produce a complete and correct file, exactly m scan lines must // be written, where m is equal to // header().dataWindow().max.y - header().dataWindow().min.y + 1. //------------------------------------------------------------------- IMF_EXPORT void writePixels (int numScanLines = 1); //------------------------------------------------------------------ // Access to the current scan line: // // currentScanLine() returns the y coordinate of the first scan line // that will be read from the current frame buffer during the next // call to writePixels(). // // If header.lineOrder() == INCREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().min.y. After writing each scan line, // the current scan line is incremented by 1. // // If header.lineOrder() == DECREASING_Y: // // The current scan line before the first call to writePixels() // is header().dataWindow().max.y. After writing each scan line, // the current scan line is decremented by 1. // //------------------------------------------------------------------ IMF_EXPORT int currentScanLine () const; //-------------------------------------------------------------- // Shortcut to copy all pixels from an InputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the InputFile's // header: The two header's "dataWindow", "compression", // "lineOrder" and "channels" attributes must be the same. //-------------------------------------------------------------- IMF_EXPORT void copyPixels (InputFile &in); //------------------------------------------------------------- // Shortcut to copy all pixels from an InputPart into this file // - equivalent to copyPixel(InputFile &in) but for multipart files //--------------------------------------------------------------- IMF_EXPORT void copyPixels (InputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few scan lines at a // time, while the image is being generated. Since the preview // image is an attribute in the file's header, it gets stored in // the file as soon as the file is opened, but we may not know // what the preview image should look like until we have written // the last scan line of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); //--------------------------------------------------------- // Break a scan line -- for testing and debugging only: // // breakScanLine(y,p,n,c) introduces an error into the // output file by writing n copies of character c, starting // p bytes from the beginning of the pixel data block that // contains scan line y. // // Warning: Calling this function usually results in a // broken image file. The file or parts of it may not // be readable, or the file may contain bad data. // //--------------------------------------------------------- IMF_EXPORT void breakScanLine (int y, int offset, int length, char c); struct Data; private: //------------------------------------------------------------ // Constructor -- attaches the OutputStreamMutex to the // given one from MultiPartOutputFile. Set the previewPosition // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. //------------------------------------------------------------ OutputFile (const OutputPartData* part); OutputFile (const OutputFile &) = delete; OutputFile & operator = (const OutputFile &) = delete; OutputFile (OutputFile &&) = delete; OutputFile & operator = (OutputFile &&) = delete; void initialize (const Header &header); Data * _data; friend class MultiPartOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfOutputPart.cpp000066400000000000000000000056551406177042200211470ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfOutputPart.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER OutputPart::OutputPart(MultiPartOutputFile& multiPartFile, int partNumber) { file = multiPartFile.getOutputPart(partNumber); } const char * OutputPart::fileName () const { return file->fileName(); } const Header & OutputPart::header () const { return file->header(); } void OutputPart::setFrameBuffer (const FrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const FrameBuffer & OutputPart::frameBuffer () const { return file->frameBuffer(); } void OutputPart::writePixels (int numScanLines) { file->writePixels(numScanLines); } int OutputPart::currentScanLine () const { return file->currentScanLine(); } void OutputPart::copyPixels (InputFile &in) { file->copyPixels(in); } void OutputPart::copyPixels (InputPart &in) { file->copyPixels(in); } void OutputPart::updatePreviewImage (const PreviewRgba newPixels[]) { file->updatePreviewImage(newPixels); } void OutputPart::breakScanLine (int y, int offset, int length, char c) { file->breakScanLine(y, offset, length, c); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfOutputPart.h000066400000000000000000000063561406177042200206130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFOUTPUTPART_H_ #define IMFOUTPUTPART_H_ #include "ImfMultiPartOutputFile.h" #include "ImfOutputFile.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //--------------------------------------------------------------------- // class OutputPart: // // Same interface as OutputFile. Please refer to OutputFile. //--------------------------------------------------------------------- class OutputPart { public: IMF_EXPORT OutputPart(MultiPartOutputFile& multiPartFile, int partNumber); IMF_EXPORT const char * fileName () const; IMF_EXPORT const Header & header () const; IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT void writePixels (int numScanLines = 1); IMF_EXPORT int currentScanLine () const; IMF_EXPORT void copyPixels (InputFile &in); IMF_EXPORT void copyPixels (InputPart &in); IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); IMF_EXPORT void breakScanLine (int y, int offset, int length, char c); private: OutputFile* file; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFOUTPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfOutputPartData.cpp000066400000000000000000000043031406177042200217260ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfOutputPartData.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER OutputPartData::OutputPartData(OutputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, bool multipart): header(header), numThreads(numThreads), partNumber(partNumber), multipart(multipart), mutex(mutex) { } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfOutputPartData.h000066400000000000000000000047541406177042200214050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFOUTPUTPARTDATA_H_ #define IMFOUTPUTPARTDATA_H_ #include "ImfHeader.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct OutputPartData { Header header; Int64 chunkOffsetTablePosition; Int64 previewPosition; int numThreads; int partNumber; bool multipart; OutputStreamMutex* mutex; IMF_EXPORT OutputPartData(OutputStreamMutex* mutex, const Header &header, int partNumber, int numThreads, bool multipart); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFOUTPUTPARTDATA_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfOutputStreamMutex.h000066400000000000000000000046271406177042200221620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFOUTPUTSTREAMMUTEX_H_ #define IMFOUTPUTSTREAMMUTEX_H_ #include #include "ImfIO.h" #include "IlmThreadMutex.h" #include "ImfGenericOutputFile.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER using ILMTHREAD_NAMESPACE::Mutex; // // Used to wrap OPENEXR_IMF_INTERNAL_NAMESPACE::OStream as a Mutex. // struct OutputStreamMutex : public Mutex { OPENEXR_IMF_INTERNAL_NAMESPACE::OStream* os; Int64 currentPosition; OutputStreamMutex() { os = 0; currentPosition = 0; } }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFOUTPUTSTREAMMUTEX_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfPartHelper.h000066400000000000000000000172411406177042200205250ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_PARTHELPER_H #define INCLUDED_IMF_PARTHELPER_H //----------------------------------------------------------------------------- // // Functions to help split channels into separate parts: provide a list of // channels, with desired views. call SplitChannels to assign a part to each // layer, or correct the name of the channel. // Also can enumerate the parts in a file and list which parts channels are in // // This is a good way to offer a 'create Multipart file' checkbox to the user in a // write dialog box: Populate a list of MultiViewChannelName objects, // call SplitChannels with whether single or multipart files are required. // Then write the number of parts it specifies, using internal_name for the channel // names in the ChannelList and FrameBuffer objects. There should be no need // for different codepaths for single part and multipart files // // Similarly, on reading a file as a MultiPartInputFile, use GetChannelsInMultiPartFile to // enumerate all channels in the file, using internal_name in FrameBuffer objects // to read the channel // // //----------------------------------------------------------------------------- #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfMultiPartInputFile.h" #include "ImfChannelList.h" #include "ImfStringVectorAttribute.h" #include "ImfStandardAttributes.h" #include "ImfMultiView.h" #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct MultiViewChannelName{ public: std::string name; ///< name of channel std::string view; ///< view for channel int part_number; ///< part number: updated by SplitChannels std::string internal_name;///< name used in headers: in singlepart mode, may contain viewname virtual ~MultiViewChannelName() {} //return layer for this channel, or "" if no layer std::string getLayer() const { std::size_t q=name.rfind('.'); if( q==name.npos ) { return ""; } return name.substr(0,q); } std::string getSuffix() const { std::size_t q=name.rfind('.'); if( q==name.npos ) { return name; } return name.substr(q+1); } }; // ///\brief assigns individual channels to different parts based on their layer and view name /// input is an array, list, vector etc of MultiViewChannelName objects /// on entry, each MultiViewChannelName name/view must be set (view can be empty if not multiview) /// /// if singlepart set, then on exit part_number will be zero, and internal_name will have view name inserted /// otherwise, each channel will be assigned to a different part based on its layer name and view name /// /// @param begin pointer to first MultiViewChannelName item /// @param end pointer to end of MultiViewChannelName item array /// @return total number of parts required // template int SplitChannels(const T & begin,const T & end,bool multipart=true,const std::string & heroView="") { if(!multipart) { for(T i=begin;i!=end;i++) { i->part_number=0; //does this have a view name set? if(i->view=="") { i->internal_name=i->name; }else{ std::string lname = i->getLayer(); // no layer, only non-hero views get view name in layer name if(lname=="") { if(i->view==heroView) { i->internal_name = i->name; }else{ i->internal_name = i->view+"."+i->name; } }else{ i->internal_name = lname+"."+i->view+"."+i->getSuffix(); } } } // single part created return 1; }else{ // step 1: extract individual layers and parts // for each layer, enumerate which views are active std::map< std::string , std::set< std::string > > viewsInLayers; for(T i=begin;i!=end;i++) { viewsInLayers[i->getLayer()].insert(i->view); } // step 2: assign a part number to each layer/view std::map< std::pair , int > layerToPart; int partCount=0; for(std::map< std::string , std::set< std::string > >::const_iterator layer=viewsInLayers.begin(); layer!=viewsInLayers.end();layer++) { // if this layer has a heroView, insert that first bool layer_has_hero = layer->second.find(heroView)!=layer->second.end(); if( layer_has_hero ) { layerToPart[ std::make_pair(layer->first,heroView) ] = partCount++; } // insert other layers which aren't the hero view for(std::set< std::string >::const_iterator view=layer->second.begin(); view!=layer->second.end();view++) { if(*view!=heroView) { layerToPart[ std::make_pair(layer->first,*view) ] = partCount++; } } } // step 3: update part number of each provided channel for( T i=begin;i!=end;i++) { i->internal_name=i->name; i->part_number = layerToPart[ std::make_pair(i->getLayer(),i->view) ]; } // return number of parts created return partCount; } } // // populate the chans vector with a list of channels in the file // and their corresponding part number // template void GetChannelsInMultiPartFile(const MultiPartInputFile & file,T & chans) { bool has_multiview=false; StringVector mview; if(file.parts()==1) { if(hasMultiView(file.header(0))) { mview=multiView(file.header(0)); has_multiview=true; } } for(int p=0;p #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using std::string; bool isImage(const string& name) { return (name == SCANLINEIMAGE || name == TILEDIMAGE); } bool isTiled(const string& name) { return (name == TILEDIMAGE || name == DEEPTILE); } bool isDeepData(const string& name) { return (name == DEEPTILE || name == DEEPSCANLINE); } bool isSupportedType(const string& name) { return (name == SCANLINEIMAGE || name == TILEDIMAGE || name == DEEPSCANLINE || name == DEEPTILE); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfPartType.h000066400000000000000000000046061406177042200202300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFPARTTYPE_H_ #define IMFPARTTYPE_H_ #include #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER const std::string SCANLINEIMAGE = "scanlineimage"; const std::string TILEDIMAGE = "tiledimage"; const std::string DEEPSCANLINE = "deepscanline"; const std::string DEEPTILE = "deeptile"; IMF_EXPORT bool isImage(const std::string& name); IMF_EXPORT bool isTiled(const std::string& name); IMF_EXPORT bool isDeepData(const std::string& name); IMF_EXPORT bool isSupportedType(const std::string& name); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFPARTTYPE_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfPixelType.h000066400000000000000000000045361406177042200204050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_PIXEL_TYPE_H #define INCLUDED_IMF_PIXEL_TYPE_H //----------------------------------------------------------------------------- // // enum PixelType // //----------------------------------------------------------------------------- #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum PixelType { UINT = 0, // unsigned int (32 bit) HALF = 1, // half (16 bit floating point) FLOAT = 2, // float (32 bit floating point) NUM_PIXELTYPES // number of different pixel types }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfPizCompressor.cpp000066400000000000000000000360731406177042200216350ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class PizCompressor // //----------------------------------------------------------------------------- #include "ImfPizCompressor.h" #include "ImfHeader.h" #include "ImfChannelList.h" #include "ImfHuf.h" #include "ImfWav.h" #include "ImfMisc.h" #include "ImfCheckedArithmetic.h" #include #include #include #include "ImfIO.h" #include "ImfXdr.h" #include "ImfAutoArray.h" #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using IEX_NAMESPACE::InputExc; namespace { // // Functions to compress the range of values in the pixel data // const int USHORT_RANGE = (1 << 16); const int BITMAP_SIZE = (USHORT_RANGE >> 3); void bitmapFromData (const unsigned short data[/*nData*/], int nData, unsigned char bitmap[BITMAP_SIZE], unsigned short &minNonZero, unsigned short &maxNonZero) { for (int i = 0; i < BITMAP_SIZE; ++i) bitmap[i] = 0; for (int i = 0; i < nData; ++i) bitmap[data[i] >> 3] |= (1 << (data[i] & 7)); bitmap[0] &= ~1; // zero is not explicitly stored in // the bitmap; we assume that the // data always contain zeroes minNonZero = BITMAP_SIZE - 1; maxNonZero = 0; for (int i = 0; i < BITMAP_SIZE; ++i) { if (bitmap[i]) { if (minNonZero > i) minNonZero = i; if (maxNonZero < i) maxNonZero = i; } } } unsigned short forwardLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) { int k = 0; for (int i = 0; i < USHORT_RANGE; ++i) { if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) lut[i] = k++; else lut[i] = 0; } return k - 1; // maximum value stored in lut[], } // i.e. number of ones in bitmap minus 1 unsigned short reverseLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) { int k = 0; for (int i = 0; i < USHORT_RANGE; ++i) { if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) lut[k++] = i; } int n = k - 1; while (k < USHORT_RANGE) lut[k++] = 0; return n; // maximum k where lut[k] is non-zero, } // i.e. number of ones in bitmap minus 1 void applyLut (const unsigned short lut[USHORT_RANGE], unsigned short data[/*nData*/], int nData) { for (int i = 0; i < nData; ++i) data[i] = lut[data[i]]; } } // namespace struct PizCompressor::ChannelData { unsigned short * start; unsigned short * end; int nx; int ny; int ys; int size; }; PizCompressor::PizCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines) : Compressor (hdr), _maxScanLineSize (maxScanLineSize), _format (XDR), _numScanLines (numScanLines), _tmpBuffer (0), _outBuffer (0), _numChans (0), _channels (hdr.channels()), _channelData (0) { // TODO: Remove this when we can change the ABI (void) _maxScanLineSize; size_t tmpBufferSize = uiMult (maxScanLineSize, numScanLines) / 2; size_t outBufferSize = uiAdd (uiMult (maxScanLineSize, numScanLines), size_t (65536 + 8192)); _tmpBuffer = new unsigned short [checkArraySize (tmpBufferSize, sizeof (unsigned short))]; _outBuffer = new char [outBufferSize]; const ChannelList &channels = header().channels(); bool onlyHalfChannels = true; for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c) { _numChans++; assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); if (c.channel().type != HALF) onlyHalfChannels = false; } _channelData = new ChannelData[_numChans]; const Box2i &dataWindow = hdr.dataWindow(); _minX = dataWindow.min.x; _maxX = dataWindow.max.x; _maxY = dataWindow.max.y; // // We can support uncompressed data in the machine's native format // if all image channels are of type HALF, and if the Xdr and the // native represenations of a half have the same size. // if (onlyHalfChannels && (sizeof (half) == pixelTypeSize (HALF))) _format = NATIVE; } PizCompressor::~PizCompressor () { delete [] _tmpBuffer; delete [] _outBuffer; delete [] _channelData; } int PizCompressor::numScanLines () const { return _numScanLines; } Compressor::Format PizCompressor::format () const { return _format; } int PizCompressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return compress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + numScanLines() - 1)), outPtr); } int PizCompressor::compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { return compress (inPtr, inSize, range, outPtr); } int PizCompressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return uncompress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + numScanLines() - 1)), outPtr); } int PizCompressor::uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { return uncompress (inPtr, inSize, range, outPtr); } int PizCompressor::compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { // // This is the compress function which is used by both the tiled and // scanline compression routines. // // // Special case �- empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Rearrange the pixel data so that the wavelet // and Huffman encoders can process them easily. // // The wavelet and Huffman encoders both handle only // 16-bit data, so 32-bit data must be split into smaller // pieces. We treat each 32-bit channel (UINT, FLOAT) as // two interleaved 16-bit channels. // int minX = range.min.x; int maxX = range.max.x; int minY = range.min.y; int maxY = range.max.y; if (maxY > _maxY) maxY = _maxY; if (maxX > _maxX) maxX = _maxX; unsigned short *tmpBufferEnd = _tmpBuffer; int i = 0; for (ChannelList::ConstIterator c = _channels.begin(); c != _channels.end(); ++c, ++i) { ChannelData &cd = _channelData[i]; cd.start = tmpBufferEnd; cd.end = cd.start; cd.nx = numSamples (c.channel().xSampling, minX, maxX); cd.ny = numSamples (c.channel().ySampling, minY, maxY); cd.ys = c.channel().ySampling; cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); tmpBufferEnd += cd.nx * cd.ny * cd.size; } if (_format == XDR) { // // Machine-independent (Xdr) data format // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; for (int x = cd.nx * cd.size; x > 0; --x) { Xdr::read (inPtr, *cd.end); ++cd.end; } } } } else { // // Native, machine-dependent data format // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; int n = cd.nx * cd.size; memcpy (cd.end, inPtr, n * sizeof (unsigned short)); inPtr += n * sizeof (unsigned short); cd.end += n; } } } #if defined (DEBUG) for (int i = 1; i < _numChans; ++i) assert (_channelData[i-1].end == _channelData[i].start); assert (_channelData[_numChans-1].end == tmpBufferEnd); #endif // // Compress the range of the pixel data // AutoArray bitmap; unsigned short minNonZero; unsigned short maxNonZero; bitmapFromData (_tmpBuffer, tmpBufferEnd - _tmpBuffer, bitmap, minNonZero, maxNonZero); AutoArray lut; unsigned short maxValue = forwardLutFromBitmap (bitmap, lut); applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); // // Store range compression info in _outBuffer // char *buf = _outBuffer; Xdr::write (buf, minNonZero); Xdr::write (buf, maxNonZero); if (minNonZero <= maxNonZero) { Xdr::write (buf, (char *) &bitmap[0] + minNonZero, maxNonZero - minNonZero + 1); } // // Apply wavelet encoding // for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; for (int j = 0; j < cd.size; ++j) { wav2Encode (cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size, maxValue); } } // // Apply Huffman encoding; append the result to _outBuffer // char *lengthPtr = buf; Xdr::write (buf, int(0)); int length = hufCompress (_tmpBuffer, tmpBufferEnd - _tmpBuffer, buf); Xdr::write (lengthPtr, length); outPtr = _outBuffer; return buf - _outBuffer + length; } int PizCompressor::uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr) { // // This is the cunompress function which is used by both the tiled and // scanline decompression routines. // const char* inputEnd=inPtr+inSize; // // Special case - empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Determine the layout of the compressed pixel data // int minX = range.min.x; int maxX = range.max.x; int minY = range.min.y; int maxY = range.max.y; if (maxY > _maxY) maxY = _maxY; if (maxX > _maxX) maxX = _maxX; unsigned short *tmpBufferEnd = _tmpBuffer; int i = 0; for (ChannelList::ConstIterator c = _channels.begin(); c != _channels.end(); ++c, ++i) { ChannelData &cd = _channelData[i]; cd.start = tmpBufferEnd; cd.end = cd.start; cd.nx = numSamples (c.channel().xSampling, minX, maxX); cd.ny = numSamples (c.channel().ySampling, minY, maxY); cd.ys = c.channel().ySampling; cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); tmpBufferEnd += cd.nx * cd.ny * cd.size; } // // Read range compression data // unsigned short minNonZero; unsigned short maxNonZero; AutoArray bitmap; memset (bitmap, 0, sizeof (unsigned char) * BITMAP_SIZE); if(inPtr + sizeof(unsigned short)*2 > inputEnd) { throw InputExc ("PIZ compressed data too short"); } Xdr::read (inPtr, minNonZero); Xdr::read (inPtr, maxNonZero); if (maxNonZero >= BITMAP_SIZE) { throw InputExc ("Error in header for PIZ-compressed data " "(invalid bitmap size)."); } if (minNonZero <= maxNonZero) { size_t bytesToRead = maxNonZero - minNonZero + 1; if(inPtr + bytesToRead > inputEnd) { throw InputExc ("PIZ compressed data too short"); } Xdr::read (inPtr, (char *) &bitmap[0] + minNonZero, bytesToRead); } AutoArray lut; unsigned short maxValue = reverseLutFromBitmap (bitmap, lut); // // Huffman decoding // if(inPtr + sizeof(int)> inputEnd) { throw InputExc ("PIZ compressed data too short"); } int length; Xdr::read (inPtr, length); if (inPtr + length > inputEnd || length<0 ) { throw InputExc ("Error in header for PIZ-compressed data " "(invalid array length)."); } hufUncompress (inPtr, length, _tmpBuffer, tmpBufferEnd - _tmpBuffer); // // Wavelet decoding // for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; for (int j = 0; j < cd.size; ++j) { wav2Decode (cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size, maxValue); } } // // Expand the pixel data to their original range // applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); // // Rearrange the pixel data into the format expected by the caller. // char *outEnd = _outBuffer; if (_format == XDR) { // // Machine-independent (Xdr) data format // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; for (int x = cd.nx * cd.size; x > 0; --x) { Xdr::write (outEnd, *cd.end); ++cd.end; } } } } else { // // Native, machine-dependent data format // for (int y = minY; y <= maxY; ++y) { for (int i = 0; i < _numChans; ++i) { ChannelData &cd = _channelData[i]; if (modp (y, cd.ys) != 0) continue; int n = cd.nx * cd.size; memcpy (outEnd, cd.end, n * sizeof (unsigned short)); outEnd += n * sizeof (unsigned short); cd.end += n; } } } #if defined (DEBUG) for (int i = 1; i < _numChans; ++i) assert (_channelData[i-1].end == _channelData[i].start); assert (_channelData[_numChans-1].end == tmpBufferEnd); #endif outPtr = _outBuffer; return outEnd - _outBuffer; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfPizCompressor.h000066400000000000000000000077541406177042200213060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_PIZ_COMPRESSOR_H #define INCLUDED_IMF_PIZ_COMPRESSOR_H //----------------------------------------------------------------------------- // // class PizCompressor -- uses Wavelet and Huffman encoding. // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class PizCompressor: public Compressor { public: IMF_EXPORT PizCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); IMF_EXPORT virtual ~PizCompressor (); PizCompressor (const PizCompressor& other) = delete; PizCompressor& operator = (const PizCompressor& other) = delete; PizCompressor (PizCompressor&& other) = delete; PizCompressor& operator = (PizCompressor&& other) = delete; IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual Format format () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); private: struct ChannelData; int compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int _maxScanLineSize; Format _format; int _numScanLines; unsigned short * _tmpBuffer; char * _outBuffer; int _numChans; const ChannelList & _channels; ChannelData * _channelData; int _minX; int _maxX; int _maxY; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfPreviewImage.cpp000066400000000000000000000064721406177042200214020ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class PreviewImage // //----------------------------------------------------------------------------- #include "ImfPreviewImage.h" #include "ImfCheckedArithmetic.h" #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER PreviewImage::PreviewImage (unsigned int width, unsigned int height, const PreviewRgba pixels[]) { _width = width; _height = height; _pixels = new PreviewRgba [checkArraySize (uiMult (_width, _height), sizeof (PreviewRgba))]; if (pixels) { for (unsigned int i = 0; i < _width * _height; ++i) _pixels[i] = pixels[i]; } else { for (unsigned int i = 0; i < _width * _height; ++i) _pixels[i] = PreviewRgba(); } } PreviewImage::PreviewImage (const PreviewImage &other): _width (other._width), _height (other._height), _pixels (new PreviewRgba [other._width * other._height]) { for (unsigned int i = 0; i < _width * _height; ++i) _pixels[i] = other._pixels[i]; } PreviewImage::~PreviewImage () { delete [] _pixels; } PreviewImage & PreviewImage::operator = (const PreviewImage &other) { if (this != &other) { delete [] _pixels; _width = other._width; _height = other._height; _pixels = new PreviewRgba [other._width * other._height]; for (unsigned int i = 0; i < _width * _height; ++i) _pixels[i] = other._pixels[i]; } return *this; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfPreviewImage.h000066400000000000000000000114041406177042200210360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_PREVIEW_IMAGE_H #define INCLUDED_IMF_PREVIEW_IMAGE_H #include "ImfNamespace.h" #include "ImfExport.h" //----------------------------------------------------------------------------- // // class PreviewImage -- a usually small, low-dynamic range image, // that is intended to be stored in an image file's header. // // struct PreviewRgba -- holds the value of a PreviewImage pixel. // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct PreviewRgba { unsigned char r; // Red, green and blue components of unsigned char g; // the pixel's color; intensity is unsigned char b; // proportional to pow (x/255, 2.2), // where x is r, g, or b. unsigned char a; // The pixel's alpha; 0 == transparent, // 255 == opaque. PreviewRgba (unsigned char r = 0, unsigned char g = 0, unsigned char b = 0, unsigned char a = 255) : r(r), g(g), b(b), a(a) {} }; class PreviewImage { public: //-------------------------------------------------------------------- // Constructor: // // PreviewImage(w,h,p) constructs a preview image with w by h pixels // whose initial values are specified in pixel array p. The x and y // coordinates of the pixels in p go from 0 to w-1, and from 0 to h-1. // The pixel with coordinates (x, y) is at address p + y*w + x. // Pixel (0, 0) is in the upper left corner of the preview image. // If p is zero, the pixels in the preview image are initialized with // (r = 0, b = 0, g = 0, a = 255). // //-------------------------------------------------------------------- IMF_EXPORT PreviewImage (unsigned int width = 0, unsigned int height = 0, const PreviewRgba pixels[] = 0); //----------------------------------------------------- // Copy constructor, destructor and assignment operator //----------------------------------------------------- IMF_EXPORT PreviewImage (const PreviewImage &other); IMF_EXPORT ~PreviewImage (); IMF_EXPORT PreviewImage & operator = (const PreviewImage &other); //----------------------------------------------- // Access to width, height and to the pixel array //----------------------------------------------- inline unsigned int width () const {return _width;} inline unsigned int height () const {return _height;} inline PreviewRgba * pixels () {return _pixels;} inline const PreviewRgba * pixels () const {return _pixels;} //---------------------------- // Access to individual pixels //---------------------------- inline PreviewRgba & pixel (unsigned int x, unsigned int y) {return _pixels[y * _width + x];} inline const PreviewRgba & pixel (unsigned int x, unsigned int y) const {return _pixels[y * _width + x];} private: unsigned int _width; unsigned int _height; PreviewRgba * _pixels; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp000066400000000000000000000074131406177042200232620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class PreviewImageAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * PreviewImageAttribute::staticTypeName () { return "preview"; } template <> void PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.width()); Xdr::write (os, _value.height()); int numPixels = _value.width() * _value.height(); const PreviewRgba *pixels = _value.pixels(); for (int i = 0; i < numPixels; ++i) { Xdr::write (os, pixels[i].r); Xdr::write (os, pixels[i].g); Xdr::write (os, pixels[i].b); Xdr::write (os, pixels[i].a); } } template <> void PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int width, height; Xdr::read (is, width); Xdr::read (is, height); if (width < 0 || height < 0) { throw IEX_NAMESPACE::InputExc("Invalid dimensions in Preview Image Attribute"); } // total attribute size should be four bytes per pixel + 8 bytes for width and height dimensions if (static_cast(width) * static_cast(height) * 4l + 8l != static_cast(size) ) { throw IEX_NAMESPACE::InputExc("Mismatch between Preview Image Attribute size and dimensions"); } PreviewImage p (width, height); int numPixels = p.width() * p.height(); PreviewRgba *pixels = p.pixels(); for (int i = 0; i < numPixels; ++i) { Xdr::read (is, pixels[i].r); Xdr::read (is, pixels[i].g); Xdr::read (is, pixels[i].b); Xdr::read (is, pixels[i].a); } _value = p; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfPreviewImageAttribute.h000066400000000000000000000052661406177042200227330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H #define INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class PreviewImageAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfPreviewImage.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute PreviewImageAttribute; template <> IMF_EXPORT const char *PreviewImageAttribute::staticTypeName (); template <> IMF_EXPORT void PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfPxr24Compressor.cpp000066400000000000000000000310151406177042200220010ustar00rootroot00000000000000///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Pixar Animation Studios // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Pixar Animation Studios 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 // OWNER 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. // ///////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Pxr24Compressor // // This compressor is based on source code that was contributed to // OpenEXR by Pixar Animation Studios. The compression method was // developed by Loren Carpenter. // // The compressor preprocesses the pixel data to reduce entropy, // and then calls zlib. // // Compression of HALF and UINT channels is lossless, but compressing // FLOAT channels is lossy: 32-bit floating-point numbers are converted // to 24 bits by rounding the significand to 15 bits. // // When the compressor is invoked, the caller has already arranged // the pixel data so that the values for each channel appear in a // contiguous block of memory. The compressor converts the pixel // values to unsigned integers: For UINT, this is a no-op. HALF // values are simply re-interpreted as 16-bit integers. FLOAT // values are converted to 24 bits, and the resulting bit patterns // are interpreted as integers. The compressor then replaces each // value with the difference between the value and its left neighbor. // This turns flat fields in the image into zeroes, and ramps into // strings of similar values. Next, each difference is split into // 2, 3 or 4 bytes, and the bytes are transposed so that all the // most significant bytes end up in a contiguous block, followed // by the second most significant bytes, and so on. The resulting // string of bytes is compressed with zlib. // //----------------------------------------------------------------------------- #include "ImfPxr24Compressor.h" #include "ImfHeader.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfCheckedArithmetic.h" #include "ImfNamespace.h" #include #include #include #include #include #include using namespace std; using namespace IMATH_NAMESPACE; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { // // Conversion from 32-bit to 24-bit floating-point numbers. // Conversion back to 32 bits is simply an 8-bit shift to the left. // inline unsigned int floatToFloat24 (float f) { union { float f; unsigned int i; } u; u.f = f; // // Disassemble the 32-bit floating point number, f, // into sign, s, exponent, e, and significand, m. // unsigned int s = u.i & 0x80000000; unsigned int e = u.i & 0x7f800000; unsigned int m = u.i & 0x007fffff; unsigned int i; if (e == 0x7f800000) { if (m) { // // F is a NAN; we preserve the sign bit and // the 15 leftmost bits of the significand, // with one exception: If the 15 leftmost // bits are all zero, the NAN would turn // into an infinity, so we have to set at // least one bit in the significand. // m >>= 8; i = (e >> 8) | m | (m == 0); } else { // // F is an infinity. // i = e >> 8; } } else { // // F is finite, round the significand to 15 bits. // i = ((e | m) + (m & 0x00000080)) >> 8; if (i >= 0x7f8000) { // // F was close to FLT_MAX, and the significand was // rounded up, resulting in an exponent overflow. // Avoid the overflow by truncating the significand // instead of rounding it. // i = (e | m) >> 8; } } return (s >> 8) | i; } void notEnoughData () { throw IEX_NAMESPACE::InputExc ("Error decompressing data " "(input data are shorter than expected)."); } void tooMuchData () { throw IEX_NAMESPACE::InputExc ("Error decompressing data " "(input data are longer than expected)."); } } // namespace Pxr24Compressor::Pxr24Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines) : Compressor (hdr), _maxScanLineSize (maxScanLineSize), _numScanLines (numScanLines), _tmpBuffer (0), _outBuffer (0), _channels (hdr.channels()) { size_t maxInBytes = uiMult (maxScanLineSize, numScanLines); size_t maxOutBytes = uiAdd (uiAdd (maxInBytes, size_t (ceil (maxInBytes * 0.01))), size_t (100)); _tmpBuffer = new unsigned char [maxInBytes]; _outBuffer = new char [maxOutBytes]; const Box2i &dataWindow = hdr.dataWindow(); _minX = dataWindow.min.x; _maxX = dataWindow.max.x; _maxY = dataWindow.max.y; } Pxr24Compressor::~Pxr24Compressor () { delete [] _tmpBuffer; delete [] _outBuffer; } int Pxr24Compressor::numScanLines () const { return _numScanLines; } Compressor::Format Pxr24Compressor::format () const { return NATIVE; } int Pxr24Compressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return compress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + _numScanLines - 1)), outPtr); } int Pxr24Compressor::compressTile (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { return compress (inPtr, inSize, range, outPtr); } int Pxr24Compressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { return uncompress (inPtr, inSize, Box2i (V2i (_minX, minY), V2i (_maxX, minY + _numScanLines - 1)), outPtr); } int Pxr24Compressor::uncompressTile (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { return uncompress (inPtr, inSize, range, outPtr); } int Pxr24Compressor::compress (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { if (inSize == 0) { outPtr = _outBuffer; return 0; } int minX = range.min.x; int maxX = min (range.max.x, _maxX); int minY = range.min.y; int maxY = min (range.max.y, _maxY); unsigned char *tmpBufferEnd = _tmpBuffer; for (int y = minY; y <= maxY; ++y) { for (ChannelList::ConstIterator i = _channels.begin(); i != _channels.end(); ++i) { const Channel &c = i.channel(); if (modp (y, c.ySampling) != 0) continue; int n = numSamples (c.xSampling, minX, maxX); unsigned char *ptr[4]; unsigned int previousPixel = 0; switch (c.type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; ptr[2] = ptr[1] + n; ptr[3] = ptr[2] + n; tmpBufferEnd = ptr[3] + n; for (int j = 0; j < n; ++j) { unsigned int pixel; char *pPtr = (char *) &pixel; for (size_t k = 0; k < sizeof (pixel); ++k) *pPtr++ = *inPtr++; unsigned int diff = pixel - previousPixel; previousPixel = pixel; *(ptr[0]++) = diff >> 24; *(ptr[1]++) = diff >> 16; *(ptr[2]++) = diff >> 8; *(ptr[3]++) = diff; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; tmpBufferEnd = ptr[1] + n; for (int j = 0; j < n; ++j) { half pixel; pixel = *(const half *) inPtr; inPtr += sizeof (half); unsigned int diff = pixel.bits() - previousPixel; previousPixel = pixel.bits(); *(ptr[0]++) = diff >> 8; *(ptr[1]++) = diff; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; ptr[2] = ptr[1] + n; tmpBufferEnd = ptr[2] + n; for (int j = 0; j < n; ++j) { float pixel; char *pPtr = (char *) &pixel; for (size_t k = 0; k < sizeof (pixel); ++k) *pPtr++ = *inPtr++; unsigned int pixel24 = floatToFloat24 (pixel); unsigned int diff = pixel24 - previousPixel; previousPixel = pixel24; *(ptr[0]++) = diff >> 16; *(ptr[1]++) = diff >> 8; *(ptr[2]++) = diff; } break; default: assert (false); } } } uLongf outSize = int (ceil ((tmpBufferEnd - _tmpBuffer) * 1.01)) + 100; if (Z_OK != ::compress ((Bytef *) _outBuffer, &outSize, (const Bytef *) _tmpBuffer, tmpBufferEnd - _tmpBuffer)) { throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed."); } outPtr = _outBuffer; return outSize; } int Pxr24Compressor::uncompress (const char *inPtr, int inSize, Box2i range, const char *&outPtr) { if (inSize == 0) { outPtr = _outBuffer; return 0; } uLongf tmpSize = _maxScanLineSize * _numScanLines; if (Z_OK != ::uncompress ((Bytef *)_tmpBuffer, &tmpSize, (const Bytef *) inPtr, inSize)) { throw IEX_NAMESPACE::InputExc ("Data decompression (zlib) failed."); } int minX = range.min.x; int maxX = min (range.max.x, _maxX); int minY = range.min.y; int maxY = min (range.max.y, _maxY); const unsigned char *tmpBufferEnd = _tmpBuffer; char *writePtr = _outBuffer; for (int y = minY; y <= maxY; ++y) { for (ChannelList::ConstIterator i = _channels.begin(); i != _channels.end(); ++i) { const Channel &c = i.channel(); if (modp (y, c.ySampling) != 0) continue; int n = numSamples (c.xSampling, minX, maxX); const unsigned char *ptr[4]; unsigned int pixel = 0; switch (c.type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; ptr[2] = ptr[1] + n; ptr[3] = ptr[2] + n; tmpBufferEnd = ptr[3] + n; if ( (uLongf)(tmpBufferEnd - _tmpBuffer) > tmpSize) notEnoughData(); for (int j = 0; j < n; ++j) { unsigned int diff = (*(ptr[0]++) << 24) | (*(ptr[1]++) << 16) | (*(ptr[2]++) << 8) | *(ptr[3]++); pixel += diff; char *pPtr = (char *) &pixel; for (size_t k = 0; k < sizeof (pixel); ++k) *writePtr++ = *pPtr++; } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; tmpBufferEnd = ptr[1] + n; if ( (uLongf)(tmpBufferEnd - _tmpBuffer) > tmpSize) notEnoughData(); for (int j = 0; j < n; ++j) { unsigned int diff = (*(ptr[0]++) << 8) | *(ptr[1]++); pixel += diff; half * hPtr = (half *) writePtr; hPtr->setBits ((unsigned short) pixel); writePtr += sizeof (half); } break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + n; ptr[2] = ptr[1] + n; tmpBufferEnd = ptr[2] + n; if ( (uLongf) (tmpBufferEnd - _tmpBuffer) > tmpSize) notEnoughData(); for (int j = 0; j < n; ++j) { unsigned int diff = (*(ptr[0]++) << 24) | (*(ptr[1]++) << 16) | (*(ptr[2]++) << 8); pixel += diff; char *pPtr = (char *) &pixel; for (size_t k = 0; k < sizeof (pixel); ++k) *writePtr++ = *pPtr++; } break; default: assert (false); } } } if ((uLongf) (tmpBufferEnd - _tmpBuffer) < tmpSize) tooMuchData(); outPtr = _outBuffer; return writePtr - _outBuffer; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfPxr24Compressor.h000066400000000000000000000076021406177042200214530ustar00rootroot00000000000000#ifndef INCLUDED_IMF_PXR24_COMPRESSOR_H #define INCLUDED_IMF_PXR24_COMPRESSOR_H ///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Pixar Animation Studios // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Pixar Animation Studios 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 // OWNER 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. // ///////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class Pxr24Compressor -- Loren Carpenter's 24-bit float compressor // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfNamespace.h" #include "ImfExport.h" #include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Pxr24Compressor: public Compressor { public: IMF_EXPORT Pxr24Compressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); IMF_EXPORT virtual ~Pxr24Compressor (); Pxr24Compressor (const Pxr24Compressor& other) = delete; Pxr24Compressor& operator = (const Pxr24Compressor& other) = delete; Pxr24Compressor (Pxr24Compressor&& other) = delete; Pxr24Compressor& operator = (Pxr24Compressor&& other) = delete; IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual Format format () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int compressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompressTile (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); private: int compress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int uncompress (const char *inPtr, int inSize, IMATH_NAMESPACE::Box2i range, const char *&outPtr); int _maxScanLineSize; int _numScanLines; unsigned char * _tmpBuffer; char * _outBuffer; const ChannelList & _channels; int _minX; int _maxX; int _maxY; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRational.cpp000066400000000000000000000062421406177042200205620ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Rational numbers // // The double-to-Rational conversion code below // was contributed to OpenEXR by Greg Ward. // //----------------------------------------------------------------------------- #include #include using namespace std; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { double frac (double x, double e) { return x - floor (x + e); } double square (double x) { return x * x; } double denom (double x, double e) { if (e > frac (x, e)) { return 1; } else { double r = frac (1 / x, e); if (e > r) { return floor (1 / x + e); } else { return denom (frac (1 / r, e), e / square (x * r)) + floor (1 / x + e) * denom (frac (1 / x, e), e / square (x)); } } } } // namespace Rational::Rational (double x) { int sign; if (x >= 0) { sign = 1; // positive } else if (x < 0) { sign = -1; // negative x = -x; } else { n = 0; // NaN d = 0; return; } if (x >= (1U << 31) - 0.5) { n = sign; // infinity d = 0; return; } double e = (x < 1? 1: x) / (1U << 30); d = (unsigned int) denom (x, e); n = sign * (int) floor (x * d + 0.5); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRational.h000066400000000000000000000062611406177042200202300ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RATIONAL_H #define INCLUDED_IMF_RATIONAL_H #include "ImfExport.h" #include "ImfNamespace.h" //----------------------------------------------------------------------------- // // Rational numbers // // A rational number is represented as pair of integers, n and d. // The value of of the rational number is // // n/d for d > 0 // positive infinity for n > 0, d == 0 // negative infinity for n < 0, d == 0 // not a number (NaN) for n == 0, d == 0 // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Rational { public: int n; // numerator unsigned int d; // denominator //---------------------------------------- // Default constructor, sets value to zero //---------------------------------------- Rational (): n (0), d (1) {} //------------------------------------- // Constructor, explicitly sets n and d //------------------------------------- Rational (int n, int d): n (n), d (d) {} //---------------------------- // Constructor, approximates x //---------------------------- IMF_EXPORT explicit Rational (double x); //--------------------------------- // Approximate conversion to double //--------------------------------- operator double () const {return double (n) / double (d);} }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRationalAttribute.cpp000066400000000000000000000051521406177042200224450ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class RationalAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * RationalAttribute::staticTypeName () { return "rational"; } template <> void RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.n); Xdr::write (os, _value.d); } template <> void RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.n); Xdr::read (is, _value.d); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRationalAttribute.h000066400000000000000000000052071406177042200221130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RATIONAL_ATTRIBUTE_H #define INCLUDED_IMF_RATIONAL_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class RationalAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfRational.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute RationalAttribute; template <> IMF_EXPORT const char *RationalAttribute::staticTypeName (); template <> IMF_EXPORT void RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRgba.h000066400000000000000000000056721406177042200173370ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RGBA_H #define INCLUDED_IMF_RGBA_H //----------------------------------------------------------------------------- // // class Rgba // //----------------------------------------------------------------------------- #include "half.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // RGBA pixel // struct Rgba { half r; half g; half b; half a; Rgba () {} Rgba (half r, half g, half b, half a = 1.f): r (r), g (g), b (b), a (a) {} }; // // Channels in an RGBA file // enum RgbaChannels { WRITE_R = 0x01, // Red WRITE_G = 0x02, // Green WRITE_B = 0x04, // Blue WRITE_A = 0x08, // Alpha WRITE_Y = 0x10, // Luminance, for black-and-white images, // or in combination with chroma WRITE_C = 0x20, // Chroma (two subsampled channels, RY and BY, // supported only for scanline-based files) WRITE_RGB = 0x07, // Red, green, blue WRITE_RGBA = 0x0f, // Red, green, blue, alpha WRITE_YC = 0x30, // Luminance, chroma WRITE_YA = 0x18, // Luminance, alpha WRITE_YCA = 0x38 // Luminance, chroma, alpha }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRgbaFile.cpp000066400000000000000000000763241406177042200204740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class RgbaOutputFile // class RgbaInputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace std; using namespace IMATH_NAMESPACE; using namespace RgbaYca; using namespace ILMTHREAD_NAMESPACE; namespace { void insertChannels (Header &header, RgbaChannels rgbaChannels) { ChannelList ch; if (rgbaChannels & (WRITE_Y | WRITE_C)) { if (rgbaChannels & WRITE_Y) { ch.insert ("Y", Channel (HALF, 1, 1)); } if (rgbaChannels & WRITE_C) { ch.insert ("RY", Channel (HALF, 2, 2, true)); ch.insert ("BY", Channel (HALF, 2, 2, true)); } } else { if (rgbaChannels & WRITE_R) ch.insert ("R", Channel (HALF, 1, 1)); if (rgbaChannels & WRITE_G) ch.insert ("G", Channel (HALF, 1, 1)); if (rgbaChannels & WRITE_B) ch.insert ("B", Channel (HALF, 1, 1)); } if (rgbaChannels & WRITE_A) ch.insert ("A", Channel (HALF, 1, 1)); header.channels() = ch; } RgbaChannels rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") { int i = 0; if (ch.findChannel (channelNamePrefix + "R")) i |= WRITE_R; if (ch.findChannel (channelNamePrefix + "G")) i |= WRITE_G; if (ch.findChannel (channelNamePrefix + "B")) i |= WRITE_B; if (ch.findChannel (channelNamePrefix + "A")) i |= WRITE_A; if (ch.findChannel (channelNamePrefix + "Y")) i |= WRITE_Y; if (ch.findChannel (channelNamePrefix + "RY") || ch.findChannel (channelNamePrefix + "BY")) i |= WRITE_C; return RgbaChannels (i); } string prefixFromLayerName (const string &layerName, const Header &header) { if (layerName.empty()) return ""; if (hasMultiView (header) && multiView(header)[0] == layerName) return ""; return layerName + "."; } V3f ywFromHeader (const Header &header) { Chromaticities cr; if (hasChromaticities (header)) cr = chromaticities (header); return computeYw (cr); } ptrdiff_t cachePadding (ptrdiff_t size) { // // Some of the buffers that are allocated by classes ToYca and // FromYca, below, may need to be padded to avoid cache thrashing. // If the difference between the buffer size and the nearest power // of two is less than CACHE_LINE_SIZE, then we add an appropriate // amount of padding. // // CACHE_LINE_SIZE must be a power of two, and it must be at // least as big as the true size of a cache line on the machine // we are running on. (It is ok if CACHE_LINE_SIZE is larger // than a real cache line.) // // CACHE_LINE_SIZE = (1 << LOG2_CACHE_LINE_SIZE) // static int LOG2_CACHE_LINE_SIZE = 8; size_t i = LOG2_CACHE_LINE_SIZE + 2; while ((size >> i) > 1) ++i; if (size > (1ll << (i + 1)) - 64ll) return 64ll + ((1ll << (i + 1ll)) - size); if (size < (1ll << i) + 64ll) return 64ll + ((1ll << i) - size); return 0; } } // namespace class RgbaOutputFile::ToYca: public Mutex { public: ToYca (OutputFile &outputFile, RgbaChannels rgbaChannels); ~ToYca (); ToYca (const ToYca& other) = delete; ToYca& operator = (const ToYca& other) = delete; ToYca (ToYca&& other) = delete; ToYca& operator = (ToYca&& other) = delete; void setYCRounding (unsigned int roundY, unsigned int roundC); void setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride); void writePixels (int numScanLines); int currentScanLine () const; private: void padTmpBuf (); void rotateBuffers (); void duplicateLastBuffer (); void duplicateSecondToLastBuffer (); void decimateChromaVertAndWriteScanLine (); OutputFile & _outputFile; bool _writeY; bool _writeC; bool _writeA; int _xMin; int _width; int _height; int _linesConverted; LineOrder _lineOrder; int _currentScanLine; V3f _yw; Rgba * _bufBase; Rgba * _buf[N]; Rgba * _tmpBuf; const Rgba * _fbBase; size_t _fbXStride; size_t _fbYStride; int _roundY; int _roundC; }; RgbaOutputFile::ToYca::ToYca (OutputFile &outputFile, RgbaChannels rgbaChannels) : _outputFile (outputFile) { _writeY = (rgbaChannels & WRITE_Y)? true: false; _writeC = (rgbaChannels & WRITE_C)? true: false; _writeA = (rgbaChannels & WRITE_A)? true: false; const Box2i dw = _outputFile.header().dataWindow(); _xMin = dw.min.x; _width = dw.max.x - dw.min.x + 1; _height = dw.max.y - dw.min.y + 1; _linesConverted = 0; _lineOrder = _outputFile.header().lineOrder(); if (_lineOrder == INCREASING_Y) _currentScanLine = dw.min.y; else _currentScanLine = dw.max.y; _yw = ywFromHeader (_outputFile.header()); ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); _bufBase = new Rgba[(_width + pad) * N]; for (int i = 0; i < N; ++i) _buf[i] = _bufBase + (i * (_width + pad)); _tmpBuf = new Rgba[_width + N - 1]; _fbBase = 0; _fbXStride = 0; _fbYStride = 0; _roundY = 7; _roundC = 5; } RgbaOutputFile::ToYca::~ToYca () { delete [] _bufBase; delete [] _tmpBuf; } void RgbaOutputFile::ToYca::setYCRounding (unsigned int roundY, unsigned int roundC) { _roundY = roundY; _roundC = roundC; } void RgbaOutputFile::ToYca::setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride) { if (_fbBase == 0) { FrameBuffer fb; if (_writeY) { fb.insert ("Y", Slice (HALF, // type (char *) &_tmpBuf[-_xMin].g, // base sizeof (Rgba), // xStride 0, // yStride 1, // xSampling 1)); // ySampling } if (_writeC) { fb.insert ("RY", Slice (HALF, // type (char *) &_tmpBuf[-_xMin].r, // base sizeof (Rgba) * 2, // xStride 0, // yStride 2, // xSampling 2)); // ySampling fb.insert ("BY", Slice (HALF, // type (char *) &_tmpBuf[-_xMin].b, // base sizeof (Rgba) * 2, // xStride 0, // yStride 2, // xSampling 2)); // ySampling } if (_writeA) { fb.insert ("A", Slice (HALF, // type (char *) &_tmpBuf[-_xMin].a, // base sizeof (Rgba), // xStride 0, // yStride 1, // xSampling 1)); // ySampling } _outputFile.setFrameBuffer (fb); } _fbBase = base; _fbXStride = xStride; _fbYStride = yStride; } void RgbaOutputFile::ToYca::writePixels (int numScanLines) { if (_fbBase == 0) { THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " "pixel data source for image file " "\"" << _outputFile.fileName() << "\"."); } if (_writeY && !_writeC) { // // We are writing only luminance; filtering // and subsampling are not necessary. // for (int i = 0; i < numScanLines; ++i) { // // Copy the next scan line from the caller's // frame buffer into _tmpBuf. // for (int j = 0; j < _width; ++j) { _tmpBuf[j] = _fbBase[_fbYStride * _currentScanLine + _fbXStride * (j + _xMin)]; } // // Convert the scan line from RGB to luminance/chroma, // and store the result in the output file. // RGBAtoYCA (_yw, _width, _writeA, _tmpBuf, _tmpBuf); _outputFile.writePixels (1); ++_linesConverted; if (_lineOrder == INCREASING_Y) ++_currentScanLine; else --_currentScanLine; } } else { // // We are writing chroma; the pixels must be filtered and subsampled. // for (int i = 0; i < numScanLines; ++i) { // // Copy the next scan line from the caller's // frame buffer into _tmpBuf. // for (int j = 0; j < _width; ++j) { _tmpBuf[j + N2] = _fbBase[_fbYStride * _currentScanLine + _fbXStride * (j + _xMin)]; } // // Convert the scan line from RGB to luminance/chroma. // RGBAtoYCA (_yw, _width, _writeA, _tmpBuf + N2, _tmpBuf + N2); // // Append N2 copies of the first and last pixel to the // beginning and end of the scan line. // padTmpBuf (); // // Filter and subsample the scan line's chroma channels // horizontally; store the result in _buf. // rotateBuffers(); decimateChromaHoriz (_width, _tmpBuf, _buf[N - 1]); // // If this is the first scan line in the image, // store N2 more copies of the scan line in _buf. // if (_linesConverted == 0) { for (int j = 0; j < N2; ++j) duplicateLastBuffer(); } ++_linesConverted; // // If we have have converted at least N2 scan lines from // RGBA to luminance/chroma, then we can start to filter // and subsample vertically, and store pixels in the // output file. // if (_linesConverted > N2) decimateChromaVertAndWriteScanLine(); // // If we have already converted the last scan line in // the image to luminance/chroma, filter, subsample and // store the remaining scan lines in _buf. // if (_linesConverted >= _height) { for (int j = 0; j < N2 - _height; ++j) duplicateLastBuffer(); duplicateSecondToLastBuffer(); ++_linesConverted; decimateChromaVertAndWriteScanLine(); for (int j = 1; j < min (_height, N2); ++j) { duplicateLastBuffer(); ++_linesConverted; decimateChromaVertAndWriteScanLine(); } } if (_lineOrder == INCREASING_Y) ++_currentScanLine; else --_currentScanLine; } } } int RgbaOutputFile::ToYca::currentScanLine () const { return _currentScanLine; } void RgbaOutputFile::ToYca::padTmpBuf () { for (int i = 0; i < N2; ++i) { _tmpBuf[i] = _tmpBuf[N2]; _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; } } void RgbaOutputFile::ToYca::rotateBuffers () { Rgba *tmp = _buf[0]; for (int i = 0; i < N - 1; ++i) _buf[i] = _buf[i + 1]; _buf[N - 1] = tmp; } void RgbaOutputFile::ToYca::duplicateLastBuffer () { rotateBuffers(); memcpy (_buf[N - 1], _buf[N - 2], _width * sizeof (Rgba)); } void RgbaOutputFile::ToYca::duplicateSecondToLastBuffer () { rotateBuffers(); memcpy (_buf[N - 1], _buf[N - 3], _width * sizeof (Rgba)); } void RgbaOutputFile::ToYca::decimateChromaVertAndWriteScanLine () { if (_linesConverted & 1) memcpy (_tmpBuf, _buf[N2], _width * sizeof (Rgba)); else decimateChromaVert (_width, _buf, _tmpBuf); if (_writeY && _writeC) roundYCA (_width, _roundY, _roundC, _tmpBuf, _tmpBuf); _outputFile.writePixels (1); } RgbaOutputFile::RgbaOutputFile (const char name[], const Header &header, RgbaChannels rgbaChannels, int numThreads): _outputFile (0), _toYca (0) { Header hd (header); insertChannels (hd, rgbaChannels); _outputFile = new OutputFile (name, hd, numThreads); if (rgbaChannels & (WRITE_Y | WRITE_C)) _toYca = new ToYca (*_outputFile, rgbaChannels); } RgbaOutputFile::RgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels, int numThreads): _outputFile (0), _toYca (0) { Header hd (header); insertChannels (hd, rgbaChannels); _outputFile = new OutputFile (os, hd, numThreads); if (rgbaChannels & (WRITE_Y | WRITE_C)) _toYca = new ToYca (*_outputFile, rgbaChannels); } RgbaOutputFile::RgbaOutputFile (const char name[], const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads): _outputFile (0), _toYca (0) { Header hd (displayWindow, dataWindow.isEmpty()? displayWindow: dataWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); insertChannels (hd, rgbaChannels); _outputFile = new OutputFile (name, hd, numThreads); if (rgbaChannels & (WRITE_Y | WRITE_C)) _toYca = new ToYca (*_outputFile, rgbaChannels); } RgbaOutputFile::RgbaOutputFile (const char name[], int width, int height, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads): _outputFile (0), _toYca (0) { Header hd (width, height, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); insertChannels (hd, rgbaChannels); _outputFile = new OutputFile (name, hd, numThreads); if (rgbaChannels & (WRITE_Y | WRITE_C)) _toYca = new ToYca (*_outputFile, rgbaChannels); } RgbaOutputFile::~RgbaOutputFile () { delete _toYca; delete _outputFile; } void RgbaOutputFile::setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride) { if (_toYca) { Lock lock (*_toYca); _toYca->setFrameBuffer (base, xStride, yStride); } else { size_t xs = xStride * sizeof (Rgba); size_t ys = yStride * sizeof (Rgba); FrameBuffer fb; fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); _outputFile->setFrameBuffer (fb); } } void RgbaOutputFile::writePixels (int numScanLines) { if (_toYca) { Lock lock (*_toYca); _toYca->writePixels (numScanLines); } else { _outputFile->writePixels (numScanLines); } } int RgbaOutputFile::currentScanLine () const { if (_toYca) { Lock lock (*_toYca); return _toYca->currentScanLine(); } else { return _outputFile->currentScanLine(); } } const Header & RgbaOutputFile::header () const { return _outputFile->header(); } const FrameBuffer & RgbaOutputFile::frameBuffer () const { return _outputFile->frameBuffer(); } const IMATH_NAMESPACE::Box2i & RgbaOutputFile::displayWindow () const { return _outputFile->header().displayWindow(); } const IMATH_NAMESPACE::Box2i & RgbaOutputFile::dataWindow () const { return _outputFile->header().dataWindow(); } float RgbaOutputFile::pixelAspectRatio () const { return _outputFile->header().pixelAspectRatio(); } const IMATH_NAMESPACE::V2f RgbaOutputFile::screenWindowCenter () const { return _outputFile->header().screenWindowCenter(); } float RgbaOutputFile::screenWindowWidth () const { return _outputFile->header().screenWindowWidth(); } LineOrder RgbaOutputFile::lineOrder () const { return _outputFile->header().lineOrder(); } Compression RgbaOutputFile::compression () const { return _outputFile->header().compression(); } RgbaChannels RgbaOutputFile::channels () const { return rgbaChannels (_outputFile->header().channels()); } void RgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { _outputFile->updatePreviewImage (newPixels); } void RgbaOutputFile::setYCRounding (unsigned int roundY, unsigned int roundC) { if (_toYca) { Lock lock (*_toYca); _toYca->setYCRounding (roundY, roundC); } } void RgbaOutputFile::breakScanLine (int y, int offset, int length, char c) { _outputFile->breakScanLine (y, offset, length, c); } class RgbaInputFile::FromYca: public Mutex { public: FromYca (InputFile &inputFile, RgbaChannels rgbaChannels); ~FromYca (); FromYca (const FromYca& other) = delete; FromYca& operator = (const FromYca& other) = delete; FromYca (FromYca&& other) = delete; FromYca& operator = (FromYca&& other) = delete; void setFrameBuffer (Rgba *base, size_t xStride, size_t yStride, const string &channelNamePrefix); void readPixels (int scanLine1, int scanLine2); private: void readPixels (int scanLine); void rotateBuf1 (int d); void rotateBuf2 (int d); void readYCAScanLine (int y, Rgba buf[]); void padTmpBuf (); InputFile & _inputFile; bool _readC; int _xMin; int _yMin; int _yMax; int _width; int _height; int _currentScanLine; LineOrder _lineOrder; V3f _yw; Rgba * _bufBase; Rgba * _buf1[N + 2]; Rgba * _buf2[3]; Rgba * _tmpBuf; Rgba * _fbBase; size_t _fbXStride; size_t _fbYStride; }; RgbaInputFile::FromYca::FromYca (InputFile &inputFile, RgbaChannels rgbaChannels) : _inputFile (inputFile) { _readC = (rgbaChannels & WRITE_C)? true: false; const Box2i dw = _inputFile.header().dataWindow(); _xMin = dw.min.x; _yMin = dw.min.y; _yMax = dw.max.y; _width = dw.max.x - dw.min.x + 1; _height = dw.max.y - dw.min.y + 1; _currentScanLine = dw.min.y - N - 2; _lineOrder = _inputFile.header().lineOrder(); _yw = ywFromHeader (_inputFile.header()); ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); _bufBase = new Rgba[(_width + pad) * (N + 2 + 3)]; for (int i = 0; i < N + 2; ++i) _buf1[i] = _bufBase + (i * (_width + pad)); for (int i = 0; i < 3; ++i) _buf2[i] = _bufBase + ((i + N + 2) * (_width + pad)); _tmpBuf = new Rgba[_width + N - 1]; _fbBase = 0; _fbXStride = 0; _fbYStride = 0; } RgbaInputFile::FromYca::~FromYca () { delete [] _bufBase; delete [] _tmpBuf; } void RgbaInputFile::FromYca::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride, const string &channelNamePrefix) { if (_fbBase == 0) { FrameBuffer fb; fb.insert (channelNamePrefix + "Y", Slice (HALF, // type (char *) &_tmpBuf[N2 - _xMin].g, // base sizeof (Rgba), // xStride 0, // yStride 1, // xSampling 1, // ySampling 0.5)); // fillValue if (_readC) { fb.insert (channelNamePrefix + "RY", Slice (HALF, // type (char *) &_tmpBuf[N2 - _xMin].r, // base sizeof (Rgba) * 2, // xStride 0, // yStride 2, // xSampling 2, // ySampling 0.0)); // fillValue fb.insert (channelNamePrefix + "BY", Slice (HALF, // type (char *) &_tmpBuf[N2 - _xMin].b, // base sizeof (Rgba) * 2, // xStride 0, // yStride 2, // xSampling 2, // ySampling 0.0)); // fillValue } fb.insert (channelNamePrefix + "A", Slice (HALF, // type (char *) &_tmpBuf[N2 - _xMin].a, // base sizeof (Rgba), // xStride 0, // yStride 1, // xSampling 1, // ySampling 1.0)); // fillValue _inputFile.setFrameBuffer (fb); } _fbBase = base; _fbXStride = xStride; _fbYStride = yStride; } void RgbaInputFile::FromYca::readPixels (int scanLine1, int scanLine2) { int minY = min (scanLine1, scanLine2); int maxY = max (scanLine1, scanLine2); if (_lineOrder == INCREASING_Y) { for (int y = minY; y <= maxY; ++y) readPixels (y); } else { for (int y = maxY; y >= minY; --y) readPixels (y); } } void RgbaInputFile::FromYca::readPixels (int scanLine) { if (_fbBase == 0) { THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " "pixel data destination for image file " "\"" << _inputFile.fileName() << "\"."); } // // In order to convert one scan line to RGB format, we need that // scan line plus N2+1 extra scan lines above and N2+1 scan lines // below in luminance/chroma format. // // We allow random access to scan lines, but we buffer partially // processed luminance/chroma data in order to make reading pixels // in increasing y or decreasing y order reasonably efficient: // // _currentScanLine holds the y coordinate of the scan line // that was most recently read. // // _buf1 contains scan lines _currentScanLine-N2-1 // through _currentScanLine+N2+1 in // luminance/chroma format. Odd-numbered // lines contain no chroma data. Even-numbered // lines have valid chroma data for all pixels. // // _buf2 contains scan lines _currentScanLine-1 // through _currentScanLine+1, in RGB format. // Super-saturated pixels (see ImfRgbaYca.h) // have not yet been eliminated. // // If the scan line we are trying to read now is close enough to // _currentScanLine, we don't have to recompute the contents of _buf1 // and _buf2 from scratch. We can rotate _buf1 and _buf2, and fill // in the missing data. // int dy = scanLine - _currentScanLine; if (abs (dy) < N + 2) rotateBuf1 (dy); if (abs (dy) < 3) rotateBuf2 (dy); if (dy < 0) { { int n = min (-dy, N + 2); int yMin = scanLine - N2 - 1; for (int i = n - 1; i >= 0; --i) readYCAScanLine (yMin + i, _buf1[i]); } { int n = min (-dy, 3); for (int i = 0; i < n; ++i) { if ((scanLine + i) & 1) { YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); } else { reconstructChromaVert (_width, _buf1 + i, _buf2[i]); YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); } } } } else { { int n = min (dy, N + 2); int yMax = scanLine + N2 + 1; for (int i = n - 1; i >= 0; --i) readYCAScanLine (yMax - i, _buf1[N + 1 - i]); } { int n = min (dy, 3); for (int i = 2; i > 2 - n; --i) { if ((scanLine + i) & 1) { YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); } else { reconstructChromaVert (_width, _buf1 + i, _buf2[i]); YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); } } } } fixSaturation (_yw, _width, _buf2, _tmpBuf); for (int i = 0; i < _width; ++i) _fbBase[_fbYStride * scanLine + _fbXStride * (i + _xMin)] = _tmpBuf[i]; _currentScanLine = scanLine; } void RgbaInputFile::FromYca::rotateBuf1 (int d) { d = modp (d, N + 2); Rgba *tmp[N + 2]; for (int i = 0; i < N + 2; ++i) tmp[i] = _buf1[i]; for (int i = 0; i < N + 2; ++i) _buf1[i] = tmp[(i + d) % (N + 2)]; } void RgbaInputFile::FromYca::rotateBuf2 (int d) { d = modp (d, 3); Rgba *tmp[3]; for (int i = 0; i < 3; ++i) tmp[i] = _buf2[i]; for (int i = 0; i < 3; ++i) _buf2[i] = tmp[(i + d) % 3]; } void RgbaInputFile::FromYca::readYCAScanLine (int y, Rgba *buf) { // // Clamp y. // if (y < _yMin) y = _yMin; else if (y > _yMax) y = _yMax - 1; // // Read scan line y into _tmpBuf. // _inputFile.readPixels (y); // // Reconstruct missing chroma samples and copy // the scan line into buf. // if (!_readC) { for (int i = 0; i < _width; ++i) { _tmpBuf[i + N2].r = 0; _tmpBuf[i + N2].b = 0; } } if (y & 1) { memcpy (buf, _tmpBuf + N2, _width * sizeof (Rgba)); } else { padTmpBuf(); reconstructChromaHoriz (_width, _tmpBuf, buf); } } void RgbaInputFile::FromYca::padTmpBuf () { for (int i = 0; i < N2; ++i) { _tmpBuf[i] = _tmpBuf[N2]; _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; } } RgbaInputFile::RgbaInputFile (const char name[], int numThreads): _inputFile (new InputFile (name, numThreads)), _fromYca (0), _channelNamePrefix ("") { RgbaChannels rgbaChannels = channels(); if (rgbaChannels & WRITE_C) _fromYca = new FromYca (*_inputFile, rgbaChannels); } RgbaInputFile::RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _inputFile (new InputFile (is, numThreads)), _fromYca (0), _channelNamePrefix ("") { RgbaChannels rgbaChannels = channels(); if (rgbaChannels & WRITE_C) _fromYca = new FromYca (*_inputFile, rgbaChannels); } RgbaInputFile::RgbaInputFile (const char name[], const string &layerName, int numThreads) : _inputFile (new InputFile (name, numThreads)), _fromYca (0), _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) { RgbaChannels rgbaChannels = channels(); if (rgbaChannels & WRITE_C) _fromYca = new FromYca (*_inputFile, rgbaChannels); } RgbaInputFile::RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, const string &layerName, int numThreads) : _inputFile (new InputFile (is, numThreads)), _fromYca (0), _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) { RgbaChannels rgbaChannels = channels(); if (rgbaChannels & WRITE_C) _fromYca = new FromYca (*_inputFile, rgbaChannels); } RgbaInputFile::~RgbaInputFile () { delete _inputFile; delete _fromYca; } void RgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) { if (_fromYca) { Lock lock (*_fromYca); _fromYca->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); } else { size_t xs = xStride * sizeof (Rgba); size_t ys = yStride * sizeof (Rgba); FrameBuffer fb; if( channels() & WRITE_Y ) { fb.insert (_channelNamePrefix + "Y", Slice (HALF, (char *) &base[0].r, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue } else { fb.insert (_channelNamePrefix + "R", Slice (HALF, (char *) &base[0].r, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue fb.insert (_channelNamePrefix + "G", Slice (HALF, (char *) &base[0].g, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue fb.insert (_channelNamePrefix + "B", Slice (HALF, (char *) &base[0].b, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue } fb.insert (_channelNamePrefix + "A", Slice (HALF, (char *) &base[0].a, xs, ys, 1, 1, // xSampling, ySampling 1.0)); // fillValue _inputFile->setFrameBuffer (fb); } } void RgbaInputFile::setLayerName (const string &layerName) { delete _fromYca; _fromYca = 0; _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); RgbaChannels rgbaChannels = channels(); if (rgbaChannels & WRITE_C) _fromYca = new FromYca (*_inputFile, rgbaChannels); FrameBuffer fb; _inputFile->setFrameBuffer (fb); } void RgbaInputFile::readPixels (int scanLine1, int scanLine2) { if (_fromYca) { Lock lock (*_fromYca); _fromYca->readPixels (scanLine1, scanLine2); } else { _inputFile->readPixels (scanLine1, scanLine2); if (channels() & WRITE_Y) { // // Luma channel has been written into red channel // Duplicate into green and blue channel to create gray image // const Slice* s = _inputFile->frameBuffer().findSlice(_channelNamePrefix + "Y"); Box2i dataWindow = _inputFile->header().dataWindow(); for( int scanLine = scanLine1 ; scanLine <= scanLine2 ; scanLine++ ) { char* rowBase = s->base + scanLine*s->yStride; for(int x = dataWindow.min.x ; x <= dataWindow.max.x ; ++x ) { Rgba* pixel = reinterpret_cast(rowBase+x*s->xStride); pixel->g = pixel->r; pixel->b = pixel->r; } } } } } void RgbaInputFile::readPixels (int scanLine) { readPixels (scanLine, scanLine); } bool RgbaInputFile::isComplete () const { return _inputFile->isComplete(); } const Header & RgbaInputFile::header () const { return _inputFile->header(); } const char * RgbaInputFile::fileName () const { return _inputFile->fileName(); } const FrameBuffer & RgbaInputFile::frameBuffer () const { return _inputFile->frameBuffer(); } const IMATH_NAMESPACE::Box2i & RgbaInputFile::displayWindow () const { return _inputFile->header().displayWindow(); } const IMATH_NAMESPACE::Box2i & RgbaInputFile::dataWindow () const { return _inputFile->header().dataWindow(); } float RgbaInputFile::pixelAspectRatio () const { return _inputFile->header().pixelAspectRatio(); } const IMATH_NAMESPACE::V2f RgbaInputFile::screenWindowCenter () const { return _inputFile->header().screenWindowCenter(); } float RgbaInputFile::screenWindowWidth () const { return _inputFile->header().screenWindowWidth(); } LineOrder RgbaInputFile::lineOrder () const { return _inputFile->header().lineOrder(); } Compression RgbaInputFile::compression () const { return _inputFile->header().compression(); } RgbaChannels RgbaInputFile::channels () const { return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); } int RgbaInputFile::version () const { return _inputFile->version(); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRgbaFile.h000066400000000000000000000335671406177042200201430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RGBA_FILE_H #define INCLUDED_IMF_RGBA_FILE_H //----------------------------------------------------------------------------- // // Simplified RGBA image I/O // // class RgbaOutputFile // class RgbaInputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfRgba.h" #include "ImathVec.h" #include "ImathBox.h" #include "half.h" #include "ImfThreading.h" #include #include "ImfNamespace.h" #include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------------------- // Utility to compute the origin-based pointer address // // With large offsets for the data window, the naive code // can wrap around, especially on 32-bit machines. // This can be used to avoid that //------------------------------------------------------- inline const Rgba * ComputeBasePointer ( const Rgba* ptr, const IMATH_NAMESPACE::V2i& origin, int64_t w, size_t xStride = 1, size_t yStride = 0) { if (yStride == 0) yStride = w; int64_t offx = static_cast (origin.x); offx *= xStride; int64_t offy = static_cast (origin.y); offy *= yStride; return ptr - offx - offy; } inline const Rgba * ComputeBasePointer (const Rgba* ptr, const IMATH_NAMESPACE::Box2i& dataWindow) { return ComputeBasePointer (ptr, dataWindow.min, static_cast (dataWindow.max.x) - static_cast (dataWindow.min.x) + 1); } inline Rgba* ComputeBasePointer ( Rgba* ptr, const IMATH_NAMESPACE::V2i& origin, int64_t w, size_t xStride = 1, size_t yStride = 0) { if (yStride == 0) yStride = w; int64_t offx = static_cast (origin.x); offx *= xStride; int64_t offy = static_cast (origin.y); offy *= yStride; return ptr - offx - offy; } inline Rgba* ComputeBasePointer (Rgba* ptr, const IMATH_NAMESPACE::Box2i& dataWindow) { return ComputeBasePointer ( ptr, dataWindow.min, static_cast (dataWindow.max.x) - static_cast (dataWindow.min.x) + 1); } // // RGBA output file. // class RgbaOutputFile { public: //--------------------------------------------------- // Constructor -- header is constructed by the caller //--------------------------------------------------- IMF_EXPORT RgbaOutputFile (const char name[], const Header &header, RgbaChannels rgbaChannels = WRITE_RGBA, int numThreads = globalThreadCount()); //---------------------------------------------------- // Constructor -- header is constructed by the caller, // file is opened by the caller, destructor will not // automatically close the file. //---------------------------------------------------- IMF_EXPORT RgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels = WRITE_RGBA, int numThreads = globalThreadCount()); //---------------------------------------------------------------- // Constructor -- header data are explicitly specified as function // call arguments (empty dataWindow means "same as displayWindow") //---------------------------------------------------------------- IMF_EXPORT RgbaOutputFile (const char name[], const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = PIZ_COMPRESSION, int numThreads = globalThreadCount()); //----------------------------------------------- // Constructor -- like the previous one, but both // the display window and the data window are // Box2i (V2i (0, 0), V2i (width - 1, height -1)) //----------------------------------------------- IMF_EXPORT RgbaOutputFile (const char name[], int width, int height, RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = PIZ_COMPRESSION, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~RgbaOutputFile (); //------------------------------------------------ // Define a frame buffer as the pixel data source: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //------------------------------------------------ IMF_EXPORT void setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride); //--------------------------------------------- // Write pixel data (see class Imf::OutputFile) //--------------------------------------------- IMF_EXPORT void writePixels (int numScanLines = 1); IMF_EXPORT int currentScanLine () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; // -------------------------------------------------------------------- // Update the preview image (see Imf::OutputFile::updatePreviewImage()) // -------------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba[]); //----------------------------------------------------------------------- // Rounding control for luminance/chroma images: // // If the output file contains luminance and chroma channels (WRITE_YC // or WRITE_YCA), then the the significands of the luminance and // chroma values are rounded to roundY and roundC bits respectively (see // function half::round()). Rounding improves compression with minimal // image degradation, usually much less than the degradation caused by // chroma subsampling. By default, roundY is 7, and roundC is 5. // // If the output file contains RGB channels or a luminance channel, // without chroma, then no rounding is performed. //----------------------------------------------------------------------- IMF_EXPORT void setYCRounding (unsigned int roundY, unsigned int roundC); //---------------------------------------------------- // Break a scan line -- for testing and debugging only // (see Imf::OutputFile::updatePreviewImage() // // Warning: Calling this function usually results in a // broken image file. The file or parts of it may not // be readable, or the file may contain bad data. // //---------------------------------------------------- IMF_EXPORT void breakScanLine (int y, int offset, int length, char c); private: RgbaOutputFile (const RgbaOutputFile &) = delete; RgbaOutputFile & operator = (const RgbaOutputFile &) = delete; RgbaOutputFile (RgbaOutputFile &&) = delete; RgbaOutputFile & operator = (RgbaOutputFile &&) = delete; class ToYca; OutputFile * _outputFile; ToYca * _toYca; }; // // RGBA input file // class RgbaInputFile { public: //------------------------------------------------------- // Constructor -- opens the file with the specified name, // destructor will automatically close the file. //------------------------------------------------------- IMF_EXPORT RgbaInputFile (const char name[], int numThreads = globalThreadCount()); //----------------------------------------------------------- // Constructor -- attaches the new RgbaInputFile object to a // file that has already been opened by the caller. // Destroying the RgbaInputFile object will not automatically // close the file. //----------------------------------------------------------- IMF_EXPORT RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount()); //-------------------------------------------------------------- // Constructors -- the same as the previous two, but the names // of the red, green, blue, alpha, luminance and chroma channels // are expected to be layerName.R, layerName.G, etc. //-------------------------------------------------------------- IMF_EXPORT RgbaInputFile (const char name[], const std::string &layerName, int numThreads = globalThreadCount()); IMF_EXPORT RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, const std::string &layerName, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~RgbaInputFile (); //----------------------------------------------------- // Define a frame buffer as the pixel data destination: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //----------------------------------------------------- IMF_EXPORT void setFrameBuffer (Rgba *base, size_t xStride, size_t yStride); //---------------------------------------------------------------- // Switch to a different layer -- subsequent calls to readPixels() // will read channels layerName.R, layerName.G, etc. // After each call to setLayerName(), setFrameBuffer() must be // called at least once before the next call to readPixels(). //---------------------------------------------------------------- IMF_EXPORT void setLayerName (const std::string &layerName); //------------------------------------------- // Read pixel data (see class Imf::InputFile) //------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; IMF_EXPORT const char * fileName () const; IMF_EXPORT bool isComplete () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; private: RgbaInputFile (const RgbaInputFile &) = delete; RgbaInputFile & operator = (const RgbaInputFile &) = delete; RgbaInputFile (RgbaInputFile &&) = delete; RgbaInputFile & operator = (RgbaInputFile &&) = delete; class FromYca; InputFile * _inputFile; FromYca * _fromYca; std::string _channelNamePrefix; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRgbaYca.cpp000066400000000000000000000302101406177042200203110ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm // Entertainment Company Ltd. Portions contributed and copyright held by // others as indicated. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above // copyright notice, this list of conditions and the following // disclaimer. // // * 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. // // * Neither the name of Industrial Light & Magic nor the names of // any other contributors to this software 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 OWNER 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. // ////////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Conversion between RGBA and YCA data. // //----------------------------------------------------------------------------- #include #include #include using namespace IMATH_NAMESPACE; using namespace std; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace RgbaYca { V3f computeYw (const Chromaticities &cr) { M44f m = RGBtoXYZ (cr, 1); return V3f (m[0][1], m[1][1], m[2][1]) / (m[0][1] + m[1][1] + m[2][1]); } void RGBAtoYCA (const V3f &yw, int n, bool aIsValid, const Rgba rgbaIn[/*n*/], Rgba ycaOut[/*n*/]) { for (int i = 0; i < n; ++i) { Rgba in = rgbaIn[i]; Rgba &out = ycaOut[i]; // // Conversion to YCA and subsequent chroma subsampling // work only if R, G and B are finite and non-negative. // if (!in.r.isFinite() || in.r < 0) in.r = 0; if (!in.g.isFinite() || in.g < 0) in.g = 0; if (!in.b.isFinite() || in.b < 0) in.b = 0; if (in.r == in.g && in.g == in.b) { // // Special case -- R, G and B are equal. To avoid rounding // errors, we explicitly set the output luminance channel // to G, and the chroma channels to 0. // // The special cases here and in YCAtoRGBA() ensure that // converting black-and white images from RGBA to YCA and // back is lossless. // out.r = 0; out.g = in.g; out.b = 0; } else { out.g = in.r * yw.x + in.g * yw.y + in.b * yw.z; float Y = out.g; if (abs (in.r - Y) < HALF_MAX * Y) out.r = (in.r - Y) / Y; else out.r = 0; if (abs (in.b - Y) < HALF_MAX * Y) out.b = (in.b - Y) / Y; else out.b = 0; } if (aIsValid) out.a = in.a; else out.a = 1; } } void decimateChromaHoriz (int n, const Rgba ycaIn[/*n+N-1*/], Rgba ycaOut[/*n*/]) { #ifdef DEBUG assert (ycaIn != ycaOut); #endif int begin = N2; int end = begin + n; for (int i = begin, j = 0; i < end; ++i, ++j) { if ((j & 1) == 0) { ycaOut[j].r = ycaIn[i - 13].r * 0.001064f + ycaIn[i - 11].r * -0.003771f + ycaIn[i - 9].r * 0.009801f + ycaIn[i - 7].r * -0.021586f + ycaIn[i - 5].r * 0.043978f + ycaIn[i - 3].r * -0.093067f + ycaIn[i - 1].r * 0.313659f + ycaIn[i ].r * 0.499846f + ycaIn[i + 1].r * 0.313659f + ycaIn[i + 3].r * -0.093067f + ycaIn[i + 5].r * 0.043978f + ycaIn[i + 7].r * -0.021586f + ycaIn[i + 9].r * 0.009801f + ycaIn[i + 11].r * -0.003771f + ycaIn[i + 13].r * 0.001064f; ycaOut[j].b = ycaIn[i - 13].b * 0.001064f + ycaIn[i - 11].b * -0.003771f + ycaIn[i - 9].b * 0.009801f + ycaIn[i - 7].b * -0.021586f + ycaIn[i - 5].b * 0.043978f + ycaIn[i - 3].b * -0.093067f + ycaIn[i - 1].b * 0.313659f + ycaIn[i ].b * 0.499846f + ycaIn[i + 1].b * 0.313659f + ycaIn[i + 3].b * -0.093067f + ycaIn[i + 5].b * 0.043978f + ycaIn[i + 7].b * -0.021586f + ycaIn[i + 9].b * 0.009801f + ycaIn[i + 11].b * -0.003771f + ycaIn[i + 13].b * 0.001064f; } ycaOut[j].g = ycaIn[i].g; ycaOut[j].a = ycaIn[i].a; } } void decimateChromaVert (int n, const Rgba * const ycaIn[N], Rgba ycaOut[/*n*/]) { for (int i = 0; i < n; ++i) { if ((i & 1) == 0) { ycaOut[i].r = ycaIn[ 0][i].r * 0.001064f + ycaIn[ 2][i].r * -0.003771f + ycaIn[ 4][i].r * 0.009801f + ycaIn[ 6][i].r * -0.021586f + ycaIn[ 8][i].r * 0.043978f + ycaIn[10][i].r * -0.093067f + ycaIn[12][i].r * 0.313659f + ycaIn[13][i].r * 0.499846f + ycaIn[14][i].r * 0.313659f + ycaIn[16][i].r * -0.093067f + ycaIn[18][i].r * 0.043978f + ycaIn[20][i].r * -0.021586f + ycaIn[22][i].r * 0.009801f + ycaIn[24][i].r * -0.003771f + ycaIn[26][i].r * 0.001064f; ycaOut[i].b = ycaIn[ 0][i].b * 0.001064f + ycaIn[ 2][i].b * -0.003771f + ycaIn[ 4][i].b * 0.009801f + ycaIn[ 6][i].b * -0.021586f + ycaIn[ 8][i].b * 0.043978f + ycaIn[10][i].b * -0.093067f + ycaIn[12][i].b * 0.313659f + ycaIn[13][i].b * 0.499846f + ycaIn[14][i].b * 0.313659f + ycaIn[16][i].b * -0.093067f + ycaIn[18][i].b * 0.043978f + ycaIn[20][i].b * -0.021586f + ycaIn[22][i].b * 0.009801f + ycaIn[24][i].b * -0.003771f + ycaIn[26][i].b * 0.001064f; } ycaOut[i].g = ycaIn[13][i].g; ycaOut[i].a = ycaIn[13][i].a; } } void roundYCA (int n, unsigned int roundY, unsigned int roundC, const Rgba ycaIn[/*n*/], Rgba ycaOut[/*n*/]) { for (int i = 0; i < n; ++i) { ycaOut[i].g = ycaIn[i].g.round (roundY); ycaOut[i].a = ycaIn[i].a; if ((i & 1) == 0) { ycaOut[i].r = ycaIn[i].r.round (roundC); ycaOut[i].b = ycaIn[i].b.round (roundC); } } } void reconstructChromaHoriz (int n, const Rgba ycaIn[/*n+N-1*/], Rgba ycaOut[/*n*/]) { #ifdef DEBUG assert (ycaIn != ycaOut); #endif int begin = N2; int end = begin + n; for (int i = begin, j = 0; i < end; ++i, ++j) { if (j & 1) { ycaOut[j].r = ycaIn[i - 13].r * 0.002128f + ycaIn[i - 11].r * -0.007540f + ycaIn[i - 9].r * 0.019597f + ycaIn[i - 7].r * -0.043159f + ycaIn[i - 5].r * 0.087929f + ycaIn[i - 3].r * -0.186077f + ycaIn[i - 1].r * 0.627123f + ycaIn[i + 1].r * 0.627123f + ycaIn[i + 3].r * -0.186077f + ycaIn[i + 5].r * 0.087929f + ycaIn[i + 7].r * -0.043159f + ycaIn[i + 9].r * 0.019597f + ycaIn[i + 11].r * -0.007540f + ycaIn[i + 13].r * 0.002128f; ycaOut[j].b = ycaIn[i - 13].b * 0.002128f + ycaIn[i - 11].b * -0.007540f + ycaIn[i - 9].b * 0.019597f + ycaIn[i - 7].b * -0.043159f + ycaIn[i - 5].b * 0.087929f + ycaIn[i - 3].b * -0.186077f + ycaIn[i - 1].b * 0.627123f + ycaIn[i + 1].b * 0.627123f + ycaIn[i + 3].b * -0.186077f + ycaIn[i + 5].b * 0.087929f + ycaIn[i + 7].b * -0.043159f + ycaIn[i + 9].b * 0.019597f + ycaIn[i + 11].b * -0.007540f + ycaIn[i + 13].b * 0.002128f; } else { ycaOut[j].r = ycaIn[i].r; ycaOut[j].b = ycaIn[i].b; } ycaOut[j].g = ycaIn[i].g; ycaOut[j].a = ycaIn[i].a; } } void reconstructChromaVert (int n, const Rgba * const ycaIn[N], Rgba ycaOut[/*n*/]) { for (int i = 0; i < n; ++i) { ycaOut[i].r = ycaIn[ 0][i].r * 0.002128f + ycaIn[ 2][i].r * -0.007540f + ycaIn[ 4][i].r * 0.019597f + ycaIn[ 6][i].r * -0.043159f + ycaIn[ 8][i].r * 0.087929f + ycaIn[10][i].r * -0.186077f + ycaIn[12][i].r * 0.627123f + ycaIn[14][i].r * 0.627123f + ycaIn[16][i].r * -0.186077f + ycaIn[18][i].r * 0.087929f + ycaIn[20][i].r * -0.043159f + ycaIn[22][i].r * 0.019597f + ycaIn[24][i].r * -0.007540f + ycaIn[26][i].r * 0.002128f; ycaOut[i].b = ycaIn[ 0][i].b * 0.002128f + ycaIn[ 2][i].b * -0.007540f + ycaIn[ 4][i].b * 0.019597f + ycaIn[ 6][i].b * -0.043159f + ycaIn[ 8][i].b * 0.087929f + ycaIn[10][i].b * -0.186077f + ycaIn[12][i].b * 0.627123f + ycaIn[14][i].b * 0.627123f + ycaIn[16][i].b * -0.186077f + ycaIn[18][i].b * 0.087929f + ycaIn[20][i].b * -0.043159f + ycaIn[22][i].b * 0.019597f + ycaIn[24][i].b * -0.007540f + ycaIn[26][i].b * 0.002128f; ycaOut[i].g = ycaIn[13][i].g; ycaOut[i].a = ycaIn[13][i].a; } } void YCAtoRGBA (const IMATH_NAMESPACE::V3f &yw, int n, const Rgba ycaIn[/*n*/], Rgba rgbaOut[/*n*/]) { for (int i = 0; i < n; ++i) { const Rgba &in = ycaIn[i]; Rgba &out = rgbaOut[i]; if (in.r == 0 && in.b == 0) { // // Special case -- both chroma channels are 0. To avoid // rounding errors, we explicitly set the output R, G and B // channels equal to the input luminance. // // The special cases here and in RGBAtoYCA() ensure that // converting black-and white images from RGBA to YCA and // back is lossless. // out.r = in.g; out.g = in.g; out.b = in.g; out.a = in.a; } else { float Y = in.g; float r = (in.r + 1) * Y; float b = (in.b + 1) * Y; float g = (Y - r * yw.x - b * yw.z) / yw.y; out.r = r; out.g = g; out.b = b; out.a = in.a; } } } namespace { inline float saturation (const Rgba &in) { float rgbMax = max (in.r, max (in.g, in.b)); float rgbMin = min (in.r, min (in.g, in.b)); if (rgbMax > 0) return 1 - rgbMin / rgbMax; else return 0; } void desaturate (const Rgba &in, float f, const V3f &yw, Rgba &out) { float rgbMax = max (in.r, max (in.g, in.b)); out.r = max (float (rgbMax - (rgbMax - in.r) * f), 0.0f); out.g = max (float (rgbMax - (rgbMax - in.g) * f), 0.0f); out.b = max (float (rgbMax - (rgbMax - in.b) * f), 0.0f); out.a = in.a; float Yin = in.r * yw.x + in.g * yw.y + in.b * yw.z; float Yout = out.r * yw.x + out.g * yw.y + out.b * yw.z; if (Yout > 0) { out.r *= Yin / Yout; out.g *= Yin / Yout; out.b *= Yin / Yout; } } } // namespace void fixSaturation (const IMATH_NAMESPACE::V3f &yw, int n, const Rgba * const rgbaIn[3], Rgba rgbaOut[/*n*/]) { float neighborA2 = saturation (rgbaIn[0][0]); float neighborA1 = neighborA2; float neighborB2 = saturation (rgbaIn[2][0]); float neighborB1 = neighborB2; for (int i = 0; i < n; ++i) { float neighborA0 = neighborA1; neighborA1 = neighborA2; float neighborB0 = neighborB1; neighborB1 = neighborB2; if (i < n - 1) { neighborA2 = saturation (rgbaIn[0][i + 1]); neighborB2 = saturation (rgbaIn[2][i + 1]); } // // A0 A1 A2 // rgbaOut[i] // B0 B1 B2 // float sMean = min (1.0f, 0.25f * (neighborA0 + neighborA2 + neighborB0 + neighborB2)); const Rgba &in = rgbaIn[1][i]; Rgba &out = rgbaOut[i]; float s = saturation (in); if (s > sMean) { float sMax = min (1.0f, 1 - (1 - sMean) * 0.25f); if (s > sMax) { desaturate (in, sMax / s, yw, out); continue; } } out = in; } } } // namespace RgbaYca OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRgbaYca.h000066400000000000000000000203271406177042200177660ustar00rootroot00000000000000#ifndef INCLUDED_IMF_RGBA_YCA_H #define INCLUDED_IMF_RGBA_YCA_H ////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm // Entertainment Company Ltd. Portions contributed and copyright held by // others as indicated. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above // copyright notice, this list of conditions and the following // disclaimer. // // * 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. // // * Neither the name of Industrial Light & Magic nor the names of // any other contributors to this software 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 OWNER 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. // ////////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Conversion between RGBA (red, green, blue alpha) // and YCA (luminance, subsampled chroma, alpha) data: // // Luminance, Y, is computed as a weighted sum of R, G, and B: // // Y = yw.x * R + yw.y * G + yw.z * B // // Function computeYw() computes a set of RGB-to-Y weights, yw, // from a set of primary and white point chromaticities. // // Chroma, C, consists of two components, RY and BY: // // RY = (R - Y) / Y // BY = (B - Y) / Y // // For efficiency, the x and y subsampling rates for chroma are // hardwired to 2, and the chroma subsampling and reconstruction // filters are fixed 27-pixel wide windowed sinc functions. // // Starting with an image that has RGBA data for all pixels, // // RGBA RGBA RGBA RGBA ... RGBA RGBA // RGBA RGBA RGBA RGBA ... RGBA RGBA // RGBA RGBA RGBA RGBA ... RGBA RGBA // RGBA RGBA RGBA RGBA ... RGBA RGBA // ... // RGBA RGBA RGBA RGBA ... RGBA RGBA // RGBA RGBA RGBA RGBA ... RGBA RGBA // // function RGBAtoYCA() converts the pixels to YCA format: // // YCA YCA YCA YCA ... YCA YCA // YCA YCA YCA YCA ... YCA YCA // YCA YCA YCA YCA ... YCA YCA // YCA YCA YCA YCA ... YCA YCA // ... // YCA YCA YCA YCA ... YCA YCA // YCA YCA YCA YCA ... YCA YCA // // Next, decimateChomaHoriz() eliminates the chroma values from // the odd-numbered pixels in every scan line: // // YCA YA YCA YA ... YCA YA // YCA YA YCA YA ... YCA YA // YCA YA YCA YA ... YCA YA // YCA YA YCA YA ... YCA YA // ... // YCA YA YCA YA ... YCA YA // YCA YA YCA YA ... YCA YA // // decimateChromaVert() eliminates all chroma values from the // odd-numbered scan lines: // // YCA YA YCA YA ... YCA YA // YA YA YA YA ... YA YA // YCA YA YCA YA ... YCA YA // YA YA YA YA ... YA YA // ... // YCA YA YCA YA ... YCA YA // YA YA YA YA ... YA YA // // Finally, roundYCA() reduces the precision of the luminance // and chroma values so that the pixel data shrink more when // they are saved in a compressed file. // // The output of roundYCA() can be converted back to a set // of RGBA pixel data that is visually very similar to the // original RGBA image, by calling reconstructChromaHoriz(), // reconstructChromaVert(), YCAtoRGBA(), and finally // fixSaturation(). // //----------------------------------------------------------------------------- #include "ImfRgba.h" #include "ImfChromaticities.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER namespace RgbaYca { // // Width of the chroma subsampling and reconstruction filters // static const int N = 27; static const int N2 = N / 2; // // Convert a set of primary chromaticities into a set of weighting // factors for computing a pixels's luminance, Y, from R, G and B // IMF_EXPORT IMATH_NAMESPACE::V3f computeYw (const Chromaticities &cr); // // Convert an array of n RGBA pixels, rgbaIn, to YCA (luminance/chroma/alpha): // // ycaOut[i].g = Y (rgbaIn[i]); // ycaOut[i].r = RY (rgbaIn[i]); // ycaOut[i].b = BY (rgbaIn[i]); // ycaOut[i].a = aIsValid? rgbaIn[i].a: 1 // // yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). // IMF_EXPORT void RGBAtoYCA (const IMATH_NAMESPACE::V3f &yw, int n, bool aIsValid, const Rgba rgbaIn[/*n*/], Rgba ycaOut[/*n*/]); // // Perform horizontal low-pass filtering and subsampling of // the chroma channels of an array of n pixels. In order // to avoid indexing off the ends of the input array during // low-pass filtering, ycaIn must have N2 extra pixels at // both ends. Before calling decimateChromaHoriz(), the extra // pixels should be filled with copies of the first and last // "real" input pixel. // IMF_EXPORT void decimateChromaHoriz (int n, const Rgba ycaIn[/*n+N-1*/], Rgba ycaOut[/*n*/]); // // Perform vertical chroma channel low-pass filtering and subsampling. // N scan lines of input pixels are combined into a single scan line // of output pixels. // IMF_EXPORT void decimateChromaVert (int n, const Rgba * const ycaIn[N], Rgba ycaOut[/*n*/]); // // Round the luminance and chroma channels of an array of YCA // pixels that has already been filtered and subsampled. // The signifcands of the pixels' luminance and chroma values // are rounded to roundY and roundC bits respectively. // IMF_EXPORT void roundYCA (int n, unsigned int roundY, unsigned int roundC, const Rgba ycaIn[/*n*/], Rgba ycaOut[/*n*/]); // // For a scan line that has valid chroma data only for every other pixel, // reconstruct the missing chroma values. // IMF_EXPORT void reconstructChromaHoriz (int n, const Rgba ycaIn[/*n+N-1*/], Rgba ycaOut[/*n*/]); // // For a scan line that has only luminance and no valid chroma data, // reconstruct chroma from the surronding N scan lines. // IMF_EXPORT void reconstructChromaVert (int n, const Rgba * const ycaIn[N], Rgba ycaOut[/*n*/]); // // Convert an array of n YCA (luminance/chroma/alpha) pixels to RGBA. // This function is the inverse of RGBAtoYCA(). // yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). // IMF_EXPORT void YCAtoRGBA (const IMATH_NAMESPACE::V3f &yw, int n, const Rgba ycaIn[/*n*/], Rgba rgbaOut[/*n*/]); // // Eliminate super-saturated pixels: // // Converting an image from RGBA to YCA, low-pass filtering chroma, // and converting the result back to RGBA can produce pixels with // super-saturated colors, where one or two of the RGB components // become zero or negative. (The low-pass and reconstruction filters // introduce some amount of ringing into the chroma components. // This can lead to negative RGB values near high-contrast edges.) // // The fixSaturation() function finds super-saturated pixels and // corrects them by desaturating their colors while maintaining // their luminance. fixSaturation() takes three adjacent input // scan lines, rgbaIn[0], rgbaIn[1], rgbaIn[2], adjusts the // saturation of rgbaIn[1], and stores the result in rgbaOut. // IMF_EXPORT void fixSaturation (const IMATH_NAMESPACE::V3f &yw, int n, const Rgba * const rgbaIn[3], Rgba rgbaOut[/*n*/]); } // namespace RgbaYca OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRle.cpp000066400000000000000000000102321406177042200175250ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include #include "ImfRle.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { const int MIN_RUN_LENGTH = 3; const int MAX_RUN_LENGTH = 127; } // // Compress an array of bytes, using run-length encoding, // and return the length of the compressed data. // int rleCompress (int inLength, const char in[], signed char out[]) { const char *inEnd = in + inLength; const char *runStart = in; const char *runEnd = in + 1; signed char *outWrite = out; while (runStart < inEnd) { while (runEnd < inEnd && *runStart == *runEnd && runEnd - runStart - 1 < MAX_RUN_LENGTH) { ++runEnd; } if (runEnd - runStart >= MIN_RUN_LENGTH) { // // Compressable run // *outWrite++ = (runEnd - runStart) - 1; *outWrite++ = *(signed char *) runStart; runStart = runEnd; } else { // // Uncompressable run // while (runEnd < inEnd && ((runEnd + 1 >= inEnd || *runEnd != *(runEnd + 1)) || (runEnd + 2 >= inEnd || *(runEnd + 1) != *(runEnd + 2))) && runEnd - runStart < MAX_RUN_LENGTH) { ++runEnd; } *outWrite++ = runStart - runEnd; while (runStart < runEnd) { *outWrite++ = *(signed char *) (runStart++); } } ++runEnd; } return outWrite - out; } // // Uncompress an array of bytes compressed with rleCompress(). // Returns the length of the oncompressed data, or 0 if the // length of the uncompressed data would be more than maxLength. // int rleUncompress (int inLength, int maxLength, const signed char in[], char out[]) { char *outStart = out; while (inLength > 0) { if (*in < 0) { int count = -((int)*in++); inLength -= count + 1; if (0 > (maxLength -= count)) return 0; // check the input buffer is big enough to contain // 'count' bytes of remaining data if (inLength < 0) return 0; memcpy(out, in, count); out += count; in += count; } else { int count = *in++; inLength -= 2; if (0 > (maxLength -= count + 1)) return 0; // check the input buffer is big enough to contain // byte to be duplicated if (inLength < 0) return 0; memset(out, *(char*)in, count+1); out += count+1; in++; } } return out - outStart; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRle.h000066400000000000000000000047261406177042200172050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RLE_H_ #define INCLUDED_IMF_RLE_H_ #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Compress an array of bytes, using run-length encoding, // and return the length of the compressed data. // IMF_EXPORT int rleCompress (int inLength, const char in[], signed char out[]); // // Uncompress an array of bytes compressed with rleCompress(). // Returns the length of the uncompressed data, or 0 if the // length of the uncompressed data would be more than maxLength. // IMF_EXPORT int rleUncompress (int inLength, int maxLength, const signed char in[], char out[]); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfRleCompressor.cpp000066400000000000000000000114001406177042200216000ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class RleCompressor // //----------------------------------------------------------------------------- #include "ImfRleCompressor.h" #include "ImfCheckedArithmetic.h" #include "ImfRle.h" #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER RleCompressor::RleCompressor (const Header &hdr, size_t maxScanLineSize): Compressor (hdr), _maxScanLineSize (maxScanLineSize), _tmpBuffer (0), _outBuffer (0) { _tmpBuffer = new char [maxScanLineSize]; _outBuffer = new char [uiMult (maxScanLineSize, size_t (3)) / 2]; } RleCompressor::~RleCompressor () { delete [] _tmpBuffer; delete [] _outBuffer; } int RleCompressor::numScanLines () const { // // This compressor compresses individual scan lines. // return 1; } int RleCompressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case �- empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Reorder the pixel data. // { char *t1 = _tmpBuffer; char *t2 = _tmpBuffer + (inSize + 1) / 2; const char *stop = inPtr + inSize; while (true) { if (inPtr < stop) *(t1++) = *(inPtr++); else break; if (inPtr < stop) *(t2++) = *(inPtr++); else break; } } // // Predictor. // { unsigned char *t = (unsigned char *) _tmpBuffer + 1; unsigned char *stop = (unsigned char *) _tmpBuffer + inSize; int p = t[-1]; while (t < stop) { int d = int (t[0]) - p + (128 + 256); p = t[0]; t[0] = d; ++t; } } // // Run-length encode the data. // outPtr = _outBuffer; return rleCompress (inSize, _tmpBuffer, (signed char *) _outBuffer); } int RleCompressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case �- empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Decode the run-length encoded data // int outSize; if (0 == (outSize = rleUncompress (inSize, _maxScanLineSize, (const signed char *) inPtr, _tmpBuffer))) { throw IEX_NAMESPACE::InputExc ("Data decoding (rle) failed."); } // // Predictor. // { unsigned char *t = (unsigned char *) _tmpBuffer + 1; unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; while (t < stop) { int d = int (t[-1]) + int (t[0]) - 128; t[0] = d; ++t; } } // // Reorder the pixel data. // { const char *t1 = _tmpBuffer; const char *t2 = _tmpBuffer + (outSize + 1) / 2; char *s = _outBuffer; char *stop = s + outSize; while (true) { if (s < stop) *(s++) = *(t1++); else break; if (s < stop) *(s++) = *(t2++); else break; } } outPtr = _outBuffer; return outSize; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfRleCompressor.h000066400000000000000000000057641406177042200212650ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_RLE_COMPRESSOR_H #define INCLUDED_IMF_RLE_COMPRESSOR_H //----------------------------------------------------------------------------- // // class RleCompressor -- performs run-length encoding // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class RleCompressor: public Compressor { public: IMF_EXPORT RleCompressor (const Header &hdr, size_t maxScanLineSize); IMF_EXPORT virtual ~RleCompressor (); RleCompressor (const RleCompressor& other) = delete; RleCompressor& operator = (const RleCompressor& other) = delete; RleCompressor (RleCompressor&& other) = delete; RleCompressor& operator = (RleCompressor&& other) = delete; IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); private: int _maxScanLineSize; char * _tmpBuffer; char * _outBuffer; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfScanLineInputFile.cpp000066400000000000000000001500521406177042200223240ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class ScanLineInputFile // //----------------------------------------------------------------------------- #include "ImfScanLineInputFile.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfStdIO.h" #include "ImfCompressor.h" #include "ImathBox.h" #include "ImathFun.h" #include #include #include #include #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "Iex.h" #include "ImfVersion.h" #include "ImfOptimizedPixelReading.h" #include "ImfNamespace.h" #include "ImfStandardAttributes.h" #include #include #include #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::divp; using IMATH_NAMESPACE::modp; using std::string; using std::vector; using std::min; using std::max; using std::sort; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct InSliceInfo { PixelType typeInFrameBuffer; PixelType typeInFile; char * base; size_t xStride; size_t yStride; int xSampling; int ySampling; bool fill; bool skip; double fillValue; InSliceInfo (PixelType typeInFrameBuffer = HALF, PixelType typeInFile = HALF, char *base = 0, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, bool fill = false, bool skip = false, double fillValue = 0.0); }; InSliceInfo::InSliceInfo (PixelType tifb, PixelType tifl, char *b, size_t xs, size_t ys, int xsm, int ysm, bool f, bool s, double fv) : typeInFrameBuffer (tifb), typeInFile (tifl), base (b), xStride (xs), yStride (ys), xSampling (xsm), ySampling (ysm), fill (f), skip (s), fillValue (fv) { // empty } struct LineBuffer { const char * uncompressedData; char * buffer; int dataSize; int minY; int maxY; Compressor * compressor; Compressor::Format format; int number; bool hasException; string exception; LineBuffer (Compressor * const comp); ~LineBuffer (); LineBuffer (const LineBuffer& other) = delete; LineBuffer& operator = (const LineBuffer& other) = delete; LineBuffer (LineBuffer&& other) = delete; LineBuffer& operator = (LineBuffer&& other) = delete; inline void wait () {_sem.wait();} inline void post () {_sem.post();} private: Semaphore _sem; }; LineBuffer::LineBuffer (Compressor *comp): uncompressedData (0), buffer (0), dataSize (0), compressor (comp), format (defaultFormat(compressor)), number (-1), hasException (false), exception (), _sem (1) { // empty } LineBuffer::~LineBuffer () { delete compressor; } /// helper struct used to detect the order that the channels are stored struct sliceOptimizationData { const char * base; ///< pointer to pixel data bool fill; ///< is this channel being filled with constant, instead of read? half fillValue; ///< if filling, the value to use size_t offset; ///< position this channel will be in the read buffer, accounting for previous channels, as well as their type PixelType type; ///< type of channel size_t xStride; ///< x-stride of channel in buffer (must be set to cause channels to interleave) size_t yStride; ///< y-stride of channel in buffer (must be same in all channels, else order will change, which is bad) int xSampling; ///< channel x sampling int ySampling; ///< channel y sampling /// we need to keep the list sorted in the order they'll be written to memory bool operator<(const sliceOptimizationData& other ) const { return base < other.base; } }; } // namespace struct ScanLineInputFile::Data: public Mutex { Header header; // the image header int version; // file's version FrameBuffer frameBuffer; // framebuffer to write into LineOrder lineOrder; // order of the scanlines in file int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord vector lineOffsets; // stores offsets in file for // each line bool fileIsComplete; // True if no scanlines are missing // in the file int nextLineBufferMinY; // minimum y of the next linebuffer vector bytesPerLine; // combined size of a line over all // channels vector offsetInLineBuffer; // offset for each scanline in its // linebuffer vector slices; // info about channels in file vector lineBuffers; // each holds one line buffer int linesInBuffer; // number of scanlines each buffer // holds size_t lineBufferSize; // size of the line buffer int partNumber; // part number bool memoryMapped; // if the stream is memory mapped OptimizationMode optimizationMode; // optimizibility of the input file vector optimizationData; ///< channel ordering for optimized reading Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline LineBuffer * getLineBuffer (int number); // hash function from line // buffer indices into our // vector of line buffers }; ScanLineInputFile::Data::Data (int numThreads): partNumber(-1), memoryMapped(false) { // // We need at least one lineBuffer, but if threading is used, // to keep n threads busy we need 2*n lineBuffers // lineBuffers.resize (max (1, 2 * numThreads)); } ScanLineInputFile::Data::~Data () { for (size_t i = 0; i < lineBuffers.size(); i++) delete lineBuffers[i]; } inline LineBuffer * ScanLineInputFile::Data::getLineBuffer (int lineBufferNumber) { return lineBuffers[lineBufferNumber % lineBuffers.size()]; } namespace { void reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, LineOrder lineOrder, vector &lineOffsets) { Int64 position = is.tellg(); try { for (unsigned int i = 0; i < lineOffsets.size(); i++) { Int64 lineOffset = is.tellg(); int y; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y); int dataSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, dataSize); Xdr::skip (is, dataSize); if (lineOrder == INCREASING_Y) lineOffsets[i] = lineOffset; else lineOffsets[lineOffsets.size() - i - 1] = lineOffset; } } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // Suppress all exceptions. This functions is // called only to reconstruct the line offset // table for incomplete files, and exceptions // are likely. // } is.clear(); is.seekg (position); } void readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, LineOrder lineOrder, vector &lineOffsets, bool &complete) { for (unsigned int i = 0; i < lineOffsets.size(); i++) { OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, lineOffsets[i]); } complete = true; for (unsigned int i = 0; i < lineOffsets.size(); i++) { if (lineOffsets[i] <= 0) { // // Invalid data in the line offset table mean that // the file is probably incomplete (the table is // the last thing written to the file). Either // some process is still busy writing the file, // or writing the file was aborted. // // We should still be able to read the existing // parts of the file. In order to do this, we // have to make a sequential scan over the scan // line data to reconstruct the line offset table. // complete = false; reconstructLineOffsets (is, lineOrder, lineOffsets); break; } } } void readPixelData (InputStreamMutex *streamData, ScanLineInputFile::Data *ifd, int minY, char *&buffer, int &dataSize) { // // Read a single line buffer from the input file. // // If the input file is not memory-mapped, we copy the pixel data into // into the array pointed to by buffer. If the file is memory-mapped, // then we change where buffer points to instead of writing into the // array (hence buffer needs to be a reference to a char *). // int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer; if (lineBufferNumber < 0 || lineBufferNumber >= int(ifd->lineOffsets.size())) THROW (IEX_NAMESPACE::InputExc, "Invalid scan line " << minY << " requested or missing."); Int64 lineOffset = ifd->lineOffsets[lineBufferNumber]; if (lineOffset == 0) THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); // // Seek to the start of the scan line in the file, // if necessary. // if ( !isMultiPart(ifd->version) ) { if (ifd->nextLineBufferMinY != minY) streamData->is->seekg (lineOffset); } else { // // In a multi-part file, the file pointer may have been moved by // other parts, so we have to ask tellg() where we are. // if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber]) streamData->is->seekg (lineOffset); } // // Read the data block's header. // int yInFile; // // Read the part number when we are dealing with a multi-part file. // if (isMultiPart(ifd->version)) { int partNumber; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); if (partNumber != ifd->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << ifd->partNumber << "."); } } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, yInFile); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, dataSize); if (yInFile != minY) throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); if (dataSize < 0 || dataSize > static_cast(ifd->lineBufferSize) ) throw IEX_NAMESPACE::InputExc ("Unexpected data block length."); // // Read the pixel data. // if (streamData->is->isMemoryMapped ()) buffer = streamData->is->readMemoryMapped (dataSize); else streamData->is->read (buffer, dataSize); // // Keep track of which scan line is the next one in // the file, so that we can avoid redundant seekg() // operations (seekg() can be fairly expensive). // if (ifd->lineOrder == INCREASING_Y) ifd->nextLineBufferMinY = minY + ifd->linesInBuffer; else ifd->nextLineBufferMinY = minY - ifd->linesInBuffer; } // // A LineBufferTask encapsulates the task uncompressing a set of // scanlines (line buffer) and copying them into the frame buffer. // class LineBufferTask : public Task { public: LineBufferTask (TaskGroup *group, ScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax, OptimizationMode optimizationMode); virtual ~LineBufferTask (); virtual void execute (); private: ScanLineInputFile::Data * _ifd; LineBuffer * _lineBuffer; int _scanLineMin; int _scanLineMax; OptimizationMode _optimizationMode; }; LineBufferTask::LineBufferTask (TaskGroup *group, ScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax,OptimizationMode optimizationMode) : Task (group), _ifd (ifd), _lineBuffer (lineBuffer), _scanLineMin (scanLineMin), _scanLineMax (scanLineMax), _optimizationMode(optimizationMode) { // empty } LineBufferTask::~LineBufferTask () { // // Signal that the line buffer is now free // _lineBuffer->post (); } void LineBufferTask::execute () { try { // // Uncompress the data, if necessary // if (_lineBuffer->uncompressedData == 0) { size_t uncompressedSize = 0; int maxY = min (_lineBuffer->maxY, _ifd->maxY); for (int i = _lineBuffer->minY - _ifd->minY; i <= maxY - _ifd->minY; ++i) { uncompressedSize += _ifd->bytesPerLine[i]; } if (_lineBuffer->compressor && static_cast(_lineBuffer->dataSize) < uncompressedSize) { _lineBuffer->format = _lineBuffer->compressor->format(); _lineBuffer->dataSize = _lineBuffer->compressor->uncompress (_lineBuffer->buffer, _lineBuffer->dataSize, _lineBuffer->minY, _lineBuffer->uncompressedData); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // _lineBuffer->format = Compressor::XDR; _lineBuffer->uncompressedData = _lineBuffer->buffer; } } int yStart, yStop, dy; if (_ifd->lineOrder == INCREASING_Y) { yStart = _scanLineMin; yStop = _scanLineMax + 1; dy = 1; } else { yStart = _scanLineMax; yStop = _scanLineMin - 1; dy = -1; } for (int y = yStart; y != yStop; y += dy) { // // Convert one scan line's worth of pixel data back // from the machine-independent representation, and // store the result in the frame buffer. // const char *readPtr = _lineBuffer->uncompressedData + _ifd->offsetInLineBuffer[y - _ifd->minY]; // // Iterate over all image channels. // for (unsigned int i = 0; i < _ifd->slices.size(); ++i) { // // Test if scan line y of this channel contains any data // (the scan line contains data only if y % ySampling == 0). // const InSliceInfo &slice = _ifd->slices[i]; if (modp (y, slice.ySampling) != 0) continue; // // Find the x coordinates of the leftmost and rightmost // sampled pixels (i.e. pixels within the data window // for which x % xSampling == 0). // int dMinX = divp (_ifd->minX, slice.xSampling); int dMaxX = divp (_ifd->maxX, slice.xSampling); // // Fill the frame buffer with pixel data. // if (slice.skip) { // // The file contains data for this channel, but // the frame buffer contains no slice for this channel. // skipChannel (readPtr, slice.typeInFile, dMaxX - dMinX + 1); } else { // // The frame buffer contains a slice for this channel. // char *linePtr = slice.base + intptr_t( divp (y, slice.ySampling) ) * intptr_t( slice.yStride ); char *writePtr = linePtr + intptr_t( dMinX ) * intptr_t( slice.xStride ); char *endPtr = linePtr + intptr_t( dMaxX ) * intptr_t( slice.xStride ); copyIntoFrameBuffer (readPtr, writePtr, endPtr, slice.xStride, slice.fill, slice.fillValue, _lineBuffer->format, slice.typeInFrameBuffer, slice.typeInFile); } } } } catch (std::exception &e) { if (!_lineBuffer->hasException) { _lineBuffer->exception = e.what(); _lineBuffer->hasException = true; } } catch (...) { if (!_lineBuffer->hasException) { _lineBuffer->exception = "unrecognized exception"; _lineBuffer->hasException = true; } } } #ifdef IMF_HAVE_SSE2 // // IIF format is more restricted than a perfectly generic one, // so it is possible to perform some optimizations. // class LineBufferTaskIIF : public Task { public: LineBufferTaskIIF (TaskGroup *group, ScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax, OptimizationMode optimizationMode); virtual ~LineBufferTaskIIF (); virtual void execute (); template void getWritePointer (int y, unsigned short*& pOutWritePointerRight, size_t& outPixelsToCopySSE, size_t& outPixelsToCopyNormal,int bank=0) const; template void getWritePointerStereo (int y, unsigned short*& outWritePointerRight, unsigned short*& outWritePointerLeft, size_t& outPixelsToCopySSE, size_t& outPixelsToCopyNormal) const; private: ScanLineInputFile::Data * _ifd; LineBuffer * _lineBuffer; int _scanLineMin; int _scanLineMax; OptimizationMode _optimizationMode; }; LineBufferTaskIIF::LineBufferTaskIIF (TaskGroup *group, ScanLineInputFile::Data *ifd, LineBuffer *lineBuffer, int scanLineMin, int scanLineMax, OptimizationMode optimizationMode ) : Task (group), _ifd (ifd), _lineBuffer (lineBuffer), _scanLineMin (scanLineMin), _scanLineMax (scanLineMax), _optimizationMode (optimizationMode) { /* // // indicates the optimised path has been taken // static bool could_optimise=false; if(could_optimise==false) { std::cerr << " optimised path\n"; could_optimise=true; } */ } LineBufferTaskIIF::~LineBufferTaskIIF () { // // Signal that the line buffer is now free // _lineBuffer->post (); } // Return 0 if we are to skip because of sampling // channelBank is 0 for the first group of channels, 1 for the second template void LineBufferTaskIIF::getWritePointer (int y, unsigned short*& outWritePointerRight, size_t& outPixelsToCopySSE, size_t& outPixelsToCopyNormal, int channelBank ) const { // Channels are saved alphabetically, so the order is B G R. // The last slice (R) will give us the location of our write pointer. // The only slice that we support skipping is alpha, i.e. the first one. // This does not impact the write pointer or the pixels to copy at all. size_t nbSlicesInBank = _ifd->optimizationData.size(); int sizeOfSingleValue = sizeof(TYPE); if(_ifd->optimizationData.size()>4) { // there are two banks - we only copy one at once nbSlicesInBank/=2; } size_t firstChannel = 0; if(channelBank==1) { firstChannel = _ifd->optimizationData.size()/2; } sliceOptimizationData& firstSlice = _ifd->optimizationData[firstChannel]; if (modp (y, firstSlice.ySampling) != 0) { outPixelsToCopySSE = 0; outPixelsToCopyNormal = 0; outWritePointerRight = 0; } const char* linePtr1 = firstSlice.base + divp (y, firstSlice.ySampling) * firstSlice.yStride; int dMinX1 = divp (_ifd->minX, firstSlice.xSampling); int dMaxX1 = divp (_ifd->maxX, firstSlice.xSampling); // Construct the writePtr so that we start writing at // linePtr + Min offset in the line. outWritePointerRight = (unsigned short*)(linePtr1 + dMinX1 * firstSlice.xStride ); size_t bytesToCopy = ((linePtr1 + dMaxX1 * firstSlice.xStride ) - (linePtr1 + dMinX1 * firstSlice.xStride )) + 2; size_t shortsToCopy = bytesToCopy / sizeOfSingleValue; size_t pixelsToCopy = (shortsToCopy / nbSlicesInBank ) + 1; // We only support writing to SSE if we have no pixels to copy normally outPixelsToCopySSE = pixelsToCopy / 8; outPixelsToCopyNormal = pixelsToCopy % 8; } template void LineBufferTaskIIF::getWritePointerStereo (int y, unsigned short*& outWritePointerRight, unsigned short*& outWritePointerLeft, size_t& outPixelsToCopySSE, size_t& outPixelsToCopyNormal) const { getWritePointer(y,outWritePointerRight,outPixelsToCopySSE,outPixelsToCopyNormal,0); if(outWritePointerRight) { getWritePointer(y,outWritePointerLeft,outPixelsToCopySSE,outPixelsToCopyNormal,1); } } void LineBufferTaskIIF::execute() { try { // // Uncompress the data, if necessary // if (_lineBuffer->uncompressedData == 0) { size_t uncompressedSize = 0; int maxY = min (_lineBuffer->maxY, _ifd->maxY); for (int i = _lineBuffer->minY - _ifd->minY; i <= maxY - _ifd->minY; ++i) { uncompressedSize += _ifd->bytesPerLine[i]; } if (_lineBuffer->compressor && static_cast(_lineBuffer->dataSize) < uncompressedSize) { _lineBuffer->format = _lineBuffer->compressor->format(); _lineBuffer->dataSize = _lineBuffer->compressor->uncompress (_lineBuffer->buffer, _lineBuffer->dataSize, _lineBuffer->minY, _lineBuffer->uncompressedData); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // _lineBuffer->format = Compressor::XDR; _lineBuffer->uncompressedData = _lineBuffer->buffer; } } int yStart, yStop, dy; if (_ifd->lineOrder == INCREASING_Y) { yStart = _scanLineMin; yStop = _scanLineMax + 1; dy = 1; } else { yStart = _scanLineMax; yStop = _scanLineMin - 1; dy = -1; } for (int y = yStart; y != yStop; y += dy) { if (modp (y, _optimizationMode._ySampling) != 0) continue; // // Convert one scan line's worth of pixel data back // from the machine-independent representation, and // store the result in the frame buffer. // // Set the readPtr to read at the start of uncompressedData // but with an offet based on calculated array. // _ifd->offsetInLineBuffer contains offsets based on which // line we are currently processing. // Stride will be taken into consideration later. const char* readPtr = _lineBuffer->uncompressedData + _ifd->offsetInLineBuffer[y - _ifd->minY]; size_t pixelsToCopySSE = 0; size_t pixelsToCopyNormal = 0; unsigned short* writePtrLeft = 0; unsigned short* writePtrRight = 0; size_t channels = _ifd->optimizationData.size(); if(channels>4) { getWritePointerStereo(y, writePtrRight, writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); } else { getWritePointer(y, writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); } if (writePtrRight == 0 && pixelsToCopySSE == 0 && pixelsToCopyNormal == 0) { continue; } // // support reading up to eight channels // unsigned short* readPointers[8]; for (size_t i = 0; i < channels ; ++i) { readPointers[i] = (unsigned short*)readPtr + (_ifd->optimizationData[i].offset * (pixelsToCopySSE * 8 + pixelsToCopyNormal)); } //RGB only if(channels==3 || channels == 6 ) { optimizedWriteToRGB(readPointers[0], readPointers[1], readPointers[2], writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); //stereo RGB if( channels == 6) { optimizedWriteToRGB(readPointers[3], readPointers[4], readPointers[5], writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); } //RGBA }else if(channels==4 || channels==8) { if(_ifd->optimizationData[3].fill) { optimizedWriteToRGBAFillA(readPointers[0], readPointers[1], readPointers[2], _ifd->optimizationData[3].fillValue.bits() , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); }else{ optimizedWriteToRGBA(readPointers[0], readPointers[1], readPointers[2], readPointers[3] , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); } //stereo RGBA if( channels == 8) { if(_ifd->optimizationData[7].fill) { optimizedWriteToRGBAFillA(readPointers[4], readPointers[5], readPointers[6], _ifd->optimizationData[7].fillValue.bits() , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); }else{ optimizedWriteToRGBA(readPointers[4], readPointers[5], readPointers[6], readPointers[7] , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); } } } else { throw(IEX_NAMESPACE::LogicExc("IIF mode called with incorrect channel pattern")); } // If we are in NO_OPTIMIZATION mode, this class will never // get instantiated, so no need to check for it and duplicate // the code. } } catch (std::exception &e) { if (!_lineBuffer->hasException) { _lineBuffer->exception = e.what(); _lineBuffer->hasException = true; } } catch (...) { if (!_lineBuffer->hasException) { _lineBuffer->exception = "unrecognized exception"; _lineBuffer->hasException = true; } } } #endif Task * newLineBufferTask (TaskGroup *group, InputStreamMutex *streamData, ScanLineInputFile::Data *ifd, int number, int scanLineMin, int scanLineMax, OptimizationMode optimizationMode) { // // Wait for a line buffer to become available, fill the line // buffer with raw data from the file if necessary, and create // a new LineBufferTask whose execute() method will uncompress // the contents of the buffer and copy the pixels into the // frame buffer. // LineBuffer *lineBuffer = ifd->getLineBuffer (number); try { lineBuffer->wait (); if (lineBuffer->number != number) { lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer; lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1; lineBuffer->number = number; lineBuffer->uncompressedData = 0; readPixelData (streamData, ifd, lineBuffer->minY, lineBuffer->buffer, lineBuffer->dataSize); } } catch (std::exception &e) { if (!lineBuffer->hasException) { lineBuffer->exception = e.what(); lineBuffer->hasException = true; } lineBuffer->number = -1; lineBuffer->post(); throw; } catch (...) { // // Reading from the file caused an exception. // Signal that the line buffer is free, and // re-throw the exception. // lineBuffer->exception = "unrecognized exception"; lineBuffer->hasException = true; lineBuffer->number = -1; lineBuffer->post(); throw; } scanLineMin = max (lineBuffer->minY, scanLineMin); scanLineMax = min (lineBuffer->maxY, scanLineMax); Task* retTask = 0; #ifdef IMF_HAVE_SSE2 if (optimizationMode._optimizable) { retTask = new LineBufferTaskIIF (group, ifd, lineBuffer, scanLineMin, scanLineMax, optimizationMode); } else #endif { retTask = new LineBufferTask (group, ifd, lineBuffer, scanLineMin, scanLineMax, optimizationMode); } return retTask; } } // namespace void ScanLineInputFile::initialize(const Header& header) { _data->header = header; _data->lineOrder = _data->header.lineOrder(); const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; size_t maxBytesPerLine = bytesPerLineTable (_data->header, _data->bytesPerLine); if(maxBytesPerLine > INT_MAX) { throw IEX_NAMESPACE::InputExc("maximum bytes per scanline exceeds maximum permissible size"); } for (size_t i = 0; i < _data->lineBuffers.size(); i++) { _data->lineBuffers[i] = new LineBuffer (newCompressor (_data->header.compression(), maxBytesPerLine, _data->header)); } _data->linesInBuffer = numLinesInBuffer (_data->lineBuffers[0]->compressor); _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; if (!_streamData->is->isMemoryMapped()) { for (size_t i = 0; i < _data->lineBuffers.size(); i++) { _data->lineBuffers[i]->buffer = (char *) EXRAllocAligned(_data->lineBufferSize*sizeof(char),16); if (!_data->lineBuffers[i]->buffer) { throw IEX_NAMESPACE::LogicExc("Failed to allocate memory for scanline buffers"); } } } _data->nextLineBufferMinY = _data->minY - 1; offsetInLineBufferTable (_data->bytesPerLine, _data->linesInBuffer, _data->offsetInLineBuffer); int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + _data->linesInBuffer) / _data->linesInBuffer; _data->lineOffsets.resize (lineOffsetSize); } ScanLineInputFile::ScanLineInputFile(InputPartData* part) { if (part->header.type() != SCANLINEIMAGE) throw IEX_NAMESPACE::ArgExc("Can't build a ScanLineInputFile from a type-mismatched part."); _data = new Data(part->numThreads); _streamData = part->mutex; _data->memoryMapped = _streamData->is->isMemoryMapped(); _data->version = part->version; try { initialize(part->header); } catch(...) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->lineBuffers.size(); i++) { if( _data->lineBuffers[i] ) { EXRFreeAligned(_data->lineBuffers[i]->buffer); _data->lineBuffers[i]->buffer=nullptr; } } } delete _data; throw; } _data->lineOffsets = part->chunkOffsets; _data->partNumber = part->partNumber; // // (TODO) change this code later. // The completeness of the file should be detected in MultiPartInputFile. // _data->fileIsComplete = true; } ScanLineInputFile::ScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int numThreads) : _data (new Data (numThreads)), _streamData (new InputStreamMutex()) { _streamData->is = is; _data->memoryMapped = is->isMemoryMapped(); try { initialize(header); // // (TODO) this is nasty - we need a better way of working out what type of file has been used. // in any case I believe this constructor only gets used with single part files // and 'version' currently only tracks multipart state, so setting to 0 (not multipart) works for us // _data->version=0; readLineOffsets (*_streamData->is, _data->lineOrder, _data->lineOffsets, _data->fileIsComplete); } catch(...) { if(_data) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->lineBuffers.size(); i++) { if( _data->lineBuffers[i] ) { EXRFreeAligned(_data->lineBuffers[i]->buffer); _data->lineBuffers[i]->buffer=nullptr; } } } } delete _streamData; delete _data; throw; } } ScanLineInputFile::~ScanLineInputFile () { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->lineBuffers.size(); i++) { EXRFreeAligned(_data->lineBuffers[i]->buffer); } } // // ScanLineInputFile should never delete the stream, // because it does not own the stream. // We just delete the Mutex here. // if (_data->partNumber == -1) delete _streamData; delete _data; } const char * ScanLineInputFile::fileName () const { return _streamData->is->fileName(); } const Header & ScanLineInputFile::header () const { return _data->header; } int ScanLineInputFile::version () const { return _data->version; } namespace { // returns the optimization state for the given arrangement of frame bufers // this assumes: // both the file and framebuffer are half float data // both the file and framebuffer have xSampling and ySampling=1 // entries in optData are sorted into their interleave order (i.e. by base address) // These tests are done by SetFrameBuffer as it is building optData // OptimizationMode detectOptimizationMode (const vector& optData) { OptimizationMode w; // need to be compiled with SSE optimisations: if not, just returns false #ifdef IMF_HAVE_SSE2 // only handle reading 3,4,6 or 8 channels switch(optData.size()) { case 3 : break; case 4 : break; case 6 : break; case 8 : break; default : return w; } // // the point at which data switches between the primary and secondary bank // size_t bankSize = optData.size()>4 ? optData.size()/2 : optData.size(); for(size_t i=0;iheader.channels(); for (FrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { ChannelList::ConstIterator i = channels.find (j.name()); if (i == channels.end()) continue; if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of input file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } // optimization is possible if this is a little endian system // and both inputs and outputs are half floats // bool optimizationPossible = true; if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) { optimizationPossible =false; } vector optData; // // Initialize the slice table for readPixels(). // vector slices; ChannelList::ConstIterator i = channels.begin(); // current offset of channel: pixel data starts at offset*width into the // decompressed scanline buffer size_t offset = 0; for (FrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { while (i != channels.end() && strcmp (i.name(), j.name()) < 0) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (InSliceInfo (i.channel().type, i.channel().type, 0, // base 0, // xStride 0, // yStride i.channel().xSampling, i.channel().ySampling, false, // fill true, // skip 0.0)); // fillValue switch(i.channel().type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : offset++; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : offset+=2; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : offset+=2; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::NUM_PIXELTYPES: default: // not possible. break; } // // optimization mode cannot currently skip subsampled channels // if (i.channel().xSampling!=1 || i.channel().ySampling!=1) { optimizationPossible = false; } ++i; } bool fill = false; if (i == channels.end() || strcmp (i.name(), j.name()) > 0) { // // Channel i is present in the frame buffer, but not in the file. // In the frame buffer, slice j will be filled with a default value. // fill = true; } slices.push_back (InSliceInfo (j.slice().type, fill? j.slice().type: i.channel().type, j.slice().base, j.slice().xStride, j.slice().yStride, j.slice().xSampling, j.slice().ySampling, fill, false, // skip j.slice().fillValue)); if(!fill && i.channel().type!=OPENEXR_IMF_INTERNAL_NAMESPACE::HALF) { optimizationPossible = false; } if(j.slice().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF) { optimizationPossible = false; } if(j.slice().xSampling!=1 || j.slice().ySampling!=1) { optimizationPossible = false; } if(optimizationPossible) { sliceOptimizationData dat; dat.base = j.slice().base; dat.fill = fill; dat.fillValue = j.slice().fillValue; dat.offset = offset; dat.xStride = j.slice().xStride; dat.yStride = j.slice().yStride; dat.xSampling = j.slice().xSampling; dat.ySampling = j.slice().ySampling; optData.push_back(dat); } if(!fill) { switch(i.channel().type) { case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : offset++; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : offset+=2; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : offset+=2; break; case OPENEXR_IMF_INTERNAL_NAMESPACE::NUM_PIXELTYPES: default: // not possible. break; } } if (i != channels.end() && !fill) ++i; } if(optimizationPossible) { // // check optimisibility // based on channel ordering and fill channel positions // sort(optData.begin(),optData.end()); _data->optimizationMode = detectOptimizationMode(optData); } if(!optimizationPossible || _data->optimizationMode._optimizable==false) { optData = vector(); _data->optimizationMode._optimizable=false; } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; _data->slices = slices; _data->optimizationData = optData; } const FrameBuffer & ScanLineInputFile::frameBuffer () const { Lock lock (*_streamData); return _data->frameBuffer; } bool ScanLineInputFile::isComplete () const { return _data->fileIsComplete; } bool ScanLineInputFile::isOptimizationEnabled() const { if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data destination."); return _data->optimizationMode._optimizable; } void ScanLineInputFile::readPixels (int scanLine1, int scanLine2) { try { Lock lock (*_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data destination."); int scanLineMin = min (scanLine1, scanLine2); int scanLineMax = max (scanLine1, scanLine2); if (scanLineMin < _data->minY || scanLineMax > _data->maxY) throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " "the image file's data window."); // // We impose a numbering scheme on the lineBuffers where the first // scanline is contained in lineBuffer 1. // // Determine the first and last lineBuffer numbers in this scanline // range. We always attempt to read the scanlines in the order that // they are stored in the file. // int start, stop, dl; if (_data->lineOrder == INCREASING_Y) { start = (scanLineMin - _data->minY) / _data->linesInBuffer; stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1; dl = 1; } else { start = (scanLineMax - _data->minY) / _data->linesInBuffer; stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1; dl = -1; } // // Create a task group for all line buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; // // Add the line buffer tasks. // // The tasks will execute in the order that they are created // because we lock the line buffers during construction and the // constructors are called by the main thread. Hence, in order // for a successive task to execute the previous task which // used that line buffer must have completed already. // for (int l = start; l != stop; l += dl) { ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup, _streamData, _data, l, scanLineMin, scanLineMax, _data->optimizationMode)); } // // finish all tasks // } // // Exeption handling: // // LineBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to ScanLineInputFile::readPixels(). // LineBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the line buffers. // Now we check if any line buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple line buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->lineBuffers.size(); ++i) { LineBuffer *lineBuffer = _data->lineBuffers[i]; if (lineBuffer->hasException && !exception) exception = &lineBuffer->exception; lineBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void ScanLineInputFile::readPixels (int scanLine) { readPixels (scanLine, scanLine); } void ScanLineInputFile::rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize) { try { Lock lock (*_streamData); if (firstScanLine < _data->minY || firstScanLine > _data->maxY) { throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " "the image file's data window."); } int minY = lineBufferMinY (firstScanLine, _data->minY, _data->linesInBuffer); readPixelData (_streamData, _data, minY, _data->lineBuffers[0]->buffer, pixelDataSize); pixelData = _data->lineBuffers[0]->buffer; } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void ScanLineInputFile::rawPixelDataToBuffer(int scanLine, char *pixelData, int &pixelDataSize) const { if (_data->memoryMapped) { throw IEX_NAMESPACE::ArgExc ("Reading raw pixel data to a buffer " "is not supported for memory mapped " "streams." ); } try { Lock lock (*_streamData); if (scanLine < _data->minY || scanLine > _data->maxY) { throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " "the image file's data window."); } readPixelData (_streamData, _data, scanLine, pixelData, pixelDataSize); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfScanLineInputFile.h000066400000000000000000000200461406177042200217700ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H #define INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H //----------------------------------------------------------------------------- // // class ScanLineInputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImfThreading.h" #include "ImfInputStreamMutex.h" #include "ImfInputPartData.h" #include "ImfGenericInputFile.h" #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class ScanLineInputFile : public GenericInputFile { public: //------------ // Constructor //------------ IMF_EXPORT ScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int numThreads = globalThreadCount()); //----------------------------------------- // Destructor -- deallocates internal data // structures, but does not close the file. //----------------------------------------- IMF_EXPORT virtual ~ScanLineInputFile (); ScanLineInputFile (const ScanLineInputFile& other) = delete; ScanLineInputFile& operator = (const ScanLineInputFile& other) = delete; ScanLineInputFile (ScanLineInputFile&& other) = delete; ScanLineInputFile& operator = (ScanLineInputFile&& other) = delete; //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the InputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readPixels() is called. // The current frame buffer can be changed after each call // to readPixels(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const FrameBuffer & frameBuffer () const; //--------------------------------------------------------------- // Check if the file is complete: // // isComplete() returns true if all pixels in the data window are // present in the input file, or false if any pixels are missing. // (Another program may still be busy writing the file, or file // writing may have been aborted prematurely.) //--------------------------------------------------------------- IMF_EXPORT bool isComplete () const; //--------------------------------------------------------------- // Check if SSE optimisation is enabled // // Call after setFrameBuffer() to query whether optimised file decoding // is available - decode times will be faster if returns true // // Optimisation depends on the framebuffer channels and channel types // as well as the file/part channels and channel types, as well as // whether SSE2 instruction support was detected at compile time // // Calling before setFrameBuffer will throw an exception // //--------------------------------------------------------------- IMF_EXPORT bool isOptimizationEnabled () const; //--------------------------------------------------------------- // Read pixel data: // // readPixels(s1,s2) reads all scan lines with y coordinates // in the interval [min (s1, s2), max (s1, s2)] from the file, // and stores them in the current frame buffer. // // Both s1 and s2 must be within the interval // [header().dataWindow().min.y, header.dataWindow().max.y] // // The scan lines can be read from the file in random order, and // individual scan lines may be skipped or read multiple times. // For maximum efficiency, the scan lines should be read in the // order in which they were written to the file. // // readPixels(s) calls readPixels(s,s). // // If threading is enabled, readPixels (s1, s2) tries to perform // decopmression of multiple scanlines in parallel. // //--------------------------------------------------------------- IMF_EXPORT void readPixels (int scanLine1, int scanLine2); IMF_EXPORT void readPixels (int scanLine); //---------------------------------------------- // Read a block of raw pixel data from the file, // without uncompressing it (this function is // used to implement OutputFile::copyPixels()). //---------------------------------------------- IMF_EXPORT void rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize); //---------------------------------------------- // Read a scanline's worth of raw pixel data // from the file, without uncompressing it, and // store in an external buffer, pixelData. // pixelData should be pre-allocated with space // for pixelDataSize chars. // // This function can be used to separate the // reading of a raw scan line from the // decompression of that scan line, for // example to allow multiple scan lines to be // decompressed in parallel by an application's // own threads, where it is not convenient to // use the threading within the library. //---------------------------------------------- IMF_EXPORT void rawPixelDataToBuffer(int scanLine, char *pixelData, int &pixelDataSize) const; struct Data; private: Data * _data; InputStreamMutex* _streamData; ScanLineInputFile (InputPartData* part); void initialize(const Header& header); friend class MultiPartInputFile; friend class InputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfSimd.h000066400000000000000000000046731406177042200173600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Autodesk, Inc. // // All rights reserved. // // Implementation of IIF-specific file format and speed optimizations // provided by Innobec Technologies inc on behalf of Autodesk. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_SIMD_H #define INCLUDED_IMF_SIMD_H // // Compile time SSE detection: // IMF_HAVE_SSE2 - Defined if it's safe to compile SSE2 optimizations // IMF_HAVE_SSE4_1 - Defined if it's safe to compile SSE4.1 optimizations // // GCC and Visual Studio SSE2 compiler flags #if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) #define IMF_HAVE_SSE2 1 #endif #if defined __SSE4_1__ #define IMF_HAVE_SSE4_1 1 #endif extern "C" { #ifdef IMF_HAVE_SSE2 #include #include #endif #ifdef IMF_HAVE_SSE4_1 #include #endif } #endif openexr-2.5.7/OpenEXR/IlmImf/ImfStandardAttributes.cpp000066400000000000000000000120101406177042200226060ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Optional Standard Attributes // //----------------------------------------------------------------------------- #include #define IMF_STRING(name) #name #define IMF_STD_ATTRIBUTE_IMP(name,suffix,type) \ \ void \ IMF_ADD_SUFFIX(suffix) (Header &header, const type &value) \ { \ header.insert (IMF_STRING (name), TypedAttribute (value)); \ } \ \ bool \ IMF_HAS_SUFFIX(suffix) (const Header &header) \ { \ return header.findTypedAttribute > \ (IMF_STRING (name)) != 0; \ } \ \ const TypedAttribute & \ IMF_NAME_ATTRIBUTE(name) (const Header &header) \ { \ return header.typedAttribute > \ (IMF_STRING (name)); \ } \ \ TypedAttribute & \ IMF_NAME_ATTRIBUTE(name) (Header &header) \ { \ return header.typedAttribute > \ (IMF_STRING (name)); \ } \ \ const type & \ name (const Header &header) \ { \ return IMF_NAME_ATTRIBUTE(name) (header).value(); \ } \ \ type & \ name (Header &header) \ { \ return IMF_NAME_ATTRIBUTE(name) (header).value(); \ } #include "ImfNamespace.h" using namespace IMATH_NAMESPACE; using namespace std; OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER IMF_STD_ATTRIBUTE_IMP (chromaticities, Chromaticities, Chromaticities) IMF_STD_ATTRIBUTE_IMP (whiteLuminance, WhiteLuminance, float) IMF_STD_ATTRIBUTE_IMP (adoptedNeutral, AdoptedNeutral, V2f) IMF_STD_ATTRIBUTE_IMP (renderingTransform, RenderingTransform, string) IMF_STD_ATTRIBUTE_IMP (lookModTransform, LookModTransform, string) IMF_STD_ATTRIBUTE_IMP (xDensity, XDensity, float) IMF_STD_ATTRIBUTE_IMP (owner, Owner, string) IMF_STD_ATTRIBUTE_IMP (comments, Comments, string) IMF_STD_ATTRIBUTE_IMP (capDate, CapDate, string) IMF_STD_ATTRIBUTE_IMP (utcOffset, UtcOffset, float) IMF_STD_ATTRIBUTE_IMP (longitude, Longitude, float) IMF_STD_ATTRIBUTE_IMP (latitude, Latitude, float) IMF_STD_ATTRIBUTE_IMP (altitude, Altitude, float) IMF_STD_ATTRIBUTE_IMP (focus, Focus, float) IMF_STD_ATTRIBUTE_IMP (expTime, ExpTime, float) IMF_STD_ATTRIBUTE_IMP (aperture, Aperture, float) IMF_STD_ATTRIBUTE_IMP (isoSpeed, IsoSpeed, float) IMF_STD_ATTRIBUTE_IMP (envmap, Envmap, Envmap) IMF_STD_ATTRIBUTE_IMP (keyCode, KeyCode, KeyCode) IMF_STD_ATTRIBUTE_IMP (timeCode, TimeCode, TimeCode) IMF_STD_ATTRIBUTE_IMP (wrapmodes, Wrapmodes, string) IMF_STD_ATTRIBUTE_IMP (framesPerSecond, FramesPerSecond, Rational) IMF_STD_ATTRIBUTE_IMP (multiView, MultiView, StringVector) IMF_STD_ATTRIBUTE_IMP (worldToCamera, WorldToCamera, M44f) IMF_STD_ATTRIBUTE_IMP (worldToNDC, WorldToNDC, M44f) IMF_STD_ATTRIBUTE_IMP (deepImageState, DeepImageState, DeepImageState) IMF_STD_ATTRIBUTE_IMP (originalDataWindow, OriginalDataWindow, Box2i) IMF_STD_ATTRIBUTE_IMP (dwaCompressionLevel, DwaCompressionLevel, float) OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfStandardAttributes.h000066400000000000000000000326461406177042200222740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_STANDARD_ATTRIBUTES_H #define INCLUDED_IMF_STANDARD_ATTRIBUTES_H //----------------------------------------------------------------------------- // // Optional Standard Attributes -- these attributes are "optional" // because not every image file header has them, but they define a // "standard" way to represent commonly used data in the file header. // // For each attribute, with name "foo", and type "T", the following // functions are automatically generated via macros: // // void addFoo (Header &header, const T &value); // bool hasFoo (const Header &header); // const TypedAttribute & fooAttribute (const Header &header); // TypedAttribute & fooAttribute (Header &header); // const T & foo (const Header &Header); // T & foo (Header &Header); // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfBoxAttribute.h" #include "ImfChromaticitiesAttribute.h" #include "ImfEnvmapAttribute.h" #include "ImfDeepImageStateAttribute.h" #include "ImfFloatAttribute.h" #include "ImfKeyCodeAttribute.h" #include "ImfMatrixAttribute.h" #include "ImfRationalAttribute.h" #include "ImfStringAttribute.h" #include "ImfStringVectorAttribute.h" #include "ImfTimeCodeAttribute.h" #include "ImfVecAttribute.h" #include "ImfNamespace.h" #include "ImfExport.h" #define IMF_ADD_SUFFIX(suffix) add##suffix #define IMF_HAS_SUFFIX(suffix) has##suffix #define IMF_NAME_ATTRIBUTE(name) name##Attribute #define IMF_STD_ATTRIBUTE_DEF(name,suffix,object) \ \ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER \ IMF_EXPORT void IMF_ADD_SUFFIX(suffix) (Header &header, const object &v); \ IMF_EXPORT bool IMF_HAS_SUFFIX(suffix) (const Header &header); \ IMF_EXPORT const TypedAttribute & \ IMF_NAME_ATTRIBUTE(name) (const Header &header); \ IMF_EXPORT TypedAttribute & \ IMF_NAME_ATTRIBUTE(name) (Header &header); \ IMF_EXPORT const object & \ name (const Header &header); \ IMF_EXPORT object & name (Header &header); \ OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT \ // // chromaticities -- for RGB images, specifies the CIE (x,y) // chromaticities of the primaries and the white point // IMF_STD_ATTRIBUTE_DEF (chromaticities, Chromaticities, Chromaticities) // // whiteLuminance -- for RGB images, defines the luminance, in Nits // (candelas per square meter) of the RGB value (1.0, 1.0, 1.0). // // If the chromaticities and the whiteLuminance of an RGB image are // known, then it is possible to convert the image's pixels from RGB // to CIE XYZ tristimulus values (see function RGBtoXYZ() in header // file ImfChromaticities.h). // // IMF_STD_ATTRIBUTE_DEF (whiteLuminance, WhiteLuminance, float) // // adoptedNeutral -- specifies the CIE (x,y) coordinates that should // be considered neutral during color rendering. Pixels in the image // file whose (x,y) coordinates match the adoptedNeutral value should // be mapped to neutral values on the display. // IMF_STD_ATTRIBUTE_DEF (adoptedNeutral, AdoptedNeutral, IMATH_NAMESPACE::V2f) // // renderingTransform, lookModTransform -- specify the names of the // CTL functions that implements the intended color rendering and look // modification transforms for this image. // IMF_STD_ATTRIBUTE_DEF (renderingTransform, RenderingTransform, std::string) IMF_STD_ATTRIBUTE_DEF (lookModTransform, LookModTransform, std::string) // // xDensity -- horizontal output density, in pixels per inch. // The image's vertical output density is xDensity * pixelAspectRatio. // IMF_STD_ATTRIBUTE_DEF (xDensity, XDensity, float) // // owner -- name of the owner of the image // IMF_STD_ATTRIBUTE_DEF (owner, Owner, std::string) // // comments -- additional image information in human-readable // form, for example a verbal description of the image // IMF_STD_ATTRIBUTE_DEF (comments, Comments, std::string) // // capDate -- the date when the image was created or captured, // in local time, and formatted as // // YYYY:MM:DD hh:mm:ss // // where YYYY is the year (4 digits, e.g. 2003), MM is the month // (2 digits, 01, 02, ... 12), DD is the day of the month (2 digits, // 01, 02, ... 31), hh is the hour (2 digits, 00, 01, ... 23), mm // is the minute, and ss is the second (2 digits, 00, 01, ... 59). // // IMF_STD_ATTRIBUTE_DEF (capDate, CapDate, std::string) // // utcOffset -- offset of local time at capDate from // Universal Coordinated Time (UTC), in seconds: // // UTC == local time + utcOffset // IMF_STD_ATTRIBUTE_DEF (utcOffset, UtcOffset, float) // // longitude, latitude, altitude -- for images of real objects, the // location where the image was recorded. Longitude and latitude are // in degrees east of Greenwich and north of the equator. Altitude // is in meters above sea level. For example, Kathmandu, Nepal is // at longitude 85.317, latitude 27.717, altitude 1305. // IMF_STD_ATTRIBUTE_DEF (longitude, Longitude, float) IMF_STD_ATTRIBUTE_DEF (latitude, Latitude, float) IMF_STD_ATTRIBUTE_DEF (altitude, Altitude, float) // // focus -- the camera's focus distance, in meters // IMF_STD_ATTRIBUTE_DEF (focus, Focus, float) // // exposure -- exposure time, in seconds // IMF_STD_ATTRIBUTE_DEF (expTime, ExpTime, float) // // aperture -- the camera's lens aperture, in f-stops (focal length // of the lens divided by the diameter of the iris opening) // IMF_STD_ATTRIBUTE_DEF (aperture, Aperture, float) // // isoSpeed -- the ISO speed of the film or image sensor // that was used to record the image // IMF_STD_ATTRIBUTE_DEF (isoSpeed, IsoSpeed, float) // // envmap -- if this attribute is present, the image represents // an environment map. The attribute's value defines how 3D // directions are mapped to 2D pixel locations. For details // see header file ImfEnvmap.h // IMF_STD_ATTRIBUTE_DEF (envmap, Envmap, Envmap) // // keyCode -- for motion picture film frames. Identifies film // manufacturer, film type, film roll and frame position within // the roll. // IMF_STD_ATTRIBUTE_DEF (keyCode, KeyCode, KeyCode) // // timeCode -- time and control code // IMF_STD_ATTRIBUTE_DEF (timeCode, TimeCode, TimeCode) // // wrapmodes -- determines how texture map images are extrapolated. // If an OpenEXR file is used as a texture map for 3D rendering, // texture coordinates (0.0, 0.0) and (1.0, 1.0) correspond to // the upper left and lower right corners of the data window. // If the image is mapped onto a surface with texture coordinates // outside the zero-to-one range, then the image must be extrapolated. // This attribute tells the renderer how to do this extrapolation. // The attribute contains either a pair of comma-separated keywords, // to specify separate extrapolation modes for the horizontal and // vertical directions; or a single keyword, to specify extrapolation // in both directions (e.g. "clamp,periodic" or "clamp"). Extra white // space surrounding the keywords is allowed, but should be ignored // by the renderer ("clamp, black " is equivalent to "clamp,black"). // The keywords listed below are predefined; some renderers may support // additional extrapolation modes: // // black pixels outside the zero-to-one range are black // // clamp texture coordinates less than 0.0 and greater // than 1.0 are clamped to 0.0 and 1.0 respectively // // periodic the texture image repeats periodically // // mirror the texture image repeats periodically, but // every other instance is mirrored // IMF_STD_ATTRIBUTE_DEF (wrapmodes, Wrapmodes, std::string) // // framesPerSecond -- defines the nominal playback frame rate for image // sequences, in frames per second. Every image in a sequence should // have a framesPerSecond attribute, and the attribute value should be // the same for all images in the sequence. If an image sequence has // no framesPerSecond attribute, playback software should assume that // the frame rate for the sequence is 24 frames per second. // // In order to allow exact representation of NTSC frame and field rates, // framesPerSecond is stored as a rational number. A rational number is // a pair of integers, n and d, that represents the value n/d. // // For the exact values of commonly used frame rates, please see header // file ImfFramesPerSecond.h. // IMF_STD_ATTRIBUTE_DEF (framesPerSecond, FramesPerSecond, Rational) // // multiView -- defines the view names for multi-view image files. // A multi-view image contains two or more views of the same scene, // as seen from different viewpoints, for example a left-eye and // a right-eye view for stereo displays. The multiView attribute // lists the names of the views in an image, and a naming convention // identifies the channels that belong to each view. // // For details, please see header file ImfMultiView.h // IMF_STD_ATTRIBUTE_DEF (multiView , MultiView, StringVector) // // worldToCamera -- for images generated by 3D computer graphics rendering, // a matrix that transforms 3D points from the world to the camera coordinate // space of the renderer. // // The camera coordinate space is left-handed. Its origin indicates the // location of the camera. The positive x and y axes correspond to the // "right" and "up" directions in the rendered image. The positive z // axis indicates the camera's viewing direction. (Objects in front of // the camera have positive z coordinates.) // // Camera coordinate space in OpenEXR is the same as in Pixar's Renderman. // IMF_STD_ATTRIBUTE_DEF (worldToCamera, WorldToCamera, IMATH_NAMESPACE::M44f) // // worldToNDC -- for images generated by 3D computer graphics rendering, a // matrix that transforms 3D points from the world to the Normalized Device // Coordinate (NDC) space of the renderer. // // NDC is a 2D coordinate space that corresponds to the image plane, with // positive x and pointing to the right and y positive pointing down. The // coordinates (0, 0) and (1, 1) correspond to the upper left and lower right // corners of the OpenEXR display window. // // To transform a 3D point in word space into a 2D point in NDC space, // multiply the 3D point by the worldToNDC matrix and discard the z // coordinate. // // NDC space in OpenEXR is the same as in Pixar's Renderman. // IMF_STD_ATTRIBUTE_DEF (worldToNDC, WorldToNDC, IMATH_NAMESPACE::M44f) // // deepImageState -- specifies whether the pixels in a deep image are // sorted and non-overlapping. // // Note: this attribute can be set by application code that writes a file // in order to tell applications that read the file whether the pixel data // must be cleaned up prior to image processing operations such as flattening. // The IlmImf library does not verify that the attribute is consistent with // the actual state of the pixels. Application software may assume that the // attribute is valid, as long as the software will not crash or lock up if // any pixels are inconsistent with the deepImageState attribute. // IMF_STD_ATTRIBUTE_DEF (deepImageState, DeepImageState, DeepImageState) // // originalDataWindow -- if application software crops an image, then it // should save the data window of the original, un-cropped image in the // originalDataWindow attribute. // IMF_STD_ATTRIBUTE_DEF (originalDataWindow, OriginalDataWindow, IMATH_NAMESPACE::Box2i) // // dwaCompressionLevel -- sets the quality level for images compressed // with the DWAA or DWAB method. // IMF_STD_ATTRIBUTE_DEF (dwaCompressionLevel, DwaCompressionLevel, float) #endif openexr-2.5.7/OpenEXR/IlmImf/ImfStdIO.cpp000066400000000000000000000225411406177042200177730ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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.67 // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Low-level file input and output for OpenEXR // based on C++ standard iostreams. // //----------------------------------------------------------------------------- #include #include "Iex.h" #include #ifdef _WIN32 # define VC_EXTRALEAN # include # include # include # include # include # include # include # include # include #endif using namespace std; #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { #ifdef _WIN32 wstring WidenFilename (const char *filename) { wstring ret; int fnlen = static_cast( strlen(filename) ); int len = MultiByteToWideChar(CP_UTF8, 0, filename, fnlen, NULL, 0 ); if (len > 0) { ret.resize(len); MultiByteToWideChar(CP_UTF8, 0, filename, fnlen, &ret[0], len); } return ret; } # if defined(__GLIBCXX__) && !(defined(_GLIBCXX_HAVE_WFOPEN) && defined(_GLIBCXX_USE_WCHAR_T)) # define USE_CUSTOM_WIDE_OPEN 1 # endif # ifdef USE_CUSTOM_WIDE_OPEN template class InjectFilebuf : public basic_filebuf { public: using base_filebuf = basic_filebuf; inline base_filebuf* wide_open (int fd, ios_base::openmode m) { // sys_open will do an fdopen internally which will then clean up the fd upon close this->_M_file.sys_open (fd, m); if (this->is_open ()) { // reset the internal state, these members are consistent between gcc versions 4.3 - 9 // but at 9, the wfopen stuff should become available, such that this will no longer be // active this->_M_allocate_internal_buffer (); this->_M_mode = m; this->_M_reading = false; this->_M_writing = false; this->_M_set_buffer (-1); this->_M_state_last = this->_M_state_cur = this->_M_state_beg; // we don't ever seek to end or anything, so should be done at this point... return this; } return nullptr; } }; # endif // USE_CUSTOM_WIDE_OPEN ifstream* make_ifstream (const char *filename) { wstring wfn = WidenFilename (filename); # ifdef USE_CUSTOM_WIDE_OPEN int fd; errno_t e = _wsopen_s ( &fd, wfn.c_str (), _O_RDONLY|_O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE); if (e != 0) { char errbuf[4096]; strerror_s (errbuf, 4096, e); errno = e; throw IEX_NAMESPACE::ErrnoExc ( "Unable to open input filestream: " + std::string (errbuf)); } ifstream* ret = new ifstream; using CharT = ifstream::char_type; using TraitsT = ifstream::traits_type; if (static_cast*> (ret->rdbuf ()) ->wide_open (fd, ios_base::in | ios_base::binary)) { ret->clear(); ret->setstate(ios_base::goodbit); } # else ifstream* ret = new ifstream(wfn.c_str (), ios_base::in | ios_base::binary); # endif return ret; } ofstream* make_ofstream (const char* filename) { wstring wfn = WidenFilename (filename); # ifdef USE_CUSTOM_WIDE_OPEN int fd; errno_t e = _wsopen_s ( &fd, wfn.c_str (), _O_WRONLY | _O_CREAT | _O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE); if (e != 0) { char errbuf[4096]; strerror_s (errbuf, 4096, e); errno = e; throw IEX_NAMESPACE::ErrnoExc ( "Unable to open output filestream: " + std::string(errbuf)); } ofstream* ret = new ofstream; using CharT = ifstream::char_type; using TraitsT = ifstream::traits_type; if (static_cast*> (ret->rdbuf ()) ->wide_open (fd, ios_base::out | ios_base::binary)) { ret->clear (); ret->setstate (ios_base::goodbit); } # else ofstream *ret = new ofstream (wfn.c_str (), ios_base::binary); # endif return ret; } #else ifstream* make_ifstream (const char* filename) { return new ifstream (filename, ios_base::binary); } inline ofstream* make_ofstream (const char* filename) { return new ofstream (filename, ios_base::binary); } #endif void clearError () { errno = 0; } bool checkError (istream &is, streamsize expected = 0) { if (!is) { if (errno) IEX_NAMESPACE::throwErrnoExc(); if (is.gcount() < expected) { THROW (IEX_NAMESPACE::InputExc, "Early end of file: read " << is.gcount() << " out of " << expected << " requested bytes."); } return false; } return true; } void checkError (ostream &os) { if (!os) { if (errno) IEX_NAMESPACE::throwErrnoExc(); throw IEX_NAMESPACE::ErrnoExc ("File output failed."); } } } // namespace StdIFStream::StdIFStream (const char fileName[]): OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName), _is (make_ifstream (fileName)), _deleteStream (true) { if (!*_is) { delete _is; IEX_NAMESPACE::throwErrnoExc(); } } StdIFStream::StdIFStream (ifstream &is, const char fileName[]): OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName), _is (&is), _deleteStream (false) { // empty } StdIFStream::~StdIFStream () { if (_deleteStream) delete _is; } bool StdIFStream::read (char c[/*n*/], int n) { if (!*_is) throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); clearError(); _is->read (c, n); return checkError (*_is, n); } Int64 StdIFStream::tellg () { return std::streamoff (_is->tellg()); } void StdIFStream::seekg (Int64 pos) { _is->seekg (pos); checkError (*_is); } void StdIFStream::clear () { _is->clear(); } StdISStream::StdISStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::IStream ("(string)") { // empty } bool StdISStream::read (char c[/*n*/], int n) { if (!_is) throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); clearError(); _is.read (c, n); return checkError (_is, n); } Int64 StdISStream::tellg () { return std::streamoff (_is.tellg()); } void StdISStream::seekg (Int64 pos) { _is.seekg (pos); checkError (_is); } void StdISStream::clear () { _is.clear(); } std::string StdISStream::str () const { return _is.str (); } void StdISStream::str (const std::string &s) { _is.str(s); } StdOFStream::StdOFStream (const char fileName[]) : OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName) , _os (make_ofstream (fileName)) , _deleteStream (true) { if (!*_os) { delete _os; IEX_NAMESPACE::throwErrnoExc(); } } StdOFStream::StdOFStream (ofstream &os, const char fileName[]): OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName), _os (&os), _deleteStream (false) { // empty } StdOFStream::~StdOFStream () { if (_deleteStream) delete _os; } void StdOFStream::write (const char c[/*n*/], int n) { clearError(); _os->write (c, n); checkError (*_os); } Int64 StdOFStream::tellp () { return std::streamoff (_os->tellp()); } void StdOFStream::seekp (Int64 pos) { _os->seekp (pos); checkError (*_os); } StdOSStream::StdOSStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::OStream ("(string)") { // empty } void StdOSStream::write (const char c[/*n*/], int n) { clearError(); _os.write (c, n); checkError (_os); } Int64 StdOSStream::tellp () { return std::streamoff (_os.tellp()); } void StdOSStream::seekp (Int64 pos) { _os.seekp (pos); checkError (_os); } std::string StdOSStream::str () const { return _os.str (); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfStdIO.h000066400000000000000000000137651406177042200174500ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_STD_IO_H #define INCLUDED_IMF_STD_IO_H //----------------------------------------------------------------------------- // // Low-level file input and output for OpenEXR // based on C++ standard iostreams. // //----------------------------------------------------------------------------- #include "ImfIO.h" #include "ImfNamespace.h" #include "ImfExport.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------- // class StdIFStream -- an implementation of // class OPENEXR_IMF_INTERNAL_NAMESPACE::IStream based on class std::ifstream //------------------------------------------- class StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: //------------------------------------------------------- // A constructor that opens the file with the given name. // The destructor will close the file. //------------------------------------------------------- IMF_EXPORT StdIFStream (const char fileName[]); //--------------------------------------------------------- // A constructor that uses a std::ifstream that has already // been opened by the caller. The StdIFStream's destructor // will not close the std::ifstream. //--------------------------------------------------------- IMF_EXPORT StdIFStream (std::ifstream &is, const char fileName[]); IMF_EXPORT virtual ~StdIFStream (); IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual Int64 tellg (); IMF_EXPORT virtual void seekg (Int64 pos); IMF_EXPORT virtual void clear (); private: std::ifstream * _is; bool _deleteStream; }; //------------------------------------------------ // class StdISStream -- an implementation of class // OPENEXR_IMF_INTERNAL_NAMESPACE::IStream, based on class std::istringstream //------------------------------------------------ class StdISStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream { public: IMF_EXPORT StdISStream (); IMF_EXPORT virtual bool read (char c[/*n*/], int n); IMF_EXPORT virtual Int64 tellg (); IMF_EXPORT virtual void seekg (Int64 pos); IMF_EXPORT virtual void clear (); IMF_EXPORT std::string str () const; IMF_EXPORT void str (const std::string &s); private: std::istringstream _is; }; //------------------------------------------- // class StdOFStream -- an implementation of // class OPENEXR_IMF_INTERNAL_NAMESPACE::OStream based on class std::ofstream //------------------------------------------- class StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: //------------------------------------------------------- // A constructor that opens the file with the given name. // The destructor will close the file. //------------------------------------------------------- IMF_EXPORT StdOFStream (const char fileName[]); //--------------------------------------------------------- // A constructor that uses a std::ofstream that has already // been opened by the caller. The StdOFStream's destructor // will not close the std::ofstream. //--------------------------------------------------------- IMF_EXPORT StdOFStream (std::ofstream &os, const char fileName[]); IMF_EXPORT virtual ~StdOFStream (); IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual Int64 tellp (); IMF_EXPORT virtual void seekp (Int64 pos); private: std::ofstream * _os; bool _deleteStream; }; //------------------------------------------------ // class StdOSStream -- an implementation of class // OPENEXR_IMF_INTERNAL_NAMESPACE::OStream, based on class std::ostringstream //------------------------------------------------ class StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream { public: IMF_EXPORT StdOSStream (); IMF_EXPORT virtual void write (const char c[/*n*/], int n); IMF_EXPORT virtual Int64 tellp (); IMF_EXPORT virtual void seekp (Int64 pos); IMF_EXPORT std::string str () const; private: std::ostringstream _os; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfStringAttribute.cpp000066400000000000000000000052111406177042200221360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class StringAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * StringAttribute::staticTypeName () { return "string"; } template <> void StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { int size = _value.size(); for (int i = 0; i < size; i++) Xdr::write (os, _value[i]); } template <> void StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { _value.resize (size); for (int i = 0; i < size; i++) Xdr::read (is, _value[i]); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfStringAttribute.h000066400000000000000000000051231406177042200216050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_STRING_ATTRIBUTE_H #define INCLUDED_IMF_STRING_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class StringAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute StringAttribute; template <> IMF_EXPORT const char *StringAttribute::staticTypeName (); template <> IMF_EXPORT void StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp000066400000000000000000000064001406177042200233220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class StringVectorAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * StringVectorAttribute::staticTypeName () { return "stringvector"; } template <> void StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { int size = _value.size(); for (int i = 0; i < size; i++) { int strSize = _value[i].size(); Xdr::write (os, strSize); Xdr::write (os, &_value[i][0], strSize); } } template <> void StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { int read = 0; while (read < size) { int strSize; Xdr::read (is, strSize); read += Xdr::size(); // check there is enough space remaining in attribute to // contain claimed string length if( strSize < 0 || strSize > size - read) { throw IEX_NAMESPACE::InputExc("Invalid size field reading stringvector attribute"); } std::string str; str.resize (strSize); if( strSize>0 ) { Xdr::read (is, &str[0], strSize); } read += strSize; _value.push_back (str); } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfStringVectorAttribute.h000066400000000000000000000053111406177042200227670ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Weta Digital 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H #define INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class StringVectorAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfNamespace.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef std::vector StringVector; typedef TypedAttribute StringVectorAttribute; template <> IMF_EXPORT const char *StringVectorAttribute::staticTypeName (); template <> IMF_EXPORT void StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfSystemSpecific.cpp000066400000000000000000000075541406177042200217520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfSimd.h" #include "ImfSystemSpecific.h" #include "ImfNamespace.h" #include "OpenEXRConfig.h" #include "OpenEXRConfigInternal.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { #if defined(IMF_HAVE_SSE2) && defined(__GNUC__) // Helper functions for gcc + SSE enabled void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx) { __asm__ __volatile__ ( "cpuid" : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : /* Input */ "a"(n) : /* Clobber */); } #else // IMF_HAVE_SSE2 && __GNUC__ // Helper functions for generic compiler - all disabled void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx) { eax = ebx = ecx = edx = 0; } #endif // IMF_HAVE_SSE2 && __GNUC__ #ifdef IMF_HAVE_GCC_INLINEASM_X86 void xgetbv(int n, int &eax, int &edx) { __asm__ __volatile__ ( "xgetbv" : /* Output */ "=a"(eax), "=d"(edx) : /* Input */ "c"(n) : /* Clobber */); } #else // IMF_HAVE_GCC_INLINEASM_X86 void xgetbv(int n, int &eax, int &edx) { eax = edx = 0; } #endif // IMF_HAVE_GCC_INLINEASM_X86 } // namespace CpuId::CpuId(): sse2(false), sse3(false), ssse3(false), sse4_1(false), sse4_2(false), avx(false), f16c(false) { bool osxsave = false; int max = 0; int eax, ebx, ecx, edx; cpuid(0, max, ebx, ecx, edx); if (max > 0) { cpuid(1, eax, ebx, ecx, edx); sse2 = ( edx & (1<<26) ); sse3 = ( ecx & (1<< 0) ); ssse3 = ( ecx & (1<< 9) ); sse4_1 = ( ecx & (1<<19) ); sse4_2 = ( ecx & (1<<20) ); osxsave = ( ecx & (1<<27) ); avx = ( ecx & (1<<28) ); f16c = ( ecx & (1<<29) ); if (!osxsave) { avx = f16c = false; } else { xgetbv(0, eax, edx); // eax bit 1 - SSE managed, bit 2 - AVX managed if ((eax & 6) != 6) { avx = f16c = false; } } } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfSystemSpecific.h000066400000000000000000000105371406177042200214120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_COMPILER_SPECIFIC_H #define INCLUDED_IMF_COMPILER_SPECIFIC_H #include "ImfNamespace.h" #include "ImfSimd.h" #include #include "ImfExport.h" #include "OpenEXRConfig.h" #include "OpenEXRConfigInternal.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Test if we should enable GCC inline asm paths for AVX // #if defined(OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX) && (defined(_M_X64) || defined(__x86_64__)) #define IMF_HAVE_GCC_INLINEASM_X86 #ifdef __LP64__ #define IMF_HAVE_GCC_INLINEASM_X86_64 #endif /* __LP64__ */ #endif /* OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX */ static unsigned long systemEndianCheckValue = 0x12345678; static unsigned long* systemEndianCheckPointer = &systemEndianCheckValue; // EXR files are little endian - check processor architecture is too // (optimisation currently not supported for big endian machines) static bool GLOBAL_SYSTEM_LITTLE_ENDIAN = (*(unsigned char*)systemEndianCheckPointer == 0x78 ? true : false); inline void* EXRAllocAligned (size_t size, size_t alignment) { // GNUC is used for things like mingw to (cross-)compile for windows #ifdef _WIN32 return _aligned_malloc (size, alignment); #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) return _mm_malloc (size, alignment); #elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) void* ptr = 0; // With fortify_source on, just doing the (void) cast trick // doesn't remove the unused result warning but we expect the // other mallocs to return null and to check the return value // of this function if ( posix_memalign (&ptr, alignment, size) ) ptr = 0; return ptr; #else return malloc(size); #endif } inline void EXRFreeAligned (void* ptr) { #ifdef _WIN32 _aligned_free (ptr); #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || \ defined(__ECC) _mm_free (ptr); #else free (ptr); #endif } #if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) // Causes issues on certain gcc versions //#define EXR_FORCEINLINE inline __attribute__((always_inline)) #define EXR_FORCEINLINE inline #define EXR_RESTRICT __restrict #else // generic compiler #define EXR_FORCEINLINE inline #define EXR_RESTRICT #endif // // Simple CPUID based runtime detection of various capabilities // class IMF_EXPORT CpuId { public: CpuId(); bool sse2; bool sse3; bool ssse3; bool sse4_1; bool sse4_2; bool avx; bool f16c; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif //include guard openexr-2.5.7/OpenEXR/IlmImf/ImfTestFile.cpp000066400000000000000000000121501406177042200205230ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Utility routines to test quickly if a given // file is an OpenEXR file, and whether the // file is scanline-based or tiled. // //----------------------------------------------------------------------------- #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER bool isOpenExrFile (const char fileName[], bool &tiled, bool &deep, bool &multiPart) { try { StdIFStream is (fileName); int magic, version; Xdr::read (is, magic); Xdr::read (is, version); tiled = isTiled (version); deep = isNonImage (version); multiPart = isMultiPart (version); return magic == MAGIC; } catch (...) { tiled = false; return false; } } bool isOpenExrFile (const char fileName[], bool &tiled, bool &deep) { bool multiPart; return isOpenExrFile (fileName, tiled, deep, multiPart); } bool isOpenExrFile (const char fileName[], bool &tiled) { bool deep, multiPart; return isOpenExrFile (fileName, tiled, deep, multiPart); } bool isOpenExrFile (const char fileName[]) { bool tiled, deep, multiPart; return isOpenExrFile (fileName, tiled, deep, multiPart); } bool isTiledOpenExrFile (const char fileName[]) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (fileName, tiled, deep, multiPart); return exr && tiled; } bool isDeepOpenExrFile (const char fileName[]) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (fileName, tiled, deep, multiPart); return exr && deep; } bool isMultiPartOpenExrFile (const char fileName[]) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (fileName, tiled, deep, multiPart); return exr && multiPart; } bool isOpenExrFile (IStream &is, bool &tiled, bool &deep, bool &multiPart) { try { Int64 pos = is.tellg(); if (pos != 0) is.seekg (0); int magic, version; Xdr::read (is, magic); Xdr::read (is, version); is.seekg (pos); tiled = isTiled (version); deep = isNonImage (version); multiPart = isMultiPart (version); return magic == MAGIC; } catch (...) { is.clear(); tiled = false; return false; } } bool isOpenExrFile (IStream &is, bool &tiled, bool &deep) { bool multiPart; return isOpenExrFile (is, tiled, deep, multiPart); } bool isOpenExrFile (IStream &is, bool &tiled) { bool deep, multiPart; return isOpenExrFile (is, tiled, deep, multiPart); } bool isOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) { bool tiled, deep, multiPart; return isOpenExrFile (is, tiled, deep, multiPart); } bool isTiledOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (is, tiled, deep, multiPart); return exr && tiled; } bool isDeepOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (is, tiled, deep, multiPart); return exr && deep; } bool isMultiPartOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) { bool exr, tiled, deep, multiPart; exr = isOpenExrFile (is, tiled, deep, multiPart); return exr && multiPart; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTestFile.h000066400000000000000000000070641406177042200202000ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TEST_FILE_H #define INCLUDED_IMF_TEST_FILE_H //----------------------------------------------------------------------------- // // Utility routines to test quickly if a given // file is an OpenEXR file, and whether the // file is scanline-based or tiled. // //----------------------------------------------------------------------------- #include "ImfForward.h" #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMF_EXPORT bool isOpenExrFile (const char fileName[]); IMF_EXPORT bool isOpenExrFile (const char fileName[], bool &isTiled); IMF_EXPORT bool isOpenExrFile (const char fileName[], bool &isTiled, bool &isDeep); IMF_EXPORT bool isOpenExrFile (const char fileName[], bool &isTiled, bool &isDeep, bool &isMultiPart); IMF_EXPORT bool isTiledOpenExrFile (const char fileName[]); IMF_EXPORT bool isDeepOpenExrFile (const char fileName[]); IMF_EXPORT bool isMultiPartOpenExrFile (const char fileName[]); IMF_EXPORT bool isOpenExrFile (IStream &is); IMF_EXPORT bool isOpenExrFile (IStream &is, bool &isTiled); IMF_EXPORT bool isOpenExrFile (IStream &is, bool &isTiled, bool &isDeep); IMF_EXPORT bool isOpenExrFile (IStream &is, bool &isTiled, bool &isDeep, bool &isMultiPart); IMF_EXPORT bool isTiledOpenExrFile (IStream &is); IMF_EXPORT bool isDeepOpenExrFile (IStream &is); IMF_EXPORT bool isMultiPartOpenExrFile (IStream &is); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfThreading.cpp000066400000000000000000000045471406177042200207240ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Threading support for the IlmImf library // //----------------------------------------------------------------------------- #include "ImfThreading.h" #include "IlmThreadPool.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER int globalThreadCount () { return ILMTHREAD_NAMESPACE::ThreadPool::globalThreadPool().numThreads(); } void setGlobalThreadCount (int count) { ILMTHREAD_NAMESPACE::ThreadPool::globalThreadPool().setNumThreads (count); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfThreading.h000066400000000000000000000103701406177042200203600ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_THREADING_H #define INCLUDED_IMF_THREADING_H #include "ImfExport.h" #include "ImfNamespace.h" //----------------------------------------------------------------------------- // // Threading support for the IlmImf library // // The IlmImf library uses threads to perform reading and writing // of OpenEXR files in parallel. The thread that calls the library // always performs the actual file IO (this is usually the main // application thread) whereas a several worker threads perform // data compression and decompression. The number of worker // threads can be any non-negative value (a value of zero reverts // to single-threaded operation). As long as there is at least // one worker thread, file IO and compression can potentially be // done concurrently through pinelining. If there are two or more // worker threads, then pipelining as well as concurrent compression // of multiple blocks can be performed. // // Threading in the Imf library is controllable at two granularities: // // * The functions in this file query and control the total number // of worker threads, which will be created globally for the whole // library. Regardless of how many input or output files are // opened simultaneously, the library will use at most this number // of worker threads to perform all work. The default number of // global worker threads is zero (i.e. single-threaded operation; // everything happens in the thread that calls the library). // // * Furthermore, it is possible to set the number of threads that // each input or output file should keep busy. This number can // be explicitly set for each file. The default behavior is for // each file to try to occupy all worker threads in the library's // thread pool. // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------------------------------------- // Return the number of Imf-global worker threads used for parallel // compression and decompression of OpenEXR files. //----------------------------------------------------------------------------- IMF_EXPORT int globalThreadCount (); //----------------------------------------------------------------------------- // Change the number of Imf-global worker threads //----------------------------------------------------------------------------- IMF_EXPORT void setGlobalThreadCount (int count); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTileDescription.h000066400000000000000000000062011406177042200215520ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILE_DESCRIPTION_H #define INCLUDED_IMF_TILE_DESCRIPTION_H //----------------------------------------------------------------------------- // // class TileDescription and enum LevelMode // //----------------------------------------------------------------------------- #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER enum LevelMode { ONE_LEVEL = 0, MIPMAP_LEVELS = 1, RIPMAP_LEVELS = 2, NUM_LEVELMODES // number of different level modes }; enum LevelRoundingMode { ROUND_DOWN = 0, ROUND_UP = 1, NUM_ROUNDINGMODES // number of different rounding modes }; class TileDescription { public: unsigned int xSize; // size of a tile in the x dimension unsigned int ySize; // size of a tile in the y dimension LevelMode mode; LevelRoundingMode roundingMode; TileDescription (unsigned int xs = 32, unsigned int ys = 32, LevelMode m = ONE_LEVEL, LevelRoundingMode r = ROUND_DOWN) : xSize (xs), ySize (ys), mode (m), roundingMode (r) { // empty } bool operator == (const TileDescription &other) const { return xSize == other.xSize && ySize == other.ySize && mode == other.mode && roundingMode == other.roundingMode; } }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp000066400000000000000000000067411406177042200240020ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TileDescriptionAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * TileDescriptionAttribute::staticTypeName () { return "tiledesc"; } template <> void TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.xSize); Xdr::write (os, _value.ySize); unsigned char tmp = _value.mode | (_value.roundingMode << 4); Xdr::write (os, tmp); } template <> void TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.xSize); Xdr::read (is, _value.ySize); unsigned char tmp; Xdr::read (is, tmp); // // four bits are allocated for 'mode' for future use (16 possible values) // but only values 0,1,2 are currently valid. '3' is a special valid enum value // that indicates bad values have been used // // roundingMode can only be 0 or 1, and 2 is a special enum value for 'bad enum' // unsigned char levelMode = tmp & 0x0f; if(levelMode > 3) { levelMode = 3; } _value.mode = LevelMode(levelMode); unsigned char levelRoundingMode = (tmp >> 4) & 0x0f; if(levelRoundingMode > 2) { levelRoundingMode = 2; } _value.roundingMode = LevelRoundingMode (levelRoundingMode); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h000066400000000000000000000053201406177042200234370ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H #define INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class TileDescriptionAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfTileDescription.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute TileDescriptionAttribute; template <> IMF_EXPORT const char * TileDescriptionAttribute::staticTypeName (); template <> IMF_EXPORT void TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTileOffsets.cpp000066400000000000000000000344301406177042200212400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TileOffsets // //----------------------------------------------------------------------------- #include #include #include #include "Iex.h" #include "ImfNamespace.h" #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER TileOffsets::TileOffsets (LevelMode mode, int numXLevels, int numYLevels, const int *numXTiles, const int *numYTiles) : _mode (mode), _numXLevels (numXLevels), _numYLevels (numYLevels) { switch (_mode) { case ONE_LEVEL: case MIPMAP_LEVELS: _offsets.resize (_numXLevels); for (unsigned int l = 0; l < _offsets.size(); ++l) { _offsets[l].resize (numYTiles[l]); for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) { _offsets[l][dy].resize (numXTiles[l]); } } break; case RIPMAP_LEVELS: _offsets.resize (_numXLevels * _numYLevels); for (int ly = 0; ly < _numYLevels; ++ly) { for (int lx = 0; lx < _numXLevels; ++lx) { int l = ly * _numXLevels + lx; _offsets[l].resize (numYTiles[ly]); for (size_t dy = 0; dy < _offsets[l].size(); ++dy) { _offsets[l][dy].resize (numXTiles[lx]); } } } break; case NUM_LEVELMODES : throw IEX_NAMESPACE::ArgExc("Bad initialisation of TileOffsets object"); } } bool TileOffsets::anyOffsetsAreInvalid () const { for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) if (_offsets[l][dy][dx] <= 0) return true; return false; } void TileOffsets::findTiles (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool isMultiPartFile, bool isDeep, bool skipOnly) { for (unsigned int l = 0; l < _offsets.size(); ++l) { for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) { for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) { Int64 tileOffset = is.tellg(); if (isMultiPartFile) { int partNumber; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, partNumber); } int tileX; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tileX); int tileY; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tileY); int levelX; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelX); int levelY; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelY); if(isDeep) { Int64 packed_offset_table_size; Int64 packed_sample_size; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset_table_size); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample_size); // next Int64 is unpacked sample size - skip that too Xdr::skip (is, packed_offset_table_size+packed_sample_size+8); }else{ int dataSize; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, dataSize); Xdr::skip (is, dataSize); } if (skipOnly) continue; if (!isValidTile(tileX, tileY, levelX, levelY)) return; operator () (tileX, tileY, levelX, levelY) = tileOffset; } } } } void TileOffsets::reconstructFromFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,bool isMultiPart,bool isDeep) { // // Try to reconstruct a missing tile offset table by sequentially // scanning through the file, and recording the offsets in the file // of the tiles we find. // Int64 position = is.tellg(); try { findTiles (is,isMultiPart,isDeep,false); } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // Suppress all exceptions. This function is called only to // reconstruct the tile offset table for incomplete files, // and exceptions are likely. // } is.clear(); is.seekg (position); } void TileOffsets::readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool &complete,bool isMultiPartFile, bool isDeep) { // // Read in the tile offsets from the file's tile offset table // for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, _offsets[l][dy][dx]); // // Check if any tile offsets are invalid. // // Invalid offsets mean that the file is probably incomplete // (the offset table is the last thing written to the file). // Either some process is still busy writing the file, or // writing the file was aborted. // // We should still be able to read the existing parts of the // file. In order to do this, we have to make a sequential // scan over the scan tile to reconstruct the tile offset // table. // if (anyOffsetsAreInvalid()) { complete = false; reconstructFromFile (is,isMultiPartFile,isDeep); } else { complete = true; } } void TileOffsets::readFrom (std::vector chunkOffsets,bool &complete) { size_t totalSize = 0; for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) totalSize += _offsets[l][dy].size(); if (chunkOffsets.size() != totalSize) throw IEX_NAMESPACE::ArgExc ("Wrong offset count, not able to read from this array"); int pos = 0; for (size_t l = 0; l < _offsets.size(); ++l) for (size_t dy = 0; dy < _offsets[l].size(); ++dy) for (size_t dx = 0; dx < _offsets[l][dy].size(); ++dx) { _offsets[l][dy][dx] = chunkOffsets[pos]; pos++; } complete = !anyOffsetsAreInvalid(); } Int64 TileOffsets::writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os) const { // // Write the tile offset table to the file, and // return the position of the start of the table // in the file. // Int64 pos = os.tellp(); if (pos == static_cast(-1)) IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, _offsets[l][dy][dx]); return pos; } namespace { struct tilepos{ Int64 filePos; int dx; int dy; int l; bool operator <(const tilepos & other) const { return filePos < other.filePos; } }; } //------------------------------------- // fill array with tile coordinates in the order they appear in the file // // each input array must be of size (totalTiles) // // // if the tile order is not RANDOM_Y, it is more efficient to compute the // tile ordering rather than using this function // //------------------------------------- void TileOffsets::getTileOrder(int dx_table[],int dy_table[],int lx_table[],int ly_table[]) const { // // helper class // // how many entries? size_t entries=0; for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) entries+=_offsets[l][dy].size(); std::vector table(entries); size_t i = 0; for (unsigned int l = 0; l < _offsets.size(); ++l) for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) { table[i].filePos = _offsets[l][dy][dx]; table[i].dx = dx; table[i].dy = dy; table[i].l = l; ++i; } std::sort(table.begin(),table.end()); // // write out the values // // pass 1: write out dx and dy, since these are independent of level mode for(size_t i=0;i 0 && int(_offsets[0].size()) > dy && int(_offsets[0][dy].size()) > dx) { return true; } break; case MIPMAP_LEVELS: if (lx < _numXLevels && ly < _numYLevels && int(_offsets.size()) > lx && int(_offsets[lx].size()) > dy && int(_offsets[lx][dy].size()) > dx) { return true; } break; case RIPMAP_LEVELS: if (lx < _numXLevels && ly < _numYLevels && (_offsets.size() > (size_t) lx+ ly * (size_t) _numXLevels) && int(_offsets[lx + ly * _numXLevels].size()) > dy && int(_offsets[lx + ly * _numXLevels][dy].size()) > dx) { return true; } break; default: return false; } return false; } Int64 & TileOffsets::operator () (int dx, int dy, int lx, int ly) { // // Looks up the value of the tile with tile coordinate (dx, dy) // and level number (lx, ly) in the _offsets array, and returns // the cooresponding offset. // switch (_mode) { case ONE_LEVEL: return _offsets[0][dy][dx]; case MIPMAP_LEVELS: return _offsets[lx][dy][dx]; case RIPMAP_LEVELS: return _offsets[lx + ly * _numXLevels][dy][dx]; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } } Int64 & TileOffsets::operator () (int dx, int dy, int l) { return operator () (dx, dy, l, l); } const Int64 & TileOffsets::operator () (int dx, int dy, int lx, int ly) const { // // Looks up the value of the tile with tile coordinate (dx, dy) // and level number (lx, ly) in the _offsets array, and returns // the cooresponding offset. // switch (_mode) { case ONE_LEVEL: return _offsets[0][dy][dx]; case MIPMAP_LEVELS: return _offsets[lx][dy][dx]; case RIPMAP_LEVELS: return _offsets[lx + ly * _numXLevels][dy][dx]; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } } const Int64 & TileOffsets::operator () (int dx, int dy, int l) const { return operator () (dx, dy, l, l); } const std::vector > >& TileOffsets::getOffsets() const { return _offsets; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTileOffsets.h000066400000000000000000000110561406177042200207040ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILE_OFFSETS_H #define INCLUDED_IMF_TILE_OFFSETS_H //----------------------------------------------------------------------------- // // class TileOffsets // //----------------------------------------------------------------------------- #include "ImfTileDescription.h" #include "ImfInt64.h" #include #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class TileOffsets { public: IMF_EXPORT TileOffsets (LevelMode mode = ONE_LEVEL, int numXLevels = 0, int numYLevels = 0, const int *numXTiles = 0, const int *numYTiles = 0); // -------- // File I/O // -------- IMF_EXPORT void readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool &complete,bool isMultiPart,bool isDeep); IMF_EXPORT void readFrom (std::vector chunkOffsets,bool &complete); IMF_EXPORT Int64 writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os) const; //----------------------------------------------------------- // Test if the tileOffsets array is empty (all entries are 0) //----------------------------------------------------------- IMF_EXPORT bool isEmpty () const; //----------------------------------------------------------- // populate 'list' with tiles coordinates in the order they appear // in the offset table (assumes full table! // each array myst be at leat totalTiles long //----------------------------------------------------------- IMF_EXPORT void getTileOrder(int dx_table[], int dy_table[], int lx_table[], int ly_table[]) const; //----------------------- // Access to the elements //----------------------- IMF_EXPORT Int64 & operator () (int dx, int dy, int lx, int ly); IMF_EXPORT Int64 & operator () (int dx, int dy, int l); IMF_EXPORT const Int64 & operator () (int dx, int dy, int lx, int ly) const; IMF_EXPORT const Int64 & operator () (int dx, int dy, int l) const; IMF_EXPORT bool isValidTile (int dx, int dy, int lx, int ly) const; IMF_EXPORT const std::vector > >& getOffsets() const; private: void findTiles (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool isMultiPartFile, bool isDeep, bool skipOnly); void reconstructFromFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,bool isMultiPartFile,bool isDeep); bool readTile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is); bool anyOffsetsAreInvalid () const; LevelMode _mode; int _numXLevels; int _numYLevels; std::vector > > _offsets; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTiledInputFile.cpp000066400000000000000000001322651406177042200216770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TiledInputFile // //----------------------------------------------------------------------------- #include "ImfTiledInputFile.h" #include "ImfTileDescriptionAttribute.h" #include "ImfChannelList.h" #include "ImfMisc.h" #include "ImfTiledMisc.h" #include "ImfStdIO.h" #include "ImfCompressor.h" #include "ImfXdr.h" #include "ImfConvert.h" #include "ImfVersion.h" #include "ImfTileOffsets.h" #include "ImfThreading.h" #include "ImfPartType.h" #include "ImfMultiPartInputFile.h" #include "ImfInputStreamMutex.h" #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "ImathVec.h" #include "Iex.h" #include #include #include #include #include "ImfInputPartData.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using std::string; using std::vector; using std::min; using std::max; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct TInSliceInfo { PixelType typeInFrameBuffer; PixelType typeInFile; char * base; size_t xStride; size_t yStride; bool fill; bool skip; double fillValue; int xTileCoords; int yTileCoords; TInSliceInfo (PixelType typeInFrameBuffer = HALF, PixelType typeInFile = HALF, char *base = 0, size_t xStride = 0, size_t yStride = 0, bool fill = false, bool skip = false, double fillValue = 0.0, int xTileCoords = 0, int yTileCoords = 0); }; TInSliceInfo::TInSliceInfo (PixelType tifb, PixelType tifl, char *b, size_t xs, size_t ys, bool f, bool s, double fv, int xtc, int ytc) : typeInFrameBuffer (tifb), typeInFile (tifl), base (b), xStride (xs), yStride (ys), fill (f), skip (s), fillValue (fv), xTileCoords (xtc), yTileCoords (ytc) { // empty } struct TileBuffer { const char * uncompressedData; char * buffer; int dataSize; Compressor * compressor; Compressor::Format format; int dx; int dy; int lx; int ly; bool hasException; string exception; TileBuffer (Compressor * const comp); ~TileBuffer (); TileBuffer (const TileBuffer& other) = delete; TileBuffer& operator = (const TileBuffer& other) = delete; TileBuffer (TileBuffer&& other) = delete; TileBuffer& operator = (TileBuffer&& other) = delete; inline void wait () {_sem.wait();} inline void post () {_sem.post();} protected: Semaphore _sem; }; TileBuffer::TileBuffer (Compressor *comp): uncompressedData (0), buffer (0), dataSize (0), compressor (comp), format (defaultFormat (compressor)), dx (-1), dy (-1), lx (-1), ly (-1), hasException (false), exception (), _sem (1) { // empty } TileBuffer::~TileBuffer () { delete compressor; } } // namespace class MultiPartInputFile; // // struct TiledInputFile::Data stores things that will be // needed between calls to readTile() // struct TiledInputFile::Data: public Mutex { Header header; // the image header TileDescription tileDesc; // describes the tile layout int version; // file's version FrameBuffer frameBuffer; // framebuffer to write into LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord int numXLevels; // number of x levels int numYLevels; // number of y levels int * numXTiles; // number of x tiles at a level int * numYTiles; // number of y tiles at a level TileOffsets tileOffsets; // stores offsets in file for // each tile bool fileIsComplete; // True if no tiles are missing // in the file vector slices; // info about channels in file size_t bytesPerPixel; // size of an uncompressed pixel size_t maxBytesPerTileLine; // combined size of a line // over all channels int partNumber; // part number bool multiPartBackwardSupport; // if we are reading a multipart file // using OpenEXR 1.7 API int numThreads; // number of threads MultiPartInputFile* multiPartFile; // the MultiPartInputFile used to // support backward compatibility vector tileBuffers; // each holds a single tile size_t tileBufferSize; // size of the tile buffers bool memoryMapped; // if the stream is memory mapped InputStreamMutex * _streamData; bool _deleteStream; Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; static const int gLargeChunkTableSize = 1024*1024; void validateStreamSize(); // throw an exception if the file is significantly // smaller than the data/tile geometry would require inline TileBuffer * getTileBuffer (int number); // hash function from tile indices // into our vector of tile buffers }; TiledInputFile::Data::Data (int numThreads): numXTiles (0), numYTiles (0), partNumber (-1), multiPartBackwardSupport(false), numThreads(numThreads), multiPartFile(nullptr), memoryMapped(false), _streamData(NULL), _deleteStream(false) { // // We need at least one tileBuffer, but if threading is used, // to keep n threads busy we need 2*n tileBuffers // tileBuffers.resize (max (1, 2 * numThreads)); } TiledInputFile::Data::~Data () { delete [] numXTiles; delete [] numYTiles; for (size_t i = 0; i < tileBuffers.size(); i++) delete tileBuffers[i]; if (multiPartBackwardSupport) delete multiPartFile; } TileBuffer* TiledInputFile::Data::getTileBuffer (int number) { return tileBuffers[number % tileBuffers.size()]; } // // avoid allocating excessive memory due to large lineOffsets table size. // If the chunktablesize claims to be large, // check the file is big enough to contain the table before allocating memory // in the bytesPerLineTable and the lineOffsets table. // Attempt to read the last entry in the first level of the table. Either the seekg() or the read() // call will throw an exception if the file is much too small to contain the table. // // assumes the input stream pointer is at (or before) the beginning of the chunk table void TiledInputFile::Data::validateStreamSize() { const TileDescription& td = header.tileDescription(); Int64 chunkCount; if (td.mode==RIPMAP_LEVELS) { // use slow function to calculate exact size of ripmap chunkCount = getTiledChunkOffsetTableSize(header); } else { // for ONE_LEVEL image, calculate exact number of tiles // MIPMAP_LEVELS images will have roughly 1/3 more tiles than this // but 'chunkCount' can be less than the real offset table size for a meaningful sanity check // const Box2i &dataWindow = header.dataWindow(); Int64 tileWidth = td.xSize; Int64 tileHeight = td.ySize; Int64 tilesX = (static_cast(dataWindow.max.x+1-dataWindow.min.x) + tileWidth -1) / tileWidth; Int64 tilesY = (static_cast(dataWindow.max.y+1-dataWindow.min.y) + tileHeight -1) / tileHeight; chunkCount = tilesX*tilesY; } if (chunkCount > gLargeChunkTableSize) { Int64 pos = _streamData->is->tellg(); _streamData->is->seekg(pos + (chunkCount-1)*sizeof(Int64)); Int64 temp; OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_streamData->is, temp); _streamData->is->seekg(pos); } } namespace { void readTileData (InputStreamMutex *streamData, TiledInputFile::Data *ifd, int dx, int dy, int lx, int ly, char *&buffer, int &dataSize) { // // Read a single tile block from the file and into the array pointed // to by buffer. If the file is memory-mapped, then we change where // buffer points instead of writing into the array (hence buffer needs // to be a reference to a char *). // // // Look up the location for this tile in the Index and // seek to that position if necessary // Int64 tileOffset = ifd->tileOffsets (dx, dy, lx, ly); if (tileOffset == 0) { THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << lx << ", " << ly << ") is missing."); } // // In a multi-part file, the next chunk does not need to // belong to the same part, so we have to compare the // offset here. // if (!isMultiPart(ifd->version)) { if (streamData->currentPosition != tileOffset) streamData->is->seekg (tileOffset); } else { // // In a multi-part file, the file pointer may be moved by other // parts, so we have to ask tellg() where we are. // if (streamData->is->tellg() != tileOffset) streamData->is->seekg (tileOffset); } // // Read the first few bytes of the tile (the header). // Verify that the tile coordinates and the level number // are correct. // int tileXCoord, tileYCoord, levelX, levelY; if (isMultiPart(ifd->version)) { int partNumber; Xdr::read (*streamData->is, partNumber); if (partNumber != ifd->partNumber) { THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber << ", should be " << ifd->partNumber << "."); } } OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, tileXCoord); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, tileYCoord); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, levelX); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, levelY); OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, dataSize); if (tileXCoord != dx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); if (tileYCoord != dy) throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); if (levelX != lx) throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); if (levelY != ly) throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); if (dataSize < 0 || dataSize > static_cast(ifd->tileBufferSize) ) throw IEX_NAMESPACE::InputExc ("Unexpected tile block length."); // // Read the pixel data. // if (streamData->is->isMemoryMapped ()) buffer = streamData->is->readMemoryMapped (dataSize); else streamData->is->read (buffer, dataSize); // // Keep track of which tile is the next one in // the file, so that we can avoid redundant seekg() // operations (seekg() can be fairly expensive). // streamData->currentPosition = tileOffset + 5 * Xdr::size() + dataSize; } void readNextTileData (InputStreamMutex *streamData, TiledInputFile::Data *ifd, int &dx, int &dy, int &lx, int &ly, char * & buffer, int &dataSize) { // // Read the next tile block from the file // if(isMultiPart(ifd->version)) { int part; Xdr::read (*streamData->is, part); if(part!=ifd->partNumber) { throw IEX_NAMESPACE::InputExc("Unexpected part number in readNextTileData"); } } // // Read the first few bytes of the tile (the header). // Xdr::read (*streamData->is, dx); Xdr::read (*streamData->is, dy); Xdr::read (*streamData->is, lx); Xdr::read (*streamData->is, ly); Xdr::read (*streamData->is, dataSize); if (dataSize > (int) ifd->tileBufferSize) throw IEX_NAMESPACE::InputExc ("Unexpected tile block length."); // // Read the pixel data. // streamData->is->read (buffer, dataSize); // // Keep track of which tile is the next one in // the file, so that we can avoid redundant seekg() // operations (seekg() can be fairly expensive). // streamData->currentPosition += 5 * Xdr::size() + dataSize; } // // A TileBufferTask encapsulates the task of uncompressing // a single tile and copying it into the frame buffer. // class TileBufferTask : public Task { public: TileBufferTask (TaskGroup *group, TiledInputFile::Data *ifd, TileBuffer *tileBuffer); virtual ~TileBufferTask (); virtual void execute (); private: TiledInputFile::Data * _ifd; TileBuffer * _tileBuffer; }; TileBufferTask::TileBufferTask (TaskGroup *group, TiledInputFile::Data *ifd, TileBuffer *tileBuffer) : Task (group), _ifd (ifd), _tileBuffer (tileBuffer) { // empty } TileBufferTask::~TileBufferTask () { // // Signal that the tile buffer is now free // _tileBuffer->post (); } void TileBufferTask::execute () { try { // // Calculate information about the tile // Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _ifd->tileDesc, _ifd->minX, _ifd->maxX, _ifd->minY, _ifd->maxY, _tileBuffer->dx, _tileBuffer->dy, _tileBuffer->lx, _tileBuffer->ly); int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; int numPixelsInTile = numPixelsPerScanLine * (tileRange.max.y - tileRange.min.y + 1); int sizeOfTile = _ifd->bytesPerPixel * numPixelsInTile; // // Uncompress the data, if necessary // if (_tileBuffer->compressor && _tileBuffer->dataSize < sizeOfTile) { _tileBuffer->format = _tileBuffer->compressor->format(); _tileBuffer->dataSize = _tileBuffer->compressor->uncompressTile (_tileBuffer->buffer, _tileBuffer->dataSize, tileRange, _tileBuffer->uncompressedData); } else { // // If the line is uncompressed, it's in XDR format, // regardless of the compressor's output format. // _tileBuffer->format = Compressor::XDR; _tileBuffer->uncompressedData = _tileBuffer->buffer; } // // Convert the tile of pixel data back from the machine-independent // representation, and store the result in the frame buffer. // const char *readPtr = _tileBuffer->uncompressedData; // points to where we // read from in the // tile block // // Iterate over the scan lines in the tile. // for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) { // // Iterate over all image channels. // for (unsigned int i = 0; i < _ifd->slices.size(); ++i) { const TInSliceInfo &slice = _ifd->slices[i]; // // These offsets are used to facilitate both // absolute and tile-relative pixel coordinates. // int xOffset = slice.xTileCoords * tileRange.min.x; int yOffset = slice.yTileCoords * tileRange.min.y; // // Fill the frame buffer with pixel data. // if (slice.skip) { // // The file contains data for this channel, but // the frame buffer contains no slice for this channel. // skipChannel (readPtr, slice.typeInFile, numPixelsPerScanLine); } else { // // The frame buffer contains a slice for this channel. // intptr_t base = reinterpret_cast(slice.base); char *writePtr = reinterpret_cast(base + (y - yOffset) * slice.yStride + (tileRange.min.x - xOffset) * slice.xStride); char *endPtr = writePtr + (numPixelsPerScanLine - 1) * slice.xStride; copyIntoFrameBuffer (readPtr, writePtr, endPtr, slice.xStride, slice.fill, slice.fillValue, _tileBuffer->format, slice.typeInFrameBuffer, slice.typeInFile); } } } } catch (std::exception &e) { if (!_tileBuffer->hasException) { _tileBuffer->exception = e.what (); _tileBuffer->hasException = true; } } catch (...) { if (!_tileBuffer->hasException) { _tileBuffer->exception = "unrecognized exception"; _tileBuffer->hasException = true; } } } TileBufferTask * newTileBufferTask (TaskGroup *group, InputStreamMutex *streamData, TiledInputFile::Data *ifd, int number, int dx, int dy, int lx, int ly) { // // Wait for a tile buffer to become available, // fill the buffer with raw data from the file, // and create a new TileBufferTask whose execute() // method will uncompress the tile and copy the // tile's pixels into the frame buffer. // TileBuffer *tileBuffer = ifd->getTileBuffer (number); try { tileBuffer->wait(); tileBuffer->dx = dx; tileBuffer->dy = dy; tileBuffer->lx = lx; tileBuffer->ly = ly; tileBuffer->uncompressedData = 0; readTileData (streamData, ifd, dx, dy, lx, ly, tileBuffer->buffer, tileBuffer->dataSize); } catch (...) { // // Reading from the file caused an exception. // Signal that the tile buffer is free, and // re-throw the exception. // tileBuffer->post(); throw; } return new TileBufferTask (group, ifd, tileBuffer); } } // namespace TiledInputFile::TiledInputFile (const char fileName[], int numThreads): _data (new Data (numThreads)) { _data->_streamData=NULL; _data->_deleteStream=true; // // This constructor is called when a user // explicitly wants to read a tiled file. // IStream* is = 0; try { try { is = new StdIFStream (fileName); readMagicNumberAndVersionField(*is, _data->version); // // Backward compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(*is); return; } _data->_streamData = new InputStreamMutex(); _data->_streamData->is = is; _data->header.readFrom (*_data->_streamData->is, _data->version); initialize(); //read tile offsets - we are not multipart or deep _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,false); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } } catch (...) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->tileBuffers.size(); i++) { if(_data->tileBuffers[i]) { delete [] _data->tileBuffers[i]->buffer; } } } if ( _data->_streamData != 0 && !isMultiPart(_data->version)) { delete _data->_streamData->is; _data->_streamData->is = is = 0; delete _data->_streamData; } delete is; delete _data; throw; } } TiledInputFile::TiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _data (new Data (numThreads)) { _data->_deleteStream=false; // // This constructor is called when a user // explicitly wants to read a tiled file. // bool streamDataCreated = false; try { try { readMagicNumberAndVersionField(is, _data->version); // // Backward compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(is); return; } streamDataCreated = true; _data->_streamData = new InputStreamMutex(); _data->_streamData->is = &is; _data->header.readFrom (*_data->_streamData->is, _data->version); initialize(); // file is guaranteed to be single part, regular image _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,false); _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot open image file " "\"" << is.fileName() << "\". " << e.what()); throw; } } catch (...) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->tileBuffers.size(); i++) { if( _data->tileBuffers[i]) { delete [] _data->tileBuffers[i]->buffer; } } } if (streamDataCreated) delete _data->_streamData; delete _data; throw; } } TiledInputFile::TiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads) : _data (new Data (numThreads)) { _data->_deleteStream=false; _data->_streamData = new InputStreamMutex(); // // This constructor called by class Imf::InputFile // when a user wants to just read an image file, and // doesn't care or know if the file is tiled. // No need to have backward compatibility here, because // we have somehow got the header. // try { _data->_streamData->is = is; _data->header = header; _data->version = version; initialize(); _data->tileOffsets.readFrom (*(_data->_streamData->is),_data->fileIsComplete,false,false); _data->memoryMapped = is->isMemoryMapped(); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } catch(...) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->tileBuffers.size(); i++) { if(_data->tileBuffers[i]) { delete [] _data->tileBuffers[i]->buffer; } } } delete _data->_streamData; delete _data; throw; } } TiledInputFile::TiledInputFile (InputPartData* part) { _data = new Data (part->numThreads); _data->_deleteStream=false; try { multiPartInitialize(part); } catch(...) { if(_data) { if (!_data->memoryMapped) { for (size_t i = 0; i < _data->tileBuffers.size(); i++) { if(_data->tileBuffers[i]) { delete [] _data->tileBuffers[i]->buffer; } } } delete _data; } throw; } } void TiledInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) { is.seekg(0); // // Construct a MultiPartInputFile, initialize TiledInputFile // with the part 0 data. // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. // _data->multiPartBackwardSupport = true; _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); InputPartData* part = _data->multiPartFile->getPart(0); multiPartInitialize(part); } void TiledInputFile::multiPartInitialize(InputPartData* part) { if (part->header.type() != TILEDIMAGE) throw IEX_NAMESPACE::ArgExc("Can't build a TiledInputFile from a type-mismatched part."); _data->_streamData = part->mutex; _data->header = part->header; _data->version = part->version; _data->partNumber = part->partNumber; _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); initialize(); _data->tileOffsets.readFrom(part->chunkOffsets,_data->fileIsComplete); _data->_streamData->currentPosition = _data->_streamData->is->tellg(); } void TiledInputFile::initialize () { // fix bad types in header (arises when a tool built against an older version of // OpenEXR converts a scanline image to tiled) // only applies when file is a single part, regular image, tiled file // if(!isMultiPart(_data->version) && !isNonImage(_data->version) && isTiled(_data->version) && _data->header.hasType() ) { _data->header.setType(TILEDIMAGE); } if (_data->partNumber == -1) { if (!isTiled (_data->version)) throw IEX_NAMESPACE::ArgExc ("Expected a tiled file but the file is not tiled."); if (isNonImage (_data->version)) throw IEX_NAMESPACE::ArgExc ("File is not a regular tiled image."); } else { if(_data->header.hasType() && _data->header.type()!=TILEDIMAGE) { throw IEX_NAMESPACE::ArgExc ("TiledInputFile used for non-tiledimage part."); } } _data->header.sanityCheck (true); // // before allocating memory for tile offsets, confirm file is large enough // to contain tile offset table // (for multipart files, the chunk offset table has already been read) // if (!isMultiPart(_data->version)) { _data->validateStreamSize(); } _data->tileDesc = _data->header.tileDescription(); _data->lineOrder = _data->header.lineOrder(); // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; // // Precompute level and tile information to speed up utility functions // precalculateTileInfo (_data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, _data->numXTiles, _data->numYTiles, _data->numXLevels, _data->numYLevels); _data->bytesPerPixel = calculateBytesPerPixel (_data->header); _data->maxBytesPerTileLine = _data->bytesPerPixel * _data->tileDesc.xSize; _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; // // OpenEXR has a limit of INT_MAX compressed bytes per tile // disallow uncompressed tile sizes above INT_MAX too to guarantee file is written // if( _data->tileBufferSize > INT_MAX ) { throw IEX_NAMESPACE::ArgExc ("Tile size too large for OpenEXR format"); } // // Create all the TileBuffers and allocate their internal buffers // for (size_t i = 0; i < _data->tileBuffers.size(); i++) { _data->tileBuffers[i] = new TileBuffer (newTileCompressor (_data->header.compression(), _data->maxBytesPerTileLine, _data->tileDesc.ySize, _data->header)); if (!_data->_streamData->is->isMemoryMapped ()) _data->tileBuffers[i]->buffer = new char [_data->tileBufferSize]; } _data->tileOffsets = TileOffsets (_data->tileDesc.mode, _data->numXLevels, _data->numYLevels, _data->numXTiles, _data->numYTiles); } TiledInputFile::~TiledInputFile () { if (!_data->memoryMapped) for (size_t i = 0; i < _data->tileBuffers.size(); i++) delete [] _data->tileBuffers[i]->buffer; if (_data->_deleteStream) delete _data->_streamData->is; if (_data->partNumber == -1) delete _data->_streamData; delete _data; } const char * TiledInputFile::fileName () const { return _data->_streamData->is->fileName(); } const Header & TiledInputFile::header () const { return _data->header; } int TiledInputFile::version () const { return _data->version; } void TiledInputFile::setFrameBuffer (const FrameBuffer &frameBuffer) { Lock lock (*_data->_streamData); // // Set the frame buffer // // // Check if the new frame buffer descriptor is // compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (FrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { ChannelList::ConstIterator i = channels.find (j.name()); if (i == channels.end()) continue; if (i.channel().xSampling != j.slice().xSampling || i.channel().ySampling != j.slice().ySampling) THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " "of \"" << i.name() << "\" channel " "of input file \"" << fileName() << "\" are " "not compatible with the frame buffer's " "subsampling factors."); } // // Initialize the slice table for readPixels(). // vector slices; ChannelList::ConstIterator i = channels.begin(); for (FrameBuffer::ConstIterator j = frameBuffer.begin(); j != frameBuffer.end(); ++j) { while (i != channels.end() && strcmp (i.name(), j.name()) < 0) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (TInSliceInfo (i.channel().type, i.channel().type, 0, // base 0, // xStride 0, // yStride false, // fill true, // skip 0.0)); // fillValue ++i; } bool fill = false; if (i == channels.end() || strcmp (i.name(), j.name()) > 0) { // // Channel i is present in the frame buffer, but not in the file. // In the frame buffer, slice j will be filled with a default value. // fill = true; } slices.push_back (TInSliceInfo (j.slice().type, fill? j.slice().type: i.channel().type, j.slice().base, j.slice().xStride, j.slice().yStride, fill, false, // skip j.slice().fillValue, (j.slice().xTileCoords)? 1: 0, (j.slice().yTileCoords)? 1: 0)); if (i != channels.end() && !fill) ++i; } while (i != channels.end()) { // // Channel i is present in the file but not // in the frame buffer; data for channel i // will be skipped during readPixels(). // slices.push_back (TInSliceInfo (i.channel().type, i.channel().type, 0, // base 0, // xStride 0, // yStride false, // fill true, // skip 0.0)); // fillValue ++i; } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; _data->slices = slices; } const FrameBuffer & TiledInputFile::frameBuffer () const { Lock lock (*_data->_streamData); return _data->frameBuffer; } bool TiledInputFile::isComplete () const { return _data->fileIsComplete; } void TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { // // Read a range of tiles from the file into the framebuffer // try { Lock lock (*_data->_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data destination."); if (!isValidLevel (lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Level coordinate " "(" << lx << ", " << ly << ") " "is invalid."); // // Determine the first and last tile coordinates in both dimensions. // We always attempt to read the range of tiles in the order that // they are stored in the file. // if (dx1 > dx2) std::swap (dx1, dx2); if (dy1 > dy2) std::swap (dy1, dy2); int dyStart = dy1; int dyStop = dy2 + 1; int dY = 1; if (_data->lineOrder == DECREASING_Y) { dyStart = dy2; dyStop = dy1 - 1; dY = -1; } // // Create a task group for all tile buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; int tileNumber = 0; for (int dy = dyStart; dy != dyStop; dy += dY) { for (int dx = dx1; dx <= dx2; dx++) { if (!isValidTile (dx, dy, lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Tile (" << dx << ", " << dy << ", " << lx << "," << ly << ") is not a valid tile."); ThreadPool::addGlobalTask (newTileBufferTask (&taskGroup, _data->_streamData, _data, tileNumber++, dx, dy, lx, ly)); } } // // finish all tasks // } // // Exeption handling: // // TileBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to TiledInputFile::readTiles(). // TileBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the tile buffers. // Now we check if any tile buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple tile buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->tileBuffers.size(); ++i) { TileBuffer *tileBuffer = _data->tileBuffers[i]; if (tileBuffer->hasException && !exception) exception = &tileBuffer->exception; tileBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } void TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int l) { readTiles (dx1, dx2, dy1, dy2, l, l); } void TiledInputFile::readTile (int dx, int dy, int lx, int ly) { readTiles (dx, dx, dy, dy, lx, ly); } void TiledInputFile::readTile (int dx, int dy, int l) { readTile (dx, dy, l, l); } void TiledInputFile::rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize) { try { Lock lock (*_data->_streamData); if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Tried to read a tile outside " "the image file's data window."); TileBuffer *tileBuffer = _data->getTileBuffer (0); // // if file is a multipart file, we have to seek to the required tile // since we don't know where the file pointer is // int old_dx=dx; int old_dy=dy; int old_lx=lx; int old_ly=ly; if(isMultiPart(version())) { _data->_streamData->is->seekg(_data->tileOffsets(dx,dy,lx,ly)); } readNextTileData (_data->_streamData, _data, dx, dy, lx, ly, tileBuffer->buffer, pixelDataSize); if ( !isValidLevel(lx,ly) || !isValidTile (dx, dy, lx, ly) ) throw IEX_NAMESPACE::ArgExc ("File contains an invalid tile"); if(isMultiPart(version())) { if (old_dx!=dx || old_dy !=dy || old_lx!=lx || old_ly!=ly) { throw IEX_NAMESPACE::ArgExc ("rawTileData read the wrong tile"); } } else { if(!isValidTile (dx, dy, lx, ly) ) { throw IEX_NAMESPACE::IoExc ("rawTileData read an invalid tile"); } } pixelData = tileBuffer->buffer; } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error reading pixel data from image " "file \"" << fileName() << "\". " << e.what()); throw; } } unsigned int TiledInputFile::tileXSize () const { return _data->tileDesc.xSize; } unsigned int TiledInputFile::tileYSize () const { return _data->tileDesc.ySize; } LevelMode TiledInputFile::levelMode () const { return _data->tileDesc.mode; } LevelRoundingMode TiledInputFile::levelRoundingMode () const { return _data->tileDesc.roundingMode; } int TiledInputFile::numLevels () const { if (levelMode() == RIPMAP_LEVELS) THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " "file \"" << fileName() << "\" " "(numLevels() is not defined for files " "with RIPMAP level mode)."); return _data->numXLevels; } int TiledInputFile::numXLevels () const { return _data->numXLevels; } int TiledInputFile::numYLevels () const { return _data->numYLevels; } bool TiledInputFile::isValidLevel (int lx, int ly) const { if (lx < 0 || ly < 0) return false; if (levelMode() == MIPMAP_LEVELS && lx != ly) return false; if (lx >= numXLevels() || ly >= numYLevels()) return false; return true; } int TiledInputFile::levelWidth (int lx) const { try { return levelSize (_data->minX, _data->maxX, lx, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelWidth() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int TiledInputFile::levelHeight (int ly) const { try { return levelSize (_data->minY, _data->maxY, ly, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelHeight() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int TiledInputFile::numXTiles (int lx) const { if (lx < 0 || lx >= _data->numXLevels) { THROW (IEX_NAMESPACE::ArgExc, "Error calling numXTiles() on image " "file \"" << _data->_streamData->is->fileName() << "\" " "(Argument is not in valid range)."); } return _data->numXTiles[lx]; } int TiledInputFile::numYTiles (int ly) const { if (ly < 0 || ly >= _data->numYLevels) { THROW (IEX_NAMESPACE::ArgExc, "Error calling numYTiles() on image " "file \"" << _data->_streamData->is->fileName() << "\" " "(Argument is not in valid range)."); } return _data->numYTiles[ly]; } Box2i TiledInputFile::dataWindowForLevel (int l) const { return dataWindowForLevel (l, l); } Box2i TiledInputFile::dataWindowForLevel (int lx, int ly) const { try { return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } Box2i TiledInputFile::dataWindowForTile (int dx, int dy, int l) const { return dataWindowForTile (dx, dy, l, l); } Box2i TiledInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { try { if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, dx, dy, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForTile() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } bool TiledInputFile::isValidTile (int dx, int dy, int lx, int ly) const { return ((lx < _data->numXLevels && lx >= 0) && (ly < _data->numYLevels && ly >= 0) && (dx < _data->numXTiles[lx] && dx >= 0) && (dy < _data->numYTiles[ly] && dy >= 0)); } void TiledInputFile::tileOrder(int dx[], int dy[], int lx[], int ly[]) const { return _data->tileOffsets.getTileOrder(dx,dy,lx,ly); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledInputFile.h000066400000000000000000000345441406177042200213450ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILED_INPUT_FILE_H #define INCLUDED_IMF_TILED_INPUT_FILE_H //----------------------------------------------------------------------------- // // class TiledInputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImathBox.h" #include "ImfTileDescription.h" #include "ImfThreading.h" #include "ImfGenericInputFile.h" #include "ImfTiledOutputFile.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class TiledInputFile : public GenericInputFile { public: //-------------------------------------------------------------------- // A constructor that opens the file with the specified name, and // reads the file header. The constructor throws an IEX_NAMESPACE::ArgExc // exception if the file is not tiled. // The numThreads parameter specifies how many worker threads this // file will try to keep busy when decompressing individual tiles. // Destroying TiledInputFile objects constructed with this constructor // automatically closes the corresponding files. //-------------------------------------------------------------------- IMF_EXPORT TiledInputFile (const char fileName[], int numThreads = globalThreadCount ()); // ---------------------------------------------------------- // A constructor that attaches the new TiledInputFile object // to a file that has already been opened. // Destroying TiledInputFile objects constructed with this // constructor does not automatically close the corresponding // files. // ---------------------------------------------------------- IMF_EXPORT TiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); //----------- // Destructor //----------- IMF_EXPORT virtual ~TiledInputFile (); TiledInputFile (const TiledInputFile& other) = delete; TiledInputFile& operator = (const TiledInputFile& other) = delete; TiledInputFile (TiledInputFile&& other) = delete; TiledInputFile& operator = (TiledInputFile&& other) = delete; //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //----------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledInputFile object. // // The current frame buffer is the destination for the pixel // data read from the file. The current frame buffer must be // set at least once before readTile() is called. // The current frame buffer can be changed after each call // to readTile(). //----------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const FrameBuffer & frameBuffer () const; //------------------------------------------------------------ // Check if the file is complete: // // isComplete() returns true if all pixels in the data window // (in all levels) are present in the input file, or false if // any pixels are missing. (Another program may still be busy // writing the file, or file writing may have been aborted // prematurely.) //------------------------------------------------------------ IMF_EXPORT bool isComplete () const; //-------------------------------------------------- // Utility functions: //-------------------------------------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with // MIPMAP_LEVELS files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; //---------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //---------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //-------------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //-------------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional region of // valid pixel coordinates for a level with level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------ // Read pixel data: // // readTile(dx, dy, lx, ly) reads the tile with tile // coordinates (dx, dy), and level number (lx, ly), // and stores it in the current frame buffer. // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readTile(dx, dy, level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It calls // readTile(dx, dy, level, level). // // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow // reading multiple tiles at once. If multi-threading is used // the multiple tiles are read concurrently. // // Pixels that are outside the pixel coordinate range for the // tile's level, are never accessed by readTile(). // // Attempting to access a tile that is not present in the file // throws an InputExc exception. // //------------------------------------------------------------ IMF_EXPORT void readTile (int dx, int dy, int l = 0); IMF_EXPORT void readTile (int dx, int dy, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //-------------------------------------------------- // Read a tile of raw pixel data from the file, // without uncompressing it (this function is // used to implement TiledOutputFile::copyPixels()). // // for single part files, reads the next tile in the file // for multipart files, reads the tile specified by dx,dy,lx,ly // //-------------------------------------------------- IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize); struct Data; private: friend class InputFile; friend class MultiPartInputFile; TiledInputFile (InputPartData* part); TiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, int numThreads); void initialize (); void multiPartInitialize(InputPartData* part); void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); bool isValidTile (int dx, int dy, int lx, int ly) const; size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; void tileOrder(int dx[],int dy[],int lx[],int ly[]) const; Data * _data; friend void TiledOutputFile::copyPixels(TiledInputFile &); }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTiledInputPart.cpp000066400000000000000000000113151406177042200217160ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfTiledInputPart.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER TiledInputPart::TiledInputPart(MultiPartInputFile& multiPartFile, int partNumber) { file = multiPartFile.getInputPart(partNumber); } const char * TiledInputPart::fileName () const { return file->fileName(); } const Header & TiledInputPart::header () const { return file->header(); } int TiledInputPart::version () const { return file->version(); } void TiledInputPart::setFrameBuffer (const FrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const FrameBuffer & TiledInputPart::frameBuffer () const { return file->frameBuffer(); } bool TiledInputPart::isComplete () const { return file->isComplete(); } unsigned int TiledInputPart::tileXSize () const { return file->tileXSize(); } unsigned int TiledInputPart::tileYSize () const { return file->tileYSize(); } LevelMode TiledInputPart::levelMode () const { return file->levelMode(); } LevelRoundingMode TiledInputPart::levelRoundingMode () const { return file->levelRoundingMode(); } int TiledInputPart::numLevels () const { return file->numLevels(); } int TiledInputPart::numXLevels () const { return file->numXLevels(); } int TiledInputPart::numYLevels () const { return file->numYLevels(); } bool TiledInputPart::isValidLevel (int lx, int ly) const { return file->isValidLevel(lx, ly); } int TiledInputPart::levelWidth (int lx) const { return file->levelWidth(lx); } int TiledInputPart::levelHeight (int ly) const { return file->levelHeight(ly); } int TiledInputPart::numXTiles (int lx) const { return file->numXTiles(lx); } int TiledInputPart::numYTiles (int ly) const { return file->numYTiles(ly); } IMATH_NAMESPACE::Box2i TiledInputPart::dataWindowForLevel (int l) const { return file->dataWindowForLevel(l); } IMATH_NAMESPACE::Box2i TiledInputPart::dataWindowForLevel (int lx, int ly) const { return file->dataWindowForLevel(lx, ly); } IMATH_NAMESPACE::Box2i TiledInputPart::dataWindowForTile (int dx, int dy, int l) const { return file->dataWindowForTile(dx, dy, l); } IMATH_NAMESPACE::Box2i TiledInputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const { return file->dataWindowForTile(dx, dy, lx, ly); } void TiledInputPart::readTile (int dx, int dy, int l) { file->readTile(dx, dy, l); } void TiledInputPart::readTile (int dx, int dy, int lx, int ly) { file->readTile(dx, dy, lx, ly); } void TiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { file->readTiles(dx1, dx2, dy1, dy2, lx, ly); } void TiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int l) { file->readTiles(dx1, dx2, dy1, dy2, l); } void TiledInputPart::rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize) { file->rawTileData(dx, dy, lx, ly, pixelData, pixelDataSize); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledInputPart.h000066400000000000000000000120761406177042200213700ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFTILEDINPUTPART_H_ #define IMFTILEDINPUTPART_H_ #include "ImfMultiPartInputFile.h" #include "ImfTiledInputFile.h" #include "ImfNamespace.h" #include "ImfForward.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //----------------------------------------------------------------------------- // class TiledInputPart: // // Same interface as TiledInputFile. Please have a reference to TiledInputFile. //----------------------------------------------------------------------------- class TiledInputPart { public: IMF_EXPORT TiledInputPart(MultiPartInputFile& multiPartFile, int partNumber); IMF_EXPORT const char * fileName () const; IMF_EXPORT const Header & header () const; IMF_EXPORT int version () const; IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT bool isComplete () const; IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; IMF_EXPORT void readTile (int dx, int dy, int l = 0); IMF_EXPORT void readTile (int dx, int dy, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void readTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); IMF_EXPORT void rawTileData (int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize); private: TiledInputFile* file; // for internal use - allow TiledOutputFile access to file for copyPixels friend class TiledOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFTILEDINPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfTiledMisc.cpp000066400000000000000000000240371406177042200206700ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Miscellaneous stuff related to tiled files // //----------------------------------------------------------------------------- #include #include "Iex.h" #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; int levelSize (int min, int max, int l, LevelRoundingMode rmode) { if (l < 0) throw IEX_NAMESPACE::ArgExc ("Argument not in valid range."); int a = max - min + 1; int b = (1 << l); int size = a / b; if (rmode == ROUND_UP && size * b < a) size += 1; return std::max (size, 1); } Box2i dataWindowForLevel (const TileDescription &tileDesc, int minX, int maxX, int minY, int maxY, int lx, int ly) { V2i levelMin = V2i (minX, minY); V2i levelMax = levelMin + V2i (levelSize (minX, maxX, lx, tileDesc.roundingMode) - 1, levelSize (minY, maxY, ly, tileDesc.roundingMode) - 1); return Box2i(levelMin, levelMax); } Box2i dataWindowForTile (const TileDescription &tileDesc, int minX, int maxX, int minY, int maxY, int dx, int dy, int lx, int ly) { V2i tileMin = V2i (minX + dx * tileDesc.xSize, minY + dy * tileDesc.ySize); int64_t tileMaxX = int64_t(tileMin[0]) + tileDesc.xSize - 1; int64_t tileMaxY = int64_t(tileMin[1]) + tileDesc.ySize - 1; V2i levelMax = dataWindowForLevel (tileDesc, minX, maxX, minY, maxY, lx, ly).max; V2i tileMax = V2i (std::min (tileMaxX, int64_t(levelMax[0])), std::min (tileMaxY, int64_t(levelMax[1]))); return Box2i (tileMin, tileMax); } size_t calculateBytesPerPixel (const Header &header) { const ChannelList &channels = header.channels(); size_t bytesPerPixel = 0; for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c) { bytesPerPixel += pixelTypeSize (c.channel().type); } return bytesPerPixel; } void calculateBytesPerLine (const Header &header, char* sampleCountBase, int sampleCountXStride, int sampleCountYStride, int minX, int maxX, int minY, int maxY, std::vector& xOffsets, std::vector& yOffsets, std::vector& bytesPerLine) { const ChannelList &channels = header.channels(); int pos = 0; for (ChannelList::ConstIterator c = channels.begin(); c != channels.end(); ++c, ++pos) { int xOffset = xOffsets[pos]; int yOffset = yOffsets[pos]; int i = 0; for (int y = minY - yOffset; y <= maxY - yOffset; y++, i++) for (int x = minX - xOffset; x <= maxX - xOffset; x++) { bytesPerLine[i] += sampleCount(sampleCountBase, sampleCountXStride, sampleCountYStride, x, y) * pixelTypeSize (c.channel().type); } } } namespace { int floorLog2 (int x) { // // For x > 0, floorLog2(y) returns floor(log(x)/log(2)). // int y = 0; while (x > 1) { y += 1; x >>= 1; } return y; } int ceilLog2 (int x) { // // For x > 0, ceilLog2(y) returns ceil(log(x)/log(2)). // int y = 0; int r = 0; while (x > 1) { if (x & 1) r = 1; y += 1; x >>= 1; } return y + r; } int roundLog2 (int x, LevelRoundingMode rmode) { return (rmode == ROUND_DOWN)? floorLog2 (x): ceilLog2 (x); } int calculateNumXLevels (const TileDescription& tileDesc, int minX, int maxX, int minY, int maxY) { int num = 0; switch (tileDesc.mode) { case ONE_LEVEL: num = 1; break; case MIPMAP_LEVELS: { int w = maxX - minX + 1; int h = maxY - minY + 1; num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; } break; case RIPMAP_LEVELS: { int w = maxX - minX + 1; num = roundLog2 (w, tileDesc.roundingMode) + 1; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } return num; } int calculateNumYLevels (const TileDescription& tileDesc, int minX, int maxX, int minY, int maxY) { int num = 0; switch (tileDesc.mode) { case ONE_LEVEL: num = 1; break; case MIPMAP_LEVELS: { int w = maxX - minX + 1; int h = maxY - minY + 1; num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; } break; case RIPMAP_LEVELS: { int h = maxY - minY + 1; num = roundLog2 (h, tileDesc.roundingMode) + 1; } break; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } return num; } void calculateNumTiles (int *numTiles, int numLevels, int min, int max, int size, LevelRoundingMode rmode) { for (int i = 0; i < numLevels; i++) { // use 64 bits to avoid int overflow if size is large. Int64 l = levelSize (min, max, i, rmode); numTiles[i] = (l + size - 1) / size; } } } // namespace void precalculateTileInfo (const TileDescription& tileDesc, int minX, int maxX, int minY, int maxY, int *&numXTiles, int *&numYTiles, int &numXLevels, int &numYLevels) { numXLevels = calculateNumXLevels(tileDesc, minX, maxX, minY, maxY); numYLevels = calculateNumYLevels(tileDesc, minX, maxX, minY, maxY); numXTiles = new int[numXLevels]; numYTiles = new int[numYLevels]; calculateNumTiles (numXTiles, numXLevels, minX, maxX, tileDesc.xSize, tileDesc.roundingMode); calculateNumTiles (numYTiles, numYLevels, minY, maxY, tileDesc.ySize, tileDesc.roundingMode); } int getTiledChunkOffsetTableSize(const Header& header) { // // Save the dataWindow information // const Box2i &dataWindow = header.dataWindow(); // // Precompute level and tile information. // int* numXTiles=nullptr; int* numYTiles=nullptr; int numXLevels; int numYLevels; try { precalculateTileInfo (header.tileDescription(), dataWindow.min.x, dataWindow.max.x, dataWindow.min.y, dataWindow.max.y, numXTiles, numYTiles, numXLevels, numYLevels); // // Calculate lineOffsetSize. // Int64 lineOffsetSize = 0; const TileDescription &desc = header.tileDescription(); switch (desc.mode) { case ONE_LEVEL: case MIPMAP_LEVELS: for (int i = 0; i < numXLevels; i++) { lineOffsetSize += static_cast(numXTiles[i]) * static_cast(numYTiles[i]); if ( lineOffsetSize > static_cast(std::numeric_limits::max()) ) { throw IEX_NAMESPACE::LogicExc("Maximum number of tiles exceeded"); } } break; case RIPMAP_LEVELS: for (int i = 0; i < numXLevels; i++) { for (int j = 0; j < numYLevels; j++) { lineOffsetSize += static_cast(numXTiles[i]) * static_cast(numYTiles[j]); if ( lineOffsetSize > static_cast(std::numeric_limits::max()) ) { throw IEX_NAMESPACE::LogicExc("Maximum number of tiles exceeded"); } } } break; case NUM_LEVELMODES : throw IEX_NAMESPACE::LogicExc("Bad level mode getting chunk offset table size"); } delete[] numXTiles; delete[] numYTiles; return static_cast(lineOffsetSize); } catch(...) { delete[] numXTiles; delete[] numYTiles; throw; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledMisc.h000066400000000000000000000073221406177042200203330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILED_MISC_H #define INCLUDED_IMF_TILED_MISC_H //----------------------------------------------------------------------------- // // Miscellaneous stuff related to tiled files // //----------------------------------------------------------------------------- #include "ImathBox.h" #include "ImfHeader.h" #include "ImfNamespace.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMF_EXPORT int levelSize (int min, int max, int l, LevelRoundingMode rmode); IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (const TileDescription &tileDesc, int minX, int maxX, int minY, int maxY, int lx, int ly); IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (const TileDescription &tileDesc, int minX, int maxX, int minY, int maxY, int dx, int dy, int lx, int ly); IMF_EXPORT size_t calculateBytesPerPixel (const Header &header); // // Calculate the count of bytes for each lines in range [minY, maxY], // and pixels in range [minX, maxX]. // Data will be saved in bytesPerLine. // sampleCountBase, sampleCountXStride and sampleCountYStride are // used to get the sample count values. // IMF_EXPORT void calculateBytesPerLine (const Header &header, char* sampleCountBase, int sampleCountXStride, int sampleCountYStride, int minX, int maxX, int minY, int maxY, std::vector& xOffsets, std::vector& yOffsets, std::vector& bytesPerLine); IMF_EXPORT void precalculateTileInfo (const TileDescription& tileDesc, int minX, int maxX, int minY, int maxY, int *&numXTiles, int *&numYTiles, int &numXLevels, int &numYLevels); IMF_EXPORT int getTiledChunkOffsetTableSize(const Header& header); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTiledOutputFile.cpp000066400000000000000000001367701406177042200221050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TiledOutputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include "ImathBox.h" #include #include #include #include #include #include #include "IlmThreadPool.h" #include "IlmThreadSemaphore.h" #include "IlmThreadMutex.h" #include "ImfOutputStreamMutex.h" #include "ImfOutputPartData.h" #include "Iex.h" #include #include #include #include #include #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using IMATH_NAMESPACE::Box2i; using IMATH_NAMESPACE::V2i; using std::string; using std::vector; using std::map; using std::min; using std::max; using std::swap; using ILMTHREAD_NAMESPACE::Mutex; using ILMTHREAD_NAMESPACE::Lock; using ILMTHREAD_NAMESPACE::Semaphore; using ILMTHREAD_NAMESPACE::Task; using ILMTHREAD_NAMESPACE::TaskGroup; using ILMTHREAD_NAMESPACE::ThreadPool; namespace { struct TOutSliceInfo { PixelType type; const char * base; size_t xStride; size_t yStride; bool zero; int xTileCoords; int yTileCoords; TOutSliceInfo (PixelType type = HALF, const char *base = 0, size_t xStride = 0, size_t yStride = 0, bool zero = false, int xTileCoords = 0, int yTileCoords = 0); }; TOutSliceInfo::TOutSliceInfo (PixelType t, const char *b, size_t xs, size_t ys, bool z, int xtc, int ytc) : type (t), base (b), xStride (xs), yStride (ys), zero (z), xTileCoords (xtc), yTileCoords (ytc) { // empty } struct TileCoord { int dx; int dy; int lx; int ly; TileCoord (int xTile = 0, int yTile = 0, int xLevel = 0, int yLevel = 0) : dx (xTile), dy (yTile), lx (xLevel), ly (yLevel) { // empty } bool operator < (const TileCoord &other) const { return (ly < other.ly) || (ly == other.ly && lx < other.lx) || ((ly == other.ly && lx == other.lx) && ((dy < other.dy) || (dy == other.dy && dx < other.dx))); } bool operator == (const TileCoord &other) const { return lx == other.lx && ly == other.ly && dx == other.dx && dy == other.dy; } }; struct BufferedTile { char * pixelData; int pixelDataSize; BufferedTile (const char *data, int size): pixelData (0), pixelDataSize(size) { pixelData = new char[pixelDataSize]; memcpy (pixelData, data, pixelDataSize); } ~BufferedTile() { delete [] pixelData; } BufferedTile (const BufferedTile& other) = delete; BufferedTile& operator = (const BufferedTile& other) = delete; BufferedTile (BufferedTile&& other) = delete; BufferedTile& operator = (BufferedTile&& other) = delete; }; typedef map TileMap; struct TileBuffer { Array buffer; const char * dataPtr; int dataSize; Compressor * compressor; TileCoord tileCoord; bool hasException; string exception; TileBuffer (Compressor *comp); ~TileBuffer (); inline void wait () {_sem.wait();} inline void post () {_sem.post();} protected: Semaphore _sem; }; TileBuffer::TileBuffer (Compressor *comp): dataPtr (0), dataSize (0), compressor (comp), hasException (false), exception (), _sem (1) { // empty } TileBuffer::~TileBuffer () { delete compressor; } } // namespace struct TiledOutputFile::Data { Header header; // the image header int version; // file format version bool multipart; // part came from a multipart file TileDescription tileDesc; // describes the tile layout FrameBuffer frameBuffer; // framebuffer to write into Int64 previewPosition; LineOrder lineOrder; // the file's lineorder int minX; // data window's min x coord int maxX; // data window's max x coord int minY; // data window's min y coord int maxY; // data window's max x coord int numXLevels; // number of x levels int numYLevels; // number of y levels int * numXTiles; // number of x tiles at a level int * numYTiles; // number of y tiles at a level TileOffsets tileOffsets; // stores offsets in file for // each tile Compressor::Format format; // compressor's data format vector slices; // info about channels in file size_t maxBytesPerTileLine; // combined size of a tile line // over all channels vector tileBuffers; size_t tileBufferSize; // size of a tile buffer Int64 tileOffsetsPosition; // position of the tile index TileMap tileMap; TileCoord nextTileToWrite; int partNumber; // the output part number Data (int numThreads); ~Data (); Data (const Data& other) = delete; Data& operator = (const Data& other) = delete; Data (Data&& other) = delete; Data& operator = (Data&& other) = delete; inline TileBuffer * getTileBuffer (int number); // hash function from tile // buffer coords into our // vector of tile buffers TileCoord nextTileCoord (const TileCoord &a); }; TiledOutputFile::Data::Data (int numThreads): multipart(false), numXTiles(0), numYTiles(0), tileOffsetsPosition (0), partNumber(-1) { // // We need at least one tileBuffer, but if threading is used, // to keep n threads busy we need 2*n tileBuffers // tileBuffers.resize (max (1, 2 * numThreads)); } TiledOutputFile::Data::~Data () { delete [] numXTiles; delete [] numYTiles; // // Delete all the tile buffers, if any still happen to exist // for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i) delete i->second; for (size_t i = 0; i < tileBuffers.size(); i++) delete tileBuffers[i]; } TileBuffer* TiledOutputFile::Data::getTileBuffer (int number) { return tileBuffers[number % tileBuffers.size()]; } TileCoord TiledOutputFile::Data::nextTileCoord (const TileCoord &a) { TileCoord b = a; if (lineOrder == INCREASING_Y) { b.dx++; if (b.dx >= numXTiles[b.lx]) { b.dx = 0; b.dy++; if (b.dy >= numYTiles[b.ly]) { // // the next tile is in the next level // b.dy = 0; switch (tileDesc.mode) { case ONE_LEVEL: case MIPMAP_LEVELS: b.lx++; b.ly++; break; case RIPMAP_LEVELS: b.lx++; if (b.lx >= numXLevels) { b.lx = 0; b.ly++; #ifdef DEBUG assert (b.ly <= numYLevels); #endif } break; case NUM_LEVELMODES: throw(IEX_NAMESPACE::ArgExc("Invalid tile description")); } } } } else if (lineOrder == DECREASING_Y) { b.dx++; if (b.dx >= numXTiles[b.lx]) { b.dx = 0; b.dy--; if (b.dy < 0) { // // the next tile is in the next level // switch (tileDesc.mode) { case ONE_LEVEL: case MIPMAP_LEVELS: b.lx++; b.ly++; break; case RIPMAP_LEVELS: b.lx++; if (b.lx >= numXLevels) { b.lx = 0; b.ly++; #ifdef DEBUG assert (b.ly <= numYLevels); #endif } break; case NUM_LEVELMODES: throw(IEX_NAMESPACE::ArgExc("Invalid tile description")); } if (b.ly < numYLevels) b.dy = numYTiles[b.ly] - 1; } } } return b; } namespace { void writeTileData (OutputStreamMutex *streamData, TiledOutputFile::Data *ofd, int dx, int dy, int lx, int ly, const char pixelData[], int pixelDataSize) { // // Store a block of pixel data in the output file, and try // to keep track of the current writing position the file, // without calling tellp() (tellp() can be fairly expensive). // Int64 currentPosition = streamData->currentPosition; streamData->currentPosition = 0; if (currentPosition == 0) currentPosition = streamData->os->tellp(); ofd->tileOffsets (dx, dy, lx, ly) = currentPosition; #ifdef DEBUG assert (streamData->os->tellp() == currentPosition); #endif // // Write the tile header. // if (ofd->multipart) { Xdr::write (*streamData->os, ofd->partNumber); } Xdr::write (*streamData->os, dx); Xdr::write (*streamData->os, dy); Xdr::write (*streamData->os, lx); Xdr::write (*streamData->os, ly); Xdr::write (*streamData->os, pixelDataSize); streamData->os->write (pixelData, pixelDataSize); // // Keep current position in the file so that we can avoid // redundant seekg() operations (seekg() can be fairly expensive). // streamData->currentPosition = currentPosition + 5 * Xdr::size() + pixelDataSize; if (ofd->multipart) { streamData->currentPosition += Xdr::size(); } } void bufferedTileWrite (OutputStreamMutex *streamData, TiledOutputFile::Data *ofd, int dx, int dy, int lx, int ly, const char pixelData[], int pixelDataSize) { // // Check if a tile with coordinates (dx,dy,lx,ly) has already been written. // if (ofd->tileOffsets (dx, dy, lx, ly)) { THROW (IEX_NAMESPACE::ArgExc, "Attempt to write tile " "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " "more than once."); } // // If tiles can be written in random order, then don't buffer anything. // if (ofd->lineOrder == RANDOM_Y) { writeTileData (streamData, ofd, dx, dy, lx, ly, pixelData, pixelDataSize); return; } // // If the tiles cannot be written in random order, then check if a // tile with coordinates (dx,dy,lx,ly) has already been buffered. // TileCoord currentTile = TileCoord(dx, dy, lx, ly); if (ofd->tileMap.find (currentTile) != ofd->tileMap.end()) { THROW (IEX_NAMESPACE::ArgExc, "Attempt to write tile " "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " "more than once."); } // // If all the tiles before this one have already been written to the file, // then write this tile immediately and check if we have buffered tiles // that can be written after this tile. // // Otherwise, buffer the tile so it can be written to file later. // if (ofd->nextTileToWrite == currentTile) { writeTileData (streamData, ofd, dx, dy, lx, ly, pixelData, pixelDataSize); ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite); // // Step through the tiles and write all successive buffered tiles after // the current one. // while(i != ofd->tileMap.end()) { // // Write the tile, and then delete the tile's buffered data // writeTileData (streamData, ofd, i->first.dx, i->first.dy, i->first.lx, i->first.ly, i->second->pixelData, i->second->pixelDataSize); delete i->second; ofd->tileMap.erase (i); // // Proceed to the next tile // ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); i = ofd->tileMap.find (ofd->nextTileToWrite); } } else { // // Create a new BufferedTile, copy the pixelData into it, and // insert it into the tileMap. // ofd->tileMap[currentTile] = new BufferedTile ((const char *)pixelData, pixelDataSize); } } void convertToXdr (TiledOutputFile::Data *ofd, Array& tileBuffer, int numScanLines, int numPixelsPerScanLine) { // // Convert the contents of a TiledOutputFile's tileBuffer from the // machine's native representation to Xdr format. This function is called // by writeTile(), below, if the compressor wanted its input pixel data // in the machine's native format, but then failed to compress the data // (most compressors will expand rather than compress random input data). // // Note that this routine assumes that the machine's native representation // of the pixel data has the same size as the Xdr representation. This // makes it possible to convert the pixel data in place, without an // intermediate temporary buffer. // // // Set these to point to the start of the tile. // We will write to toPtr, and read from fromPtr. // char *writePtr = tileBuffer; const char *readPtr = writePtr; // // Iterate over all scan lines in the tile. // for (int y = 0; y < numScanLines; ++y) { // // Iterate over all slices in the file. // for (unsigned int i = 0; i < ofd->slices.size(); ++i) { const TOutSliceInfo &slice = ofd->slices[i]; // // Convert the samples in place. // convertInPlace (writePtr, readPtr, slice.type, numPixelsPerScanLine); } } #ifdef DEBUG assert (writePtr == readPtr); #endif } // // A TileBufferTask encapsulates the task of copying a tile from // the user's framebuffer into a LineBuffer and compressing the data // if necessary. // class TileBufferTask: public Task { public: TileBufferTask (TaskGroup *group, TiledOutputFile::Data *ofd, int number, int dx, int dy, int lx, int ly); virtual ~TileBufferTask (); virtual void execute (); private: TiledOutputFile::Data * _ofd; TileBuffer * _tileBuffer; }; TileBufferTask::TileBufferTask (TaskGroup *group, TiledOutputFile::Data *ofd, int number, int dx, int dy, int lx, int ly) : Task (group), _ofd (ofd), _tileBuffer (_ofd->getTileBuffer (number)) { // // Wait for the tileBuffer to become available // _tileBuffer->wait (); _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly); } TileBufferTask::~TileBufferTask () { // // Signal that the tile buffer is now free // _tileBuffer->post (); } void TileBufferTask::execute () { try { // // First copy the pixel data from the frame buffer // into the tile buffer // // Convert one tile's worth of pixel data to // a machine-independent representation, and store // the result in _tileBuffer->buffer. // char *writePtr = _tileBuffer->buffer; Box2i tileRange = dataWindowForTile (_ofd->tileDesc, _ofd->minX, _ofd->maxX, _ofd->minY, _ofd->maxY, _tileBuffer->tileCoord.dx, _tileBuffer->tileCoord.dy, _tileBuffer->tileCoord.lx, _tileBuffer->tileCoord.ly); int numScanLines = tileRange.max.y - tileRange.min.y + 1; int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; // // Iterate over the scan lines in the tile. // for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) { // // Iterate over all image channels. // for (unsigned int i = 0; i < _ofd->slices.size(); ++i) { const TOutSliceInfo &slice = _ofd->slices[i]; // // These offsets are used to facilitate both absolute // and tile-relative pixel coordinates. // int xOffset = slice.xTileCoords * tileRange.min.x; int yOffset = slice.yTileCoords * tileRange.min.y; // // Fill the tile buffer with pixel data. // if (slice.zero) { // // The frame buffer contains no data for this channel. // Store zeroes in _data->tileBuffer. // fillChannelWithZeroes (writePtr, _ofd->format, slice.type, numPixelsPerScanLine); } else { // // The frame buffer contains data for this channel. // const char *readPtr = slice.base + (y - yOffset) * slice.yStride + (tileRange.min.x - xOffset) * slice.xStride; const char *endPtr = readPtr + (numPixelsPerScanLine - 1) * slice.xStride; copyFromFrameBuffer (writePtr, readPtr, endPtr, slice.xStride, _ofd->format, slice.type); } } } // // Compress the contents of the tileBuffer, // and store the compressed data in the output file. // _tileBuffer->dataSize = writePtr - _tileBuffer->buffer; _tileBuffer->dataPtr = _tileBuffer->buffer; if (_tileBuffer->compressor) { const char *compPtr; int compSize = _tileBuffer->compressor->compressTile (_tileBuffer->dataPtr, _tileBuffer->dataSize, tileRange, compPtr); if (compSize < _tileBuffer->dataSize) { _tileBuffer->dataSize = compSize; _tileBuffer->dataPtr = compPtr; } else if (_ofd->format == Compressor::NATIVE) { // // The data did not shrink during compression, but // we cannot write to the file using native format, // so we need to convert the lineBuffer to Xdr. // convertToXdr (_ofd, _tileBuffer->buffer, numScanLines, numPixelsPerScanLine); } } } catch (std::exception &e) { if (!_tileBuffer->hasException) { _tileBuffer->exception = e.what (); _tileBuffer->hasException = true; } } catch (...) { if (!_tileBuffer->hasException) { _tileBuffer->exception = "unrecognized exception"; _tileBuffer->hasException = true; } } } } // namespace TiledOutputFile::TiledOutputFile (const char fileName[], const Header &header, int numThreads) : _data (new Data (numThreads)), _streamData (new OutputStreamMutex()), _deleteStream (true) { try { header.sanityCheck (true); _streamData->os = new StdOFStream (fileName); _data->multipart=false; // since we opened with one header we can't be multipart initialize (header); _streamData->currentPosition = _streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_streamData->os, true); _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_streamData->os); } catch (IEX_NAMESPACE::BaseExc &e) { // ~TiledOutputFile will not run, so free memory here delete _streamData->os; delete _streamData; delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << fileName << "\". " << e.what()); throw; } catch (...) { // ~TiledOutputFile will not run, so free memory here delete _streamData->os; delete _streamData; delete _data; throw; } } TiledOutputFile::TiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads) : _data (new Data (numThreads)), _streamData (new OutputStreamMutex()), _deleteStream (false) { try { header.sanityCheck(true); _streamData->os = &os; _data->multipart=false; // since we opened with one header we can't be multipart initialize (header); _streamData->currentPosition = _streamData->os->tellp(); // Write header and empty offset table to the file. writeMagicNumberAndVersionField(*_streamData->os, _data->header); _data->previewPosition = _data->header.writeTo (*_streamData->os, true); _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_streamData->os); } catch (IEX_NAMESPACE::BaseExc &e) { delete _streamData; delete _data; REPLACE_EXC (e, "Cannot open image file " "\"" << os.fileName() << "\". " << e.what()); throw; } catch (...) { delete _streamData; delete _data; throw; } } TiledOutputFile::TiledOutputFile(const OutputPartData* part) : _deleteStream (false) { try { if (part->header.type() != TILEDIMAGE) throw IEX_NAMESPACE::ArgExc("Can't build a TiledOutputFile from a type-mismatched part."); _streamData = part->mutex; _data = new Data(part->numThreads); _data->multipart=part->multipart; initialize(part->header); _data->partNumber = part->partNumber; _data->tileOffsetsPosition = part->chunkOffsetTablePosition; _data->previewPosition = part->previewPosition; } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot initialize output part " "\"" << part->partNumber << "\". " << e.what()); throw; } catch (...) { delete _data; throw; } } void TiledOutputFile::initialize (const Header &header) { _data->header = header; _data->lineOrder = _data->header.lineOrder(); // // Check that the file is indeed tiled // _data->tileDesc = _data->header.tileDescription(); // // 'Fix' the type attribute if it exists but is incorrectly set // (attribute is optional, but ensure it is correct if it exists) // if(_data->header.hasType()) { _data->header.setType(TILEDIMAGE); } // // Save the dataWindow information // const Box2i &dataWindow = _data->header.dataWindow(); _data->minX = dataWindow.min.x; _data->maxX = dataWindow.max.x; _data->minY = dataWindow.min.y; _data->maxY = dataWindow.max.y; // // Precompute level and tile information to speed up utility functions // precalculateTileInfo (_data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, _data->numXTiles, _data->numYTiles, _data->numXLevels, _data->numYLevels); // // Determine the first tile coordinate that we will be writing // if the file is not RANDOM_Y. // _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)? TileCoord (0, 0, 0, 0): TileCoord (0, _data->numYTiles[0] - 1, 0, 0); _data->maxBytesPerTileLine = calculateBytesPerPixel (_data->header) * _data->tileDesc.xSize; _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; // // OpenEXR has a limit of INT_MAX compressed bytes per tile // disallow uncompressed tile sizes above INT_MAX too to guarantee file is written // if( _data->tileBufferSize > INT_MAX ) { throw IEX_NAMESPACE::ArgExc ("Tile size too large for OpenEXR format"); } // // Create all the TileBuffers and allocate their internal buffers // for (size_t i = 0; i < _data->tileBuffers.size(); i++) { _data->tileBuffers[i] = new TileBuffer (newTileCompressor (_data->header.compression(), _data->maxBytesPerTileLine, _data->tileDesc.ySize, _data->header)); _data->tileBuffers[i]->buffer.resizeErase(_data->tileBufferSize); } _data->format = defaultFormat (_data->tileBuffers[0]->compressor); _data->tileOffsets = TileOffsets (_data->tileDesc.mode, _data->numXLevels, _data->numYLevels, _data->numXTiles, _data->numYTiles); } TiledOutputFile::~TiledOutputFile () { if (_data) { { Lock lock(*_streamData); Int64 originalPosition = _streamData->os->tellp(); if (_data->tileOffsetsPosition > 0) { try { _streamData->os->seekp (_data->tileOffsetsPosition); _data->tileOffsets.writeTo (*_streamData->os); // // Restore the original position. // _streamData->os->seekp (originalPosition); } catch (...) //NOSONAR - suppress vulnerability reports from SonarCloud. { // // We cannot safely throw any exceptions from here. // This destructor may have been called because the // stack is currently being unwound for another // exception. // } } } if (_deleteStream && _streamData) delete _streamData->os; if (_data->partNumber == -1) delete _streamData; delete _data; } } const char * TiledOutputFile::fileName () const { return _streamData->os->fileName(); } const Header & TiledOutputFile::header () const { return _data->header; } void TiledOutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) { Lock lock (*_streamData); // // Check if the new frame buffer descriptor // is compatible with the image file header. // const ChannelList &channels = _data->header.channels(); for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) continue; if (i.channel().type != j.slice().type) THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " "of output file \"" << fileName() << "\" is " "not compatible with the frame buffer's " "pixel type."); if (j.slice().xSampling != 1 || j.slice().ySampling != 1) THROW (IEX_NAMESPACE::ArgExc, "All channels in a tiled file must have" "sampling (1,1)."); } // // Initialize slice table for writePixels(). // vector slices; for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) { FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); if (j == frameBuffer.end()) { // // Channel i is not present in the frame buffer. // In the file, channel i will contain only zeroes. // slices.push_back (TOutSliceInfo (i.channel().type, 0, // base 0, // xStride, 0, // yStride, true)); // zero } else { // // Channel i is present in the frame buffer. // slices.push_back (TOutSliceInfo (j.slice().type, j.slice().base, j.slice().xStride, j.slice().yStride, false, // zero (j.slice().xTileCoords)? 1: 0, (j.slice().yTileCoords)? 1: 0)); } } // // Store the new frame buffer. // _data->frameBuffer = frameBuffer; _data->slices = slices; } const FrameBuffer & TiledOutputFile::frameBuffer () const { Lock lock (*_streamData); return _data->frameBuffer; } void TiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { try { Lock lock (*_streamData); if (_data->slices.size() == 0) throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " "as pixel data source."); if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Tile coordinates are invalid."); if (!isValidLevel (lx, ly)) THROW (IEX_NAMESPACE::ArgExc, "Level coordinate " "(" << lx << ", " << ly << ") " "is invalid."); // // Determine the first and last tile coordinates in both dimensions // based on the file's lineOrder // if (dx1 > dx2) swap (dx1, dx2); if (dy1 > dy2) swap (dy1, dy2); int dyStart = dy1; int dY = 1; if (_data->lineOrder == DECREASING_Y) { dyStart = dy2; dY = -1; } int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); int numTasks = min ((int)_data->tileBuffers.size(), numTiles); // // Create a task group for all tile buffer tasks. When the // task group goes out of scope, the destructor waits until // all tasks are complete. // { TaskGroup taskGroup; // // Add in the initial compression tasks to the thread pool // int nextCompBuffer = 0; int dxComp = dx1; int dyComp = dyStart; while (nextCompBuffer < numTasks) { ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, _data, nextCompBuffer++, dxComp, dyComp, lx, ly)); dxComp++; if (dxComp > dx2) { dxComp = dx1; dyComp += dY; } } // // Write the compressed buffers and add in more compression // tasks until done // int nextWriteBuffer = 0; int dxWrite = dx1; int dyWrite = dyStart; while (nextWriteBuffer < numTiles) { // // Wait until the nextWriteBuffer is ready to be written // TileBuffer* writeBuffer = _data->getTileBuffer (nextWriteBuffer); writeBuffer->wait(); // // Write the tilebuffer // bufferedTileWrite (_streamData, _data, dxWrite, dyWrite, lx, ly, writeBuffer->dataPtr, writeBuffer->dataSize); // // Release the lock on nextWriteBuffer // writeBuffer->post(); // // If there are no more tileBuffers to compress, then // only continue to write out remaining tileBuffers, // otherwise keep adding compression tasks. // if (nextCompBuffer < numTiles) { // // add nextCompBuffer as a compression Task // ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, _data, nextCompBuffer, dxComp, dyComp, lx, ly)); } nextWriteBuffer++; dxWrite++; if (dxWrite > dx2) { dxWrite = dx1; dyWrite += dY; } nextCompBuffer++; dxComp++; if (dxComp > dx2) { dxComp = dx1; dyComp += dY; } } // // finish all tasks // } // // Exeption handling: // // TileBufferTask::execute() may have encountered exceptions, but // those exceptions occurred in another thread, not in the thread // that is executing this call to TiledOutputFile::writeTiles(). // TileBufferTask::execute() has caught all exceptions and stored // the exceptions' what() strings in the tile buffers. // Now we check if any tile buffer contains a stored exception; if // this is the case then we re-throw the exception in this thread. // (It is possible that multiple tile buffers contain stored // exceptions. We re-throw the first exception we find and // ignore all others.) // const string *exception = 0; for (size_t i = 0; i < _data->tileBuffers.size(); ++i) { TileBuffer *tileBuffer = _data->tileBuffers[i]; if (tileBuffer->hasException && !exception) exception = &tileBuffer->exception; tileBuffer->hasException = false; } if (exception) throw IEX_NAMESPACE::IoExc (*exception); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Failed to write pixel data to image " "file \"" << fileName() << "\". " << e.what()); throw; } } void TiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l) { writeTiles (dx1, dxMax, dyMin, dyMax, l, l); } void TiledOutputFile::writeTile (int dx, int dy, int lx, int ly) { writeTiles (dx, dx, dy, dy, lx, ly); } void TiledOutputFile::writeTile (int dx, int dy, int l) { writeTile(dx, dy, l, l); } void TiledOutputFile::copyPixels (TiledInputFile &in) { Lock lock (*_streamData); // // Check if this file's and and the InputFile's // headers are compatible. // const Header &hdr = _data->header; const Header &inHdr = in.header(); if (!hdr.hasTileDescription() || !inHdr.hasTileDescription()) THROW (IEX_NAMESPACE::ArgExc, "Cannot perform a quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". The " "output file is tiled, but the input file is not. " "Try using OutputFile::copyPixels() instead."); if (!(hdr.tileDescription() == inHdr.tileDescription())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different tile descriptions."); if (!(hdr.dataWindow() == inHdr.dataWindow())) THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\". The " "files have different data windows."); if (!(hdr.lineOrder() == inHdr.lineOrder())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files have different line orders."); if (!(hdr.compression() == inHdr.compression())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" failed. " "The files use different compression methods."); if (!(hdr.channels() == inHdr.channels())) THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << fileName() << "\" " "failed. The files have different channel " "lists."); // // Verify that no pixel data have been written to this file yet. // if (!_data->tileOffsets.isEmpty()) THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " "file \"" << in.fileName() << "\" to image " "file \"" << _streamData->os->fileName() << "\" " "failed. \"" << fileName() << "\" " "already contains pixel data."); // // Calculate the total number of tiles in the file // int numAllTiles = 0; switch (levelMode ()) { case ONE_LEVEL: case MIPMAP_LEVELS: for (int i_l = 0; i_l < numLevels (); ++i_l) numAllTiles += numXTiles (i_l) * numYTiles (i_l); break; case RIPMAP_LEVELS: for (int i_ly = 0; i_ly < numYLevels (); ++i_ly) for (int i_lx = 0; i_lx < numXLevels (); ++i_lx) numAllTiles += numXTiles (i_lx) * numYTiles (i_ly); break; default: throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); } bool random_y = _data->lineOrder==RANDOM_Y; std::vector dx_table(random_y ? numAllTiles : 1); std::vector dy_table(random_y ? numAllTiles : 1); std::vector lx_table(random_y ? numAllTiles : 1); std::vector ly_table(random_y ? numAllTiles : 1); if(random_y) { in.tileOrder(&dx_table[0],&dy_table[0],&lx_table[0],&ly_table[0]); _data->nextTileToWrite.dx=dx_table[0]; _data->nextTileToWrite.dy=dy_table[0]; _data->nextTileToWrite.lx=lx_table[0]; _data->nextTileToWrite.ly=ly_table[0]; } for (int i = 0; i < numAllTiles; ++i) { const char *pixelData; int pixelDataSize; int dx = _data->nextTileToWrite.dx; int dy = _data->nextTileToWrite.dy; int lx = _data->nextTileToWrite.lx; int ly = _data->nextTileToWrite.ly; in.rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); writeTileData (_streamData, _data, dx, dy, lx, ly, pixelData, pixelDataSize); if(random_y) { if(inextTileToWrite.dx=dx_table[i+1]; _data->nextTileToWrite.dy=dy_table[i+1]; _data->nextTileToWrite.lx=lx_table[i+1]; _data->nextTileToWrite.ly=ly_table[i+1]; } }else{ _data->nextTileToWrite=_data->nextTileCoord(_data->nextTileToWrite); } } } void TiledOutputFile::copyPixels (InputFile &in) { copyPixels (*in.tFile()); } void TiledOutputFile::copyPixels (InputPart &in) { copyPixels (*in.file); } void TiledOutputFile::copyPixels (TiledInputPart &in) { copyPixels (*in.file); } unsigned int TiledOutputFile::tileXSize () const { return _data->tileDesc.xSize; } unsigned int TiledOutputFile::tileYSize () const { return _data->tileDesc.ySize; } LevelMode TiledOutputFile::levelMode () const { return _data->tileDesc.mode; } LevelRoundingMode TiledOutputFile::levelRoundingMode () const { return _data->tileDesc.roundingMode; } int TiledOutputFile::numLevels () const { if (levelMode() == RIPMAP_LEVELS) THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " "file \"" << fileName() << "\" " "(numLevels() is not defined for RIPMAPs)."); return _data->numXLevels; } int TiledOutputFile::numXLevels () const { return _data->numXLevels; } int TiledOutputFile::numYLevels () const { return _data->numYLevels; } bool TiledOutputFile::isValidLevel (int lx, int ly) const { if (lx < 0 || ly < 0) return false; if (levelMode() == MIPMAP_LEVELS && lx != ly) return false; if (lx >= numXLevels() || ly >= numYLevels()) return false; return true; } int TiledOutputFile::levelWidth (int lx) const { try { int retVal = levelSize (_data->minX, _data->maxX, lx, _data->tileDesc.roundingMode); return retVal; } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelWidth() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int TiledOutputFile::levelHeight (int ly) const { try { return levelSize (_data->minY, _data->maxY, ly, _data->tileDesc.roundingMode); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling levelHeight() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } int TiledOutputFile::numXTiles (int lx) const { if (lx < 0 || lx >= _data->numXLevels) THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " "file \"" << _streamData->os->fileName() << "\" " "(Argument is not in valid range)."); return _data->numXTiles[lx]; } int TiledOutputFile::numYTiles (int ly) const { if (ly < 0 || ly >= _data->numYLevels) THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " "file \"" << _streamData->os->fileName() << "\" " "(Argument is not in valid range)."); return _data->numYTiles[ly]; } Box2i TiledOutputFile::dataWindowForLevel (int l) const { return dataWindowForLevel (l, l); } Box2i TiledOutputFile::dataWindowForLevel (int lx, int ly) const { try { return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } Box2i TiledOutputFile::dataWindowForTile (int dx, int dy, int l) const { return dataWindowForTile (dx, dy, l, l); } Box2i TiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { try { if (!isValidTile (dx, dy, lx, ly)) throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( _data->tileDesc, _data->minX, _data->maxX, _data->minY, _data->maxY, dx, dy, lx, ly); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Error calling dataWindowForTile() on image " "file \"" << fileName() << "\". " << e.what()); throw; } } bool TiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const { return ((lx < _data->numXLevels && lx >= 0) && (ly < _data->numYLevels && ly >= 0) && (dx < _data->numXTiles[lx] && dx >= 0) && (dy < _data->numYTiles[ly] && dy >= 0)); } void TiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { Lock lock (*_streamData); if (_data->previewPosition <= 0) THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " "File \"" << fileName() << "\" does not " "contain a preview image."); // // Store the new pixels in the header's preview image attribute. // PreviewImageAttribute &pia = _data->header.typedAttribute ("preview"); PreviewImage &pi = pia.value(); PreviewRgba *pixels = pi.pixels(); int numPixels = pi.width() * pi.height(); for (int i = 0; i < numPixels; ++i) pixels[i] = newPixels[i]; // // Save the current file position, jump to the position in // the file where the preview image starts, store the new // preview image, and jump back to the saved file position. // Int64 savedPosition = _streamData->os->tellp(); try { _streamData->os->seekp (_data->previewPosition); pia.writeValueTo (*_streamData->os, _data->version); _streamData->os->seekp (savedPosition); } catch (IEX_NAMESPACE::BaseExc &e) { REPLACE_EXC (e, "Cannot update preview image pixels for " "file \"" << fileName() << "\". " << e.what()); throw; } } void TiledOutputFile::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) { Lock lock (*_streamData); Int64 position = _data->tileOffsets (dx, dy, lx, ly); if (!position) THROW (IEX_NAMESPACE::ArgExc, "Cannot overwrite tile " "(" << dx << ", " << dy << ", " << lx << "," << ly << "). " "The tile has not yet been stored in " "file \"" << fileName() << "\"."); _streamData->currentPosition = 0; _streamData->os->seekp (position + offset); for (int i = 0; i < length; ++i) _streamData->os->write (&c, 1); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledOutputFile.h000066400000000000000000000446001406177042200215400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILED_OUTPUT_FILE_H #define INCLUDED_IMF_TILED_OUTPUT_FILE_H //----------------------------------------------------------------------------- // // class TiledOutputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImathBox.h" #include "ImfTileDescription.h" #include "ImfThreading.h" #include "ImfGenericOutputFile.h" #include "ImfForward.h" #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER struct PreviewRgba; class TiledOutputFile : public GenericOutputFile { public: //------------------------------------------------------------------- // A constructor that opens the file with the specified name, and // writes the file header. The file header is also copied into the // TiledOutputFile object, and can later be accessed via the header() // method. // // Destroying TiledOutputFile constructed with this constructor // automatically closes the corresponding files. // // The header must contain a TileDescriptionAttribute called "tiles". // // The x and y subsampling factors for all image channels must be 1; // subsampling is not supported. // // Tiles can be written to the file in arbitrary order. The line // order attribute can be used to cause the tiles to be sorted in // the file. When the file is read later, reading the tiles in the // same order as they are in the file tends to be significantly // faster than reading the tiles in random order (see writeTile, // below). //------------------------------------------------------------------- IMF_EXPORT TiledOutputFile (const char fileName[], const Header &header, int numThreads = globalThreadCount ()); // ---------------------------------------------------------------- // A constructor that attaches the new TiledOutputFile object to // a file that has already been opened. Destroying TiledOutputFile // objects constructed with this constructor does not automatically // close the corresponding files. // ---------------------------------------------------------------- IMF_EXPORT TiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, int numThreads = globalThreadCount ()); //----------------------------------------------------- // Destructor // // Destroying a TiledOutputFile object before all tiles // have been written results in an incomplete file. //----------------------------------------------------- IMF_EXPORT virtual ~TiledOutputFile (); //------------------------ // Access to the file name //------------------------ IMF_EXPORT const char * fileName () const; //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; //------------------------------------------------------- // Set the current frame buffer -- copies the FrameBuffer // object into the TiledOutputFile object. // // The current frame buffer is the source of the pixel // data written to the file. The current frame buffer // must be set at least once before writeTile() is // called. The current frame buffer can be changed // after each call to writeTile(). //------------------------------------------------------- IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); //----------------------------------- // Access to the current frame buffer //----------------------------------- IMF_EXPORT const FrameBuffer & frameBuffer () const; //------------------- // Utility functions: //------------------- //--------------------------------------------------------- // Multiresolution mode and tile size: // The following functions return the xSize, ySize and mode // fields of the file header's TileDescriptionAttribute. //--------------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; //-------------------------------------------------------------------- // Number of levels: // // numXLevels() returns the file's number of levels in x direction. // // if levelMode() == ONE_LEVEL: // return value is: 1 // // if levelMode() == MIPMAP_LEVELS: // return value is: rfunc (log (max (w, h)) / log (2)) + 1 // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (w) / log (2)) + 1 // // where // w is the width of the image's data window, max.x - min.x + 1, // y is the height of the image's data window, max.y - min.y + 1, // and rfunc(x) is either floor(x), or ceil(x), depending on // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. // // numYLevels() returns the file's number of levels in y direction. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // return value is: rfunc (log (h) / log (2)) + 1 // // // numLevels() is a convenience function for use with MIPMAP_LEVELS // files. // // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: // return value is the same as for numXLevels() // // if levelMode() == RIPMAP_LEVELS: // an IEX_NAMESPACE::LogicExc exception is thrown // // isValidLevel(lx, ly) returns true if the file contains // a level with level number (lx, ly), false if not. // //-------------------------------------------------------------------- IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; //--------------------------------------------------------- // Dimensions of a level: // // levelWidth(lx) returns the width of a level with level // number (lx, *), where * is any number. // // return value is: // max (1, rfunc (w / pow (2, lx))) // // // levelHeight(ly) returns the height of a level with level // number (*, ly), where * is any number. // // return value is: // max (1, rfunc (h / pow (2, ly))) // //--------------------------------------------------------- IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; //---------------------------------------------------------- // Number of tiles: // // numXTiles(lx) returns the number of tiles in x direction // that cover a level with level number (lx, *), where * is // any number. // // return value is: // (levelWidth(lx) + tileXSize() - 1) / tileXSize() // // // numYTiles(ly) returns the number of tiles in y direction // that cover a level with level number (*, ly), where * is // any number. // // return value is: // (levelHeight(ly) + tileXSize() - 1) / tileXSize() // //---------------------------------------------------------- IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; //--------------------------------------------------------- // Level pixel ranges: // // dataWindowForLevel(lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a level with // level number (lx, ly) // // return value is a Box2i with min value: // (dataWindow.min.x, dataWindow.min.y) // // and max value: // (dataWindow.min.x + levelWidth(lx) - 1, // dataWindow.min.y + levelHeight(ly) - 1) // // dataWindowForLevel(level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForLevel(level, level). // //--------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; //------------------------------------------------------------------- // Tile pixel ranges: // // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional // region of valid pixel coordinates for a tile with tile coordinates // (dx,dy) and level number (lx, ly). // // return value is a Box2i with min value: // (dataWindow.min.x + dx * tileXSize(), // dataWindow.min.y + dy * tileYSize()) // // and max value: // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, // dataWindow.min.y + (dy + 1) * tileYSize() - 1) // // dataWindowForTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns // dataWindowForTile(dx, dy, level, level). // //------------------------------------------------------------------- IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------------ // Write pixel data: // // writeTile(dx, dy, lx, ly) writes the tile with tile // coordinates (dx, dy), and level number (lx, ly) to // the file. // // dx must lie in the interval [0, numXTiles(lx) - 1] // dy must lie in the interval [0, numYTiles(ly) - 1] // // lx must lie in the interval [0, numXLevels() - 1] // ly must lie in the inverval [0, numYLevels() - 1] // // writeTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls // writeTile(dx, dy, level, level). // // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow // writing multiple tiles at once. If multi-threading is used // multiple tiles are written concurrently. The tile coordinates, // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the // tiles are always written in the order specified by the line // order attribute. Hence, it is not possible to specify an // "invalid" or empty tile range. // // Pixels that are outside the pixel coordinate range for the tile's // level, are never accessed by writeTile(). // // Each tile in the file must be written exactly once. // // The file's line order attribute determines the order of the tiles // in the file: // // INCREASING_Y In the file, the tiles for each level are stored // in a contiguous block. The levels are ordered // like this: // // (0, 0) (1, 0) ... (nx-1, 0) // (0, 1) (1, 1) ... (nx-1, 1) // ... // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) // // where nx = numXLevels(), and ny = numYLevels(). // In an individual level, (lx, ly), the tiles // are stored in the following order: // // (0, 0) (1, 0) ... (tx-1, 0) // (0, 1) (1, 1) ... (tx-1, 1) // ... // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // // where tx = numXTiles(lx), // and ty = numYTiles(ly). // // DECREASING_Y As for INCREASING_Y, the tiles for each level // are stored in a contiguous block. The levels // are ordered the same way as for INCREASING_Y, // but within an individual level, the tiles // are stored in this order: // // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) // ... // (0, 1) (1, 1) ... (tx-1, 1) // (0, 0) (1, 0) ... (tx-1, 0) // // // RANDOM_Y The order of the calls to writeTile() determines // the order of the tiles in the file. // //------------------------------------------------------------------ IMF_EXPORT void writeTile (int dx, int dy, int l = 0); IMF_EXPORT void writeTile (int dx, int dy, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); //------------------------------------------------------------------ // Shortcut to copy all pixels from a TiledInputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the TiledInputFile's // header: The two header's "dataWindow", "compression", // "lineOrder", "channels", and "tiles" attributes must be the same. //------------------------------------------------------------------ IMF_EXPORT void copyPixels (TiledInputFile &in); IMF_EXPORT void copyPixels (TiledInputPart &in); //------------------------------------------------------------------ // Shortcut to copy all pixels from an InputFile into this file, // without uncompressing and then recompressing the pixel data. // This file's header must be compatible with the InputFile's // header: The two header's "dataWindow", "compression", // "lineOrder", "channels", and "tiles" attributes must be the same. // // To use this function, the InputFile must be tiled. //------------------------------------------------------------------ IMF_EXPORT void copyPixels (InputFile &in); IMF_EXPORT void copyPixels (InputPart &in); //-------------------------------------------------------------- // Updating the preview image: // // updatePreviewImage() supplies a new set of pixels for the // preview image attribute in the file's header. If the header // does not contain a preview image, updatePreviewImage() throws // an IEX_NAMESPACE::LogicExc. // // Note: updatePreviewImage() is necessary because images are // often stored in a file incrementally, a few tiles at a time, // while the image is being generated. Since the preview image // is an attribute in the file's header, it gets stored in the // file as soon as the file is opened, but we may not know what // the preview image should look like until we have written the // last tile of the main image. // //-------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); //------------------------------------------------------------- // Break a tile -- for testing and debugging only: // // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the // output file by writing n copies of character c, starting // p bytes from the beginning of the tile with tile coordinates // (dx, dy) and level number (lx, ly). // // Warning: Calling this function usually results in a broken // image file. The file or parts of it may not be readable, // or the file may contain bad data. // //------------------------------------------------------------- IMF_EXPORT void breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c); struct Data; private: // ---------------------------------------------------------------- // A constructor attaches the OutputStreamMutex to the // given one from MultiPartOutputFile. Set the previewPosition // and lineOffsetsPosition which have been acquired from // the constructor of MultiPartOutputFile as well. // ---------------------------------------------------------------- TiledOutputFile (const OutputPartData* part); TiledOutputFile (const TiledOutputFile &) = delete; TiledOutputFile & operator = (const TiledOutputFile &) = delete; TiledOutputFile (TiledOutputFile &&) = delete; TiledOutputFile & operator = (TiledOutputFile &&) = delete; void initialize (const Header &header); bool isValidTile (int dx, int dy, int lx, int ly) const; size_t bytesPerLineForTile (int dx, int dy, int lx, int ly) const; Data * _data; OutputStreamMutex* _streamData; bool _deleteStream; friend class MultiPartOutputFile; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTiledOutputPart.cpp000066400000000000000000000117761406177042200221320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfTiledOutputPart.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER TiledOutputPart::TiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) { file = multiPartFile.getOutputPart(partNumber); } const char * TiledOutputPart::fileName () const { return file->fileName(); } const Header & TiledOutputPart::header () const { return file->header(); } void TiledOutputPart::setFrameBuffer (const FrameBuffer &frameBuffer) { file->setFrameBuffer(frameBuffer); } const FrameBuffer & TiledOutputPart::frameBuffer () const { return file->frameBuffer(); } unsigned int TiledOutputPart::tileXSize () const { return file->tileXSize(); } unsigned int TiledOutputPart::tileYSize () const { return file->tileYSize(); } LevelMode TiledOutputPart::levelMode () const { return file->levelMode(); } LevelRoundingMode TiledOutputPart::levelRoundingMode () const { return file->levelRoundingMode(); } int TiledOutputPart::numLevels () const { return file->numLevels(); } int TiledOutputPart::numXLevels () const { return file->numXLevels(); } int TiledOutputPart::numYLevels () const { return file->numYLevels(); } bool TiledOutputPart::isValidLevel (int lx, int ly) const { return file->isValidLevel(lx, ly); } int TiledOutputPart::levelWidth (int lx) const { return file->levelWidth(lx); } int TiledOutputPart::levelHeight (int ly) const { return file->levelHeight(ly); } int TiledOutputPart::numXTiles (int lx) const { return file->numXTiles(lx); } int TiledOutputPart::numYTiles (int ly) const { return file->numYTiles(ly); } IMATH_NAMESPACE::Box2i TiledOutputPart::dataWindowForLevel (int l) const { return file->dataWindowForLevel(l); } IMATH_NAMESPACE::Box2i TiledOutputPart::dataWindowForLevel (int lx, int ly) const { return file->dataWindowForLevel(lx, ly); } IMATH_NAMESPACE::Box2i TiledOutputPart::dataWindowForTile (int dx, int dy, int l) const { return file->dataWindowForTile(dx, dy, l); } IMATH_NAMESPACE::Box2i TiledOutputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const { return file->dataWindowForTile(dx, dy, lx, ly); } void TiledOutputPart::writeTile (int dx, int dy, int l) { file->writeTile(dx, dy, l); } void TiledOutputPart::writeTile (int dx, int dy, int lx, int ly) { file->writeTile(dx, dy, lx, ly); } void TiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) { file->writeTiles(dx1, dx2, dy1, dy2, lx, ly); } void TiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int l) { file->writeTiles(dx1, dx2, dy1, dy2, l); } void TiledOutputPart::copyPixels (TiledInputFile &in) { file->copyPixels(in); } void TiledOutputPart::copyPixels (InputFile &in) { file->copyPixels(in); } void TiledOutputPart::copyPixels (TiledInputPart &in) { file->copyPixels(in); } void TiledOutputPart::copyPixels (InputPart &in) { file->copyPixels(in); } void TiledOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) { file->updatePreviewImage(newPixels); } void TiledOutputPart::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) { file->breakTile(dx, dy, lx, ly, offset, length, c); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledOutputPart.h000066400000000000000000000125031406177042200215640ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef IMFTILEDOUTPUTPART_H_ #define IMFTILEDOUTPUTPART_H_ #include "ImfMultiPartOutputFile.h" #include "ImfTiledOutputFile.h" #include "ImfForward.h" #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER //------------------------------------------------------------------------------- // class TiledOutputPart: // // Same interface as TiledOutputFile. Please have a reference to TiledOutputFile. //------------------------------------------------------------------------------- class TiledOutputPart { public: IMF_EXPORT TiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); IMF_EXPORT const char * fileName () const; IMF_EXPORT const Header & header () const; IMF_EXPORT void setFrameBuffer (const FrameBuffer &frameBuffer); IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; IMF_EXPORT void writeTile (int dx, int dy, int l = 0); IMF_EXPORT void writeTile (int dx, int dy, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly); IMF_EXPORT void writeTiles (int dx1, int dx2, int dy1, int dy2, int l = 0); IMF_EXPORT void copyPixels (TiledInputFile &in); IMF_EXPORT void copyPixels (InputFile &in); IMF_EXPORT void copyPixels (TiledInputPart &in); IMF_EXPORT void copyPixels (InputPart &in); IMF_EXPORT void updatePreviewImage (const PreviewRgba newPixels[]); IMF_EXPORT void breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c); private: TiledOutputFile* file; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif /* IMFTILEDOUTPUTPART_H_ */ openexr-2.5.7/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp000066400000000000000000000573431406177042200214560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TiledRgbaOutputFile // class TiledRgbaInputFile // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "IlmThreadMutex.h" #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace std; using namespace IMATH_NAMESPACE; using namespace RgbaYca; using namespace ILMTHREAD_NAMESPACE; namespace { void insertChannels (Header &header, RgbaChannels rgbaChannels, const char fileName[]) { ChannelList ch; if (rgbaChannels & (WRITE_Y | WRITE_C)) { if (rgbaChannels & WRITE_Y) { ch.insert ("Y", Channel (HALF, 1, 1)); } if (rgbaChannels & WRITE_C) { THROW (IEX_NAMESPACE::ArgExc, "Cannot open file \"" << fileName << "\" " "for writing. Tiled image files do not " "support subsampled chroma channels."); } } else { if (rgbaChannels & WRITE_R) ch.insert ("R", Channel (HALF, 1, 1)); if (rgbaChannels & WRITE_G) ch.insert ("G", Channel (HALF, 1, 1)); if (rgbaChannels & WRITE_B) ch.insert ("B", Channel (HALF, 1, 1)); } if (rgbaChannels & WRITE_A) ch.insert ("A", Channel (HALF, 1, 1)); header.channels() = ch; } RgbaChannels rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") { int i = 0; if (ch.findChannel (channelNamePrefix + "R")) i |= WRITE_R; if (ch.findChannel (channelNamePrefix + "G")) i |= WRITE_G; if (ch.findChannel (channelNamePrefix + "B")) i |= WRITE_B; if (ch.findChannel (channelNamePrefix + "A")) i |= WRITE_A; if (ch.findChannel (channelNamePrefix + "Y")) i |= WRITE_Y; return RgbaChannels (i); } string prefixFromLayerName (const string &layerName, const Header &header) { if (layerName.empty()) return ""; if (hasMultiView (header) && multiView(header)[0] == layerName) return ""; return layerName + "."; } V3f ywFromHeader (const Header &header) { Chromaticities cr; if (hasChromaticities (header)) cr = chromaticities (header); return computeYw (cr); } } // namespace class TiledRgbaOutputFile::ToYa: public Mutex { public: ToYa (TiledOutputFile &outputFile, RgbaChannels rgbaChannels); void setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride); void writeTile (int dx, int dy, int lx, int ly); private: TiledOutputFile & _outputFile; bool _writeA; unsigned int _tileXSize; unsigned int _tileYSize; V3f _yw; Array2D _buf; const Rgba * _fbBase; size_t _fbXStride; size_t _fbYStride; }; TiledRgbaOutputFile::ToYa::ToYa (TiledOutputFile &outputFile, RgbaChannels rgbaChannels) : _outputFile (outputFile) { _writeA = (rgbaChannels & WRITE_A)? true: false; const TileDescription &td = outputFile.header().tileDescription(); _tileXSize = td.xSize; _tileYSize = td.ySize; _yw = ywFromHeader (_outputFile.header()); _buf.resizeErase (_tileYSize, _tileXSize); _fbBase = 0; _fbXStride = 0; _fbYStride = 0; } void TiledRgbaOutputFile::ToYa::setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride) { _fbBase = base; _fbXStride = xStride; _fbYStride = yStride; } void TiledRgbaOutputFile::ToYa::writeTile (int dx, int dy, int lx, int ly) { if (_fbBase == 0) { THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " "pixel data source for image file " "\"" << _outputFile.fileName() << "\"."); } // // Copy the tile's RGBA pixels into _buf and convert // them to luminance/alpha format // Box2i dw = _outputFile.dataWindowForTile (dx, dy, lx, ly); int width = dw.max.x - dw.min.x + 1; for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) { for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) _buf[y1][x1] = _fbBase[x * _fbXStride + y * _fbYStride]; RGBAtoYCA (_yw, width, _writeA, _buf[y1], _buf[y1]); } // // Store the contents of _buf in the output file // FrameBuffer fb; fb.insert ("Y", Slice (HALF, // type (char *) &_buf[-dw.min.y][-dw.min.x].g, // base sizeof (Rgba), // xStride sizeof (Rgba) * _tileXSize)); // yStride fb.insert ("A", Slice (HALF, // type (char *) &_buf[-dw.min.y][-dw.min.x].a, // base sizeof (Rgba), // xStride sizeof (Rgba) * _tileXSize)); // yStride _outputFile.setFrameBuffer (fb); _outputFile.writeTile (dx, dy, lx, ly); } TiledRgbaOutputFile::TiledRgbaOutputFile (const char name[], const Header &header, RgbaChannels rgbaChannels, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode, int numThreads) : _outputFile (0), _toYa (0) { Header hd (header); insertChannels (hd, rgbaChannels, name); hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); _outputFile = new TiledOutputFile (name, hd, numThreads); if (rgbaChannels & WRITE_Y) _toYa = new ToYa (*_outputFile, rgbaChannels); } TiledRgbaOutputFile::TiledRgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode, int numThreads) : _outputFile (0), _toYa (0) { Header hd (header); insertChannels (hd, rgbaChannels, os.fileName()); hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); _outputFile = new TiledOutputFile (os, hd, numThreads); if (rgbaChannels & WRITE_Y) _toYa = new ToYa (*_outputFile, rgbaChannels); } TiledRgbaOutputFile::TiledRgbaOutputFile (const char name[], int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode, const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads) : _outputFile (0), _toYa (0) { Header hd (displayWindow, dataWindow.isEmpty()? displayWindow: dataWindow, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); insertChannels (hd, rgbaChannels, name); hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); _outputFile = new TiledOutputFile (name, hd, numThreads); if (rgbaChannels & WRITE_Y) _toYa = new ToYa (*_outputFile, rgbaChannels); } TiledRgbaOutputFile::TiledRgbaOutputFile (const char name[], int width, int height, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode, RgbaChannels rgbaChannels, float pixelAspectRatio, const IMATH_NAMESPACE::V2f screenWindowCenter, float screenWindowWidth, LineOrder lineOrder, Compression compression, int numThreads) : _outputFile (0), _toYa (0) { Header hd (width, height, pixelAspectRatio, screenWindowCenter, screenWindowWidth, lineOrder, compression); insertChannels (hd, rgbaChannels, name); hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); _outputFile = new TiledOutputFile (name, hd, numThreads); if (rgbaChannels & WRITE_Y) _toYa = new ToYa (*_outputFile, rgbaChannels); } TiledRgbaOutputFile::~TiledRgbaOutputFile () { delete _outputFile; delete _toYa; } void TiledRgbaOutputFile::setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride) { if (_toYa) { Lock lock (*_toYa); _toYa->setFrameBuffer (base, xStride, yStride); } else { size_t xs = xStride * sizeof (Rgba); size_t ys = yStride * sizeof (Rgba); FrameBuffer fb; fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); _outputFile->setFrameBuffer (fb); } } const Header & TiledRgbaOutputFile::header () const { return _outputFile->header(); } const FrameBuffer & TiledRgbaOutputFile::frameBuffer () const { return _outputFile->frameBuffer(); } const IMATH_NAMESPACE::Box2i & TiledRgbaOutputFile::displayWindow () const { return _outputFile->header().displayWindow(); } const IMATH_NAMESPACE::Box2i & TiledRgbaOutputFile::dataWindow () const { return _outputFile->header().dataWindow(); } float TiledRgbaOutputFile::pixelAspectRatio () const { return _outputFile->header().pixelAspectRatio(); } const IMATH_NAMESPACE::V2f TiledRgbaOutputFile::screenWindowCenter () const { return _outputFile->header().screenWindowCenter(); } float TiledRgbaOutputFile::screenWindowWidth () const { return _outputFile->header().screenWindowWidth(); } LineOrder TiledRgbaOutputFile::lineOrder () const { return _outputFile->header().lineOrder(); } Compression TiledRgbaOutputFile::compression () const { return _outputFile->header().compression(); } RgbaChannels TiledRgbaOutputFile::channels () const { return rgbaChannels (_outputFile->header().channels()); } unsigned int TiledRgbaOutputFile::tileXSize () const { return _outputFile->tileXSize(); } unsigned int TiledRgbaOutputFile::tileYSize () const { return _outputFile->tileYSize(); } LevelMode TiledRgbaOutputFile::levelMode () const { return _outputFile->levelMode(); } LevelRoundingMode TiledRgbaOutputFile::levelRoundingMode () const { return _outputFile->levelRoundingMode(); } int TiledRgbaOutputFile::numLevels () const { return _outputFile->numLevels(); } int TiledRgbaOutputFile::numXLevels () const { return _outputFile->numXLevels(); } int TiledRgbaOutputFile::numYLevels () const { return _outputFile->numYLevels(); } bool TiledRgbaOutputFile::isValidLevel (int lx, int ly) const { return _outputFile->isValidLevel (lx, ly); } int TiledRgbaOutputFile::levelWidth (int lx) const { return _outputFile->levelWidth (lx); } int TiledRgbaOutputFile::levelHeight (int ly) const { return _outputFile->levelHeight (ly); } int TiledRgbaOutputFile::numXTiles (int lx) const { return _outputFile->numXTiles (lx); } int TiledRgbaOutputFile::numYTiles (int ly) const { return _outputFile->numYTiles (ly); } IMATH_NAMESPACE::Box2i TiledRgbaOutputFile::dataWindowForLevel (int l) const { return _outputFile->dataWindowForLevel (l); } IMATH_NAMESPACE::Box2i TiledRgbaOutputFile::dataWindowForLevel (int lx, int ly) const { return _outputFile->dataWindowForLevel (lx, ly); } IMATH_NAMESPACE::Box2i TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int l) const { return _outputFile->dataWindowForTile (dx, dy, l); } IMATH_NAMESPACE::Box2i TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { return _outputFile->dataWindowForTile (dx, dy, lx, ly); } void TiledRgbaOutputFile::writeTile (int dx, int dy, int l) { if (_toYa) { Lock lock (*_toYa); _toYa->writeTile (dx, dy, l, l); } else { _outputFile->writeTile (dx, dy, l); } } void TiledRgbaOutputFile::writeTile (int dx, int dy, int lx, int ly) { if (_toYa) { Lock lock (*_toYa); _toYa->writeTile (dx, dy, lx, ly); } else { _outputFile->writeTile (dx, dy, lx, ly); } } void TiledRgbaOutputFile::writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) { if (_toYa) { Lock lock (*_toYa); for (int dy = dyMin; dy <= dyMax; dy++) for (int dx = dxMin; dx <= dxMax; dx++) _toYa->writeTile (dx, dy, lx, ly); } else { _outputFile->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); } } void TiledRgbaOutputFile::writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, int l) { writeTiles (dxMin, dxMax, dyMin, dyMax, l, l); } class TiledRgbaInputFile::FromYa: public Mutex { public: FromYa (TiledInputFile &inputFile); void setFrameBuffer (Rgba *base, size_t xStride, size_t yStride, const string &channelNamePrefix); void readTile (int dx, int dy, int lx, int ly); private: TiledInputFile & _inputFile; unsigned int _tileXSize; unsigned int _tileYSize; V3f _yw; Array2D _buf; Rgba * _fbBase; size_t _fbXStride; size_t _fbYStride; }; TiledRgbaInputFile::FromYa::FromYa (TiledInputFile &inputFile) : _inputFile (inputFile) { const TileDescription &td = inputFile.header().tileDescription(); _tileXSize = td.xSize; _tileYSize = td.ySize; _yw = ywFromHeader (_inputFile.header()); _buf.resizeErase (_tileYSize, _tileXSize); _fbBase = 0; _fbXStride = 0; _fbYStride = 0; } void TiledRgbaInputFile::FromYa::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride, const string &channelNamePrefix) { if (_fbBase == 0) { FrameBuffer fb; fb.insert (channelNamePrefix + "Y", Slice (HALF, // type (char *) &_buf[0][0].g, // base sizeof (Rgba), // xStride sizeof (Rgba) * _tileXSize, // yStride 1, 1, // sampling 0.0, // fillValue true, true)); // tileCoordinates fb.insert (channelNamePrefix + "A", Slice (HALF, // type (char *) &_buf[0][0].a, // base sizeof (Rgba), // xStride sizeof (Rgba) * _tileXSize, // yStride 1, 1, // sampling 1.0, // fillValue true, true)); // tileCoordinates _inputFile.setFrameBuffer (fb); } _fbBase = base; _fbXStride = xStride; _fbYStride = yStride; } void TiledRgbaInputFile::FromYa::readTile (int dx, int dy, int lx, int ly) { if (_fbBase == 0) { THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " "pixel data destination for image file " "\"" << _inputFile.fileName() << "\"."); } // // Read the tile requested by the caller into _buf. // _inputFile.readTile (dx, dy, lx, ly); // // Convert the luminance/alpha pixels to RGBA // and copy them into the caller's frame buffer. // Box2i dw = _inputFile.dataWindowForTile (dx, dy, lx, ly); int width = dw.max.x - dw.min.x + 1; for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) { for (int x1 = 0; x1 < width; ++x1) { _buf[y1][x1].r = 0; _buf[y1][x1].b = 0; } YCAtoRGBA (_yw, width, _buf[y1], _buf[y1]); for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) { _fbBase[x * _fbXStride + y * _fbYStride] = _buf[y1][x1]; } } } TiledRgbaInputFile::TiledRgbaInputFile (const char name[], int numThreads): _inputFile (new TiledInputFile (name, numThreads)), _fromYa (0), _channelNamePrefix ("") { if (channels() & WRITE_Y) _fromYa = new FromYa (*_inputFile); } TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _inputFile (new TiledInputFile (is, numThreads)), _fromYa (0), _channelNamePrefix ("") { if (channels() & WRITE_Y) _fromYa = new FromYa (*_inputFile); } TiledRgbaInputFile::TiledRgbaInputFile (const char name[], const string &layerName, int numThreads) : _inputFile (new TiledInputFile (name, numThreads)), _fromYa (0), _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) { if (channels() & WRITE_Y) _fromYa = new FromYa (*_inputFile); } TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, const string &layerName, int numThreads) : _inputFile (new TiledInputFile (is, numThreads)), _fromYa (0), _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) { if (channels() & WRITE_Y) _fromYa = new FromYa (*_inputFile); } TiledRgbaInputFile::~TiledRgbaInputFile () { delete _inputFile; delete _fromYa; } void TiledRgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) { if (_fromYa) { Lock lock (*_fromYa); _fromYa->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); } else { size_t xs = xStride * sizeof (Rgba); size_t ys = yStride * sizeof (Rgba); FrameBuffer fb; fb.insert (_channelNamePrefix + "R", Slice (HALF, (char *) &base[0].r, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue fb.insert (_channelNamePrefix + "G", Slice (HALF, (char *) &base[0].g, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue fb.insert (_channelNamePrefix + "B", Slice (HALF, (char *) &base[0].b, xs, ys, 1, 1, // xSampling, ySampling 0.0)); // fillValue fb.insert (_channelNamePrefix + "A", Slice (HALF, (char *) &base[0].a, xs, ys, 1, 1, // xSampling, ySampling 1.0)); // fillValue _inputFile->setFrameBuffer (fb); } } void TiledRgbaInputFile::setLayerName (const std::string &layerName) { delete _fromYa; _fromYa = 0; _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); if (channels() & WRITE_Y) _fromYa = new FromYa (*_inputFile); FrameBuffer fb; _inputFile->setFrameBuffer (fb); } const Header & TiledRgbaInputFile::header () const { return _inputFile->header(); } const char * TiledRgbaInputFile::fileName () const { return _inputFile->fileName(); } const FrameBuffer & TiledRgbaInputFile::frameBuffer () const { return _inputFile->frameBuffer(); } const IMATH_NAMESPACE::Box2i & TiledRgbaInputFile::displayWindow () const { return _inputFile->header().displayWindow(); } const IMATH_NAMESPACE::Box2i & TiledRgbaInputFile::dataWindow () const { return _inputFile->header().dataWindow(); } float TiledRgbaInputFile::pixelAspectRatio () const { return _inputFile->header().pixelAspectRatio(); } const IMATH_NAMESPACE::V2f TiledRgbaInputFile::screenWindowCenter () const { return _inputFile->header().screenWindowCenter(); } float TiledRgbaInputFile::screenWindowWidth () const { return _inputFile->header().screenWindowWidth(); } LineOrder TiledRgbaInputFile::lineOrder () const { return _inputFile->header().lineOrder(); } Compression TiledRgbaInputFile::compression () const { return _inputFile->header().compression(); } RgbaChannels TiledRgbaInputFile::channels () const { return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); } int TiledRgbaInputFile::version () const { return _inputFile->version(); } bool TiledRgbaInputFile::isComplete () const { return _inputFile->isComplete(); } unsigned int TiledRgbaInputFile::tileXSize () const { return _inputFile->tileXSize(); } unsigned int TiledRgbaInputFile::tileYSize () const { return _inputFile->tileYSize(); } LevelMode TiledRgbaInputFile::levelMode () const { return _inputFile->levelMode(); } LevelRoundingMode TiledRgbaInputFile::levelRoundingMode () const { return _inputFile->levelRoundingMode(); } int TiledRgbaInputFile::numLevels () const { return _inputFile->numLevels(); } int TiledRgbaInputFile::numXLevels () const { return _inputFile->numXLevels(); } int TiledRgbaInputFile::numYLevels () const { return _inputFile->numYLevels(); } bool TiledRgbaInputFile::isValidLevel (int lx, int ly) const { return _inputFile->isValidLevel (lx, ly); } int TiledRgbaInputFile::levelWidth (int lx) const { return _inputFile->levelWidth (lx); } int TiledRgbaInputFile::levelHeight (int ly) const { return _inputFile->levelHeight (ly); } int TiledRgbaInputFile::numXTiles (int lx) const { return _inputFile->numXTiles(lx); } int TiledRgbaInputFile::numYTiles (int ly) const { return _inputFile->numYTiles(ly); } IMATH_NAMESPACE::Box2i TiledRgbaInputFile::dataWindowForLevel (int l) const { return _inputFile->dataWindowForLevel (l); } IMATH_NAMESPACE::Box2i TiledRgbaInputFile::dataWindowForLevel (int lx, int ly) const { return _inputFile->dataWindowForLevel (lx, ly); } IMATH_NAMESPACE::Box2i TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int l) const { return _inputFile->dataWindowForTile (dx, dy, l); } IMATH_NAMESPACE::Box2i TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const { return _inputFile->dataWindowForTile (dx, dy, lx, ly); } void TiledRgbaInputFile::readTile (int dx, int dy, int l) { if (_fromYa) { Lock lock (*_fromYa); _fromYa->readTile (dx, dy, l, l); } else { _inputFile->readTile (dx, dy, l); } } void TiledRgbaInputFile::readTile (int dx, int dy, int lx, int ly) { if (_fromYa) { Lock lock (*_fromYa); _fromYa->readTile (dx, dy, lx, ly); } else { _inputFile->readTile (dx, dy, lx, ly); } } void TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) { if (_fromYa) { Lock lock (*_fromYa); for (int dy = dyMin; dy <= dyMax; dy++) for (int dx = dxMin; dx <= dxMax; dx++) _fromYa->readTile (dx, dy, lx, ly); } else { _inputFile->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); } } void TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, int l) { readTiles (dxMin, dxMax, dyMin, dyMax, l, l); } void TiledRgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) { _outputFile->updatePreviewImage (newPixels); } void TiledRgbaOutputFile::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) { _outputFile->breakTile (dx, dy, lx, ly, offset, length, c); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTiledRgbaFile.h000066400000000000000000000424651406177042200211220ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TILED_RGBA_FILE_H #define INCLUDED_IMF_TILED_RGBA_FILE_H //----------------------------------------------------------------------------- // // Simplified RGBA image I/O for tiled files // // class TiledRgbaOutputFile // class TiledRgbaInputFile // //----------------------------------------------------------------------------- #include "ImfHeader.h" #include "ImfFrameBuffer.h" #include "ImathVec.h" #include "ImathBox.h" #include "half.h" #include "ImfTileDescription.h" #include "ImfRgba.h" #include "ImfThreading.h" #include #include "ImfNamespace.h" #include "ImfForward.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // Tiled RGBA output file. // class TiledRgbaOutputFile { public: //--------------------------------------------------- // Constructor -- rgbaChannels, tileXSize, tileYSize, // levelMode, and levelRoundingMode overwrite the // channel list and tile description attribute in the // header that is passed as an argument to the // constructor. //--------------------------------------------------- IMF_EXPORT TiledRgbaOutputFile (const char name[], const Header &header, RgbaChannels rgbaChannels, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode = ROUND_DOWN, int numThreads = globalThreadCount ()); //--------------------------------------------------- // Constructor -- like the previous one, but the new // TiledRgbaOutputFile is attached to a file that has // already been opened by the caller. Destroying // TiledRgbaOutputFileObjects constructed with this // constructor does not automatically close the // corresponding files. //--------------------------------------------------- IMF_EXPORT TiledRgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, RgbaChannels rgbaChannels, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode = ROUND_DOWN, int numThreads = globalThreadCount ()); //------------------------------------------------------ // Constructor -- header data are explicitly specified // as function call arguments (an empty dataWindow means // "same as displayWindow") //------------------------------------------------------ IMF_EXPORT TiledRgbaOutputFile (const char name[], int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode, const IMATH_NAMESPACE::Box2i &displayWindow, const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = ZIP_COMPRESSION, int numThreads = globalThreadCount ()); //----------------------------------------------- // Constructor -- like the previous one, but both // the display window and the data window are // Box2i (V2i (0, 0), V2i (width - 1, height -1)) //----------------------------------------------- IMF_EXPORT TiledRgbaOutputFile (const char name[], int width, int height, int tileXSize, int tileYSize, LevelMode mode, LevelRoundingMode rmode = ROUND_DOWN, RgbaChannels rgbaChannels = WRITE_RGBA, float pixelAspectRatio = 1, const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), float screenWindowWidth = 1, LineOrder lineOrder = INCREASING_Y, Compression compression = ZIP_COMPRESSION, int numThreads = globalThreadCount ()); IMF_EXPORT virtual ~TiledRgbaOutputFile (); //------------------------------------------------ // Define a frame buffer as the pixel data source: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //------------------------------------------------ IMF_EXPORT void setFrameBuffer (const Rgba *base, size_t xStride, size_t yStride); //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; //---------------------------------------------------- // Utility functions (same as in Imf::TiledOutputFile) //---------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //------------------------------------------------------------------ // Write pixel data: // // writeTile(dx, dy, lx, ly) writes the tile with tile // coordinates (dx, dy), and level number (lx, ly) to // the file. // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // writeTile(dx, dy, level) is a convenience function // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls // writeTile(dx, dy, level, level). // // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow // writing multiple tiles at once. If multi-threading is used // multiple tiles are written concurrently. // // Pixels that are outside the pixel coordinate range for the tile's // level, are never accessed by writeTile(). // // Each tile in the file must be written exactly once. // //------------------------------------------------------------------ IMF_EXPORT void writeTile (int dx, int dy, int l = 0); IMF_EXPORT void writeTile (int dx, int dy, int lx, int ly); IMF_EXPORT void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly); IMF_EXPORT void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, int l = 0); // ------------------------------------------------------------------------- // Update the preview image (see Imf::TiledOutputFile::updatePreviewImage()) // ------------------------------------------------------------------------- IMF_EXPORT void updatePreviewImage (const PreviewRgba[]); //------------------------------------------------ // Break a tile -- for testing and debugging only // (see Imf::TiledOutputFile::breakTile()) // // Warning: Calling this function usually results // in a broken image file. The file or parts of // it may not be readable, or the file may contain // bad data. // //------------------------------------------------ IMF_EXPORT void breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c); private: // // Copy constructor and assignment are not implemented // TiledRgbaOutputFile (const TiledRgbaOutputFile &) = delete; TiledRgbaOutputFile & operator = (const TiledRgbaOutputFile &) = delete; TiledRgbaOutputFile (TiledRgbaOutputFile &&) = delete; TiledRgbaOutputFile & operator = (TiledRgbaOutputFile &&) = delete; class ToYa; TiledOutputFile * _outputFile; ToYa * _toYa; }; // // Tiled RGBA input file // class TiledRgbaInputFile { public: //-------------------------------------------------------- // Constructor -- opens the file with the specified name. // Destroying TiledRgbaInputFile objects constructed with // this constructor automatically closes the corresponding // files. //-------------------------------------------------------- IMF_EXPORT TiledRgbaInputFile (const char name[], int numThreads = globalThreadCount ()); //------------------------------------------------------- // Constructor -- attaches the new TiledRgbaInputFile // object to a file that has already been opened by the // caller. // Destroying TiledRgbaInputFile objects constructed with // this constructor does not automatically close the // corresponding files. //------------------------------------------------------- IMF_EXPORT TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); //------------------------------------------------------------ // Constructors -- the same as the previous two, but the names // of the red, green, blue, alpha, and luminance channels are // expected to be layerName.R, layerName.G, etc. //------------------------------------------------------------ IMF_EXPORT TiledRgbaInputFile (const char name[], const std::string &layerName, int numThreads = globalThreadCount()); IMF_EXPORT TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, const std::string &layerName, int numThreads = globalThreadCount()); //----------- // Destructor //----------- IMF_EXPORT virtual ~TiledRgbaInputFile (); //----------------------------------------------------- // Define a frame buffer as the pixel data destination: // Pixel (x, y) is at address // // base + x * xStride + y * yStride // //----------------------------------------------------- IMF_EXPORT void setFrameBuffer (Rgba *base, size_t xStride, size_t yStride); //------------------------------------------------------------------- // Switch to a different layer -- subsequent calls to readTile() // and readTiles() will read channels layerName.R, layerName.G, etc. // After each call to setLayerName(), setFrameBuffer() must be called // at least once before the next call to readTile() or readTiles(). //------------------------------------------------------------------- IMF_EXPORT void setLayerName (const std::string &layerName); //-------------------------- // Access to the file header //-------------------------- IMF_EXPORT const Header & header () const; IMF_EXPORT const FrameBuffer & frameBuffer () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & displayWindow () const; IMF_EXPORT const IMATH_NAMESPACE::Box2i & dataWindow () const; IMF_EXPORT float pixelAspectRatio () const; IMF_EXPORT const IMATH_NAMESPACE::V2f screenWindowCenter () const; IMF_EXPORT float screenWindowWidth () const; IMF_EXPORT LineOrder lineOrder () const; IMF_EXPORT Compression compression () const; IMF_EXPORT RgbaChannels channels () const; IMF_EXPORT const char * fileName () const; IMF_EXPORT bool isComplete () const; //---------------------------------- // Access to the file format version //---------------------------------- IMF_EXPORT int version () const; //--------------------------------------------------- // Utility functions (same as in Imf::TiledInputFile) //--------------------------------------------------- IMF_EXPORT unsigned int tileXSize () const; IMF_EXPORT unsigned int tileYSize () const; IMF_EXPORT LevelMode levelMode () const; IMF_EXPORT LevelRoundingMode levelRoundingMode () const; IMF_EXPORT int numLevels () const; IMF_EXPORT int numXLevels () const; IMF_EXPORT int numYLevels () const; IMF_EXPORT bool isValidLevel (int lx, int ly) const; IMF_EXPORT int levelWidth (int lx) const; IMF_EXPORT int levelHeight (int ly) const; IMF_EXPORT int numXTiles (int lx = 0) const; IMF_EXPORT int numYTiles (int ly = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; IMF_EXPORT IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int lx, int ly) const; //---------------------------------------------------------------- // Read pixel data: // // readTile(dx, dy, lx, ly) reads the tile with tile // coordinates (dx, dy), and level number (lx, ly), // and stores it in the current frame buffer. // // dx must lie in the interval [0, numXTiles(lx)-1] // dy must lie in the interval [0, numYTiles(ly)-1] // // lx must lie in the interval [0, numXLevels()-1] // ly must lie in the inverval [0, numYLevels()-1] // // readTile(dx, dy, level) is a convenience function used // for ONE_LEVEL and MIPMAP_LEVELS files. It calls // readTile(dx, dy, level, level). // // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow // reading multiple tiles at once. If multi-threading is used // multiple tiles are read concurrently. // // Pixels that are outside the pixel coordinate range for the // tile's level, are never accessed by readTile(). // // Attempting to access a tile that is not present in the file // throws an InputExc exception. // //---------------------------------------------------------------- IMF_EXPORT void readTile (int dx, int dy, int l = 0); IMF_EXPORT void readTile (int dx, int dy, int lx, int ly); IMF_EXPORT void readTiles (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly); IMF_EXPORT void readTiles (int dxMin, int dxMax, int dyMin, int dyMax, int l = 0); private: // // Copy constructor and assignment are not implemented // TiledRgbaInputFile (const TiledRgbaInputFile &) = delete; TiledRgbaInputFile & operator = (const TiledRgbaInputFile &) = delete; TiledRgbaInputFile (TiledRgbaInputFile &&) = delete; TiledRgbaInputFile & operator = (TiledRgbaInputFile &&) = delete; class FromYa; TiledInputFile * _inputFile; FromYa * _fromYa; std::string _channelNamePrefix; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTimeCode.cpp000066400000000000000000000211611406177042200204770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TimeCode // //----------------------------------------------------------------------------- #include #include "Iex.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER TimeCode::TimeCode () { _time = 0; _user = 0; } TimeCode::TimeCode (int hours, int minutes, int seconds, int frame, bool dropFrame, bool colorFrame, bool fieldPhase, bool bgf0, bool bgf1, bool bgf2, int binaryGroup1, int binaryGroup2, int binaryGroup3, int binaryGroup4, int binaryGroup5, int binaryGroup6, int binaryGroup7, int binaryGroup8) { setHours (hours); setMinutes (minutes); setSeconds (seconds); setFrame (frame); setDropFrame (dropFrame); setColorFrame (colorFrame); setFieldPhase (fieldPhase); setBgf0 (bgf0); setBgf1 (bgf1); setBgf2 (bgf2); setBinaryGroup (1, binaryGroup1); setBinaryGroup (2, binaryGroup2); setBinaryGroup (3, binaryGroup3); setBinaryGroup (4, binaryGroup4); setBinaryGroup (5, binaryGroup5); setBinaryGroup (6, binaryGroup6); setBinaryGroup (7, binaryGroup7); setBinaryGroup (8, binaryGroup8); } TimeCode::TimeCode (unsigned int timeAndFlags, unsigned int userData, Packing packing) { setTimeAndFlags (timeAndFlags, packing); setUserData (userData); } TimeCode::TimeCode (const TimeCode &other) { _time = other._time; _user = other._user; } TimeCode & TimeCode::operator = (const TimeCode &other) { if (&other != this) { _time = other._time; _user = other._user; } return *this; } bool TimeCode::operator == (const TimeCode & c) const { return (_time == c._time && _user == c._user); } bool TimeCode::operator != (const TimeCode & c) const { return (_time != c._time || _user != c._user); } namespace { unsigned int bitField (unsigned int value, int minBit, int maxBit) { int shift = minBit; unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); return (value & mask) >> shift; } void setBitField (unsigned int &value, int minBit, int maxBit, unsigned int field) { int shift = minBit; unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); value = ((value & ~mask) | ((field << shift) & mask)); } int bcdToBinary (unsigned int bcd) { return int ((bcd & 0x0f) + 10 * ((bcd >> 4) & 0x0f)); } unsigned int binaryToBcd (int binary) { int units = binary % 10; int tens = (binary / 10) % 10; return (unsigned int) (units | (tens << 4)); } } // namespace int TimeCode::hours () const { return bcdToBinary (bitField (_time, 24, 29)); } void TimeCode::setHours (int value) { if (value < 0 || value > 23) throw IEX_NAMESPACE::ArgExc ("Cannot set hours field in time code. " "New value is out of range."); setBitField (_time, 24, 29, binaryToBcd (value)); } int TimeCode::minutes () const { return bcdToBinary (bitField (_time, 16, 22)); } void TimeCode::setMinutes (int value) { if (value < 0 || value > 59) throw IEX_NAMESPACE::ArgExc ("Cannot set minutes field in time code. " "New value is out of range."); setBitField (_time, 16, 22, binaryToBcd (value)); } int TimeCode::seconds () const { return bcdToBinary (bitField (_time, 8, 14)); } void TimeCode::setSeconds (int value) { if (value < 0 || value > 59) throw IEX_NAMESPACE::ArgExc ("Cannot set seconds field in time code. " "New value is out of range."); setBitField (_time, 8, 14, binaryToBcd (value)); } int TimeCode::frame () const { return bcdToBinary (bitField (_time, 0, 5)); } void TimeCode::setFrame (int value) { if (value < 0 || value > 59) throw IEX_NAMESPACE::ArgExc ("Cannot set frame field in time code. " "New value is out of range."); setBitField (_time, 0, 5, binaryToBcd (value)); } bool TimeCode::dropFrame () const { return !!bitField (_time, 6, 6); } void TimeCode::setDropFrame (bool value) { setBitField (_time, 6, 6, (unsigned int) !!value); } bool TimeCode::colorFrame () const { return !!bitField (_time, 7, 7); } void TimeCode::setColorFrame (bool value) { setBitField (_time, 7, 7, (unsigned int) !!value); } bool TimeCode::fieldPhase () const { return !!bitField (_time, 15, 15); } void TimeCode::setFieldPhase (bool value) { setBitField (_time, 15, 15, (unsigned int) !!value); } bool TimeCode::bgf0 () const { return !!bitField (_time, 23, 23); } void TimeCode::setBgf0 (bool value) { setBitField (_time, 23, 23, (unsigned int) !!value); } bool TimeCode::bgf1 () const { return!!bitField (_time, 30, 30); } void TimeCode::setBgf1 (bool value) { setBitField (_time, 30, 30, (unsigned int) !!value); } bool TimeCode::bgf2 () const { return !!bitField (_time, 31, 31); } void TimeCode::setBgf2 (bool value) { setBitField (_time, 31, 31, (unsigned int) !!value); } int TimeCode::binaryGroup (int group) const { if (group < 1 || group > 8) throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code " "user data. Group number is out of range."); int minBit = 4 * (group - 1); int maxBit = minBit + 3; return int (bitField (_user, minBit, maxBit)); } void TimeCode::setBinaryGroup (int group, int value) { if (group < 1 || group > 8) throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code " "user data. Group number is out of range."); int minBit = 4 * (group - 1); int maxBit = minBit + 3; setBitField (_user, minBit, maxBit, (unsigned int) value); } unsigned int TimeCode::timeAndFlags (Packing packing) const { if (packing == TV50_PACKING) { unsigned int t = _time; t &= ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); t |= ((unsigned int) bgf0() << 15); t |= ((unsigned int) bgf2() << 23); t |= ((unsigned int) bgf1() << 30); t |= ((unsigned int) fieldPhase() << 31); return t; } if (packing == FILM24_PACKING) { return _time & ~((1 << 6) | (1 << 7)); } else // packing == TV60_PACKING { return _time; } } void TimeCode::setTimeAndFlags (unsigned int value, Packing packing) { if (packing == TV50_PACKING) { _time = value & ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); if (value & (1 << 15)) setBgf0 (true); if (value & (1 << 23)) setBgf2 (true); if (value & (1 << 30)) setBgf1 (true); if (value & (1 << 31)) setFieldPhase (true); } else if (packing == FILM24_PACKING) { _time = value & ~((1 << 6) | (1 << 7)); } else // packing == TV60_PACKING { _time = value; } } unsigned int TimeCode::userData () const { return _user; } void TimeCode::setUserData (unsigned int value) { _user = value; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTimeCode.h000066400000000000000000000167751406177042200201630ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TIME_CODE_H #define INCLUDED_IMF_TIME_CODE_H #include "ImfExport.h" #include "ImfNamespace.h" //----------------------------------------------------------------------------- // // class TimeCode // // A TimeCode object stores time and control codes as described // in SMPTE standard 12M-1999. A TimeCode object contains the // following fields: // // Time Address: // // hours integer, range 0 - 23 // minutes integer, range 0 - 59 // seconds integer, range 0 - 59 // frame integer, range 0 - 29 // // Flags: // // drop frame flag boolean // color frame flag boolean // field/phase flag boolean // bgf0 boolean // bgf1 boolean // bgf2 boolean // // Binary groups for user-defined data and control codes: // // binary group 1 integer, range 0 - 15 // binary group 2 integer, range 0 - 15 // ... // binary group 8 integer, range 0 - 15 // // Class TimeCode contains methods to convert between the fields // listed above and a more compact representation where the fields // are packed into two unsigned 32-bit integers. In the packed // integer representations, bit 0 is the least significant bit, // and bit 31 is the most significant bit of the integer value. // // The time address and flags fields can be packed in three // different ways: // // bits packing for packing for packing for // 24-frame 60-field 50-field // film television television // // 0 - 3 frame units frame units frame units // 4 - 5 frame tens frame tens frame tens // 6 unused, set to 0 drop frame flag unused, set to 0 // 7 unused, set to 0 color frame flag color frame flag // 8 - 11 seconds units seconds units seconds units // 12 - 14 seconds tens seconds tens seconds tens // 15 phase flag field/phase flag bgf0 // 16 - 19 minutes units minutes units minutes units // 20 - 22 minutes tens minutes tens minutes tens // 23 bgf0 bgf0 bgf2 // 24 - 27 hours units hours units hours units // 28 - 29 hours tens hours tens hours tens // 30 bgf1 bgf1 bgf1 // 31 bgf2 bgf2 field/phase flag // // User-defined data and control codes are packed as follows: // // bits field // // 0 - 3 binary group 1 // 4 - 7 binary group 2 // 8 - 11 binary group 3 // 12 - 15 binary group 4 // 16 - 19 binary group 5 // 20 - 23 binary group 6 // 24 - 27 binary group 7 // 28 - 31 binary group 8 // //----------------------------------------------------------------------------- OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class TimeCode { public: //--------------------- // Bit packing variants //--------------------- enum Packing { TV60_PACKING, // packing for 60-field television TV50_PACKING, // packing for 50-field television FILM24_PACKING // packing for 24-frame film }; //------------------------------------- // Constructors and assignment operator //------------------------------------- IMF_EXPORT TimeCode (); // all fields set to 0 or false IMF_EXPORT TimeCode (int hours, int minutes, int seconds, int frame, bool dropFrame = false, bool colorFrame = false, bool fieldPhase = false, bool bgf0 = false, bool bgf1 = false, bool bgf2 = false, int binaryGroup1 = 0, int binaryGroup2 = 0, int binaryGroup3 = 0, int binaryGroup4 = 0, int binaryGroup5 = 0, int binaryGroup6 = 0, int binaryGroup7 = 0, int binaryGroup8 = 0); IMF_EXPORT TimeCode (unsigned int timeAndFlags, unsigned int userData = 0, Packing packing = TV60_PACKING); IMF_EXPORT TimeCode (const TimeCode &other); ~TimeCode () = default; IMF_EXPORT TimeCode & operator = (const TimeCode &other); //---------------------------- // Access to individual fields //---------------------------- IMF_EXPORT int hours () const; IMF_EXPORT void setHours (int value); IMF_EXPORT int minutes () const; IMF_EXPORT void setMinutes (int value); IMF_EXPORT int seconds () const; IMF_EXPORT void setSeconds (int value); IMF_EXPORT int frame () const; IMF_EXPORT void setFrame (int value); IMF_EXPORT bool dropFrame () const; IMF_EXPORT void setDropFrame (bool value); IMF_EXPORT bool colorFrame () const; IMF_EXPORT void setColorFrame (bool value); IMF_EXPORT bool fieldPhase () const; IMF_EXPORT void setFieldPhase (bool value); IMF_EXPORT bool bgf0 () const; IMF_EXPORT void setBgf0 (bool value); IMF_EXPORT bool bgf1 () const; IMF_EXPORT void setBgf1 (bool value); IMF_EXPORT bool bgf2 () const; IMF_EXPORT void setBgf2 (bool value); IMF_EXPORT int binaryGroup (int group) const; // group must be between 1 and 8 IMF_EXPORT void setBinaryGroup (int group, int value); //--------------------------------- // Access to packed representations //--------------------------------- IMF_EXPORT unsigned int timeAndFlags (Packing packing = TV60_PACKING) const; IMF_EXPORT void setTimeAndFlags (unsigned int value, Packing packing = TV60_PACKING); IMF_EXPORT unsigned int userData () const; IMF_EXPORT void setUserData (unsigned int value); //--------- // Equality //--------- IMF_EXPORT bool operator == (const TimeCode &v) const; IMF_EXPORT bool operator != (const TimeCode &v) const; private: unsigned int _time; unsigned int _user; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp000066400000000000000000000053161406177042200223670ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class TimeCodeAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * TimeCodeAttribute::staticTypeName () { return "timecode"; } template <> void TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.timeAndFlags()); Xdr::write (os, _value.userData()); } template <> void TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { unsigned int tmp; Xdr::read (is, tmp); _value.setTimeAndFlags (tmp); Xdr::read (is, tmp); _value.setUserData (tmp); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfTimeCodeAttribute.h000066400000000000000000000052161406177042200220330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H #define INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class TimeCodeAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImfTimeCode.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute TimeCodeAttribute; template <> IMF_EXPORT const char *TimeCodeAttribute::staticTypeName (); template <> IMF_EXPORT void TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfVecAttribute.cpp000066400000000000000000000124371406177042200214150ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class V2iAttribute // class V2fAttribute // class V2dAttribute // class V3iAttribute // class V3fAttribute // class V3dAttribute // //----------------------------------------------------------------------------- #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; template <> const char * V2iAttribute::staticTypeName () { return "v2i"; } template <> void V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); } template <> void V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); } template <> const char * V2fAttribute::staticTypeName () { return "v2f"; } template <> void V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); } template <> void V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); } template <> const char * V2dAttribute::staticTypeName () { return "v2d"; } template <> void V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); } template <> void V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); } template <> const char * V3iAttribute::staticTypeName () { return "v3i"; } template <> void V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); Xdr::write (os, _value.z); } template <> void V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); Xdr::read (is, _value.z); } template <> const char * V3fAttribute::staticTypeName () { return "v3f"; } template <> void V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); Xdr::write (os, _value.z); } template <> void V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); Xdr::read (is, _value.z); } template <> const char * V3dAttribute::staticTypeName () { return "v3d"; } template <> void V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); Xdr::write (os, _value.z); } template <> void V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); Xdr::read (is, _value.z); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfVecAttribute.h000066400000000000000000000107141406177042200210560ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_VEC_ATTRIBUTE_H #define INCLUDED_IMF_VEC_ATTRIBUTE_H //----------------------------------------------------------------------------- // // class V2iAttribute // class V2fAttribute // class V2dAttribute // class V3iAttribute // class V3fAttribute // class V3dAttribute // //----------------------------------------------------------------------------- #include "ImfAttribute.h" #include "ImathVec.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER typedef TypedAttribute V2iAttribute; template <> IMF_EXPORT const char *V2iAttribute::staticTypeName (); template <> IMF_EXPORT void V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute V2fAttribute; template <> IMF_EXPORT const char *V2fAttribute::staticTypeName (); template <> IMF_EXPORT void V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute V2dAttribute; template <> IMF_EXPORT const char *V2dAttribute::staticTypeName (); template <> IMF_EXPORT void V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute V3iAttribute; template <> IMF_EXPORT const char *V3iAttribute::staticTypeName (); template <> IMF_EXPORT void V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute V3fAttribute; template <> IMF_EXPORT const char *V3fAttribute::staticTypeName (); template <> IMF_EXPORT void V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); typedef TypedAttribute V3dAttribute; template <> IMF_EXPORT const char *V3dAttribute::staticTypeName (); template <> IMF_EXPORT void V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; template <> IMF_EXPORT void V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #if defined (OPENEXR_IMF_INTERNAL_NAMESPACE_AUTO_EXPOSE) namespace Imf { using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; } #endif #endif openexr-2.5.7/OpenEXR/IlmImf/ImfVersion.cpp000066400000000000000000000044701406177042200204370ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Magic and version number. // //----------------------------------------------------------------------------- #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER bool isImfMagic (const char bytes[4]) { return bytes[0] == ((MAGIC >> 0) & 0x00ff) && bytes[1] == ((MAGIC >> 8) & 0x00ff) && bytes[2] == ((MAGIC >> 16) & 0x00ff) && bytes[3] == ((MAGIC >> 24) & 0x00ff); } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfVersion.h000066400000000000000000000112331406177042200200770ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_VERSION_H #define INCLUDED_IMF_VERSION_H //----------------------------------------------------------------------------- // // Magic and version number. // //----------------------------------------------------------------------------- #include "ImfExport.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER // // The MAGIC number is stored in the first four bytes of every // OpenEXR image file. This can be used to quickly test whether // a given file is an OpenEXR image file (see isImfMagic(), below). // const int MAGIC = 20000630; // // The second item in each OpenEXR image file, right after the // magic number, is a four-byte file version identifier. Depending // on a file's version identifier, a file reader can enable various // backwards-compatibility switches, or it can quickly reject files // that it cannot read. // // The version identifier is split into an 8-bit version number, // and a 24-bit flags field. // const int VERSION_NUMBER_FIELD = 0x000000ff; const int VERSION_FLAGS_FIELD = 0xffffff00; // // Value that goes into VERSION_NUMBER_FIELD. // const int EXR_VERSION = 2; // // Flags that can go into VERSION_FLAGS_FIELD. // Flags can only occupy the 1 bits in VERSION_FLAGS_FIELD. // const int TILED_FLAG = 0x00000200; // File is tiled const int LONG_NAMES_FLAG = 0x00000400; // File contains long // attribute or channel // names const int NON_IMAGE_FLAG = 0x00000800; // File has at least one part // which is not a regular // scanline image or regular tiled image // (that is, it is a deep format) const int MULTI_PART_FILE_FLAG = 0x00001000; // File has multiple parts // // Bitwise OR of all known flags. // const int ALL_FLAGS = TILED_FLAG | LONG_NAMES_FLAG | NON_IMAGE_FLAG | MULTI_PART_FILE_FLAG; // // Utility functions // inline bool isTiled (int version) {return !!(version & TILED_FLAG);} inline bool isMultiPart (int version) {return !!(version & MULTI_PART_FILE_FLAG); } inline bool isNonImage(int version) {return !!(version & NON_IMAGE_FLAG); } inline int makeTiled (int version) {return version | TILED_FLAG;} inline int makeNotTiled (int version) {return version & ~TILED_FLAG;} inline int getVersion (int version) {return version & VERSION_NUMBER_FIELD;} inline int getFlags (int version) {return version & VERSION_FLAGS_FIELD;} inline bool supportsFlags (int flags) {return !(flags & ~ALL_FLAGS);} // // Given the first four bytes of a file, returns true if the // file is probably an OpenEXR image file, false if not. // IMF_EXPORT bool isImfMagic (const char bytes[4]); OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfWav.cpp000066400000000000000000000175611406177042200175540ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // 16-bit Haar Wavelet encoding and decoding // // The source code in this file is derived from the encoding // and decoding routines written by Christian Rouet for his // PIZ image file format. // //----------------------------------------------------------------------------- #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace { // // Wavelet basis functions without modulo arithmetic; they produce // the best compression ratios when the wavelet-transformed data are // Huffman-encoded, but the wavelet transform works only for 14-bit // data (untransformed data values must be less than (1 << 14)). // inline void wenc14 (unsigned short a, unsigned short b, unsigned short &l, unsigned short &h) { short as = a; short bs = b; short ms = (as + bs) >> 1; short ds = as - bs; l = ms; h = ds; } inline void wdec14 (unsigned short l, unsigned short h, unsigned short &a, unsigned short &b) { short ls = l; short hs = h; int hi = hs; int ai = ls + (hi & 1) + (hi >> 1); short as = ai; short bs = ai - hi; a = as; b = bs; } // // Wavelet basis functions with modulo arithmetic; they work with full // 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't // compress the data quite as well. // const int NBITS = 16; const int A_OFFSET = 1 << (NBITS - 1); const int M_OFFSET = 1 << (NBITS - 1); const int MOD_MASK = (1 << NBITS) - 1; inline void wenc16 (unsigned short a, unsigned short b, unsigned short &l, unsigned short &h) { int ao = (a + A_OFFSET) & MOD_MASK; int m = ((ao + b) >> 1); int d = ao - b; if (d < 0) m = (m + M_OFFSET) & MOD_MASK; d &= MOD_MASK; l = m; h = d; } inline void wdec16 (unsigned short l, unsigned short h, unsigned short &a, unsigned short &b) { int m = l; int d = h; int bb = (m - (d >> 1)) & MOD_MASK; int aa = (d + bb - A_OFFSET) & MOD_MASK; b = bb; a = aa; } } // namespace // // 2D Wavelet encoding: // void wav2Encode (unsigned short* in, // io: values are transformed in place int nx, // i : x size int ox, // i : x offset int ny, // i : y size int oy, // i : y offset unsigned short mx) // i : maximum in[x][y] value { bool w14 = (mx < (1 << 14)); int n = (nx > ny)? ny: nx; int p = 1; // == 1 << level int p2 = 2; // == 1 << (level+1) // // Hierachical loop on smaller dimension n // while (p2 <= n) { unsigned short *py = in; unsigned short *ey = in + oy * (ny - p2); int oy1 = oy * p; int oy2 = oy * p2; int ox1 = ox * p; int ox2 = ox * p2; unsigned short i00,i01,i10,i11; // // Y loop // for (; py <= ey; py += oy2) { unsigned short *px = py; unsigned short *ex = py + ox * (nx - p2); // // X loop // for (; px <= ex; px += ox2) { unsigned short *p01 = px + ox1; unsigned short *p10 = px + oy1; unsigned short *p11 = p10 + ox1; // // 2D wavelet encoding // if (w14) { wenc14 (*px, *p01, i00, i01); wenc14 (*p10, *p11, i10, i11); wenc14 (i00, i10, *px, *p10); wenc14 (i01, i11, *p01, *p11); } else { wenc16 (*px, *p01, i00, i01); wenc16 (*p10, *p11, i10, i11); wenc16 (i00, i10, *px, *p10); wenc16 (i01, i11, *p01, *p11); } } // // Encode (1D) odd column (still in Y loop) // if (nx & p) { unsigned short *p10 = px + oy1; if (w14) wenc14 (*px, *p10, i00, *p10); else wenc16 (*px, *p10, i00, *p10); *px= i00; } } // // Encode (1D) odd line (must loop in X) // if (ny & p) { unsigned short *px = py; unsigned short *ex = py + ox * (nx - p2); for (; px <= ex; px += ox2) { unsigned short *p01 = px + ox1; if (w14) wenc14 (*px, *p01, i00, *p01); else wenc16 (*px, *p01, i00, *p01); *px= i00; } } // // Next level // p = p2; p2 <<= 1; } } // // 2D Wavelet decoding: // void wav2Decode (unsigned short* in, // io: values are transformed in place int nx, // i : x size int ox, // i : x offset int ny, // i : y size int oy, // i : y offset unsigned short mx) // i : maximum in[x][y] value { bool w14 = (mx < (1 << 14)); int n = (nx > ny)? ny: nx; int p = 1; int p2; // // Search max level // while (p <= n) p <<= 1; p >>= 1; p2 = p; p >>= 1; // // Hierarchical loop on smaller dimension n // while (p >= 1) { unsigned short *py = in; unsigned short *ey = in + oy * (ny - p2); int oy1 = oy * p; int oy2 = oy * p2; int ox1 = ox * p; int ox2 = ox * p2; unsigned short i00,i01,i10,i11; // // Y loop // for (; py <= ey; py += oy2) { unsigned short *px = py; unsigned short *ex = py + ox * (nx - p2); // // X loop // for (; px <= ex; px += ox2) { unsigned short *p01 = px + ox1; unsigned short *p10 = px + oy1; unsigned short *p11 = p10 + ox1; // // 2D wavelet decoding // if (w14) { wdec14 (*px, *p10, i00, i10); wdec14 (*p01, *p11, i01, i11); wdec14 (i00, i01, *px, *p01); wdec14 (i10, i11, *p10, *p11); } else { wdec16 (*px, *p10, i00, i10); wdec16 (*p01, *p11, i01, i11); wdec16 (i00, i01, *px, *p01); wdec16 (i10, i11, *p10, *p11); } } // // Decode (1D) odd column (still in Y loop) // if (nx & p) { unsigned short *p10 = px + oy1; if (w14) wdec14 (*px, *p10, i00, *p10); else wdec16 (*px, *p10, i00, *p10); *px= i00; } } // // Decode (1D) odd line (must loop in X) // if (ny & p) { unsigned short *px = py; unsigned short *ex = py + ox * (nx - p2); for (; px <= ex; px += ox2) { unsigned short *p01 = px + ox1; if (w14) wdec14 (*px, *p01, i00, *p01); else wdec16 (*px, *p01, i00, *p01); *px= i00; } } // // Next level // p2 = p; p >>= 1; } } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfWav.h000066400000000000000000000053511406177042200172130ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_WAV_H #define INCLUDED_IMF_WAV_H //----------------------------------------------------------------------------- // // 16-bit Haar Wavelet encoding and decoding // //----------------------------------------------------------------------------- #include "ImfNamespace.h" #include "ImfExport.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMF_EXPORT void wav2Encode (unsigned short *in, // io: values in[y][x] are transformed in place int nx, // i : x size int ox, // i : x offset int ny, // i : y size int oy, // i : y offset unsigned short mx); // i : maximum in[x][y] value IMF_EXPORT void wav2Decode (unsigned short *in, // io: values in[y][x] are transformed in place int nx, // i : x size int ox, // i : x offset int ny, // i : y size int oy, // i : y offset unsigned short mx); // i : maximum in[x][y] value OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfXdr.h000066400000000000000000000464011406177042200172140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_XDR_H #define INCLUDED_IMF_XDR_H //---------------------------------------------------------------------------- // // Xdr -- routines to convert data between the machine's native // format and a machine-independent external data representation: // // write (T &o, S v); converts a value, v, of type S // into a machine-independent // representation and stores the // result in an output buffer, o. // // read (T &i, S &v); reads the machine-independent // representation of a value of type // S from input buffer i, converts // the value into the machine's native // representation, and stores the result // in v. // // size(); returns the size, in bytes, of the // machine-independent representation // of an object of type S. // // The write() and read() routines are templates; data can be written // to and read from any output or input buffer type T for which a helper // class, R, exits. Class R must define a method to store a char array // in a T, and a method to read a char array from a T: // // struct R // { // static void // writeChars (T &o, const char c[/*n*/], int n) // { // ... // Write c[0], c[1] ... c[n-1] to output buffer o. // } // // static void // readChars (T &i, char c[/*n*/], int n) // { // ... // Read n characters from input buffer i // // and copy them to c[0], c[1] ... c[n-1]. // } // }; // // Example - writing to and reading from iostreams: // // struct CharStreamIO // { // static void // writeChars (ostream &os, const char c[], int n) // { // os.write (c, n); // } // // static void // readChars (istream &is, char c[], int n) // { // is.read (c, n); // } // }; // // ... // // Xdr::write (os, 3); // Xdr::write (os, 5.0); // //---------------------------------------------------------------------------- #include "ImfInt64.h" #include "IexMathExc.h" #include "half.h" #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER namespace Xdr { //------------------------------- // Write data to an output stream //------------------------------- template void write (T &out, bool v); template void write (T &out, char v); template void write (T &out, signed char v); template void write (T &out, unsigned char v); template void write (T &out, signed short v); template void write (T &out, unsigned short v); template void write (T &out, signed int v); template void write (T &out, unsigned int v); template void write (T &out, signed long v); template void write (T &out, unsigned long v); #if ULONG_MAX != 18446744073709551615LU template void write (T &out, Int64 v); #endif template void write (T &out, float v); template void write (T &out, double v); template void write (T &out, half v); template void write (T &out, const char v[/*n*/], int n); // fixed-size char array template void write (T &out, const char v[]); // zero-terminated string //----------------------------------------- // Append padding bytes to an output stream //----------------------------------------- template void pad (T &out, int n); // write n padding bytes //------------------------------- // Read data from an input stream //------------------------------- template void read (T &in, bool &v); template void read (T &in, char &v); template void read (T &in, signed char &v); template void read (T &in, unsigned char &v); template void read (T &in, signed short &v); template void read (T &in, unsigned short &v); template void read (T &in, signed int &v); template void read (T &in, unsigned int &v); template void read (T &in, signed long &v); template void read (T &in, unsigned long &v); #if ULONG_MAX != 18446744073709551615LU template void read (T &in, Int64 &v); #endif template void read (T &in, float &v); template void read (T &in, double &v); template void read (T &in, half &v); template void read (T &in, char v[/*n*/], int n); // fixed-size char array template void read (T &in, int n, char v[/*n*/]); // zero-terminated string //------------------------------------------- // Skip over padding bytes in an input stream //------------------------------------------- template void skip (T &in, int n); // skip n padding bytes //-------------------------------------- // Size of the machine-independent // representation of an object of type S //-------------------------------------- template int size (); //--------------- // Implementation //--------------- template inline void writeSignedChars (T &out, const signed char c[], int n) { S::writeChars (out, (const char *) c, n); } template inline void writeUnsignedChars (T &out, const unsigned char c[], int n) { S::writeChars (out, (const char *) c, n); } template inline void readSignedChars (T &in, signed char c[], int n) { S::readChars (in, (char *) c, n); } template inline void readUnsignedChars (T &in, unsigned char c[], int n) { S::readChars (in, (char *) c, n); } template inline void write (T &out, bool v) { char c = !!v; S::writeChars (out, &c, 1); } template inline void write (T &out, char v) { S::writeChars (out, &v, 1); } template inline void write (T &out, signed char v) { writeSignedChars (out, &v, 1); } template inline void write (T &out, unsigned char v) { writeUnsignedChars (out, &v, 1); } template void write (T &out, signed short v) { signed char b[2]; b[0] = (signed char) (v); b[1] = (signed char) (v >> 8); writeSignedChars (out, b, 2); } template void write (T &out, unsigned short v) { unsigned char b[2]; b[0] = (unsigned char) (v); b[1] = (unsigned char) (v >> 8); writeUnsignedChars (out, b, 2); } template void write (T &out, signed int v) { signed char b[4]; b[0] = (signed char) (v); b[1] = (signed char) (v >> 8); b[2] = (signed char) (v >> 16); b[3] = (signed char) (v >> 24); writeSignedChars (out, b, 4); } template void write (T &out, unsigned int v) { unsigned char b[4]; b[0] = (unsigned char) (v); b[1] = (unsigned char) (v >> 8); b[2] = (unsigned char) (v >> 16); b[3] = (unsigned char) (v >> 24); writeUnsignedChars (out, b, 4); } template void write (T &out, signed long v) { signed char b[8]; b[0] = (signed char) (v); b[1] = (signed char) (v >> 8); b[2] = (signed char) (v >> 16); b[3] = (signed char) (v >> 24); #if LONG_MAX == 2147483647 if (v >= 0) { b[4] = 0; b[5] = 0; b[6] = 0; b[7] = 0; } else { b[4] = ~0; b[5] = ~0; b[6] = ~0; b[7] = ~0; } #elif LONG_MAX == 9223372036854775807L b[4] = (signed char) (v >> 32); b[5] = (signed char) (v >> 40); b[6] = (signed char) (v >> 48); b[7] = (signed char) (v >> 56); #else #error write (T &out, signed long v) not implemented #endif writeSignedChars (out, b, 8); } template void write (T &out, unsigned long v) { unsigned char b[8]; b[0] = (unsigned char) (v); b[1] = (unsigned char) (v >> 8); b[2] = (unsigned char) (v >> 16); b[3] = (unsigned char) (v >> 24); #if ULONG_MAX == 4294967295U b[4] = 0; b[5] = 0; b[6] = 0; b[7] = 0; #elif ULONG_MAX == 18446744073709551615LU b[4] = (unsigned char) (v >> 32); b[5] = (unsigned char) (v >> 40); b[6] = (unsigned char) (v >> 48); b[7] = (unsigned char) (v >> 56); #else #error write (T &out, unsigned long v) not implemented #endif writeUnsignedChars (out, b, 8); } #if ULONG_MAX != 18446744073709551615LU template void write (T &out, Int64 v) { unsigned char b[8]; b[0] = (unsigned char) (v); b[1] = (unsigned char) (v >> 8); b[2] = (unsigned char) (v >> 16); b[3] = (unsigned char) (v >> 24); b[4] = (unsigned char) (v >> 32); b[5] = (unsigned char) (v >> 40); b[6] = (unsigned char) (v >> 48); b[7] = (unsigned char) (v >> 56); writeUnsignedChars (out, b, 8); } #endif template void write (T &out, float v) { union {unsigned int i; float f;} u; u.f = v; unsigned char b[4]; b[0] = (unsigned char) (u.i); b[1] = (unsigned char) (u.i >> 8); b[2] = (unsigned char) (u.i >> 16); b[3] = (unsigned char) (u.i >> 24); writeUnsignedChars (out, b, 4); } template void write (T &out, double v) { union {Int64 i; double d;} u; u.d = v; unsigned char b[8]; b[0] = (unsigned char) (u.i); b[1] = (unsigned char) (u.i >> 8); b[2] = (unsigned char) (u.i >> 16); b[3] = (unsigned char) (u.i >> 24); b[4] = (unsigned char) (u.i >> 32); b[5] = (unsigned char) (u.i >> 40); b[6] = (unsigned char) (u.i >> 48); b[7] = (unsigned char) (u.i >> 56); writeUnsignedChars (out, b, 8); } template inline void write (T &out, half v) { unsigned char b[2]; b[0] = (unsigned char) (v.bits()); b[1] = (unsigned char) (v.bits() >> 8); writeUnsignedChars (out, b, 2); } template inline void write (T &out, const char v[], int n) // fixed-size char array { S::writeChars (out, v, n); } template void write (T &out, const char v[]) // zero-terminated string { while (*v) { S::writeChars (out, v, 1); ++v; } S::writeChars (out, v, 1); } template void pad (T &out, int n) // add n padding bytes { for (int i = 0; i < n; i++) { const char c = 0; S::writeChars (out, &c, 1); } } template inline void read (T &in, bool &v) { char c; S::readChars (in, &c, 1); v = !!c; } template inline void read (T &in, char &v) { S::readChars (in, &v, 1); } template inline void read (T &in, signed char &v) { readSignedChars (in, &v, 1); } template inline void read (T &in, unsigned char &v) { readUnsignedChars (in, &v, 1); } template void read (T &in, signed short &v) { signed char b[2]; readSignedChars (in, b, 2); v = (static_cast (b[0]) & 0x00ff) | (static_cast (b[1]) << 8); } template void read (T &in, unsigned short &v) { unsigned char b[2]; readUnsignedChars (in, b, 2); v = (b[0] & 0x00ff) | (b[1] << 8); } template void read (T &in, signed int &v) { signed char b[4]; readSignedChars (in, b, 4); v = (static_cast (b[0]) & 0x000000ff) | ((static_cast (b[1]) << 8) & 0x0000ff00) | ((static_cast (b[2]) << 16) & 0x00ff0000) | (static_cast (b[3]) << 24); } template void read (T &in, unsigned int &v) { unsigned char b[4]; readUnsignedChars (in, b, 4); v = (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) | ((b[2] << 16) & 0x00ff0000) | (b[3] << 24); } template void read (T &in, signed long &v) { signed char b[8]; readSignedChars (in, b, 8); #if LONG_MAX == 2147483647 v = (static_cast (b[0]) & 0x000000ff) | ((static_cast (b[1]) << 8) & 0x0000ff00) | ((static_cast (b[2]) << 16) & 0x00ff0000) | (static_cast (b[3]) << 24); if (( b[4] || b[5] || b[6] || b[7]) && (~b[4] || ~b[5] || ~b[6] || ~b[7])) { throw IEX_NAMESPACE::OverflowExc ("Long int overflow - read a large " "64-bit integer in a 32-bit process."); } #elif LONG_MAX == 9223372036854775807L v = (static_cast (b[0]) & 0x00000000000000ff) | ((static_cast (b[1]) << 8) & 0x000000000000ff00) | ((static_cast (b[2]) << 16) & 0x0000000000ff0000) | ((static_cast (b[3]) << 24) & 0x00000000ff000000) | ((static_cast (b[4]) << 32) & 0x000000ff00000000) | ((static_cast (b[5]) << 40) & 0x0000ff0000000000) | ((static_cast (b[6]) << 48) & 0x00ff000000000000) | (static_cast (b[7]) << 56); #else #error read (T &in, signed long &v) not implemented #endif } template void read (T &in, unsigned long &v) { unsigned char b[8]; readUnsignedChars (in, b, 8); #if ULONG_MAX == 4294967295U v = (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) | ((b[2] << 16) & 0x00ff0000) | (b[3] << 24); if (b[4] || b[5] || b[6] || b[7]) { throw IEX_NAMESPACE::OverflowExc ("Long int overflow - read a large " "64-bit integer in a 32-bit process."); } #elif ULONG_MAX == 18446744073709551615LU v = ((unsigned long) b[0] & 0x00000000000000ff) | (((unsigned long) b[1] << 8) & 0x000000000000ff00) | (((unsigned long) b[2] << 16) & 0x0000000000ff0000) | (((unsigned long) b[3] << 24) & 0x00000000ff000000) | (((unsigned long) b[4] << 32) & 0x000000ff00000000) | (((unsigned long) b[5] << 40) & 0x0000ff0000000000) | (((unsigned long) b[6] << 48) & 0x00ff000000000000) | ((unsigned long) b[7] << 56); #else #error read (T &in, unsigned long &v) not implemented #endif } #if ULONG_MAX != 18446744073709551615LU template void read (T &in, Int64 &v) { unsigned char b[8]; readUnsignedChars (in, b, 8); v = ((Int64) b[0] & 0x00000000000000ffLL) | (((Int64) b[1] << 8) & 0x000000000000ff00LL) | (((Int64) b[2] << 16) & 0x0000000000ff0000LL) | (((Int64) b[3] << 24) & 0x00000000ff000000LL) | (((Int64) b[4] << 32) & 0x000000ff00000000LL) | (((Int64) b[5] << 40) & 0x0000ff0000000000LL) | (((Int64) b[6] << 48) & 0x00ff000000000000LL) | ((Int64) b[7] << 56); } #endif template void read (T &in, float &v) { unsigned char b[4]; readUnsignedChars (in, b, 4); union {unsigned int i; float f;} u; u.i = (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) | ((b[2] << 16) & 0x00ff0000) | (b[3] << 24); v = u.f; } template void read (T &in, double &v) { unsigned char b[8]; readUnsignedChars (in, b, 8); union {Int64 i; double d;} u; u.i = ((Int64) b[0] & 0x00000000000000ffULL) | (((Int64) b[1] << 8) & 0x000000000000ff00ULL) | (((Int64) b[2] << 16) & 0x0000000000ff0000ULL) | (((Int64) b[3] << 24) & 0x00000000ff000000ULL) | (((Int64) b[4] << 32) & 0x000000ff00000000ULL) | (((Int64) b[5] << 40) & 0x0000ff0000000000ULL) | (((Int64) b[6] << 48) & 0x00ff000000000000ULL) | ((Int64) b[7] << 56); v = u.d; } template inline void read (T &in, half &v) { unsigned char b[2]; readUnsignedChars (in, b, 2); v.setBits ((b[0] & 0x00ff) | (b[1] << 8)); } template inline void read (T &in, char v[], int n) // fixed-size char array { S::readChars (in, v, n); } template void read (T &in, int n, char v[]) // zero-terminated string { while (n >= 0) { S::readChars (in, v, 1); if (*v == 0) break; --n; ++v; } } template void skip (T &in, int n) // skip n padding bytes { char c[1024]; while (n >= (int) sizeof (c)) { if (!S::readChars (in, c, sizeof (c))) return; n -= sizeof (c); } if (n >= 1) S::readChars (in, c, n); } template <> inline int size () {return 1;} template <> inline int size () {return 1;} template <> inline int size () {return 1;} template <> inline int size () {return 1;} template <> inline int size () {return 2;} template <> inline int size () {return 2;} template <> inline int size () {return 4;} template <> inline int size () {return 4;} template <> inline int size () {return 8;} template <> inline int size () {return 8;} template <> inline int size () {return 8;} template <> inline int size () {return 4;} template <> inline int size () {return 8;} template <> inline int size () {return 2;} } // namespace Xdr OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #if defined (OPENEXR_IMF_INTERNAL_NAMESPACE_AUTO_EXPOSE) namespace Imf{using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;} #endif #endif openexr-2.5.7/OpenEXR/IlmImf/ImfZip.cpp000066400000000000000000000172011406177042200175500ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "ImfZip.h" #include "ImfCheckedArithmetic.h" #include "ImfNamespace.h" #include "ImfSimd.h" #include "Iex.h" #include #include OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER Zip::Zip(size_t maxRawSize): _maxRawSize(maxRawSize), _tmpBuffer(0) { _tmpBuffer = new char[_maxRawSize]; } Zip::Zip(size_t maxScanLineSize, size_t numScanLines): _maxRawSize(0), _tmpBuffer(0) { _maxRawSize = uiMult (maxScanLineSize, numScanLines); _tmpBuffer = new char[_maxRawSize]; } Zip::~Zip() { if (_tmpBuffer) delete[] _tmpBuffer; } size_t Zip::maxRawSize() { return _maxRawSize; } size_t Zip::maxCompressedSize() { return uiAdd (uiAdd (_maxRawSize, size_t (ceil (_maxRawSize * 0.01))), size_t (100)); } int Zip::compress(const char *raw, int rawSize, char *compressed) { // // Reorder the pixel data. // { char *t1 = _tmpBuffer; char *t2 = _tmpBuffer + (rawSize + 1) / 2; const char *stop = raw + rawSize; while (true) { if (raw < stop) *(t1++) = *(raw++); else break; if (raw < stop) *(t2++) = *(raw++); else break; } } // // Predictor. // { unsigned char *t = (unsigned char *) _tmpBuffer + 1; unsigned char *stop = (unsigned char *) _tmpBuffer + rawSize; int p = t[-1]; while (t < stop) { int d = int (t[0]) - p + (128 + 256); p = t[0]; t[0] = d; ++t; } } // // Compress the data using zlib // uLongf outSize = int(ceil(rawSize * 1.01)) + 100; if (Z_OK != ::compress ((Bytef *)compressed, &outSize, (const Bytef *) _tmpBuffer, rawSize)) { throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed."); } return outSize; } #ifdef IMF_HAVE_SSE4_1 static void reconstruct_sse41(char *buf, size_t outSize) { static const size_t bytesPerChunk = sizeof(__m128i); const size_t vOutSize = outSize / bytesPerChunk; const __m128i c = _mm_set1_epi8(-128); const __m128i shuffleMask = _mm_set1_epi8(15); // The first element doesn't have its high bit flipped during compression, // so it must not be flipped here. To make the SIMD loop nice and // uniform, we pre-flip the bit so that the loop will unflip it again. buf[0] += -128; __m128i *vBuf = reinterpret_cast<__m128i *>(buf); __m128i vPrev = _mm_setzero_si128(); for (size_t i=0; i(source); const __m128i *v2 = reinterpret_cast(source + (outSize + 1) / 2); __m128i *vOut = reinterpret_cast<__m128i *>(out); for (size_t i=0; i(v1); const char *t2 = reinterpret_cast(v2); char *sOut = reinterpret_cast(vOut); for (size_t i=vOutSize*bytesPerChunk; i OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class Zip { public: IMF_EXPORT explicit Zip(size_t rawMaxSize); IMF_EXPORT Zip(size_t maxScanlineSize, size_t numScanLines); IMF_EXPORT ~Zip(); Zip (const Zip& other) = delete; Zip& operator = (const Zip& other) = delete; Zip (Zip&& other) = delete; Zip& operator = (Zip&& other) = delete; IMF_EXPORT size_t maxRawSize(); IMF_EXPORT size_t maxCompressedSize(); // // Compress the raw data into the provided buffer. // Returns the amount of compressed data. // IMF_EXPORT int compress(const char *raw, int rawSize, char *compressed); // // Uncompress the compressed data into the provided // buffer. Returns the amount of raw data actually decoded. // IMF_EXPORT int uncompress(const char *compressed, int compressedSize, char *raw); private: size_t _maxRawSize; char *_tmpBuffer; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/ImfZipCompressor.cpp000066400000000000000000000065601406177042200216330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // class ZipCompressor // //----------------------------------------------------------------------------- #include "ImfZipCompressor.h" #include "ImfCheckedArithmetic.h" #include "Iex.h" #include #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER ZipCompressor::ZipCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines) : Compressor (hdr), _maxScanLineSize (maxScanLineSize), _numScanLines (numScanLines), _outBuffer (0), _zip(maxScanLineSize, numScanLines) { // TODO: Remove this when we can change the ABI (void) _maxScanLineSize; _outBuffer = new char[_zip.maxCompressedSize ()]; } ZipCompressor::~ZipCompressor () { delete [] _outBuffer; } int ZipCompressor::numScanLines () const { return _numScanLines; } int ZipCompressor::compress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case �- empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } int outSize = _zip.compress(inPtr, inSize, _outBuffer); outPtr = _outBuffer; return outSize; } int ZipCompressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case �- empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } int outSize = _zip.uncompress(inPtr, inSize, _outBuffer); outPtr = _outBuffer; return outSize; } OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT openexr-2.5.7/OpenEXR/IlmImf/ImfZipCompressor.h000066400000000000000000000055541406177042200213020ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_IMF_ZIP_COMPRESSOR_H #define INCLUDED_IMF_ZIP_COMPRESSOR_H //----------------------------------------------------------------------------- // // class ZipCompressor -- performs zlib-style compression // //----------------------------------------------------------------------------- #include "ImfCompressor.h" #include "ImfZip.h" #include "ImfNamespace.h" OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER class ZipCompressor: public Compressor { public: IMF_EXPORT ZipCompressor (const Header &hdr, size_t maxScanLineSize, size_t numScanLines); IMF_EXPORT virtual ~ZipCompressor (); IMF_EXPORT virtual int numScanLines () const; IMF_EXPORT virtual int compress (const char *inPtr, int inSize, int minY, const char *&outPtr); IMF_EXPORT virtual int uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr); private: int _maxScanLineSize; int _numScanLines; char * _outBuffer; Zip _zip; }; OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT #endif openexr-2.5.7/OpenEXR/IlmImf/Makefile.am000066400000000000000000000176201406177042200177070ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = libIlmImf.la libIlmImf_la_SOURCES = ImfForward.h ImfAttribute.cpp ImfBoxAttribute.cpp ImfCRgbaFile.cpp \ ImfChannelList.cpp ImfChannelListAttribute.cpp \ ImfFloatAttribute.cpp ImfFrameBuffer.cpp \ ImfHeader.cpp ImfIO.cpp ImfInputFile.cpp \ ImfIntAttribute.cpp ImfLineOrderAttribute.cpp \ ImfMatrixAttribute.cpp ImfOpaqueAttribute.cpp \ ImfOutputFile.cpp ImfRgbaFile.cpp \ ImfStringAttribute.cpp ImfVecAttribute.cpp ImfHuf.cpp \ ImfThreading.cpp \ ImfWav.cpp ImfLut.cpp ImfCompressor.cpp \ ImfRleCompressor.cpp ImfZipCompressor.cpp \ ImfPizCompressor.cpp ImfB44Compressor.cpp \ ImfDwaCompressor.cpp ImfMisc.cpp \ ImfCompressionAttribute.cpp ImfDoubleAttribute.cpp \ ImfAttribute.h ImfBoxAttribute.h \ ImfCRgbaFile.h ImfChannelList.h \ ImfChannelListAttribute.h \ ImfCompressionAttribute.h \ ImfDoubleAttribute.h ImfFloatAttribute.h \ ImfFrameBuffer.h ImfHeader.h ImfIO.h \ ImfInputFile.h ImfIntAttribute.h \ ImfLineOrderAttribute.h ImfMatrixAttribute.h \ ImfOpaqueAttribute.h ImfOutputFile.h \ ImfRgbaFile.h ImfStringAttribute.h \ ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ ImfArray.h ImfCompression.h ImfLineOrder.h \ ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ ImfCompressor.h ImfRleCompressor.h ImfZipCompressor.h \ ImfPizCompressor.h ImfDwaCompressor.h \ ImfDwaCompressorSimd.h ImfAutoArray.h \ ImfConvert.cpp ImfConvert.h ImfPreviewImage.cpp \ ImfPreviewImage.h ImfPreviewImageAttribute.cpp \ ImfPreviewImageAttribute.h ImfVersion.cpp \ ImfChromaticities.cpp ImfChromaticities.h \ ImfChromaticitiesAttribute.cpp \ ImfChromaticitiesAttribute.h \ ImfKeyCode.cpp ImfKeyCode.h \ ImfKeyCodeAttribute.cpp ImfKeyCodeAttribute.h \ ImfTimeCode.cpp ImfTimeCode.h \ ImfTimeCodeAttribute.cpp ImfTimeCodeAttribute.h \ ImfRational.cpp ImfRational.h \ ImfRationalAttribute.cpp ImfRationalAttribute.h \ ImfFramesPerSecond.cpp ImfFramesPerSecond.h \ ImfStandardAttributes.cpp ImfStandardAttributes.h \ ImfStdIO.cpp ImfStdIO.h ImfEnvmap.cpp ImfEnvmap.h \ ImfEnvmapAttribute.cpp ImfEnvmapAttribute.h \ ImfInt64.h ImfRgba.h ImfScanLineInputFile.cpp \ ImfScanLineInputFile.h ImfTiledInputFile.cpp \ ImfTiledMisc.cpp ImfTiledOutputFile.cpp \ ImfTiledRgbaFile.cpp ImfTileDescriptionAttribute.cpp \ ImfTileOffsets.cpp ImfTileDescription.h \ ImfTileDescriptionAttribute.h ImfTileOffsets.h \ ImfTiledInputFile.h ImfTiledMisc.h \ ImfTiledOutputFile.h ImfTiledRgbaFile.h \ ImfRgbaYca.cpp ImfRgbaYca.h \ ImfPxr24Compressor.cpp ImfPxr24Compressor.h \ ImfTestFile.cpp ImfTestFile.h ImfThreading.h \ ImfStringVectorAttribute.cpp ImfStringVectorAttribute.h \ ImfMultiView.cpp ImfMultiView.h \ ImfAcesFile.cpp ImfAcesFile.h \ ImfCheckedArithmetic.h \ ImfMultiPartOutputFile.cpp ImfMultiPartOutputFile.h \ ImfGenericOutputFile.cpp ImfGenericOutputFile.h \ ImfOutputStreamMutex.h ImfInputStreamMutex.h\ ImfOutputPartData.h ImfOutputPartData.cpp \ ImfMultiPartInputFile.cpp ImfMultiPartInputFile.h \ ImfGenericInputFile.cpp ImfGenericInputFile.h \ ImfPartType.cpp ImfPartType.h \ ImfInputPartData.cpp ImfInputPartData.h \ ImfOutputPart.cpp ImfOutputPart.h \ ImfTiledOutputPart.cpp ImfTiledOutputPart.h \ ImfInputPart.cpp ImfInputPart.h \ ImfTiledInputPart.cpp ImfTiledInputPart.h \ ImfDeepScanLineInputPart.h ImfDeepScanLineInputPart.cpp \ ImfDeepScanLineOutputPart.cpp ImfDeepScanLineOutputPart.h \ ImfDeepScanLineInputFile.cpp ImfDeepScanLineInputFile.h \ ImfDeepScanLineOutputFile.cpp ImfDeepScanLineOutputFile.h \ ImfDeepTiledInputPart.h ImfDeepTiledInputPart.cpp \ ImfDeepTiledOutputPart.h ImfDeepTiledOutputPart.cpp \ ImfDeepTiledInputFile.h ImfDeepTiledInputFile.cpp \ ImfDeepTiledOutputFile.h ImfDeepTiledOutputFile.cpp \ ImfDeepFrameBuffer.cpp ImfDeepFrameBuffer.h \ ImfDeepCompositing.h ImfDeepCompositing.cpp \ ImfCompositeDeepScanLine.h ImfCompositeDeepScanLine.cpp \ ImfDeepImageStateAttribute.h ImfDeepImageStateAttribute.cpp \ ImfFastHuf.h ImfFastHuf.cpp \ ImfFloatVectorAttribute.h ImfFloatVectorAttribute.cpp \ ImfRle.h ImfRle.cpp ImfSimd.h \ ImfSystemSpecific.cpp ImfZip.h ImfZip.cpp libIlmImf_la_LDFLAGS = @ILMBASE_LDFLAGS@ -version-info @LIBTOOL_VERSION@ \ -no-undefined if LIB_SUFFIX_EXISTS libIlmImf_la_LDFLAGS += -release @LIB_SUFFIX@ endif libIlmImf_la_LIBADD = $(ZLIB_LIBS) $(ILMBASE_LIBS) libIlmImfincludedir = $(includedir)/OpenEXR libIlmImfinclude_HEADERS = ImfForward.h ImfAttribute.h ImfBoxAttribute.h \ ImfCRgbaFile.h ImfChannelList.h \ ImfChannelListAttribute.h \ ImfCompressionAttribute.h \ ImfDoubleAttribute.h ImfFloatAttribute.h ImfFloatVectorAttribute.h \ ImfFrameBuffer.h ImfHeader.h ImfIO.h \ ImfInputFile.h ImfIntAttribute.h \ ImfLineOrderAttribute.h ImfMatrixAttribute.h \ ImfOpaqueAttribute.h ImfOutputFile.h \ ImfRgbaFile.h ImfStringAttribute.h \ ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ ImfArray.h ImfCompression.h ImfLineOrder.h \ ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ ImfConvert.h ImfPreviewImage.h \ ImfPreviewImageAttribute.h ImfChromaticities.h \ ImfChromaticitiesAttribute.h \ ImfKeyCode.h ImfKeyCodeAttribute.h \ ImfTimeCode.h ImfTimeCodeAttribute.h \ ImfRational.h ImfRationalAttribute.h \ ImfFramesPerSecond.h \ ImfStandardAttributes.h \ ImfStdIO.h \ ImfEnvmap.h \ ImfEnvmapAttribute.h \ ImfInt64.h ImfRgba.h \ ImfTileDescription.h \ ImfTileDescriptionAttribute.h \ ImfTiledInputFile.h \ ImfTiledOutputFile.h ImfTiledRgbaFile.h \ ImfRgbaYca.h \ ImfTestFile.h ImfThreading.h \ ImfB44Compressor.h ImfStringVectorAttribute.h \ ImfMultiView.h \ ImfAcesFile.h \ ImfMultiPartOutputFile.h \ ImfGenericOutputFile.h \ ImfMultiPartInputFile.h \ ImfGenericInputFile.h \ ImfPartType.h \ ImfOutputPart.h \ ImfTiledOutputPart.h \ ImfInputPart.h \ ImfTiledInputPart.h \ ImfDeepScanLineOutputFile.h \ ImfDeepScanLineOutputPart.h \ ImfDeepScanLineInputFile.h \ ImfDeepScanLineInputPart.h \ ImfDeepTiledInputFile.h \ ImfDeepTiledInputPart.h \ ImfDeepTiledOutputFile.h \ ImfDeepTiledOutputPart.h \ ImfDeepFrameBuffer.h \ ImfDeepCompositing.h ImfCompositeDeepScanLine.h \ ImfNamespace.h ImfForward.h ImfExport.h \ ImfPartHelper.h \ ImfDeepImageState.h \ ImfDeepImageStateAttribute.h noinst_HEADERS = ImfCompressor.h \ ImfRleCompressor.h \ ImfZipCompressor.h \ ImfPizCompressor.h \ ImfDwaCompressor.h \ ImfDwaCompressorSimd.h \ ImfAutoArray.h \ ImfTiledMisc.h \ ImfTileOffsets.h \ ImfScanLineInputFile.h \ ImfPxr24Compressor.h \ ImfCheckedArithmetic.h \ ImfInputStreamMutex.h \ ImfOutputStreamMutex.h \ ImfInputPartData.h \ ImfOutputPartData.h \ ImfSystemSpecific.h \ ImfOptimizedPixelReading.h \ b44ExpLogTable.h \ dwaLookups.h EXTRA_DIST = $(noinst_HEADERS) CMakeLists.txt AM_CPPFLAGS = @ILMBASE_CXXFLAGS@ \ -I$(top_builddir) \ -I$(top_srcdir)/config \ $(ILMBASE_CFLAGS) $(ZLIB_CFLAGS) openexr-2.5.7/OpenEXR/IlmImf/b44ExpLogTable.cpp000066400000000000000000000067431406177042200210430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // // b44ExpLogTable // // A program to generate lookup tables for // // y = exp (x / 8) // // and // x = 8 * log (x); // // where x and y are 16-bit floating-point numbers // // The tables are used by class B44Compressor. // //--------------------------------------------------------------------------- #include #include #include #include using namespace std; //--------------------------------------------- // Main - prints the half-to-float lookup table //--------------------------------------------- int main () { #ifndef HAVE_IOS_BASE cout.setf (ios::hex, ios::basefield); #else cout.setf (ios_base::hex, ios_base::basefield); #endif cout << "//\n" "// This is an automatically generated file.\n" "// Do not edit.\n" "//\n\n"; const int iMax = (1 << 16); cout << "const unsigned short expTable[] =\n" "{\n" " "; for (int i = 0; i < iMax; i++) { half h; h.setBits (i); if (!h.isFinite()) h = 0; else if (h >= 8 * log (HALF_MAX)) h = HALF_MAX; else h = exp (h / 8); cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; if (i % 8 == 7) { cout << "\n"; if (i < iMax - 1) cout << " "; } } cout << "};\n\n"; cout << "const unsigned short logTable[] =\n" "{\n" " "; for (int i = 0; i < iMax; i++) { half h; h.setBits (i); if (!h.isFinite() || h < 0) h = 0; else h = 8 * log (h); cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; if (i % 8 == 7) { cout << "\n"; if (i < iMax - 1) cout << " "; } } cout << "};\n"; return 0; } openexr-2.5.7/OpenEXR/IlmImf/b44ExpLogTable.h000066400000000000000000042402221406177042200205040ustar00rootroot00000000000000// // This is an automatically generated file. // Do not edit. // const unsigned short expTable[] = { 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c97, 0x3c97, 0x3c97, 0x3c97, 0x3c97, 0x3c97, 0x3c97, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cad, 0x3cad, 0x3cad, 0x3cad, 0x3cad, 0x3cad, 0x3cad, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cba, 0x3cba, 0x3cba, 0x3cba, 0x3cba, 0x3cba, 0x3cba, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, 0x3cce, 0x3cce, 0x3cce, 0x3cce, 0x3cce, 0x3cce, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cde, 0x3cde, 0x3cde, 0x3cde, 0x3cde, 0x3cde, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce9, 0x3ce9, 0x3ce9, 0x3ce9, 0x3ce9, 0x3ce9, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cef, 0x3cef, 0x3cef, 0x3cef, 0x3cef, 0x3cef, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cff, 0x3cff, 0x3cff, 0x3cff, 0x3cff, 0x3cff, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d02, 0x3d02, 0x3d02, 0x3d02, 0x3d02, 0x3d02, 0x3d03, 0x3d03, 0x3d03, 0x3d03, 0x3d03, 0x3d03, 0x3d03, 0x3d04, 0x3d04, 0x3d04, 0x3d04, 0x3d04, 0x3d04, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d08, 0x3d08, 0x3d08, 0x3d08, 0x3d08, 0x3d08, 0x3d08, 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d12, 0x3d12, 0x3d12, 0x3d12, 0x3d12, 0x3d12, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d16, 0x3d16, 0x3d16, 0x3d16, 0x3d16, 0x3d16, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d20, 0x3d20, 0x3d20, 0x3d20, 0x3d20, 0x3d20, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d23, 0x3d23, 0x3d23, 0x3d23, 0x3d23, 0x3d24, 0x3d24, 0x3d24, 0x3d25, 0x3d25, 0x3d25, 0x3d26, 0x3d26, 0x3d26, 0x3d27, 0x3d27, 0x3d27, 0x3d28, 0x3d28, 0x3d28, 0x3d29, 0x3d29, 0x3d29, 0x3d2a, 0x3d2a, 0x3d2a, 0x3d2b, 0x3d2b, 0x3d2b, 0x3d2c, 0x3d2c, 0x3d2c, 0x3d2d, 0x3d2d, 0x3d2d, 0x3d2d, 0x3d2e, 0x3d2e, 0x3d2e, 0x3d2f, 0x3d2f, 0x3d2f, 0x3d30, 0x3d30, 0x3d30, 0x3d31, 0x3d31, 0x3d31, 0x3d32, 0x3d32, 0x3d32, 0x3d33, 0x3d33, 0x3d33, 0x3d34, 0x3d34, 0x3d34, 0x3d35, 0x3d35, 0x3d35, 0x3d36, 0x3d36, 0x3d36, 0x3d37, 0x3d37, 0x3d37, 0x3d38, 0x3d38, 0x3d38, 0x3d39, 0x3d39, 0x3d39, 0x3d3a, 0x3d3a, 0x3d3a, 0x3d3a, 0x3d3b, 0x3d3b, 0x3d3b, 0x3d3c, 0x3d3c, 0x3d3c, 0x3d3d, 0x3d3d, 0x3d3d, 0x3d3e, 0x3d3e, 0x3d3e, 0x3d3f, 0x3d3f, 0x3d3f, 0x3d40, 0x3d40, 0x3d40, 0x3d41, 0x3d41, 0x3d41, 0x3d42, 0x3d42, 0x3d42, 0x3d43, 0x3d43, 0x3d43, 0x3d44, 0x3d44, 0x3d44, 0x3d45, 0x3d45, 0x3d45, 0x3d46, 0x3d46, 0x3d46, 0x3d47, 0x3d47, 0x3d47, 0x3d48, 0x3d48, 0x3d48, 0x3d49, 0x3d49, 0x3d49, 0x3d4a, 0x3d4a, 0x3d4a, 0x3d4b, 0x3d4b, 0x3d4b, 0x3d4c, 0x3d4c, 0x3d4c, 0x3d4d, 0x3d4d, 0x3d4d, 0x3d4e, 0x3d4e, 0x3d4e, 0x3d4f, 0x3d4f, 0x3d4f, 0x3d50, 0x3d50, 0x3d50, 0x3d51, 0x3d51, 0x3d51, 0x3d52, 0x3d52, 0x3d52, 0x3d53, 0x3d53, 0x3d53, 0x3d54, 0x3d54, 0x3d54, 0x3d55, 0x3d55, 0x3d55, 0x3d56, 0x3d56, 0x3d56, 0x3d57, 0x3d57, 0x3d57, 0x3d58, 0x3d58, 0x3d58, 0x3d59, 0x3d59, 0x3d59, 0x3d5a, 0x3d5a, 0x3d5a, 0x3d5b, 0x3d5b, 0x3d5b, 0x3d5c, 0x3d5c, 0x3d5c, 0x3d5d, 0x3d5d, 0x3d5d, 0x3d5e, 0x3d5e, 0x3d5e, 0x3d5f, 0x3d5f, 0x3d5f, 0x3d60, 0x3d60, 0x3d60, 0x3d61, 0x3d61, 0x3d61, 0x3d62, 0x3d62, 0x3d62, 0x3d63, 0x3d63, 0x3d63, 0x3d64, 0x3d64, 0x3d64, 0x3d65, 0x3d65, 0x3d65, 0x3d66, 0x3d66, 0x3d66, 0x3d67, 0x3d67, 0x3d67, 0x3d68, 0x3d68, 0x3d68, 0x3d69, 0x3d69, 0x3d69, 0x3d6a, 0x3d6a, 0x3d6a, 0x3d6b, 0x3d6b, 0x3d6b, 0x3d6c, 0x3d6c, 0x3d6c, 0x3d6d, 0x3d6d, 0x3d6d, 0x3d6e, 0x3d6e, 0x3d6e, 0x3d6f, 0x3d6f, 0x3d6f, 0x3d70, 0x3d70, 0x3d70, 0x3d71, 0x3d71, 0x3d72, 0x3d72, 0x3d72, 0x3d73, 0x3d73, 0x3d73, 0x3d74, 0x3d74, 0x3d74, 0x3d75, 0x3d75, 0x3d75, 0x3d76, 0x3d76, 0x3d76, 0x3d77, 0x3d77, 0x3d77, 0x3d78, 0x3d78, 0x3d78, 0x3d79, 0x3d79, 0x3d79, 0x3d7a, 0x3d7a, 0x3d7a, 0x3d7b, 0x3d7b, 0x3d7b, 0x3d7c, 0x3d7c, 0x3d7c, 0x3d7d, 0x3d7d, 0x3d7d, 0x3d7e, 0x3d7e, 0x3d7e, 0x3d7f, 0x3d7f, 0x3d80, 0x3d80, 0x3d80, 0x3d81, 0x3d81, 0x3d81, 0x3d82, 0x3d82, 0x3d82, 0x3d83, 0x3d83, 0x3d83, 0x3d84, 0x3d84, 0x3d84, 0x3d85, 0x3d85, 0x3d85, 0x3d86, 0x3d86, 0x3d86, 0x3d87, 0x3d87, 0x3d87, 0x3d88, 0x3d88, 0x3d88, 0x3d89, 0x3d89, 0x3d8a, 0x3d8a, 0x3d8a, 0x3d8b, 0x3d8b, 0x3d8b, 0x3d8c, 0x3d8c, 0x3d8c, 0x3d8d, 0x3d8d, 0x3d8d, 0x3d8e, 0x3d8e, 0x3d8e, 0x3d8f, 0x3d8f, 0x3d8f, 0x3d90, 0x3d90, 0x3d90, 0x3d91, 0x3d91, 0x3d92, 0x3d92, 0x3d92, 0x3d93, 0x3d93, 0x3d93, 0x3d94, 0x3d94, 0x3d94, 0x3d95, 0x3d95, 0x3d95, 0x3d96, 0x3d96, 0x3d96, 0x3d97, 0x3d97, 0x3d97, 0x3d98, 0x3d98, 0x3d98, 0x3d99, 0x3d99, 0x3d9a, 0x3d9a, 0x3d9a, 0x3d9b, 0x3d9b, 0x3d9b, 0x3d9c, 0x3d9c, 0x3d9c, 0x3d9d, 0x3d9d, 0x3d9d, 0x3d9e, 0x3d9e, 0x3d9e, 0x3d9f, 0x3d9f, 0x3d9f, 0x3da0, 0x3da0, 0x3da1, 0x3da1, 0x3da1, 0x3da2, 0x3da2, 0x3da2, 0x3da3, 0x3da3, 0x3da3, 0x3da4, 0x3da4, 0x3da4, 0x3da5, 0x3da5, 0x3da5, 0x3da6, 0x3da6, 0x3da7, 0x3da7, 0x3da7, 0x3da8, 0x3da8, 0x3da8, 0x3da9, 0x3da9, 0x3da9, 0x3daa, 0x3daa, 0x3daa, 0x3dab, 0x3dab, 0x3dab, 0x3dac, 0x3dac, 0x3dad, 0x3dad, 0x3dad, 0x3dae, 0x3dae, 0x3dae, 0x3daf, 0x3daf, 0x3daf, 0x3db0, 0x3db0, 0x3db0, 0x3db1, 0x3db1, 0x3db2, 0x3db2, 0x3db2, 0x3db3, 0x3db3, 0x3db3, 0x3db4, 0x3db4, 0x3db4, 0x3db5, 0x3db5, 0x3db5, 0x3db6, 0x3db6, 0x3db7, 0x3db7, 0x3db7, 0x3db8, 0x3db8, 0x3db8, 0x3db9, 0x3db9, 0x3db9, 0x3dba, 0x3dba, 0x3dba, 0x3dbb, 0x3dbb, 0x3dbc, 0x3dbc, 0x3dbc, 0x3dbd, 0x3dbd, 0x3dbd, 0x3dbe, 0x3dbe, 0x3dbe, 0x3dbf, 0x3dbf, 0x3dbf, 0x3dc0, 0x3dc0, 0x3dc1, 0x3dc1, 0x3dc1, 0x3dc2, 0x3dc2, 0x3dc2, 0x3dc3, 0x3dc3, 0x3dc3, 0x3dc4, 0x3dc4, 0x3dc5, 0x3dc5, 0x3dc5, 0x3dc6, 0x3dc6, 0x3dc6, 0x3dc7, 0x3dc7, 0x3dc7, 0x3dc8, 0x3dc8, 0x3dc8, 0x3dc9, 0x3dc9, 0x3dca, 0x3dca, 0x3dca, 0x3dcb, 0x3dcb, 0x3dcb, 0x3dcc, 0x3dcc, 0x3dcc, 0x3dcd, 0x3dcd, 0x3dce, 0x3dce, 0x3dce, 0x3dcf, 0x3dcf, 0x3dcf, 0x3dd0, 0x3dd0, 0x3dd0, 0x3dd1, 0x3dd1, 0x3dd2, 0x3dd2, 0x3dd2, 0x3dd3, 0x3dd3, 0x3dd3, 0x3dd4, 0x3dd4, 0x3dd4, 0x3dd5, 0x3dd5, 0x3dd6, 0x3dd6, 0x3dd6, 0x3dd7, 0x3dd7, 0x3dd7, 0x3dd8, 0x3dd8, 0x3dd8, 0x3dd9, 0x3dd9, 0x3dda, 0x3dda, 0x3dda, 0x3ddb, 0x3ddb, 0x3ddb, 0x3ddc, 0x3ddc, 0x3ddc, 0x3ddd, 0x3ddd, 0x3dde, 0x3dde, 0x3dde, 0x3ddf, 0x3ddf, 0x3ddf, 0x3de0, 0x3de0, 0x3de1, 0x3de1, 0x3de1, 0x3de2, 0x3de2, 0x3de2, 0x3de3, 0x3de3, 0x3de3, 0x3de4, 0x3de4, 0x3de5, 0x3de5, 0x3de5, 0x3de6, 0x3de6, 0x3de6, 0x3de7, 0x3de7, 0x3de8, 0x3de8, 0x3de8, 0x3de9, 0x3de9, 0x3de9, 0x3dea, 0x3dea, 0x3dea, 0x3deb, 0x3deb, 0x3dec, 0x3dec, 0x3dec, 0x3ded, 0x3ded, 0x3ded, 0x3dee, 0x3dee, 0x3def, 0x3def, 0x3def, 0x3df0, 0x3df0, 0x3df0, 0x3df1, 0x3df1, 0x3df2, 0x3df2, 0x3df2, 0x3df3, 0x3df3, 0x3df3, 0x3df4, 0x3df4, 0x3df4, 0x3df5, 0x3df5, 0x3df6, 0x3df6, 0x3df6, 0x3df7, 0x3df7, 0x3df7, 0x3df8, 0x3df8, 0x3df9, 0x3df9, 0x3df9, 0x3dfa, 0x3dfa, 0x3dfa, 0x3dfb, 0x3dfb, 0x3dfc, 0x3dfc, 0x3dfc, 0x3dfd, 0x3dfd, 0x3dfd, 0x3dfe, 0x3dfe, 0x3dff, 0x3dff, 0x3dff, 0x3e00, 0x3e00, 0x3e00, 0x3e01, 0x3e01, 0x3e02, 0x3e02, 0x3e02, 0x3e03, 0x3e03, 0x3e03, 0x3e04, 0x3e04, 0x3e05, 0x3e05, 0x3e05, 0x3e06, 0x3e06, 0x3e06, 0x3e07, 0x3e07, 0x3e08, 0x3e08, 0x3e08, 0x3e09, 0x3e09, 0x3e09, 0x3e0a, 0x3e0a, 0x3e0b, 0x3e0b, 0x3e0b, 0x3e0c, 0x3e0c, 0x3e0d, 0x3e0d, 0x3e0d, 0x3e0e, 0x3e0e, 0x3e0e, 0x3e0f, 0x3e0f, 0x3e10, 0x3e10, 0x3e10, 0x3e11, 0x3e11, 0x3e11, 0x3e12, 0x3e12, 0x3e13, 0x3e13, 0x3e13, 0x3e14, 0x3e14, 0x3e14, 0x3e15, 0x3e15, 0x3e16, 0x3e16, 0x3e16, 0x3e17, 0x3e17, 0x3e18, 0x3e18, 0x3e18, 0x3e19, 0x3e19, 0x3e19, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x3e1b, 0x3e1c, 0x3e1c, 0x3e1c, 0x3e1d, 0x3e1d, 0x3e1e, 0x3e1e, 0x3e1e, 0x3e1f, 0x3e1f, 0x3e20, 0x3e20, 0x3e20, 0x3e21, 0x3e21, 0x3e21, 0x3e22, 0x3e22, 0x3e23, 0x3e23, 0x3e23, 0x3e24, 0x3e24, 0x3e25, 0x3e25, 0x3e25, 0x3e26, 0x3e26, 0x3e26, 0x3e27, 0x3e27, 0x3e28, 0x3e28, 0x3e28, 0x3e29, 0x3e29, 0x3e2a, 0x3e2a, 0x3e2a, 0x3e2b, 0x3e2b, 0x3e2b, 0x3e2c, 0x3e2c, 0x3e2d, 0x3e2d, 0x3e2d, 0x3e2e, 0x3e2e, 0x3e2f, 0x3e2f, 0x3e2f, 0x3e30, 0x3e30, 0x3e30, 0x3e31, 0x3e31, 0x3e32, 0x3e32, 0x3e32, 0x3e33, 0x3e33, 0x3e34, 0x3e34, 0x3e34, 0x3e35, 0x3e35, 0x3e35, 0x3e36, 0x3e36, 0x3e37, 0x3e37, 0x3e37, 0x3e38, 0x3e38, 0x3e39, 0x3e39, 0x3e39, 0x3e3a, 0x3e3a, 0x3e3b, 0x3e3b, 0x3e3b, 0x3e3c, 0x3e3c, 0x3e3c, 0x3e3d, 0x3e3d, 0x3e3e, 0x3e3e, 0x3e3e, 0x3e3f, 0x3e3f, 0x3e40, 0x3e40, 0x3e40, 0x3e41, 0x3e41, 0x3e42, 0x3e42, 0x3e42, 0x3e43, 0x3e43, 0x3e44, 0x3e44, 0x3e44, 0x3e45, 0x3e45, 0x3e45, 0x3e46, 0x3e46, 0x3e47, 0x3e47, 0x3e47, 0x3e48, 0x3e48, 0x3e49, 0x3e49, 0x3e49, 0x3e4a, 0x3e4a, 0x3e4b, 0x3e4b, 0x3e4b, 0x3e4c, 0x3e4c, 0x3e4d, 0x3e4d, 0x3e4d, 0x3e4e, 0x3e4e, 0x3e4f, 0x3e4f, 0x3e4f, 0x3e50, 0x3e50, 0x3e50, 0x3e51, 0x3e51, 0x3e52, 0x3e52, 0x3e52, 0x3e53, 0x3e53, 0x3e54, 0x3e54, 0x3e54, 0x3e55, 0x3e55, 0x3e56, 0x3e56, 0x3e56, 0x3e57, 0x3e57, 0x3e58, 0x3e58, 0x3e58, 0x3e59, 0x3e59, 0x3e5a, 0x3e5a, 0x3e5a, 0x3e5b, 0x3e5b, 0x3e5c, 0x3e5c, 0x3e5c, 0x3e5d, 0x3e5d, 0x3e5e, 0x3e5e, 0x3e5e, 0x3e5f, 0x3e5f, 0x3e60, 0x3e60, 0x3e60, 0x3e61, 0x3e61, 0x3e62, 0x3e62, 0x3e62, 0x3e63, 0x3e63, 0x3e64, 0x3e64, 0x3e64, 0x3e65, 0x3e65, 0x3e66, 0x3e66, 0x3e66, 0x3e67, 0x3e67, 0x3e68, 0x3e68, 0x3e68, 0x3e69, 0x3e69, 0x3e6a, 0x3e6a, 0x3e6a, 0x3e6b, 0x3e6b, 0x3e6c, 0x3e6c, 0x3e6c, 0x3e6d, 0x3e6d, 0x3e6e, 0x3e6e, 0x3e6e, 0x3e6f, 0x3e6f, 0x3e70, 0x3e70, 0x3e70, 0x3e71, 0x3e71, 0x3e72, 0x3e72, 0x3e72, 0x3e73, 0x3e73, 0x3e74, 0x3e74, 0x3e74, 0x3e75, 0x3e75, 0x3e76, 0x3e76, 0x3e76, 0x3e77, 0x3e77, 0x3e78, 0x3e78, 0x3e78, 0x3e79, 0x3e79, 0x3e7a, 0x3e7a, 0x3e7a, 0x3e7b, 0x3e7b, 0x3e7c, 0x3e7c, 0x3e7c, 0x3e7d, 0x3e7d, 0x3e7e, 0x3e7e, 0x3e7f, 0x3e7f, 0x3e7f, 0x3e80, 0x3e80, 0x3e81, 0x3e81, 0x3e81, 0x3e82, 0x3e82, 0x3e83, 0x3e83, 0x3e83, 0x3e84, 0x3e84, 0x3e85, 0x3e85, 0x3e85, 0x3e86, 0x3e86, 0x3e87, 0x3e87, 0x3e87, 0x3e88, 0x3e88, 0x3e89, 0x3e89, 0x3e8a, 0x3e8a, 0x3e8a, 0x3e8b, 0x3e8b, 0x3e8c, 0x3e8c, 0x3e8c, 0x3e8d, 0x3e8d, 0x3e8e, 0x3e8e, 0x3e8e, 0x3e8f, 0x3e8f, 0x3e90, 0x3e90, 0x3e90, 0x3e91, 0x3e91, 0x3e92, 0x3e92, 0x3e93, 0x3e93, 0x3e93, 0x3e94, 0x3e94, 0x3e95, 0x3e95, 0x3e95, 0x3e96, 0x3e96, 0x3e97, 0x3e97, 0x3e97, 0x3e98, 0x3e98, 0x3e99, 0x3e9a, 0x3e9b, 0x3e9c, 0x3e9c, 0x3e9d, 0x3e9e, 0x3e9f, 0x3ea0, 0x3ea1, 0x3ea1, 0x3ea2, 0x3ea3, 0x3ea4, 0x3ea5, 0x3ea6, 0x3ea6, 0x3ea7, 0x3ea8, 0x3ea9, 0x3eaa, 0x3eab, 0x3eab, 0x3eac, 0x3ead, 0x3eae, 0x3eaf, 0x3eb0, 0x3eb0, 0x3eb1, 0x3eb2, 0x3eb3, 0x3eb4, 0x3eb5, 0x3eb5, 0x3eb6, 0x3eb7, 0x3eb8, 0x3eb9, 0x3eba, 0x3eba, 0x3ebb, 0x3ebc, 0x3ebd, 0x3ebe, 0x3ebf, 0x3ebf, 0x3ec0, 0x3ec1, 0x3ec2, 0x3ec3, 0x3ec4, 0x3ec5, 0x3ec5, 0x3ec6, 0x3ec7, 0x3ec8, 0x3ec9, 0x3eca, 0x3eca, 0x3ecb, 0x3ecc, 0x3ecd, 0x3ece, 0x3ecf, 0x3ed0, 0x3ed0, 0x3ed1, 0x3ed2, 0x3ed3, 0x3ed4, 0x3ed5, 0x3ed6, 0x3ed6, 0x3ed7, 0x3ed8, 0x3ed9, 0x3eda, 0x3edb, 0x3edc, 0x3edc, 0x3edd, 0x3ede, 0x3edf, 0x3ee0, 0x3ee1, 0x3ee2, 0x3ee2, 0x3ee3, 0x3ee4, 0x3ee5, 0x3ee6, 0x3ee7, 0x3ee8, 0x3ee8, 0x3ee9, 0x3eea, 0x3eeb, 0x3eec, 0x3eed, 0x3eee, 0x3eef, 0x3eef, 0x3ef0, 0x3ef1, 0x3ef2, 0x3ef3, 0x3ef4, 0x3ef5, 0x3ef5, 0x3ef6, 0x3ef7, 0x3ef8, 0x3ef9, 0x3efa, 0x3efb, 0x3efc, 0x3efc, 0x3efd, 0x3efe, 0x3eff, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f03, 0x3f04, 0x3f05, 0x3f06, 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e, 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16, 0x3f17, 0x3f18, 0x3f19, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, 0x3f1f, 0x3f20, 0x3f21, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3c, 0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, 0x3f80, 0x3f81, 0x3f82, 0x3f82, 0x3f83, 0x3f84, 0x3f85, 0x3f86, 0x3f87, 0x3f88, 0x3f89, 0x3f8a, 0x3f8b, 0x3f8c, 0x3f8d, 0x3f8e, 0x3f8f, 0x3f90, 0x3f91, 0x3f92, 0x3f92, 0x3f93, 0x3f94, 0x3f95, 0x3f96, 0x3f97, 0x3f98, 0x3f99, 0x3f9a, 0x3f9b, 0x3f9c, 0x3f9d, 0x3f9e, 0x3f9f, 0x3fa0, 0x3fa1, 0x3fa2, 0x3fa3, 0x3fa4, 0x3fa5, 0x3fa5, 0x3fa6, 0x3fa7, 0x3fa8, 0x3fa9, 0x3faa, 0x3fab, 0x3fac, 0x3fad, 0x3fae, 0x3faf, 0x3fb0, 0x3fb1, 0x3fb2, 0x3fb3, 0x3fb4, 0x3fb5, 0x3fb6, 0x3fb7, 0x3fb8, 0x3fb9, 0x3fba, 0x3fbb, 0x3fbc, 0x3fbd, 0x3fbe, 0x3fbf, 0x3fbf, 0x3fc0, 0x3fc1, 0x3fc2, 0x3fc3, 0x3fc4, 0x3fc5, 0x3fc6, 0x3fc7, 0x3fc8, 0x3fc9, 0x3fca, 0x3fcb, 0x3fcc, 0x3fcd, 0x3fce, 0x3fcf, 0x3fd0, 0x3fd1, 0x3fd2, 0x3fd3, 0x3fd4, 0x3fd5, 0x3fd6, 0x3fd7, 0x3fd8, 0x3fd9, 0x3fda, 0x3fdb, 0x3fdc, 0x3fdd, 0x3fde, 0x3fdf, 0x3fe0, 0x3fe1, 0x3fe2, 0x3fe3, 0x3fe4, 0x3fe5, 0x3fe6, 0x3fe7, 0x3fe8, 0x3fe9, 0x3fea, 0x3feb, 0x3fec, 0x3fed, 0x3fee, 0x3fef, 0x3ff0, 0x3ff0, 0x3ff1, 0x3ff2, 0x3ff3, 0x3ff4, 0x3ff5, 0x3ff6, 0x3ff7, 0x3ff8, 0x3ff9, 0x3ffa, 0x3ffb, 0x3ffc, 0x3ffd, 0x3ffe, 0x3fff, 0x4000, 0x4001, 0x4001, 0x4002, 0x4002, 0x4003, 0x4003, 0x4004, 0x4004, 0x4005, 0x4005, 0x4006, 0x4006, 0x4007, 0x4007, 0x4008, 0x4008, 0x4009, 0x4009, 0x400a, 0x400a, 0x400b, 0x400b, 0x400c, 0x400c, 0x400d, 0x400d, 0x400e, 0x400e, 0x400f, 0x400f, 0x4010, 0x4010, 0x4011, 0x4011, 0x4012, 0x4012, 0x4013, 0x4013, 0x4014, 0x4014, 0x4015, 0x4015, 0x4016, 0x4016, 0x4017, 0x4017, 0x4018, 0x4019, 0x4019, 0x401a, 0x401a, 0x401b, 0x401b, 0x401c, 0x401c, 0x401d, 0x401d, 0x401e, 0x401e, 0x401f, 0x401f, 0x4020, 0x4020, 0x4021, 0x4021, 0x4022, 0x4022, 0x4023, 0x4023, 0x4024, 0x4024, 0x4025, 0x4025, 0x4026, 0x4026, 0x4027, 0x4027, 0x4028, 0x4028, 0x4029, 0x402a, 0x402a, 0x402b, 0x402b, 0x402c, 0x402c, 0x402d, 0x402d, 0x402e, 0x402e, 0x402f, 0x402f, 0x4030, 0x4030, 0x4031, 0x4031, 0x4032, 0x4032, 0x4033, 0x4033, 0x4034, 0x4035, 0x4035, 0x4036, 0x4036, 0x4037, 0x4037, 0x4038, 0x4038, 0x4039, 0x4039, 0x403a, 0x403a, 0x403b, 0x403b, 0x403c, 0x403c, 0x403d, 0x403d, 0x403e, 0x403f, 0x403f, 0x4040, 0x4040, 0x4041, 0x4041, 0x4042, 0x4042, 0x4043, 0x4043, 0x4044, 0x4044, 0x4045, 0x4045, 0x4046, 0x4047, 0x4047, 0x4048, 0x4048, 0x4049, 0x4049, 0x404a, 0x404a, 0x404b, 0x404b, 0x404c, 0x404c, 0x404d, 0x404e, 0x404e, 0x404f, 0x404f, 0x4050, 0x4050, 0x4051, 0x4051, 0x4052, 0x4052, 0x4053, 0x4053, 0x4054, 0x4055, 0x4055, 0x4056, 0x4056, 0x4057, 0x4057, 0x4058, 0x4058, 0x4059, 0x4059, 0x405a, 0x405a, 0x405b, 0x405c, 0x405c, 0x405d, 0x405d, 0x405e, 0x405e, 0x405f, 0x405f, 0x4060, 0x4060, 0x4061, 0x4062, 0x4062, 0x4063, 0x4063, 0x4064, 0x4064, 0x4065, 0x4065, 0x4066, 0x4067, 0x4067, 0x4068, 0x4068, 0x4069, 0x4069, 0x406a, 0x406a, 0x406b, 0x406b, 0x406c, 0x406d, 0x406d, 0x406e, 0x406e, 0x406f, 0x406f, 0x4070, 0x4070, 0x4071, 0x4072, 0x4072, 0x4073, 0x4073, 0x4074, 0x4074, 0x4075, 0x4075, 0x4076, 0x4077, 0x4077, 0x4078, 0x4078, 0x4079, 0x4079, 0x407a, 0x407b, 0x407b, 0x407c, 0x407c, 0x407d, 0x407d, 0x407e, 0x407e, 0x407f, 0x4080, 0x4080, 0x4081, 0x4081, 0x4082, 0x4082, 0x4083, 0x4084, 0x4084, 0x4085, 0x4085, 0x4086, 0x4086, 0x4087, 0x4087, 0x4088, 0x4089, 0x4089, 0x408a, 0x408a, 0x408b, 0x408b, 0x408c, 0x408d, 0x408d, 0x408e, 0x408e, 0x408f, 0x408f, 0x4090, 0x4091, 0x4091, 0x4092, 0x4092, 0x4093, 0x4093, 0x4094, 0x4095, 0x4095, 0x4096, 0x4096, 0x4097, 0x4097, 0x4098, 0x4099, 0x4099, 0x409a, 0x409a, 0x409b, 0x409b, 0x409c, 0x409d, 0x409d, 0x409e, 0x409e, 0x409f, 0x409f, 0x40a0, 0x40a1, 0x40a1, 0x40a2, 0x40a2, 0x40a3, 0x40a4, 0x40a4, 0x40a5, 0x40a5, 0x40a6, 0x40a6, 0x40a7, 0x40a8, 0x40a8, 0x40a9, 0x40a9, 0x40aa, 0x40ab, 0x40ab, 0x40ac, 0x40ac, 0x40ad, 0x40ad, 0x40ae, 0x40af, 0x40af, 0x40b0, 0x40b0, 0x40b1, 0x40b2, 0x40b2, 0x40b3, 0x40b3, 0x40b4, 0x40b4, 0x40b5, 0x40b6, 0x40b6, 0x40b7, 0x40b7, 0x40b8, 0x40b9, 0x40b9, 0x40ba, 0x40ba, 0x40bb, 0x40bc, 0x40bc, 0x40bd, 0x40bd, 0x40be, 0x40bf, 0x40bf, 0x40c0, 0x40c0, 0x40c1, 0x40c1, 0x40c2, 0x40c3, 0x40c3, 0x40c4, 0x40c4, 0x40c5, 0x40c6, 0x40c6, 0x40c7, 0x40c7, 0x40c8, 0x40c9, 0x40c9, 0x40ca, 0x40ca, 0x40cb, 0x40cc, 0x40cc, 0x40cd, 0x40cd, 0x40ce, 0x40cf, 0x40cf, 0x40d0, 0x40d0, 0x40d1, 0x40d2, 0x40d2, 0x40d3, 0x40d3, 0x40d4, 0x40d5, 0x40d5, 0x40d6, 0x40d6, 0x40d7, 0x40d8, 0x40d8, 0x40d9, 0x40d9, 0x40da, 0x40db, 0x40db, 0x40dc, 0x40dd, 0x40dd, 0x40de, 0x40de, 0x40df, 0x40e0, 0x40e0, 0x40e1, 0x40e1, 0x40e2, 0x40e3, 0x40e3, 0x40e4, 0x40e4, 0x40e5, 0x40e6, 0x40e6, 0x40e7, 0x40e8, 0x40e8, 0x40e9, 0x40e9, 0x40ea, 0x40eb, 0x40eb, 0x40ec, 0x40ec, 0x40ed, 0x40ee, 0x40ee, 0x40ef, 0x40f0, 0x40f0, 0x40f1, 0x40f1, 0x40f2, 0x40f3, 0x40f3, 0x40f4, 0x40f4, 0x40f5, 0x40f6, 0x40f6, 0x40f7, 0x40f8, 0x40f8, 0x40f9, 0x40f9, 0x40fa, 0x40fb, 0x40fb, 0x40fc, 0x40fd, 0x40fd, 0x40fe, 0x40fe, 0x40ff, 0x4100, 0x4100, 0x4101, 0x4102, 0x4102, 0x4103, 0x4103, 0x4104, 0x4105, 0x4105, 0x4106, 0x4107, 0x4107, 0x4108, 0x4108, 0x4109, 0x410a, 0x410a, 0x410b, 0x410c, 0x410c, 0x410d, 0x410d, 0x410e, 0x410f, 0x410f, 0x4110, 0x4111, 0x4111, 0x4112, 0x4113, 0x4113, 0x4114, 0x4114, 0x4115, 0x4116, 0x4116, 0x4117, 0x4118, 0x4118, 0x4119, 0x411a, 0x411a, 0x411b, 0x411b, 0x411c, 0x411d, 0x411d, 0x411e, 0x411f, 0x411f, 0x4120, 0x4121, 0x4121, 0x4122, 0x4122, 0x4123, 0x4124, 0x4124, 0x4125, 0x4126, 0x4126, 0x4127, 0x4128, 0x4128, 0x4129, 0x412a, 0x412a, 0x412b, 0x412b, 0x412c, 0x412d, 0x412d, 0x412e, 0x412f, 0x412f, 0x4130, 0x4131, 0x4131, 0x4132, 0x4133, 0x4133, 0x4134, 0x4135, 0x4135, 0x4136, 0x4137, 0x4137, 0x4138, 0x4138, 0x4139, 0x413a, 0x413a, 0x413b, 0x413c, 0x413c, 0x413d, 0x413e, 0x413e, 0x413f, 0x4140, 0x4140, 0x4141, 0x4142, 0x4142, 0x4143, 0x4144, 0x4144, 0x4145, 0x4146, 0x4146, 0x4147, 0x4148, 0x4148, 0x4149, 0x414a, 0x414a, 0x414b, 0x414c, 0x414c, 0x414d, 0x414e, 0x414e, 0x414f, 0x4150, 0x4150, 0x4151, 0x4152, 0x4152, 0x4153, 0x4154, 0x4154, 0x4155, 0x4156, 0x4156, 0x4157, 0x4158, 0x4158, 0x4159, 0x415a, 0x415a, 0x415b, 0x415c, 0x415c, 0x415d, 0x415e, 0x415e, 0x415f, 0x4160, 0x4160, 0x4161, 0x4162, 0x4162, 0x4163, 0x4164, 0x4164, 0x4165, 0x4166, 0x4166, 0x4167, 0x4168, 0x4168, 0x4169, 0x416a, 0x416a, 0x416b, 0x416c, 0x416c, 0x416d, 0x416e, 0x416e, 0x416f, 0x4170, 0x4171, 0x4172, 0x4174, 0x4175, 0x4177, 0x4178, 0x4179, 0x417b, 0x417c, 0x417d, 0x417f, 0x4180, 0x4182, 0x4183, 0x4184, 0x4186, 0x4187, 0x4188, 0x418a, 0x418b, 0x418d, 0x418e, 0x418f, 0x4191, 0x4192, 0x4194, 0x4195, 0x4196, 0x4198, 0x4199, 0x419b, 0x419c, 0x419d, 0x419f, 0x41a0, 0x41a2, 0x41a3, 0x41a4, 0x41a6, 0x41a7, 0x41a9, 0x41aa, 0x41ab, 0x41ad, 0x41ae, 0x41b0, 0x41b1, 0x41b3, 0x41b4, 0x41b5, 0x41b7, 0x41b8, 0x41ba, 0x41bb, 0x41bd, 0x41be, 0x41bf, 0x41c1, 0x41c2, 0x41c4, 0x41c5, 0x41c7, 0x41c8, 0x41ca, 0x41cb, 0x41cc, 0x41ce, 0x41cf, 0x41d1, 0x41d2, 0x41d4, 0x41d5, 0x41d7, 0x41d8, 0x41da, 0x41db, 0x41dc, 0x41de, 0x41df, 0x41e1, 0x41e2, 0x41e4, 0x41e5, 0x41e7, 0x41e8, 0x41ea, 0x41eb, 0x41ed, 0x41ee, 0x41f0, 0x41f1, 0x41f3, 0x41f4, 0x41f6, 0x41f7, 0x41f9, 0x41fa, 0x41fc, 0x41fd, 0x41ff, 0x4200, 0x4202, 0x4203, 0x4205, 0x4206, 0x4208, 0x4209, 0x420b, 0x420c, 0x420e, 0x420f, 0x4211, 0x4212, 0x4214, 0x4215, 0x4217, 0x4218, 0x421a, 0x421b, 0x421d, 0x421e, 0x4220, 0x4221, 0x4223, 0x4224, 0x4226, 0x4228, 0x4229, 0x422b, 0x422c, 0x422e, 0x422f, 0x4231, 0x4232, 0x4234, 0x4235, 0x4237, 0x4239, 0x423a, 0x423c, 0x423d, 0x423f, 0x4240, 0x4242, 0x4243, 0x4245, 0x4247, 0x4248, 0x424a, 0x424b, 0x424d, 0x424e, 0x4250, 0x4252, 0x4253, 0x4255, 0x4256, 0x4258, 0x425a, 0x425b, 0x425d, 0x425e, 0x4260, 0x4262, 0x4263, 0x4265, 0x4266, 0x4268, 0x4269, 0x426b, 0x426d, 0x426e, 0x4270, 0x4272, 0x4273, 0x4275, 0x4276, 0x4278, 0x427a, 0x427b, 0x427d, 0x427e, 0x4280, 0x4282, 0x4283, 0x4285, 0x4287, 0x4288, 0x428a, 0x428c, 0x428d, 0x428f, 0x4290, 0x4292, 0x4294, 0x4295, 0x4297, 0x4299, 0x429a, 0x429c, 0x429e, 0x429f, 0x42a1, 0x42a3, 0x42a4, 0x42a6, 0x42a8, 0x42a9, 0x42ab, 0x42ad, 0x42ae, 0x42b0, 0x42b2, 0x42b3, 0x42b5, 0x42b7, 0x42b8, 0x42ba, 0x42bc, 0x42bd, 0x42bf, 0x42c1, 0x42c2, 0x42c4, 0x42c6, 0x42c7, 0x42c9, 0x42cb, 0x42cd, 0x42ce, 0x42d0, 0x42d2, 0x42d3, 0x42d5, 0x42d7, 0x42d8, 0x42da, 0x42dc, 0x42de, 0x42df, 0x42e1, 0x42e3, 0x42e5, 0x42e6, 0x42e8, 0x42ea, 0x42eb, 0x42ed, 0x42ef, 0x42f1, 0x42f2, 0x42f4, 0x42f6, 0x42f8, 0x42f9, 0x42fb, 0x42fd, 0x42ff, 0x4300, 0x4302, 0x4304, 0x4306, 0x4307, 0x4309, 0x430b, 0x430d, 0x430e, 0x4310, 0x4312, 0x4314, 0x4315, 0x4317, 0x4319, 0x431b, 0x431d, 0x431e, 0x4320, 0x4322, 0x4324, 0x4325, 0x4327, 0x4329, 0x432b, 0x432d, 0x432e, 0x4330, 0x4332, 0x4334, 0x4336, 0x4337, 0x4339, 0x433b, 0x433d, 0x433f, 0x4340, 0x4342, 0x4344, 0x4346, 0x4348, 0x434a, 0x434b, 0x434d, 0x434f, 0x4351, 0x4353, 0x4354, 0x4356, 0x4358, 0x435a, 0x435c, 0x435e, 0x4360, 0x4361, 0x4363, 0x4365, 0x4367, 0x4369, 0x436b, 0x436c, 0x436e, 0x4370, 0x4372, 0x4374, 0x4376, 0x4378, 0x4379, 0x437b, 0x437d, 0x437f, 0x4381, 0x4383, 0x4385, 0x4387, 0x4388, 0x438a, 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396, 0x4398, 0x439a, 0x439b, 0x439d, 0x439f, 0x43a1, 0x43a3, 0x43a5, 0x43a7, 0x43a9, 0x43ab, 0x43ad, 0x43af, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4, 0x43c6, 0x43c8, 0x43ca, 0x43cc, 0x43ce, 0x43cf, 0x43d1, 0x43d3, 0x43d5, 0x43d7, 0x43d9, 0x43db, 0x43dd, 0x43df, 0x43e1, 0x43e3, 0x43e5, 0x43e7, 0x43e9, 0x43eb, 0x43ed, 0x43ef, 0x43f1, 0x43f3, 0x43f5, 0x43f7, 0x43f9, 0x43fb, 0x43fd, 0x43ff, 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440a, 0x440b, 0x440d, 0x440e, 0x440f, 0x4410, 0x4411, 0x4412, 0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, 0x441c, 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, 0x4450, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, 0x448c, 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, 0x4497, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, 0x449f, 0x44a0, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a6, 0x44a7, 0x44a8, 0x44a9, 0x44aa, 0x44ab, 0x44ad, 0x44ae, 0x44af, 0x44b0, 0x44b1, 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, 0x44b9, 0x44bb, 0x44bc, 0x44bd, 0x44be, 0x44bf, 0x44c1, 0x44c2, 0x44c3, 0x44c4, 0x44c5, 0x44c7, 0x44c8, 0x44c9, 0x44ca, 0x44cb, 0x44cc, 0x44ce, 0x44cf, 0x44d0, 0x44d1, 0x44d2, 0x44d4, 0x44d5, 0x44d6, 0x44d7, 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44df, 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44ea, 0x44eb, 0x44ec, 0x44ed, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f5, 0x44f6, 0x44f7, 0x44f8, 0x44fa, 0x44fb, 0x44fc, 0x44fd, 0x44ff, 0x4500, 0x4501, 0x4502, 0x4504, 0x4505, 0x4506, 0x4507, 0x4509, 0x450a, 0x450b, 0x450c, 0x450e, 0x450f, 0x4510, 0x4512, 0x4513, 0x4514, 0x4515, 0x4517, 0x4518, 0x4519, 0x451a, 0x451c, 0x451d, 0x451e, 0x4520, 0x4521, 0x4522, 0x4523, 0x4525, 0x4526, 0x4527, 0x4529, 0x452a, 0x452b, 0x452c, 0x452e, 0x452f, 0x4530, 0x4532, 0x4533, 0x4534, 0x4536, 0x4537, 0x4538, 0x4539, 0x453b, 0x453c, 0x453d, 0x453f, 0x4540, 0x4541, 0x4543, 0x4544, 0x4545, 0x4547, 0x4548, 0x4549, 0x454b, 0x454c, 0x454d, 0x454e, 0x4550, 0x4551, 0x4552, 0x4554, 0x4555, 0x4556, 0x4558, 0x4559, 0x455a, 0x455c, 0x455d, 0x455e, 0x4560, 0x4561, 0x4563, 0x4564, 0x4565, 0x4567, 0x4568, 0x4569, 0x456b, 0x456c, 0x456d, 0x456f, 0x4570, 0x4571, 0x4573, 0x4574, 0x4576, 0x4577, 0x4578, 0x457a, 0x457b, 0x457c, 0x457e, 0x457f, 0x4580, 0x4582, 0x4583, 0x4585, 0x4586, 0x4587, 0x4589, 0x458a, 0x458c, 0x458d, 0x458e, 0x4590, 0x4591, 0x4592, 0x4594, 0x4595, 0x4597, 0x4598, 0x4599, 0x459b, 0x459c, 0x459e, 0x459f, 0x45a0, 0x45a2, 0x45a3, 0x45a5, 0x45a6, 0x45a8, 0x45a9, 0x45aa, 0x45ac, 0x45ad, 0x45af, 0x45b0, 0x45b1, 0x45b3, 0x45b4, 0x45b6, 0x45b7, 0x45b9, 0x45ba, 0x45bb, 0x45bd, 0x45be, 0x45c0, 0x45c1, 0x45c3, 0x45c4, 0x45c6, 0x45c7, 0x45c8, 0x45ca, 0x45cb, 0x45cd, 0x45ce, 0x45d0, 0x45d1, 0x45d3, 0x45d4, 0x45d5, 0x45d7, 0x45d8, 0x45da, 0x45db, 0x45dd, 0x45de, 0x45e0, 0x45e1, 0x45e3, 0x45e4, 0x45e6, 0x45e7, 0x45e9, 0x45ea, 0x45eb, 0x45ed, 0x45ee, 0x45f0, 0x45f1, 0x45f3, 0x45f4, 0x45f6, 0x45f7, 0x45f9, 0x45fa, 0x45fc, 0x45fd, 0x45ff, 0x4600, 0x4602, 0x4603, 0x4605, 0x4606, 0x4608, 0x4609, 0x460b, 0x460c, 0x460e, 0x460f, 0x4611, 0x4612, 0x4614, 0x4616, 0x4617, 0x4619, 0x461a, 0x461c, 0x461d, 0x461f, 0x4620, 0x4622, 0x4623, 0x4625, 0x4626, 0x4628, 0x4629, 0x462b, 0x462c, 0x462e, 0x4630, 0x4631, 0x4633, 0x4634, 0x4636, 0x4637, 0x4639, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, 0x4642, 0x4644, 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464d, 0x464f, 0x4650, 0x4652, 0x4654, 0x4655, 0x4657, 0x4658, 0x465a, 0x465b, 0x465d, 0x465f, 0x4660, 0x4662, 0x4663, 0x4665, 0x4667, 0x4668, 0x466a, 0x466b, 0x466d, 0x466f, 0x4670, 0x4672, 0x4673, 0x4675, 0x4677, 0x4678, 0x467a, 0x467c, 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, 0x4685, 0x4687, 0x4689, 0x468a, 0x468c, 0x468e, 0x468f, 0x4691, 0x4692, 0x4694, 0x4696, 0x4697, 0x4699, 0x469b, 0x469c, 0x469e, 0x46a0, 0x46a1, 0x46a3, 0x46a5, 0x46a6, 0x46a8, 0x46aa, 0x46ab, 0x46ad, 0x46af, 0x46b0, 0x46b2, 0x46b4, 0x46b5, 0x46b7, 0x46b9, 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, 0x46c3, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, 0x46d0, 0x46d2, 0x46d4, 0x46d5, 0x46d7, 0x46d9, 0x46db, 0x46dc, 0x46de, 0x46e0, 0x46e1, 0x46e3, 0x46e5, 0x46e7, 0x46e8, 0x46ea, 0x46ec, 0x46ee, 0x46ef, 0x46f1, 0x46f3, 0x46f4, 0x46f6, 0x46f8, 0x46fa, 0x46fb, 0x46fd, 0x46ff, 0x4701, 0x4702, 0x4704, 0x4706, 0x4708, 0x4709, 0x470b, 0x470d, 0x470f, 0x4711, 0x4712, 0x4714, 0x4716, 0x4718, 0x4719, 0x471b, 0x471d, 0x471f, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, 0x4729, 0x472b, 0x472d, 0x472f, 0x4731, 0x4732, 0x4734, 0x4736, 0x4738, 0x473a, 0x473b, 0x473d, 0x473f, 0x4741, 0x4743, 0x4744, 0x4746, 0x4748, 0x474a, 0x474c, 0x474e, 0x474f, 0x4751, 0x4753, 0x4755, 0x4757, 0x4759, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, 0x4764, 0x4767, 0x476b, 0x476f, 0x4772, 0x4776, 0x477a, 0x477e, 0x4781, 0x4785, 0x4789, 0x478d, 0x4790, 0x4794, 0x4798, 0x479c, 0x47a0, 0x47a3, 0x47a7, 0x47ab, 0x47af, 0x47b3, 0x47b7, 0x47bb, 0x47be, 0x47c2, 0x47c6, 0x47ca, 0x47ce, 0x47d2, 0x47d6, 0x47da, 0x47de, 0x47e2, 0x47e5, 0x47e9, 0x47ed, 0x47f1, 0x47f5, 0x47f9, 0x47fd, 0x4801, 0x4803, 0x4805, 0x4807, 0x4809, 0x480b, 0x480d, 0x480f, 0x4811, 0x4813, 0x4815, 0x4817, 0x4819, 0x481b, 0x481d, 0x481f, 0x4821, 0x4823, 0x4825, 0x4827, 0x4829, 0x482c, 0x482e, 0x4830, 0x4832, 0x4834, 0x4836, 0x4838, 0x483a, 0x483c, 0x483e, 0x4841, 0x4843, 0x4845, 0x4847, 0x4849, 0x484b, 0x484d, 0x4850, 0x4852, 0x4854, 0x4856, 0x4858, 0x485a, 0x485d, 0x485f, 0x4861, 0x4863, 0x4865, 0x4868, 0x486a, 0x486c, 0x486e, 0x4870, 0x4873, 0x4875, 0x4877, 0x4879, 0x487c, 0x487e, 0x4880, 0x4882, 0x4885, 0x4887, 0x4889, 0x488b, 0x488e, 0x4890, 0x4892, 0x4894, 0x4897, 0x4899, 0x489b, 0x489e, 0x48a0, 0x48a2, 0x48a5, 0x48a7, 0x48a9, 0x48ac, 0x48ae, 0x48b0, 0x48b3, 0x48b5, 0x48b7, 0x48ba, 0x48bc, 0x48be, 0x48c1, 0x48c3, 0x48c6, 0x48c8, 0x48ca, 0x48cd, 0x48cf, 0x48d2, 0x48d4, 0x48d6, 0x48d9, 0x48db, 0x48de, 0x48e0, 0x48e3, 0x48e5, 0x48e7, 0x48ea, 0x48ec, 0x48ef, 0x48f1, 0x48f4, 0x48f6, 0x48f9, 0x48fb, 0x48fe, 0x4900, 0x4903, 0x4905, 0x4908, 0x490a, 0x490d, 0x490f, 0x4912, 0x4914, 0x4917, 0x4919, 0x491c, 0x491f, 0x4921, 0x4924, 0x4926, 0x4929, 0x492b, 0x492e, 0x4931, 0x4933, 0x4936, 0x4938, 0x493b, 0x493e, 0x4940, 0x4943, 0x4946, 0x4948, 0x494b, 0x494d, 0x4950, 0x4953, 0x4955, 0x4958, 0x495b, 0x495d, 0x4960, 0x4963, 0x4966, 0x4968, 0x496b, 0x496e, 0x4970, 0x4973, 0x4976, 0x4979, 0x497b, 0x497e, 0x4981, 0x4984, 0x4986, 0x4989, 0x498c, 0x498f, 0x4991, 0x4994, 0x4997, 0x499a, 0x499d, 0x499f, 0x49a2, 0x49a5, 0x49a8, 0x49ab, 0x49ad, 0x49b0, 0x49b3, 0x49b6, 0x49b9, 0x49bc, 0x49bf, 0x49c1, 0x49c4, 0x49c7, 0x49ca, 0x49cd, 0x49d0, 0x49d3, 0x49d6, 0x49d9, 0x49dc, 0x49df, 0x49e1, 0x49e4, 0x49e7, 0x49ea, 0x49ed, 0x49f0, 0x49f3, 0x49f6, 0x49f9, 0x49fc, 0x49ff, 0x4a02, 0x4a05, 0x4a08, 0x4a0b, 0x4a0e, 0x4a11, 0x4a14, 0x4a17, 0x4a1a, 0x4a1d, 0x4a21, 0x4a24, 0x4a27, 0x4a2a, 0x4a2d, 0x4a30, 0x4a33, 0x4a36, 0x4a39, 0x4a3c, 0x4a3f, 0x4a43, 0x4a46, 0x4a49, 0x4a4c, 0x4a4f, 0x4a52, 0x4a55, 0x4a59, 0x4a5c, 0x4a5f, 0x4a62, 0x4a65, 0x4a69, 0x4a6c, 0x4a6f, 0x4a72, 0x4a75, 0x4a79, 0x4a7c, 0x4a7f, 0x4a82, 0x4a86, 0x4a89, 0x4a8c, 0x4a8f, 0x4a93, 0x4a96, 0x4a99, 0x4a9d, 0x4aa0, 0x4aa3, 0x4aa7, 0x4aaa, 0x4aad, 0x4ab1, 0x4ab4, 0x4ab7, 0x4abb, 0x4abe, 0x4ac1, 0x4ac5, 0x4ac8, 0x4acc, 0x4acf, 0x4ad2, 0x4ad6, 0x4ad9, 0x4add, 0x4ae0, 0x4ae4, 0x4ae7, 0x4aea, 0x4aee, 0x4af1, 0x4af5, 0x4af8, 0x4afc, 0x4aff, 0x4b03, 0x4b06, 0x4b0a, 0x4b0d, 0x4b11, 0x4b14, 0x4b18, 0x4b1c, 0x4b1f, 0x4b23, 0x4b26, 0x4b2a, 0x4b2d, 0x4b31, 0x4b35, 0x4b38, 0x4b3c, 0x4b3f, 0x4b43, 0x4b47, 0x4b4a, 0x4b4e, 0x4b52, 0x4b55, 0x4b59, 0x4b5d, 0x4b60, 0x4b64, 0x4b68, 0x4b6b, 0x4b6f, 0x4b73, 0x4b77, 0x4b7a, 0x4b7e, 0x4b82, 0x4b86, 0x4b89, 0x4b8d, 0x4b91, 0x4b95, 0x4b98, 0x4b9c, 0x4ba0, 0x4ba4, 0x4ba8, 0x4bac, 0x4baf, 0x4bb3, 0x4bb7, 0x4bbb, 0x4bbf, 0x4bc3, 0x4bc7, 0x4bca, 0x4bce, 0x4bd2, 0x4bd6, 0x4bda, 0x4bde, 0x4be2, 0x4be6, 0x4bea, 0x4bee, 0x4bf2, 0x4bf6, 0x4bfa, 0x4bfe, 0x4c01, 0x4c03, 0x4c05, 0x4c07, 0x4c09, 0x4c0b, 0x4c0d, 0x4c0f, 0x4c11, 0x4c13, 0x4c15, 0x4c17, 0x4c19, 0x4c1b, 0x4c1d, 0x4c1f, 0x4c21, 0x4c23, 0x4c26, 0x4c28, 0x4c2a, 0x4c2c, 0x4c2e, 0x4c30, 0x4c32, 0x4c34, 0x4c36, 0x4c38, 0x4c3a, 0x4c3d, 0x4c3f, 0x4c41, 0x4c43, 0x4c45, 0x4c47, 0x4c49, 0x4c4c, 0x4c4e, 0x4c50, 0x4c52, 0x4c54, 0x4c56, 0x4c58, 0x4c5b, 0x4c5d, 0x4c5f, 0x4c61, 0x4c63, 0x4c66, 0x4c68, 0x4c6a, 0x4c6c, 0x4c6e, 0x4c71, 0x4c73, 0x4c75, 0x4c77, 0x4c7a, 0x4c7c, 0x4c7e, 0x4c80, 0x4c83, 0x4c85, 0x4c87, 0x4c89, 0x4c8c, 0x4c8e, 0x4c90, 0x4c92, 0x4c95, 0x4c97, 0x4c99, 0x4c9c, 0x4c9e, 0x4ca0, 0x4ca3, 0x4ca5, 0x4ca7, 0x4caa, 0x4cac, 0x4cae, 0x4cb1, 0x4cb3, 0x4cb5, 0x4cb8, 0x4cba, 0x4cbc, 0x4cbf, 0x4cc1, 0x4cc3, 0x4cc6, 0x4cc8, 0x4ccb, 0x4ccd, 0x4ccf, 0x4cd2, 0x4cd4, 0x4cd7, 0x4cd9, 0x4cdb, 0x4cde, 0x4ce0, 0x4ce3, 0x4ce5, 0x4ce8, 0x4cea, 0x4ced, 0x4cef, 0x4cf2, 0x4cf4, 0x4cf6, 0x4cf9, 0x4cfb, 0x4cfe, 0x4d00, 0x4d03, 0x4d05, 0x4d08, 0x4d0b, 0x4d0d, 0x4d10, 0x4d12, 0x4d15, 0x4d17, 0x4d1a, 0x4d1c, 0x4d1f, 0x4d21, 0x4d24, 0x4d27, 0x4d29, 0x4d2c, 0x4d2e, 0x4d31, 0x4d33, 0x4d36, 0x4d39, 0x4d3b, 0x4d3e, 0x4d41, 0x4d43, 0x4d46, 0x4d48, 0x4d4b, 0x4d4e, 0x4d50, 0x4d53, 0x4d56, 0x4d58, 0x4d5b, 0x4d5e, 0x4d60, 0x4d63, 0x4d66, 0x4d69, 0x4d6b, 0x4d6e, 0x4d71, 0x4d73, 0x4d76, 0x4d79, 0x4d7c, 0x4d7e, 0x4d81, 0x4d84, 0x4d87, 0x4d89, 0x4d8c, 0x4d8f, 0x4d92, 0x4d94, 0x4d97, 0x4d9a, 0x4d9d, 0x4da0, 0x4da2, 0x4da5, 0x4da8, 0x4dab, 0x4dae, 0x4db1, 0x4db3, 0x4db6, 0x4db9, 0x4dbc, 0x4dbf, 0x4dc2, 0x4dc5, 0x4dc8, 0x4dca, 0x4dcd, 0x4dd0, 0x4dd3, 0x4dd6, 0x4dd9, 0x4ddc, 0x4ddf, 0x4de2, 0x4de5, 0x4de8, 0x4deb, 0x4dee, 0x4df1, 0x4df4, 0x4df7, 0x4dfa, 0x4dfd, 0x4e00, 0x4e03, 0x4e06, 0x4e09, 0x4e0c, 0x4e0f, 0x4e12, 0x4e15, 0x4e18, 0x4e1b, 0x4e1e, 0x4e21, 0x4e24, 0x4e27, 0x4e2a, 0x4e2d, 0x4e30, 0x4e33, 0x4e36, 0x4e3a, 0x4e3d, 0x4e40, 0x4e43, 0x4e46, 0x4e49, 0x4e4c, 0x4e4f, 0x4e53, 0x4e56, 0x4e59, 0x4e5c, 0x4e5f, 0x4e63, 0x4e66, 0x4e69, 0x4e6c, 0x4e6f, 0x4e73, 0x4e76, 0x4e79, 0x4e7c, 0x4e80, 0x4e83, 0x4e86, 0x4e89, 0x4e8d, 0x4e90, 0x4e93, 0x4e96, 0x4e9a, 0x4e9d, 0x4ea0, 0x4ea4, 0x4ea7, 0x4eaa, 0x4eae, 0x4eb1, 0x4eb4, 0x4eb8, 0x4ebb, 0x4ebe, 0x4ec2, 0x4ec5, 0x4ec9, 0x4ecc, 0x4ecf, 0x4ed3, 0x4ed6, 0x4eda, 0x4edd, 0x4ee0, 0x4ee4, 0x4ee7, 0x4eeb, 0x4eee, 0x4ef2, 0x4ef5, 0x4ef9, 0x4efc, 0x4f00, 0x4f03, 0x4f07, 0x4f0a, 0x4f0e, 0x4f11, 0x4f15, 0x4f18, 0x4f1c, 0x4f1f, 0x4f23, 0x4f27, 0x4f2a, 0x4f2e, 0x4f31, 0x4f35, 0x4f39, 0x4f3c, 0x4f40, 0x4f43, 0x4f47, 0x4f4b, 0x4f4e, 0x4f52, 0x4f56, 0x4f59, 0x4f5d, 0x4f61, 0x4f64, 0x4f68, 0x4f6c, 0x4f70, 0x4f73, 0x4f77, 0x4f7b, 0x4f7e, 0x4f82, 0x4f86, 0x4f8a, 0x4f8d, 0x4f91, 0x4f95, 0x4f99, 0x4f9d, 0x4fa0, 0x4fa4, 0x4fa8, 0x4fac, 0x4fb0, 0x4fb4, 0x4fb7, 0x4fbb, 0x4fbf, 0x4fc3, 0x4fc7, 0x4fcb, 0x4fcf, 0x4fd3, 0x4fd7, 0x4fdb, 0x4fde, 0x4fe2, 0x4fe6, 0x4fea, 0x4fee, 0x4ff2, 0x4ff6, 0x4ffa, 0x4ffe, 0x5001, 0x5003, 0x5005, 0x5007, 0x5009, 0x500b, 0x500d, 0x500f, 0x5011, 0x5013, 0x5015, 0x5017, 0x5019, 0x501b, 0x501e, 0x5020, 0x5022, 0x5024, 0x5026, 0x5028, 0x502a, 0x502c, 0x502e, 0x5030, 0x5032, 0x5034, 0x5036, 0x5039, 0x503b, 0x503d, 0x503f, 0x5041, 0x5043, 0x5045, 0x5047, 0x504a, 0x504c, 0x504e, 0x5050, 0x5052, 0x5054, 0x5057, 0x5059, 0x505b, 0x505d, 0x505f, 0x5061, 0x5064, 0x5066, 0x5068, 0x506a, 0x506c, 0x506f, 0x5071, 0x5073, 0x5075, 0x5078, 0x507a, 0x507c, 0x507e, 0x5081, 0x5083, 0x5085, 0x5087, 0x508a, 0x508c, 0x508e, 0x5090, 0x5093, 0x5095, 0x5097, 0x509a, 0x509c, 0x509e, 0x50a0, 0x50a3, 0x50a5, 0x50a7, 0x50aa, 0x50ac, 0x50ae, 0x50b1, 0x50b3, 0x50b5, 0x50b8, 0x50ba, 0x50bd, 0x50bf, 0x50c1, 0x50c4, 0x50c6, 0x50c8, 0x50cb, 0x50cd, 0x50d0, 0x50d2, 0x50d4, 0x50d7, 0x50d9, 0x50dc, 0x50de, 0x50e1, 0x50e3, 0x50e6, 0x50e8, 0x50ea, 0x50ed, 0x50ef, 0x50f2, 0x50f4, 0x50f7, 0x50f9, 0x50fc, 0x50fe, 0x5101, 0x5103, 0x5106, 0x5108, 0x510b, 0x510d, 0x5110, 0x5112, 0x5115, 0x5117, 0x511a, 0x511d, 0x511f, 0x5122, 0x5124, 0x5127, 0x5129, 0x512c, 0x512f, 0x5131, 0x5134, 0x5136, 0x5139, 0x513c, 0x513e, 0x5141, 0x5143, 0x5146, 0x5149, 0x514b, 0x514e, 0x5151, 0x5153, 0x5156, 0x5159, 0x515b, 0x515e, 0x5161, 0x5163, 0x5166, 0x5169, 0x516c, 0x516e, 0x5171, 0x5174, 0x5176, 0x5179, 0x517c, 0x517f, 0x5181, 0x5184, 0x5187, 0x518a, 0x518c, 0x518f, 0x5192, 0x5195, 0x5198, 0x519a, 0x519d, 0x51a0, 0x51a3, 0x51a6, 0x51a8, 0x51ab, 0x51ae, 0x51b1, 0x51b4, 0x51b7, 0x51ba, 0x51bc, 0x51bf, 0x51c2, 0x51c5, 0x51c8, 0x51cb, 0x51ce, 0x51d1, 0x51d3, 0x51d6, 0x51d9, 0x51dc, 0x51df, 0x51e2, 0x51e5, 0x51e8, 0x51eb, 0x51ee, 0x51f1, 0x51f4, 0x51f7, 0x51fa, 0x51fd, 0x5200, 0x5203, 0x5206, 0x5209, 0x520c, 0x520f, 0x5212, 0x5215, 0x5218, 0x521b, 0x521e, 0x5221, 0x5224, 0x5227, 0x522a, 0x522d, 0x5231, 0x5234, 0x5237, 0x523a, 0x523d, 0x5240, 0x5243, 0x5246, 0x524a, 0x524d, 0x5250, 0x5253, 0x5256, 0x5259, 0x525d, 0x5260, 0x5263, 0x5266, 0x5269, 0x526c, 0x5270, 0x5273, 0x5276, 0x5279, 0x527d, 0x5280, 0x5283, 0x5286, 0x528a, 0x528d, 0x5290, 0x5293, 0x5297, 0x529a, 0x529d, 0x52a1, 0x52a4, 0x52a7, 0x52ab, 0x52ae, 0x52b1, 0x52b5, 0x52b8, 0x52bb, 0x52bf, 0x52c2, 0x52c6, 0x52c9, 0x52cc, 0x52d0, 0x52d3, 0x52da, 0x52e1, 0x52e8, 0x52ef, 0x52f6, 0x52fd, 0x5304, 0x530b, 0x5312, 0x5319, 0x5320, 0x5327, 0x532e, 0x5335, 0x533d, 0x5344, 0x534b, 0x5352, 0x535a, 0x5361, 0x5369, 0x5370, 0x5377, 0x537f, 0x5386, 0x538e, 0x5395, 0x539d, 0x53a5, 0x53ac, 0x53b4, 0x53bc, 0x53c4, 0x53cb, 0x53d3, 0x53db, 0x53e3, 0x53eb, 0x53f3, 0x53fb, 0x5401, 0x5405, 0x5409, 0x540d, 0x5411, 0x5416, 0x541a, 0x541e, 0x5422, 0x5426, 0x542a, 0x542e, 0x5433, 0x5437, 0x543b, 0x543f, 0x5443, 0x5448, 0x544c, 0x5450, 0x5455, 0x5459, 0x545d, 0x5462, 0x5466, 0x546a, 0x546f, 0x5473, 0x5478, 0x547c, 0x5481, 0x5485, 0x548a, 0x548e, 0x5493, 0x5498, 0x549c, 0x54a1, 0x54a5, 0x54aa, 0x54af, 0x54b3, 0x54b8, 0x54bd, 0x54c2, 0x54c6, 0x54cb, 0x54d0, 0x54d5, 0x54da, 0x54de, 0x54e3, 0x54e8, 0x54ed, 0x54f2, 0x54f7, 0x54fc, 0x5501, 0x5506, 0x550b, 0x5510, 0x5515, 0x551a, 0x551f, 0x5525, 0x552a, 0x552f, 0x5534, 0x5539, 0x553e, 0x5544, 0x5549, 0x554e, 0x5554, 0x5559, 0x555e, 0x5564, 0x5569, 0x556f, 0x5574, 0x5579, 0x557f, 0x5584, 0x558a, 0x558f, 0x5595, 0x559b, 0x55a0, 0x55a6, 0x55ac, 0x55b1, 0x55b7, 0x55bd, 0x55c2, 0x55c8, 0x55ce, 0x55d4, 0x55da, 0x55e0, 0x55e5, 0x55eb, 0x55f1, 0x55f7, 0x55fd, 0x5603, 0x5609, 0x560f, 0x5615, 0x561b, 0x5622, 0x5628, 0x562e, 0x5634, 0x563a, 0x5640, 0x5647, 0x564d, 0x5653, 0x565a, 0x5660, 0x5666, 0x566d, 0x5673, 0x567a, 0x5680, 0x5687, 0x568d, 0x5694, 0x569a, 0x56a1, 0x56a8, 0x56ae, 0x56b5, 0x56bc, 0x56c3, 0x56c9, 0x56d0, 0x56d7, 0x56de, 0x56e5, 0x56ec, 0x56f3, 0x56f9, 0x5700, 0x5707, 0x570f, 0x5716, 0x571d, 0x5724, 0x572b, 0x5732, 0x5739, 0x5741, 0x5748, 0x574f, 0x5756, 0x575e, 0x5765, 0x576d, 0x5774, 0x577c, 0x5783, 0x578b, 0x5792, 0x579a, 0x57a1, 0x57a9, 0x57b1, 0x57b8, 0x57c0, 0x57c8, 0x57d0, 0x57d7, 0x57df, 0x57e7, 0x57ef, 0x57f7, 0x57ff, 0x5804, 0x5808, 0x580c, 0x5810, 0x5814, 0x5818, 0x581c, 0x5820, 0x5824, 0x5828, 0x582c, 0x5831, 0x5835, 0x5839, 0x583d, 0x5842, 0x5846, 0x584a, 0x584e, 0x5853, 0x5857, 0x585b, 0x5860, 0x5864, 0x5869, 0x586d, 0x5871, 0x5876, 0x587a, 0x587f, 0x5883, 0x5888, 0x588c, 0x5891, 0x5895, 0x589a, 0x589f, 0x58a3, 0x58a8, 0x58ad, 0x58b1, 0x58b6, 0x58bb, 0x58bf, 0x58c4, 0x58c9, 0x58ce, 0x58d3, 0x58d7, 0x58dc, 0x58e1, 0x58e6, 0x58eb, 0x58f0, 0x58f5, 0x58fa, 0x58ff, 0x5904, 0x5909, 0x590e, 0x5913, 0x5918, 0x591d, 0x5922, 0x5927, 0x592d, 0x5932, 0x5937, 0x593c, 0x5941, 0x5947, 0x594c, 0x5951, 0x5957, 0x595c, 0x5961, 0x5967, 0x596c, 0x5972, 0x5977, 0x597c, 0x5982, 0x5987, 0x598d, 0x5993, 0x5998, 0x599e, 0x59a3, 0x59a9, 0x59af, 0x59b4, 0x59ba, 0x59c0, 0x59c6, 0x59cb, 0x59d1, 0x59d7, 0x59dd, 0x59e3, 0x59e9, 0x59ef, 0x59f5, 0x59fa, 0x5a00, 0x5a07, 0x5a0d, 0x5a13, 0x5a19, 0x5a1f, 0x5a25, 0x5a2b, 0x5a31, 0x5a37, 0x5a3e, 0x5a44, 0x5a4a, 0x5a51, 0x5a57, 0x5a5d, 0x5a64, 0x5a6a, 0x5a70, 0x5a77, 0x5a7d, 0x5a84, 0x5a8a, 0x5a91, 0x5a98, 0x5a9e, 0x5aa5, 0x5aab, 0x5ab2, 0x5ab9, 0x5ac0, 0x5ac6, 0x5acd, 0x5ad4, 0x5adb, 0x5ae2, 0x5ae8, 0x5aef, 0x5af6, 0x5afd, 0x5b04, 0x5b0b, 0x5b12, 0x5b1a, 0x5b21, 0x5b28, 0x5b2f, 0x5b36, 0x5b3d, 0x5b45, 0x5b4c, 0x5b53, 0x5b5b, 0x5b62, 0x5b69, 0x5b71, 0x5b78, 0x5b80, 0x5b87, 0x5b8f, 0x5b96, 0x5b9e, 0x5ba6, 0x5bad, 0x5bb5, 0x5bbd, 0x5bc4, 0x5bcc, 0x5bd4, 0x5bdc, 0x5be4, 0x5bec, 0x5bf4, 0x5bfb, 0x5c02, 0x5c06, 0x5c0a, 0x5c0e, 0x5c12, 0x5c16, 0x5c1a, 0x5c1e, 0x5c22, 0x5c26, 0x5c2b, 0x5c2f, 0x5c33, 0x5c37, 0x5c3b, 0x5c40, 0x5c44, 0x5c48, 0x5c4c, 0x5c51, 0x5c55, 0x5c59, 0x5c5e, 0x5c62, 0x5c67, 0x5c6b, 0x5c6f, 0x5c74, 0x5c78, 0x5c7d, 0x5c81, 0x5c86, 0x5c8a, 0x5c8f, 0x5c93, 0x5c98, 0x5c9d, 0x5ca1, 0x5ca6, 0x5cab, 0x5caf, 0x5cb4, 0x5cb9, 0x5cbd, 0x5cc2, 0x5cc7, 0x5ccc, 0x5cd0, 0x5cd5, 0x5cda, 0x5cdf, 0x5ce4, 0x5ce9, 0x5cee, 0x5cf3, 0x5cf8, 0x5cfd, 0x5d02, 0x5d07, 0x5d0c, 0x5d11, 0x5d16, 0x5d1b, 0x5d20, 0x5d25, 0x5d2a, 0x5d2f, 0x5d35, 0x5d3a, 0x5d3f, 0x5d44, 0x5d4a, 0x5d4f, 0x5d54, 0x5d5a, 0x5d5f, 0x5d64, 0x5d6a, 0x5d6f, 0x5d75, 0x5d7a, 0x5d80, 0x5d85, 0x5d8b, 0x5d90, 0x5d96, 0x5d9b, 0x5da1, 0x5da7, 0x5dac, 0x5db2, 0x5db8, 0x5dbd, 0x5dc3, 0x5dc9, 0x5dcf, 0x5dd4, 0x5dda, 0x5de0, 0x5de6, 0x5dec, 0x5df2, 0x5df8, 0x5dfe, 0x5e04, 0x5e0a, 0x5e10, 0x5e16, 0x5e1c, 0x5e22, 0x5e28, 0x5e2f, 0x5e35, 0x5e3b, 0x5e41, 0x5e47, 0x5e4e, 0x5e54, 0x5e5a, 0x5e61, 0x5e67, 0x5e6e, 0x5e74, 0x5e7a, 0x5e81, 0x5e87, 0x5e8e, 0x5e95, 0x5e9b, 0x5ea2, 0x5ea8, 0x5eaf, 0x5eb6, 0x5ebd, 0x5ec3, 0x5eca, 0x5ed1, 0x5ed8, 0x5edf, 0x5ee5, 0x5eec, 0x5ef3, 0x5efa, 0x5f01, 0x5f08, 0x5f0f, 0x5f16, 0x5f1d, 0x5f25, 0x5f2c, 0x5f33, 0x5f3a, 0x5f41, 0x5f49, 0x5f50, 0x5f57, 0x5f5f, 0x5f66, 0x5f6d, 0x5f75, 0x5f7c, 0x5f84, 0x5f8b, 0x5f93, 0x5f9b, 0x5fa2, 0x5faa, 0x5fb1, 0x5fb9, 0x5fc1, 0x5fc9, 0x5fd0, 0x5fd8, 0x5fe0, 0x5fe8, 0x5ff0, 0x5ff8, 0x6000, 0x6004, 0x6008, 0x600c, 0x6010, 0x6014, 0x6018, 0x601c, 0x6020, 0x6025, 0x6029, 0x602d, 0x6031, 0x6035, 0x603a, 0x603e, 0x6042, 0x6046, 0x604b, 0x604f, 0x6053, 0x6057, 0x605c, 0x6060, 0x6065, 0x6069, 0x606d, 0x6072, 0x6076, 0x607b, 0x607f, 0x6084, 0x6088, 0x608d, 0x6091, 0x6096, 0x609b, 0x609f, 0x60a4, 0x60a8, 0x60ad, 0x60b2, 0x60b7, 0x60bb, 0x60c0, 0x60c5, 0x60ca, 0x60ce, 0x60d3, 0x60d8, 0x60dd, 0x60e2, 0x60e7, 0x60eb, 0x60f0, 0x60f5, 0x60fa, 0x60ff, 0x6104, 0x6109, 0x610e, 0x6113, 0x6119, 0x611e, 0x6123, 0x6128, 0x612d, 0x6132, 0x6137, 0x613d, 0x6142, 0x6147, 0x614d, 0x6152, 0x6157, 0x615d, 0x6162, 0x6167, 0x616d, 0x6172, 0x6178, 0x617d, 0x6183, 0x6188, 0x618e, 0x6193, 0x6199, 0x619e, 0x61a4, 0x61aa, 0x61af, 0x61b5, 0x61bb, 0x61c0, 0x61c6, 0x61cc, 0x61d2, 0x61d8, 0x61de, 0x61e3, 0x61e9, 0x61ef, 0x61f5, 0x61fb, 0x6201, 0x6207, 0x620d, 0x6213, 0x6219, 0x621f, 0x6226, 0x622c, 0x6232, 0x6238, 0x623e, 0x6245, 0x624b, 0x6251, 0x6258, 0x625e, 0x6264, 0x626b, 0x6271, 0x6278, 0x627e, 0x6285, 0x628b, 0x6292, 0x6298, 0x629f, 0x62a5, 0x62ac, 0x62b3, 0x62ba, 0x62c0, 0x62c7, 0x62ce, 0x62d5, 0x62db, 0x62e2, 0x62e9, 0x62f0, 0x62f7, 0x62fe, 0x6305, 0x630c, 0x6313, 0x631a, 0x6321, 0x6329, 0x6330, 0x6337, 0x633e, 0x6345, 0x634d, 0x6354, 0x635b, 0x6363, 0x636a, 0x6372, 0x6379, 0x6380, 0x6388, 0x6390, 0x6397, 0x639f, 0x63a6, 0x63ae, 0x63b6, 0x63bd, 0x63c5, 0x63cd, 0x63d5, 0x63dd, 0x63e5, 0x63ec, 0x63f4, 0x63fc, 0x6402, 0x6406, 0x640a, 0x640e, 0x6412, 0x6416, 0x641b, 0x641f, 0x6423, 0x6427, 0x642b, 0x642f, 0x6433, 0x6438, 0x643c, 0x6440, 0x6444, 0x6449, 0x644d, 0x6451, 0x6456, 0x645a, 0x645e, 0x6463, 0x6467, 0x646b, 0x6470, 0x6474, 0x6479, 0x647d, 0x6482, 0x6486, 0x648b, 0x648f, 0x6494, 0x6499, 0x649d, 0x64a2, 0x64a6, 0x64ab, 0x64b0, 0x64b4, 0x64b9, 0x64be, 0x64c3, 0x64c7, 0x64cc, 0x64d1, 0x64d6, 0x64db, 0x64e0, 0x64e4, 0x64e9, 0x64ee, 0x64f3, 0x64f8, 0x64fd, 0x6502, 0x6507, 0x650c, 0x6511, 0x6516, 0x651b, 0x6520, 0x6526, 0x652b, 0x6530, 0x6535, 0x653a, 0x6540, 0x6545, 0x654a, 0x654f, 0x6555, 0x655a, 0x655f, 0x6565, 0x656a, 0x6570, 0x6575, 0x657b, 0x6580, 0x6586, 0x658b, 0x6591, 0x6596, 0x659c, 0x65a1, 0x65a7, 0x65ad, 0x65b2, 0x65b8, 0x65be, 0x65c4, 0x65c9, 0x65cf, 0x65d5, 0x65db, 0x65e1, 0x65e7, 0x65ed, 0x65f3, 0x65f8, 0x65fe, 0x6604, 0x660b, 0x6611, 0x6617, 0x661d, 0x6623, 0x6629, 0x662f, 0x6635, 0x663c, 0x6642, 0x6648, 0x664e, 0x6655, 0x665b, 0x6661, 0x6668, 0x666e, 0x6675, 0x667b, 0x6682, 0x6688, 0x668f, 0x6695, 0x669c, 0x66a2, 0x66a9, 0x66b0, 0x66b7, 0x66bd, 0x66c4, 0x66cb, 0x66d2, 0x66d8, 0x66df, 0x66e6, 0x66ed, 0x66f4, 0x66fb, 0x6702, 0x6709, 0x6710, 0x6717, 0x671e, 0x6725, 0x672d, 0x6734, 0x673b, 0x6742, 0x6749, 0x6751, 0x6758, 0x675f, 0x6767, 0x676e, 0x6776, 0x677d, 0x6785, 0x678c, 0x6794, 0x679b, 0x67a3, 0x67ab, 0x67b2, 0x67ba, 0x67c2, 0x67ca, 0x67d1, 0x67d9, 0x67e1, 0x67e9, 0x67f1, 0x67f9, 0x6800, 0x6804, 0x6808, 0x680c, 0x6811, 0x6815, 0x6819, 0x681d, 0x6821, 0x6825, 0x6829, 0x682d, 0x6832, 0x6836, 0x683a, 0x683e, 0x6842, 0x6847, 0x684b, 0x684f, 0x6854, 0x6858, 0x685c, 0x6861, 0x6865, 0x6869, 0x686e, 0x6872, 0x6877, 0x687b, 0x6880, 0x6884, 0x6889, 0x688d, 0x6892, 0x6896, 0x689b, 0x68a0, 0x68a4, 0x68a9, 0x68ae, 0x68b2, 0x68b7, 0x68bc, 0x68c0, 0x68c5, 0x68ca, 0x68cf, 0x68d4, 0x68d8, 0x68dd, 0x68e2, 0x68e7, 0x68ec, 0x68f1, 0x68f6, 0x68fb, 0x6900, 0x6905, 0x690a, 0x690f, 0x6914, 0x6919, 0x691e, 0x6923, 0x6928, 0x692e, 0x6933, 0x6938, 0x693d, 0x6943, 0x6948, 0x694d, 0x6952, 0x6958, 0x695d, 0x6962, 0x6968, 0x696d, 0x6973, 0x6978, 0x697e, 0x6983, 0x6989, 0x698e, 0x6994, 0x6999, 0x699f, 0x69a5, 0x69aa, 0x69b0, 0x69b6, 0x69bb, 0x69c1, 0x69c7, 0x69cd, 0x69d2, 0x69de, 0x69ea, 0x69f6, 0x6a02, 0x6a0e, 0x6a1a, 0x6a26, 0x6a33, 0x6a3f, 0x6a4c, 0x6a58, 0x6a65, 0x6a72, 0x6a7f, 0x6a8c, 0x6a99, 0x6aa6, 0x6ab4, 0x6ac1, 0x6acf, 0x6adc, 0x6aea, 0x6af8, 0x6b06, 0x6b14, 0x6b22, 0x6b30, 0x6b3f, 0x6b4d, 0x6b5c, 0x6b6b, 0x6b7a, 0x6b89, 0x6b98, 0x6ba7, 0x6bb7, 0x6bc6, 0x6bd6, 0x6be5, 0x6bf5, 0x6c03, 0x6c0b, 0x6c13, 0x6c1b, 0x6c23, 0x6c2c, 0x6c34, 0x6c3c, 0x6c45, 0x6c4d, 0x6c56, 0x6c5f, 0x6c68, 0x6c70, 0x6c79, 0x6c82, 0x6c8b, 0x6c94, 0x6c9e, 0x6ca7, 0x6cb0, 0x6cba, 0x6cc3, 0x6ccd, 0x6cd6, 0x6ce0, 0x6cea, 0x6cf4, 0x6cfe, 0x6d08, 0x6d12, 0x6d1c, 0x6d26, 0x6d31, 0x6d3b, 0x6d45, 0x6d50, 0x6d5b, 0x6d65, 0x6d70, 0x6d7b, 0x6d86, 0x6d91, 0x6d9c, 0x6da8, 0x6db3, 0x6dbf, 0x6dca, 0x6dd6, 0x6de1, 0x6ded, 0x6df9, 0x6e05, 0x6e11, 0x6e1d, 0x6e2a, 0x6e36, 0x6e43, 0x6e4f, 0x6e5c, 0x6e69, 0x6e75, 0x6e82, 0x6e8f, 0x6e9d, 0x6eaa, 0x6eb7, 0x6ec5, 0x6ed2, 0x6ee0, 0x6eee, 0x6efc, 0x6f0a, 0x6f18, 0x6f26, 0x6f34, 0x6f43, 0x6f52, 0x6f60, 0x6f6f, 0x6f7e, 0x6f8d, 0x6f9c, 0x6fab, 0x6fbb, 0x6fca, 0x6fda, 0x6fea, 0x6ffa, 0x7005, 0x700d, 0x7015, 0x701d, 0x7025, 0x702e, 0x7036, 0x703f, 0x7047, 0x7050, 0x7058, 0x7061, 0x706a, 0x7073, 0x707c, 0x7085, 0x708e, 0x7097, 0x70a0, 0x70a9, 0x70b3, 0x70bc, 0x70c6, 0x70cf, 0x70d9, 0x70e3, 0x70ed, 0x70f6, 0x7100, 0x710a, 0x7115, 0x711f, 0x7129, 0x7133, 0x713e, 0x7148, 0x7153, 0x715e, 0x7168, 0x7173, 0x717e, 0x7189, 0x7194, 0x71a0, 0x71ab, 0x71b6, 0x71c2, 0x71cd, 0x71d9, 0x71e5, 0x71f1, 0x71fc, 0x7208, 0x7215, 0x7221, 0x722d, 0x7239, 0x7246, 0x7253, 0x725f, 0x726c, 0x7279, 0x7286, 0x7293, 0x72a0, 0x72ae, 0x72bb, 0x72c8, 0x72d6, 0x72e4, 0x72f2, 0x7300, 0x730e, 0x731c, 0x732a, 0x7338, 0x7347, 0x7356, 0x7364, 0x7373, 0x7382, 0x7391, 0x73a0, 0x73b0, 0x73bf, 0x73cf, 0x73de, 0x73ee, 0x73fe, 0x7407, 0x740f, 0x7417, 0x7420, 0x7428, 0x7430, 0x7439, 0x7441, 0x744a, 0x7452, 0x745b, 0x7464, 0x746c, 0x7475, 0x747e, 0x7487, 0x7490, 0x749a, 0x74a3, 0x74ac, 0x74b5, 0x74bf, 0x74c8, 0x74d2, 0x74dc, 0x74e5, 0x74ef, 0x74f9, 0x7503, 0x750d, 0x7517, 0x7522, 0x752c, 0x7536, 0x7541, 0x754b, 0x7556, 0x7561, 0x756b, 0x7576, 0x7581, 0x758c, 0x7597, 0x75a3, 0x75ae, 0x75b9, 0x75c5, 0x75d1, 0x75dc, 0x75e8, 0x75f4, 0x7600, 0x760c, 0x7618, 0x7624, 0x7631, 0x763d, 0x7649, 0x7656, 0x7663, 0x7670, 0x767d, 0x768a, 0x7697, 0x76a4, 0x76b1, 0x76bf, 0x76cc, 0x76da, 0x76e8, 0x76f6, 0x7703, 0x7712, 0x7720, 0x772e, 0x773c, 0x774b, 0x775a, 0x7768, 0x7777, 0x7786, 0x7795, 0x77a5, 0x77b4, 0x77c3, 0x77d3, 0x77e3, 0x77f3, 0x7801, 0x7809, 0x7811, 0x781a, 0x7822, 0x782a, 0x7832, 0x783b, 0x7843, 0x784c, 0x7855, 0x785d, 0x7866, 0x786f, 0x7878, 0x7881, 0x788a, 0x7893, 0x789c, 0x78a5, 0x78af, 0x78b8, 0x78c2, 0x78cb, 0x78d5, 0x78de, 0x78e8, 0x78f2, 0x78fc, 0x7906, 0x7910, 0x791a, 0x7924, 0x792f, 0x7939, 0x7944, 0x794e, 0x7959, 0x7964, 0x796e, 0x7979, 0x7984, 0x798f, 0x799b, 0x79a6, 0x79b1, 0x79bd, 0x79c8, 0x79d4, 0x79df, 0x79eb, 0x79f7, 0x7a03, 0x7a0f, 0x7a1b, 0x7a28, 0x7a34, 0x7a40, 0x7a4d, 0x7a5a, 0x7a66, 0x7a73, 0x7a80, 0x7a8d, 0x7a9a, 0x7aa8, 0x7ab5, 0x7ac2, 0x7ad0, 0x7ade, 0x7aeb, 0x7af9, 0x7b07, 0x7b16, 0x7b24, 0x7b32, 0x7b41, 0x7b4f, 0x7b5e, 0x7b6d, 0x7b7b, 0x7b8a, 0x7b9a, 0x7ba9, 0x7bb8, 0x7bc8, 0x7bd7, 0x7be7, 0x7bf7, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0e, 0x3b0e, 0x3b0e, 0x3b0e, 0x3b0e, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0c, 0x3b0c, 0x3b0c, 0x3b0c, 0x3b0c, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0a, 0x3b0a, 0x3b0a, 0x3b0a, 0x3b09, 0x3b09, 0x3b09, 0x3b09, 0x3b09, 0x3b08, 0x3b08, 0x3b08, 0x3b08, 0x3b07, 0x3b07, 0x3b07, 0x3b07, 0x3b07, 0x3b06, 0x3b06, 0x3b06, 0x3b06, 0x3b05, 0x3b05, 0x3b05, 0x3b05, 0x3b05, 0x3b04, 0x3b04, 0x3b04, 0x3b04, 0x3b03, 0x3b03, 0x3b03, 0x3b03, 0x3b03, 0x3b02, 0x3b02, 0x3b02, 0x3b02, 0x3b02, 0x3b01, 0x3b01, 0x3b01, 0x3b01, 0x3b00, 0x3b00, 0x3b00, 0x3b00, 0x3b00, 0x3aff, 0x3aff, 0x3aff, 0x3aff, 0x3afe, 0x3afe, 0x3afe, 0x3afe, 0x3afe, 0x3afd, 0x3afd, 0x3afd, 0x3afd, 0x3afc, 0x3afc, 0x3afc, 0x3afc, 0x3afc, 0x3afb, 0x3afb, 0x3afb, 0x3afb, 0x3afb, 0x3afa, 0x3afa, 0x3afa, 0x3afa, 0x3af9, 0x3af9, 0x3af9, 0x3af9, 0x3af9, 0x3af8, 0x3af8, 0x3af8, 0x3af8, 0x3af7, 0x3af7, 0x3af7, 0x3af7, 0x3af7, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af5, 0x3af5, 0x3af5, 0x3af5, 0x3af4, 0x3af4, 0x3af4, 0x3af4, 0x3af4, 0x3af3, 0x3af3, 0x3af3, 0x3af3, 0x3af2, 0x3af2, 0x3af2, 0x3af2, 0x3af2, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af0, 0x3af0, 0x3af0, 0x3af0, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aee, 0x3aee, 0x3aee, 0x3aee, 0x3aed, 0x3aed, 0x3aed, 0x3aed, 0x3aed, 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aeb, 0x3aeb, 0x3aeb, 0x3aeb, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3ae9, 0x3ae9, 0x3ae9, 0x3ae9, 0x3ae9, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae6, 0x3ae6, 0x3ae6, 0x3ae6, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae4, 0x3ae4, 0x3ae4, 0x3ae4, 0x3ae4, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae2, 0x3ae2, 0x3ae2, 0x3ae2, 0x3ae2, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae0, 0x3ae0, 0x3ae0, 0x3ae0, 0x3adf, 0x3adf, 0x3adf, 0x3adf, 0x3adf, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3add, 0x3add, 0x3add, 0x3add, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adb, 0x3adb, 0x3adb, 0x3adb, 0x3adb, 0x3ada, 0x3ada, 0x3ada, 0x3ada, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad8, 0x3ad8, 0x3ad8, 0x3ad8, 0x3ad8, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad6, 0x3ad6, 0x3ad6, 0x3ad6, 0x3ad6, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad3, 0x3ad3, 0x3ad3, 0x3ad3, 0x3ad3, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad1, 0x3ad1, 0x3ad1, 0x3ad1, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3acf, 0x3acf, 0x3acf, 0x3acf, 0x3acf, 0x3ace, 0x3ace, 0x3ace, 0x3ace, 0x3ace, 0x3acd, 0x3acd, 0x3acd, 0x3acd, 0x3acc, 0x3acc, 0x3acc, 0x3acc, 0x3acc, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3aca, 0x3aca, 0x3aca, 0x3aca, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac7, 0x3ac7, 0x3ac7, 0x3ac7, 0x3ac7, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac5, 0x3ac5, 0x3ac5, 0x3ac5, 0x3ac5, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac2, 0x3ac2, 0x3ac2, 0x3ac2, 0x3ac2, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac0, 0x3ac0, 0x3ac0, 0x3ac0, 0x3ac0, 0x3abf, 0x3abf, 0x3abf, 0x3abf, 0x3abe, 0x3abe, 0x3abe, 0x3abe, 0x3abe, 0x3abd, 0x3abd, 0x3abd, 0x3abd, 0x3abd, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abb, 0x3abb, 0x3abb, 0x3abb, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab8, 0x3ab8, 0x3ab8, 0x3ab8, 0x3ab8, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab6, 0x3ab6, 0x3ab6, 0x3ab6, 0x3ab6, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab3, 0x3ab3, 0x3ab3, 0x3ab3, 0x3ab3, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab1, 0x3ab1, 0x3ab1, 0x3ab1, 0x3ab1, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3aaf, 0x3aaf, 0x3aaf, 0x3aaf, 0x3aaf, 0x3aae, 0x3aae, 0x3aae, 0x3aae, 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aac, 0x3aac, 0x3aac, 0x3aac, 0x3aac, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aaa, 0x3aaa, 0x3aaa, 0x3aaa, 0x3aaa, 0x3aa9, 0x3aa9, 0x3aa9, 0x3aa9, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa7, 0x3aa7, 0x3aa7, 0x3aa7, 0x3aa7, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa4, 0x3aa4, 0x3aa4, 0x3aa4, 0x3aa4, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa2, 0x3aa2, 0x3aa2, 0x3aa2, 0x3aa2, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa0, 0x3aa0, 0x3aa0, 0x3aa0, 0x3aa0, 0x3a9f, 0x3a9f, 0x3a9f, 0x3a9f, 0x3a9f, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9d, 0x3a9d, 0x3a9d, 0x3a9d, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9a, 0x3a9a, 0x3a9a, 0x3a9a, 0x3a9a, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a98, 0x3a98, 0x3a98, 0x3a98, 0x3a98, 0x3a97, 0x3a97, 0x3a97, 0x3a97, 0x3a96, 0x3a96, 0x3a96, 0x3a96, 0x3a96, 0x3a95, 0x3a95, 0x3a95, 0x3a95, 0x3a95, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a93, 0x3a93, 0x3a93, 0x3a93, 0x3a93, 0x3a92, 0x3a92, 0x3a92, 0x3a92, 0x3a92, 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a90, 0x3a90, 0x3a90, 0x3a90, 0x3a90, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8e, 0x3a8e, 0x3a8e, 0x3a8e, 0x3a8e, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8b, 0x3a8b, 0x3a8b, 0x3a8b, 0x3a8b, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a89, 0x3a89, 0x3a89, 0x3a89, 0x3a89, 0x3a88, 0x3a88, 0x3a88, 0x3a88, 0x3a88, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a86, 0x3a86, 0x3a86, 0x3a86, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a84, 0x3a84, 0x3a84, 0x3a84, 0x3a84, 0x3a83, 0x3a83, 0x3a83, 0x3a83, 0x3a83, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a81, 0x3a81, 0x3a81, 0x3a81, 0x3a81, 0x3a80, 0x3a80, 0x3a80, 0x3a80, 0x3a80, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7e, 0x3a7e, 0x3a7e, 0x3a7e, 0x3a7e, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7b, 0x3a7b, 0x3a7b, 0x3a7b, 0x3a7b, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a79, 0x3a79, 0x3a79, 0x3a79, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a77, 0x3a77, 0x3a77, 0x3a77, 0x3a77, 0x3a76, 0x3a76, 0x3a76, 0x3a76, 0x3a76, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a74, 0x3a74, 0x3a74, 0x3a74, 0x3a74, 0x3a73, 0x3a73, 0x3a73, 0x3a73, 0x3a73, 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a71, 0x3a71, 0x3a71, 0x3a71, 0x3a71, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6e, 0x3a6e, 0x3a6e, 0x3a6e, 0x3a6e, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6c, 0x3a6c, 0x3a6c, 0x3a6c, 0x3a6c, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a69, 0x3a69, 0x3a69, 0x3a69, 0x3a69, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a67, 0x3a67, 0x3a67, 0x3a67, 0x3a67, 0x3a66, 0x3a66, 0x3a66, 0x3a66, 0x3a66, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a64, 0x3a64, 0x3a64, 0x3a64, 0x3a64, 0x3a63, 0x3a63, 0x3a63, 0x3a63, 0x3a63, 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a61, 0x3a61, 0x3a61, 0x3a61, 0x3a61, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5e, 0x3a5e, 0x3a5e, 0x3a5e, 0x3a5e, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5c, 0x3a5c, 0x3a5c, 0x3a5c, 0x3a5c, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a59, 0x3a59, 0x3a59, 0x3a59, 0x3a59, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a57, 0x3a57, 0x3a57, 0x3a57, 0x3a57, 0x3a56, 0x3a56, 0x3a56, 0x3a56, 0x3a56, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a54, 0x3a54, 0x3a54, 0x3a54, 0x3a54, 0x3a54, 0x3a53, 0x3a53, 0x3a53, 0x3a53, 0x3a53, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a51, 0x3a51, 0x3a51, 0x3a51, 0x3a51, 0x3a50, 0x3a50, 0x3a50, 0x3a50, 0x3a50, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4e, 0x3a4e, 0x3a4e, 0x3a4e, 0x3a4e, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4b, 0x3a4b, 0x3a4b, 0x3a4b, 0x3a4b, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a49, 0x3a49, 0x3a49, 0x3a49, 0x3a49, 0x3a48, 0x3a48, 0x3a48, 0x3a48, 0x3a48, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a46, 0x3a46, 0x3a46, 0x3a46, 0x3a46, 0x3a45, 0x3a45, 0x3a45, 0x3a45, 0x3a45, 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a43, 0x3a43, 0x3a43, 0x3a43, 0x3a43, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a41, 0x3a41, 0x3a41, 0x3a41, 0x3a41, 0x3a40, 0x3a40, 0x3a40, 0x3a40, 0x3a40, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3d, 0x3a3d, 0x3a3d, 0x3a3d, 0x3a3d, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3b, 0x3a3b, 0x3a3b, 0x3a3b, 0x3a3a, 0x3a3a, 0x3a39, 0x3a39, 0x3a39, 0x3a38, 0x3a38, 0x3a37, 0x3a37, 0x3a37, 0x3a36, 0x3a36, 0x3a36, 0x3a35, 0x3a35, 0x3a34, 0x3a34, 0x3a34, 0x3a33, 0x3a33, 0x3a32, 0x3a32, 0x3a32, 0x3a31, 0x3a31, 0x3a31, 0x3a30, 0x3a30, 0x3a2f, 0x3a2f, 0x3a2f, 0x3a2e, 0x3a2e, 0x3a2d, 0x3a2d, 0x3a2d, 0x3a2c, 0x3a2c, 0x3a2b, 0x3a2b, 0x3a2b, 0x3a2a, 0x3a2a, 0x3a2a, 0x3a29, 0x3a29, 0x3a28, 0x3a28, 0x3a28, 0x3a27, 0x3a27, 0x3a26, 0x3a26, 0x3a26, 0x3a25, 0x3a25, 0x3a25, 0x3a24, 0x3a24, 0x3a23, 0x3a23, 0x3a23, 0x3a22, 0x3a22, 0x3a21, 0x3a21, 0x3a21, 0x3a20, 0x3a20, 0x3a20, 0x3a1f, 0x3a1f, 0x3a1e, 0x3a1e, 0x3a1e, 0x3a1d, 0x3a1d, 0x3a1d, 0x3a1c, 0x3a1c, 0x3a1b, 0x3a1b, 0x3a1b, 0x3a1a, 0x3a1a, 0x3a19, 0x3a19, 0x3a19, 0x3a18, 0x3a18, 0x3a18, 0x3a17, 0x3a17, 0x3a16, 0x3a16, 0x3a16, 0x3a15, 0x3a15, 0x3a15, 0x3a14, 0x3a14, 0x3a13, 0x3a13, 0x3a13, 0x3a12, 0x3a12, 0x3a11, 0x3a11, 0x3a11, 0x3a10, 0x3a10, 0x3a10, 0x3a0f, 0x3a0f, 0x3a0e, 0x3a0e, 0x3a0e, 0x3a0d, 0x3a0d, 0x3a0d, 0x3a0c, 0x3a0c, 0x3a0b, 0x3a0b, 0x3a0b, 0x3a0a, 0x3a0a, 0x3a0a, 0x3a09, 0x3a09, 0x3a08, 0x3a08, 0x3a08, 0x3a07, 0x3a07, 0x3a07, 0x3a06, 0x3a06, 0x3a05, 0x3a05, 0x3a05, 0x3a04, 0x3a04, 0x3a04, 0x3a03, 0x3a03, 0x3a02, 0x3a02, 0x3a02, 0x3a01, 0x3a01, 0x3a01, 0x3a00, 0x3a00, 0x39ff, 0x39ff, 0x39ff, 0x39fe, 0x39fe, 0x39fe, 0x39fd, 0x39fd, 0x39fc, 0x39fc, 0x39fc, 0x39fb, 0x39fb, 0x39fb, 0x39fa, 0x39fa, 0x39f9, 0x39f9, 0x39f9, 0x39f8, 0x39f8, 0x39f8, 0x39f7, 0x39f7, 0x39f6, 0x39f6, 0x39f6, 0x39f5, 0x39f5, 0x39f5, 0x39f4, 0x39f4, 0x39f3, 0x39f3, 0x39f3, 0x39f2, 0x39f2, 0x39f2, 0x39f1, 0x39f1, 0x39f0, 0x39f0, 0x39f0, 0x39ef, 0x39ef, 0x39ef, 0x39ee, 0x39ee, 0x39ed, 0x39ed, 0x39ed, 0x39ec, 0x39ec, 0x39ec, 0x39eb, 0x39eb, 0x39eb, 0x39ea, 0x39ea, 0x39e9, 0x39e9, 0x39e9, 0x39e8, 0x39e8, 0x39e8, 0x39e7, 0x39e7, 0x39e6, 0x39e6, 0x39e6, 0x39e5, 0x39e5, 0x39e5, 0x39e4, 0x39e4, 0x39e4, 0x39e3, 0x39e3, 0x39e2, 0x39e2, 0x39e2, 0x39e1, 0x39e1, 0x39e1, 0x39e0, 0x39e0, 0x39df, 0x39df, 0x39df, 0x39de, 0x39de, 0x39de, 0x39dd, 0x39dd, 0x39dd, 0x39dc, 0x39dc, 0x39db, 0x39db, 0x39db, 0x39da, 0x39da, 0x39da, 0x39d9, 0x39d9, 0x39d9, 0x39d8, 0x39d8, 0x39d7, 0x39d7, 0x39d7, 0x39d6, 0x39d6, 0x39d6, 0x39d5, 0x39d5, 0x39d5, 0x39d4, 0x39d4, 0x39d3, 0x39d3, 0x39d3, 0x39d2, 0x39d2, 0x39d2, 0x39d1, 0x39d1, 0x39d1, 0x39d0, 0x39d0, 0x39cf, 0x39cf, 0x39cf, 0x39ce, 0x39ce, 0x39ce, 0x39cd, 0x39cd, 0x39cd, 0x39cc, 0x39cc, 0x39cb, 0x39cb, 0x39cb, 0x39ca, 0x39ca, 0x39ca, 0x39c9, 0x39c9, 0x39c9, 0x39c8, 0x39c8, 0x39c7, 0x39c7, 0x39c7, 0x39c6, 0x39c6, 0x39c6, 0x39c5, 0x39c5, 0x39c5, 0x39c4, 0x39c4, 0x39c3, 0x39c3, 0x39c3, 0x39c2, 0x39c2, 0x39c2, 0x39c1, 0x39c1, 0x39c1, 0x39c0, 0x39c0, 0x39c0, 0x39bf, 0x39bf, 0x39be, 0x39be, 0x39be, 0x39bd, 0x39bd, 0x39bd, 0x39bc, 0x39bc, 0x39bc, 0x39bb, 0x39bb, 0x39bb, 0x39ba, 0x39ba, 0x39b9, 0x39b9, 0x39b9, 0x39b8, 0x39b8, 0x39b8, 0x39b7, 0x39b7, 0x39b7, 0x39b6, 0x39b6, 0x39b5, 0x39b5, 0x39b5, 0x39b4, 0x39b4, 0x39b4, 0x39b3, 0x39b3, 0x39b3, 0x39b2, 0x39b2, 0x39b2, 0x39b1, 0x39b1, 0x39b1, 0x39b0, 0x39b0, 0x39af, 0x39af, 0x39af, 0x39ae, 0x39ae, 0x39ae, 0x39ad, 0x39ad, 0x39ad, 0x39ac, 0x39ac, 0x39ac, 0x39ab, 0x39ab, 0x39aa, 0x39aa, 0x39aa, 0x39a9, 0x39a9, 0x39a9, 0x39a8, 0x39a8, 0x39a8, 0x39a7, 0x39a7, 0x39a7, 0x39a6, 0x39a6, 0x39a6, 0x39a5, 0x39a5, 0x39a4, 0x39a4, 0x39a4, 0x39a3, 0x39a3, 0x39a3, 0x39a2, 0x39a2, 0x39a2, 0x39a1, 0x39a1, 0x39a1, 0x39a0, 0x39a0, 0x39a0, 0x399f, 0x399f, 0x399e, 0x399e, 0x399e, 0x399d, 0x399d, 0x399d, 0x399c, 0x399c, 0x399c, 0x399b, 0x399b, 0x399b, 0x399a, 0x399a, 0x399a, 0x3999, 0x3999, 0x3999, 0x3998, 0x3998, 0x3997, 0x3997, 0x3997, 0x3996, 0x3996, 0x3996, 0x3995, 0x3995, 0x3995, 0x3994, 0x3994, 0x3994, 0x3993, 0x3993, 0x3993, 0x3992, 0x3992, 0x3992, 0x3991, 0x3991, 0x3991, 0x3990, 0x3990, 0x398f, 0x398f, 0x398f, 0x398e, 0x398e, 0x398e, 0x398d, 0x398d, 0x398d, 0x398c, 0x398c, 0x398c, 0x398b, 0x398b, 0x398b, 0x398a, 0x398a, 0x398a, 0x3989, 0x3989, 0x3989, 0x3988, 0x3988, 0x3987, 0x3987, 0x3987, 0x3986, 0x3986, 0x3986, 0x3985, 0x3985, 0x3985, 0x3984, 0x3984, 0x3984, 0x3983, 0x3983, 0x3983, 0x3982, 0x3982, 0x3982, 0x3981, 0x3981, 0x3981, 0x3980, 0x3980, 0x3980, 0x397f, 0x397f, 0x397f, 0x397e, 0x397e, 0x397e, 0x397d, 0x397d, 0x397c, 0x397c, 0x397c, 0x397b, 0x397b, 0x397b, 0x397a, 0x397a, 0x397a, 0x3979, 0x3979, 0x3979, 0x3978, 0x3978, 0x3978, 0x3977, 0x3977, 0x3977, 0x3976, 0x3976, 0x3976, 0x3975, 0x3975, 0x3975, 0x3974, 0x3974, 0x3974, 0x3973, 0x3973, 0x3973, 0x3972, 0x3972, 0x3972, 0x3971, 0x3971, 0x3971, 0x3970, 0x3970, 0x3970, 0x396f, 0x396f, 0x396e, 0x396e, 0x396e, 0x396d, 0x396d, 0x396d, 0x396c, 0x396c, 0x396c, 0x396b, 0x396b, 0x396b, 0x396a, 0x396a, 0x396a, 0x3969, 0x3969, 0x3969, 0x3968, 0x3968, 0x3968, 0x3967, 0x3967, 0x3967, 0x3966, 0x3966, 0x3966, 0x3965, 0x3965, 0x3965, 0x3964, 0x3964, 0x3964, 0x3963, 0x3963, 0x3963, 0x3962, 0x3962, 0x3962, 0x3961, 0x3961, 0x3961, 0x3960, 0x3960, 0x3960, 0x395f, 0x395f, 0x395f, 0x395e, 0x395e, 0x395e, 0x395d, 0x395d, 0x395d, 0x395c, 0x395c, 0x395c, 0x395b, 0x395b, 0x395b, 0x395a, 0x395a, 0x395a, 0x3959, 0x3959, 0x3959, 0x3958, 0x3958, 0x3958, 0x3957, 0x3957, 0x3957, 0x3956, 0x3956, 0x3956, 0x3955, 0x3955, 0x3955, 0x3954, 0x3954, 0x3954, 0x3953, 0x3953, 0x3953, 0x3952, 0x3952, 0x3952, 0x3951, 0x3951, 0x3951, 0x3950, 0x3950, 0x3950, 0x394f, 0x394f, 0x394f, 0x394e, 0x394e, 0x394e, 0x394d, 0x394d, 0x394d, 0x394c, 0x394c, 0x394c, 0x394b, 0x394b, 0x394b, 0x394a, 0x394a, 0x394a, 0x3949, 0x3949, 0x3949, 0x3948, 0x3948, 0x3948, 0x3947, 0x3947, 0x3947, 0x3946, 0x3946, 0x3946, 0x3945, 0x3945, 0x3945, 0x3944, 0x3944, 0x3944, 0x3943, 0x3943, 0x3943, 0x3942, 0x3942, 0x3942, 0x3941, 0x3941, 0x3941, 0x3940, 0x3940, 0x3940, 0x393f, 0x393f, 0x393f, 0x393e, 0x393e, 0x393e, 0x393d, 0x393d, 0x393d, 0x393c, 0x393c, 0x393c, 0x393c, 0x393b, 0x393b, 0x393b, 0x393a, 0x393a, 0x393a, 0x3939, 0x3939, 0x3939, 0x3938, 0x3938, 0x3938, 0x3937, 0x3937, 0x3937, 0x3936, 0x3936, 0x3936, 0x3935, 0x3935, 0x3935, 0x3934, 0x3934, 0x3934, 0x3933, 0x3933, 0x3933, 0x3932, 0x3932, 0x3932, 0x3931, 0x3931, 0x3931, 0x3930, 0x3930, 0x3930, 0x392f, 0x392f, 0x392f, 0x392e, 0x392e, 0x392e, 0x392e, 0x392d, 0x392d, 0x392d, 0x392c, 0x392c, 0x392c, 0x392b, 0x392b, 0x392b, 0x392a, 0x392a, 0x392a, 0x3929, 0x3929, 0x3929, 0x3928, 0x3928, 0x3928, 0x3927, 0x3927, 0x3927, 0x3926, 0x3926, 0x3926, 0x3925, 0x3925, 0x3925, 0x3924, 0x3924, 0x3924, 0x3924, 0x3923, 0x3923, 0x3923, 0x3922, 0x3922, 0x3922, 0x3921, 0x3921, 0x3921, 0x3920, 0x3920, 0x3920, 0x391f, 0x391f, 0x391f, 0x391e, 0x391e, 0x391e, 0x391d, 0x391d, 0x391d, 0x391c, 0x391c, 0x391c, 0x391c, 0x391b, 0x391b, 0x391b, 0x391a, 0x391a, 0x391a, 0x3919, 0x3919, 0x3919, 0x3918, 0x3918, 0x3918, 0x3917, 0x3917, 0x3917, 0x3916, 0x3916, 0x3916, 0x3915, 0x3915, 0x3915, 0x3915, 0x3914, 0x3914, 0x3914, 0x3913, 0x3913, 0x3913, 0x3912, 0x3912, 0x3912, 0x3911, 0x3911, 0x3911, 0x3910, 0x3910, 0x3910, 0x390f, 0x390f, 0x390f, 0x390e, 0x390e, 0x390e, 0x390e, 0x390d, 0x390d, 0x390d, 0x390c, 0x390c, 0x390c, 0x390b, 0x390b, 0x390b, 0x390a, 0x390a, 0x390a, 0x3909, 0x3909, 0x3909, 0x3909, 0x3908, 0x3908, 0x3908, 0x3907, 0x3907, 0x3907, 0x3906, 0x3906, 0x3906, 0x3905, 0x3905, 0x3905, 0x3904, 0x3904, 0x3904, 0x3903, 0x3903, 0x3903, 0x3903, 0x3902, 0x3902, 0x3902, 0x3901, 0x3901, 0x3901, 0x3900, 0x3900, 0x3900, 0x38ff, 0x38ff, 0x38ff, 0x38fe, 0x38fe, 0x38fe, 0x38fe, 0x38fd, 0x38fd, 0x38fd, 0x38fc, 0x38fc, 0x38fc, 0x38fb, 0x38fb, 0x38fb, 0x38fa, 0x38fa, 0x38fa, 0x38f9, 0x38f9, 0x38f9, 0x38f9, 0x38f8, 0x38f8, 0x38f8, 0x38f7, 0x38f7, 0x38f7, 0x38f6, 0x38f6, 0x38f6, 0x38f5, 0x38f5, 0x38f5, 0x38f5, 0x38f4, 0x38f4, 0x38f4, 0x38f3, 0x38f3, 0x38f3, 0x38f2, 0x38f2, 0x38f2, 0x38f1, 0x38f1, 0x38f1, 0x38f1, 0x38f0, 0x38f0, 0x38f0, 0x38ef, 0x38ef, 0x38ef, 0x38ee, 0x38ee, 0x38ee, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ec, 0x38ec, 0x38ec, 0x38eb, 0x38eb, 0x38eb, 0x38ea, 0x38ea, 0x38ea, 0x38e9, 0x38e9, 0x38e9, 0x38e9, 0x38e8, 0x38e8, 0x38e8, 0x38e7, 0x38e7, 0x38e7, 0x38e6, 0x38e6, 0x38e6, 0x38e5, 0x38e5, 0x38e5, 0x38e5, 0x38e4, 0x38e4, 0x38e4, 0x38e3, 0x38e3, 0x38e3, 0x38e2, 0x38e2, 0x38e2, 0x38e1, 0x38e1, 0x38e1, 0x38e1, 0x38e0, 0x38e0, 0x38e0, 0x38df, 0x38df, 0x38df, 0x38de, 0x38de, 0x38de, 0x38de, 0x38dd, 0x38dd, 0x38dd, 0x38dc, 0x38dc, 0x38dc, 0x38db, 0x38db, 0x38db, 0x38da, 0x38da, 0x38da, 0x38d9, 0x38d8, 0x38d8, 0x38d7, 0x38d7, 0x38d6, 0x38d5, 0x38d5, 0x38d4, 0x38d4, 0x38d3, 0x38d2, 0x38d2, 0x38d1, 0x38d1, 0x38d0, 0x38cf, 0x38cf, 0x38ce, 0x38ce, 0x38cd, 0x38cc, 0x38cc, 0x38cb, 0x38cb, 0x38ca, 0x38c9, 0x38c9, 0x38c8, 0x38c8, 0x38c7, 0x38c6, 0x38c6, 0x38c5, 0x38c5, 0x38c4, 0x38c3, 0x38c3, 0x38c2, 0x38c2, 0x38c1, 0x38c0, 0x38c0, 0x38bf, 0x38bf, 0x38be, 0x38bd, 0x38bd, 0x38bc, 0x38bc, 0x38bb, 0x38ba, 0x38ba, 0x38b9, 0x38b9, 0x38b8, 0x38b7, 0x38b7, 0x38b6, 0x38b6, 0x38b5, 0x38b5, 0x38b4, 0x38b3, 0x38b3, 0x38b2, 0x38b2, 0x38b1, 0x38b0, 0x38b0, 0x38af, 0x38af, 0x38ae, 0x38ae, 0x38ad, 0x38ac, 0x38ac, 0x38ab, 0x38ab, 0x38aa, 0x38a9, 0x38a9, 0x38a8, 0x38a8, 0x38a7, 0x38a7, 0x38a6, 0x38a5, 0x38a5, 0x38a4, 0x38a4, 0x38a3, 0x38a2, 0x38a2, 0x38a1, 0x38a1, 0x38a0, 0x38a0, 0x389f, 0x389e, 0x389e, 0x389d, 0x389d, 0x389c, 0x389c, 0x389b, 0x389a, 0x389a, 0x3899, 0x3899, 0x3898, 0x3897, 0x3897, 0x3896, 0x3896, 0x3895, 0x3895, 0x3894, 0x3893, 0x3893, 0x3892, 0x3892, 0x3891, 0x3891, 0x3890, 0x388f, 0x388f, 0x388e, 0x388e, 0x388d, 0x388d, 0x388c, 0x388c, 0x388b, 0x388a, 0x388a, 0x3889, 0x3889, 0x3888, 0x3888, 0x3887, 0x3886, 0x3886, 0x3885, 0x3885, 0x3884, 0x3884, 0x3883, 0x3882, 0x3882, 0x3881, 0x3881, 0x3880, 0x3880, 0x387f, 0x387f, 0x387e, 0x387d, 0x387d, 0x387c, 0x387c, 0x387b, 0x387b, 0x387a, 0x3879, 0x3879, 0x3878, 0x3878, 0x3877, 0x3877, 0x3876, 0x3876, 0x3875, 0x3874, 0x3874, 0x3873, 0x3873, 0x3872, 0x3872, 0x3871, 0x3871, 0x3870, 0x386f, 0x386f, 0x386e, 0x386e, 0x386d, 0x386d, 0x386c, 0x386c, 0x386b, 0x386a, 0x386a, 0x3869, 0x3869, 0x3868, 0x3868, 0x3867, 0x3867, 0x3866, 0x3866, 0x3865, 0x3864, 0x3864, 0x3863, 0x3863, 0x3862, 0x3862, 0x3861, 0x3861, 0x3860, 0x385f, 0x385f, 0x385e, 0x385e, 0x385d, 0x385d, 0x385c, 0x385c, 0x385b, 0x385b, 0x385a, 0x3859, 0x3859, 0x3858, 0x3858, 0x3857, 0x3857, 0x3856, 0x3856, 0x3855, 0x3855, 0x3854, 0x3854, 0x3853, 0x3852, 0x3852, 0x3851, 0x3851, 0x3850, 0x3850, 0x384f, 0x384f, 0x384e, 0x384e, 0x384d, 0x384d, 0x384c, 0x384b, 0x384b, 0x384a, 0x384a, 0x3849, 0x3849, 0x3848, 0x3848, 0x3847, 0x3847, 0x3846, 0x3846, 0x3845, 0x3844, 0x3844, 0x3843, 0x3843, 0x3842, 0x3842, 0x3841, 0x3841, 0x3840, 0x3840, 0x383f, 0x383f, 0x383e, 0x383e, 0x383d, 0x383d, 0x383c, 0x383b, 0x383b, 0x383a, 0x383a, 0x3839, 0x3839, 0x3838, 0x3838, 0x3837, 0x3837, 0x3836, 0x3836, 0x3835, 0x3835, 0x3834, 0x3834, 0x3833, 0x3832, 0x3832, 0x3831, 0x3831, 0x3830, 0x3830, 0x382f, 0x382f, 0x382e, 0x382e, 0x382d, 0x382d, 0x382c, 0x382c, 0x382b, 0x382b, 0x382a, 0x382a, 0x3829, 0x3829, 0x3828, 0x3828, 0x3827, 0x3826, 0x3826, 0x3825, 0x3825, 0x3824, 0x3824, 0x3823, 0x3823, 0x3822, 0x3822, 0x3821, 0x3821, 0x3820, 0x3820, 0x381f, 0x381f, 0x381e, 0x381e, 0x381d, 0x381d, 0x381c, 0x381c, 0x381b, 0x381b, 0x381a, 0x381a, 0x3819, 0x3819, 0x3818, 0x3818, 0x3817, 0x3817, 0x3816, 0x3816, 0x3815, 0x3814, 0x3814, 0x3813, 0x3813, 0x3812, 0x3812, 0x3811, 0x3811, 0x3810, 0x3810, 0x380f, 0x380f, 0x380e, 0x380e, 0x380d, 0x380d, 0x380c, 0x380c, 0x380b, 0x380b, 0x380a, 0x380a, 0x3809, 0x3809, 0x3808, 0x3808, 0x3807, 0x3807, 0x3806, 0x3806, 0x3805, 0x3805, 0x3804, 0x3804, 0x3803, 0x3803, 0x3802, 0x3802, 0x3801, 0x3801, 0x3800, 0x3800, 0x37ff, 0x37fe, 0x37fd, 0x37fc, 0x37fb, 0x37fa, 0x37f9, 0x37f8, 0x37f7, 0x37f6, 0x37f5, 0x37f4, 0x37f3, 0x37f2, 0x37f1, 0x37f0, 0x37ef, 0x37ee, 0x37ed, 0x37ec, 0x37eb, 0x37ea, 0x37e9, 0x37e8, 0x37e7, 0x37e6, 0x37e5, 0x37e4, 0x37e3, 0x37e2, 0x37e1, 0x37e0, 0x37df, 0x37de, 0x37dd, 0x37dc, 0x37db, 0x37da, 0x37d9, 0x37d8, 0x37d7, 0x37d6, 0x37d5, 0x37d4, 0x37d3, 0x37d2, 0x37d1, 0x37d0, 0x37cf, 0x37ce, 0x37cd, 0x37cc, 0x37cb, 0x37ca, 0x37c9, 0x37c8, 0x37c7, 0x37c6, 0x37c5, 0x37c4, 0x37c3, 0x37c3, 0x37c2, 0x37c1, 0x37c0, 0x37bf, 0x37be, 0x37bd, 0x37bc, 0x37bb, 0x37ba, 0x37b9, 0x37b8, 0x37b7, 0x37b6, 0x37b5, 0x37b4, 0x37b3, 0x37b2, 0x37b1, 0x37b0, 0x37af, 0x37ae, 0x37ad, 0x37ac, 0x37ab, 0x37aa, 0x37a9, 0x37a8, 0x37a8, 0x37a7, 0x37a6, 0x37a5, 0x37a4, 0x37a3, 0x37a2, 0x37a1, 0x37a0, 0x379f, 0x379e, 0x379d, 0x379c, 0x379b, 0x379a, 0x3799, 0x3798, 0x3797, 0x3796, 0x3795, 0x3794, 0x3794, 0x3793, 0x3792, 0x3791, 0x3790, 0x378f, 0x378e, 0x378d, 0x378c, 0x378b, 0x378a, 0x3789, 0x3788, 0x3787, 0x3786, 0x3785, 0x3784, 0x3784, 0x3783, 0x3782, 0x3781, 0x3780, 0x377f, 0x377e, 0x377d, 0x377c, 0x377b, 0x377a, 0x3779, 0x3778, 0x3777, 0x3776, 0x3775, 0x3775, 0x3774, 0x3773, 0x3772, 0x3771, 0x3770, 0x376f, 0x376e, 0x376d, 0x376c, 0x376b, 0x376a, 0x3769, 0x3768, 0x3768, 0x3767, 0x3766, 0x3765, 0x3764, 0x3763, 0x3762, 0x3761, 0x3760, 0x375f, 0x375e, 0x375d, 0x375c, 0x375c, 0x375b, 0x375a, 0x3759, 0x3758, 0x3757, 0x3756, 0x3755, 0x3754, 0x3753, 0x3752, 0x3751, 0x3751, 0x3750, 0x374f, 0x374e, 0x374d, 0x374c, 0x374b, 0x374a, 0x3749, 0x3748, 0x3747, 0x3747, 0x3746, 0x3745, 0x3744, 0x3743, 0x3742, 0x3741, 0x3740, 0x373f, 0x373e, 0x373d, 0x373d, 0x373c, 0x373b, 0x373a, 0x3739, 0x3738, 0x3737, 0x3736, 0x3735, 0x3734, 0x3734, 0x3733, 0x3732, 0x3731, 0x3730, 0x372f, 0x372e, 0x372d, 0x372c, 0x372b, 0x372b, 0x372a, 0x3729, 0x3728, 0x3727, 0x3726, 0x3725, 0x3724, 0x3723, 0x3722, 0x3722, 0x3721, 0x3720, 0x371f, 0x371e, 0x371d, 0x371c, 0x371b, 0x371a, 0x371a, 0x3719, 0x3718, 0x3717, 0x3716, 0x3715, 0x3714, 0x3713, 0x3713, 0x3712, 0x3711, 0x3710, 0x370f, 0x370e, 0x370d, 0x370c, 0x370b, 0x370b, 0x370a, 0x3709, 0x3708, 0x3707, 0x3706, 0x3705, 0x3704, 0x3704, 0x3703, 0x3702, 0x3701, 0x3700, 0x36ff, 0x36fe, 0x36fd, 0x36fd, 0x36fc, 0x36fb, 0x36fa, 0x36f9, 0x36f8, 0x36f7, 0x36f6, 0x36f6, 0x36f5, 0x36f4, 0x36f3, 0x36f2, 0x36f1, 0x36f0, 0x36ef, 0x36ef, 0x36ee, 0x36ed, 0x36ec, 0x36eb, 0x36ea, 0x36e9, 0x36e9, 0x36e8, 0x36e7, 0x36e6, 0x36e5, 0x36e4, 0x36e3, 0x36e3, 0x36e2, 0x36e1, 0x36e0, 0x36df, 0x36de, 0x36dd, 0x36dd, 0x36dc, 0x36db, 0x36da, 0x36d9, 0x36d8, 0x36d7, 0x36d7, 0x36d6, 0x36d5, 0x36d4, 0x36d3, 0x36d2, 0x36d1, 0x36d1, 0x36d0, 0x36cf, 0x36ce, 0x36cd, 0x36cc, 0x36cb, 0x36cb, 0x36ca, 0x36c9, 0x36c8, 0x36c7, 0x36c6, 0x36c6, 0x36c5, 0x36c4, 0x36c3, 0x36c2, 0x36c1, 0x36c0, 0x36c0, 0x36bf, 0x36be, 0x36bd, 0x36bc, 0x36bb, 0x36bb, 0x36ba, 0x36b9, 0x36b8, 0x36b7, 0x36b6, 0x36b6, 0x36b5, 0x36b4, 0x36b3, 0x36b2, 0x36b1, 0x36b0, 0x36b0, 0x36af, 0x36ae, 0x36ad, 0x36ac, 0x36ab, 0x36ab, 0x36aa, 0x36a9, 0x36a8, 0x36a7, 0x36a6, 0x36a6, 0x36a5, 0x36a4, 0x36a3, 0x36a2, 0x36a1, 0x36a1, 0x36a0, 0x369f, 0x369e, 0x369d, 0x369d, 0x369c, 0x369b, 0x369a, 0x3699, 0x3698, 0x3698, 0x3697, 0x3696, 0x3695, 0x3694, 0x3693, 0x3693, 0x3692, 0x3691, 0x3690, 0x368f, 0x368f, 0x368e, 0x368d, 0x368c, 0x368b, 0x368a, 0x368a, 0x3689, 0x3688, 0x3687, 0x3686, 0x3686, 0x3685, 0x3684, 0x3683, 0x3682, 0x3681, 0x3681, 0x3680, 0x367f, 0x367e, 0x367d, 0x367d, 0x367c, 0x367b, 0x367a, 0x3679, 0x3679, 0x3678, 0x3677, 0x3676, 0x3675, 0x3675, 0x3674, 0x3673, 0x3672, 0x3671, 0x3670, 0x3670, 0x366f, 0x366e, 0x366d, 0x366c, 0x366c, 0x366b, 0x366a, 0x3669, 0x3668, 0x3668, 0x3667, 0x3666, 0x3665, 0x3664, 0x3664, 0x3663, 0x3662, 0x3661, 0x3660, 0x3660, 0x365f, 0x365e, 0x365d, 0x365c, 0x365c, 0x365b, 0x365a, 0x3659, 0x3659, 0x3658, 0x3657, 0x3656, 0x3655, 0x3655, 0x3654, 0x3653, 0x3652, 0x3651, 0x3651, 0x3650, 0x364f, 0x364e, 0x364d, 0x364d, 0x364c, 0x364b, 0x364a, 0x364a, 0x3649, 0x3648, 0x3647, 0x3646, 0x3646, 0x3645, 0x3644, 0x3643, 0x3642, 0x3642, 0x3641, 0x3640, 0x363f, 0x363f, 0x363e, 0x363d, 0x363c, 0x363b, 0x363b, 0x363a, 0x3639, 0x3638, 0x3638, 0x3637, 0x3636, 0x3635, 0x3634, 0x3634, 0x3633, 0x3632, 0x3631, 0x3631, 0x3630, 0x362f, 0x362e, 0x362d, 0x362d, 0x362c, 0x362b, 0x362a, 0x362a, 0x3629, 0x3628, 0x3627, 0x3627, 0x3626, 0x3625, 0x3624, 0x3623, 0x3623, 0x3622, 0x3621, 0x3620, 0x3620, 0x361f, 0x361e, 0x361d, 0x361d, 0x361c, 0x361b, 0x361a, 0x361a, 0x3619, 0x3618, 0x3617, 0x3616, 0x3616, 0x3615, 0x3614, 0x3613, 0x3613, 0x3612, 0x3611, 0x3610, 0x3610, 0x360f, 0x360e, 0x360d, 0x360d, 0x360c, 0x360b, 0x360a, 0x360a, 0x3609, 0x3608, 0x3607, 0x3607, 0x3606, 0x3605, 0x3604, 0x3604, 0x3603, 0x3602, 0x3601, 0x3601, 0x3600, 0x35ff, 0x35fe, 0x35fe, 0x35fd, 0x35fc, 0x35fb, 0x35fb, 0x35fa, 0x35f9, 0x35f8, 0x35f8, 0x35f7, 0x35f6, 0x35f5, 0x35f5, 0x35f4, 0x35f3, 0x35f2, 0x35f2, 0x35f1, 0x35f0, 0x35ef, 0x35ef, 0x35ee, 0x35ed, 0x35ec, 0x35ec, 0x35eb, 0x35ea, 0x35e9, 0x35e9, 0x35e8, 0x35e7, 0x35e7, 0x35e6, 0x35e5, 0x35e4, 0x35e4, 0x35e3, 0x35e1, 0x35e0, 0x35de, 0x35dd, 0x35db, 0x35da, 0x35d9, 0x35d7, 0x35d6, 0x35d4, 0x35d3, 0x35d1, 0x35d0, 0x35ce, 0x35cd, 0x35cb, 0x35ca, 0x35c9, 0x35c7, 0x35c6, 0x35c4, 0x35c3, 0x35c1, 0x35c0, 0x35be, 0x35bd, 0x35bc, 0x35ba, 0x35b9, 0x35b7, 0x35b6, 0x35b4, 0x35b3, 0x35b2, 0x35b0, 0x35af, 0x35ad, 0x35ac, 0x35ab, 0x35a9, 0x35a8, 0x35a6, 0x35a5, 0x35a3, 0x35a2, 0x35a1, 0x359f, 0x359e, 0x359c, 0x359b, 0x359a, 0x3598, 0x3597, 0x3595, 0x3594, 0x3593, 0x3591, 0x3590, 0x358e, 0x358d, 0x358c, 0x358a, 0x3589, 0x3588, 0x3586, 0x3585, 0x3583, 0x3582, 0x3581, 0x357f, 0x357e, 0x357d, 0x357b, 0x357a, 0x3578, 0x3577, 0x3576, 0x3574, 0x3573, 0x3572, 0x3570, 0x356f, 0x356e, 0x356c, 0x356b, 0x3569, 0x3568, 0x3567, 0x3565, 0x3564, 0x3563, 0x3561, 0x3560, 0x355f, 0x355d, 0x355c, 0x355b, 0x3559, 0x3558, 0x3557, 0x3555, 0x3554, 0x3553, 0x3551, 0x3550, 0x354f, 0x354d, 0x354c, 0x354b, 0x3549, 0x3548, 0x3547, 0x3545, 0x3544, 0x3543, 0x3541, 0x3540, 0x353f, 0x353e, 0x353c, 0x353b, 0x353a, 0x3538, 0x3537, 0x3536, 0x3534, 0x3533, 0x3532, 0x3530, 0x352f, 0x352e, 0x352d, 0x352b, 0x352a, 0x3529, 0x3527, 0x3526, 0x3525, 0x3524, 0x3522, 0x3521, 0x3520, 0x351e, 0x351d, 0x351c, 0x351b, 0x3519, 0x3518, 0x3517, 0x3516, 0x3514, 0x3513, 0x3512, 0x3510, 0x350f, 0x350e, 0x350d, 0x350b, 0x350a, 0x3509, 0x3508, 0x3506, 0x3505, 0x3504, 0x3503, 0x3501, 0x3500, 0x34ff, 0x34fe, 0x34fc, 0x34fb, 0x34fa, 0x34f9, 0x34f7, 0x34f6, 0x34f5, 0x34f4, 0x34f2, 0x34f1, 0x34f0, 0x34ef, 0x34ed, 0x34ec, 0x34eb, 0x34ea, 0x34e9, 0x34e7, 0x34e6, 0x34e5, 0x34e4, 0x34e2, 0x34e1, 0x34e0, 0x34df, 0x34de, 0x34dc, 0x34db, 0x34da, 0x34d9, 0x34d7, 0x34d6, 0x34d5, 0x34d4, 0x34d3, 0x34d1, 0x34d0, 0x34cf, 0x34ce, 0x34cd, 0x34cb, 0x34ca, 0x34c9, 0x34c8, 0x34c7, 0x34c5, 0x34c4, 0x34c3, 0x34c2, 0x34c1, 0x34c0, 0x34be, 0x34bd, 0x34bc, 0x34bb, 0x34ba, 0x34b8, 0x34b7, 0x34b6, 0x34b5, 0x34b4, 0x34b3, 0x34b1, 0x34b0, 0x34af, 0x34ae, 0x34ad, 0x34ac, 0x34aa, 0x34a9, 0x34a8, 0x34a7, 0x34a6, 0x34a5, 0x34a3, 0x34a2, 0x34a1, 0x34a0, 0x349f, 0x349e, 0x349c, 0x349b, 0x349a, 0x3499, 0x3498, 0x3497, 0x3496, 0x3494, 0x3493, 0x3492, 0x3491, 0x3490, 0x348f, 0x348e, 0x348c, 0x348b, 0x348a, 0x3489, 0x3488, 0x3487, 0x3486, 0x3484, 0x3483, 0x3482, 0x3481, 0x3480, 0x347f, 0x347e, 0x347d, 0x347b, 0x347a, 0x3479, 0x3478, 0x3477, 0x3476, 0x3475, 0x3474, 0x3473, 0x3471, 0x3470, 0x346f, 0x346e, 0x346d, 0x346c, 0x346b, 0x346a, 0x3469, 0x3467, 0x3466, 0x3465, 0x3464, 0x3463, 0x3462, 0x3461, 0x3460, 0x345f, 0x345e, 0x345d, 0x345b, 0x345a, 0x3459, 0x3458, 0x3457, 0x3456, 0x3455, 0x3454, 0x3453, 0x3452, 0x3451, 0x3450, 0x344e, 0x344d, 0x344c, 0x344b, 0x344a, 0x3449, 0x3448, 0x3447, 0x3446, 0x3445, 0x3444, 0x3443, 0x3442, 0x3441, 0x343f, 0x343e, 0x343d, 0x343c, 0x343b, 0x343a, 0x3439, 0x3438, 0x3437, 0x3436, 0x3435, 0x3434, 0x3433, 0x3432, 0x3431, 0x3430, 0x342f, 0x342e, 0x342d, 0x342b, 0x342a, 0x3429, 0x3428, 0x3427, 0x3426, 0x3425, 0x3424, 0x3423, 0x3422, 0x3421, 0x3420, 0x341f, 0x341e, 0x341d, 0x341c, 0x341b, 0x341a, 0x3419, 0x3418, 0x3417, 0x3416, 0x3415, 0x3414, 0x3413, 0x3412, 0x3411, 0x3410, 0x340f, 0x340e, 0x340d, 0x340c, 0x340b, 0x340a, 0x3409, 0x3408, 0x3407, 0x3406, 0x3405, 0x3404, 0x3403, 0x3402, 0x3401, 0x33ff, 0x33fd, 0x33fb, 0x33f9, 0x33f7, 0x33f5, 0x33f3, 0x33f1, 0x33ef, 0x33ed, 0x33eb, 0x33e9, 0x33e7, 0x33e5, 0x33e3, 0x33e1, 0x33df, 0x33dd, 0x33db, 0x33d9, 0x33d8, 0x33d6, 0x33d4, 0x33d2, 0x33d0, 0x33ce, 0x33cc, 0x33ca, 0x33c8, 0x33c6, 0x33c4, 0x33c2, 0x33c0, 0x33be, 0x33bc, 0x33ba, 0x33b8, 0x33b6, 0x33b5, 0x33b3, 0x33b1, 0x33af, 0x33ad, 0x33ab, 0x33a9, 0x33a7, 0x33a5, 0x33a3, 0x33a1, 0x339f, 0x339e, 0x339c, 0x339a, 0x3398, 0x3396, 0x3394, 0x3392, 0x3390, 0x338e, 0x338d, 0x338b, 0x3389, 0x3387, 0x3385, 0x3383, 0x3381, 0x337f, 0x337d, 0x337c, 0x337a, 0x3378, 0x3376, 0x3374, 0x3372, 0x3370, 0x336f, 0x336d, 0x336b, 0x3369, 0x3367, 0x3365, 0x3363, 0x3362, 0x3360, 0x335e, 0x335c, 0x335a, 0x3358, 0x3357, 0x3355, 0x3353, 0x3351, 0x334f, 0x334d, 0x334c, 0x334a, 0x3348, 0x3346, 0x3344, 0x3342, 0x3341, 0x333f, 0x333d, 0x333b, 0x3339, 0x3338, 0x3336, 0x3334, 0x3332, 0x3330, 0x332f, 0x332d, 0x332b, 0x3329, 0x3327, 0x3326, 0x3324, 0x3322, 0x3320, 0x331f, 0x331d, 0x331b, 0x3319, 0x3317, 0x3316, 0x3314, 0x3312, 0x3310, 0x330f, 0x330d, 0x330b, 0x3309, 0x3308, 0x3306, 0x3304, 0x3302, 0x3301, 0x32ff, 0x32fd, 0x32fb, 0x32fa, 0x32f8, 0x32f6, 0x32f4, 0x32f3, 0x32f1, 0x32ef, 0x32ed, 0x32ec, 0x32ea, 0x32e8, 0x32e6, 0x32e5, 0x32e3, 0x32e1, 0x32e0, 0x32de, 0x32dc, 0x32da, 0x32d9, 0x32d7, 0x32d5, 0x32d4, 0x32d2, 0x32d0, 0x32ce, 0x32cd, 0x32cb, 0x32c9, 0x32c8, 0x32c6, 0x32c4, 0x32c3, 0x32c1, 0x32bf, 0x32be, 0x32bc, 0x32ba, 0x32b8, 0x32b7, 0x32b5, 0x32b3, 0x32b2, 0x32b0, 0x32ae, 0x32ad, 0x32ab, 0x32a9, 0x32a8, 0x32a6, 0x32a4, 0x32a3, 0x32a1, 0x329f, 0x329e, 0x329c, 0x329b, 0x3299, 0x3297, 0x3296, 0x3294, 0x3292, 0x3291, 0x328f, 0x328d, 0x328c, 0x328a, 0x3288, 0x3287, 0x3285, 0x3284, 0x3282, 0x3280, 0x327f, 0x327d, 0x327b, 0x327a, 0x3278, 0x3277, 0x3275, 0x3273, 0x3272, 0x3270, 0x326f, 0x326d, 0x326b, 0x326a, 0x3268, 0x3267, 0x3265, 0x3263, 0x3262, 0x3260, 0x325f, 0x325d, 0x325b, 0x325a, 0x3258, 0x3257, 0x3255, 0x3253, 0x3252, 0x3250, 0x324f, 0x324d, 0x324c, 0x324a, 0x3248, 0x3247, 0x3245, 0x3244, 0x3242, 0x3241, 0x323f, 0x323d, 0x323c, 0x323a, 0x3239, 0x3237, 0x3236, 0x3234, 0x3233, 0x3231, 0x322f, 0x322e, 0x322c, 0x322b, 0x3229, 0x3228, 0x3226, 0x3225, 0x3223, 0x3222, 0x3220, 0x321f, 0x321d, 0x321b, 0x321a, 0x3218, 0x3217, 0x3215, 0x3214, 0x3212, 0x3211, 0x320f, 0x320e, 0x320c, 0x320b, 0x3209, 0x3208, 0x3206, 0x3205, 0x3203, 0x3202, 0x3200, 0x31ff, 0x31fd, 0x31fc, 0x31fa, 0x31f9, 0x31f7, 0x31f6, 0x31f4, 0x31f3, 0x31f1, 0x31f0, 0x31ee, 0x31ed, 0x31eb, 0x31ea, 0x31e8, 0x31e7, 0x31e5, 0x31e4, 0x31e3, 0x31e1, 0x31e0, 0x31de, 0x31dd, 0x31db, 0x31da, 0x31d8, 0x31d7, 0x31d5, 0x31d4, 0x31d2, 0x31d1, 0x31d0, 0x31ce, 0x31cd, 0x31cb, 0x31ca, 0x31c8, 0x31c7, 0x31c5, 0x31c4, 0x31c2, 0x31c1, 0x31c0, 0x31be, 0x31bd, 0x31bb, 0x31ba, 0x31b8, 0x31b7, 0x31b6, 0x31b4, 0x31b3, 0x31b1, 0x31b0, 0x31ae, 0x31ad, 0x31ac, 0x31aa, 0x31a9, 0x31a7, 0x31a6, 0x31a5, 0x31a3, 0x31a2, 0x31a0, 0x319f, 0x319e, 0x319c, 0x319b, 0x3199, 0x3198, 0x3197, 0x3195, 0x3194, 0x3192, 0x3191, 0x3190, 0x318e, 0x318d, 0x318b, 0x318a, 0x3189, 0x3187, 0x3186, 0x3184, 0x3183, 0x3182, 0x3180, 0x317f, 0x317e, 0x317c, 0x317b, 0x3179, 0x3178, 0x3177, 0x3175, 0x3174, 0x3173, 0x3171, 0x3170, 0x316f, 0x316d, 0x316c, 0x316b, 0x3169, 0x3168, 0x3166, 0x3165, 0x3164, 0x3162, 0x3161, 0x3160, 0x315e, 0x315d, 0x315c, 0x315a, 0x3159, 0x3158, 0x3156, 0x3155, 0x3154, 0x3152, 0x3151, 0x3150, 0x314e, 0x314d, 0x314c, 0x314a, 0x3149, 0x3148, 0x3146, 0x3145, 0x3144, 0x3142, 0x3141, 0x3140, 0x313f, 0x313d, 0x313c, 0x313b, 0x3139, 0x3138, 0x3137, 0x3135, 0x3134, 0x3133, 0x3131, 0x3130, 0x312f, 0x312e, 0x312c, 0x312b, 0x312a, 0x3128, 0x3127, 0x3126, 0x3125, 0x3123, 0x3122, 0x3121, 0x311f, 0x311e, 0x311d, 0x311c, 0x311a, 0x3119, 0x3118, 0x3117, 0x3115, 0x3114, 0x3113, 0x3111, 0x3110, 0x310f, 0x310e, 0x310c, 0x310b, 0x310a, 0x3109, 0x3107, 0x3106, 0x3105, 0x3104, 0x3102, 0x3101, 0x3100, 0x30ff, 0x30fd, 0x30fc, 0x30fb, 0x30fa, 0x30f8, 0x30f7, 0x30f6, 0x30f5, 0x30f3, 0x30f2, 0x30f1, 0x30f0, 0x30ee, 0x30ed, 0x30ec, 0x30eb, 0x30ea, 0x30e8, 0x30e7, 0x30e6, 0x30e5, 0x30e3, 0x30e2, 0x30e1, 0x30e0, 0x30df, 0x30dd, 0x30dc, 0x30db, 0x30da, 0x30d8, 0x30d7, 0x30d6, 0x30d5, 0x30d4, 0x30d2, 0x30d1, 0x30d0, 0x30cf, 0x30ce, 0x30cc, 0x30cb, 0x30ca, 0x30c9, 0x30c8, 0x30c6, 0x30c5, 0x30c4, 0x30c3, 0x30c2, 0x30c0, 0x30bf, 0x30be, 0x30bd, 0x30bc, 0x30bb, 0x30b9, 0x30b8, 0x30b7, 0x30b6, 0x30b5, 0x30b3, 0x30b2, 0x30b1, 0x30b0, 0x30af, 0x30ae, 0x30ac, 0x30ab, 0x30aa, 0x30a9, 0x30a8, 0x30a7, 0x30a5, 0x30a4, 0x30a3, 0x30a2, 0x30a1, 0x30a0, 0x309e, 0x309d, 0x309c, 0x309b, 0x309a, 0x3099, 0x3098, 0x3096, 0x3095, 0x3094, 0x3093, 0x3092, 0x3091, 0x3090, 0x308e, 0x308d, 0x308c, 0x308b, 0x308a, 0x3089, 0x3088, 0x3086, 0x3085, 0x3084, 0x3083, 0x3082, 0x3081, 0x3080, 0x307f, 0x307d, 0x307c, 0x307b, 0x307a, 0x3079, 0x3078, 0x3077, 0x3076, 0x3075, 0x3073, 0x3072, 0x3071, 0x3070, 0x306f, 0x306e, 0x306d, 0x306c, 0x306b, 0x3069, 0x3068, 0x3067, 0x3066, 0x3065, 0x3064, 0x3063, 0x3062, 0x3061, 0x3060, 0x305e, 0x305d, 0x305c, 0x305b, 0x305a, 0x3059, 0x3058, 0x3057, 0x3056, 0x3055, 0x3053, 0x3050, 0x304e, 0x304c, 0x304a, 0x3048, 0x3046, 0x3043, 0x3041, 0x303f, 0x303d, 0x303b, 0x3039, 0x3037, 0x3035, 0x3033, 0x3030, 0x302e, 0x302c, 0x302a, 0x3028, 0x3026, 0x3024, 0x3022, 0x3020, 0x301e, 0x301c, 0x301a, 0x3018, 0x3016, 0x3014, 0x3011, 0x300f, 0x300d, 0x300b, 0x3009, 0x3007, 0x3005, 0x3003, 0x3001, 0x2fff, 0x2ffb, 0x2ff7, 0x2ff3, 0x2fef, 0x2feb, 0x2fe7, 0x2fe3, 0x2fdf, 0x2fdb, 0x2fd7, 0x2fd3, 0x2fcf, 0x2fcb, 0x2fc7, 0x2fc4, 0x2fc0, 0x2fbc, 0x2fb8, 0x2fb4, 0x2fb0, 0x2fac, 0x2fa9, 0x2fa5, 0x2fa1, 0x2f9d, 0x2f99, 0x2f96, 0x2f92, 0x2f8e, 0x2f8a, 0x2f86, 0x2f83, 0x2f7f, 0x2f7b, 0x2f77, 0x2f74, 0x2f70, 0x2f6c, 0x2f69, 0x2f65, 0x2f61, 0x2f5e, 0x2f5a, 0x2f56, 0x2f52, 0x2f4f, 0x2f4b, 0x2f48, 0x2f44, 0x2f40, 0x2f3d, 0x2f39, 0x2f35, 0x2f32, 0x2f2e, 0x2f2b, 0x2f27, 0x2f23, 0x2f20, 0x2f1c, 0x2f19, 0x2f15, 0x2f12, 0x2f0e, 0x2f0b, 0x2f07, 0x2f04, 0x2f00, 0x2efd, 0x2ef9, 0x2ef6, 0x2ef2, 0x2eef, 0x2eeb, 0x2ee8, 0x2ee4, 0x2ee1, 0x2edd, 0x2eda, 0x2ed7, 0x2ed3, 0x2ed0, 0x2ecc, 0x2ec9, 0x2ec6, 0x2ec2, 0x2ebf, 0x2ebb, 0x2eb8, 0x2eb5, 0x2eb1, 0x2eae, 0x2eab, 0x2ea7, 0x2ea4, 0x2ea1, 0x2e9d, 0x2e9a, 0x2e97, 0x2e94, 0x2e90, 0x2e8d, 0x2e8a, 0x2e86, 0x2e83, 0x2e80, 0x2e7d, 0x2e79, 0x2e76, 0x2e73, 0x2e70, 0x2e6d, 0x2e69, 0x2e66, 0x2e63, 0x2e60, 0x2e5d, 0x2e59, 0x2e56, 0x2e53, 0x2e50, 0x2e4d, 0x2e4a, 0x2e46, 0x2e43, 0x2e40, 0x2e3d, 0x2e3a, 0x2e37, 0x2e34, 0x2e31, 0x2e2e, 0x2e2a, 0x2e27, 0x2e24, 0x2e21, 0x2e1e, 0x2e1b, 0x2e18, 0x2e15, 0x2e12, 0x2e0f, 0x2e0c, 0x2e09, 0x2e06, 0x2e03, 0x2e00, 0x2dfd, 0x2dfa, 0x2df7, 0x2df4, 0x2df1, 0x2dee, 0x2deb, 0x2de8, 0x2de5, 0x2de2, 0x2ddf, 0x2ddc, 0x2dd9, 0x2dd6, 0x2dd4, 0x2dd1, 0x2dce, 0x2dcb, 0x2dc8, 0x2dc5, 0x2dc2, 0x2dbf, 0x2dbc, 0x2dba, 0x2db7, 0x2db4, 0x2db1, 0x2dae, 0x2dab, 0x2da8, 0x2da6, 0x2da3, 0x2da0, 0x2d9d, 0x2d9a, 0x2d98, 0x2d95, 0x2d92, 0x2d8f, 0x2d8c, 0x2d8a, 0x2d87, 0x2d84, 0x2d81, 0x2d7f, 0x2d7c, 0x2d79, 0x2d76, 0x2d74, 0x2d71, 0x2d6e, 0x2d6c, 0x2d69, 0x2d66, 0x2d63, 0x2d61, 0x2d5e, 0x2d5b, 0x2d59, 0x2d56, 0x2d53, 0x2d51, 0x2d4e, 0x2d4b, 0x2d49, 0x2d46, 0x2d44, 0x2d41, 0x2d3e, 0x2d3c, 0x2d39, 0x2d36, 0x2d34, 0x2d31, 0x2d2f, 0x2d2c, 0x2d29, 0x2d27, 0x2d24, 0x2d22, 0x2d1f, 0x2d1d, 0x2d1a, 0x2d18, 0x2d15, 0x2d12, 0x2d10, 0x2d0d, 0x2d0b, 0x2d08, 0x2d06, 0x2d03, 0x2d01, 0x2cfe, 0x2cfc, 0x2cf9, 0x2cf7, 0x2cf4, 0x2cf2, 0x2cef, 0x2ced, 0x2cea, 0x2ce8, 0x2ce6, 0x2ce3, 0x2ce1, 0x2cde, 0x2cdc, 0x2cd9, 0x2cd7, 0x2cd5, 0x2cd2, 0x2cd0, 0x2ccd, 0x2ccb, 0x2cc9, 0x2cc6, 0x2cc4, 0x2cc1, 0x2cbf, 0x2cbd, 0x2cba, 0x2cb8, 0x2cb6, 0x2cb3, 0x2cb1, 0x2caf, 0x2cac, 0x2caa, 0x2ca7, 0x2ca5, 0x2ca3, 0x2ca1, 0x2c9e, 0x2c9c, 0x2c9a, 0x2c97, 0x2c95, 0x2c93, 0x2c90, 0x2c8e, 0x2c8c, 0x2c8a, 0x2c87, 0x2c85, 0x2c83, 0x2c81, 0x2c7e, 0x2c7c, 0x2c7a, 0x2c78, 0x2c75, 0x2c73, 0x2c71, 0x2c6f, 0x2c6d, 0x2c6a, 0x2c68, 0x2c66, 0x2c64, 0x2c61, 0x2c5f, 0x2c5d, 0x2c5b, 0x2c59, 0x2c57, 0x2c54, 0x2c52, 0x2c50, 0x2c4e, 0x2c4c, 0x2c4a, 0x2c48, 0x2c45, 0x2c43, 0x2c41, 0x2c3f, 0x2c3d, 0x2c3b, 0x2c39, 0x2c37, 0x2c34, 0x2c32, 0x2c30, 0x2c2e, 0x2c2c, 0x2c2a, 0x2c28, 0x2c26, 0x2c24, 0x2c22, 0x2c20, 0x2c1e, 0x2c1b, 0x2c19, 0x2c17, 0x2c15, 0x2c13, 0x2c11, 0x2c0f, 0x2c0d, 0x2c0b, 0x2c09, 0x2c07, 0x2c05, 0x2c03, 0x2c01, 0x2bfe, 0x2bfa, 0x2bf6, 0x2bf2, 0x2bee, 0x2bea, 0x2be6, 0x2be2, 0x2bdf, 0x2bdb, 0x2bd7, 0x2bd3, 0x2bcf, 0x2bcb, 0x2bc7, 0x2bc3, 0x2bbf, 0x2bbb, 0x2bb8, 0x2bb4, 0x2bb0, 0x2bac, 0x2ba8, 0x2ba4, 0x2ba1, 0x2b9d, 0x2b99, 0x2b95, 0x2b91, 0x2b8e, 0x2b8a, 0x2b86, 0x2b82, 0x2b7f, 0x2b7b, 0x2b77, 0x2b73, 0x2b70, 0x2b6c, 0x2b68, 0x2b64, 0x2b61, 0x2b5d, 0x2b59, 0x2b56, 0x2b52, 0x2b4e, 0x2b4b, 0x2b47, 0x2b44, 0x2b40, 0x2b3c, 0x2b39, 0x2b35, 0x2b31, 0x2b2e, 0x2b2a, 0x2b27, 0x2b23, 0x2b20, 0x2b1c, 0x2b18, 0x2b15, 0x2b11, 0x2b0e, 0x2b0a, 0x2b07, 0x2b03, 0x2b00, 0x2afc, 0x2af9, 0x2af5, 0x2af2, 0x2aee, 0x2aeb, 0x2ae7, 0x2ae4, 0x2ae1, 0x2add, 0x2ada, 0x2ad6, 0x2ad3, 0x2acf, 0x2acc, 0x2ac9, 0x2ac5, 0x2ac2, 0x2abe, 0x2abb, 0x2ab8, 0x2ab4, 0x2ab1, 0x2aae, 0x2aaa, 0x2aa7, 0x2aa4, 0x2aa0, 0x2a9d, 0x2a9a, 0x2a97, 0x2a93, 0x2a90, 0x2a8d, 0x2a89, 0x2a86, 0x2a83, 0x2a80, 0x2a7c, 0x2a79, 0x2a76, 0x2a73, 0x2a6f, 0x2a6c, 0x2a69, 0x2a66, 0x2a63, 0x2a5f, 0x2a5c, 0x2a59, 0x2a56, 0x2a53, 0x2a50, 0x2a4c, 0x2a49, 0x2a46, 0x2a43, 0x2a40, 0x2a3d, 0x2a3a, 0x2a37, 0x2a33, 0x2a30, 0x2a2d, 0x2a2a, 0x2a27, 0x2a24, 0x2a21, 0x2a1e, 0x2a1b, 0x2a18, 0x2a15, 0x2a12, 0x2a0f, 0x2a0c, 0x2a09, 0x2a06, 0x2a03, 0x2a00, 0x29fd, 0x29fa, 0x29f7, 0x29f4, 0x29f1, 0x29ee, 0x29eb, 0x29e8, 0x29e5, 0x29e2, 0x29df, 0x29dc, 0x29d9, 0x29d6, 0x29d3, 0x29d0, 0x29cd, 0x29cb, 0x29c8, 0x29c5, 0x29c2, 0x29bf, 0x29bc, 0x29b9, 0x29b6, 0x29b4, 0x29b1, 0x29ae, 0x29ab, 0x29a8, 0x29a5, 0x29a3, 0x29a0, 0x299d, 0x299a, 0x2997, 0x2995, 0x2992, 0x298f, 0x298c, 0x2989, 0x2987, 0x2984, 0x2981, 0x297e, 0x297c, 0x2979, 0x2976, 0x2973, 0x2971, 0x296e, 0x296b, 0x2969, 0x2966, 0x2963, 0x2960, 0x295e, 0x295b, 0x2958, 0x2956, 0x2953, 0x2950, 0x294e, 0x294b, 0x2948, 0x2946, 0x2943, 0x2941, 0x293e, 0x293b, 0x2939, 0x2936, 0x2934, 0x2931, 0x292e, 0x292c, 0x2929, 0x2927, 0x2924, 0x2921, 0x291f, 0x291c, 0x291a, 0x2917, 0x2915, 0x2912, 0x2910, 0x290d, 0x290b, 0x2908, 0x2906, 0x2903, 0x2901, 0x28fe, 0x28fc, 0x28f9, 0x28f7, 0x28f4, 0x28f2, 0x28ef, 0x28ed, 0x28ea, 0x28e8, 0x28e5, 0x28e3, 0x28e0, 0x28de, 0x28dc, 0x28d9, 0x28d7, 0x28d4, 0x28d2, 0x28cf, 0x28cd, 0x28cb, 0x28c8, 0x28c6, 0x28c3, 0x28c1, 0x28bf, 0x28bc, 0x28ba, 0x28b8, 0x28b5, 0x28b3, 0x28b1, 0x28ae, 0x28ac, 0x28aa, 0x28a7, 0x28a5, 0x28a3, 0x28a0, 0x289e, 0x289c, 0x2899, 0x2897, 0x2895, 0x2892, 0x2890, 0x288e, 0x288c, 0x2889, 0x2887, 0x2885, 0x2883, 0x2880, 0x287e, 0x287c, 0x287a, 0x2877, 0x2875, 0x2873, 0x2871, 0x286e, 0x286c, 0x286a, 0x2868, 0x2866, 0x2863, 0x2861, 0x285f, 0x285d, 0x285b, 0x2859, 0x2856, 0x2854, 0x2852, 0x2850, 0x284e, 0x284c, 0x2849, 0x2847, 0x2845, 0x2843, 0x2841, 0x283f, 0x283d, 0x283b, 0x2838, 0x2836, 0x2834, 0x2832, 0x2830, 0x282e, 0x282c, 0x282a, 0x2828, 0x2826, 0x2824, 0x2821, 0x281f, 0x281d, 0x281b, 0x2819, 0x2817, 0x2815, 0x2813, 0x2811, 0x280f, 0x280d, 0x280b, 0x2809, 0x2807, 0x2805, 0x2803, 0x2801, 0x27fe, 0x27fa, 0x27f6, 0x27f2, 0x27ee, 0x27ea, 0x27e6, 0x27e2, 0x27de, 0x27da, 0x27d6, 0x27d2, 0x27ce, 0x27cb, 0x27c7, 0x27c3, 0x27bf, 0x27bb, 0x27b7, 0x27b3, 0x27af, 0x27ac, 0x27a8, 0x27a4, 0x27a0, 0x279c, 0x2799, 0x2795, 0x2791, 0x278d, 0x2789, 0x2786, 0x2782, 0x277e, 0x277a, 0x2777, 0x2773, 0x276f, 0x276b, 0x2768, 0x2764, 0x2760, 0x275d, 0x2759, 0x2755, 0x2752, 0x274e, 0x274a, 0x2747, 0x2743, 0x273f, 0x273c, 0x2738, 0x2735, 0x2731, 0x272d, 0x272a, 0x2726, 0x2723, 0x271f, 0x271c, 0x2718, 0x2715, 0x2711, 0x270d, 0x270a, 0x2706, 0x2703, 0x26ff, 0x26fc, 0x26f8, 0x26f5, 0x26f1, 0x26ee, 0x26eb, 0x26e7, 0x26e4, 0x26e0, 0x26dd, 0x26d9, 0x26d6, 0x26d2, 0x26cf, 0x26cc, 0x26c8, 0x26c5, 0x26c2, 0x26be, 0x26bb, 0x26b7, 0x26b4, 0x26b1, 0x26ad, 0x26aa, 0x26a7, 0x26a3, 0x26a0, 0x269d, 0x2699, 0x2696, 0x2693, 0x2690, 0x268c, 0x2689, 0x2686, 0x2682, 0x267f, 0x267c, 0x2679, 0x2676, 0x2672, 0x266f, 0x266c, 0x2669, 0x2665, 0x2662, 0x265f, 0x265c, 0x2659, 0x2656, 0x2652, 0x264f, 0x264c, 0x2649, 0x2646, 0x2643, 0x2640, 0x263c, 0x2639, 0x2636, 0x2633, 0x2630, 0x262d, 0x262a, 0x2627, 0x2624, 0x2621, 0x261e, 0x261a, 0x2617, 0x2614, 0x2611, 0x260e, 0x260b, 0x2608, 0x2605, 0x2602, 0x25ff, 0x25fc, 0x25f9, 0x25f6, 0x25f3, 0x25f0, 0x25ed, 0x25ea, 0x25e7, 0x25e4, 0x25e2, 0x25df, 0x25dc, 0x25d9, 0x25d6, 0x25d3, 0x25d0, 0x25cd, 0x25ca, 0x25c7, 0x25c4, 0x25c2, 0x25bf, 0x25bc, 0x25b9, 0x25b6, 0x25b3, 0x25b0, 0x25ae, 0x25ab, 0x25a8, 0x25a5, 0x25a2, 0x259f, 0x259d, 0x259a, 0x2597, 0x2594, 0x2591, 0x258f, 0x258c, 0x2589, 0x2586, 0x2584, 0x2581, 0x257e, 0x257b, 0x2579, 0x2576, 0x2573, 0x2570, 0x256e, 0x256b, 0x2568, 0x2566, 0x2563, 0x2560, 0x255e, 0x255b, 0x2558, 0x2555, 0x2553, 0x2550, 0x254e, 0x254b, 0x2548, 0x2546, 0x2543, 0x2540, 0x253e, 0x253b, 0x2538, 0x2536, 0x2533, 0x2531, 0x252e, 0x252b, 0x2529, 0x2526, 0x2524, 0x2521, 0x251f, 0x251c, 0x2519, 0x2517, 0x2514, 0x2512, 0x250f, 0x250d, 0x250a, 0x2508, 0x2505, 0x2503, 0x2500, 0x24fe, 0x24fb, 0x24f9, 0x24f6, 0x24f4, 0x24f1, 0x24ef, 0x24ec, 0x24ea, 0x24e7, 0x24e5, 0x24e3, 0x24e0, 0x24de, 0x24db, 0x24d9, 0x24d6, 0x24d4, 0x24d2, 0x24cf, 0x24cd, 0x24ca, 0x24c8, 0x24c6, 0x24c3, 0x24c1, 0x24be, 0x24bc, 0x24ba, 0x24b7, 0x24b5, 0x24b3, 0x24b0, 0x24ac, 0x24a7, 0x24a2, 0x249e, 0x2499, 0x2495, 0x2490, 0x248b, 0x2487, 0x2482, 0x247e, 0x2479, 0x2475, 0x2470, 0x246c, 0x2468, 0x2463, 0x245f, 0x245a, 0x2456, 0x2452, 0x244d, 0x2449, 0x2445, 0x2441, 0x243c, 0x2438, 0x2434, 0x2430, 0x242c, 0x2427, 0x2423, 0x241f, 0x241b, 0x2417, 0x2413, 0x240f, 0x240b, 0x2407, 0x2403, 0x23fd, 0x23f5, 0x23ed, 0x23e6, 0x23de, 0x23d6, 0x23ce, 0x23c6, 0x23be, 0x23b7, 0x23af, 0x23a7, 0x23a0, 0x2398, 0x2391, 0x2389, 0x2381, 0x237a, 0x2373, 0x236b, 0x2364, 0x235c, 0x2355, 0x234e, 0x2346, 0x233f, 0x2338, 0x2331, 0x2329, 0x2322, 0x231b, 0x2314, 0x230d, 0x2306, 0x22ff, 0x22f8, 0x22f1, 0x22ea, 0x22e3, 0x22dc, 0x22d6, 0x22cf, 0x22c8, 0x22c1, 0x22ba, 0x22b4, 0x22ad, 0x22a6, 0x22a0, 0x2299, 0x2292, 0x228c, 0x2285, 0x227f, 0x2278, 0x2272, 0x226c, 0x2265, 0x225f, 0x2258, 0x2252, 0x224c, 0x2245, 0x223f, 0x2239, 0x2233, 0x222d, 0x2226, 0x2220, 0x221a, 0x2214, 0x220e, 0x2208, 0x2202, 0x21fc, 0x21f6, 0x21f0, 0x21ea, 0x21e4, 0x21de, 0x21d8, 0x21d3, 0x21cd, 0x21c7, 0x21c1, 0x21bb, 0x21b6, 0x21b0, 0x21aa, 0x21a5, 0x219f, 0x219a, 0x2194, 0x218e, 0x2189, 0x2183, 0x217e, 0x2178, 0x2173, 0x216d, 0x2168, 0x2163, 0x215d, 0x2158, 0x2153, 0x214d, 0x2148, 0x2143, 0x213d, 0x2138, 0x2133, 0x212e, 0x2129, 0x2123, 0x211e, 0x2119, 0x2114, 0x210f, 0x210a, 0x2105, 0x2100, 0x20fb, 0x20f6, 0x20f1, 0x20ec, 0x20e7, 0x20e2, 0x20dd, 0x20d9, 0x20d4, 0x20cf, 0x20ca, 0x20c5, 0x20c1, 0x20bc, 0x20b7, 0x20b2, 0x20ae, 0x20a9, 0x20a4, 0x20a0, 0x209b, 0x2097, 0x2092, 0x208d, 0x2089, 0x2084, 0x2080, 0x207b, 0x2077, 0x2072, 0x206e, 0x206a, 0x2065, 0x2061, 0x205c, 0x2058, 0x2054, 0x204f, 0x204b, 0x2047, 0x2043, 0x203e, 0x203a, 0x2036, 0x2032, 0x202d, 0x2029, 0x2025, 0x2021, 0x201d, 0x2019, 0x2015, 0x2011, 0x200d, 0x2009, 0x2004, 0x2000, 0x1ff9, 0x1ff1, 0x1fe9, 0x1fe1, 0x1fd9, 0x1fd1, 0x1fca, 0x1fc2, 0x1fba, 0x1fb2, 0x1fab, 0x1fa3, 0x1f9c, 0x1f94, 0x1f8c, 0x1f85, 0x1f7d, 0x1f76, 0x1f6e, 0x1f67, 0x1f60, 0x1f58, 0x1f51, 0x1f4a, 0x1f42, 0x1f3b, 0x1f34, 0x1f2d, 0x1f26, 0x1f1e, 0x1f17, 0x1f10, 0x1f09, 0x1f02, 0x1efb, 0x1ef4, 0x1eed, 0x1ee6, 0x1edf, 0x1ed9, 0x1ed2, 0x1ecb, 0x1ec4, 0x1ebd, 0x1eb7, 0x1eb0, 0x1ea9, 0x1ea3, 0x1e9c, 0x1e95, 0x1e8f, 0x1e88, 0x1e82, 0x1e7b, 0x1e75, 0x1e6e, 0x1e68, 0x1e62, 0x1e5b, 0x1e55, 0x1e4f, 0x1e48, 0x1e42, 0x1e3c, 0x1e36, 0x1e2f, 0x1e29, 0x1e23, 0x1e1d, 0x1e17, 0x1e11, 0x1e0b, 0x1e05, 0x1dff, 0x1df9, 0x1df3, 0x1ded, 0x1de7, 0x1de1, 0x1ddb, 0x1dd5, 0x1dcf, 0x1dca, 0x1dc4, 0x1dbe, 0x1db8, 0x1db3, 0x1dad, 0x1da7, 0x1da2, 0x1d9c, 0x1d96, 0x1d91, 0x1d8b, 0x1d86, 0x1d80, 0x1d7b, 0x1d75, 0x1d70, 0x1d6a, 0x1d65, 0x1d60, 0x1d5a, 0x1d55, 0x1d50, 0x1d4a, 0x1d45, 0x1d40, 0x1d3b, 0x1d35, 0x1d30, 0x1d2b, 0x1d26, 0x1d21, 0x1d1b, 0x1d16, 0x1d11, 0x1d0c, 0x1d07, 0x1d02, 0x1cfd, 0x1cf8, 0x1cf3, 0x1cee, 0x1ce9, 0x1ce5, 0x1ce0, 0x1cdb, 0x1cd6, 0x1cd1, 0x1ccc, 0x1cc7, 0x1cc3, 0x1cbe, 0x1cb9, 0x1cb5, 0x1cb0, 0x1cab, 0x1ca6, 0x1ca2, 0x1c9d, 0x1c99, 0x1c94, 0x1c8f, 0x1c8b, 0x1c86, 0x1c82, 0x1c7d, 0x1c79, 0x1c74, 0x1c70, 0x1c6c, 0x1c67, 0x1c63, 0x1c5e, 0x1c5a, 0x1c56, 0x1c51, 0x1c4d, 0x1c49, 0x1c44, 0x1c40, 0x1c3c, 0x1c38, 0x1c34, 0x1c2f, 0x1c2b, 0x1c27, 0x1c23, 0x1c1f, 0x1c1b, 0x1c17, 0x1c12, 0x1c0e, 0x1c0a, 0x1c06, 0x1c02, 0x1bfd, 0x1bf5, 0x1bed, 0x1be5, 0x1bdd, 0x1bd5, 0x1bcd, 0x1bc5, 0x1bbe, 0x1bb6, 0x1bae, 0x1ba7, 0x1b9f, 0x1b97, 0x1b90, 0x1b88, 0x1b81, 0x1b79, 0x1b72, 0x1b6a, 0x1b63, 0x1b5c, 0x1b54, 0x1b4d, 0x1b46, 0x1b3e, 0x1b37, 0x1b30, 0x1b29, 0x1b22, 0x1b1a, 0x1b13, 0x1b0c, 0x1b05, 0x1afe, 0x1af7, 0x1af0, 0x1ae9, 0x1ae2, 0x1adc, 0x1ad5, 0x1ace, 0x1ac7, 0x1ac0, 0x1aba, 0x1ab3, 0x1aac, 0x1aa6, 0x1a9f, 0x1a98, 0x1a92, 0x1a8b, 0x1a85, 0x1a7e, 0x1a78, 0x1a71, 0x1a6b, 0x1a64, 0x1a5e, 0x1a58, 0x1a51, 0x1a4b, 0x1a45, 0x1a3f, 0x1a38, 0x1a32, 0x1a2c, 0x1a26, 0x1a20, 0x1a19, 0x1a13, 0x1a0d, 0x1a07, 0x1a01, 0x19fb, 0x19f5, 0x19ef, 0x19e9, 0x19e4, 0x19de, 0x19d8, 0x19d2, 0x19cc, 0x19c6, 0x19c1, 0x19bb, 0x19b5, 0x19af, 0x19aa, 0x19a4, 0x199f, 0x1999, 0x1993, 0x198e, 0x1988, 0x1983, 0x197d, 0x1978, 0x1972, 0x196d, 0x1967, 0x1962, 0x195d, 0x1957, 0x1952, 0x194d, 0x1947, 0x1942, 0x193d, 0x1938, 0x1932, 0x192d, 0x1928, 0x1923, 0x191e, 0x1919, 0x1914, 0x190f, 0x1909, 0x1904, 0x18ff, 0x18fa, 0x18f5, 0x18f1, 0x18ec, 0x18e7, 0x18e2, 0x18dd, 0x18d8, 0x18d3, 0x18ce, 0x18ca, 0x18c5, 0x18c0, 0x18bb, 0x18b7, 0x18b2, 0x18ad, 0x18a9, 0x18a4, 0x189f, 0x189b, 0x1896, 0x1891, 0x188d, 0x1888, 0x1884, 0x187f, 0x187b, 0x1876, 0x1872, 0x186e, 0x1869, 0x1865, 0x1860, 0x185c, 0x1858, 0x1853, 0x184f, 0x184b, 0x1846, 0x1842, 0x183e, 0x183a, 0x1835, 0x1831, 0x182d, 0x1829, 0x1825, 0x1821, 0x181c, 0x1818, 0x1814, 0x1810, 0x180c, 0x1808, 0x1804, 0x1800, 0x17f8, 0x17f0, 0x17e8, 0x17e0, 0x17d8, 0x17d1, 0x17c9, 0x17c1, 0x17b9, 0x17b2, 0x17aa, 0x17a2, 0x179b, 0x1793, 0x178c, 0x1784, 0x177d, 0x1775, 0x176e, 0x1766, 0x175f, 0x1757, 0x1750, 0x1749, 0x1742, 0x173a, 0x1733, 0x172c, 0x1725, 0x171e, 0x1717, 0x170f, 0x1708, 0x1701, 0x16fa, 0x16f3, 0x16ec, 0x16e6, 0x16df, 0x16d8, 0x16d1, 0x16ca, 0x16c3, 0x16bd, 0x16b6, 0x16af, 0x16a9, 0x16a2, 0x169b, 0x1695, 0x168e, 0x1688, 0x1681, 0x167b, 0x1674, 0x166e, 0x1667, 0x1661, 0x165b, 0x1654, 0x164e, 0x1648, 0x1641, 0x163b, 0x1635, 0x162f, 0x1628, 0x1622, 0x161c, 0x1616, 0x1610, 0x160a, 0x1604, 0x15fe, 0x15f8, 0x15f2, 0x15ec, 0x15e6, 0x15e0, 0x15da, 0x15d5, 0x15cf, 0x15c9, 0x15c3, 0x15bd, 0x15b8, 0x15b2, 0x15ac, 0x15a7, 0x15a1, 0x159b, 0x1596, 0x1590, 0x158b, 0x1585, 0x1580, 0x157a, 0x1575, 0x156f, 0x156a, 0x1564, 0x155f, 0x155a, 0x1554, 0x154f, 0x154a, 0x1544, 0x153f, 0x153a, 0x1535, 0x1530, 0x152a, 0x1525, 0x1520, 0x151b, 0x1516, 0x1511, 0x150c, 0x1507, 0x1502, 0x14fd, 0x14f8, 0x14f3, 0x14ee, 0x14e9, 0x14e4, 0x14df, 0x14da, 0x14d5, 0x14d1, 0x14cc, 0x14c7, 0x14c2, 0x14bd, 0x14b9, 0x14b4, 0x14af, 0x14ab, 0x14a6, 0x14a1, 0x149d, 0x1498, 0x1494, 0x148f, 0x148a, 0x1486, 0x1481, 0x147d, 0x1478, 0x1474, 0x146f, 0x146b, 0x1467, 0x1462, 0x145e, 0x145a, 0x1455, 0x1451, 0x144d, 0x1448, 0x1444, 0x1440, 0x143b, 0x1437, 0x1433, 0x142f, 0x142b, 0x1427, 0x1422, 0x141e, 0x141a, 0x1416, 0x1412, 0x140e, 0x140a, 0x1406, 0x1402, 0x13fc, 0x13f4, 0x13ec, 0x13e4, 0x13dc, 0x13d4, 0x13cc, 0x13c5, 0x13bd, 0x13b5, 0x13ad, 0x13a6, 0x139e, 0x1396, 0x138f, 0x1387, 0x1380, 0x1378, 0x1371, 0x1369, 0x1362, 0x135b, 0x1353, 0x134c, 0x1345, 0x133e, 0x1336, 0x132f, 0x1328, 0x1321, 0x131a, 0x1313, 0x130c, 0x1304, 0x12fd, 0x12f7, 0x12f0, 0x12e9, 0x12e2, 0x12db, 0x12d4, 0x12cd, 0x12c6, 0x12c0, 0x12b9, 0x12b2, 0x12ac, 0x12a5, 0x129e, 0x1298, 0x1291, 0x128b, 0x1284, 0x127d, 0x1277, 0x1271, 0x126a, 0x1264, 0x125d, 0x1257, 0x1251, 0x124a, 0x1244, 0x123e, 0x1238, 0x1231, 0x122b, 0x1225, 0x121f, 0x1219, 0x1213, 0x120d, 0x1207, 0x1201, 0x11fb, 0x11f5, 0x11ef, 0x11e9, 0x11e3, 0x11dd, 0x11d7, 0x11d1, 0x11cc, 0x11c6, 0x11c0, 0x11ba, 0x11b5, 0x11af, 0x11a9, 0x11a4, 0x119e, 0x1198, 0x1193, 0x118d, 0x1188, 0x1182, 0x117d, 0x1177, 0x1172, 0x116c, 0x1167, 0x1161, 0x115c, 0x1157, 0x1151, 0x114c, 0x1147, 0x1142, 0x113c, 0x1137, 0x1132, 0x112d, 0x1127, 0x1122, 0x111d, 0x1118, 0x1113, 0x110e, 0x1109, 0x1104, 0x10ff, 0x10fa, 0x10f5, 0x10f0, 0x10eb, 0x10e6, 0x10e1, 0x10dc, 0x10d8, 0x10d3, 0x10ce, 0x10c9, 0x10c4, 0x10c0, 0x10bb, 0x10b6, 0x10b1, 0x10ad, 0x10a8, 0x10a3, 0x109f, 0x109a, 0x1096, 0x1091, 0x108c, 0x1088, 0x1083, 0x107f, 0x107a, 0x1076, 0x1071, 0x106d, 0x1069, 0x1064, 0x1060, 0x105b, 0x1057, 0x1053, 0x104e, 0x104a, 0x1046, 0x1042, 0x103d, 0x1039, 0x1035, 0x1031, 0x102d, 0x1028, 0x1024, 0x1020, 0x101c, 0x1018, 0x1014, 0x1010, 0x100c, 0x1008, 0x1004, 0x0fff, 0x0ff7, 0x0fef, 0x0fe7, 0x0fdf, 0x0fd8, 0x0fd0, 0x0fc8, 0x0fc0, 0x0fb8, 0x0fb1, 0x0fa9, 0x0fa1, 0x0f9a, 0x0f92, 0x0f8b, 0x0f83, 0x0f7c, 0x0f74, 0x0f6d, 0x0f65, 0x0f5e, 0x0f57, 0x0f4f, 0x0f48, 0x0f41, 0x0f3a, 0x0f32, 0x0f2b, 0x0f24, 0x0f1d, 0x0f16, 0x0f0f, 0x0f08, 0x0f01, 0x0efa, 0x0ef3, 0x0eec, 0x0ee5, 0x0ede, 0x0ed7, 0x0ed0, 0x0ec9, 0x0ec3, 0x0ebc, 0x0eb5, 0x0eaf, 0x0ea8, 0x0ea1, 0x0e9b, 0x0e94, 0x0e8d, 0x0e87, 0x0e80, 0x0e7a, 0x0e73, 0x0e6d, 0x0e67, 0x0e60, 0x0e5a, 0x0e53, 0x0e4d, 0x0e47, 0x0e41, 0x0e3a, 0x0e34, 0x0e2e, 0x0e28, 0x0e22, 0x0e1c, 0x0e15, 0x0e0f, 0x0e09, 0x0e03, 0x0dfd, 0x0df7, 0x0df1, 0x0deb, 0x0de6, 0x0de0, 0x0dda, 0x0dd4, 0x0dce, 0x0dc8, 0x0dc3, 0x0dbd, 0x0db7, 0x0db1, 0x0dac, 0x0da6, 0x0da0, 0x0d9b, 0x0d95, 0x0d90, 0x0d8a, 0x0d85, 0x0d7f, 0x0d74, 0x0d69, 0x0d5e, 0x0d54, 0x0d49, 0x0d3f, 0x0d34, 0x0d2a, 0x0d1f, 0x0d15, 0x0d0b, 0x0d01, 0x0cf7, 0x0ced, 0x0ce3, 0x0cda, 0x0cd0, 0x0cc6, 0x0cbd, 0x0cb3, 0x0caa, 0x0ca1, 0x0c98, 0x0c8e, 0x0c85, 0x0c7c, 0x0c73, 0x0c6b, 0x0c62, 0x0c59, 0x0c50, 0x0c48, 0x0c3f, 0x0c37, 0x0c2e, 0x0c26, 0x0c1e, 0x0c16, 0x0c0d, 0x0c05, 0x0bfb, 0x0beb, 0x0bdb, 0x0bcb, 0x0bbc, 0x0bad, 0x0b9d, 0x0b8e, 0x0b7f, 0x0b70, 0x0b61, 0x0b53, 0x0b44, 0x0b36, 0x0b27, 0x0b19, 0x0b0b, 0x0afd, 0x0aef, 0x0ae1, 0x0ad3, 0x0ac6, 0x0ab8, 0x0aab, 0x0a9e, 0x0a90, 0x0a83, 0x0a76, 0x0a69, 0x0a5d, 0x0a50, 0x0a43, 0x0a37, 0x0a2b, 0x0a1e, 0x0a12, 0x0a06, 0x09fa, 0x09ee, 0x09e2, 0x09d7, 0x09cb, 0x09bf, 0x09b4, 0x09a9, 0x099d, 0x0992, 0x0987, 0x097c, 0x0971, 0x0966, 0x095b, 0x0951, 0x0946, 0x093c, 0x0931, 0x0927, 0x091d, 0x0912, 0x0908, 0x08fe, 0x08f4, 0x08eb, 0x08e1, 0x08d7, 0x08cd, 0x08c4, 0x08ba, 0x08b1, 0x08a8, 0x089e, 0x0895, 0x088c, 0x0883, 0x087a, 0x0871, 0x0868, 0x085f, 0x0857, 0x084e, 0x0845, 0x083d, 0x0834, 0x082c, 0x0824, 0x081c, 0x0813, 0x080b, 0x0803, 0x07f6, 0x07e7, 0x07d7, 0x07c7, 0x07b8, 0x07a8, 0x0799, 0x078a, 0x077b, 0x076c, 0x075d, 0x074f, 0x0740, 0x0732, 0x0723, 0x0715, 0x0707, 0x06f9, 0x06eb, 0x06dd, 0x06d0, 0x06c2, 0x06b4, 0x06a7, 0x069a, 0x068d, 0x0680, 0x0673, 0x0666, 0x0659, 0x064c, 0x0640, 0x0633, 0x0627, 0x061b, 0x060f, 0x0603, 0x05f7, 0x05eb, 0x05df, 0x05d3, 0x05c8, 0x05bc, 0x05b1, 0x05a5, 0x059a, 0x058f, 0x0584, 0x0579, 0x056e, 0x0563, 0x0558, 0x054e, 0x0543, 0x0539, 0x052e, 0x0524, 0x051a, 0x0510, 0x0506, 0x04fc, 0x04f2, 0x04e8, 0x04de, 0x04d4, 0x04cb, 0x04c1, 0x04b8, 0x04ae, 0x04a5, 0x049c, 0x0493, 0x0489, 0x0480, 0x0477, 0x046f, 0x0466, 0x045d, 0x0454, 0x044c, 0x0443, 0x043b, 0x0432, 0x042a, 0x0421, 0x0419, 0x0411, 0x0409, 0x0401, 0x03f9, 0x03f1, 0x03e9, 0x03e1, 0x03da, 0x03d2, 0x03ca, 0x03c3, 0x03bb, 0x03b4, 0x03ad, 0x03a5, 0x039e, 0x0397, 0x0390, 0x0389, 0x0381, 0x037a, 0x0374, 0x036d, 0x0366, 0x035f, 0x0358, 0x0352, 0x034b, 0x0345, 0x033e, 0x0338, 0x0331, 0x032b, 0x0324, 0x031e, 0x0318, 0x0312, 0x030c, 0x0306, 0x0300, 0x02fa, 0x02f4, 0x02ee, 0x02e8, 0x02e2, 0x02dd, 0x02d7, 0x02d1, 0x02cc, 0x02c6, 0x02c0, 0x02bb, 0x02b6, 0x02b0, 0x02ab, 0x02a5, 0x02a0, 0x029b, 0x0296, 0x0291, 0x028c, 0x0286, 0x0281, 0x027c, 0x0277, 0x0273, 0x026e, 0x0269, 0x0264, 0x025f, 0x025b, 0x0256, 0x0251, 0x024d, 0x0248, 0x0243, 0x023f, 0x023a, 0x0236, 0x0232, 0x022d, 0x0229, 0x0225, 0x0220, 0x021c, 0x0218, 0x0214, 0x0210, 0x020b, 0x0207, 0x0203, 0x01ff, 0x01fb, 0x01f7, 0x01f4, 0x01f0, 0x01ec, 0x01e8, 0x01e4, 0x01e0, 0x01dd, 0x01d9, 0x01d5, 0x01d2, 0x01ce, 0x01ca, 0x01c7, 0x01c3, 0x01c0, 0x01bc, 0x01b9, 0x01b5, 0x01b2, 0x01af, 0x01ab, 0x01a8, 0x01a5, 0x01a1, 0x019e, 0x019b, 0x0198, 0x0195, 0x0191, 0x018e, 0x018b, 0x0188, 0x0185, 0x0182, 0x017f, 0x017c, 0x0179, 0x0176, 0x0173, 0x0170, 0x016d, 0x016b, 0x0168, 0x0165, 0x0162, 0x015f, 0x015d, 0x015a, 0x0157, 0x0155, 0x0152, 0x014f, 0x014d, 0x014a, 0x0148, 0x0145, 0x0143, 0x0140, 0x013e, 0x013b, 0x0139, 0x0136, 0x0134, 0x0131, 0x012f, 0x012d, 0x012a, 0x0128, 0x0126, 0x0123, 0x0121, 0x011f, 0x011d, 0x011a, 0x0118, 0x0116, 0x0114, 0x0112, 0x0110, 0x010d, 0x010b, 0x0109, 0x0107, 0x0105, 0x0103, 0x0101, 0x00ff, 0x00fd, 0x00fb, 0x00f9, 0x00f7, 0x00f5, 0x00f3, 0x00f2, 0x00f0, 0x00ee, 0x00ec, 0x00ea, 0x00e8, 0x00e6, 0x00e5, 0x00e3, 0x00e1, 0x00df, 0x00de, 0x00dc, 0x00da, 0x00d9, 0x00d7, 0x00d5, 0x00d4, 0x00d2, 0x00d0, 0x00cf, 0x00cd, 0x00cb, 0x00ca, 0x00c8, 0x00c7, 0x00c5, 0x00c4, 0x00c2, 0x00c1, 0x00bf, 0x00be, 0x00bc, 0x00bb, 0x00b9, 0x00b8, 0x00b6, 0x00b5, 0x00b4, 0x00b2, 0x00b1, 0x00af, 0x00ae, 0x00ad, 0x00ab, 0x00aa, 0x00a9, 0x00a7, 0x00a6, 0x00a5, 0x00a3, 0x00a2, 0x00a1, 0x00a0, 0x009e, 0x009d, 0x009c, 0x009b, 0x009a, 0x0098, 0x0097, 0x0096, 0x0095, 0x0094, 0x0093, 0x0091, 0x0090, 0x008f, 0x008e, 0x008d, 0x008c, 0x008b, 0x008a, 0x0089, 0x0087, 0x0086, 0x0085, 0x0084, 0x0083, 0x0082, 0x0081, 0x0080, 0x007f, 0x007e, 0x007d, 0x007c, 0x007b, 0x007a, 0x0079, 0x0079, 0x0078, 0x0077, 0x0076, 0x0075, 0x0074, 0x0073, 0x0072, 0x0071, 0x0070, 0x006f, 0x006f, 0x006e, 0x006d, 0x006c, 0x006b, 0x006a, 0x006a, 0x0069, 0x0068, 0x0067, 0x0066, 0x0065, 0x0065, 0x0064, 0x0063, 0x0062, 0x0062, 0x0061, 0x0060, 0x005f, 0x005f, 0x005e, 0x005d, 0x005c, 0x005c, 0x005b, 0x005a, 0x005a, 0x0059, 0x0058, 0x0057, 0x0057, 0x0056, 0x0055, 0x0055, 0x0054, 0x0053, 0x0053, 0x0052, 0x0052, 0x0051, 0x0050, 0x0050, 0x004f, 0x004e, 0x004e, 0x004d, 0x004d, 0x004c, 0x004b, 0x004b, 0x004a, 0x004a, 0x0049, 0x0049, 0x0048, 0x0047, 0x0047, 0x0046, 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, 0x0043, 0x0042, 0x0042, 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, 0x003f, 0x003e, 0x003e, 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, 0x003b, 0x003a, 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, 0x0037, 0x0037, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0031, 0x0031, 0x0031, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, 0x002e, 0x002e, 0x002e, 0x002d, 0x002d, 0x002d, 0x002c, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0027, 0x0027, 0x0027, 0x0027, 0x0026, 0x0026, 0x0026, 0x0025, 0x0025, 0x0025, 0x0024, 0x0024, 0x0024, 0x0024, 0x0023, 0x0023, 0x0023, 0x0023, 0x0022, 0x0022, 0x0022, 0x0021, 0x0021, 0x0021, 0x0021, 0x0020, 0x0020, 0x0020, 0x0020, 0x001f, 0x001f, 0x001f, 0x001f, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001d, 0x001d, 0x001d, 0x001d, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001b, 0x001b, 0x001b, 0x001b, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; const unsigned short logTable[] = { 0xfc00, 0xd829, 0xd7f9, 0xd7c5, 0xd7a0, 0xd783, 0xd76c, 0xd758, 0xd747, 0xd738, 0xd72b, 0xd71e, 0xd713, 0xd709, 0xd700, 0xd6f7, 0xd6ee, 0xd6e7, 0xd6df, 0xd6d8, 0xd6d2, 0xd6cc, 0xd6c6, 0xd6c0, 0xd6bb, 0xd6b5, 0xd6b0, 0xd6ab, 0xd6a7, 0xd6a2, 0xd69e, 0xd69a, 0xd696, 0xd692, 0xd68e, 0xd68a, 0xd687, 0xd683, 0xd680, 0xd67c, 0xd679, 0xd676, 0xd673, 0xd670, 0xd66d, 0xd66a, 0xd667, 0xd665, 0xd662, 0xd65f, 0xd65d, 0xd65a, 0xd658, 0xd655, 0xd653, 0xd650, 0xd64e, 0xd64c, 0xd64a, 0xd647, 0xd645, 0xd643, 0xd641, 0xd63f, 0xd63d, 0xd63b, 0xd639, 0xd637, 0xd635, 0xd633, 0xd632, 0xd630, 0xd62e, 0xd62c, 0xd62a, 0xd629, 0xd627, 0xd625, 0xd624, 0xd622, 0xd620, 0xd61f, 0xd61d, 0xd61c, 0xd61a, 0xd619, 0xd617, 0xd616, 0xd614, 0xd613, 0xd611, 0xd610, 0xd60f, 0xd60d, 0xd60c, 0xd60a, 0xd609, 0xd608, 0xd606, 0xd605, 0xd604, 0xd603, 0xd601, 0xd600, 0xd5ff, 0xd5fe, 0xd5fc, 0xd5fb, 0xd5fa, 0xd5f9, 0xd5f8, 0xd5f7, 0xd5f5, 0xd5f4, 0xd5f3, 0xd5f2, 0xd5f1, 0xd5f0, 0xd5ef, 0xd5ee, 0xd5ed, 0xd5eb, 0xd5ea, 0xd5e9, 0xd5e8, 0xd5e7, 0xd5e6, 0xd5e5, 0xd5e4, 0xd5e3, 0xd5e2, 0xd5e1, 0xd5e0, 0xd5df, 0xd5de, 0xd5dd, 0xd5dd, 0xd5dc, 0xd5db, 0xd5da, 0xd5d9, 0xd5d8, 0xd5d7, 0xd5d6, 0xd5d5, 0xd5d4, 0xd5d3, 0xd5d3, 0xd5d2, 0xd5d1, 0xd5d0, 0xd5cf, 0xd5ce, 0xd5cd, 0xd5cd, 0xd5cc, 0xd5cb, 0xd5ca, 0xd5c9, 0xd5c9, 0xd5c8, 0xd5c7, 0xd5c6, 0xd5c5, 0xd5c5, 0xd5c4, 0xd5c3, 0xd5c2, 0xd5c1, 0xd5c1, 0xd5c0, 0xd5bf, 0xd5be, 0xd5be, 0xd5bd, 0xd5bc, 0xd5bc, 0xd5bb, 0xd5ba, 0xd5b9, 0xd5b9, 0xd5b8, 0xd5b7, 0xd5b7, 0xd5b6, 0xd5b5, 0xd5b4, 0xd5b4, 0xd5b3, 0xd5b2, 0xd5b2, 0xd5b1, 0xd5b0, 0xd5b0, 0xd5af, 0xd5ae, 0xd5ae, 0xd5ad, 0xd5ac, 0xd5ac, 0xd5ab, 0xd5ab, 0xd5aa, 0xd5a9, 0xd5a9, 0xd5a8, 0xd5a7, 0xd5a7, 0xd5a6, 0xd5a6, 0xd5a5, 0xd5a4, 0xd5a4, 0xd5a3, 0xd5a3, 0xd5a2, 0xd5a1, 0xd5a1, 0xd5a0, 0xd5a0, 0xd59f, 0xd59e, 0xd59e, 0xd59d, 0xd59d, 0xd59c, 0xd59c, 0xd59b, 0xd59a, 0xd59a, 0xd599, 0xd599, 0xd598, 0xd598, 0xd597, 0xd597, 0xd596, 0xd595, 0xd595, 0xd594, 0xd594, 0xd593, 0xd593, 0xd592, 0xd592, 0xd591, 0xd591, 0xd590, 0xd590, 0xd58f, 0xd58f, 0xd58e, 0xd58e, 0xd58d, 0xd58d, 0xd58c, 0xd58c, 0xd58b, 0xd58b, 0xd58a, 0xd58a, 0xd589, 0xd589, 0xd588, 0xd588, 0xd587, 0xd587, 0xd586, 0xd586, 0xd585, 0xd585, 0xd584, 0xd584, 0xd583, 0xd583, 0xd582, 0xd582, 0xd581, 0xd581, 0xd581, 0xd580, 0xd580, 0xd57f, 0xd57f, 0xd57e, 0xd57e, 0xd57d, 0xd57d, 0xd57c, 0xd57c, 0xd57c, 0xd57b, 0xd57b, 0xd57a, 0xd57a, 0xd579, 0xd579, 0xd579, 0xd578, 0xd578, 0xd577, 0xd577, 0xd576, 0xd576, 0xd576, 0xd575, 0xd575, 0xd574, 0xd574, 0xd573, 0xd573, 0xd573, 0xd572, 0xd572, 0xd571, 0xd571, 0xd571, 0xd570, 0xd570, 0xd56f, 0xd56f, 0xd56f, 0xd56e, 0xd56e, 0xd56d, 0xd56d, 0xd56d, 0xd56c, 0xd56c, 0xd56b, 0xd56b, 0xd56b, 0xd56a, 0xd56a, 0xd56a, 0xd569, 0xd569, 0xd568, 0xd568, 0xd568, 0xd567, 0xd567, 0xd566, 0xd566, 0xd566, 0xd565, 0xd565, 0xd565, 0xd564, 0xd564, 0xd564, 0xd563, 0xd563, 0xd562, 0xd562, 0xd562, 0xd561, 0xd561, 0xd561, 0xd560, 0xd560, 0xd560, 0xd55f, 0xd55f, 0xd55f, 0xd55e, 0xd55e, 0xd55d, 0xd55d, 0xd55d, 0xd55c, 0xd55c, 0xd55c, 0xd55b, 0xd55b, 0xd55b, 0xd55a, 0xd55a, 0xd55a, 0xd559, 0xd559, 0xd559, 0xd558, 0xd558, 0xd558, 0xd557, 0xd557, 0xd557, 0xd556, 0xd556, 0xd556, 0xd555, 0xd555, 0xd555, 0xd554, 0xd554, 0xd554, 0xd553, 0xd553, 0xd553, 0xd552, 0xd552, 0xd552, 0xd551, 0xd551, 0xd551, 0xd551, 0xd550, 0xd550, 0xd550, 0xd54f, 0xd54f, 0xd54f, 0xd54e, 0xd54e, 0xd54e, 0xd54d, 0xd54d, 0xd54d, 0xd54d, 0xd54c, 0xd54c, 0xd54c, 0xd54b, 0xd54b, 0xd54b, 0xd54a, 0xd54a, 0xd54a, 0xd549, 0xd549, 0xd549, 0xd549, 0xd548, 0xd548, 0xd548, 0xd547, 0xd547, 0xd547, 0xd547, 0xd546, 0xd546, 0xd546, 0xd545, 0xd545, 0xd545, 0xd545, 0xd544, 0xd544, 0xd544, 0xd543, 0xd543, 0xd543, 0xd543, 0xd542, 0xd542, 0xd542, 0xd541, 0xd541, 0xd541, 0xd541, 0xd540, 0xd540, 0xd540, 0xd53f, 0xd53f, 0xd53f, 0xd53f, 0xd53e, 0xd53e, 0xd53e, 0xd53e, 0xd53d, 0xd53d, 0xd53d, 0xd53c, 0xd53c, 0xd53c, 0xd53c, 0xd53b, 0xd53b, 0xd53b, 0xd53b, 0xd53a, 0xd53a, 0xd53a, 0xd53a, 0xd539, 0xd539, 0xd539, 0xd538, 0xd538, 0xd538, 0xd538, 0xd537, 0xd537, 0xd537, 0xd537, 0xd536, 0xd536, 0xd536, 0xd536, 0xd535, 0xd535, 0xd535, 0xd535, 0xd534, 0xd534, 0xd534, 0xd534, 0xd533, 0xd533, 0xd533, 0xd533, 0xd532, 0xd532, 0xd532, 0xd532, 0xd531, 0xd531, 0xd531, 0xd531, 0xd530, 0xd530, 0xd530, 0xd530, 0xd52f, 0xd52f, 0xd52f, 0xd52f, 0xd52e, 0xd52e, 0xd52e, 0xd52e, 0xd52d, 0xd52d, 0xd52d, 0xd52d, 0xd52d, 0xd52c, 0xd52c, 0xd52c, 0xd52c, 0xd52b, 0xd52b, 0xd52b, 0xd52b, 0xd52a, 0xd52a, 0xd52a, 0xd52a, 0xd529, 0xd529, 0xd529, 0xd529, 0xd529, 0xd528, 0xd528, 0xd528, 0xd528, 0xd527, 0xd527, 0xd527, 0xd527, 0xd526, 0xd526, 0xd526, 0xd526, 0xd526, 0xd525, 0xd525, 0xd525, 0xd525, 0xd524, 0xd524, 0xd524, 0xd524, 0xd524, 0xd523, 0xd523, 0xd523, 0xd523, 0xd522, 0xd522, 0xd522, 0xd522, 0xd522, 0xd521, 0xd521, 0xd521, 0xd521, 0xd520, 0xd520, 0xd520, 0xd520, 0xd520, 0xd51f, 0xd51f, 0xd51f, 0xd51f, 0xd51f, 0xd51e, 0xd51e, 0xd51e, 0xd51e, 0xd51d, 0xd51d, 0xd51d, 0xd51d, 0xd51d, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51b, 0xd51b, 0xd51b, 0xd51b, 0xd51b, 0xd51a, 0xd51a, 0xd51a, 0xd51a, 0xd51a, 0xd519, 0xd519, 0xd519, 0xd519, 0xd518, 0xd518, 0xd518, 0xd518, 0xd518, 0xd517, 0xd517, 0xd517, 0xd517, 0xd517, 0xd516, 0xd516, 0xd516, 0xd516, 0xd516, 0xd515, 0xd515, 0xd515, 0xd515, 0xd515, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd513, 0xd513, 0xd513, 0xd513, 0xd513, 0xd512, 0xd512, 0xd512, 0xd512, 0xd512, 0xd511, 0xd511, 0xd511, 0xd511, 0xd511, 0xd510, 0xd510, 0xd510, 0xd510, 0xd510, 0xd50f, 0xd50f, 0xd50f, 0xd50f, 0xd50f, 0xd50f, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50d, 0xd50d, 0xd50d, 0xd50d, 0xd50d, 0xd50c, 0xd50c, 0xd50c, 0xd50c, 0xd50c, 0xd50c, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50a, 0xd50a, 0xd50a, 0xd50a, 0xd50a, 0xd50a, 0xd509, 0xd509, 0xd509, 0xd509, 0xd509, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd507, 0xd507, 0xd507, 0xd507, 0xd507, 0xd506, 0xd506, 0xd506, 0xd506, 0xd506, 0xd506, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd503, 0xd503, 0xd503, 0xd503, 0xd503, 0xd502, 0xd502, 0xd502, 0xd502, 0xd502, 0xd502, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd500, 0xd500, 0xd500, 0xd500, 0xd500, 0xd500, 0xd4ff, 0xd4ff, 0xd4ff, 0xd4ff, 0xd4ff, 0xd4ff, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, 0xd421, 0xd421, 0xd421, 0xd421, 0xd421, 0xd421, 0xd421, 0xd421, 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3f9, 0xd3f9, 0xd3f9, 0xd3f9, 0xd3f9, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f6, 0xd3f6, 0xd3f6, 0xd3f6, 0xd3f6, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3eb, 0xd3eb, 0xd3eb, 0xd3eb, 0xd3eb, 0xd3eb, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3df, 0xd3df, 0xd3df, 0xd3df, 0xd3df, 0xd3df, 0xd3de, 0xd3de, 0xd3de, 0xd3de, 0xd3de, 0xd3de, 0xd3de, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3da, 0xd3da, 0xd3da, 0xd3da, 0xd3da, 0xd3da, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a0, 0xd3a0, 0xd3a0, 0xd3a0, 0xd3a0, 0xd3a0, 0xd39f, 0xd39f, 0xd39f, 0xd39f, 0xd39e, 0xd39e, 0xd39e, 0xd39e, 0xd39d, 0xd39d, 0xd39d, 0xd39d, 0xd39c, 0xd39c, 0xd39c, 0xd39c, 0xd39b, 0xd39b, 0xd39b, 0xd39b, 0xd39a, 0xd39a, 0xd39a, 0xd39a, 0xd399, 0xd399, 0xd399, 0xd399, 0xd399, 0xd398, 0xd398, 0xd398, 0xd398, 0xd397, 0xd397, 0xd397, 0xd397, 0xd396, 0xd396, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd394, 0xd394, 0xd394, 0xd394, 0xd393, 0xd393, 0xd393, 0xd393, 0xd393, 0xd392, 0xd392, 0xd392, 0xd392, 0xd391, 0xd391, 0xd391, 0xd391, 0xd390, 0xd390, 0xd390, 0xd390, 0xd38f, 0xd38f, 0xd38f, 0xd38f, 0xd38f, 0xd38e, 0xd38e, 0xd38e, 0xd38e, 0xd38d, 0xd38d, 0xd38d, 0xd38d, 0xd38c, 0xd38c, 0xd38c, 0xd38c, 0xd38b, 0xd38b, 0xd38b, 0xd38b, 0xd38b, 0xd38a, 0xd38a, 0xd38a, 0xd38a, 0xd389, 0xd389, 0xd389, 0xd389, 0xd389, 0xd388, 0xd388, 0xd388, 0xd388, 0xd387, 0xd387, 0xd387, 0xd387, 0xd386, 0xd386, 0xd386, 0xd386, 0xd386, 0xd385, 0xd385, 0xd385, 0xd385, 0xd384, 0xd384, 0xd384, 0xd384, 0xd384, 0xd383, 0xd383, 0xd383, 0xd383, 0xd382, 0xd382, 0xd382, 0xd382, 0xd382, 0xd381, 0xd381, 0xd381, 0xd381, 0xd380, 0xd380, 0xd380, 0xd380, 0xd380, 0xd37f, 0xd37f, 0xd37f, 0xd37f, 0xd37e, 0xd37e, 0xd37e, 0xd37e, 0xd37e, 0xd37d, 0xd37d, 0xd37d, 0xd37d, 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37b, 0xd37b, 0xd37b, 0xd37b, 0xd37b, 0xd37a, 0xd37a, 0xd37a, 0xd37a, 0xd379, 0xd379, 0xd379, 0xd379, 0xd379, 0xd378, 0xd378, 0xd378, 0xd378, 0xd378, 0xd377, 0xd377, 0xd377, 0xd377, 0xd376, 0xd376, 0xd376, 0xd376, 0xd376, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd374, 0xd374, 0xd374, 0xd373, 0xd373, 0xd373, 0xd373, 0xd373, 0xd372, 0xd372, 0xd372, 0xd372, 0xd372, 0xd371, 0xd371, 0xd371, 0xd371, 0xd371, 0xd370, 0xd370, 0xd370, 0xd370, 0xd370, 0xd36f, 0xd36f, 0xd36f, 0xd36f, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36d, 0xd36d, 0xd36d, 0xd36d, 0xd36d, 0xd36c, 0xd36c, 0xd36c, 0xd36c, 0xd36c, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36a, 0xd36a, 0xd36a, 0xd36a, 0xd36a, 0xd369, 0xd369, 0xd369, 0xd369, 0xd369, 0xd368, 0xd368, 0xd368, 0xd368, 0xd368, 0xd367, 0xd367, 0xd367, 0xd367, 0xd367, 0xd366, 0xd366, 0xd366, 0xd366, 0xd366, 0xd365, 0xd365, 0xd365, 0xd365, 0xd365, 0xd364, 0xd364, 0xd364, 0xd364, 0xd364, 0xd363, 0xd363, 0xd363, 0xd363, 0xd363, 0xd362, 0xd362, 0xd362, 0xd362, 0xd362, 0xd361, 0xd361, 0xd361, 0xd361, 0xd361, 0xd360, 0xd360, 0xd360, 0xd360, 0xd360, 0xd35f, 0xd35f, 0xd35f, 0xd35f, 0xd35f, 0xd35f, 0xd35e, 0xd35e, 0xd35e, 0xd35e, 0xd35e, 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35c, 0xd35c, 0xd35c, 0xd35c, 0xd35c, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd359, 0xd359, 0xd359, 0xd359, 0xd359, 0xd358, 0xd358, 0xd358, 0xd358, 0xd358, 0xd357, 0xd357, 0xd357, 0xd357, 0xd357, 0xd357, 0xd356, 0xd356, 0xd356, 0xd356, 0xd356, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd354, 0xd354, 0xd354, 0xd354, 0xd354, 0xd353, 0xd353, 0xd353, 0xd353, 0xd353, 0xd352, 0xd352, 0xd352, 0xd352, 0xd352, 0xd351, 0xd351, 0xd351, 0xd351, 0xd351, 0xd351, 0xd350, 0xd350, 0xd350, 0xd350, 0xd350, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34d, 0xd34d, 0xd34d, 0xd34d, 0xd34d, 0xd34d, 0xd34c, 0xd34c, 0xd34c, 0xd34c, 0xd34c, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd349, 0xd349, 0xd349, 0xd349, 0xd349, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd347, 0xd347, 0xd347, 0xd347, 0xd347, 0xd347, 0xd346, 0xd346, 0xd346, 0xd346, 0xd346, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd343, 0xd343, 0xd343, 0xd343, 0xd343, 0xd342, 0xd342, 0xd342, 0xd342, 0xd342, 0xd342, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd340, 0xd340, 0xd340, 0xd340, 0xd340, 0xd340, 0xd33f, 0xd33f, 0xd33f, 0xd33f, 0xd33f, 0xd33f, 0xd33e, 0xd33e, 0xd33e, 0xd33e, 0xd33e, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33c, 0xd33c, 0xd33c, 0xd33c, 0xd33c, 0xd33c, 0xd33b, 0xd33b, 0xd33b, 0xd33b, 0xd33b, 0xd33b, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd338, 0xd338, 0xd338, 0xd338, 0xd338, 0xd338, 0xd337, 0xd337, 0xd337, 0xd337, 0xd337, 0xd337, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd334, 0xd334, 0xd334, 0xd334, 0xd334, 0xd333, 0xd333, 0xd333, 0xd333, 0xd333, 0xd333, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd330, 0xd330, 0xd330, 0xd330, 0xd330, 0xd330, 0xd32f, 0xd32f, 0xd32f, 0xd32f, 0xd32f, 0xd32f, 0xd32e, 0xd32e, 0xd32e, 0xd32e, 0xd32e, 0xd32e, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32b, 0xd32b, 0xd32b, 0xd32b, 0xd32b, 0xd32b, 0xd32a, 0xd32a, 0xd32a, 0xd32a, 0xd32a, 0xd32a, 0xd32a, 0xd329, 0xd329, 0xd329, 0xd329, 0xd329, 0xd329, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd326, 0xd326, 0xd326, 0xd326, 0xd326, 0xd326, 0xd325, 0xd325, 0xd325, 0xd325, 0xd325, 0xd325, 0xd325, 0xd324, 0xd324, 0xd324, 0xd324, 0xd324, 0xd324, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd321, 0xd321, 0xd321, 0xd321, 0xd321, 0xd321, 0xd321, 0xd320, 0xd320, 0xd320, 0xd320, 0xd320, 0xd320, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd319, 0xd319, 0xd319, 0xd319, 0xd319, 0xd319, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd313, 0xd313, 0xd313, 0xd313, 0xd313, 0xd313, 0xd313, 0xd312, 0xd312, 0xd312, 0xd312, 0xd312, 0xd312, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30a, 0xd30a, 0xd30a, 0xd30a, 0xd30a, 0xd30a, 0xd30a, 0xd309, 0xd309, 0xd309, 0xd309, 0xd309, 0xd309, 0xd309, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd301, 0xd301, 0xd301, 0xd301, 0xd301, 0xd301, 0xd301, 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ed, 0xd2ed, 0xd2ed, 0xd2ed, 0xd2ec, 0xd2ec, 0xd2ec, 0xd2ec, 0xd2eb, 0xd2eb, 0xd2eb, 0xd2eb, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2e9, 0xd2e9, 0xd2e9, 0xd2e9, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e7, 0xd2e7, 0xd2e7, 0xd2e7, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e5, 0xd2e5, 0xd2e5, 0xd2e5, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e3, 0xd2e3, 0xd2e3, 0xd2e3, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e1, 0xd2e1, 0xd2e1, 0xd2e1, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2df, 0xd2df, 0xd2df, 0xd2df, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2dd, 0xd2dd, 0xd2dd, 0xd2dd, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2db, 0xd2db, 0xd2db, 0xd2db, 0xd2db, 0xd2da, 0xd2da, 0xd2da, 0xd2da, 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d6, 0xd2d6, 0xd2d6, 0xd2d6, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d2, 0xd2d2, 0xd2d2, 0xd2d2, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d0, 0xd2d0, 0xd2d0, 0xd2d0, 0xd2cf, 0xd2cf, 0xd2cf, 0xd2cf, 0xd2cf, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2cd, 0xd2cd, 0xd2cd, 0xd2cd, 0xd2cd, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cb, 0xd2cb, 0xd2cb, 0xd2cb, 0xd2cb, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c8, 0xd2c8, 0xd2c8, 0xd2c8, 0xd2c8, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c6, 0xd2c6, 0xd2c6, 0xd2c6, 0xd2c6, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c3, 0xd2c3, 0xd2c3, 0xd2c3, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c1, 0xd2c1, 0xd2c1, 0xd2c1, 0xd2c1, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2bf, 0xd2bf, 0xd2bf, 0xd2bf, 0xd2be, 0xd2be, 0xd2be, 0xd2be, 0xd2be, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bc, 0xd2bc, 0xd2bc, 0xd2bc, 0xd2bc, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2ba, 0xd2ba, 0xd2ba, 0xd2ba, 0xd2ba, 0xd2b9, 0xd2b9, 0xd2b9, 0xd2b9, 0xd2b9, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b7, 0xd2b7, 0xd2b7, 0xd2b7, 0xd2b7, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b1, 0xd2b1, 0xd2b1, 0xd2b1, 0xd2b1, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2af, 0xd2af, 0xd2af, 0xd2af, 0xd2af, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2a9, 0xd2a9, 0xd2a9, 0xd2a9, 0xd2a9, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a6, 0xd2a6, 0xd2a6, 0xd2a6, 0xd2a6, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a3, 0xd2a3, 0xd2a3, 0xd2a3, 0xd2a3, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a0, 0xd2a0, 0xd2a0, 0xd2a0, 0xd2a0, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29d, 0xd29d, 0xd29d, 0xd29d, 0xd29d, 0xd29d, 0xd29c, 0xd29c, 0xd29c, 0xd29c, 0xd29c, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29a, 0xd29a, 0xd29a, 0xd29a, 0xd29a, 0xd29a, 0xd299, 0xd299, 0xd299, 0xd299, 0xd299, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd297, 0xd297, 0xd297, 0xd297, 0xd297, 0xd296, 0xd296, 0xd296, 0xd296, 0xd296, 0xd296, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd293, 0xd293, 0xd293, 0xd293, 0xd293, 0xd293, 0xd292, 0xd292, 0xd292, 0xd292, 0xd292, 0xd292, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd290, 0xd290, 0xd290, 0xd290, 0xd290, 0xd28f, 0xd28f, 0xd28f, 0xd28f, 0xd28f, 0xd28f, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xd28b, 0xd28b, 0xd28b, 0xd28b, 0xd28b, 0xd28b, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd289, 0xd289, 0xd289, 0xd289, 0xd289, 0xd288, 0xd288, 0xd288, 0xd288, 0xd288, 0xd288, 0xd287, 0xd287, 0xd287, 0xd287, 0xd287, 0xd287, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd284, 0xd284, 0xd284, 0xd284, 0xd284, 0xd284, 0xd283, 0xd283, 0xd283, 0xd283, 0xd283, 0xd283, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280, 0xd27f, 0xd27f, 0xd27f, 0xd27f, 0xd27f, 0xd27f, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27b, 0xd27b, 0xd27b, 0xd27b, 0xd27b, 0xd27b, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd277, 0xd277, 0xd277, 0xd277, 0xd277, 0xd277, 0xd277, 0xd276, 0xd276, 0xd276, 0xd276, 0xd276, 0xd276, 0xd275, 0xd275, 0xd275, 0xd275, 0xd275, 0xd275, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd272, 0xd272, 0xd272, 0xd272, 0xd272, 0xd272, 0xd272, 0xd271, 0xd271, 0xd271, 0xd271, 0xd271, 0xd271, 0xd270, 0xd270, 0xd270, 0xd270, 0xd270, 0xd270, 0xd270, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26c, 0xd26c, 0xd26c, 0xd26c, 0xd26c, 0xd26c, 0xd26b, 0xd26b, 0xd26b, 0xd26b, 0xd26b, 0xd26b, 0xd26b, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd266, 0xd266, 0xd266, 0xd266, 0xd266, 0xd266, 0xd266, 0xd265, 0xd265, 0xd265, 0xd265, 0xd265, 0xd265, 0xd265, 0xd264, 0xd264, 0xd264, 0xd264, 0xd264, 0xd264, 0xd264, 0xd263, 0xd263, 0xd263, 0xd263, 0xd263, 0xd263, 0xd263, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25d, 0xd25d, 0xd25d, 0xd25d, 0xd25d, 0xd25d, 0xd25d, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd255, 0xd255, 0xd255, 0xd255, 0xd255, 0xd255, 0xd255, 0xd254, 0xd254, 0xd254, 0xd254, 0xd254, 0xd254, 0xd254, 0xd253, 0xd253, 0xd253, 0xd253, 0xd253, 0xd253, 0xd253, 0xd253, 0xd252, 0xd252, 0xd252, 0xd252, 0xd252, 0xd252, 0xd252, 0xd251, 0xd251, 0xd251, 0xd251, 0xd251, 0xd251, 0xd251, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd245, 0xd245, 0xd245, 0xd245, 0xd245, 0xd245, 0xd245, 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23d, 0xd23d, 0xd23d, 0xd23d, 0xd23d, 0xd23d, 0xd23c, 0xd23c, 0xd23c, 0xd23c, 0xd23b, 0xd23b, 0xd23b, 0xd23b, 0xd23a, 0xd23a, 0xd23a, 0xd23a, 0xd239, 0xd239, 0xd239, 0xd239, 0xd238, 0xd238, 0xd238, 0xd238, 0xd237, 0xd237, 0xd237, 0xd237, 0xd236, 0xd236, 0xd236, 0xd236, 0xd235, 0xd235, 0xd235, 0xd235, 0xd234, 0xd234, 0xd234, 0xd234, 0xd233, 0xd233, 0xd233, 0xd233, 0xd232, 0xd232, 0xd232, 0xd232, 0xd232, 0xd231, 0xd231, 0xd231, 0xd231, 0xd230, 0xd230, 0xd230, 0xd230, 0xd22f, 0xd22f, 0xd22f, 0xd22f, 0xd22e, 0xd22e, 0xd22e, 0xd22e, 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22c, 0xd22c, 0xd22c, 0xd22c, 0xd22b, 0xd22b, 0xd22b, 0xd22b, 0xd22a, 0xd22a, 0xd22a, 0xd22a, 0xd22a, 0xd229, 0xd229, 0xd229, 0xd229, 0xd228, 0xd228, 0xd228, 0xd228, 0xd227, 0xd227, 0xd227, 0xd227, 0xd227, 0xd226, 0xd226, 0xd226, 0xd226, 0xd225, 0xd225, 0xd225, 0xd225, 0xd224, 0xd224, 0xd224, 0xd224, 0xd224, 0xd223, 0xd223, 0xd223, 0xd223, 0xd222, 0xd222, 0xd222, 0xd222, 0xd222, 0xd221, 0xd221, 0xd221, 0xd221, 0xd220, 0xd220, 0xd220, 0xd220, 0xd220, 0xd21f, 0xd21f, 0xd21f, 0xd21f, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21d, 0xd21d, 0xd21d, 0xd21d, 0xd21c, 0xd21c, 0xd21c, 0xd21c, 0xd21c, 0xd21b, 0xd21b, 0xd21b, 0xd21b, 0xd21a, 0xd21a, 0xd21a, 0xd21a, 0xd21a, 0xd219, 0xd219, 0xd219, 0xd219, 0xd218, 0xd218, 0xd218, 0xd218, 0xd218, 0xd217, 0xd217, 0xd217, 0xd217, 0xd217, 0xd216, 0xd216, 0xd216, 0xd216, 0xd215, 0xd215, 0xd215, 0xd215, 0xd215, 0xd214, 0xd214, 0xd214, 0xd214, 0xd214, 0xd213, 0xd213, 0xd213, 0xd213, 0xd212, 0xd212, 0xd212, 0xd212, 0xd212, 0xd211, 0xd211, 0xd211, 0xd211, 0xd211, 0xd210, 0xd210, 0xd210, 0xd210, 0xd210, 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20e, 0xd20e, 0xd20e, 0xd20e, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20c, 0xd20c, 0xd20c, 0xd20c, 0xd20c, 0xd20b, 0xd20b, 0xd20b, 0xd20b, 0xd20b, 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd209, 0xd209, 0xd209, 0xd209, 0xd209, 0xd208, 0xd208, 0xd208, 0xd208, 0xd208, 0xd207, 0xd207, 0xd207, 0xd207, 0xd206, 0xd206, 0xd206, 0xd206, 0xd206, 0xd205, 0xd205, 0xd205, 0xd205, 0xd205, 0xd204, 0xd204, 0xd204, 0xd204, 0xd204, 0xd203, 0xd203, 0xd203, 0xd203, 0xd203, 0xd202, 0xd202, 0xd202, 0xd202, 0xd202, 0xd201, 0xd201, 0xd201, 0xd201, 0xd201, 0xd201, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd1ff, 0xd1ff, 0xd1ff, 0xd1ff, 0xd1ff, 0xd1fe, 0xd1fe, 0xd1fe, 0xd1fe, 0xd1fe, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fc, 0xd1fc, 0xd1fc, 0xd1fc, 0xd1fc, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f6, 0xd1f6, 0xd1f6, 0xd1f6, 0xd1f6, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f3, 0xd1f3, 0xd1f3, 0xd1f3, 0xd1f3, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f0, 0xd1f0, 0xd1f0, 0xd1f0, 0xd1f0, 0xd1f0, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1ea, 0xd1ea, 0xd1ea, 0xd1ea, 0xd1ea, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1df, 0xd1df, 0xd1df, 0xd1df, 0xd1df, 0xd1df, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dc, 0xd1dc, 0xd1dc, 0xd1dc, 0xd1dc, 0xd1dc, 0xd1db, 0xd1db, 0xd1db, 0xd1db, 0xd1db, 0xd1db, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d0, 0xd1d0, 0xd1d0, 0xd1d0, 0xd1d0, 0xd1d0, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1af, 0xd1af, 0xd1af, 0xd1af, 0xd1af, 0xd1af, 0xd1af, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd199, 0xd199, 0xd199, 0xd199, 0xd199, 0xd199, 0xd199, 0xd199, 0xd198, 0xd198, 0xd198, 0xd198, 0xd198, 0xd198, 0xd198, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, 0xd195, 0xd195, 0xd195, 0xd195, 0xd195, 0xd195, 0xd195, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18b, 0xd18b, 0xd18b, 0xd18b, 0xd18a, 0xd18a, 0xd18a, 0xd18a, 0xd189, 0xd189, 0xd189, 0xd189, 0xd188, 0xd188, 0xd188, 0xd188, 0xd187, 0xd187, 0xd187, 0xd187, 0xd186, 0xd186, 0xd186, 0xd186, 0xd185, 0xd185, 0xd185, 0xd185, 0xd184, 0xd184, 0xd184, 0xd184, 0xd183, 0xd183, 0xd183, 0xd183, 0xd182, 0xd182, 0xd182, 0xd182, 0xd182, 0xd181, 0xd181, 0xd181, 0xd181, 0xd180, 0xd180, 0xd180, 0xd180, 0xd17f, 0xd17f, 0xd17f, 0xd17f, 0xd17e, 0xd17e, 0xd17e, 0xd17e, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17c, 0xd17c, 0xd17c, 0xd17c, 0xd17b, 0xd17b, 0xd17b, 0xd17b, 0xd17a, 0xd17a, 0xd17a, 0xd17a, 0xd179, 0xd179, 0xd179, 0xd179, 0xd179, 0xd178, 0xd178, 0xd178, 0xd178, 0xd177, 0xd177, 0xd177, 0xd177, 0xd176, 0xd176, 0xd176, 0xd176, 0xd176, 0xd175, 0xd175, 0xd175, 0xd175, 0xd174, 0xd174, 0xd174, 0xd174, 0xd173, 0xd173, 0xd173, 0xd173, 0xd173, 0xd172, 0xd172, 0xd172, 0xd172, 0xd171, 0xd171, 0xd171, 0xd171, 0xd171, 0xd170, 0xd170, 0xd170, 0xd170, 0xd16f, 0xd16f, 0xd16f, 0xd16f, 0xd16f, 0xd16e, 0xd16e, 0xd16e, 0xd16e, 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16c, 0xd16c, 0xd16c, 0xd16c, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16a, 0xd16a, 0xd16a, 0xd16a, 0xd169, 0xd169, 0xd169, 0xd169, 0xd169, 0xd168, 0xd168, 0xd168, 0xd168, 0xd167, 0xd167, 0xd167, 0xd167, 0xd167, 0xd166, 0xd166, 0xd166, 0xd166, 0xd166, 0xd165, 0xd165, 0xd165, 0xd165, 0xd164, 0xd164, 0xd164, 0xd164, 0xd164, 0xd163, 0xd163, 0xd163, 0xd163, 0xd163, 0xd162, 0xd162, 0xd162, 0xd162, 0xd161, 0xd161, 0xd161, 0xd161, 0xd161, 0xd160, 0xd160, 0xd160, 0xd160, 0xd160, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15e, 0xd15e, 0xd15e, 0xd15e, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15c, 0xd15c, 0xd15c, 0xd15c, 0xd15c, 0xd15b, 0xd15b, 0xd15b, 0xd15b, 0xd15b, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd159, 0xd159, 0xd159, 0xd159, 0xd159, 0xd158, 0xd158, 0xd158, 0xd158, 0xd157, 0xd157, 0xd157, 0xd157, 0xd157, 0xd156, 0xd156, 0xd156, 0xd156, 0xd156, 0xd155, 0xd155, 0xd155, 0xd155, 0xd155, 0xd154, 0xd154, 0xd154, 0xd154, 0xd154, 0xd153, 0xd153, 0xd153, 0xd153, 0xd153, 0xd152, 0xd152, 0xd152, 0xd152, 0xd152, 0xd151, 0xd151, 0xd151, 0xd151, 0xd151, 0xd150, 0xd150, 0xd150, 0xd150, 0xd150, 0xd14f, 0xd14f, 0xd14f, 0xd14f, 0xd14f, 0xd14e, 0xd14e, 0xd14e, 0xd14e, 0xd14e, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14c, 0xd14c, 0xd14c, 0xd14c, 0xd14c, 0xd14b, 0xd14b, 0xd14b, 0xd14b, 0xd14b, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd149, 0xd149, 0xd149, 0xd149, 0xd149, 0xd148, 0xd148, 0xd148, 0xd148, 0xd148, 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd146, 0xd146, 0xd146, 0xd146, 0xd146, 0xd145, 0xd145, 0xd145, 0xd145, 0xd145, 0xd144, 0xd144, 0xd144, 0xd144, 0xd144, 0xd143, 0xd143, 0xd143, 0xd143, 0xd143, 0xd143, 0xd142, 0xd142, 0xd142, 0xd142, 0xd142, 0xd141, 0xd141, 0xd141, 0xd141, 0xd141, 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd140, 0xd13f, 0xd13f, 0xd13f, 0xd13f, 0xd13f, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13d, 0xd13d, 0xd13d, 0xd13d, 0xd13d, 0xd13c, 0xd13c, 0xd13c, 0xd13c, 0xd13c, 0xd13c, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13a, 0xd13a, 0xd13a, 0xd13a, 0xd13a, 0xd139, 0xd139, 0xd139, 0xd139, 0xd139, 0xd139, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd137, 0xd137, 0xd137, 0xd137, 0xd137, 0xd136, 0xd136, 0xd136, 0xd136, 0xd136, 0xd136, 0xd135, 0xd135, 0xd135, 0xd135, 0xd135, 0xd134, 0xd134, 0xd134, 0xd134, 0xd134, 0xd134, 0xd133, 0xd133, 0xd133, 0xd133, 0xd133, 0xd133, 0xd132, 0xd132, 0xd132, 0xd132, 0xd132, 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd130, 0xd130, 0xd130, 0xd130, 0xd130, 0xd130, 0xd12f, 0xd12f, 0xd12f, 0xd12f, 0xd12f, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12c, 0xd12c, 0xd12c, 0xd12c, 0xd12c, 0xd12c, 0xd12b, 0xd12b, 0xd12b, 0xd12b, 0xd12b, 0xd12b, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd129, 0xd129, 0xd129, 0xd129, 0xd129, 0xd129, 0xd128, 0xd128, 0xd128, 0xd128, 0xd128, 0xd128, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd125, 0xd125, 0xd125, 0xd125, 0xd125, 0xd125, 0xd124, 0xd124, 0xd124, 0xd124, 0xd124, 0xd124, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd121, 0xd121, 0xd121, 0xd121, 0xd121, 0xd121, 0xd120, 0xd120, 0xd120, 0xd120, 0xd120, 0xd120, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11c, 0xd11c, 0xd11c, 0xd11c, 0xd11c, 0xd11c, 0xd11b, 0xd11b, 0xd11b, 0xd11b, 0xd11b, 0xd11b, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd118, 0xd118, 0xd118, 0xd118, 0xd118, 0xd118, 0xd117, 0xd117, 0xd117, 0xd117, 0xd117, 0xd117, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd114, 0xd114, 0xd114, 0xd114, 0xd114, 0xd114, 0xd113, 0xd113, 0xd113, 0xd113, 0xd113, 0xd113, 0xd113, 0xd112, 0xd112, 0xd112, 0xd112, 0xd112, 0xd112, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10e, 0xd10e, 0xd10e, 0xd10e, 0xd10e, 0xd10e, 0xd10d, 0xd10d, 0xd10d, 0xd10d, 0xd10d, 0xd10d, 0xd10d, 0xd10c, 0xd10c, 0xd10c, 0xd10c, 0xd10c, 0xd10c, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd109, 0xd109, 0xd109, 0xd109, 0xd109, 0xd109, 0xd109, 0xd108, 0xd108, 0xd108, 0xd108, 0xd108, 0xd108, 0xd108, 0xd107, 0xd107, 0xd107, 0xd107, 0xd107, 0xd107, 0xd107, 0xd106, 0xd106, 0xd106, 0xd106, 0xd106, 0xd106, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd102, 0xd102, 0xd102, 0xd102, 0xd102, 0xd102, 0xd101, 0xd101, 0xd101, 0xd101, 0xd101, 0xd101, 0xd101, 0xd100, 0xd100, 0xd100, 0xd100, 0xd100, 0xd100, 0xd100, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0da, 0xd0da, 0xd0da, 0xd0da, 0xd0da, 0xd0da, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d8, 0xd0d8, 0xd0d8, 0xd0d8, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d6, 0xd0d6, 0xd0d6, 0xd0d6, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d4, 0xd0d4, 0xd0d4, 0xd0d4, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d1, 0xd0d1, 0xd0d1, 0xd0d1, 0xd0d0, 0xd0d0, 0xd0d0, 0xd0d0, 0xd0cf, 0xd0cf, 0xd0cf, 0xd0cf, 0xd0ce, 0xd0ce, 0xd0ce, 0xd0ce, 0xd0cd, 0xd0cd, 0xd0cd, 0xd0cd, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cb, 0xd0cb, 0xd0cb, 0xd0cb, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0c9, 0xd0c9, 0xd0c9, 0xd0c9, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c7, 0xd0c7, 0xd0c7, 0xd0c7, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c5, 0xd0c5, 0xd0c5, 0xd0c5, 0xd0c5, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c3, 0xd0c3, 0xd0c3, 0xd0c3, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c0, 0xd0c0, 0xd0c0, 0xd0c0, 0xd0c0, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bc, 0xd0bc, 0xd0bc, 0xd0bc, 0xd0bc, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0ba, 0xd0ba, 0xd0ba, 0xd0ba, 0xd0ba, 0xd0b9, 0xd0b9, 0xd0b9, 0xd0b9, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b7, 0xd0b7, 0xd0b7, 0xd0b7, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b5, 0xd0b5, 0xd0b5, 0xd0b5, 0xd0b5, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b0, 0xd0b0, 0xd0b0, 0xd0b0, 0xd0b0, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0ae, 0xd0ae, 0xd0ae, 0xd0ae, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ab, 0xd0ab, 0xd0ab, 0xd0ab, 0xd0ab, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a8, 0xd0a8, 0xd0a8, 0xd0a8, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a6, 0xd0a6, 0xd0a6, 0xd0a6, 0xd0a6, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a1, 0xd0a1, 0xd0a1, 0xd0a1, 0xd0a1, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09e, 0xd09e, 0xd09e, 0xd09e, 0xd09e, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09c, 0xd09c, 0xd09c, 0xd09c, 0xd09c, 0xd09b, 0xd09b, 0xd09b, 0xd09b, 0xd09b, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd099, 0xd099, 0xd099, 0xd099, 0xd099, 0xd098, 0xd098, 0xd098, 0xd098, 0xd098, 0xd097, 0xd097, 0xd097, 0xd097, 0xd097, 0xd096, 0xd096, 0xd096, 0xd096, 0xd096, 0xd095, 0xd095, 0xd095, 0xd095, 0xd095, 0xd095, 0xd094, 0xd094, 0xd094, 0xd094, 0xd094, 0xd093, 0xd093, 0xd093, 0xd093, 0xd093, 0xd092, 0xd092, 0xd092, 0xd092, 0xd092, 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd090, 0xd090, 0xd090, 0xd090, 0xd090, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08d, 0xd08d, 0xd08d, 0xd08d, 0xd08d, 0xd08c, 0xd08c, 0xd08c, 0xd08c, 0xd08c, 0xd08c, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd089, 0xd089, 0xd089, 0xd089, 0xd089, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd087, 0xd087, 0xd087, 0xd087, 0xd087, 0xd086, 0xd086, 0xd086, 0xd086, 0xd086, 0xd086, 0xd085, 0xd085, 0xd085, 0xd085, 0xd085, 0xd084, 0xd084, 0xd084, 0xd084, 0xd084, 0xd084, 0xd083, 0xd083, 0xd083, 0xd083, 0xd083, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd080, 0xd080, 0xd080, 0xd080, 0xd080, 0xd07f, 0xd07f, 0xd07f, 0xd07f, 0xd07f, 0xd07f, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07c, 0xd07c, 0xd07c, 0xd07c, 0xd07c, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd079, 0xd079, 0xd079, 0xd079, 0xd079, 0xd079, 0xd078, 0xd078, 0xd078, 0xd078, 0xd078, 0xd078, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd075, 0xd075, 0xd075, 0xd075, 0xd075, 0xd074, 0xd074, 0xd074, 0xd074, 0xd074, 0xd074, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd072, 0xd072, 0xd072, 0xd072, 0xd072, 0xd072, 0xd071, 0xd071, 0xd071, 0xd071, 0xd071, 0xd071, 0xd070, 0xd070, 0xd070, 0xd070, 0xd070, 0xd070, 0xd070, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06d, 0xd06d, 0xd06d, 0xd06d, 0xd06d, 0xd06d, 0xd06c, 0xd06c, 0xd06c, 0xd06c, 0xd06c, 0xd06c, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd069, 0xd069, 0xd069, 0xd069, 0xd069, 0xd069, 0xd069, 0xd068, 0xd068, 0xd068, 0xd068, 0xd068, 0xd068, 0xd067, 0xd067, 0xd067, 0xd067, 0xd067, 0xd067, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd064, 0xd064, 0xd064, 0xd064, 0xd064, 0xd064, 0xd063, 0xd063, 0xd063, 0xd063, 0xd063, 0xd063, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd05f, 0xd05f, 0xd05f, 0xd05f, 0xd05f, 0xd05f, 0xd05e, 0xd05e, 0xd05e, 0xd05e, 0xd05e, 0xd05e, 0xd05e, 0xd05d, 0xd05d, 0xd05d, 0xd05d, 0xd05d, 0xd05d, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd059, 0xd059, 0xd059, 0xd059, 0xd059, 0xd059, 0xd059, 0xd058, 0xd058, 0xd058, 0xd058, 0xd058, 0xd058, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd054, 0xd054, 0xd054, 0xd054, 0xd054, 0xd054, 0xd054, 0xd053, 0xd053, 0xd053, 0xd053, 0xd053, 0xd053, 0xd053, 0xd052, 0xd052, 0xd052, 0xd052, 0xd052, 0xd052, 0xd052, 0xd051, 0xd051, 0xd051, 0xd051, 0xd051, 0xd051, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04b, 0xd04b, 0xd04b, 0xd04b, 0xd04b, 0xd04b, 0xd04b, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd043, 0xd043, 0xd043, 0xd043, 0xd043, 0xd043, 0xd043, 0xd042, 0xd042, 0xd042, 0xd042, 0xd042, 0xd042, 0xd042, 0xd041, 0xd041, 0xd041, 0xd041, 0xd041, 0xd041, 0xd041, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd036, 0xd036, 0xd036, 0xd036, 0xd036, 0xd036, 0xd036, 0xd035, 0xd035, 0xd035, 0xd035, 0xd035, 0xd035, 0xd035, 0xd035, 0xd034, 0xd034, 0xd034, 0xd034, 0xd034, 0xd034, 0xd034, 0xd034, 0xd033, 0xd033, 0xd033, 0xd033, 0xd033, 0xd033, 0xd033, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, 0xd028, 0xd028, 0xd028, 0xd028, 0xd027, 0xd027, 0xd027, 0xd027, 0xd026, 0xd026, 0xd026, 0xd026, 0xd025, 0xd025, 0xd025, 0xd025, 0xd024, 0xd024, 0xd024, 0xd024, 0xd023, 0xd023, 0xd023, 0xd023, 0xd022, 0xd022, 0xd022, 0xd022, 0xd022, 0xd021, 0xd021, 0xd021, 0xd021, 0xd020, 0xd020, 0xd020, 0xd020, 0xd01f, 0xd01f, 0xd01f, 0xd01f, 0xd01e, 0xd01e, 0xd01e, 0xd01e, 0xd01d, 0xd01d, 0xd01d, 0xd01d, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01b, 0xd01b, 0xd01b, 0xd01b, 0xd01a, 0xd01a, 0xd01a, 0xd01a, 0xd019, 0xd019, 0xd019, 0xd019, 0xd018, 0xd018, 0xd018, 0xd018, 0xd018, 0xd017, 0xd017, 0xd017, 0xd017, 0xd016, 0xd016, 0xd016, 0xd016, 0xd015, 0xd015, 0xd015, 0xd015, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd013, 0xd013, 0xd013, 0xd013, 0xd012, 0xd012, 0xd012, 0xd012, 0xd012, 0xd011, 0xd011, 0xd011, 0xd011, 0xd010, 0xd010, 0xd010, 0xd010, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00e, 0xd00e, 0xd00e, 0xd00e, 0xd00d, 0xd00d, 0xd00d, 0xd00d, 0xd00d, 0xd00c, 0xd00c, 0xd00c, 0xd00c, 0xd00b, 0xd00b, 0xd00b, 0xd00b, 0xd00b, 0xd00a, 0xd00a, 0xd00a, 0xd00a, 0xd009, 0xd009, 0xd009, 0xd009, 0xd009, 0xd008, 0xd008, 0xd008, 0xd008, 0xd007, 0xd007, 0xd007, 0xd007, 0xd007, 0xd006, 0xd006, 0xd006, 0xd006, 0xd005, 0xd005, 0xd005, 0xd005, 0xd005, 0xd004, 0xd004, 0xd004, 0xd004, 0xd004, 0xd003, 0xd003, 0xd003, 0xd003, 0xd002, 0xd002, 0xd002, 0xd002, 0xd002, 0xd001, 0xd001, 0xd001, 0xd001, 0xd000, 0xd000, 0xd000, 0xd000, 0xcfff, 0xcfff, 0xcffe, 0xcffe, 0xcffe, 0xcffd, 0xcffd, 0xcffc, 0xcffc, 0xcffb, 0xcffb, 0xcffb, 0xcffa, 0xcffa, 0xcff9, 0xcff9, 0xcff9, 0xcff8, 0xcff8, 0xcff7, 0xcff7, 0xcff6, 0xcff6, 0xcff6, 0xcff5, 0xcff5, 0xcff4, 0xcff4, 0xcff3, 0xcff3, 0xcff3, 0xcff2, 0xcff2, 0xcff1, 0xcff1, 0xcff1, 0xcff0, 0xcff0, 0xcfef, 0xcfef, 0xcfef, 0xcfee, 0xcfee, 0xcfed, 0xcfed, 0xcfec, 0xcfec, 0xcfec, 0xcfeb, 0xcfeb, 0xcfea, 0xcfea, 0xcfea, 0xcfe9, 0xcfe9, 0xcfe8, 0xcfe8, 0xcfe8, 0xcfe7, 0xcfe7, 0xcfe6, 0xcfe6, 0xcfe6, 0xcfe5, 0xcfe5, 0xcfe4, 0xcfe4, 0xcfe4, 0xcfe3, 0xcfe3, 0xcfe2, 0xcfe2, 0xcfe2, 0xcfe1, 0xcfe1, 0xcfe0, 0xcfe0, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfde, 0xcfde, 0xcfde, 0xcfdd, 0xcfdd, 0xcfdc, 0xcfdc, 0xcfdc, 0xcfdb, 0xcfdb, 0xcfda, 0xcfda, 0xcfda, 0xcfd9, 0xcfd9, 0xcfd8, 0xcfd8, 0xcfd8, 0xcfd7, 0xcfd7, 0xcfd6, 0xcfd6, 0xcfd6, 0xcfd5, 0xcfd5, 0xcfd4, 0xcfd4, 0xcfd4, 0xcfd3, 0xcfd3, 0xcfd2, 0xcfd2, 0xcfd2, 0xcfd1, 0xcfd1, 0xcfd1, 0xcfd0, 0xcfd0, 0xcfcf, 0xcfcf, 0xcfcf, 0xcfce, 0xcfce, 0xcfcd, 0xcfcd, 0xcfcd, 0xcfcc, 0xcfcc, 0xcfcb, 0xcfcb, 0xcfcb, 0xcfca, 0xcfca, 0xcfca, 0xcfc9, 0xcfc9, 0xcfc8, 0xcfc8, 0xcfc8, 0xcfc7, 0xcfc7, 0xcfc6, 0xcfc6, 0xcfc6, 0xcfc5, 0xcfc5, 0xcfc5, 0xcfc4, 0xcfc4, 0xcfc3, 0xcfc3, 0xcfc3, 0xcfc2, 0xcfc2, 0xcfc2, 0xcfc1, 0xcfc1, 0xcfc0, 0xcfc0, 0xcfc0, 0xcfbf, 0xcfbf, 0xcfbf, 0xcfbe, 0xcfbe, 0xcfbd, 0xcfbd, 0xcfbd, 0xcfbc, 0xcfbc, 0xcfbc, 0xcfbb, 0xcfbb, 0xcfba, 0xcfba, 0xcfba, 0xcfb9, 0xcfb9, 0xcfb9, 0xcfb8, 0xcfb8, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb6, 0xcfb6, 0xcfb6, 0xcfb5, 0xcfb5, 0xcfb5, 0xcfb4, 0xcfb4, 0xcfb3, 0xcfb3, 0xcfb3, 0xcfb2, 0xcfb2, 0xcfb2, 0xcfb1, 0xcfb1, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfaf, 0xcfaf, 0xcfaf, 0xcfae, 0xcfae, 0xcfae, 0xcfad, 0xcfad, 0xcfac, 0xcfac, 0xcfac, 0xcfab, 0xcfab, 0xcfab, 0xcfaa, 0xcfaa, 0xcfaa, 0xcfa9, 0xcfa9, 0xcfa9, 0xcfa8, 0xcfa8, 0xcfa7, 0xcfa7, 0xcfa7, 0xcfa6, 0xcfa6, 0xcfa6, 0xcfa5, 0xcfa5, 0xcfa5, 0xcfa4, 0xcfa4, 0xcfa4, 0xcfa3, 0xcfa3, 0xcfa2, 0xcfa2, 0xcfa2, 0xcfa1, 0xcfa1, 0xcfa1, 0xcfa0, 0xcfa0, 0xcfa0, 0xcf9f, 0xcf9f, 0xcf9f, 0xcf9e, 0xcf9e, 0xcf9d, 0xcf9d, 0xcf9d, 0xcf9c, 0xcf9c, 0xcf9c, 0xcf9b, 0xcf9b, 0xcf9b, 0xcf9a, 0xcf9a, 0xcf9a, 0xcf99, 0xcf99, 0xcf99, 0xcf98, 0xcf98, 0xcf98, 0xcf97, 0xcf97, 0xcf96, 0xcf96, 0xcf96, 0xcf95, 0xcf95, 0xcf95, 0xcf94, 0xcf94, 0xcf94, 0xcf93, 0xcf93, 0xcf93, 0xcf92, 0xcf92, 0xcf92, 0xcf91, 0xcf91, 0xcf91, 0xcf90, 0xcf90, 0xcf90, 0xcf8f, 0xcf8f, 0xcf8f, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8d, 0xcf8d, 0xcf8d, 0xcf8c, 0xcf8c, 0xcf8c, 0xcf8b, 0xcf8b, 0xcf8a, 0xcf8a, 0xcf8a, 0xcf89, 0xcf89, 0xcf89, 0xcf88, 0xcf88, 0xcf88, 0xcf87, 0xcf87, 0xcf87, 0xcf86, 0xcf86, 0xcf86, 0xcf85, 0xcf85, 0xcf85, 0xcf84, 0xcf84, 0xcf84, 0xcf83, 0xcf83, 0xcf83, 0xcf82, 0xcf82, 0xcf82, 0xcf81, 0xcf81, 0xcf81, 0xcf80, 0xcf80, 0xcf80, 0xcf7f, 0xcf7f, 0xcf7f, 0xcf7e, 0xcf7e, 0xcf7e, 0xcf7d, 0xcf7d, 0xcf7d, 0xcf7c, 0xcf7c, 0xcf7c, 0xcf7b, 0xcf7b, 0xcf7b, 0xcf7a, 0xcf7a, 0xcf7a, 0xcf79, 0xcf79, 0xcf79, 0xcf79, 0xcf78, 0xcf78, 0xcf78, 0xcf77, 0xcf77, 0xcf77, 0xcf76, 0xcf76, 0xcf76, 0xcf75, 0xcf75, 0xcf75, 0xcf74, 0xcf74, 0xcf74, 0xcf73, 0xcf73, 0xcf73, 0xcf72, 0xcf72, 0xcf72, 0xcf71, 0xcf71, 0xcf71, 0xcf70, 0xcf70, 0xcf70, 0xcf6f, 0xcf6f, 0xcf6f, 0xcf6e, 0xcf6e, 0xcf6e, 0xcf6d, 0xcf6d, 0xcf6d, 0xcf6d, 0xcf6c, 0xcf6c, 0xcf6c, 0xcf6b, 0xcf6b, 0xcf6b, 0xcf6a, 0xcf6a, 0xcf6a, 0xcf69, 0xcf69, 0xcf69, 0xcf68, 0xcf68, 0xcf68, 0xcf67, 0xcf67, 0xcf67, 0xcf66, 0xcf66, 0xcf66, 0xcf66, 0xcf65, 0xcf65, 0xcf65, 0xcf64, 0xcf64, 0xcf64, 0xcf63, 0xcf63, 0xcf63, 0xcf62, 0xcf62, 0xcf62, 0xcf61, 0xcf61, 0xcf61, 0xcf61, 0xcf60, 0xcf60, 0xcf60, 0xcf5f, 0xcf5f, 0xcf5f, 0xcf5e, 0xcf5e, 0xcf5e, 0xcf5d, 0xcf5d, 0xcf5d, 0xcf5c, 0xcf5c, 0xcf5c, 0xcf5c, 0xcf5b, 0xcf5b, 0xcf5b, 0xcf5a, 0xcf5a, 0xcf5a, 0xcf59, 0xcf59, 0xcf59, 0xcf58, 0xcf58, 0xcf58, 0xcf58, 0xcf57, 0xcf57, 0xcf57, 0xcf56, 0xcf56, 0xcf56, 0xcf55, 0xcf55, 0xcf55, 0xcf54, 0xcf54, 0xcf54, 0xcf54, 0xcf53, 0xcf53, 0xcf53, 0xcf52, 0xcf52, 0xcf52, 0xcf51, 0xcf51, 0xcf51, 0xcf51, 0xcf50, 0xcf50, 0xcf50, 0xcf4f, 0xcf4f, 0xcf4f, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4d, 0xcf4d, 0xcf4d, 0xcf4c, 0xcf4c, 0xcf4c, 0xcf4b, 0xcf4b, 0xcf4b, 0xcf4b, 0xcf4a, 0xcf4a, 0xcf4a, 0xcf49, 0xcf49, 0xcf49, 0xcf48, 0xcf48, 0xcf48, 0xcf48, 0xcf47, 0xcf47, 0xcf47, 0xcf46, 0xcf46, 0xcf46, 0xcf45, 0xcf45, 0xcf45, 0xcf45, 0xcf44, 0xcf44, 0xcf44, 0xcf43, 0xcf43, 0xcf43, 0xcf42, 0xcf42, 0xcf42, 0xcf42, 0xcf41, 0xcf41, 0xcf41, 0xcf40, 0xcf40, 0xcf40, 0xcf40, 0xcf3f, 0xcf3f, 0xcf3f, 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3d, 0xcf3d, 0xcf3d, 0xcf3c, 0xcf3c, 0xcf3c, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3a, 0xcf3a, 0xcf3a, 0xcf39, 0xcf39, 0xcf39, 0xcf39, 0xcf38, 0xcf38, 0xcf38, 0xcf37, 0xcf37, 0xcf37, 0xcf37, 0xcf36, 0xcf36, 0xcf36, 0xcf35, 0xcf35, 0xcf35, 0xcf35, 0xcf34, 0xcf34, 0xcf34, 0xcf33, 0xcf33, 0xcf33, 0xcf33, 0xcf32, 0xcf32, 0xcf32, 0xcf31, 0xcf31, 0xcf31, 0xcf31, 0xcf30, 0xcf30, 0xcf30, 0xcf2f, 0xcf2f, 0xcf2f, 0xcf2f, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2c, 0xcf2c, 0xcf2c, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2a, 0xcf2a, 0xcf2a, 0xcf29, 0xcf29, 0xcf29, 0xcf29, 0xcf28, 0xcf28, 0xcf28, 0xcf28, 0xcf27, 0xcf27, 0xcf27, 0xcf26, 0xcf26, 0xcf26, 0xcf26, 0xcf25, 0xcf25, 0xcf25, 0xcf24, 0xcf24, 0xcf24, 0xcf24, 0xcf23, 0xcf23, 0xcf23, 0xcf23, 0xcf22, 0xcf22, 0xcf22, 0xcf21, 0xcf21, 0xcf21, 0xcf21, 0xcf20, 0xcf20, 0xcf20, 0xcf1f, 0xcf1f, 0xcf1f, 0xcf1f, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1d, 0xcf1d, 0xcf1d, 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1a, 0xcf1a, 0xcf1a, 0xcf19, 0xcf19, 0xcf19, 0xcf19, 0xcf18, 0xcf18, 0xcf18, 0xcf18, 0xcf17, 0xcf17, 0xcf17, 0xcf16, 0xcf16, 0xcf16, 0xcf16, 0xcf15, 0xcf15, 0xcf15, 0xcf15, 0xcf14, 0xcf14, 0xcf14, 0xcf14, 0xcf13, 0xcf13, 0xcf13, 0xcf12, 0xcf12, 0xcf12, 0xcf12, 0xcf11, 0xcf11, 0xcf11, 0xcf11, 0xcf10, 0xcf10, 0xcf10, 0xcf10, 0xcf0f, 0xcf0f, 0xcf0f, 0xcf0e, 0xcf0e, 0xcf0e, 0xcf0e, 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0c, 0xcf0c, 0xcf0c, 0xcf0c, 0xcf0b, 0xcf0b, 0xcf0b, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf09, 0xcf09, 0xcf09, 0xcf09, 0xcf08, 0xcf08, 0xcf08, 0xcf08, 0xcf07, 0xcf07, 0xcf07, 0xcf07, 0xcf06, 0xcf06, 0xcf06, 0xcf05, 0xcf05, 0xcf05, 0xcf05, 0xcf04, 0xcf04, 0xcf04, 0xcf04, 0xcf03, 0xcf03, 0xcf03, 0xcf03, 0xcf02, 0xcf02, 0xcf02, 0xcf02, 0xcf01, 0xcf01, 0xcf01, 0xcf01, 0xcf00, 0xcf00, 0xcf00, 0xceff, 0xceff, 0xceff, 0xceff, 0xcefe, 0xcefe, 0xcefe, 0xcefe, 0xcefd, 0xcefd, 0xcefd, 0xcefd, 0xcefc, 0xcefc, 0xcefc, 0xcefc, 0xcefb, 0xcefb, 0xcefb, 0xcefb, 0xcefa, 0xcefa, 0xcefa, 0xcefa, 0xcef9, 0xcef9, 0xcef9, 0xcef9, 0xcef8, 0xcef8, 0xcef8, 0xcef8, 0xcef7, 0xcef7, 0xcef7, 0xcef7, 0xcef6, 0xcef6, 0xcef6, 0xcef6, 0xcef5, 0xcef5, 0xcef5, 0xcef4, 0xcef4, 0xcef4, 0xcef4, 0xcef3, 0xcef3, 0xcef3, 0xcef3, 0xcef2, 0xcef2, 0xcef2, 0xcef2, 0xcef1, 0xcef1, 0xcef1, 0xcef1, 0xcef0, 0xcef0, 0xcef0, 0xcef0, 0xceef, 0xceef, 0xceef, 0xceef, 0xceee, 0xceee, 0xceed, 0xceed, 0xceec, 0xceec, 0xceeb, 0xceeb, 0xceea, 0xceea, 0xcee9, 0xcee9, 0xcee8, 0xcee8, 0xcee8, 0xcee7, 0xcee7, 0xcee6, 0xcee6, 0xcee5, 0xcee5, 0xcee4, 0xcee4, 0xcee3, 0xcee3, 0xcee2, 0xcee2, 0xcee1, 0xcee1, 0xcee0, 0xcee0, 0xcedf, 0xcedf, 0xcede, 0xcede, 0xcedd, 0xcedd, 0xcedc, 0xcedc, 0xcedb, 0xcedb, 0xceda, 0xceda, 0xced9, 0xced9, 0xced8, 0xced8, 0xced7, 0xced7, 0xced7, 0xced6, 0xced6, 0xced5, 0xced5, 0xced4, 0xced4, 0xced3, 0xced3, 0xced2, 0xced2, 0xced1, 0xced1, 0xced0, 0xced0, 0xcecf, 0xcecf, 0xcece, 0xcece, 0xcece, 0xcecd, 0xcecd, 0xcecc, 0xcecc, 0xcecb, 0xcecb, 0xceca, 0xceca, 0xcec9, 0xcec9, 0xcec8, 0xcec8, 0xcec7, 0xcec7, 0xcec7, 0xcec6, 0xcec6, 0xcec5, 0xcec5, 0xcec4, 0xcec4, 0xcec3, 0xcec3, 0xcec2, 0xcec2, 0xcec1, 0xcec1, 0xcec1, 0xcec0, 0xcec0, 0xcebf, 0xcebf, 0xcebe, 0xcebe, 0xcebd, 0xcebd, 0xcebc, 0xcebc, 0xcebc, 0xcebb, 0xcebb, 0xceba, 0xceba, 0xceb9, 0xceb9, 0xceb8, 0xceb8, 0xceb8, 0xceb7, 0xceb7, 0xceb6, 0xceb6, 0xceb5, 0xceb5, 0xceb4, 0xceb4, 0xceb3, 0xceb3, 0xceb3, 0xceb2, 0xceb2, 0xceb1, 0xceb1, 0xceb0, 0xceb0, 0xceaf, 0xceaf, 0xceaf, 0xceae, 0xceae, 0xcead, 0xcead, 0xceac, 0xceac, 0xceac, 0xceab, 0xceab, 0xceaa, 0xceaa, 0xcea9, 0xcea9, 0xcea8, 0xcea8, 0xcea8, 0xcea7, 0xcea7, 0xcea6, 0xcea6, 0xcea5, 0xcea5, 0xcea5, 0xcea4, 0xcea4, 0xcea3, 0xcea3, 0xcea2, 0xcea2, 0xcea2, 0xcea1, 0xcea1, 0xcea0, 0xcea0, 0xce9f, 0xce9f, 0xce9f, 0xce9e, 0xce9e, 0xce9d, 0xce9d, 0xce9c, 0xce9c, 0xce9c, 0xce9b, 0xce9b, 0xce9a, 0xce9a, 0xce99, 0xce99, 0xce99, 0xce98, 0xce98, 0xce97, 0xce97, 0xce96, 0xce96, 0xce96, 0xce95, 0xce95, 0xce94, 0xce94, 0xce94, 0xce93, 0xce93, 0xce92, 0xce92, 0xce91, 0xce91, 0xce91, 0xce90, 0xce90, 0xce8f, 0xce8f, 0xce8f, 0xce8e, 0xce8e, 0xce8d, 0xce8d, 0xce8c, 0xce8c, 0xce8c, 0xce8b, 0xce8b, 0xce8a, 0xce8a, 0xce8a, 0xce89, 0xce89, 0xce88, 0xce88, 0xce88, 0xce87, 0xce87, 0xce86, 0xce86, 0xce85, 0xce85, 0xce85, 0xce84, 0xce84, 0xce83, 0xce83, 0xce83, 0xce82, 0xce82, 0xce81, 0xce81, 0xce81, 0xce80, 0xce80, 0xce7f, 0xce7f, 0xce7f, 0xce7e, 0xce7e, 0xce7d, 0xce7d, 0xce7d, 0xce7c, 0xce7c, 0xce7b, 0xce7b, 0xce7b, 0xce7a, 0xce7a, 0xce79, 0xce79, 0xce79, 0xce78, 0xce78, 0xce77, 0xce77, 0xce77, 0xce76, 0xce76, 0xce75, 0xce75, 0xce75, 0xce74, 0xce74, 0xce73, 0xce73, 0xce73, 0xce72, 0xce72, 0xce72, 0xce71, 0xce71, 0xce70, 0xce70, 0xce70, 0xce6f, 0xce6f, 0xce6e, 0xce6e, 0xce6e, 0xce6d, 0xce6d, 0xce6c, 0xce6c, 0xce6c, 0xce6b, 0xce6b, 0xce6b, 0xce6a, 0xce6a, 0xce69, 0xce69, 0xce69, 0xce68, 0xce68, 0xce67, 0xce67, 0xce67, 0xce66, 0xce66, 0xce66, 0xce65, 0xce65, 0xce64, 0xce64, 0xce64, 0xce63, 0xce63, 0xce62, 0xce62, 0xce62, 0xce61, 0xce61, 0xce61, 0xce60, 0xce60, 0xce5f, 0xce5f, 0xce5f, 0xce5e, 0xce5e, 0xce5e, 0xce5d, 0xce5d, 0xce5c, 0xce5c, 0xce5c, 0xce5b, 0xce5b, 0xce5b, 0xce5a, 0xce5a, 0xce59, 0xce59, 0xce59, 0xce58, 0xce58, 0xce58, 0xce57, 0xce57, 0xce56, 0xce56, 0xce56, 0xce55, 0xce55, 0xce55, 0xce54, 0xce54, 0xce53, 0xce53, 0xce53, 0xce52, 0xce52, 0xce52, 0xce51, 0xce51, 0xce51, 0xce50, 0xce50, 0xce4f, 0xce4f, 0xce4f, 0xce4e, 0xce4e, 0xce4e, 0xce4d, 0xce4d, 0xce4d, 0xce4c, 0xce4c, 0xce4b, 0xce4b, 0xce4b, 0xce4a, 0xce4a, 0xce4a, 0xce49, 0xce49, 0xce49, 0xce48, 0xce48, 0xce47, 0xce47, 0xce47, 0xce46, 0xce46, 0xce46, 0xce45, 0xce45, 0xce45, 0xce44, 0xce44, 0xce43, 0xce43, 0xce43, 0xce42, 0xce42, 0xce42, 0xce41, 0xce41, 0xce41, 0xce40, 0xce40, 0xce40, 0xce3f, 0xce3f, 0xce3e, 0xce3e, 0xce3e, 0xce3d, 0xce3d, 0xce3d, 0xce3c, 0xce3c, 0xce3c, 0xce3b, 0xce3b, 0xce3b, 0xce3a, 0xce3a, 0xce3a, 0xce39, 0xce39, 0xce38, 0xce38, 0xce38, 0xce37, 0xce37, 0xce37, 0xce36, 0xce36, 0xce36, 0xce35, 0xce35, 0xce35, 0xce34, 0xce34, 0xce34, 0xce33, 0xce33, 0xce33, 0xce32, 0xce32, 0xce32, 0xce31, 0xce31, 0xce30, 0xce30, 0xce30, 0xce2f, 0xce2f, 0xce2f, 0xce2e, 0xce2e, 0xce2e, 0xce2d, 0xce2d, 0xce2d, 0xce2c, 0xce2c, 0xce2c, 0xce2b, 0xce2b, 0xce2b, 0xce2a, 0xce2a, 0xce2a, 0xce29, 0xce29, 0xce29, 0xce28, 0xce28, 0xce28, 0xce27, 0xce27, 0xce27, 0xce26, 0xce26, 0xce26, 0xce25, 0xce25, 0xce25, 0xce24, 0xce24, 0xce24, 0xce23, 0xce23, 0xce23, 0xce22, 0xce22, 0xce22, 0xce21, 0xce21, 0xce21, 0xce20, 0xce20, 0xce20, 0xce1f, 0xce1f, 0xce1f, 0xce1e, 0xce1e, 0xce1e, 0xce1d, 0xce1d, 0xce1d, 0xce1c, 0xce1c, 0xce1c, 0xce1b, 0xce1b, 0xce1b, 0xce1a, 0xce1a, 0xce1a, 0xce19, 0xce19, 0xce19, 0xce18, 0xce18, 0xce18, 0xce17, 0xce17, 0xce17, 0xce16, 0xce16, 0xce16, 0xce15, 0xce15, 0xce15, 0xce14, 0xce14, 0xce14, 0xce13, 0xce13, 0xce13, 0xce12, 0xce12, 0xce12, 0xce11, 0xce11, 0xce11, 0xce10, 0xce10, 0xce10, 0xce0f, 0xce0f, 0xce0f, 0xce0e, 0xce0e, 0xce0e, 0xce0d, 0xce0d, 0xce0d, 0xce0d, 0xce0c, 0xce0c, 0xce0c, 0xce0b, 0xce0b, 0xce0b, 0xce0a, 0xce0a, 0xce0a, 0xce09, 0xce09, 0xce09, 0xce08, 0xce08, 0xce08, 0xce07, 0xce07, 0xce07, 0xce06, 0xce06, 0xce06, 0xce05, 0xce05, 0xce05, 0xce05, 0xce04, 0xce04, 0xce04, 0xce03, 0xce03, 0xce03, 0xce02, 0xce02, 0xce02, 0xce01, 0xce01, 0xce01, 0xce00, 0xce00, 0xce00, 0xce00, 0xcdff, 0xcdff, 0xcdff, 0xcdfe, 0xcdfe, 0xcdfe, 0xcdfd, 0xcdfd, 0xcdfd, 0xcdfc, 0xcdfc, 0xcdfc, 0xcdfb, 0xcdfb, 0xcdfb, 0xcdfb, 0xcdfa, 0xcdfa, 0xcdfa, 0xcdf9, 0xcdf9, 0xcdf9, 0xcdf8, 0xcdf8, 0xcdf8, 0xcdf7, 0xcdf7, 0xcdf7, 0xcdf6, 0xcdf6, 0xcdf6, 0xcdf6, 0xcdf5, 0xcdf5, 0xcdf5, 0xcdf4, 0xcdf4, 0xcdf4, 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf2, 0xcdf2, 0xcdf2, 0xcdf1, 0xcdf1, 0xcdf1, 0xcdf0, 0xcdf0, 0xcdf0, 0xcdef, 0xcdef, 0xcdef, 0xcdef, 0xcdee, 0xcdee, 0xcdee, 0xcded, 0xcded, 0xcded, 0xcdec, 0xcdec, 0xcdec, 0xcdec, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdea, 0xcdea, 0xcdea, 0xcde9, 0xcde9, 0xcde9, 0xcde9, 0xcde8, 0xcde8, 0xcde8, 0xcde7, 0xcde7, 0xcde7, 0xcde6, 0xcde6, 0xcde6, 0xcde6, 0xcde5, 0xcde5, 0xcde5, 0xcde4, 0xcde4, 0xcde4, 0xcde3, 0xcde3, 0xcde3, 0xcde3, 0xcde2, 0xcde2, 0xcde2, 0xcde1, 0xcde1, 0xcde1, 0xcde0, 0xcde0, 0xcde0, 0xcde0, 0xcddf, 0xcddf, 0xcddf, 0xcdde, 0xcdde, 0xcdde, 0xcdde, 0xcddd, 0xcddd, 0xcddd, 0xcddc, 0xcddc, 0xcddc, 0xcddb, 0xcddb, 0xcddb, 0xcddb, 0xcdda, 0xcdda, 0xcdda, 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd8, 0xcdd8, 0xcdd8, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd6, 0xcdd6, 0xcdd6, 0xcdd5, 0xcdd5, 0xcdd5, 0xcdd5, 0xcdd4, 0xcdd4, 0xcdd4, 0xcdd3, 0xcdd3, 0xcdd3, 0xcdd3, 0xcdd2, 0xcdd2, 0xcdd2, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd0, 0xcdd0, 0xcdd0, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdce, 0xcdce, 0xcdce, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcc, 0xcdcc, 0xcdcc, 0xcdcb, 0xcdcb, 0xcdcb, 0xcdcb, 0xcdca, 0xcdca, 0xcdca, 0xcdc9, 0xcdc9, 0xcdc9, 0xcdc9, 0xcdc8, 0xcdc8, 0xcdc8, 0xcdc7, 0xcdc7, 0xcdc7, 0xcdc7, 0xcdc6, 0xcdc6, 0xcdc6, 0xcdc5, 0xcdc5, 0xcdc5, 0xcdc5, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc3, 0xcdc3, 0xcdc3, 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc1, 0xcdc1, 0xcdc1, 0xcdc0, 0xcdc0, 0xcdc0, 0xcdc0, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbe, 0xcdbe, 0xcdbe, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbc, 0xcdbc, 0xcdbc, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdba, 0xcdba, 0xcdba, 0xcdba, 0xcdb9, 0xcdb9, 0xcdb9, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb6, 0xcdb6, 0xcdb6, 0xcdb5, 0xcdb5, 0xcdb5, 0xcdb5, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb3, 0xcdb3, 0xcdb3, 0xcdb3, 0xcdb2, 0xcdb2, 0xcdb2, 0xcdb1, 0xcdb1, 0xcdb1, 0xcdb1, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdaf, 0xcdaf, 0xcdaf, 0xcdae, 0xcdae, 0xcdae, 0xcdae, 0xcdad, 0xcdad, 0xcdad, 0xcdad, 0xcdac, 0xcdac, 0xcdac, 0xcdac, 0xcdab, 0xcdab, 0xcdab, 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, 0xcda9, 0xcda9, 0xcda9, 0xcda9, 0xcda8, 0xcda8, 0xcda8, 0xcda8, 0xcda7, 0xcda7, 0xcda7, 0xcda7, 0xcda6, 0xcda6, 0xcda6, 0xcda5, 0xcda5, 0xcda5, 0xcda5, 0xcda4, 0xcda4, 0xcda4, 0xcda4, 0xcda3, 0xcda3, 0xcda3, 0xcda3, 0xcda2, 0xcda2, 0xcda2, 0xcda2, 0xcda1, 0xcda1, 0xcda1, 0xcda0, 0xcda0, 0xcda0, 0xcda0, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9e, 0xcd9e, 0xcd9e, 0xcd9e, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9c, 0xcd9c, 0xcd9c, 0xcd9c, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9a, 0xcd9a, 0xcd9a, 0xcd9a, 0xcd99, 0xcd99, 0xcd99, 0xcd98, 0xcd98, 0xcd98, 0xcd98, 0xcd97, 0xcd97, 0xcd97, 0xcd97, 0xcd96, 0xcd96, 0xcd96, 0xcd96, 0xcd95, 0xcd95, 0xcd95, 0xcd95, 0xcd94, 0xcd94, 0xcd94, 0xcd94, 0xcd93, 0xcd93, 0xcd93, 0xcd93, 0xcd92, 0xcd92, 0xcd92, 0xcd92, 0xcd91, 0xcd91, 0xcd91, 0xcd91, 0xcd90, 0xcd90, 0xcd90, 0xcd90, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8e, 0xcd8e, 0xcd8e, 0xcd8e, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8c, 0xcd8c, 0xcd8c, 0xcd8c, 0xcd8b, 0xcd8b, 0xcd8a, 0xcd8a, 0xcd89, 0xcd89, 0xcd88, 0xcd88, 0xcd87, 0xcd87, 0xcd86, 0xcd86, 0xcd85, 0xcd85, 0xcd84, 0xcd84, 0xcd83, 0xcd83, 0xcd82, 0xcd82, 0xcd81, 0xcd81, 0xcd80, 0xcd80, 0xcd7f, 0xcd7f, 0xcd7e, 0xcd7e, 0xcd7d, 0xcd7d, 0xcd7c, 0xcd7c, 0xcd7b, 0xcd7b, 0xcd7a, 0xcd7a, 0xcd79, 0xcd79, 0xcd78, 0xcd78, 0xcd77, 0xcd77, 0xcd77, 0xcd76, 0xcd76, 0xcd75, 0xcd75, 0xcd74, 0xcd74, 0xcd73, 0xcd73, 0xcd72, 0xcd72, 0xcd71, 0xcd71, 0xcd70, 0xcd70, 0xcd6f, 0xcd6f, 0xcd6e, 0xcd6e, 0xcd6d, 0xcd6d, 0xcd6d, 0xcd6c, 0xcd6c, 0xcd6b, 0xcd6b, 0xcd6a, 0xcd6a, 0xcd69, 0xcd69, 0xcd68, 0xcd68, 0xcd67, 0xcd67, 0xcd66, 0xcd66, 0xcd66, 0xcd65, 0xcd65, 0xcd64, 0xcd64, 0xcd63, 0xcd63, 0xcd62, 0xcd62, 0xcd61, 0xcd61, 0xcd60, 0xcd60, 0xcd60, 0xcd5f, 0xcd5f, 0xcd5e, 0xcd5e, 0xcd5d, 0xcd5d, 0xcd5c, 0xcd5c, 0xcd5b, 0xcd5b, 0xcd5a, 0xcd5a, 0xcd5a, 0xcd59, 0xcd59, 0xcd58, 0xcd58, 0xcd57, 0xcd57, 0xcd56, 0xcd56, 0xcd56, 0xcd55, 0xcd55, 0xcd54, 0xcd54, 0xcd53, 0xcd53, 0xcd52, 0xcd52, 0xcd51, 0xcd51, 0xcd51, 0xcd50, 0xcd50, 0xcd4f, 0xcd4f, 0xcd4e, 0xcd4e, 0xcd4d, 0xcd4d, 0xcd4d, 0xcd4c, 0xcd4c, 0xcd4b, 0xcd4b, 0xcd4a, 0xcd4a, 0xcd4a, 0xcd49, 0xcd49, 0xcd48, 0xcd48, 0xcd47, 0xcd47, 0xcd46, 0xcd46, 0xcd46, 0xcd45, 0xcd45, 0xcd44, 0xcd44, 0xcd43, 0xcd43, 0xcd43, 0xcd42, 0xcd42, 0xcd41, 0xcd41, 0xcd40, 0xcd40, 0xcd40, 0xcd3f, 0xcd3f, 0xcd3e, 0xcd3e, 0xcd3d, 0xcd3d, 0xcd3c, 0xcd3c, 0xcd3c, 0xcd3b, 0xcd3b, 0xcd3a, 0xcd3a, 0xcd3a, 0xcd39, 0xcd39, 0xcd38, 0xcd38, 0xcd37, 0xcd37, 0xcd37, 0xcd36, 0xcd36, 0xcd35, 0xcd35, 0xcd34, 0xcd34, 0xcd34, 0xcd33, 0xcd33, 0xcd32, 0xcd32, 0xcd31, 0xcd31, 0xcd31, 0xcd30, 0xcd30, 0xcd2f, 0xcd2f, 0xcd2f, 0xcd2e, 0xcd2e, 0xcd2d, 0xcd2d, 0xcd2c, 0xcd2c, 0xcd2c, 0xcd2b, 0xcd2b, 0xcd2a, 0xcd2a, 0xcd2a, 0xcd29, 0xcd29, 0xcd28, 0xcd28, 0xcd28, 0xcd27, 0xcd27, 0xcd26, 0xcd26, 0xcd25, 0xcd25, 0xcd25, 0xcd24, 0xcd24, 0xcd23, 0xcd23, 0xcd23, 0xcd22, 0xcd22, 0xcd21, 0xcd21, 0xcd21, 0xcd20, 0xcd20, 0xcd1f, 0xcd1f, 0xcd1f, 0xcd1e, 0xcd1e, 0xcd1d, 0xcd1d, 0xcd1d, 0xcd1c, 0xcd1c, 0xcd1b, 0xcd1b, 0xcd1b, 0xcd1a, 0xcd1a, 0xcd19, 0xcd19, 0xcd19, 0xcd18, 0xcd18, 0xcd17, 0xcd17, 0xcd17, 0xcd16, 0xcd16, 0xcd15, 0xcd15, 0xcd15, 0xcd14, 0xcd14, 0xcd13, 0xcd13, 0xcd13, 0xcd12, 0xcd12, 0xcd11, 0xcd11, 0xcd11, 0xcd10, 0xcd10, 0xcd0f, 0xcd0f, 0xcd0f, 0xcd0e, 0xcd0e, 0xcd0d, 0xcd0d, 0xcd0d, 0xcd0c, 0xcd0c, 0xcd0c, 0xcd0b, 0xcd0b, 0xcd0a, 0xcd0a, 0xcd0a, 0xcd09, 0xcd09, 0xcd08, 0xcd08, 0xcd08, 0xcd07, 0xcd07, 0xcd06, 0xcd06, 0xcd06, 0xcd05, 0xcd05, 0xcd05, 0xcd04, 0xcd04, 0xcd03, 0xcd03, 0xcd03, 0xcd02, 0xcd02, 0xcd01, 0xcd01, 0xcd01, 0xcd00, 0xcd00, 0xcd00, 0xccff, 0xccff, 0xccfe, 0xccfe, 0xccfe, 0xccfd, 0xccfd, 0xccfd, 0xccfc, 0xccfc, 0xccfb, 0xccfb, 0xccfb, 0xccfa, 0xccfa, 0xccfa, 0xccf9, 0xccf9, 0xccf8, 0xccf8, 0xccf8, 0xccf7, 0xccf7, 0xccf7, 0xccf6, 0xccf6, 0xccf5, 0xccf5, 0xccf5, 0xccf4, 0xccf4, 0xccf4, 0xccf3, 0xccf3, 0xccf2, 0xccf2, 0xccf2, 0xccf1, 0xccf1, 0xccf1, 0xccf0, 0xccf0, 0xccef, 0xccef, 0xccef, 0xccee, 0xccee, 0xccee, 0xcced, 0xcced, 0xcced, 0xccec, 0xccec, 0xcceb, 0xcceb, 0xcceb, 0xccea, 0xccea, 0xccea, 0xcce9, 0xcce9, 0xcce9, 0xcce8, 0xcce8, 0xcce7, 0xcce7, 0xcce7, 0xcce6, 0xcce6, 0xcce6, 0xcce5, 0xcce5, 0xcce5, 0xcce4, 0xcce4, 0xcce3, 0xcce3, 0xcce3, 0xcce2, 0xcce2, 0xcce2, 0xcce1, 0xcce1, 0xcce1, 0xcce0, 0xcce0, 0xcce0, 0xccdf, 0xccdf, 0xccde, 0xccde, 0xccde, 0xccdd, 0xccdd, 0xccdd, 0xccdc, 0xccdc, 0xccdc, 0xccdb, 0xccdb, 0xccdb, 0xccda, 0xccda, 0xccd9, 0xccd9, 0xccd9, 0xccd8, 0xccd8, 0xccd8, 0xccd7, 0xccd7, 0xccd7, 0xccd6, 0xccd6, 0xccd6, 0xccd5, 0xccd5, 0xccd5, 0xccd4, 0xccd4, 0xccd3, 0xccd3, 0xccd3, 0xccd2, 0xccd2, 0xccd2, 0xccd1, 0xccd1, 0xccd1, 0xccd0, 0xccd0, 0xccd0, 0xcccf, 0xcccf, 0xcccf, 0xccce, 0xccce, 0xccce, 0xcccd, 0xcccd, 0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccb, 0xcccb, 0xcccb, 0xccca, 0xccca, 0xccc9, 0xccc9, 0xccc9, 0xccc8, 0xccc8, 0xccc8, 0xccc7, 0xccc7, 0xccc7, 0xccc6, 0xccc6, 0xccc6, 0xccc5, 0xccc5, 0xccc5, 0xccc4, 0xccc4, 0xccc4, 0xccc3, 0xccc3, 0xccc3, 0xccc2, 0xccc2, 0xccc2, 0xccc1, 0xccc1, 0xccc1, 0xccc0, 0xccc0, 0xccc0, 0xccbf, 0xccbf, 0xccbf, 0xccbe, 0xccbe, 0xccbe, 0xccbd, 0xccbd, 0xccbd, 0xccbc, 0xccbc, 0xccbc, 0xccbb, 0xccbb, 0xccbb, 0xccba, 0xccba, 0xccba, 0xccb9, 0xccb9, 0xccb9, 0xccb8, 0xccb8, 0xccb8, 0xccb7, 0xccb7, 0xccb7, 0xccb6, 0xccb6, 0xccb6, 0xccb5, 0xccb5, 0xccb5, 0xccb4, 0xccb4, 0xccb4, 0xccb3, 0xccb3, 0xccb3, 0xccb2, 0xccb2, 0xccb2, 0xccb1, 0xccb1, 0xccb1, 0xccb0, 0xccb0, 0xccb0, 0xccaf, 0xccaf, 0xccaf, 0xccae, 0xccae, 0xccae, 0xccae, 0xccad, 0xccad, 0xccad, 0xccac, 0xccac, 0xccac, 0xccab, 0xccab, 0xccab, 0xccaa, 0xccaa, 0xccaa, 0xcca9, 0xcca9, 0xcca9, 0xcca8, 0xcca8, 0xcca8, 0xcca7, 0xcca7, 0xcca7, 0xcca6, 0xcca6, 0xcca6, 0xcca5, 0xcca5, 0xcca5, 0xcca5, 0xcca4, 0xcca4, 0xcca4, 0xcca3, 0xcca3, 0xcca3, 0xcca2, 0xcca2, 0xcca2, 0xcca1, 0xcca1, 0xcca1, 0xcca0, 0xcca0, 0xcca0, 0xcc9f, 0xcc9f, 0xcc9f, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9d, 0xcc9d, 0xcc9d, 0xcc9c, 0xcc9c, 0xcc9c, 0xcc9b, 0xcc9b, 0xcc9b, 0xcc9a, 0xcc9a, 0xcc9a, 0xcc99, 0xcc99, 0xcc99, 0xcc99, 0xcc98, 0xcc98, 0xcc98, 0xcc97, 0xcc97, 0xcc97, 0xcc96, 0xcc96, 0xcc96, 0xcc95, 0xcc95, 0xcc95, 0xcc95, 0xcc94, 0xcc94, 0xcc94, 0xcc93, 0xcc93, 0xcc93, 0xcc92, 0xcc92, 0xcc92, 0xcc91, 0xcc91, 0xcc91, 0xcc91, 0xcc90, 0xcc90, 0xcc90, 0xcc8f, 0xcc8f, 0xcc8f, 0xcc8e, 0xcc8e, 0xcc8e, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8c, 0xcc8c, 0xcc8c, 0xcc8b, 0xcc8b, 0xcc8b, 0xcc8a, 0xcc8a, 0xcc8a, 0xcc8a, 0xcc89, 0xcc89, 0xcc89, 0xcc88, 0xcc88, 0xcc88, 0xcc87, 0xcc87, 0xcc87, 0xcc87, 0xcc86, 0xcc86, 0xcc86, 0xcc85, 0xcc85, 0xcc85, 0xcc84, 0xcc84, 0xcc84, 0xcc84, 0xcc83, 0xcc83, 0xcc83, 0xcc82, 0xcc82, 0xcc82, 0xcc81, 0xcc81, 0xcc81, 0xcc81, 0xcc80, 0xcc80, 0xcc80, 0xcc7f, 0xcc7f, 0xcc7f, 0xcc7e, 0xcc7e, 0xcc7e, 0xcc7e, 0xcc7d, 0xcc7d, 0xcc7d, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7b, 0xcc7b, 0xcc7b, 0xcc7a, 0xcc7a, 0xcc7a, 0xcc79, 0xcc79, 0xcc79, 0xcc79, 0xcc78, 0xcc78, 0xcc78, 0xcc77, 0xcc77, 0xcc77, 0xcc77, 0xcc76, 0xcc76, 0xcc76, 0xcc75, 0xcc75, 0xcc75, 0xcc75, 0xcc74, 0xcc74, 0xcc74, 0xcc73, 0xcc73, 0xcc73, 0xcc72, 0xcc72, 0xcc72, 0xcc72, 0xcc71, 0xcc71, 0xcc71, 0xcc70, 0xcc70, 0xcc70, 0xcc70, 0xcc6f, 0xcc6f, 0xcc6f, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6d, 0xcc6d, 0xcc6d, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6b, 0xcc6b, 0xcc6b, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc69, 0xcc69, 0xcc69, 0xcc68, 0xcc68, 0xcc68, 0xcc68, 0xcc67, 0xcc67, 0xcc67, 0xcc67, 0xcc66, 0xcc66, 0xcc66, 0xcc65, 0xcc65, 0xcc65, 0xcc65, 0xcc64, 0xcc64, 0xcc64, 0xcc63, 0xcc63, 0xcc63, 0xcc63, 0xcc62, 0xcc62, 0xcc62, 0xcc61, 0xcc61, 0xcc61, 0xcc61, 0xcc60, 0xcc60, 0xcc60, 0xcc60, 0xcc5f, 0xcc5f, 0xcc5f, 0xcc5e, 0xcc5e, 0xcc5e, 0xcc5e, 0xcc5d, 0xcc5d, 0xcc5d, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5b, 0xcc5b, 0xcc5b, 0xcc5b, 0xcc5a, 0xcc5a, 0xcc5a, 0xcc59, 0xcc59, 0xcc59, 0xcc59, 0xcc58, 0xcc58, 0xcc58, 0xcc58, 0xcc57, 0xcc57, 0xcc57, 0xcc56, 0xcc56, 0xcc56, 0xcc56, 0xcc55, 0xcc55, 0xcc55, 0xcc54, 0xcc54, 0xcc54, 0xcc54, 0xcc53, 0xcc53, 0xcc53, 0xcc53, 0xcc52, 0xcc52, 0xcc52, 0xcc52, 0xcc51, 0xcc51, 0xcc51, 0xcc50, 0xcc50, 0xcc50, 0xcc50, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4e, 0xcc4e, 0xcc4e, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4c, 0xcc4c, 0xcc4c, 0xcc4c, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4a, 0xcc4a, 0xcc4a, 0xcc49, 0xcc49, 0xcc49, 0xcc49, 0xcc48, 0xcc48, 0xcc48, 0xcc48, 0xcc47, 0xcc47, 0xcc47, 0xcc47, 0xcc46, 0xcc46, 0xcc46, 0xcc45, 0xcc45, 0xcc45, 0xcc45, 0xcc44, 0xcc44, 0xcc44, 0xcc44, 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc42, 0xcc42, 0xcc42, 0xcc42, 0xcc41, 0xcc41, 0xcc41, 0xcc40, 0xcc40, 0xcc40, 0xcc40, 0xcc3f, 0xcc3f, 0xcc3f, 0xcc3f, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3d, 0xcc3d, 0xcc3d, 0xcc3d, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3b, 0xcc3b, 0xcc3b, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc39, 0xcc39, 0xcc39, 0xcc39, 0xcc38, 0xcc38, 0xcc38, 0xcc38, 0xcc37, 0xcc37, 0xcc37, 0xcc37, 0xcc36, 0xcc36, 0xcc36, 0xcc36, 0xcc35, 0xcc35, 0xcc35, 0xcc35, 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0xcc33, 0xcc33, 0xcc33, 0xcc33, 0xcc32, 0xcc32, 0xcc32, 0xcc31, 0xcc31, 0xcc31, 0xcc31, 0xcc30, 0xcc30, 0xcc30, 0xcc30, 0xcc2f, 0xcc2f, 0xcc2f, 0xcc2f, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2d, 0xcc2d, 0xcc2d, 0xcc2d, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2b, 0xcc2b, 0xcc2b, 0xcc2b, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc29, 0xcc29, 0xcc29, 0xcc29, 0xcc28, 0xcc28, 0xcc27, 0xcc27, 0xcc26, 0xcc26, 0xcc25, 0xcc25, 0xcc24, 0xcc24, 0xcc23, 0xcc23, 0xcc22, 0xcc22, 0xcc21, 0xcc21, 0xcc20, 0xcc20, 0xcc1f, 0xcc1f, 0xcc1e, 0xcc1e, 0xcc1d, 0xcc1d, 0xcc1c, 0xcc1c, 0xcc1b, 0xcc1b, 0xcc1a, 0xcc1a, 0xcc19, 0xcc19, 0xcc18, 0xcc18, 0xcc17, 0xcc17, 0xcc17, 0xcc16, 0xcc16, 0xcc15, 0xcc15, 0xcc14, 0xcc14, 0xcc13, 0xcc13, 0xcc12, 0xcc12, 0xcc11, 0xcc11, 0xcc10, 0xcc10, 0xcc0f, 0xcc0f, 0xcc0e, 0xcc0e, 0xcc0d, 0xcc0d, 0xcc0c, 0xcc0c, 0xcc0c, 0xcc0b, 0xcc0b, 0xcc0a, 0xcc0a, 0xcc09, 0xcc09, 0xcc08, 0xcc08, 0xcc07, 0xcc07, 0xcc06, 0xcc06, 0xcc05, 0xcc05, 0xcc04, 0xcc04, 0xcc04, 0xcc03, 0xcc03, 0xcc02, 0xcc02, 0xcc01, 0xcc01, 0xcc00, 0xcc00, 0xcbff, 0xcbfe, 0xcbfd, 0xcbfc, 0xcbfb, 0xcbfa, 0xcbf9, 0xcbf8, 0xcbf7, 0xcbf6, 0xcbf6, 0xcbf5, 0xcbf4, 0xcbf3, 0xcbf2, 0xcbf1, 0xcbf0, 0xcbef, 0xcbee, 0xcbed, 0xcbec, 0xcbec, 0xcbeb, 0xcbea, 0xcbe9, 0xcbe8, 0xcbe7, 0xcbe6, 0xcbe5, 0xcbe4, 0xcbe3, 0xcbe3, 0xcbe2, 0xcbe1, 0xcbe0, 0xcbdf, 0xcbde, 0xcbdd, 0xcbdc, 0xcbdb, 0xcbdb, 0xcbda, 0xcbd9, 0xcbd8, 0xcbd7, 0xcbd6, 0xcbd5, 0xcbd4, 0xcbd3, 0xcbd3, 0xcbd2, 0xcbd1, 0xcbd0, 0xcbcf, 0xcbce, 0xcbcd, 0xcbcc, 0xcbcb, 0xcbcb, 0xcbca, 0xcbc9, 0xcbc8, 0xcbc7, 0xcbc6, 0xcbc5, 0xcbc4, 0xcbc4, 0xcbc3, 0xcbc2, 0xcbc1, 0xcbc0, 0xcbbf, 0xcbbe, 0xcbbe, 0xcbbd, 0xcbbc, 0xcbbb, 0xcbba, 0xcbb9, 0xcbb8, 0xcbb8, 0xcbb7, 0xcbb6, 0xcbb5, 0xcbb4, 0xcbb3, 0xcbb2, 0xcbb1, 0xcbb1, 0xcbb0, 0xcbaf, 0xcbae, 0xcbad, 0xcbac, 0xcbac, 0xcbab, 0xcbaa, 0xcba9, 0xcba8, 0xcba7, 0xcba6, 0xcba6, 0xcba5, 0xcba4, 0xcba3, 0xcba2, 0xcba1, 0xcba1, 0xcba0, 0xcb9f, 0xcb9e, 0xcb9d, 0xcb9c, 0xcb9b, 0xcb9b, 0xcb9a, 0xcb99, 0xcb98, 0xcb97, 0xcb96, 0xcb96, 0xcb95, 0xcb94, 0xcb93, 0xcb92, 0xcb91, 0xcb91, 0xcb90, 0xcb8f, 0xcb8e, 0xcb8d, 0xcb8d, 0xcb8c, 0xcb8b, 0xcb8a, 0xcb89, 0xcb88, 0xcb88, 0xcb87, 0xcb86, 0xcb85, 0xcb84, 0xcb83, 0xcb83, 0xcb82, 0xcb81, 0xcb80, 0xcb7f, 0xcb7f, 0xcb7e, 0xcb7d, 0xcb7c, 0xcb7b, 0xcb7b, 0xcb7a, 0xcb79, 0xcb78, 0xcb77, 0xcb76, 0xcb76, 0xcb75, 0xcb74, 0xcb73, 0xcb72, 0xcb72, 0xcb71, 0xcb70, 0xcb6f, 0xcb6e, 0xcb6e, 0xcb6d, 0xcb6c, 0xcb6b, 0xcb6a, 0xcb6a, 0xcb69, 0xcb68, 0xcb67, 0xcb66, 0xcb66, 0xcb65, 0xcb64, 0xcb63, 0xcb63, 0xcb62, 0xcb61, 0xcb60, 0xcb5f, 0xcb5f, 0xcb5e, 0xcb5d, 0xcb5c, 0xcb5b, 0xcb5b, 0xcb5a, 0xcb59, 0xcb58, 0xcb57, 0xcb57, 0xcb56, 0xcb55, 0xcb54, 0xcb54, 0xcb53, 0xcb52, 0xcb51, 0xcb50, 0xcb50, 0xcb4f, 0xcb4e, 0xcb4d, 0xcb4d, 0xcb4c, 0xcb4b, 0xcb4a, 0xcb49, 0xcb49, 0xcb48, 0xcb47, 0xcb46, 0xcb46, 0xcb45, 0xcb44, 0xcb43, 0xcb43, 0xcb42, 0xcb41, 0xcb40, 0xcb3f, 0xcb3f, 0xcb3e, 0xcb3d, 0xcb3c, 0xcb3c, 0xcb3b, 0xcb3a, 0xcb39, 0xcb39, 0xcb38, 0xcb37, 0xcb36, 0xcb36, 0xcb35, 0xcb34, 0xcb33, 0xcb33, 0xcb32, 0xcb31, 0xcb30, 0xcb30, 0xcb2f, 0xcb2e, 0xcb2d, 0xcb2d, 0xcb2c, 0xcb2b, 0xcb2a, 0xcb2a, 0xcb29, 0xcb28, 0xcb27, 0xcb27, 0xcb26, 0xcb25, 0xcb24, 0xcb24, 0xcb23, 0xcb22, 0xcb21, 0xcb21, 0xcb20, 0xcb1f, 0xcb1e, 0xcb1e, 0xcb1d, 0xcb1c, 0xcb1b, 0xcb1b, 0xcb1a, 0xcb19, 0xcb18, 0xcb18, 0xcb17, 0xcb16, 0xcb15, 0xcb15, 0xcb14, 0xcb13, 0xcb13, 0xcb12, 0xcb11, 0xcb10, 0xcb10, 0xcb0f, 0xcb0e, 0xcb0d, 0xcb0d, 0xcb0c, 0xcb0b, 0xcb0b, 0xcb0a, 0xcb09, 0xcb08, 0xcb08, 0xcb07, 0xcb06, 0xcb05, 0xcb05, 0xcb04, 0xcb03, 0xcb03, 0xcb02, 0xcb01, 0xcb00, 0xcb00, 0xcaff, 0xcafe, 0xcafe, 0xcafd, 0xcafc, 0xcafb, 0xcafb, 0xcafa, 0xcaf9, 0xcaf9, 0xcaf8, 0xcaf7, 0xcaf6, 0xcaf6, 0xcaf5, 0xcaf4, 0xcaf4, 0xcaf3, 0xcaf2, 0xcaf1, 0xcaf1, 0xcaf0, 0xcaef, 0xcaef, 0xcaee, 0xcaed, 0xcaec, 0xcaec, 0xcaeb, 0xcaea, 0xcaea, 0xcae9, 0xcae8, 0xcae8, 0xcae7, 0xcae6, 0xcae5, 0xcae5, 0xcae4, 0xcae3, 0xcae3, 0xcae2, 0xcae1, 0xcae1, 0xcae0, 0xcadf, 0xcade, 0xcade, 0xcadd, 0xcadc, 0xcadc, 0xcadb, 0xcada, 0xcada, 0xcad9, 0xcad8, 0xcad7, 0xcad7, 0xcad6, 0xcad5, 0xcad5, 0xcad4, 0xcad3, 0xcad3, 0xcad2, 0xcad1, 0xcad1, 0xcad0, 0xcacf, 0xcacf, 0xcace, 0xcacd, 0xcacc, 0xcacc, 0xcacb, 0xcaca, 0xcaca, 0xcac9, 0xcac8, 0xcac8, 0xcac7, 0xcac6, 0xcac6, 0xcac5, 0xcac4, 0xcac4, 0xcac3, 0xcac2, 0xcac2, 0xcac1, 0xcac0, 0xcac0, 0xcabf, 0xcabe, 0xcabe, 0xcabd, 0xcabc, 0xcabc, 0xcabb, 0xcaba, 0xcaba, 0xcab9, 0xcab8, 0xcab7, 0xcab7, 0xcab6, 0xcab5, 0xcab5, 0xcab4, 0xcab3, 0xcab3, 0xcab2, 0xcab1, 0xcab1, 0xcab0, 0xcaaf, 0xcaaf, 0xcaae, 0xcaad, 0xcaad, 0xcaac, 0xcaac, 0xcaab, 0xcaaa, 0xcaaa, 0xcaa9, 0xcaa8, 0xcaa8, 0xcaa7, 0xcaa6, 0xcaa6, 0xcaa5, 0xcaa4, 0xcaa4, 0xcaa3, 0xcaa2, 0xcaa2, 0xcaa1, 0xcaa0, 0xcaa0, 0xca9f, 0xca9e, 0xca9e, 0xca9d, 0xca9c, 0xca9c, 0xca9b, 0xca9a, 0xca9a, 0xca99, 0xca98, 0xca98, 0xca97, 0xca97, 0xca96, 0xca95, 0xca95, 0xca94, 0xca93, 0xca93, 0xca92, 0xca91, 0xca91, 0xca90, 0xca8f, 0xca8f, 0xca8e, 0xca8d, 0xca8d, 0xca8c, 0xca8c, 0xca8b, 0xca8a, 0xca8a, 0xca89, 0xca88, 0xca88, 0xca87, 0xca86, 0xca86, 0xca85, 0xca85, 0xca84, 0xca83, 0xca83, 0xca82, 0xca81, 0xca81, 0xca80, 0xca7f, 0xca7f, 0xca7e, 0xca7e, 0xca7d, 0xca7c, 0xca7c, 0xca7b, 0xca7a, 0xca7a, 0xca79, 0xca78, 0xca78, 0xca77, 0xca77, 0xca76, 0xca75, 0xca75, 0xca74, 0xca73, 0xca73, 0xca72, 0xca72, 0xca71, 0xca70, 0xca70, 0xca6f, 0xca6e, 0xca6e, 0xca6d, 0xca6d, 0xca6c, 0xca6b, 0xca6b, 0xca6a, 0xca69, 0xca69, 0xca68, 0xca68, 0xca67, 0xca66, 0xca66, 0xca65, 0xca65, 0xca64, 0xca63, 0xca63, 0xca62, 0xca61, 0xca61, 0xca60, 0xca60, 0xca5f, 0xca5e, 0xca5e, 0xca5d, 0xca5d, 0xca5c, 0xca5b, 0xca5b, 0xca5a, 0xca59, 0xca59, 0xca58, 0xca58, 0xca57, 0xca56, 0xca56, 0xca55, 0xca55, 0xca54, 0xca53, 0xca53, 0xca52, 0xca52, 0xca51, 0xca50, 0xca50, 0xca4f, 0xca4e, 0xca4e, 0xca4d, 0xca4d, 0xca4c, 0xca4b, 0xca4b, 0xca4a, 0xca4a, 0xca49, 0xca48, 0xca48, 0xca47, 0xca47, 0xca46, 0xca45, 0xca45, 0xca44, 0xca44, 0xca43, 0xca42, 0xca42, 0xca41, 0xca41, 0xca40, 0xca3f, 0xca3f, 0xca3e, 0xca3e, 0xca3d, 0xca3d, 0xca3c, 0xca3b, 0xca3b, 0xca3a, 0xca3a, 0xca39, 0xca38, 0xca38, 0xca37, 0xca37, 0xca36, 0xca35, 0xca35, 0xca34, 0xca34, 0xca33, 0xca32, 0xca32, 0xca31, 0xca31, 0xca30, 0xca30, 0xca2f, 0xca2e, 0xca2e, 0xca2d, 0xca2d, 0xca2c, 0xca2b, 0xca2b, 0xca2a, 0xca2a, 0xca29, 0xca28, 0xca28, 0xca27, 0xca27, 0xca26, 0xca26, 0xca25, 0xca24, 0xca24, 0xca23, 0xca23, 0xca22, 0xca22, 0xca21, 0xca20, 0xca20, 0xca1f, 0xca1f, 0xca1e, 0xca1d, 0xca1d, 0xca1c, 0xca1c, 0xca1b, 0xca1b, 0xca1a, 0xca19, 0xca19, 0xca18, 0xca18, 0xca17, 0xca17, 0xca16, 0xca15, 0xca15, 0xca14, 0xca14, 0xca13, 0xca13, 0xca12, 0xca11, 0xca11, 0xca10, 0xca10, 0xca0f, 0xca0f, 0xca0e, 0xca0d, 0xca0d, 0xca0c, 0xca0c, 0xca0b, 0xca0b, 0xca0a, 0xca0a, 0xca09, 0xca08, 0xca08, 0xca07, 0xca07, 0xca06, 0xca06, 0xca05, 0xca04, 0xca04, 0xca03, 0xca03, 0xca02, 0xca02, 0xca01, 0xca00, 0xca00, 0xc9ff, 0xc9ff, 0xc9fe, 0xc9fe, 0xc9fd, 0xc9fd, 0xc9fc, 0xc9fb, 0xc9fb, 0xc9fa, 0xc9fa, 0xc9f9, 0xc9f9, 0xc9f8, 0xc9f8, 0xc9f7, 0xc9f6, 0xc9f6, 0xc9f5, 0xc9f5, 0xc9f4, 0xc9f4, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f1, 0xc9f1, 0xc9f0, 0xc9f0, 0xc9ef, 0xc9ef, 0xc9ee, 0xc9ee, 0xc9ed, 0xc9ed, 0xc9ec, 0xc9eb, 0xc9eb, 0xc9ea, 0xc9ea, 0xc9e9, 0xc9e9, 0xc9e8, 0xc9e8, 0xc9e7, 0xc9e6, 0xc9e6, 0xc9e5, 0xc9e5, 0xc9e4, 0xc9e4, 0xc9e3, 0xc9e3, 0xc9e2, 0xc9e2, 0xc9e1, 0xc9e0, 0xc9e0, 0xc9df, 0xc9df, 0xc9de, 0xc9de, 0xc9dd, 0xc9dd, 0xc9dc, 0xc9dc, 0xc9db, 0xc9db, 0xc9da, 0xc9d9, 0xc9d9, 0xc9d8, 0xc9d8, 0xc9d7, 0xc9d7, 0xc9d6, 0xc9d6, 0xc9d5, 0xc9d5, 0xc9d4, 0xc9d4, 0xc9d3, 0xc9d2, 0xc9d2, 0xc9d1, 0xc9d1, 0xc9d0, 0xc9d0, 0xc9cf, 0xc9cf, 0xc9ce, 0xc9ce, 0xc9cd, 0xc9cd, 0xc9cc, 0xc9cc, 0xc9cb, 0xc9ca, 0xc9ca, 0xc9c9, 0xc9c9, 0xc9c8, 0xc9c8, 0xc9c7, 0xc9c7, 0xc9c6, 0xc9c6, 0xc9c5, 0xc9c5, 0xc9c4, 0xc9c4, 0xc9c3, 0xc9c3, 0xc9c2, 0xc9c1, 0xc9c1, 0xc9c0, 0xc9c0, 0xc9bf, 0xc9bf, 0xc9be, 0xc9be, 0xc9bd, 0xc9bd, 0xc9bc, 0xc9bc, 0xc9bb, 0xc9bb, 0xc9ba, 0xc9ba, 0xc9b9, 0xc9b9, 0xc9b8, 0xc9b7, 0xc9b7, 0xc9b6, 0xc9b6, 0xc9b5, 0xc9b5, 0xc9b4, 0xc9b4, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9b1, 0xc9b1, 0xc9b0, 0xc9b0, 0xc9af, 0xc9af, 0xc9ae, 0xc9ae, 0xc9ad, 0xc9ad, 0xc9ac, 0xc9ac, 0xc9ab, 0xc9ab, 0xc9aa, 0xc9a9, 0xc9a9, 0xc9a8, 0xc9a8, 0xc9a7, 0xc9a7, 0xc9a6, 0xc9a6, 0xc9a5, 0xc9a5, 0xc9a4, 0xc9a4, 0xc9a3, 0xc9a3, 0xc9a2, 0xc9a2, 0xc9a1, 0xc9a1, 0xc9a0, 0xc9a0, 0xc99f, 0xc99f, 0xc99e, 0xc99e, 0xc99d, 0xc99d, 0xc99c, 0xc99c, 0xc99b, 0xc99b, 0xc99a, 0xc99a, 0xc999, 0xc999, 0xc998, 0xc998, 0xc997, 0xc997, 0xc996, 0xc996, 0xc995, 0xc995, 0xc994, 0xc994, 0xc993, 0xc993, 0xc992, 0xc992, 0xc991, 0xc991, 0xc990, 0xc990, 0xc98f, 0xc98f, 0xc98e, 0xc98e, 0xc98d, 0xc98d, 0xc98c, 0xc98c, 0xc98b, 0xc98a, 0xc989, 0xc988, 0xc987, 0xc986, 0xc985, 0xc984, 0xc983, 0xc982, 0xc981, 0xc980, 0xc97f, 0xc97e, 0xc97d, 0xc97c, 0xc97b, 0xc97a, 0xc979, 0xc978, 0xc977, 0xc976, 0xc975, 0xc974, 0xc973, 0xc972, 0xc971, 0xc970, 0xc96f, 0xc96e, 0xc96d, 0xc96c, 0xc96b, 0xc96a, 0xc969, 0xc968, 0xc967, 0xc966, 0xc965, 0xc964, 0xc963, 0xc962, 0xc961, 0xc960, 0xc960, 0xc95f, 0xc95e, 0xc95d, 0xc95c, 0xc95b, 0xc95a, 0xc959, 0xc958, 0xc957, 0xc956, 0xc955, 0xc954, 0xc953, 0xc952, 0xc951, 0xc950, 0xc94f, 0xc94e, 0xc94d, 0xc94d, 0xc94c, 0xc94b, 0xc94a, 0xc949, 0xc948, 0xc947, 0xc946, 0xc945, 0xc944, 0xc943, 0xc942, 0xc941, 0xc940, 0xc93f, 0xc93f, 0xc93e, 0xc93d, 0xc93c, 0xc93b, 0xc93a, 0xc939, 0xc938, 0xc937, 0xc936, 0xc935, 0xc934, 0xc933, 0xc933, 0xc932, 0xc931, 0xc930, 0xc92f, 0xc92e, 0xc92d, 0xc92c, 0xc92b, 0xc92a, 0xc929, 0xc929, 0xc928, 0xc927, 0xc926, 0xc925, 0xc924, 0xc923, 0xc922, 0xc921, 0xc920, 0xc91f, 0xc91f, 0xc91e, 0xc91d, 0xc91c, 0xc91b, 0xc91a, 0xc919, 0xc918, 0xc917, 0xc917, 0xc916, 0xc915, 0xc914, 0xc913, 0xc912, 0xc911, 0xc910, 0xc90f, 0xc90f, 0xc90e, 0xc90d, 0xc90c, 0xc90b, 0xc90a, 0xc909, 0xc908, 0xc907, 0xc907, 0xc906, 0xc905, 0xc904, 0xc903, 0xc902, 0xc901, 0xc900, 0xc900, 0xc8ff, 0xc8fe, 0xc8fd, 0xc8fc, 0xc8fb, 0xc8fa, 0xc8f9, 0xc8f9, 0xc8f8, 0xc8f7, 0xc8f6, 0xc8f5, 0xc8f4, 0xc8f3, 0xc8f3, 0xc8f2, 0xc8f1, 0xc8f0, 0xc8ef, 0xc8ee, 0xc8ed, 0xc8ed, 0xc8ec, 0xc8eb, 0xc8ea, 0xc8e9, 0xc8e8, 0xc8e7, 0xc8e7, 0xc8e6, 0xc8e5, 0xc8e4, 0xc8e3, 0xc8e2, 0xc8e2, 0xc8e1, 0xc8e0, 0xc8df, 0xc8de, 0xc8dd, 0xc8dc, 0xc8dc, 0xc8db, 0xc8da, 0xc8d9, 0xc8d8, 0xc8d7, 0xc8d7, 0xc8d6, 0xc8d5, 0xc8d4, 0xc8d3, 0xc8d2, 0xc8d2, 0xc8d1, 0xc8d0, 0xc8cf, 0xc8ce, 0xc8cd, 0xc8cd, 0xc8cc, 0xc8cb, 0xc8ca, 0xc8c9, 0xc8c8, 0xc8c8, 0xc8c7, 0xc8c6, 0xc8c5, 0xc8c4, 0xc8c3, 0xc8c3, 0xc8c2, 0xc8c1, 0xc8c0, 0xc8bf, 0xc8bf, 0xc8be, 0xc8bd, 0xc8bc, 0xc8bb, 0xc8ba, 0xc8ba, 0xc8b9, 0xc8b8, 0xc8b7, 0xc8b6, 0xc8b6, 0xc8b5, 0xc8b4, 0xc8b3, 0xc8b2, 0xc8b2, 0xc8b1, 0xc8b0, 0xc8af, 0xc8ae, 0xc8ad, 0xc8ad, 0xc8ac, 0xc8ab, 0xc8aa, 0xc8a9, 0xc8a9, 0xc8a8, 0xc8a7, 0xc8a6, 0xc8a5, 0xc8a5, 0xc8a4, 0xc8a3, 0xc8a2, 0xc8a1, 0xc8a1, 0xc8a0, 0xc89f, 0xc89e, 0xc89e, 0xc89d, 0xc89c, 0xc89b, 0xc89a, 0xc89a, 0xc899, 0xc898, 0xc897, 0xc896, 0xc896, 0xc895, 0xc894, 0xc893, 0xc892, 0xc892, 0xc891, 0xc890, 0xc88f, 0xc88f, 0xc88e, 0xc88d, 0xc88c, 0xc88b, 0xc88b, 0xc88a, 0xc889, 0xc888, 0xc888, 0xc887, 0xc886, 0xc885, 0xc884, 0xc884, 0xc883, 0xc882, 0xc881, 0xc881, 0xc880, 0xc87f, 0xc87e, 0xc87e, 0xc87d, 0xc87c, 0xc87b, 0xc87a, 0xc87a, 0xc879, 0xc878, 0xc877, 0xc877, 0xc876, 0xc875, 0xc874, 0xc874, 0xc873, 0xc872, 0xc871, 0xc871, 0xc870, 0xc86f, 0xc86e, 0xc86e, 0xc86d, 0xc86c, 0xc86b, 0xc86a, 0xc86a, 0xc869, 0xc868, 0xc867, 0xc867, 0xc866, 0xc865, 0xc864, 0xc864, 0xc863, 0xc862, 0xc861, 0xc861, 0xc860, 0xc85f, 0xc85e, 0xc85e, 0xc85d, 0xc85c, 0xc85c, 0xc85b, 0xc85a, 0xc859, 0xc859, 0xc858, 0xc857, 0xc856, 0xc856, 0xc855, 0xc854, 0xc853, 0xc853, 0xc852, 0xc851, 0xc850, 0xc850, 0xc84f, 0xc84e, 0xc84e, 0xc84d, 0xc84c, 0xc84b, 0xc84b, 0xc84a, 0xc849, 0xc848, 0xc848, 0xc847, 0xc846, 0xc845, 0xc845, 0xc844, 0xc843, 0xc843, 0xc842, 0xc841, 0xc840, 0xc840, 0xc83f, 0xc83e, 0xc83d, 0xc83d, 0xc83c, 0xc83b, 0xc83b, 0xc83a, 0xc839, 0xc838, 0xc838, 0xc837, 0xc836, 0xc836, 0xc835, 0xc834, 0xc833, 0xc833, 0xc832, 0xc831, 0xc831, 0xc830, 0xc82f, 0xc82e, 0xc82e, 0xc82d, 0xc82c, 0xc82c, 0xc82b, 0xc82a, 0xc829, 0xc829, 0xc828, 0xc827, 0xc827, 0xc826, 0xc825, 0xc825, 0xc824, 0xc823, 0xc822, 0xc822, 0xc821, 0xc820, 0xc820, 0xc81f, 0xc81e, 0xc81e, 0xc81d, 0xc81c, 0xc81b, 0xc81b, 0xc81a, 0xc819, 0xc819, 0xc818, 0xc817, 0xc817, 0xc816, 0xc815, 0xc814, 0xc814, 0xc813, 0xc812, 0xc812, 0xc811, 0xc810, 0xc810, 0xc80f, 0xc80e, 0xc80e, 0xc80d, 0xc80c, 0xc80c, 0xc80b, 0xc80a, 0xc809, 0xc809, 0xc808, 0xc807, 0xc807, 0xc806, 0xc805, 0xc805, 0xc804, 0xc803, 0xc803, 0xc802, 0xc801, 0xc801, 0xc800, 0xc7fe, 0xc7fd, 0xc7fc, 0xc7fa, 0xc7f9, 0xc7f8, 0xc7f6, 0xc7f5, 0xc7f4, 0xc7f2, 0xc7f1, 0xc7f0, 0xc7ee, 0xc7ed, 0xc7eb, 0xc7ea, 0xc7e9, 0xc7e7, 0xc7e6, 0xc7e5, 0xc7e3, 0xc7e2, 0xc7e1, 0xc7df, 0xc7de, 0xc7dd, 0xc7db, 0xc7da, 0xc7d9, 0xc7d7, 0xc7d6, 0xc7d5, 0xc7d3, 0xc7d2, 0xc7d1, 0xc7cf, 0xc7ce, 0xc7cd, 0xc7cb, 0xc7ca, 0xc7c9, 0xc7c7, 0xc7c6, 0xc7c5, 0xc7c4, 0xc7c2, 0xc7c1, 0xc7c0, 0xc7be, 0xc7bd, 0xc7bc, 0xc7ba, 0xc7b9, 0xc7b8, 0xc7b6, 0xc7b5, 0xc7b4, 0xc7b2, 0xc7b1, 0xc7b0, 0xc7af, 0xc7ad, 0xc7ac, 0xc7ab, 0xc7a9, 0xc7a8, 0xc7a7, 0xc7a5, 0xc7a4, 0xc7a3, 0xc7a1, 0xc7a0, 0xc79f, 0xc79e, 0xc79c, 0xc79b, 0xc79a, 0xc798, 0xc797, 0xc796, 0xc795, 0xc793, 0xc792, 0xc791, 0xc78f, 0xc78e, 0xc78d, 0xc78c, 0xc78a, 0xc789, 0xc788, 0xc786, 0xc785, 0xc784, 0xc783, 0xc781, 0xc780, 0xc77f, 0xc77d, 0xc77c, 0xc77b, 0xc77a, 0xc778, 0xc777, 0xc776, 0xc775, 0xc773, 0xc772, 0xc771, 0xc76f, 0xc76e, 0xc76d, 0xc76c, 0xc76a, 0xc769, 0xc768, 0xc767, 0xc765, 0xc764, 0xc763, 0xc762, 0xc760, 0xc75f, 0xc75e, 0xc75d, 0xc75b, 0xc75a, 0xc759, 0xc758, 0xc756, 0xc755, 0xc754, 0xc753, 0xc751, 0xc750, 0xc74f, 0xc74e, 0xc74c, 0xc74b, 0xc74a, 0xc749, 0xc747, 0xc746, 0xc745, 0xc744, 0xc742, 0xc741, 0xc740, 0xc73f, 0xc73d, 0xc73c, 0xc73b, 0xc73a, 0xc739, 0xc737, 0xc736, 0xc735, 0xc734, 0xc732, 0xc731, 0xc730, 0xc72f, 0xc72d, 0xc72c, 0xc72b, 0xc72a, 0xc729, 0xc727, 0xc726, 0xc725, 0xc724, 0xc722, 0xc721, 0xc720, 0xc71f, 0xc71e, 0xc71c, 0xc71b, 0xc71a, 0xc719, 0xc717, 0xc716, 0xc715, 0xc714, 0xc713, 0xc711, 0xc710, 0xc70f, 0xc70e, 0xc70d, 0xc70b, 0xc70a, 0xc709, 0xc708, 0xc707, 0xc705, 0xc704, 0xc703, 0xc702, 0xc701, 0xc6ff, 0xc6fe, 0xc6fd, 0xc6fc, 0xc6fb, 0xc6f9, 0xc6f8, 0xc6f7, 0xc6f6, 0xc6f5, 0xc6f3, 0xc6f2, 0xc6f1, 0xc6f0, 0xc6ef, 0xc6ed, 0xc6ec, 0xc6eb, 0xc6ea, 0xc6e9, 0xc6e8, 0xc6e6, 0xc6e5, 0xc6e4, 0xc6e3, 0xc6e2, 0xc6e0, 0xc6df, 0xc6de, 0xc6dd, 0xc6dc, 0xc6db, 0xc6d9, 0xc6d8, 0xc6d7, 0xc6d6, 0xc6d5, 0xc6d3, 0xc6d2, 0xc6d1, 0xc6d0, 0xc6cf, 0xc6ce, 0xc6cc, 0xc6cb, 0xc6ca, 0xc6c9, 0xc6c8, 0xc6c7, 0xc6c5, 0xc6c4, 0xc6c3, 0xc6c2, 0xc6c1, 0xc6c0, 0xc6be, 0xc6bd, 0xc6bc, 0xc6bb, 0xc6ba, 0xc6b9, 0xc6b7, 0xc6b6, 0xc6b5, 0xc6b4, 0xc6b3, 0xc6b2, 0xc6b1, 0xc6af, 0xc6ae, 0xc6ad, 0xc6ac, 0xc6ab, 0xc6aa, 0xc6a8, 0xc6a7, 0xc6a6, 0xc6a5, 0xc6a4, 0xc6a3, 0xc6a2, 0xc6a0, 0xc69f, 0xc69e, 0xc69d, 0xc69c, 0xc69b, 0xc69a, 0xc698, 0xc697, 0xc696, 0xc695, 0xc694, 0xc693, 0xc692, 0xc691, 0xc68f, 0xc68e, 0xc68d, 0xc68c, 0xc68b, 0xc68a, 0xc689, 0xc687, 0xc686, 0xc685, 0xc684, 0xc683, 0xc682, 0xc681, 0xc680, 0xc67e, 0xc67d, 0xc67c, 0xc67b, 0xc67a, 0xc679, 0xc678, 0xc677, 0xc675, 0xc674, 0xc673, 0xc672, 0xc671, 0xc670, 0xc66f, 0xc66e, 0xc66c, 0xc66b, 0xc66a, 0xc669, 0xc668, 0xc667, 0xc666, 0xc665, 0xc664, 0xc662, 0xc661, 0xc660, 0xc65f, 0xc65e, 0xc65d, 0xc65c, 0xc65b, 0xc65a, 0xc658, 0xc657, 0xc656, 0xc655, 0xc654, 0xc653, 0xc652, 0xc651, 0xc650, 0xc64f, 0xc64d, 0xc64c, 0xc64b, 0xc64a, 0xc649, 0xc648, 0xc647, 0xc646, 0xc645, 0xc644, 0xc642, 0xc641, 0xc640, 0xc63f, 0xc63e, 0xc63d, 0xc63c, 0xc63b, 0xc63a, 0xc639, 0xc638, 0xc637, 0xc635, 0xc634, 0xc633, 0xc632, 0xc631, 0xc630, 0xc62f, 0xc62e, 0xc62d, 0xc62c, 0xc62b, 0xc62a, 0xc628, 0xc627, 0xc626, 0xc625, 0xc624, 0xc623, 0xc622, 0xc621, 0xc620, 0xc61f, 0xc61e, 0xc61d, 0xc61c, 0xc61a, 0xc619, 0xc618, 0xc617, 0xc616, 0xc615, 0xc614, 0xc613, 0xc612, 0xc611, 0xc610, 0xc60f, 0xc60e, 0xc60d, 0xc60b, 0xc60a, 0xc609, 0xc608, 0xc607, 0xc606, 0xc605, 0xc604, 0xc603, 0xc602, 0xc601, 0xc600, 0xc5ff, 0xc5fe, 0xc5fd, 0xc5fc, 0xc5fb, 0xc5f9, 0xc5f8, 0xc5f7, 0xc5f6, 0xc5f5, 0xc5f4, 0xc5f3, 0xc5f2, 0xc5f1, 0xc5f0, 0xc5ef, 0xc5ee, 0xc5ed, 0xc5ec, 0xc5eb, 0xc5ea, 0xc5e9, 0xc5e8, 0xc5e7, 0xc5e6, 0xc5e4, 0xc5e3, 0xc5e2, 0xc5e1, 0xc5e0, 0xc5df, 0xc5de, 0xc5dd, 0xc5dc, 0xc5db, 0xc5da, 0xc5d9, 0xc5d8, 0xc5d7, 0xc5d6, 0xc5d5, 0xc5d4, 0xc5d3, 0xc5d2, 0xc5d1, 0xc5d0, 0xc5cf, 0xc5ce, 0xc5cd, 0xc5cc, 0xc5cb, 0xc5c9, 0xc5c8, 0xc5c7, 0xc5c6, 0xc5c5, 0xc5c4, 0xc5c3, 0xc5c2, 0xc5c1, 0xc5c0, 0xc5bf, 0xc5be, 0xc5bd, 0xc5bc, 0xc5bb, 0xc5ba, 0xc5b9, 0xc5b8, 0xc5b7, 0xc5b6, 0xc5b5, 0xc5b4, 0xc5b3, 0xc5b2, 0xc5b1, 0xc5b0, 0xc5af, 0xc5ae, 0xc5ad, 0xc5ac, 0xc5ab, 0xc5aa, 0xc5a9, 0xc5a8, 0xc5a7, 0xc5a6, 0xc5a5, 0xc5a4, 0xc5a3, 0xc5a2, 0xc5a1, 0xc5a0, 0xc59f, 0xc59e, 0xc59d, 0xc59c, 0xc59b, 0xc59a, 0xc599, 0xc598, 0xc597, 0xc596, 0xc595, 0xc594, 0xc593, 0xc592, 0xc591, 0xc590, 0xc58f, 0xc58e, 0xc58d, 0xc58c, 0xc58a, 0xc588, 0xc586, 0xc584, 0xc582, 0xc580, 0xc57e, 0xc57c, 0xc57a, 0xc578, 0xc576, 0xc574, 0xc572, 0xc570, 0xc56e, 0xc56c, 0xc56a, 0xc568, 0xc566, 0xc564, 0xc562, 0xc560, 0xc55e, 0xc55c, 0xc55a, 0xc558, 0xc556, 0xc554, 0xc552, 0xc550, 0xc54e, 0xc54d, 0xc54b, 0xc549, 0xc547, 0xc545, 0xc543, 0xc541, 0xc53f, 0xc53d, 0xc53b, 0xc539, 0xc537, 0xc535, 0xc533, 0xc532, 0xc530, 0xc52e, 0xc52c, 0xc52a, 0xc528, 0xc526, 0xc524, 0xc522, 0xc520, 0xc51f, 0xc51d, 0xc51b, 0xc519, 0xc517, 0xc515, 0xc513, 0xc511, 0xc50f, 0xc50e, 0xc50c, 0xc50a, 0xc508, 0xc506, 0xc504, 0xc502, 0xc500, 0xc4ff, 0xc4fd, 0xc4fb, 0xc4f9, 0xc4f7, 0xc4f5, 0xc4f3, 0xc4f2, 0xc4f0, 0xc4ee, 0xc4ec, 0xc4ea, 0xc4e8, 0xc4e6, 0xc4e5, 0xc4e3, 0xc4e1, 0xc4df, 0xc4dd, 0xc4db, 0xc4da, 0xc4d8, 0xc4d6, 0xc4d4, 0xc4d2, 0xc4d0, 0xc4cf, 0xc4cd, 0xc4cb, 0xc4c9, 0xc4c7, 0xc4c5, 0xc4c4, 0xc4c2, 0xc4c0, 0xc4be, 0xc4bc, 0xc4bb, 0xc4b9, 0xc4b7, 0xc4b5, 0xc4b3, 0xc4b2, 0xc4b0, 0xc4ae, 0xc4ac, 0xc4aa, 0xc4a9, 0xc4a7, 0xc4a5, 0xc4a3, 0xc4a1, 0xc4a0, 0xc49e, 0xc49c, 0xc49a, 0xc499, 0xc497, 0xc495, 0xc493, 0xc491, 0xc490, 0xc48e, 0xc48c, 0xc48a, 0xc489, 0xc487, 0xc485, 0xc483, 0xc482, 0xc480, 0xc47e, 0xc47c, 0xc47b, 0xc479, 0xc477, 0xc475, 0xc474, 0xc472, 0xc470, 0xc46e, 0xc46d, 0xc46b, 0xc469, 0xc467, 0xc466, 0xc464, 0xc462, 0xc461, 0xc45f, 0xc45d, 0xc45b, 0xc45a, 0xc458, 0xc456, 0xc454, 0xc453, 0xc451, 0xc44f, 0xc44e, 0xc44c, 0xc44a, 0xc448, 0xc447, 0xc445, 0xc443, 0xc442, 0xc440, 0xc43e, 0xc43d, 0xc43b, 0xc439, 0xc437, 0xc436, 0xc434, 0xc432, 0xc431, 0xc42f, 0xc42d, 0xc42c, 0xc42a, 0xc428, 0xc427, 0xc425, 0xc423, 0xc422, 0xc420, 0xc41e, 0xc41d, 0xc41b, 0xc419, 0xc418, 0xc416, 0xc414, 0xc413, 0xc411, 0xc40f, 0xc40e, 0xc40c, 0xc40a, 0xc409, 0xc407, 0xc405, 0xc404, 0xc402, 0xc400, 0xc3fd, 0xc3fa, 0xc3f7, 0xc3f3, 0xc3f0, 0xc3ed, 0xc3ea, 0xc3e6, 0xc3e3, 0xc3e0, 0xc3dc, 0xc3d9, 0xc3d6, 0xc3d3, 0xc3cf, 0xc3cc, 0xc3c9, 0xc3c6, 0xc3c2, 0xc3bf, 0xc3bc, 0xc3b9, 0xc3b5, 0xc3b2, 0xc3af, 0xc3ac, 0xc3a8, 0xc3a5, 0xc3a2, 0xc39f, 0xc39c, 0xc398, 0xc395, 0xc392, 0xc38f, 0xc38c, 0xc388, 0xc385, 0xc382, 0xc37f, 0xc37c, 0xc378, 0xc375, 0xc372, 0xc36f, 0xc36c, 0xc368, 0xc365, 0xc362, 0xc35f, 0xc35c, 0xc359, 0xc355, 0xc352, 0xc34f, 0xc34c, 0xc349, 0xc346, 0xc342, 0xc33f, 0xc33c, 0xc339, 0xc336, 0xc333, 0xc330, 0xc32d, 0xc329, 0xc326, 0xc323, 0xc320, 0xc31d, 0xc31a, 0xc317, 0xc314, 0xc310, 0xc30d, 0xc30a, 0xc307, 0xc304, 0xc301, 0xc2fe, 0xc2fb, 0xc2f8, 0xc2f5, 0xc2f1, 0xc2ee, 0xc2eb, 0xc2e8, 0xc2e5, 0xc2e2, 0xc2df, 0xc2dc, 0xc2d9, 0xc2d6, 0xc2d3, 0xc2d0, 0xc2cd, 0xc2c9, 0xc2c6, 0xc2c3, 0xc2c0, 0xc2bd, 0xc2ba, 0xc2b7, 0xc2b4, 0xc2b1, 0xc2ae, 0xc2ab, 0xc2a8, 0xc2a5, 0xc2a2, 0xc29f, 0xc29c, 0xc299, 0xc296, 0xc293, 0xc290, 0xc28d, 0xc28a, 0xc287, 0xc284, 0xc281, 0xc27e, 0xc27b, 0xc278, 0xc275, 0xc272, 0xc26f, 0xc26c, 0xc269, 0xc266, 0xc263, 0xc260, 0xc25d, 0xc25a, 0xc257, 0xc254, 0xc251, 0xc24e, 0xc24b, 0xc248, 0xc245, 0xc242, 0xc23f, 0xc23c, 0xc239, 0xc236, 0xc233, 0xc230, 0xc22e, 0xc22b, 0xc228, 0xc225, 0xc222, 0xc21f, 0xc21c, 0xc219, 0xc216, 0xc213, 0xc210, 0xc20d, 0xc20a, 0xc207, 0xc205, 0xc202, 0xc1ff, 0xc1fc, 0xc1f9, 0xc1f6, 0xc1f3, 0xc1f0, 0xc1ed, 0xc1ea, 0xc1e8, 0xc1e5, 0xc1e2, 0xc1df, 0xc1dc, 0xc1d9, 0xc1d6, 0xc1d3, 0xc1d0, 0xc1ce, 0xc1cb, 0xc1c8, 0xc1c5, 0xc1c2, 0xc1bf, 0xc1bc, 0xc1ba, 0xc1b7, 0xc1b4, 0xc1b1, 0xc1ae, 0xc1ab, 0xc1a8, 0xc1a6, 0xc1a3, 0xc1a0, 0xc19d, 0xc19a, 0xc197, 0xc194, 0xc192, 0xc18f, 0xc18c, 0xc189, 0xc186, 0xc184, 0xc181, 0xc17e, 0xc17b, 0xc178, 0xc175, 0xc173, 0xc170, 0xc16d, 0xc16a, 0xc167, 0xc165, 0xc162, 0xc15f, 0xc15c, 0xc159, 0xc157, 0xc154, 0xc151, 0xc14e, 0xc14b, 0xc149, 0xc146, 0xc143, 0xc140, 0xc13e, 0xc13b, 0xc138, 0xc135, 0xc132, 0xc130, 0xc12d, 0xc12a, 0xc127, 0xc125, 0xc122, 0xc11f, 0xc11c, 0xc11a, 0xc117, 0xc114, 0xc111, 0xc10f, 0xc10c, 0xc109, 0xc106, 0xc104, 0xc101, 0xc0fe, 0xc0fb, 0xc0f9, 0xc0f6, 0xc0f3, 0xc0f1, 0xc0ee, 0xc0eb, 0xc0e8, 0xc0e6, 0xc0e3, 0xc0e0, 0xc0de, 0xc0db, 0xc0d8, 0xc0d5, 0xc0d3, 0xc0d0, 0xc0cd, 0xc0cb, 0xc0c8, 0xc0c5, 0xc0c3, 0xc0c0, 0xc0bd, 0xc0ba, 0xc0b8, 0xc0b5, 0xc0b2, 0xc0b0, 0xc0ad, 0xc0aa, 0xc0a8, 0xc0a5, 0xc0a2, 0xc0a0, 0xc09d, 0xc09a, 0xc098, 0xc095, 0xc092, 0xc090, 0xc08d, 0xc08a, 0xc088, 0xc085, 0xc082, 0xc080, 0xc07d, 0xc07a, 0xc078, 0xc075, 0xc073, 0xc070, 0xc06d, 0xc06b, 0xc068, 0xc065, 0xc063, 0xc060, 0xc05d, 0xc05b, 0xc058, 0xc056, 0xc053, 0xc050, 0xc04e, 0xc04b, 0xc049, 0xc046, 0xc043, 0xc041, 0xc03e, 0xc03b, 0xc039, 0xc036, 0xc034, 0xc031, 0xc02e, 0xc02c, 0xc029, 0xc027, 0xc024, 0xc021, 0xc01f, 0xc01c, 0xc01a, 0xc017, 0xc015, 0xc012, 0xc00f, 0xc00d, 0xc00a, 0xc008, 0xc005, 0xc003, 0xc000, 0xbffb, 0xbff6, 0xbff1, 0xbfeb, 0xbfe6, 0xbfe1, 0xbfdc, 0xbfd7, 0xbfd2, 0xbfcd, 0xbfc8, 0xbfc3, 0xbfbd, 0xbfb8, 0xbfb3, 0xbfae, 0xbfa9, 0xbfa4, 0xbf9f, 0xbf9a, 0xbf95, 0xbf90, 0xbf8b, 0xbf86, 0xbf81, 0xbf7b, 0xbf76, 0xbf71, 0xbf6c, 0xbf67, 0xbf62, 0xbf5d, 0xbf58, 0xbf53, 0xbf4e, 0xbf49, 0xbf44, 0xbf3f, 0xbf3a, 0xbf35, 0xbf30, 0xbf2b, 0xbf26, 0xbf21, 0xbf1c, 0xbf17, 0xbf12, 0xbf0d, 0xbf08, 0xbf03, 0xbefe, 0xbef9, 0xbef4, 0xbeef, 0xbeea, 0xbee5, 0xbee0, 0xbedb, 0xbed6, 0xbed1, 0xbecc, 0xbec8, 0xbec3, 0xbebe, 0xbeb9, 0xbeb4, 0xbeaf, 0xbeaa, 0xbea5, 0xbea0, 0xbe9b, 0xbe96, 0xbe91, 0xbe8c, 0xbe87, 0xbe83, 0xbe7e, 0xbe79, 0xbe74, 0xbe6f, 0xbe6a, 0xbe65, 0xbe60, 0xbe5b, 0xbe57, 0xbe52, 0xbe4d, 0xbe48, 0xbe43, 0xbe3e, 0xbe39, 0xbe35, 0xbe30, 0xbe2b, 0xbe26, 0xbe21, 0xbe1c, 0xbe17, 0xbe13, 0xbe0e, 0xbe09, 0xbe04, 0xbdff, 0xbdfa, 0xbdf6, 0xbdf1, 0xbdec, 0xbde7, 0xbde2, 0xbdde, 0xbdd9, 0xbdd4, 0xbdcf, 0xbdca, 0xbdc6, 0xbdc1, 0xbdbc, 0xbdb7, 0xbdb2, 0xbdae, 0xbda9, 0xbda4, 0xbd9f, 0xbd9b, 0xbd96, 0xbd91, 0xbd8c, 0xbd88, 0xbd83, 0xbd7e, 0xbd79, 0xbd75, 0xbd70, 0xbd6b, 0xbd66, 0xbd62, 0xbd5d, 0xbd58, 0xbd53, 0xbd4f, 0xbd4a, 0xbd45, 0xbd41, 0xbd3c, 0xbd37, 0xbd32, 0xbd2e, 0xbd29, 0xbd24, 0xbd20, 0xbd1b, 0xbd16, 0xbd12, 0xbd0d, 0xbd08, 0xbd03, 0xbcff, 0xbcfa, 0xbcf5, 0xbcf1, 0xbcec, 0xbce7, 0xbce3, 0xbcde, 0xbcd9, 0xbcd5, 0xbcd0, 0xbccc, 0xbcc7, 0xbcc2, 0xbcbe, 0xbcb9, 0xbcb4, 0xbcb0, 0xbcab, 0xbca6, 0xbca2, 0xbc9d, 0xbc99, 0xbc94, 0xbc8f, 0xbc8b, 0xbc86, 0xbc82, 0xbc7d, 0xbc78, 0xbc74, 0xbc6f, 0xbc6b, 0xbc66, 0xbc61, 0xbc5d, 0xbc58, 0xbc54, 0xbc4f, 0xbc4a, 0xbc46, 0xbc41, 0xbc3d, 0xbc38, 0xbc34, 0xbc2f, 0xbc2b, 0xbc26, 0xbc21, 0xbc1d, 0xbc18, 0xbc14, 0xbc0f, 0xbc0b, 0xbc06, 0xbc02, 0xbbfa, 0xbbf1, 0xbbe8, 0xbbdf, 0xbbd6, 0xbbcd, 0xbbc4, 0xbbbb, 0xbbb2, 0xbba9, 0xbba0, 0xbb97, 0xbb8e, 0xbb85, 0xbb7c, 0xbb73, 0xbb6a, 0xbb61, 0xbb58, 0xbb4f, 0xbb46, 0xbb3d, 0xbb34, 0xbb2b, 0xbb22, 0xbb19, 0xbb10, 0xbb07, 0xbafe, 0xbaf5, 0xbaed, 0xbae4, 0xbadb, 0xbad2, 0xbac9, 0xbac0, 0xbab7, 0xbaae, 0xbaa5, 0xba9c, 0xba94, 0xba8b, 0xba82, 0xba79, 0xba70, 0xba67, 0xba5f, 0xba56, 0xba4d, 0xba44, 0xba3b, 0xba32, 0xba2a, 0xba21, 0xba18, 0xba0f, 0xba06, 0xb9fe, 0xb9f5, 0xb9ec, 0xb9e3, 0xb9da, 0xb9d2, 0xb9c9, 0xb9c0, 0xb9b7, 0xb9af, 0xb9a6, 0xb99d, 0xb995, 0xb98c, 0xb983, 0xb97a, 0xb972, 0xb969, 0xb960, 0xb958, 0xb94f, 0xb946, 0xb93d, 0xb935, 0xb92c, 0xb923, 0xb91b, 0xb912, 0xb909, 0xb901, 0xb8f8, 0xb8ef, 0xb8e7, 0xb8de, 0xb8d6, 0xb8cd, 0xb8c4, 0xb8bc, 0xb8b3, 0xb8ab, 0xb8a2, 0xb899, 0xb891, 0xb888, 0xb880, 0xb877, 0xb86e, 0xb866, 0xb85d, 0xb855, 0xb84c, 0xb844, 0xb83b, 0xb832, 0xb82a, 0xb821, 0xb819, 0xb810, 0xb808, 0xb7ff, 0xb7ee, 0xb7dd, 0xb7cc, 0xb7bb, 0xb7aa, 0xb799, 0xb788, 0xb777, 0xb766, 0xb755, 0xb744, 0xb733, 0xb722, 0xb711, 0xb700, 0xb6ef, 0xb6de, 0xb6cd, 0xb6bd, 0xb6ac, 0xb69b, 0xb68a, 0xb679, 0xb668, 0xb658, 0xb647, 0xb636, 0xb625, 0xb614, 0xb604, 0xb5f3, 0xb5e2, 0xb5d1, 0xb5c1, 0xb5b0, 0xb59f, 0xb58e, 0xb57e, 0xb56d, 0xb55c, 0xb54c, 0xb53b, 0xb52a, 0xb51a, 0xb509, 0xb4f8, 0xb4e8, 0xb4d7, 0xb4c7, 0xb4b6, 0xb4a5, 0xb495, 0xb484, 0xb474, 0xb463, 0xb452, 0xb442, 0xb431, 0xb421, 0xb410, 0xb400, 0xb3df, 0xb3be, 0xb39d, 0xb37c, 0xb35b, 0xb33a, 0xb319, 0xb2f8, 0xb2d7, 0xb2b6, 0xb295, 0xb275, 0xb254, 0xb233, 0xb212, 0xb1f2, 0xb1d1, 0xb1b0, 0xb18f, 0xb16f, 0xb14e, 0xb12d, 0xb10d, 0xb0ec, 0xb0cb, 0xb0ab, 0xb08a, 0xb06a, 0xb049, 0xb029, 0xb008, 0xafcf, 0xaf8e, 0xaf4d, 0xaf0c, 0xaecb, 0xae8b, 0xae4a, 0xae09, 0xadc8, 0xad88, 0xad47, 0xad06, 0xacc6, 0xac85, 0xac45, 0xac04, 0xab87, 0xab06, 0xaa85, 0xaa05, 0xa984, 0xa903, 0xa883, 0xa802, 0xa703, 0xa602, 0xa502, 0xa401, 0xa201, 0xa001, 0x9c00, 0x0000, 0x1fff, 0x23fe, 0x25fe, 0x27fc, 0x28fd, 0x29fc, 0x2afa, 0x2bf8, 0x2c7b, 0x2cfa, 0x2d78, 0x2df7, 0x2e76, 0x2ef4, 0x2f72, 0x2ff0, 0x3037, 0x3076, 0x30b5, 0x30f4, 0x3132, 0x3171, 0x31b0, 0x31ee, 0x322d, 0x326b, 0x32aa, 0x32e8, 0x3326, 0x3364, 0x33a3, 0x33e1, 0x340f, 0x342e, 0x344d, 0x346c, 0x348b, 0x34aa, 0x34c9, 0x34e8, 0x3506, 0x3525, 0x3544, 0x3563, 0x3581, 0x35a0, 0x35bf, 0x35dd, 0x35fc, 0x361a, 0x3639, 0x3657, 0x3676, 0x3694, 0x36b2, 0x36d1, 0x36ef, 0x370d, 0x372c, 0x374a, 0x3768, 0x3786, 0x37a4, 0x37c3, 0x37e1, 0x37ff, 0x380e, 0x381d, 0x382c, 0x383b, 0x384a, 0x3859, 0x3868, 0x3877, 0x3886, 0x3895, 0x38a4, 0x38b3, 0x38c2, 0x38d0, 0x38df, 0x38ee, 0x38fd, 0x390c, 0x391a, 0x3929, 0x3938, 0x3947, 0x3955, 0x3964, 0x3973, 0x3982, 0x3990, 0x399f, 0x39ae, 0x39bc, 0x39cb, 0x39d9, 0x39e8, 0x39f7, 0x3a05, 0x3a14, 0x3a22, 0x3a31, 0x3a3f, 0x3a4e, 0x3a5c, 0x3a6b, 0x3a79, 0x3a88, 0x3a96, 0x3aa5, 0x3ab3, 0x3ac1, 0x3ad0, 0x3ade, 0x3aed, 0x3afb, 0x3b09, 0x3b18, 0x3b26, 0x3b34, 0x3b42, 0x3b51, 0x3b5f, 0x3b6d, 0x3b7c, 0x3b8a, 0x3b98, 0x3ba6, 0x3bb4, 0x3bc3, 0x3bd1, 0x3bdf, 0x3bed, 0x3bfb, 0x3c05, 0x3c0c, 0x3c13, 0x3c1a, 0x3c21, 0x3c28, 0x3c2f, 0x3c36, 0x3c3d, 0x3c44, 0x3c4b, 0x3c52, 0x3c59, 0x3c60, 0x3c67, 0x3c6e, 0x3c75, 0x3c7c, 0x3c83, 0x3c8a, 0x3c91, 0x3c97, 0x3c9e, 0x3ca5, 0x3cac, 0x3cb3, 0x3cba, 0x3cc1, 0x3cc8, 0x3ccf, 0x3cd6, 0x3cdc, 0x3ce3, 0x3cea, 0x3cf1, 0x3cf8, 0x3cff, 0x3d06, 0x3d0c, 0x3d13, 0x3d1a, 0x3d21, 0x3d28, 0x3d2f, 0x3d35, 0x3d3c, 0x3d43, 0x3d4a, 0x3d51, 0x3d57, 0x3d5e, 0x3d65, 0x3d6c, 0x3d72, 0x3d79, 0x3d80, 0x3d87, 0x3d8d, 0x3d94, 0x3d9b, 0x3da1, 0x3da8, 0x3daf, 0x3db6, 0x3dbc, 0x3dc3, 0x3dca, 0x3dd0, 0x3dd7, 0x3dde, 0x3de4, 0x3deb, 0x3df2, 0x3df8, 0x3dff, 0x3e05, 0x3e0c, 0x3e13, 0x3e19, 0x3e20, 0x3e27, 0x3e2d, 0x3e34, 0x3e3a, 0x3e41, 0x3e47, 0x3e4e, 0x3e55, 0x3e5b, 0x3e62, 0x3e68, 0x3e6f, 0x3e75, 0x3e7c, 0x3e82, 0x3e89, 0x3e8f, 0x3e96, 0x3e9c, 0x3ea3, 0x3ea9, 0x3eb0, 0x3eb6, 0x3ebd, 0x3ec3, 0x3eca, 0x3ed0, 0x3ed7, 0x3edd, 0x3ee4, 0x3eea, 0x3ef1, 0x3ef7, 0x3efe, 0x3f04, 0x3f0a, 0x3f11, 0x3f17, 0x3f1e, 0x3f24, 0x3f2a, 0x3f31, 0x3f37, 0x3f3e, 0x3f44, 0x3f4a, 0x3f51, 0x3f57, 0x3f5d, 0x3f64, 0x3f6a, 0x3f70, 0x3f77, 0x3f7d, 0x3f83, 0x3f8a, 0x3f90, 0x3f96, 0x3f9d, 0x3fa3, 0x3fa9, 0x3fb0, 0x3fb6, 0x3fbc, 0x3fc2, 0x3fc9, 0x3fcf, 0x3fd5, 0x3fdc, 0x3fe2, 0x3fe8, 0x3fee, 0x3ff5, 0x3ffb, 0x4000, 0x4004, 0x4007, 0x400a, 0x400d, 0x4010, 0x4013, 0x4016, 0x4019, 0x401c, 0x4020, 0x4023, 0x4026, 0x4029, 0x402c, 0x402f, 0x4032, 0x4035, 0x4038, 0x403b, 0x403e, 0x4041, 0x4044, 0x4048, 0x404b, 0x404e, 0x4051, 0x4054, 0x4057, 0x405a, 0x405d, 0x4060, 0x4063, 0x4066, 0x4069, 0x406c, 0x406f, 0x4072, 0x4075, 0x4078, 0x407b, 0x407e, 0x4081, 0x4084, 0x4087, 0x408a, 0x408d, 0x4090, 0x4093, 0x4096, 0x4099, 0x409c, 0x409f, 0x40a2, 0x40a5, 0x40a8, 0x40ab, 0x40ae, 0x40b1, 0x40b4, 0x40b7, 0x40ba, 0x40bd, 0x40c0, 0x40c3, 0x40c6, 0x40c9, 0x40cc, 0x40cf, 0x40d2, 0x40d5, 0x40d8, 0x40db, 0x40de, 0x40e1, 0x40e4, 0x40e7, 0x40ea, 0x40ed, 0x40ef, 0x40f2, 0x40f5, 0x40f8, 0x40fb, 0x40fe, 0x4101, 0x4104, 0x4107, 0x410a, 0x410d, 0x4110, 0x4113, 0x4115, 0x4118, 0x411b, 0x411e, 0x4121, 0x4124, 0x4127, 0x412a, 0x412d, 0x4130, 0x4132, 0x4135, 0x4138, 0x413b, 0x413e, 0x4141, 0x4144, 0x4147, 0x414a, 0x414c, 0x414f, 0x4152, 0x4155, 0x4158, 0x415b, 0x415e, 0x4160, 0x4163, 0x4166, 0x4169, 0x416c, 0x416f, 0x4172, 0x4174, 0x4177, 0x417a, 0x417d, 0x4180, 0x4183, 0x4185, 0x4188, 0x418b, 0x418e, 0x4191, 0x4194, 0x4196, 0x4199, 0x419c, 0x419f, 0x41a2, 0x41a5, 0x41a7, 0x41aa, 0x41ad, 0x41b0, 0x41b3, 0x41b5, 0x41b8, 0x41bb, 0x41be, 0x41c1, 0x41c3, 0x41c6, 0x41c9, 0x41cc, 0x41ce, 0x41d1, 0x41d4, 0x41d7, 0x41da, 0x41dc, 0x41df, 0x41e2, 0x41e5, 0x41e7, 0x41ea, 0x41ed, 0x41f0, 0x41f2, 0x41f5, 0x41f8, 0x41fb, 0x41fd, 0x4200, 0x4203, 0x4206, 0x4208, 0x420b, 0x420e, 0x4211, 0x4213, 0x4216, 0x4219, 0x421c, 0x421e, 0x4221, 0x4224, 0x4227, 0x4229, 0x422c, 0x422f, 0x4231, 0x4234, 0x4237, 0x423a, 0x423c, 0x423f, 0x4242, 0x4244, 0x4247, 0x424a, 0x424d, 0x424f, 0x4252, 0x4255, 0x4257, 0x425a, 0x425d, 0x425f, 0x4262, 0x4265, 0x4267, 0x426a, 0x426d, 0x426f, 0x4272, 0x4275, 0x4277, 0x427a, 0x427d, 0x427f, 0x4282, 0x4285, 0x4287, 0x428a, 0x428d, 0x428f, 0x4292, 0x4295, 0x4297, 0x429a, 0x429d, 0x429f, 0x42a2, 0x42a5, 0x42a7, 0x42aa, 0x42ad, 0x42af, 0x42b2, 0x42b4, 0x42b7, 0x42ba, 0x42bc, 0x42bf, 0x42c2, 0x42c4, 0x42c7, 0x42c9, 0x42cc, 0x42cf, 0x42d1, 0x42d4, 0x42d6, 0x42d9, 0x42dc, 0x42de, 0x42e1, 0x42e3, 0x42e6, 0x42e9, 0x42eb, 0x42ee, 0x42f0, 0x42f3, 0x42f6, 0x42f8, 0x42fb, 0x42fd, 0x4300, 0x4303, 0x4305, 0x4308, 0x430a, 0x430d, 0x430f, 0x4312, 0x4315, 0x4317, 0x431a, 0x431c, 0x431f, 0x4321, 0x4324, 0x4327, 0x4329, 0x432c, 0x432e, 0x4331, 0x4333, 0x4336, 0x4338, 0x433b, 0x433e, 0x4340, 0x4343, 0x4345, 0x4348, 0x434a, 0x434d, 0x434f, 0x4352, 0x4354, 0x4357, 0x4359, 0x435c, 0x435e, 0x4361, 0x4363, 0x4366, 0x4369, 0x436b, 0x436e, 0x4370, 0x4373, 0x4375, 0x4378, 0x437a, 0x437d, 0x437f, 0x4382, 0x4384, 0x4387, 0x4389, 0x438c, 0x438e, 0x4391, 0x4393, 0x4396, 0x4398, 0x439b, 0x439d, 0x43a0, 0x43a2, 0x43a5, 0x43a7, 0x43a9, 0x43ac, 0x43ae, 0x43b1, 0x43b3, 0x43b6, 0x43b8, 0x43bb, 0x43bd, 0x43c0, 0x43c2, 0x43c5, 0x43c7, 0x43ca, 0x43cc, 0x43ce, 0x43d1, 0x43d3, 0x43d6, 0x43d8, 0x43db, 0x43dd, 0x43e0, 0x43e2, 0x43e5, 0x43e7, 0x43e9, 0x43ec, 0x43ee, 0x43f1, 0x43f3, 0x43f6, 0x43f8, 0x43fa, 0x43fd, 0x43ff, 0x4401, 0x4402, 0x4403, 0x4404, 0x4406, 0x4407, 0x4408, 0x4409, 0x440b, 0x440c, 0x440d, 0x440e, 0x440f, 0x4411, 0x4412, 0x4413, 0x4414, 0x4415, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4442, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, 0x448c, 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, 0x4496, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, 0x449e, 0x449f, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a5, 0x44a6, 0x44a7, 0x44a8, 0x44aa, 0x44ab, 0x44ac, 0x44ad, 0x44ae, 0x44af, 0x44b0, 0x44b1, 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, 0x44b9, 0x44ba, 0x44bb, 0x44bc, 0x44be, 0x44bf, 0x44c0, 0x44c1, 0x44c2, 0x44c3, 0x44c4, 0x44c5, 0x44c6, 0x44c7, 0x44c9, 0x44ca, 0x44cb, 0x44cc, 0x44cd, 0x44ce, 0x44cf, 0x44d0, 0x44d1, 0x44d2, 0x44d4, 0x44d5, 0x44d6, 0x44d7, 0x44d8, 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44de, 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e4, 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44e9, 0x44ea, 0x44eb, 0x44ed, 0x44ee, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f4, 0x44f5, 0x44f6, 0x44f7, 0x44f8, 0x44f9, 0x44fb, 0x44fc, 0x44fd, 0x44fe, 0x44ff, 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, 0x4505, 0x4506, 0x4507, 0x4508, 0x450a, 0x450b, 0x450c, 0x450d, 0x450e, 0x450f, 0x4510, 0x4511, 0x4512, 0x4513, 0x4514, 0x4515, 0x4516, 0x4517, 0x4518, 0x4519, 0x451b, 0x451c, 0x451d, 0x451e, 0x451f, 0x4520, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x4530, 0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x454a, 0x454b, 0x454c, 0x454d, 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, 0x457c, 0x457d, 0x457e, 0x457f, 0x4580, 0x4581, 0x4582, 0x4583, 0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458a, 0x458b, 0x458c, 0x458e, 0x4590, 0x4592, 0x4594, 0x4596, 0x4598, 0x459a, 0x459c, 0x459d, 0x459f, 0x45a1, 0x45a3, 0x45a5, 0x45a7, 0x45a9, 0x45ab, 0x45ad, 0x45af, 0x45b1, 0x45b3, 0x45b5, 0x45b7, 0x45b9, 0x45bb, 0x45bd, 0x45bf, 0x45c1, 0x45c3, 0x45c5, 0x45c7, 0x45c9, 0x45cb, 0x45cd, 0x45ce, 0x45d0, 0x45d2, 0x45d4, 0x45d6, 0x45d8, 0x45da, 0x45dc, 0x45de, 0x45e0, 0x45e2, 0x45e4, 0x45e6, 0x45e7, 0x45e9, 0x45eb, 0x45ed, 0x45ef, 0x45f1, 0x45f3, 0x45f5, 0x45f7, 0x45f9, 0x45fb, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, 0x4606, 0x4608, 0x460a, 0x460b, 0x460d, 0x460f, 0x4611, 0x4613, 0x4615, 0x4617, 0x4619, 0x461a, 0x461c, 0x461e, 0x4620, 0x4622, 0x4624, 0x4626, 0x4627, 0x4629, 0x462b, 0x462d, 0x462f, 0x4631, 0x4633, 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, 0x4643, 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464e, 0x4650, 0x4652, 0x4653, 0x4655, 0x4657, 0x4659, 0x465b, 0x465d, 0x465e, 0x4660, 0x4662, 0x4664, 0x4666, 0x4667, 0x4669, 0x466b, 0x466d, 0x466f, 0x4670, 0x4672, 0x4674, 0x4676, 0x4677, 0x4679, 0x467b, 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, 0x4686, 0x4687, 0x4689, 0x468b, 0x468d, 0x468e, 0x4690, 0x4692, 0x4694, 0x4696, 0x4697, 0x4699, 0x469b, 0x469d, 0x469e, 0x46a0, 0x46a2, 0x46a4, 0x46a5, 0x46a7, 0x46a9, 0x46aa, 0x46ac, 0x46ae, 0x46b0, 0x46b1, 0x46b3, 0x46b5, 0x46b7, 0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, 0x46c3, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, 0x46d0, 0x46d2, 0x46d4, 0x46d6, 0x46d7, 0x46d9, 0x46db, 0x46dc, 0x46de, 0x46e0, 0x46e1, 0x46e3, 0x46e5, 0x46e6, 0x46e8, 0x46ea, 0x46ec, 0x46ed, 0x46ef, 0x46f1, 0x46f2, 0x46f4, 0x46f6, 0x46f7, 0x46f9, 0x46fb, 0x46fc, 0x46fe, 0x4700, 0x4701, 0x4703, 0x4705, 0x4706, 0x4708, 0x470a, 0x470b, 0x470d, 0x470f, 0x4710, 0x4712, 0x4714, 0x4715, 0x4717, 0x4718, 0x471a, 0x471c, 0x471d, 0x471f, 0x4721, 0x4722, 0x4724, 0x4726, 0x4727, 0x4729, 0x472b, 0x472c, 0x472e, 0x472f, 0x4731, 0x4733, 0x4734, 0x4736, 0x4738, 0x4739, 0x473b, 0x473c, 0x473e, 0x4740, 0x4741, 0x4743, 0x4745, 0x4746, 0x4748, 0x4749, 0x474b, 0x474d, 0x474e, 0x4750, 0x4751, 0x4753, 0x4755, 0x4756, 0x4758, 0x4759, 0x475b, 0x475d, 0x475e, 0x4760, 0x4761, 0x4763, 0x4765, 0x4766, 0x4768, 0x4769, 0x476b, 0x476c, 0x476e, 0x4770, 0x4771, 0x4773, 0x4774, 0x4776, 0x4777, 0x4779, 0x477b, 0x477c, 0x477e, 0x477f, 0x4781, 0x4782, 0x4784, 0x4786, 0x4787, 0x4789, 0x478a, 0x478c, 0x478d, 0x478f, 0x4790, 0x4792, 0x4794, 0x4795, 0x4797, 0x4798, 0x479a, 0x479b, 0x479d, 0x479e, 0x47a0, 0x47a2, 0x47a3, 0x47a5, 0x47a6, 0x47a8, 0x47a9, 0x47ab, 0x47ac, 0x47ae, 0x47af, 0x47b1, 0x47b2, 0x47b4, 0x47b5, 0x47b7, 0x47b8, 0x47ba, 0x47bc, 0x47bd, 0x47bf, 0x47c0, 0x47c2, 0x47c3, 0x47c5, 0x47c6, 0x47c8, 0x47c9, 0x47cb, 0x47cc, 0x47ce, 0x47cf, 0x47d1, 0x47d2, 0x47d4, 0x47d5, 0x47d7, 0x47d8, 0x47da, 0x47db, 0x47dd, 0x47de, 0x47e0, 0x47e1, 0x47e3, 0x47e4, 0x47e6, 0x47e7, 0x47e9, 0x47ea, 0x47ec, 0x47ed, 0x47ef, 0x47f0, 0x47f2, 0x47f3, 0x47f5, 0x47f6, 0x47f8, 0x47f9, 0x47fa, 0x47fc, 0x47fd, 0x47ff, 0x4800, 0x4801, 0x4802, 0x4802, 0x4803, 0x4804, 0x4805, 0x4805, 0x4806, 0x4807, 0x4808, 0x4808, 0x4809, 0x480a, 0x480a, 0x480b, 0x480c, 0x480d, 0x480d, 0x480e, 0x480f, 0x4810, 0x4810, 0x4811, 0x4812, 0x4812, 0x4813, 0x4814, 0x4815, 0x4815, 0x4816, 0x4817, 0x4817, 0x4818, 0x4819, 0x481a, 0x481a, 0x481b, 0x481c, 0x481c, 0x481d, 0x481e, 0x481f, 0x481f, 0x4820, 0x4821, 0x4821, 0x4822, 0x4823, 0x4824, 0x4824, 0x4825, 0x4826, 0x4826, 0x4827, 0x4828, 0x4829, 0x4829, 0x482a, 0x482b, 0x482b, 0x482c, 0x482d, 0x482e, 0x482e, 0x482f, 0x4830, 0x4830, 0x4831, 0x4832, 0x4832, 0x4833, 0x4834, 0x4835, 0x4835, 0x4836, 0x4837, 0x4837, 0x4838, 0x4839, 0x4839, 0x483a, 0x483b, 0x483b, 0x483c, 0x483d, 0x483e, 0x483e, 0x483f, 0x4840, 0x4840, 0x4841, 0x4842, 0x4842, 0x4843, 0x4844, 0x4844, 0x4845, 0x4846, 0x4847, 0x4847, 0x4848, 0x4849, 0x4849, 0x484a, 0x484b, 0x484b, 0x484c, 0x484d, 0x484d, 0x484e, 0x484f, 0x484f, 0x4850, 0x4851, 0x4851, 0x4852, 0x4853, 0x4853, 0x4854, 0x4855, 0x4856, 0x4856, 0x4857, 0x4858, 0x4858, 0x4859, 0x485a, 0x485a, 0x485b, 0x485c, 0x485c, 0x485d, 0x485e, 0x485e, 0x485f, 0x4860, 0x4860, 0x4861, 0x4862, 0x4862, 0x4863, 0x4864, 0x4864, 0x4865, 0x4866, 0x4866, 0x4867, 0x4868, 0x4868, 0x4869, 0x486a, 0x486a, 0x486b, 0x486c, 0x486c, 0x486d, 0x486e, 0x486e, 0x486f, 0x4870, 0x4870, 0x4871, 0x4872, 0x4872, 0x4873, 0x4874, 0x4874, 0x4875, 0x4876, 0x4876, 0x4877, 0x4877, 0x4878, 0x4879, 0x4879, 0x487a, 0x487b, 0x487b, 0x487c, 0x487d, 0x487d, 0x487e, 0x487f, 0x487f, 0x4880, 0x4881, 0x4881, 0x4882, 0x4883, 0x4883, 0x4884, 0x4884, 0x4885, 0x4886, 0x4886, 0x4887, 0x4888, 0x4888, 0x4889, 0x488a, 0x488a, 0x488b, 0x488c, 0x488c, 0x488d, 0x488d, 0x488e, 0x488f, 0x488f, 0x4890, 0x4891, 0x4891, 0x4892, 0x4893, 0x4893, 0x4894, 0x4895, 0x4895, 0x4896, 0x4896, 0x4897, 0x4898, 0x4898, 0x4899, 0x489a, 0x489a, 0x489b, 0x489c, 0x489c, 0x489d, 0x489d, 0x489e, 0x489f, 0x489f, 0x48a0, 0x48a1, 0x48a1, 0x48a2, 0x48a2, 0x48a3, 0x48a4, 0x48a4, 0x48a5, 0x48a6, 0x48a6, 0x48a7, 0x48a7, 0x48a8, 0x48a9, 0x48a9, 0x48aa, 0x48ab, 0x48ab, 0x48ac, 0x48ac, 0x48ad, 0x48ae, 0x48ae, 0x48af, 0x48b0, 0x48b0, 0x48b1, 0x48b1, 0x48b2, 0x48b3, 0x48b3, 0x48b4, 0x48b4, 0x48b5, 0x48b6, 0x48b6, 0x48b7, 0x48b8, 0x48b8, 0x48b9, 0x48b9, 0x48ba, 0x48bb, 0x48bb, 0x48bc, 0x48bc, 0x48bd, 0x48be, 0x48be, 0x48bf, 0x48c0, 0x48c0, 0x48c1, 0x48c1, 0x48c2, 0x48c3, 0x48c3, 0x48c4, 0x48c4, 0x48c5, 0x48c6, 0x48c6, 0x48c7, 0x48c7, 0x48c8, 0x48c9, 0x48c9, 0x48ca, 0x48ca, 0x48cb, 0x48cc, 0x48cc, 0x48cd, 0x48cd, 0x48ce, 0x48cf, 0x48cf, 0x48d0, 0x48d0, 0x48d1, 0x48d2, 0x48d2, 0x48d3, 0x48d3, 0x48d4, 0x48d5, 0x48d5, 0x48d6, 0x48d6, 0x48d7, 0x48d8, 0x48d8, 0x48d9, 0x48d9, 0x48da, 0x48db, 0x48db, 0x48dc, 0x48dc, 0x48dd, 0x48de, 0x48de, 0x48df, 0x48df, 0x48e0, 0x48e1, 0x48e1, 0x48e2, 0x48e2, 0x48e3, 0x48e3, 0x48e4, 0x48e5, 0x48e5, 0x48e6, 0x48e6, 0x48e7, 0x48e8, 0x48e8, 0x48e9, 0x48e9, 0x48ea, 0x48eb, 0x48eb, 0x48ec, 0x48ec, 0x48ed, 0x48ed, 0x48ee, 0x48ef, 0x48ef, 0x48f0, 0x48f0, 0x48f1, 0x48f2, 0x48f2, 0x48f3, 0x48f3, 0x48f4, 0x48f4, 0x48f5, 0x48f6, 0x48f6, 0x48f7, 0x48f7, 0x48f8, 0x48f8, 0x48f9, 0x48fa, 0x48fa, 0x48fb, 0x48fb, 0x48fc, 0x48fd, 0x48fd, 0x48fe, 0x48fe, 0x48ff, 0x48ff, 0x4900, 0x4901, 0x4901, 0x4902, 0x4902, 0x4903, 0x4903, 0x4904, 0x4905, 0x4905, 0x4906, 0x4906, 0x4907, 0x4907, 0x4908, 0x4909, 0x4909, 0x490a, 0x490a, 0x490b, 0x490b, 0x490c, 0x490c, 0x490d, 0x490e, 0x490e, 0x490f, 0x490f, 0x4910, 0x4910, 0x4911, 0x4912, 0x4912, 0x4913, 0x4913, 0x4914, 0x4914, 0x4915, 0x4916, 0x4916, 0x4917, 0x4917, 0x4918, 0x4918, 0x4919, 0x4919, 0x491a, 0x491b, 0x491b, 0x491c, 0x491c, 0x491d, 0x491d, 0x491e, 0x491e, 0x491f, 0x4920, 0x4920, 0x4921, 0x4921, 0x4922, 0x4922, 0x4923, 0x4923, 0x4924, 0x4925, 0x4925, 0x4926, 0x4926, 0x4927, 0x4927, 0x4928, 0x4928, 0x4929, 0x492a, 0x492a, 0x492b, 0x492b, 0x492c, 0x492c, 0x492d, 0x492d, 0x492e, 0x492e, 0x492f, 0x4930, 0x4930, 0x4931, 0x4931, 0x4932, 0x4932, 0x4933, 0x4933, 0x4934, 0x4934, 0x4935, 0x4936, 0x4936, 0x4937, 0x4937, 0x4938, 0x4938, 0x4939, 0x4939, 0x493a, 0x493a, 0x493b, 0x493c, 0x493c, 0x493d, 0x493d, 0x493e, 0x493e, 0x493f, 0x493f, 0x4940, 0x4940, 0x4941, 0x4941, 0x4942, 0x4943, 0x4943, 0x4944, 0x4944, 0x4945, 0x4945, 0x4946, 0x4946, 0x4947, 0x4947, 0x4948, 0x4948, 0x4949, 0x4949, 0x494a, 0x494b, 0x494b, 0x494c, 0x494c, 0x494d, 0x494d, 0x494e, 0x494e, 0x494f, 0x494f, 0x4950, 0x4950, 0x4951, 0x4951, 0x4952, 0x4953, 0x4953, 0x4954, 0x4954, 0x4955, 0x4955, 0x4956, 0x4956, 0x4957, 0x4957, 0x4958, 0x4958, 0x4959, 0x4959, 0x495a, 0x495a, 0x495b, 0x495b, 0x495c, 0x495d, 0x495d, 0x495e, 0x495e, 0x495f, 0x495f, 0x4960, 0x4960, 0x4961, 0x4961, 0x4962, 0x4962, 0x4963, 0x4963, 0x4964, 0x4964, 0x4965, 0x4965, 0x4966, 0x4966, 0x4967, 0x4967, 0x4968, 0x4968, 0x4969, 0x496a, 0x496a, 0x496b, 0x496b, 0x496c, 0x496c, 0x496d, 0x496d, 0x496e, 0x496e, 0x496f, 0x496f, 0x4970, 0x4970, 0x4971, 0x4971, 0x4972, 0x4972, 0x4973, 0x4973, 0x4974, 0x4974, 0x4975, 0x4975, 0x4976, 0x4976, 0x4977, 0x4977, 0x4978, 0x4978, 0x4979, 0x4979, 0x497a, 0x497a, 0x497b, 0x497b, 0x497c, 0x497c, 0x497d, 0x497d, 0x497e, 0x497e, 0x497f, 0x497f, 0x4980, 0x4981, 0x4981, 0x4982, 0x4982, 0x4983, 0x4983, 0x4984, 0x4984, 0x4985, 0x4985, 0x4986, 0x4986, 0x4987, 0x4987, 0x4988, 0x4988, 0x4989, 0x4989, 0x498a, 0x498a, 0x498b, 0x498b, 0x498c, 0x498d, 0x498e, 0x498f, 0x4990, 0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4997, 0x4998, 0x4999, 0x499a, 0x499b, 0x499c, 0x499d, 0x499e, 0x499f, 0x49a0, 0x49a1, 0x49a2, 0x49a3, 0x49a4, 0x49a5, 0x49a6, 0x49a7, 0x49a8, 0x49a9, 0x49aa, 0x49ab, 0x49ac, 0x49ad, 0x49ae, 0x49af, 0x49b0, 0x49b1, 0x49b2, 0x49b3, 0x49b4, 0x49b5, 0x49b6, 0x49b7, 0x49b8, 0x49b9, 0x49ba, 0x49ba, 0x49bb, 0x49bc, 0x49bd, 0x49be, 0x49bf, 0x49c0, 0x49c1, 0x49c2, 0x49c3, 0x49c4, 0x49c5, 0x49c6, 0x49c7, 0x49c8, 0x49c9, 0x49ca, 0x49cb, 0x49cc, 0x49cc, 0x49cd, 0x49ce, 0x49cf, 0x49d0, 0x49d1, 0x49d2, 0x49d3, 0x49d4, 0x49d5, 0x49d6, 0x49d7, 0x49d8, 0x49d9, 0x49da, 0x49da, 0x49db, 0x49dc, 0x49dd, 0x49de, 0x49df, 0x49e0, 0x49e1, 0x49e2, 0x49e3, 0x49e4, 0x49e5, 0x49e5, 0x49e6, 0x49e7, 0x49e8, 0x49e9, 0x49ea, 0x49eb, 0x49ec, 0x49ed, 0x49ee, 0x49ef, 0x49f0, 0x49f0, 0x49f1, 0x49f2, 0x49f3, 0x49f4, 0x49f5, 0x49f6, 0x49f7, 0x49f8, 0x49f9, 0x49f9, 0x49fa, 0x49fb, 0x49fc, 0x49fd, 0x49fe, 0x49ff, 0x4a00, 0x4a01, 0x4a02, 0x4a02, 0x4a03, 0x4a04, 0x4a05, 0x4a06, 0x4a07, 0x4a08, 0x4a09, 0x4a09, 0x4a0a, 0x4a0b, 0x4a0c, 0x4a0d, 0x4a0e, 0x4a0f, 0x4a10, 0x4a11, 0x4a11, 0x4a12, 0x4a13, 0x4a14, 0x4a15, 0x4a16, 0x4a17, 0x4a18, 0x4a18, 0x4a19, 0x4a1a, 0x4a1b, 0x4a1c, 0x4a1d, 0x4a1e, 0x4a1f, 0x4a1f, 0x4a20, 0x4a21, 0x4a22, 0x4a23, 0x4a24, 0x4a25, 0x4a25, 0x4a26, 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, 0x4a2b, 0x4a2c, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a31, 0x4a32, 0x4a33, 0x4a34, 0x4a35, 0x4a36, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, 0x4a3c, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a41, 0x4a42, 0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a46, 0x4a47, 0x4a48, 0x4a49, 0x4a4a, 0x4a4b, 0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, 0x4a50, 0x4a50, 0x4a51, 0x4a52, 0x4a53, 0x4a54, 0x4a54, 0x4a55, 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a59, 0x4a5a, 0x4a5b, 0x4a5c, 0x4a5d, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a62, 0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a66, 0x4a67, 0x4a68, 0x4a69, 0x4a6a, 0x4a6a, 0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6e, 0x4a6f, 0x4a70, 0x4a71, 0x4a72, 0x4a72, 0x4a73, 0x4a74, 0x4a75, 0x4a76, 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7a, 0x4a7b, 0x4a7c, 0x4a7d, 0x4a7e, 0x4a7e, 0x4a7f, 0x4a80, 0x4a81, 0x4a82, 0x4a82, 0x4a83, 0x4a84, 0x4a85, 0x4a85, 0x4a86, 0x4a87, 0x4a88, 0x4a89, 0x4a89, 0x4a8a, 0x4a8b, 0x4a8c, 0x4a8c, 0x4a8d, 0x4a8e, 0x4a8f, 0x4a90, 0x4a90, 0x4a91, 0x4a92, 0x4a93, 0x4a93, 0x4a94, 0x4a95, 0x4a96, 0x4a97, 0x4a97, 0x4a98, 0x4a99, 0x4a9a, 0x4a9a, 0x4a9b, 0x4a9c, 0x4a9d, 0x4a9d, 0x4a9e, 0x4a9f, 0x4aa0, 0x4aa1, 0x4aa1, 0x4aa2, 0x4aa3, 0x4aa4, 0x4aa4, 0x4aa5, 0x4aa6, 0x4aa7, 0x4aa7, 0x4aa8, 0x4aa9, 0x4aaa, 0x4aaa, 0x4aab, 0x4aac, 0x4aad, 0x4aad, 0x4aae, 0x4aaf, 0x4ab0, 0x4ab0, 0x4ab1, 0x4ab2, 0x4ab3, 0x4ab3, 0x4ab4, 0x4ab5, 0x4ab6, 0x4ab6, 0x4ab7, 0x4ab8, 0x4ab9, 0x4ab9, 0x4aba, 0x4abb, 0x4abc, 0x4abc, 0x4abd, 0x4abe, 0x4abf, 0x4abf, 0x4ac0, 0x4ac1, 0x4ac2, 0x4ac2, 0x4ac3, 0x4ac4, 0x4ac4, 0x4ac5, 0x4ac6, 0x4ac7, 0x4ac7, 0x4ac8, 0x4ac9, 0x4aca, 0x4aca, 0x4acb, 0x4acc, 0x4acd, 0x4acd, 0x4ace, 0x4acf, 0x4acf, 0x4ad0, 0x4ad1, 0x4ad2, 0x4ad2, 0x4ad3, 0x4ad4, 0x4ad5, 0x4ad5, 0x4ad6, 0x4ad7, 0x4ad7, 0x4ad8, 0x4ad9, 0x4ada, 0x4ada, 0x4adb, 0x4adc, 0x4add, 0x4add, 0x4ade, 0x4adf, 0x4adf, 0x4ae0, 0x4ae1, 0x4ae2, 0x4ae2, 0x4ae3, 0x4ae4, 0x4ae4, 0x4ae5, 0x4ae6, 0x4ae7, 0x4ae7, 0x4ae8, 0x4ae9, 0x4ae9, 0x4aea, 0x4aeb, 0x4aec, 0x4aec, 0x4aed, 0x4aee, 0x4aee, 0x4aef, 0x4af0, 0x4af0, 0x4af1, 0x4af2, 0x4af3, 0x4af3, 0x4af4, 0x4af5, 0x4af5, 0x4af6, 0x4af7, 0x4af7, 0x4af8, 0x4af9, 0x4afa, 0x4afa, 0x4afb, 0x4afc, 0x4afc, 0x4afd, 0x4afe, 0x4afe, 0x4aff, 0x4b00, 0x4b01, 0x4b01, 0x4b02, 0x4b03, 0x4b03, 0x4b04, 0x4b05, 0x4b05, 0x4b06, 0x4b07, 0x4b07, 0x4b08, 0x4b09, 0x4b0a, 0x4b0a, 0x4b0b, 0x4b0c, 0x4b0c, 0x4b0d, 0x4b0e, 0x4b0e, 0x4b0f, 0x4b10, 0x4b10, 0x4b11, 0x4b12, 0x4b12, 0x4b13, 0x4b14, 0x4b15, 0x4b15, 0x4b16, 0x4b17, 0x4b17, 0x4b18, 0x4b19, 0x4b19, 0x4b1a, 0x4b1b, 0x4b1b, 0x4b1c, 0x4b1d, 0x4b1d, 0x4b1e, 0x4b1f, 0x4b1f, 0x4b20, 0x4b21, 0x4b21, 0x4b22, 0x4b23, 0x4b23, 0x4b24, 0x4b25, 0x4b25, 0x4b26, 0x4b27, 0x4b27, 0x4b28, 0x4b29, 0x4b29, 0x4b2a, 0x4b2b, 0x4b2b, 0x4b2c, 0x4b2d, 0x4b2d, 0x4b2e, 0x4b2f, 0x4b2f, 0x4b30, 0x4b31, 0x4b31, 0x4b32, 0x4b33, 0x4b33, 0x4b34, 0x4b35, 0x4b35, 0x4b36, 0x4b37, 0x4b37, 0x4b38, 0x4b39, 0x4b39, 0x4b3a, 0x4b3b, 0x4b3b, 0x4b3c, 0x4b3d, 0x4b3d, 0x4b3e, 0x4b3f, 0x4b3f, 0x4b40, 0x4b41, 0x4b41, 0x4b42, 0x4b42, 0x4b43, 0x4b44, 0x4b44, 0x4b45, 0x4b46, 0x4b46, 0x4b47, 0x4b48, 0x4b48, 0x4b49, 0x4b4a, 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4c, 0x4b4d, 0x4b4d, 0x4b4e, 0x4b4f, 0x4b4f, 0x4b50, 0x4b51, 0x4b51, 0x4b52, 0x4b53, 0x4b53, 0x4b54, 0x4b55, 0x4b55, 0x4b56, 0x4b56, 0x4b57, 0x4b58, 0x4b58, 0x4b59, 0x4b5a, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5c, 0x4b5d, 0x4b5d, 0x4b5e, 0x4b5f, 0x4b5f, 0x4b60, 0x4b61, 0x4b61, 0x4b62, 0x4b63, 0x4b63, 0x4b64, 0x4b64, 0x4b65, 0x4b66, 0x4b66, 0x4b67, 0x4b68, 0x4b68, 0x4b69, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6b, 0x4b6c, 0x4b6d, 0x4b6d, 0x4b6e, 0x4b6e, 0x4b6f, 0x4b70, 0x4b70, 0x4b71, 0x4b72, 0x4b72, 0x4b73, 0x4b73, 0x4b74, 0x4b75, 0x4b75, 0x4b76, 0x4b77, 0x4b77, 0x4b78, 0x4b78, 0x4b79, 0x4b7a, 0x4b7a, 0x4b7b, 0x4b7b, 0x4b7c, 0x4b7d, 0x4b7d, 0x4b7e, 0x4b7f, 0x4b7f, 0x4b80, 0x4b80, 0x4b81, 0x4b82, 0x4b82, 0x4b83, 0x4b83, 0x4b84, 0x4b85, 0x4b85, 0x4b86, 0x4b87, 0x4b87, 0x4b88, 0x4b88, 0x4b89, 0x4b8a, 0x4b8a, 0x4b8b, 0x4b8b, 0x4b8c, 0x4b8d, 0x4b8d, 0x4b8e, 0x4b8e, 0x4b8f, 0x4b90, 0x4b90, 0x4b91, 0x4b91, 0x4b92, 0x4b93, 0x4b93, 0x4b94, 0x4b94, 0x4b95, 0x4b96, 0x4b96, 0x4b97, 0x4b97, 0x4b98, 0x4b99, 0x4b99, 0x4b9a, 0x4b9a, 0x4b9b, 0x4b9c, 0x4b9c, 0x4b9d, 0x4b9d, 0x4b9e, 0x4b9f, 0x4b9f, 0x4ba0, 0x4ba0, 0x4ba1, 0x4ba2, 0x4ba2, 0x4ba3, 0x4ba3, 0x4ba4, 0x4ba5, 0x4ba5, 0x4ba6, 0x4ba6, 0x4ba7, 0x4ba8, 0x4ba8, 0x4ba9, 0x4ba9, 0x4baa, 0x4baa, 0x4bab, 0x4bac, 0x4bac, 0x4bad, 0x4bad, 0x4bae, 0x4baf, 0x4baf, 0x4bb0, 0x4bb0, 0x4bb1, 0x4bb1, 0x4bb2, 0x4bb3, 0x4bb3, 0x4bb4, 0x4bb4, 0x4bb5, 0x4bb6, 0x4bb6, 0x4bb7, 0x4bb7, 0x4bb8, 0x4bb8, 0x4bb9, 0x4bba, 0x4bba, 0x4bbb, 0x4bbb, 0x4bbc, 0x4bbd, 0x4bbd, 0x4bbe, 0x4bbe, 0x4bbf, 0x4bbf, 0x4bc0, 0x4bc1, 0x4bc1, 0x4bc2, 0x4bc2, 0x4bc3, 0x4bc3, 0x4bc4, 0x4bc5, 0x4bc5, 0x4bc6, 0x4bc6, 0x4bc7, 0x4bc7, 0x4bc8, 0x4bc9, 0x4bc9, 0x4bca, 0x4bca, 0x4bcb, 0x4bcb, 0x4bcc, 0x4bcd, 0x4bcd, 0x4bce, 0x4bce, 0x4bcf, 0x4bcf, 0x4bd0, 0x4bd1, 0x4bd1, 0x4bd2, 0x4bd2, 0x4bd3, 0x4bd3, 0x4bd4, 0x4bd5, 0x4bd5, 0x4bd6, 0x4bd6, 0x4bd7, 0x4bd7, 0x4bd8, 0x4bd8, 0x4bd9, 0x4bda, 0x4bda, 0x4bdb, 0x4bdb, 0x4bdc, 0x4bdc, 0x4bdd, 0x4bde, 0x4bde, 0x4bdf, 0x4bdf, 0x4be0, 0x4be0, 0x4be1, 0x4be1, 0x4be2, 0x4be3, 0x4be3, 0x4be4, 0x4be4, 0x4be5, 0x4be5, 0x4be6, 0x4be6, 0x4be7, 0x4be8, 0x4be8, 0x4be9, 0x4be9, 0x4bea, 0x4bea, 0x4beb, 0x4beb, 0x4bec, 0x4bed, 0x4bed, 0x4bee, 0x4bee, 0x4bef, 0x4bef, 0x4bf0, 0x4bf0, 0x4bf1, 0x4bf1, 0x4bf2, 0x4bf3, 0x4bf3, 0x4bf4, 0x4bf4, 0x4bf5, 0x4bf5, 0x4bf6, 0x4bf6, 0x4bf7, 0x4bf8, 0x4bf8, 0x4bf9, 0x4bf9, 0x4bfa, 0x4bfa, 0x4bfb, 0x4bfb, 0x4bfc, 0x4bfc, 0x4bfd, 0x4bfe, 0x4bfe, 0x4bff, 0x4bff, 0x4c00, 0x4c00, 0x4c00, 0x4c01, 0x4c01, 0x4c01, 0x4c01, 0x4c02, 0x4c02, 0x4c02, 0x4c03, 0x4c03, 0x4c03, 0x4c03, 0x4c04, 0x4c04, 0x4c04, 0x4c04, 0x4c05, 0x4c05, 0x4c05, 0x4c05, 0x4c06, 0x4c06, 0x4c06, 0x4c07, 0x4c07, 0x4c07, 0x4c07, 0x4c08, 0x4c08, 0x4c08, 0x4c08, 0x4c09, 0x4c09, 0x4c09, 0x4c09, 0x4c0a, 0x4c0a, 0x4c0a, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0c, 0x4c0c, 0x4c0c, 0x4c0c, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0e, 0x4c0e, 0x4c0e, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c10, 0x4c10, 0x4c10, 0x4c10, 0x4c11, 0x4c11, 0x4c11, 0x4c11, 0x4c12, 0x4c12, 0x4c12, 0x4c12, 0x4c13, 0x4c13, 0x4c13, 0x4c13, 0x4c14, 0x4c14, 0x4c14, 0x4c15, 0x4c15, 0x4c15, 0x4c15, 0x4c16, 0x4c16, 0x4c16, 0x4c16, 0x4c17, 0x4c17, 0x4c17, 0x4c17, 0x4c18, 0x4c18, 0x4c18, 0x4c18, 0x4c19, 0x4c19, 0x4c19, 0x4c19, 0x4c1a, 0x4c1a, 0x4c1a, 0x4c1a, 0x4c1b, 0x4c1b, 0x4c1b, 0x4c1c, 0x4c1c, 0x4c1c, 0x4c1c, 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1e, 0x4c1e, 0x4c1e, 0x4c1e, 0x4c1f, 0x4c1f, 0x4c1f, 0x4c1f, 0x4c20, 0x4c20, 0x4c20, 0x4c20, 0x4c21, 0x4c21, 0x4c21, 0x4c21, 0x4c22, 0x4c22, 0x4c22, 0x4c22, 0x4c23, 0x4c23, 0x4c23, 0x4c23, 0x4c24, 0x4c24, 0x4c24, 0x4c24, 0x4c25, 0x4c25, 0x4c25, 0x4c25, 0x4c26, 0x4c26, 0x4c26, 0x4c26, 0x4c27, 0x4c27, 0x4c27, 0x4c27, 0x4c28, 0x4c28, 0x4c28, 0x4c28, 0x4c29, 0x4c29, 0x4c2a, 0x4c2a, 0x4c2b, 0x4c2b, 0x4c2c, 0x4c2c, 0x4c2d, 0x4c2d, 0x4c2e, 0x4c2e, 0x4c2f, 0x4c2f, 0x4c30, 0x4c30, 0x4c31, 0x4c31, 0x4c32, 0x4c32, 0x4c33, 0x4c33, 0x4c34, 0x4c34, 0x4c35, 0x4c35, 0x4c36, 0x4c36, 0x4c36, 0x4c37, 0x4c37, 0x4c38, 0x4c38, 0x4c39, 0x4c39, 0x4c3a, 0x4c3a, 0x4c3b, 0x4c3b, 0x4c3c, 0x4c3c, 0x4c3d, 0x4c3d, 0x4c3e, 0x4c3e, 0x4c3f, 0x4c3f, 0x4c40, 0x4c40, 0x4c41, 0x4c41, 0x4c42, 0x4c42, 0x4c43, 0x4c43, 0x4c43, 0x4c44, 0x4c44, 0x4c45, 0x4c45, 0x4c46, 0x4c46, 0x4c47, 0x4c47, 0x4c48, 0x4c48, 0x4c49, 0x4c49, 0x4c4a, 0x4c4a, 0x4c4b, 0x4c4b, 0x4c4b, 0x4c4c, 0x4c4c, 0x4c4d, 0x4c4d, 0x4c4e, 0x4c4e, 0x4c4f, 0x4c4f, 0x4c50, 0x4c50, 0x4c51, 0x4c51, 0x4c52, 0x4c52, 0x4c52, 0x4c53, 0x4c53, 0x4c54, 0x4c54, 0x4c55, 0x4c55, 0x4c56, 0x4c56, 0x4c57, 0x4c57, 0x4c57, 0x4c58, 0x4c58, 0x4c59, 0x4c59, 0x4c5a, 0x4c5a, 0x4c5b, 0x4c5b, 0x4c5c, 0x4c5c, 0x4c5c, 0x4c5d, 0x4c5d, 0x4c5e, 0x4c5e, 0x4c5f, 0x4c5f, 0x4c60, 0x4c60, 0x4c61, 0x4c61, 0x4c61, 0x4c62, 0x4c62, 0x4c63, 0x4c63, 0x4c64, 0x4c64, 0x4c65, 0x4c65, 0x4c65, 0x4c66, 0x4c66, 0x4c67, 0x4c67, 0x4c68, 0x4c68, 0x4c69, 0x4c69, 0x4c69, 0x4c6a, 0x4c6a, 0x4c6b, 0x4c6b, 0x4c6c, 0x4c6c, 0x4c6c, 0x4c6d, 0x4c6d, 0x4c6e, 0x4c6e, 0x4c6f, 0x4c6f, 0x4c70, 0x4c70, 0x4c70, 0x4c71, 0x4c71, 0x4c72, 0x4c72, 0x4c73, 0x4c73, 0x4c73, 0x4c74, 0x4c74, 0x4c75, 0x4c75, 0x4c76, 0x4c76, 0x4c76, 0x4c77, 0x4c77, 0x4c78, 0x4c78, 0x4c79, 0x4c79, 0x4c79, 0x4c7a, 0x4c7a, 0x4c7b, 0x4c7b, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c7d, 0x4c7d, 0x4c7e, 0x4c7e, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c80, 0x4c80, 0x4c81, 0x4c81, 0x4c82, 0x4c82, 0x4c82, 0x4c83, 0x4c83, 0x4c84, 0x4c84, 0x4c84, 0x4c85, 0x4c85, 0x4c86, 0x4c86, 0x4c87, 0x4c87, 0x4c87, 0x4c88, 0x4c88, 0x4c89, 0x4c89, 0x4c89, 0x4c8a, 0x4c8a, 0x4c8b, 0x4c8b, 0x4c8b, 0x4c8c, 0x4c8c, 0x4c8d, 0x4c8d, 0x4c8e, 0x4c8e, 0x4c8e, 0x4c8f, 0x4c8f, 0x4c90, 0x4c90, 0x4c90, 0x4c91, 0x4c91, 0x4c92, 0x4c92, 0x4c92, 0x4c93, 0x4c93, 0x4c94, 0x4c94, 0x4c94, 0x4c95, 0x4c95, 0x4c96, 0x4c96, 0x4c97, 0x4c97, 0x4c97, 0x4c98, 0x4c98, 0x4c99, 0x4c99, 0x4c99, 0x4c9a, 0x4c9a, 0x4c9b, 0x4c9b, 0x4c9b, 0x4c9c, 0x4c9c, 0x4c9d, 0x4c9d, 0x4c9d, 0x4c9e, 0x4c9e, 0x4c9f, 0x4c9f, 0x4c9f, 0x4ca0, 0x4ca0, 0x4ca0, 0x4ca1, 0x4ca1, 0x4ca2, 0x4ca2, 0x4ca2, 0x4ca3, 0x4ca3, 0x4ca4, 0x4ca4, 0x4ca4, 0x4ca5, 0x4ca5, 0x4ca6, 0x4ca6, 0x4ca6, 0x4ca7, 0x4ca7, 0x4ca8, 0x4ca8, 0x4ca8, 0x4ca9, 0x4ca9, 0x4caa, 0x4caa, 0x4caa, 0x4cab, 0x4cab, 0x4cab, 0x4cac, 0x4cac, 0x4cad, 0x4cad, 0x4cad, 0x4cae, 0x4cae, 0x4caf, 0x4caf, 0x4caf, 0x4cb0, 0x4cb0, 0x4cb0, 0x4cb1, 0x4cb1, 0x4cb2, 0x4cb2, 0x4cb2, 0x4cb3, 0x4cb3, 0x4cb4, 0x4cb4, 0x4cb4, 0x4cb5, 0x4cb5, 0x4cb5, 0x4cb6, 0x4cb6, 0x4cb7, 0x4cb7, 0x4cb7, 0x4cb8, 0x4cb8, 0x4cb8, 0x4cb9, 0x4cb9, 0x4cba, 0x4cba, 0x4cba, 0x4cbb, 0x4cbb, 0x4cbb, 0x4cbc, 0x4cbc, 0x4cbd, 0x4cbd, 0x4cbd, 0x4cbe, 0x4cbe, 0x4cbe, 0x4cbf, 0x4cbf, 0x4cc0, 0x4cc0, 0x4cc0, 0x4cc1, 0x4cc1, 0x4cc1, 0x4cc2, 0x4cc2, 0x4cc3, 0x4cc3, 0x4cc3, 0x4cc4, 0x4cc4, 0x4cc4, 0x4cc5, 0x4cc5, 0x4cc6, 0x4cc6, 0x4cc6, 0x4cc7, 0x4cc7, 0x4cc7, 0x4cc8, 0x4cc8, 0x4cc8, 0x4cc9, 0x4cc9, 0x4cca, 0x4cca, 0x4cca, 0x4ccb, 0x4ccb, 0x4ccb, 0x4ccc, 0x4ccc, 0x4ccc, 0x4ccd, 0x4ccd, 0x4cce, 0x4cce, 0x4cce, 0x4ccf, 0x4ccf, 0x4ccf, 0x4cd0, 0x4cd0, 0x4cd0, 0x4cd1, 0x4cd1, 0x4cd2, 0x4cd2, 0x4cd2, 0x4cd3, 0x4cd3, 0x4cd3, 0x4cd4, 0x4cd4, 0x4cd4, 0x4cd5, 0x4cd5, 0x4cd5, 0x4cd6, 0x4cd6, 0x4cd7, 0x4cd7, 0x4cd7, 0x4cd8, 0x4cd8, 0x4cd8, 0x4cd9, 0x4cd9, 0x4cd9, 0x4cda, 0x4cda, 0x4cda, 0x4cdb, 0x4cdb, 0x4cdb, 0x4cdc, 0x4cdc, 0x4cdd, 0x4cdd, 0x4cdd, 0x4cde, 0x4cde, 0x4cde, 0x4cdf, 0x4cdf, 0x4cdf, 0x4ce0, 0x4ce0, 0x4ce0, 0x4ce1, 0x4ce1, 0x4ce1, 0x4ce2, 0x4ce2, 0x4ce2, 0x4ce3, 0x4ce3, 0x4ce4, 0x4ce4, 0x4ce4, 0x4ce5, 0x4ce5, 0x4ce5, 0x4ce6, 0x4ce6, 0x4ce6, 0x4ce7, 0x4ce7, 0x4ce7, 0x4ce8, 0x4ce8, 0x4ce8, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cea, 0x4cea, 0x4cea, 0x4ceb, 0x4ceb, 0x4ceb, 0x4cec, 0x4cec, 0x4cec, 0x4ced, 0x4ced, 0x4ced, 0x4cee, 0x4cee, 0x4cef, 0x4cef, 0x4cef, 0x4cf0, 0x4cf0, 0x4cf0, 0x4cf1, 0x4cf1, 0x4cf1, 0x4cf2, 0x4cf2, 0x4cf2, 0x4cf3, 0x4cf3, 0x4cf3, 0x4cf4, 0x4cf4, 0x4cf4, 0x4cf5, 0x4cf5, 0x4cf5, 0x4cf6, 0x4cf6, 0x4cf6, 0x4cf7, 0x4cf7, 0x4cf7, 0x4cf8, 0x4cf8, 0x4cf8, 0x4cf9, 0x4cf9, 0x4cf9, 0x4cfa, 0x4cfa, 0x4cfa, 0x4cfb, 0x4cfb, 0x4cfb, 0x4cfc, 0x4cfc, 0x4cfc, 0x4cfd, 0x4cfd, 0x4cfd, 0x4cfe, 0x4cfe, 0x4cfe, 0x4cff, 0x4cff, 0x4cff, 0x4d00, 0x4d00, 0x4d00, 0x4d01, 0x4d01, 0x4d01, 0x4d02, 0x4d02, 0x4d02, 0x4d03, 0x4d03, 0x4d03, 0x4d03, 0x4d04, 0x4d04, 0x4d04, 0x4d05, 0x4d05, 0x4d05, 0x4d06, 0x4d06, 0x4d06, 0x4d07, 0x4d07, 0x4d07, 0x4d08, 0x4d08, 0x4d08, 0x4d09, 0x4d09, 0x4d09, 0x4d0a, 0x4d0a, 0x4d0a, 0x4d0b, 0x4d0b, 0x4d0b, 0x4d0c, 0x4d0c, 0x4d0c, 0x4d0d, 0x4d0d, 0x4d0d, 0x4d0d, 0x4d0e, 0x4d0e, 0x4d0e, 0x4d0f, 0x4d0f, 0x4d0f, 0x4d10, 0x4d10, 0x4d10, 0x4d11, 0x4d11, 0x4d11, 0x4d12, 0x4d12, 0x4d12, 0x4d13, 0x4d13, 0x4d13, 0x4d14, 0x4d14, 0x4d14, 0x4d14, 0x4d15, 0x4d15, 0x4d15, 0x4d16, 0x4d16, 0x4d16, 0x4d17, 0x4d17, 0x4d17, 0x4d18, 0x4d18, 0x4d18, 0x4d19, 0x4d19, 0x4d19, 0x4d1a, 0x4d1a, 0x4d1a, 0x4d1a, 0x4d1b, 0x4d1b, 0x4d1b, 0x4d1c, 0x4d1c, 0x4d1c, 0x4d1d, 0x4d1d, 0x4d1d, 0x4d1e, 0x4d1e, 0x4d1e, 0x4d1e, 0x4d1f, 0x4d1f, 0x4d1f, 0x4d20, 0x4d20, 0x4d20, 0x4d21, 0x4d21, 0x4d21, 0x4d22, 0x4d22, 0x4d22, 0x4d22, 0x4d23, 0x4d23, 0x4d23, 0x4d24, 0x4d24, 0x4d24, 0x4d25, 0x4d25, 0x4d25, 0x4d26, 0x4d26, 0x4d26, 0x4d26, 0x4d27, 0x4d27, 0x4d27, 0x4d28, 0x4d28, 0x4d28, 0x4d29, 0x4d29, 0x4d29, 0x4d29, 0x4d2a, 0x4d2a, 0x4d2a, 0x4d2b, 0x4d2b, 0x4d2b, 0x4d2c, 0x4d2c, 0x4d2c, 0x4d2d, 0x4d2d, 0x4d2d, 0x4d2d, 0x4d2e, 0x4d2e, 0x4d2e, 0x4d2f, 0x4d2f, 0x4d2f, 0x4d30, 0x4d30, 0x4d30, 0x4d30, 0x4d31, 0x4d31, 0x4d31, 0x4d32, 0x4d32, 0x4d32, 0x4d32, 0x4d33, 0x4d33, 0x4d33, 0x4d34, 0x4d34, 0x4d34, 0x4d35, 0x4d35, 0x4d35, 0x4d35, 0x4d36, 0x4d36, 0x4d36, 0x4d37, 0x4d37, 0x4d37, 0x4d38, 0x4d38, 0x4d38, 0x4d38, 0x4d39, 0x4d39, 0x4d39, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3b, 0x4d3b, 0x4d3b, 0x4d3c, 0x4d3c, 0x4d3c, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3e, 0x4d3e, 0x4d3e, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d40, 0x4d40, 0x4d40, 0x4d41, 0x4d41, 0x4d41, 0x4d41, 0x4d42, 0x4d42, 0x4d42, 0x4d43, 0x4d43, 0x4d43, 0x4d43, 0x4d44, 0x4d44, 0x4d44, 0x4d45, 0x4d45, 0x4d45, 0x4d45, 0x4d46, 0x4d46, 0x4d46, 0x4d47, 0x4d47, 0x4d47, 0x4d47, 0x4d48, 0x4d48, 0x4d48, 0x4d49, 0x4d49, 0x4d49, 0x4d49, 0x4d4a, 0x4d4a, 0x4d4a, 0x4d4b, 0x4d4b, 0x4d4b, 0x4d4b, 0x4d4c, 0x4d4c, 0x4d4c, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4e, 0x4d4e, 0x4d4e, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d50, 0x4d50, 0x4d50, 0x4d51, 0x4d51, 0x4d51, 0x4d51, 0x4d52, 0x4d52, 0x4d52, 0x4d53, 0x4d53, 0x4d53, 0x4d53, 0x4d54, 0x4d54, 0x4d54, 0x4d54, 0x4d55, 0x4d55, 0x4d55, 0x4d56, 0x4d56, 0x4d56, 0x4d56, 0x4d57, 0x4d57, 0x4d57, 0x4d58, 0x4d58, 0x4d58, 0x4d58, 0x4d59, 0x4d59, 0x4d59, 0x4d59, 0x4d5a, 0x4d5a, 0x4d5a, 0x4d5b, 0x4d5b, 0x4d5b, 0x4d5b, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5d, 0x4d5d, 0x4d5d, 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5f, 0x4d5f, 0x4d5f, 0x4d5f, 0x4d60, 0x4d60, 0x4d60, 0x4d61, 0x4d61, 0x4d61, 0x4d61, 0x4d62, 0x4d62, 0x4d62, 0x4d62, 0x4d63, 0x4d63, 0x4d63, 0x4d64, 0x4d64, 0x4d64, 0x4d64, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d66, 0x4d66, 0x4d66, 0x4d67, 0x4d67, 0x4d67, 0x4d67, 0x4d68, 0x4d68, 0x4d68, 0x4d68, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6c, 0x4d6c, 0x4d6c, 0x4d6c, 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6e, 0x4d6e, 0x4d6e, 0x4d6f, 0x4d6f, 0x4d6f, 0x4d6f, 0x4d70, 0x4d70, 0x4d70, 0x4d70, 0x4d71, 0x4d71, 0x4d71, 0x4d71, 0x4d72, 0x4d72, 0x4d72, 0x4d72, 0x4d73, 0x4d73, 0x4d73, 0x4d74, 0x4d74, 0x4d74, 0x4d74, 0x4d75, 0x4d75, 0x4d75, 0x4d75, 0x4d76, 0x4d76, 0x4d76, 0x4d76, 0x4d77, 0x4d77, 0x4d77, 0x4d77, 0x4d78, 0x4d78, 0x4d78, 0x4d78, 0x4d79, 0x4d79, 0x4d79, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7b, 0x4d7b, 0x4d7b, 0x4d7b, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7d, 0x4d7d, 0x4d7d, 0x4d7d, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7f, 0x4d7f, 0x4d7f, 0x4d7f, 0x4d80, 0x4d80, 0x4d80, 0x4d80, 0x4d81, 0x4d81, 0x4d81, 0x4d81, 0x4d82, 0x4d82, 0x4d82, 0x4d82, 0x4d83, 0x4d83, 0x4d83, 0x4d84, 0x4d84, 0x4d84, 0x4d84, 0x4d85, 0x4d85, 0x4d85, 0x4d85, 0x4d86, 0x4d86, 0x4d86, 0x4d86, 0x4d87, 0x4d87, 0x4d87, 0x4d87, 0x4d88, 0x4d88, 0x4d88, 0x4d88, 0x4d89, 0x4d89, 0x4d89, 0x4d89, 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8b, 0x4d8b, 0x4d8b, 0x4d8b, 0x4d8c, 0x4d8c, 0x4d8d, 0x4d8d, 0x4d8e, 0x4d8e, 0x4d8f, 0x4d8f, 0x4d90, 0x4d90, 0x4d91, 0x4d91, 0x4d92, 0x4d92, 0x4d93, 0x4d93, 0x4d94, 0x4d94, 0x4d94, 0x4d95, 0x4d95, 0x4d96, 0x4d96, 0x4d97, 0x4d97, 0x4d98, 0x4d98, 0x4d99, 0x4d99, 0x4d9a, 0x4d9a, 0x4d9b, 0x4d9b, 0x4d9c, 0x4d9c, 0x4d9d, 0x4d9d, 0x4d9e, 0x4d9e, 0x4d9f, 0x4d9f, 0x4da0, 0x4da0, 0x4da1, 0x4da1, 0x4da2, 0x4da2, 0x4da3, 0x4da3, 0x4da3, 0x4da4, 0x4da4, 0x4da5, 0x4da5, 0x4da6, 0x4da6, 0x4da7, 0x4da7, 0x4da8, 0x4da8, 0x4da9, 0x4da9, 0x4daa, 0x4daa, 0x4dab, 0x4dab, 0x4dac, 0x4dac, 0x4dac, 0x4dad, 0x4dad, 0x4dae, 0x4dae, 0x4daf, 0x4daf, 0x4db0, 0x4db0, 0x4db1, 0x4db1, 0x4db2, 0x4db2, 0x4db3, 0x4db3, 0x4db3, 0x4db4, 0x4db4, 0x4db5, 0x4db5, 0x4db6, 0x4db6, 0x4db7, 0x4db7, 0x4db8, 0x4db8, 0x4db9, 0x4db9, 0x4db9, 0x4dba, 0x4dba, 0x4dbb, 0x4dbb, 0x4dbc, 0x4dbc, 0x4dbd, 0x4dbd, 0x4dbe, 0x4dbe, 0x4dbe, 0x4dbf, 0x4dbf, 0x4dc0, 0x4dc0, 0x4dc1, 0x4dc1, 0x4dc2, 0x4dc2, 0x4dc3, 0x4dc3, 0x4dc3, 0x4dc4, 0x4dc4, 0x4dc5, 0x4dc5, 0x4dc6, 0x4dc6, 0x4dc7, 0x4dc7, 0x4dc7, 0x4dc8, 0x4dc8, 0x4dc9, 0x4dc9, 0x4dca, 0x4dca, 0x4dcb, 0x4dcb, 0x4dcb, 0x4dcc, 0x4dcc, 0x4dcd, 0x4dcd, 0x4dce, 0x4dce, 0x4dce, 0x4dcf, 0x4dcf, 0x4dd0, 0x4dd0, 0x4dd1, 0x4dd1, 0x4dd2, 0x4dd2, 0x4dd2, 0x4dd3, 0x4dd3, 0x4dd4, 0x4dd4, 0x4dd5, 0x4dd5, 0x4dd5, 0x4dd6, 0x4dd6, 0x4dd7, 0x4dd7, 0x4dd8, 0x4dd8, 0x4dd8, 0x4dd9, 0x4dd9, 0x4dda, 0x4dda, 0x4ddb, 0x4ddb, 0x4ddb, 0x4ddc, 0x4ddc, 0x4ddd, 0x4ddd, 0x4dde, 0x4dde, 0x4dde, 0x4ddf, 0x4ddf, 0x4de0, 0x4de0, 0x4de1, 0x4de1, 0x4de1, 0x4de2, 0x4de2, 0x4de3, 0x4de3, 0x4de4, 0x4de4, 0x4de4, 0x4de5, 0x4de5, 0x4de6, 0x4de6, 0x4de6, 0x4de7, 0x4de7, 0x4de8, 0x4de8, 0x4de9, 0x4de9, 0x4de9, 0x4dea, 0x4dea, 0x4deb, 0x4deb, 0x4deb, 0x4dec, 0x4dec, 0x4ded, 0x4ded, 0x4dee, 0x4dee, 0x4dee, 0x4def, 0x4def, 0x4df0, 0x4df0, 0x4df0, 0x4df1, 0x4df1, 0x4df2, 0x4df2, 0x4df2, 0x4df3, 0x4df3, 0x4df4, 0x4df4, 0x4df5, 0x4df5, 0x4df5, 0x4df6, 0x4df6, 0x4df7, 0x4df7, 0x4df7, 0x4df8, 0x4df8, 0x4df9, 0x4df9, 0x4df9, 0x4dfa, 0x4dfa, 0x4dfb, 0x4dfb, 0x4dfb, 0x4dfc, 0x4dfc, 0x4dfd, 0x4dfd, 0x4dfd, 0x4dfe, 0x4dfe, 0x4dff, 0x4dff, 0x4dff, 0x4e00, 0x4e00, 0x4e01, 0x4e01, 0x4e01, 0x4e02, 0x4e02, 0x4e03, 0x4e03, 0x4e03, 0x4e04, 0x4e04, 0x4e05, 0x4e05, 0x4e05, 0x4e06, 0x4e06, 0x4e07, 0x4e07, 0x4e07, 0x4e08, 0x4e08, 0x4e09, 0x4e09, 0x4e09, 0x4e0a, 0x4e0a, 0x4e0a, 0x4e0b, 0x4e0b, 0x4e0c, 0x4e0c, 0x4e0c, 0x4e0d, 0x4e0d, 0x4e0e, 0x4e0e, 0x4e0e, 0x4e0f, 0x4e0f, 0x4e10, 0x4e10, 0x4e10, 0x4e11, 0x4e11, 0x4e11, 0x4e12, 0x4e12, 0x4e13, 0x4e13, 0x4e13, 0x4e14, 0x4e14, 0x4e15, 0x4e15, 0x4e15, 0x4e16, 0x4e16, 0x4e16, 0x4e17, 0x4e17, 0x4e18, 0x4e18, 0x4e18, 0x4e19, 0x4e19, 0x4e19, 0x4e1a, 0x4e1a, 0x4e1b, 0x4e1b, 0x4e1b, 0x4e1c, 0x4e1c, 0x4e1c, 0x4e1d, 0x4e1d, 0x4e1e, 0x4e1e, 0x4e1e, 0x4e1f, 0x4e1f, 0x4e1f, 0x4e20, 0x4e20, 0x4e21, 0x4e21, 0x4e21, 0x4e22, 0x4e22, 0x4e22, 0x4e23, 0x4e23, 0x4e24, 0x4e24, 0x4e24, 0x4e25, 0x4e25, 0x4e25, 0x4e26, 0x4e26, 0x4e27, 0x4e27, 0x4e27, 0x4e28, 0x4e28, 0x4e28, 0x4e29, 0x4e29, 0x4e29, 0x4e2a, 0x4e2a, 0x4e2b, 0x4e2b, 0x4e2b, 0x4e2c, 0x4e2c, 0x4e2c, 0x4e2d, 0x4e2d, 0x4e2e, 0x4e2e, 0x4e2e, 0x4e2f, 0x4e2f, 0x4e2f, 0x4e30, 0x4e30, 0x4e30, 0x4e31, 0x4e31, 0x4e32, 0x4e32, 0x4e32, 0x4e33, 0x4e33, 0x4e33, 0x4e34, 0x4e34, 0x4e34, 0x4e35, 0x4e35, 0x4e35, 0x4e36, 0x4e36, 0x4e37, 0x4e37, 0x4e37, 0x4e38, 0x4e38, 0x4e38, 0x4e39, 0x4e39, 0x4e39, 0x4e3a, 0x4e3a, 0x4e3a, 0x4e3b, 0x4e3b, 0x4e3c, 0x4e3c, 0x4e3c, 0x4e3d, 0x4e3d, 0x4e3d, 0x4e3e, 0x4e3e, 0x4e3e, 0x4e3f, 0x4e3f, 0x4e3f, 0x4e40, 0x4e40, 0x4e40, 0x4e41, 0x4e41, 0x4e42, 0x4e42, 0x4e42, 0x4e43, 0x4e43, 0x4e43, 0x4e44, 0x4e44, 0x4e44, 0x4e45, 0x4e45, 0x4e45, 0x4e46, 0x4e46, 0x4e46, 0x4e47, 0x4e47, 0x4e47, 0x4e48, 0x4e48, 0x4e48, 0x4e49, 0x4e49, 0x4e4a, 0x4e4a, 0x4e4a, 0x4e4b, 0x4e4b, 0x4e4b, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e4d, 0x4e4d, 0x4e4d, 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4f, 0x4e4f, 0x4e4f, 0x4e50, 0x4e50, 0x4e50, 0x4e51, 0x4e51, 0x4e51, 0x4e52, 0x4e52, 0x4e52, 0x4e53, 0x4e53, 0x4e53, 0x4e54, 0x4e54, 0x4e54, 0x4e55, 0x4e55, 0x4e55, 0x4e56, 0x4e56, 0x4e56, 0x4e57, 0x4e57, 0x4e57, 0x4e58, 0x4e58, 0x4e58, 0x4e59, 0x4e59, 0x4e59, 0x4e5a, 0x4e5a, 0x4e5a, 0x4e5b, 0x4e5b, 0x4e5b, 0x4e5c, 0x4e5c, 0x4e5c, 0x4e5d, 0x4e5d, 0x4e5d, 0x4e5e, 0x4e5e, 0x4e5e, 0x4e5f, 0x4e5f, 0x4e5f, 0x4e60, 0x4e60, 0x4e60, 0x4e61, 0x4e61, 0x4e61, 0x4e62, 0x4e62, 0x4e62, 0x4e63, 0x4e63, 0x4e63, 0x4e64, 0x4e64, 0x4e64, 0x4e65, 0x4e65, 0x4e65, 0x4e66, 0x4e66, 0x4e66, 0x4e67, 0x4e67, 0x4e67, 0x4e68, 0x4e68, 0x4e68, 0x4e69, 0x4e69, 0x4e69, 0x4e6a, 0x4e6a, 0x4e6a, 0x4e6b, 0x4e6b, 0x4e6b, 0x4e6c, 0x4e6c, 0x4e6c, 0x4e6d, 0x4e6d, 0x4e6d, 0x4e6d, 0x4e6e, 0x4e6e, 0x4e6e, 0x4e6f, 0x4e6f, 0x4e6f, 0x4e70, 0x4e70, 0x4e70, 0x4e71, 0x4e71, 0x4e71, 0x4e72, 0x4e72, 0x4e72, 0x4e73, 0x4e73, 0x4e73, 0x4e74, 0x4e74, 0x4e74, 0x4e75, 0x4e75, 0x4e75, 0x4e75, 0x4e76, 0x4e76, 0x4e76, 0x4e77, 0x4e77, 0x4e77, 0x4e78, 0x4e78, 0x4e78, 0x4e79, 0x4e79, 0x4e79, 0x4e7a, 0x4e7a, 0x4e7a, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7c, 0x4e7c, 0x4e7c, 0x4e7d, 0x4e7d, 0x4e7d, 0x4e7e, 0x4e7e, 0x4e7e, 0x4e7f, 0x4e7f, 0x4e7f, 0x4e80, 0x4e80, 0x4e80, 0x4e80, 0x4e81, 0x4e81, 0x4e81, 0x4e82, 0x4e82, 0x4e82, 0x4e83, 0x4e83, 0x4e83, 0x4e84, 0x4e84, 0x4e84, 0x4e84, 0x4e85, 0x4e85, 0x4e85, 0x4e86, 0x4e86, 0x4e86, 0x4e87, 0x4e87, 0x4e87, 0x4e88, 0x4e88, 0x4e88, 0x4e88, 0x4e89, 0x4e89, 0x4e89, 0x4e8a, 0x4e8a, 0x4e8a, 0x4e8b, 0x4e8b, 0x4e8b, 0x4e8b, 0x4e8c, 0x4e8c, 0x4e8c, 0x4e8d, 0x4e8d, 0x4e8d, 0x4e8e, 0x4e8e, 0x4e8e, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e90, 0x4e90, 0x4e90, 0x4e91, 0x4e91, 0x4e91, 0x4e92, 0x4e92, 0x4e92, 0x4e92, 0x4e93, 0x4e93, 0x4e93, 0x4e94, 0x4e94, 0x4e94, 0x4e94, 0x4e95, 0x4e95, 0x4e95, 0x4e96, 0x4e96, 0x4e96, 0x4e97, 0x4e97, 0x4e97, 0x4e97, 0x4e98, 0x4e98, 0x4e98, 0x4e99, 0x4e99, 0x4e99, 0x4e9a, 0x4e9a, 0x4e9a, 0x4e9a, 0x4e9b, 0x4e9b, 0x4e9b, 0x4e9c, 0x4e9c, 0x4e9c, 0x4e9c, 0x4e9d, 0x4e9d, 0x4e9d, 0x4e9e, 0x4e9e, 0x4e9e, 0x4e9f, 0x4e9f, 0x4e9f, 0x4e9f, 0x4ea0, 0x4ea0, 0x4ea0, 0x4ea1, 0x4ea1, 0x4ea1, 0x4ea1, 0x4ea2, 0x4ea2, 0x4ea2, 0x4ea3, 0x4ea3, 0x4ea3, 0x4ea3, 0x4ea4, 0x4ea4, 0x4ea4, 0x4ea5, 0x4ea5, 0x4ea5, 0x4ea5, 0x4ea6, 0x4ea6, 0x4ea6, 0x4ea7, 0x4ea7, 0x4ea7, 0x4ea8, 0x4ea8, 0x4ea8, 0x4ea8, 0x4ea9, 0x4ea9, 0x4ea9, 0x4eaa, 0x4eaa, 0x4eaa, 0x4eaa, 0x4eab, 0x4eab, 0x4eab, 0x4eac, 0x4eac, 0x4eac, 0x4eac, 0x4ead, 0x4ead, 0x4ead, 0x4eae, 0x4eae, 0x4eae, 0x4eae, 0x4eaf, 0x4eaf, 0x4eaf, 0x4eaf, 0x4eb0, 0x4eb0, 0x4eb0, 0x4eb1, 0x4eb1, 0x4eb1, 0x4eb1, 0x4eb2, 0x4eb2, 0x4eb2, 0x4eb3, 0x4eb3, 0x4eb3, 0x4eb3, 0x4eb4, 0x4eb4, 0x4eb4, 0x4eb5, 0x4eb5, 0x4eb5, 0x4eb5, 0x4eb6, 0x4eb6, 0x4eb6, 0x4eb7, 0x4eb7, 0x4eb7, 0x4eb7, 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb9, 0x4eb9, 0x4eb9, 0x4eba, 0x4eba, 0x4eba, 0x4eba, 0x4ebb, 0x4ebb, 0x4ebb, 0x4ebc, 0x4ebc, 0x4ebc, 0x4ebc, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebe, 0x4ebe, 0x4ebe, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ec0, 0x4ec0, 0x4ec0, 0x4ec0, 0x4ec1, 0x4ec1, 0x4ec1, 0x4ec2, 0x4ec2, 0x4ec2, 0x4ec2, 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec4, 0x4ec4, 0x4ec4, 0x4ec5, 0x4ec5, 0x4ec5, 0x4ec5, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec7, 0x4ec7, 0x4ec7, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec9, 0x4ec9, 0x4ec9, 0x4ec9, 0x4eca, 0x4eca, 0x4eca, 0x4eca, 0x4ecb, 0x4ecb, 0x4ecb, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecd, 0x4ecd, 0x4ecd, 0x4ecd, 0x4ece, 0x4ece, 0x4ece, 0x4ece, 0x4ecf, 0x4ecf, 0x4ecf, 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed1, 0x4ed1, 0x4ed1, 0x4ed1, 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed3, 0x4ed3, 0x4ed3, 0x4ed4, 0x4ed4, 0x4ed4, 0x4ed4, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed6, 0x4ed6, 0x4ed6, 0x4ed6, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed8, 0x4ed8, 0x4ed8, 0x4ed8, 0x4ed9, 0x4ed9, 0x4ed9, 0x4eda, 0x4eda, 0x4eda, 0x4eda, 0x4edb, 0x4edb, 0x4edb, 0x4edb, 0x4edc, 0x4edc, 0x4edc, 0x4edc, 0x4edd, 0x4edd, 0x4edd, 0x4edd, 0x4ede, 0x4ede, 0x4ede, 0x4ede, 0x4edf, 0x4edf, 0x4edf, 0x4edf, 0x4ee0, 0x4ee0, 0x4ee0, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee2, 0x4ee2, 0x4ee2, 0x4ee2, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee4, 0x4ee4, 0x4ee4, 0x4ee4, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee6, 0x4ee6, 0x4ee6, 0x4ee6, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee8, 0x4ee8, 0x4ee8, 0x4ee8, 0x4ee9, 0x4ee9, 0x4ee9, 0x4ee9, 0x4eea, 0x4eea, 0x4eea, 0x4eea, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eec, 0x4eec, 0x4eec, 0x4eec, 0x4eed, 0x4eed, 0x4eed, 0x4eed, 0x4eee, 0x4eee, 0x4eee, 0x4eee, 0x4eef, 0x4eef, 0x4ef0, 0x4ef0, 0x4ef1, 0x4ef1, 0x4ef2, 0x4ef2, 0x4ef3, 0x4ef3, 0x4ef4, 0x4ef4, 0x4ef5, 0x4ef5, 0x4ef6, 0x4ef6, 0x4ef7, 0x4ef7, 0x4ef8, 0x4ef8, 0x4ef9, 0x4ef9, 0x4efa, 0x4efa, 0x4efb, 0x4efb, 0x4efc, 0x4efc, 0x4efd, 0x4efd, 0x4efe, 0x4efe, 0x4eff, 0x4eff, 0x4f00, 0x4f00, 0x4f01, 0x4f01, 0x4f02, 0x4f02, 0x4f03, 0x4f03, 0x4f04, 0x4f04, 0x4f04, 0x4f05, 0x4f05, 0x4f06, 0x4f06, 0x4f07, 0x4f07, 0x4f08, 0x4f08, 0x4f09, 0x4f09, 0x4f0a, 0x4f0a, 0x4f0b, 0x4f0b, 0x4f0c, 0x4f0c, 0x4f0d, 0x4f0d, 0x4f0d, 0x4f0e, 0x4f0e, 0x4f0f, 0x4f0f, 0x4f10, 0x4f10, 0x4f11, 0x4f11, 0x4f12, 0x4f12, 0x4f13, 0x4f13, 0x4f14, 0x4f14, 0x4f15, 0x4f15, 0x4f15, 0x4f16, 0x4f16, 0x4f17, 0x4f17, 0x4f18, 0x4f18, 0x4f19, 0x4f19, 0x4f1a, 0x4f1a, 0x4f1b, 0x4f1b, 0x4f1b, 0x4f1c, 0x4f1c, 0x4f1d, 0x4f1d, 0x4f1e, 0x4f1e, 0x4f1f, 0x4f1f, 0x4f20, 0x4f20, 0x4f20, 0x4f21, 0x4f21, 0x4f22, 0x4f22, 0x4f23, 0x4f23, 0x4f24, 0x4f24, 0x4f25, 0x4f25, 0x4f25, 0x4f26, 0x4f26, 0x4f27, 0x4f27, 0x4f28, 0x4f28, 0x4f29, 0x4f29, 0x4f29, 0x4f2a, 0x4f2a, 0x4f2b, 0x4f2b, 0x4f2c, 0x4f2c, 0x4f2d, 0x4f2d, 0x4f2d, 0x4f2e, 0x4f2e, 0x4f2f, 0x4f2f, 0x4f30, 0x4f30, 0x4f31, 0x4f31, 0x4f31, 0x4f32, 0x4f32, 0x4f33, 0x4f33, 0x4f34, 0x4f34, 0x4f34, 0x4f35, 0x4f35, 0x4f36, 0x4f36, 0x4f37, 0x4f37, 0x4f37, 0x4f38, 0x4f38, 0x4f39, 0x4f39, 0x4f3a, 0x4f3a, 0x4f3b, 0x4f3b, 0x4f3b, 0x4f3c, 0x4f3c, 0x4f3d, 0x4f3d, 0x4f3e, 0x4f3e, 0x4f3e, 0x4f3f, 0x4f3f, 0x4f40, 0x4f40, 0x4f41, 0x4f41, 0x4f41, 0x4f42, 0x4f42, 0x4f43, 0x4f43, 0x4f43, 0x4f44, 0x4f44, 0x4f45, 0x4f45, 0x4f46, 0x4f46, 0x4f46, 0x4f47, 0x4f47, 0x4f48, 0x4f48, 0x4f49, 0x4f49, 0x4f49, 0x4f4a, 0x4f4a, 0x4f4b, 0x4f4b, 0x4f4b, 0x4f4c, 0x4f4c, 0x4f4d, 0x4f4d, 0x4f4e, 0x4f4e, 0x4f4e, 0x4f4f, 0x4f4f, 0x4f50, 0x4f50, 0x4f50, 0x4f51, 0x4f51, 0x4f52, 0x4f52, 0x4f53, 0x4f53, 0x4f53, 0x4f54, 0x4f54, 0x4f55, 0x4f55, 0x4f55, 0x4f56, 0x4f56, 0x4f57, 0x4f57, 0x4f57, 0x4f58, 0x4f58, 0x4f59, 0x4f59, 0x4f59, 0x4f5a, 0x4f5a, 0x4f5b, 0x4f5b, 0x4f5b, 0x4f5c, 0x4f5c, 0x4f5d, 0x4f5d, 0x4f5d, 0x4f5e, 0x4f5e, 0x4f5f, 0x4f5f, 0x4f60, 0x4f60, 0x4f60, 0x4f61, 0x4f61, 0x4f62, 0x4f62, 0x4f62, 0x4f63, 0x4f63, 0x4f63, 0x4f64, 0x4f64, 0x4f65, 0x4f65, 0x4f65, 0x4f66, 0x4f66, 0x4f67, 0x4f67, 0x4f67, 0x4f68, 0x4f68, 0x4f69, 0x4f69, 0x4f69, 0x4f6a, 0x4f6a, 0x4f6b, 0x4f6b, 0x4f6b, 0x4f6c, 0x4f6c, 0x4f6d, 0x4f6d, 0x4f6d, 0x4f6e, 0x4f6e, 0x4f6f, 0x4f6f, 0x4f6f, 0x4f70, 0x4f70, 0x4f70, 0x4f71, 0x4f71, 0x4f72, 0x4f72, 0x4f72, 0x4f73, 0x4f73, 0x4f74, 0x4f74, 0x4f74, 0x4f75, 0x4f75, 0x4f75, 0x4f76, 0x4f76, 0x4f77, 0x4f77, 0x4f77, 0x4f78, 0x4f78, 0x4f79, 0x4f79, 0x4f79, 0x4f7a, 0x4f7a, 0x4f7a, 0x4f7b, 0x4f7b, 0x4f7c, 0x4f7c, 0x4f7c, 0x4f7d, 0x4f7d, 0x4f7d, 0x4f7e, 0x4f7e, 0x4f7f, 0x4f7f, 0x4f7f, 0x4f80, 0x4f80, 0x4f80, 0x4f81, 0x4f81, 0x4f82, 0x4f82, 0x4f82, 0x4f83, 0x4f83, 0x4f83, 0x4f84, 0x4f84, 0x4f85, 0x4f85, 0x4f85, 0x4f86, 0x4f86, 0x4f86, 0x4f87, 0x4f87, 0x4f88, 0x4f88, 0x4f88, 0x4f89, 0x4f89, 0x4f89, 0x4f8a, 0x4f8a, 0x4f8b, 0x4f8b, 0x4f8b, 0x4f8c, 0x4f8c, 0x4f8c, 0x4f8d, 0x4f8d, 0x4f8d, 0x4f8e, 0x4f8e, 0x4f8f, 0x4f8f, 0x4f8f, 0x4f90, 0x4f90, 0x4f90, 0x4f91, 0x4f91, 0x4f92, 0x4f92, 0x4f92, 0x4f93, 0x4f93, 0x4f93, 0x4f94, 0x4f94, 0x4f94, 0x4f95, 0x4f95, 0x4f95, 0x4f96, 0x4f96, 0x4f97, 0x4f97, 0x4f97, 0x4f98, 0x4f98, 0x4f98, 0x4f99, 0x4f99, 0x4f99, 0x4f9a, 0x4f9a, 0x4f9b, 0x4f9b, 0x4f9b, 0x4f9c, 0x4f9c, 0x4f9c, 0x4f9d, 0x4f9d, 0x4f9d, 0x4f9e, 0x4f9e, 0x4f9e, 0x4f9f, 0x4f9f, 0x4f9f, 0x4fa0, 0x4fa0, 0x4fa1, 0x4fa1, 0x4fa1, 0x4fa2, 0x4fa2, 0x4fa2, 0x4fa3, 0x4fa3, 0x4fa3, 0x4fa4, 0x4fa4, 0x4fa4, 0x4fa5, 0x4fa5, 0x4fa5, 0x4fa6, 0x4fa6, 0x4fa7, 0x4fa7, 0x4fa7, 0x4fa8, 0x4fa8, 0x4fa8, 0x4fa9, 0x4fa9, 0x4fa9, 0x4faa, 0x4faa, 0x4faa, 0x4fab, 0x4fab, 0x4fab, 0x4fac, 0x4fac, 0x4fac, 0x4fad, 0x4fad, 0x4fad, 0x4fae, 0x4fae, 0x4fae, 0x4faf, 0x4faf, 0x4fb0, 0x4fb0, 0x4fb0, 0x4fb1, 0x4fb1, 0x4fb1, 0x4fb2, 0x4fb2, 0x4fb2, 0x4fb3, 0x4fb3, 0x4fb3, 0x4fb4, 0x4fb4, 0x4fb4, 0x4fb5, 0x4fb5, 0x4fb5, 0x4fb6, 0x4fb6, 0x4fb6, 0x4fb7, 0x4fb7, 0x4fb7, 0x4fb8, 0x4fb8, 0x4fb8, 0x4fb9, 0x4fb9, 0x4fb9, 0x4fba, 0x4fba, 0x4fba, 0x4fbb, 0x4fbb, 0x4fbb, 0x4fbc, 0x4fbc, 0x4fbc, 0x4fbd, 0x4fbd, 0x4fbd, 0x4fbe, 0x4fbe, 0x4fbe, 0x4fbf, 0x4fbf, 0x4fbf, 0x4fc0, 0x4fc0, 0x4fc0, 0x4fc1, 0x4fc1, 0x4fc1, 0x4fc2, 0x4fc2, 0x4fc2, 0x4fc3, 0x4fc3, 0x4fc3, 0x4fc4, 0x4fc4, 0x4fc4, 0x4fc5, 0x4fc5, 0x4fc5, 0x4fc6, 0x4fc6, 0x4fc6, 0x4fc7, 0x4fc7, 0x4fc7, 0x4fc8, 0x4fc8, 0x4fc8, 0x4fc9, 0x4fc9, 0x4fc9, 0x4fca, 0x4fca, 0x4fca, 0x4fcb, 0x4fcb, 0x4fcb, 0x4fcc, 0x4fcc, 0x4fcc, 0x4fcd, 0x4fcd, 0x4fcd, 0x4fcd, 0x4fce, 0x4fce, 0x4fce, 0x4fcf, 0x4fcf, 0x4fcf, 0x4fd0, 0x4fd0, 0x4fd0, 0x4fd1, 0x4fd1, 0x4fd1, 0x4fd2, 0x4fd2, 0x4fd2, 0x4fd3, 0x4fd3, 0x4fd3, 0x4fd4, 0x4fd4, 0x4fd4, 0x4fd5, 0x4fd5, 0x4fd5, 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd7, 0x4fd7, 0x4fd7, 0x4fd8, 0x4fd8, 0x4fd8, 0x4fd9, 0x4fd9, 0x4fd9, 0x4fda, 0x4fda, 0x4fda, 0x4fdb, 0x4fdb, 0x4fdb, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdd, 0x4fdd, 0x4fdd, 0x4fde, 0x4fde, 0x4fde, 0x4fdf, 0x4fdf, 0x4fdf, 0x4fe0, 0x4fe0, 0x4fe0, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe2, 0x4fe2, 0x4fe2, 0x4fe3, 0x4fe3, 0x4fe3, 0x4fe4, 0x4fe4, 0x4fe4, 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe6, 0x4fe6, 0x4fe6, 0x4fe7, 0x4fe7, 0x4fe7, 0x4fe8, 0x4fe8, 0x4fe8, 0x4fe9, 0x4fe9, 0x4fe9, 0x4fe9, 0x4fea, 0x4fea, 0x4fea, 0x4feb, 0x4feb, 0x4feb, 0x4fec, 0x4fec, 0x4fec, 0x4fed, 0x4fed, 0x4fed, 0x4fed, 0x4fee, 0x4fee, 0x4fee, 0x4fef, 0x4fef, 0x4fef, 0x4ff0, 0x4ff0, 0x4ff0, 0x4ff0, 0x4ff1, 0x4ff1, 0x4ff1, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff3, 0x4ff3, 0x4ff3, 0x4ff3, 0x4ff4, 0x4ff4, 0x4ff4, 0x4ff5, 0x4ff5, 0x4ff5, 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff7, 0x4ff7, 0x4ff7, 0x4ff8, 0x4ff8, 0x4ff8, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ffa, 0x4ffa, 0x4ffa, 0x4ffb, 0x4ffb, 0x4ffb, 0x4ffc, 0x4ffc, 0x4ffc, 0x4ffc, 0x4ffd, 0x4ffd, 0x4ffd, 0x4ffe, 0x4ffe, 0x4ffe, 0x4ffe, 0x4fff, 0x4fff, 0x4fff, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5002, 0x5002, 0x5002, 0x5002, 0x5002, 0x5002, 0x5002, 0x5003, 0x5003, 0x5003, 0x5003, 0x5003, 0x5003, 0x5003, 0x5004, 0x5004, 0x5004, 0x5004, 0x5004, 0x5004, 0x5004, 0x5005, 0x5005, 0x5005, 0x5005, 0x5005, 0x5005, 0x5005, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x500a, 0x500a, 0x500a, 0x500a, 0x500a, 0x500a, 0x500a, 0x500b, 0x500b, 0x500b, 0x500b, 0x500b, 0x500b, 0x500b, 0x500c, 0x500c, 0x500c, 0x500c, 0x500c, 0x500c, 0x500c, 0x500d, 0x500d, 0x500d, 0x500d, 0x500d, 0x500d, 0x500d, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5014, 0x5014, 0x5014, 0x5014, 0x5014, 0x5014, 0x5014, 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5016, 0x5016, 0x5016, 0x5016, 0x5016, 0x5016, 0x5016, 0x5017, 0x5017, 0x5017, 0x5017, 0x5017, 0x5017, 0x5017, 0x5017, 0x5018, 0x5018, 0x5018, 0x5018, 0x5018, 0x5018, 0x5018, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, 0x501a, 0x501a, 0x501a, 0x501a, 0x501a, 0x501a, 0x501a, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5029, 0x5029, 0x5029, 0x5029, 0x5029, 0x502a, 0x502a, 0x502a, 0x502a, 0x502b, 0x502b, 0x502b, 0x502b, 0x502c, 0x502c, 0x502c, 0x502c, 0x502d, 0x502d, 0x502d, 0x502d, 0x502e, 0x502e, 0x502e, 0x502e, 0x502f, 0x502f, 0x502f, 0x502f, 0x5030, 0x5030, 0x5030, 0x5030, 0x5031, 0x5031, 0x5031, 0x5031, 0x5032, 0x5032, 0x5032, 0x5032, 0x5032, 0x5033, 0x5033, 0x5033, 0x5033, 0x5034, 0x5034, 0x5034, 0x5034, 0x5035, 0x5035, 0x5035, 0x5035, 0x5036, 0x5036, 0x5036, 0x5036, 0x5037, 0x5037, 0x5037, 0x5037, 0x5037, 0x5038, 0x5038, 0x5038, 0x5038, 0x5039, 0x5039, 0x5039, 0x5039, 0x503a, 0x503a, 0x503a, 0x503a, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503c, 0x503c, 0x503c, 0x503c, 0x503d, 0x503d, 0x503d, 0x503d, 0x503e, 0x503e, 0x503e, 0x503e, 0x503e, 0x503f, 0x503f, 0x503f, 0x503f, 0x5040, 0x5040, 0x5040, 0x5040, 0x5041, 0x5041, 0x5041, 0x5041, 0x5041, 0x5042, 0x5042, 0x5042, 0x5042, 0x5043, 0x5043, 0x5043, 0x5043, 0x5043, 0x5044, 0x5044, 0x5044, 0x5044, 0x5045, 0x5045, 0x5045, 0x5045, 0x5045, 0x5046, 0x5046, 0x5046, 0x5046, 0x5047, 0x5047, 0x5047, 0x5047, 0x5047, 0x5048, 0x5048, 0x5048, 0x5048, 0x5049, 0x5049, 0x5049, 0x5049, 0x5049, 0x504a, 0x504a, 0x504a, 0x504a, 0x504b, 0x504b, 0x504b, 0x504b, 0x504b, 0x504c, 0x504c, 0x504c, 0x504c, 0x504d, 0x504d, 0x504d, 0x504d, 0x504d, 0x504e, 0x504e, 0x504e, 0x504e, 0x504e, 0x504f, 0x504f, 0x504f, 0x504f, 0x5050, 0x5050, 0x5050, 0x5050, 0x5050, 0x5051, 0x5051, 0x5051, 0x5051, 0x5051, 0x5052, 0x5052, 0x5052, 0x5052, 0x5053, 0x5053, 0x5053, 0x5053, 0x5053, 0x5054, 0x5054, 0x5054, 0x5054, 0x5054, 0x5055, 0x5055, 0x5055, 0x5055, 0x5056, 0x5056, 0x5056, 0x5056, 0x5056, 0x5057, 0x5057, 0x5057, 0x5057, 0x5057, 0x5058, 0x5058, 0x5058, 0x5058, 0x5058, 0x5059, 0x5059, 0x5059, 0x5059, 0x5059, 0x505a, 0x505a, 0x505a, 0x505a, 0x505a, 0x505b, 0x505b, 0x505b, 0x505b, 0x505c, 0x505c, 0x505c, 0x505c, 0x505c, 0x505d, 0x505d, 0x505d, 0x505d, 0x505d, 0x505e, 0x505e, 0x505e, 0x505e, 0x505e, 0x505f, 0x505f, 0x505f, 0x505f, 0x505f, 0x5060, 0x5060, 0x5060, 0x5060, 0x5060, 0x5061, 0x5061, 0x5061, 0x5061, 0x5061, 0x5062, 0x5062, 0x5062, 0x5062, 0x5062, 0x5063, 0x5063, 0x5063, 0x5063, 0x5063, 0x5064, 0x5064, 0x5064, 0x5064, 0x5064, 0x5065, 0x5065, 0x5065, 0x5065, 0x5065, 0x5066, 0x5066, 0x5066, 0x5066, 0x5066, 0x5067, 0x5067, 0x5067, 0x5067, 0x5067, 0x5068, 0x5068, 0x5068, 0x5068, 0x5068, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, 0x506a, 0x506a, 0x506a, 0x506a, 0x506a, 0x506b, 0x506b, 0x506b, 0x506b, 0x506b, 0x506c, 0x506c, 0x506c, 0x506c, 0x506c, 0x506d, 0x506d, 0x506d, 0x506d, 0x506d, 0x506e, 0x506e, 0x506e, 0x506e, 0x506e, 0x506e, 0x506f, 0x506f, 0x506f, 0x506f, 0x506f, 0x5070, 0x5070, 0x5070, 0x5070, 0x5070, 0x5071, 0x5071, 0x5071, 0x5071, 0x5071, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5073, 0x5073, 0x5073, 0x5073, 0x5073, 0x5074, 0x5074, 0x5074, 0x5074, 0x5074, 0x5074, 0x5075, 0x5075, 0x5075, 0x5075, 0x5075, 0x5076, 0x5076, 0x5076, 0x5076, 0x5076, 0x5077, 0x5077, 0x5077, 0x5077, 0x5077, 0x5077, 0x5078, 0x5078, 0x5078, 0x5078, 0x5078, 0x5079, 0x5079, 0x5079, 0x5079, 0x5079, 0x5079, 0x507a, 0x507a, 0x507a, 0x507a, 0x507a, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, 0x507c, 0x507c, 0x507c, 0x507c, 0x507c, 0x507d, 0x507d, 0x507d, 0x507d, 0x507d, 0x507d, 0x507e, 0x507e, 0x507e, 0x507e, 0x507e, 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x5080, 0x5080, 0x5080, 0x5080, 0x5080, 0x5080, 0x5081, 0x5081, 0x5081, 0x5081, 0x5081, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5083, 0x5083, 0x5083, 0x5083, 0x5083, 0x5083, 0x5084, 0x5084, 0x5084, 0x5084, 0x5084, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5087, 0x5087, 0x5087, 0x5087, 0x5087, 0x5087, 0x5088, 0x5088, 0x5088, 0x5088, 0x5088, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x508a, 0x508a, 0x508a, 0x508a, 0x508a, 0x508a, 0x508b, 0x508b, 0x508b, 0x508b, 0x508b, 0x508b, 0x508c, 0x508c, 0x508c, 0x508c, 0x508c, 0x508c, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508e, 0x508e, 0x508e, 0x508e, 0x508e, 0x508e, 0x508f, 0x508f, 0x508f, 0x508f, 0x508f, 0x508f, 0x5090, 0x5090, 0x5090, 0x5090, 0x5090, 0x5090, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5092, 0x5092, 0x5092, 0x5092, 0x5092, 0x5092, 0x5093, 0x5093, 0x5093, 0x5093, 0x5093, 0x5093, 0x5094, 0x5094, 0x5094, 0x5094, 0x5094, 0x5094, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5096, 0x5096, 0x5096, 0x5096, 0x5096, 0x5096, 0x5097, 0x5097, 0x5097, 0x5097, 0x5097, 0x5097, 0x5098, 0x5098, 0x5098, 0x5098, 0x5098, 0x5098, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509b, 0x509b, 0x509b, 0x509b, 0x509b, 0x509b, 0x509c, 0x509c, 0x509c, 0x509c, 0x509c, 0x509c, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509f, 0x509f, 0x509f, 0x509f, 0x509f, 0x509f, 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a1, 0x50a1, 0x50a1, 0x50a1, 0x50a1, 0x50a1, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a6, 0x50a6, 0x50a6, 0x50a6, 0x50a6, 0x50a6, 0x50a6, 0x50a7, 0x50a7, 0x50a7, 0x50a7, 0x50a7, 0x50a7, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ac, 0x50ac, 0x50ac, 0x50ac, 0x50ac, 0x50ac, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b2, 0x50b2, 0x50b2, 0x50b2, 0x50b2, 0x50b2, 0x50b2, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b9, 0x50b9, 0x50b9, 0x50b9, 0x50b9, 0x50b9, 0x50b9, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c3, 0x50c3, 0x50c3, 0x50c3, 0x50c3, 0x50c3, 0x50c3, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50da, 0x50da, 0x50da, 0x50da, 0x50da, 0x50da, 0x50db, 0x50db, 0x50db, 0x50db, 0x50dc, 0x50dc, 0x50dc, 0x50dc, 0x50dd, 0x50dd, 0x50dd, 0x50dd, 0x50de, 0x50de, 0x50de, 0x50de, 0x50df, 0x50df, 0x50df, 0x50df, 0x50e0, 0x50e0, 0x50e0, 0x50e0, 0x50e1, 0x50e1, 0x50e1, 0x50e1, 0x50e2, 0x50e2, 0x50e2, 0x50e2, 0x50e2, 0x50e3, 0x50e3, 0x50e3, 0x50e3, 0x50e4, 0x50e4, 0x50e4, 0x50e4, 0x50e5, 0x50e5, 0x50e5, 0x50e5, 0x50e6, 0x50e6, 0x50e6, 0x50e6, 0x50e7, 0x50e7, 0x50e7, 0x50e7, 0x50e8, 0x50e8, 0x50e8, 0x50e8, 0x50e8, 0x50e9, 0x50e9, 0x50e9, 0x50e9, 0x50ea, 0x50ea, 0x50ea, 0x50ea, 0x50eb, 0x50eb, 0x50eb, 0x50eb, 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ed, 0x50ed, 0x50ed, 0x50ed, 0x50ee, 0x50ee, 0x50ee, 0x50ee, 0x50ef, 0x50ef, 0x50ef, 0x50ef, 0x50ef, 0x50f0, 0x50f0, 0x50f0, 0x50f0, 0x50f1, 0x50f1, 0x50f1, 0x50f1, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f3, 0x50f3, 0x50f3, 0x50f3, 0x50f4, 0x50f4, 0x50f4, 0x50f4, 0x50f4, 0x50f5, 0x50f5, 0x50f5, 0x50f5, 0x50f6, 0x50f6, 0x50f6, 0x50f6, 0x50f6, 0x50f7, 0x50f7, 0x50f7, 0x50f7, 0x50f8, 0x50f8, 0x50f8, 0x50f8, 0x50f8, 0x50f9, 0x50f9, 0x50f9, 0x50f9, 0x50fa, 0x50fa, 0x50fa, 0x50fa, 0x50fa, 0x50fb, 0x50fb, 0x50fb, 0x50fb, 0x50fc, 0x50fc, 0x50fc, 0x50fc, 0x50fc, 0x50fd, 0x50fd, 0x50fd, 0x50fd, 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50ff, 0x50ff, 0x50ff, 0x50ff, 0x5100, 0x5100, 0x5100, 0x5100, 0x5100, 0x5101, 0x5101, 0x5101, 0x5101, 0x5101, 0x5102, 0x5102, 0x5102, 0x5102, 0x5103, 0x5103, 0x5103, 0x5103, 0x5103, 0x5104, 0x5104, 0x5104, 0x5104, 0x5104, 0x5105, 0x5105, 0x5105, 0x5105, 0x5105, 0x5106, 0x5106, 0x5106, 0x5106, 0x5107, 0x5107, 0x5107, 0x5107, 0x5107, 0x5108, 0x5108, 0x5108, 0x5108, 0x5108, 0x5109, 0x5109, 0x5109, 0x5109, 0x5109, 0x510a, 0x510a, 0x510a, 0x510a, 0x510a, 0x510b, 0x510b, 0x510b, 0x510b, 0x510c, 0x510c, 0x510c, 0x510c, 0x510c, 0x510d, 0x510d, 0x510d, 0x510d, 0x510d, 0x510e, 0x510e, 0x510e, 0x510e, 0x510e, 0x510f, 0x510f, 0x510f, 0x510f, 0x510f, 0x5110, 0x5110, 0x5110, 0x5110, 0x5110, 0x5111, 0x5111, 0x5111, 0x5111, 0x5111, 0x5112, 0x5112, 0x5112, 0x5112, 0x5112, 0x5113, 0x5113, 0x5113, 0x5113, 0x5113, 0x5114, 0x5114, 0x5114, 0x5114, 0x5114, 0x5115, 0x5115, 0x5115, 0x5115, 0x5115, 0x5116, 0x5116, 0x5116, 0x5116, 0x5116, 0x5117, 0x5117, 0x5117, 0x5117, 0x5117, 0x5118, 0x5118, 0x5118, 0x5118, 0x5118, 0x5119, 0x5119, 0x5119, 0x5119, 0x5119, 0x511a, 0x511a, 0x511a, 0x511a, 0x511a, 0x511b, 0x511b, 0x511b, 0x511b, 0x511b, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511d, 0x511d, 0x511d, 0x511d, 0x511d, 0x511e, 0x511e, 0x511e, 0x511e, 0x511e, 0x511f, 0x511f, 0x511f, 0x511f, 0x511f, 0x5120, 0x5120, 0x5120, 0x5120, 0x5120, 0x5120, 0x5121, 0x5121, 0x5121, 0x5121, 0x5121, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5123, 0x5123, 0x5123, 0x5123, 0x5123, 0x5124, 0x5124, 0x5124, 0x5124, 0x5124, 0x5124, 0x5125, 0x5125, 0x5125, 0x5125, 0x5125, 0x5126, 0x5126, 0x5126, 0x5126, 0x5126, 0x5127, 0x5127, 0x5127, 0x5127, 0x5127, 0x5127, 0x5128, 0x5128, 0x5128, 0x5128, 0x5128, 0x5129, 0x5129, 0x5129, 0x5129, 0x5129, 0x5129, 0x512a, 0x512a, 0x512a, 0x512a, 0x512a, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, 0x512c, 0x512c, 0x512c, 0x512c, 0x512c, 0x512d, 0x512d, 0x512d, 0x512d, 0x512d, 0x512d, 0x512e, 0x512e, 0x512e, 0x512e, 0x512e, 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x5130, 0x5130, 0x5130, 0x5130, 0x5130, 0x5131, 0x5131, 0x5131, 0x5131, 0x5131, 0x5131, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5133, 0x5133, 0x5133, 0x5133, 0x5133, 0x5134, 0x5134, 0x5134, 0x5134, 0x5134, 0x5134, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, 0x5136, 0x5136, 0x5136, 0x5136, 0x5136, 0x5137, 0x5137, 0x5137, 0x5137, 0x5137, 0x5137, 0x5138, 0x5138, 0x5138, 0x5138, 0x5138, 0x5138, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x513a, 0x513a, 0x513a, 0x513a, 0x513a, 0x513a, 0x513b, 0x513b, 0x513b, 0x513b, 0x513b, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513e, 0x513e, 0x513e, 0x513e, 0x513e, 0x513e, 0x513f, 0x513f, 0x513f, 0x513f, 0x513f, 0x513f, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5142, 0x5142, 0x5142, 0x5142, 0x5142, 0x5142, 0x5143, 0x5143, 0x5143, 0x5143, 0x5143, 0x5143, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5146, 0x5146, 0x5146, 0x5146, 0x5146, 0x5146, 0x5147, 0x5147, 0x5147, 0x5147, 0x5147, 0x5147, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x514a, 0x514a, 0x514a, 0x514a, 0x514a, 0x514a, 0x514b, 0x514b, 0x514b, 0x514b, 0x514b, 0x514b, 0x514c, 0x514c, 0x514c, 0x514c, 0x514c, 0x514c, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514f, 0x514f, 0x514f, 0x514f, 0x514f, 0x514f, 0x5150, 0x5150, 0x5150, 0x5150, 0x5150, 0x5150, 0x5150, 0x5151, 0x5151, 0x5151, 0x5151, 0x5151, 0x5151, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5154, 0x5154, 0x5154, 0x5154, 0x5154, 0x5154, 0x5155, 0x5155, 0x5155, 0x5155, 0x5155, 0x5155, 0x5155, 0x5156, 0x5156, 0x5156, 0x5156, 0x5156, 0x5156, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5159, 0x5159, 0x5159, 0x5159, 0x5159, 0x5159, 0x5159, 0x515a, 0x515a, 0x515a, 0x515a, 0x515a, 0x515a, 0x515b, 0x515b, 0x515b, 0x515b, 0x515b, 0x515b, 0x515b, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515f, 0x515f, 0x515f, 0x515f, 0x515f, 0x515f, 0x515f, 0x5160, 0x5160, 0x5160, 0x5160, 0x5160, 0x5160, 0x5161, 0x5161, 0x5161, 0x5161, 0x5161, 0x5161, 0x5161, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5166, 0x5166, 0x5166, 0x5166, 0x5166, 0x5166, 0x5167, 0x5167, 0x5167, 0x5167, 0x5167, 0x5167, 0x5167, 0x5168, 0x5168, 0x5168, 0x5168, 0x5168, 0x5168, 0x5168, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516e, 0x516e, 0x516e, 0x516e, 0x516e, 0x516e, 0x516e, 0x516f, 0x516f, 0x516f, 0x516f, 0x516f, 0x516f, 0x516f, 0x5170, 0x5170, 0x5170, 0x5170, 0x5170, 0x5170, 0x5170, 0x5171, 0x5171, 0x5171, 0x5171, 0x5171, 0x5171, 0x5171, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5179, 0x5179, 0x5179, 0x5179, 0x5179, 0x5179, 0x5179, 0x517a, 0x517a, 0x517a, 0x517a, 0x517a, 0x517a, 0x517a, 0x517b, 0x517b, 0x517b, 0x517b, 0x517b, 0x517b, 0x517b, 0x517b, 0x517c, 0x517c, 0x517c, 0x517c, 0x517c, 0x517c, 0x517c, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, 0x517f, 0x517f, 0x517f, 0x517f, 0x517f, 0x517f, 0x517f, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518c, 0x518c, 0x518c, 0x518c, 0x518d, 0x518d, 0x518d, 0x518d, 0x518e, 0x518e, 0x518e, 0x518e, 0x518f, 0x518f, 0x518f, 0x518f, 0x5190, 0x5190, 0x5190, 0x5190, 0x5191, 0x5191, 0x5191, 0x5191, 0x5191, 0x5192, 0x5192, 0x5192, 0x5192, 0x5193, 0x5193, 0x5193, 0x5193, 0x5194, 0x5194, 0x5194, 0x5194, 0x5195, 0x5195, 0x5195, 0x5195, 0x5196, 0x5196, 0x5196, 0x5196, 0x5197, 0x5197, 0x5197, 0x5197, 0x5198, 0x5198, 0x5198, 0x5198, 0x5198, 0x5199, 0x5199, 0x5199, 0x5199, 0x519a, 0x519a, 0x519a, 0x519a, 0x519b, 0x519b, 0x519b, 0x519b, 0x519c, 0x519c, 0x519c, 0x519c, 0x519c, 0x519d, 0x519d, 0x519d, 0x519d, 0x519e, 0x519e, 0x519e, 0x519e, 0x519f, 0x519f, 0x519f, 0x519f, 0x51a0, 0x51a0, 0x51a0, 0x51a0, 0x51a0, 0x51a1, 0x51a1, 0x51a1, 0x51a1, 0x51a2, 0x51a2, 0x51a2, 0x51a2, 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a4, 0x51a4, 0x51a4, 0x51a4, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a6, 0x51a6, 0x51a6, 0x51a6, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a8, 0x51a8, 0x51a8, 0x51a8, 0x51a9, 0x51a9, 0x51a9, 0x51a9, 0x51a9, 0x51aa, 0x51aa, 0x51aa, 0x51aa, 0x51ab, 0x51ab, 0x51ab, 0x51ab, 0x51ab, 0x51ac, 0x51ac, 0x51ac, 0x51ac, 0x51ad, 0x51ad, 0x51ad, 0x51ad, 0x51ad, 0x51ae, 0x51ae, 0x51ae, 0x51ae, 0x51af, 0x51af, 0x51af, 0x51af, 0x51af, 0x51b0, 0x51b0, 0x51b0, 0x51b0, 0x51b1, 0x51b1, 0x51b1, 0x51b1, 0x51b1, 0x51b2, 0x51b2, 0x51b2, 0x51b2, 0x51b2, 0x51b3, 0x51b3, 0x51b3, 0x51b3, 0x51b4, 0x51b4, 0x51b4, 0x51b4, 0x51b4, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b6, 0x51b6, 0x51b6, 0x51b6, 0x51b7, 0x51b7, 0x51b7, 0x51b7, 0x51b7, 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b9, 0x51b9, 0x51b9, 0x51b9, 0x51b9, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51bb, 0x51bb, 0x51bb, 0x51bb, 0x51bc, 0x51bc, 0x51bc, 0x51bc, 0x51bc, 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51be, 0x51be, 0x51be, 0x51be, 0x51be, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x51c1, 0x51c1, 0x51c1, 0x51c1, 0x51c1, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c3, 0x51c3, 0x51c3, 0x51c3, 0x51c3, 0x51c4, 0x51c4, 0x51c4, 0x51c4, 0x51c4, 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c8, 0x51c8, 0x51c8, 0x51c8, 0x51c8, 0x51c9, 0x51c9, 0x51c9, 0x51c9, 0x51c9, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51cb, 0x51cb, 0x51cb, 0x51cb, 0x51cb, 0x51cc, 0x51cc, 0x51cc, 0x51cc, 0x51cc, 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51ce, 0x51ce, 0x51ce, 0x51ce, 0x51ce, 0x51ce, 0x51cf, 0x51cf, 0x51cf, 0x51cf, 0x51cf, 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d1, 0x51d1, 0x51d1, 0x51d1, 0x51d1, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d4, 0x51d4, 0x51d4, 0x51d4, 0x51d4, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d7, 0x51d7, 0x51d7, 0x51d7, 0x51d7, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51da, 0x51da, 0x51da, 0x51da, 0x51da, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dd, 0x51dd, 0x51dd, 0x51dd, 0x51dd, 0x51dd, 0x51de, 0x51de, 0x51de, 0x51de, 0x51de, 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51e0, 0x51e0, 0x51e0, 0x51e0, 0x51e0, 0x51e1, 0x51e1, 0x51e1, 0x51e1, 0x51e1, 0x51e1, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e3, 0x51e3, 0x51e3, 0x51e3, 0x51e3, 0x51e4, 0x51e4, 0x51e4, 0x51e4, 0x51e4, 0x51e4, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e7, 0x51e7, 0x51e7, 0x51e7, 0x51e7, 0x51e7, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51ea, 0x51ea, 0x51ea, 0x51ea, 0x51ea, 0x51ea, 0x51eb, 0x51eb, 0x51eb, 0x51eb, 0x51eb, 0x51eb, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ee, 0x51ee, 0x51ee, 0x51ee, 0x51ee, 0x51ee, 0x51ef, 0x51ef, 0x51ef, 0x51ef, 0x51ef, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f2, 0x51f2, 0x51f2, 0x51f2, 0x51f2, 0x51f2, 0x51f3, 0x51f3, 0x51f3, 0x51f3, 0x51f3, 0x51f3, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f6, 0x51f6, 0x51f6, 0x51f6, 0x51f6, 0x51f6, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51fa, 0x51fa, 0x51fa, 0x51fa, 0x51fa, 0x51fa, 0x51fb, 0x51fb, 0x51fb, 0x51fb, 0x51fb, 0x51fb, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51ff, 0x51ff, 0x51ff, 0x51ff, 0x51ff, 0x51ff, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5203, 0x5203, 0x5203, 0x5203, 0x5203, 0x5203, 0x5204, 0x5204, 0x5204, 0x5204, 0x5204, 0x5204, 0x5204, 0x5205, 0x5205, 0x5205, 0x5205, 0x5205, 0x5205, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5208, 0x5208, 0x5208, 0x5208, 0x5208, 0x5208, 0x5208, 0x5209, 0x5209, 0x5209, 0x5209, 0x5209, 0x5209, 0x520a, 0x520a, 0x520a, 0x520a, 0x520a, 0x520a, 0x520a, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520e, 0x520e, 0x520e, 0x520e, 0x520e, 0x520e, 0x520f, 0x520f, 0x520f, 0x520f, 0x520f, 0x520f, 0x520f, 0x5210, 0x5210, 0x5210, 0x5210, 0x5210, 0x5210, 0x5210, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5214, 0x5214, 0x5214, 0x5214, 0x5214, 0x5214, 0x5214, 0x5215, 0x5215, 0x5215, 0x5215, 0x5215, 0x5215, 0x5215, 0x5216, 0x5216, 0x5216, 0x5216, 0x5216, 0x5216, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521b, 0x521b, 0x521b, 0x521b, 0x521b, 0x521b, 0x521b, 0x521c, 0x521c, 0x521c, 0x521c, 0x521c, 0x521c, 0x521c, 0x521d, 0x521d, 0x521d, 0x521d, 0x521d, 0x521d, 0x521d, 0x521e, 0x521e, 0x521e, 0x521e, 0x521e, 0x521e, 0x521e, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5225, 0x5225, 0x5225, 0x5225, 0x5225, 0x5225, 0x5225, 0x5226, 0x5226, 0x5226, 0x5226, 0x5226, 0x5226, 0x5226, 0x5227, 0x5227, 0x5227, 0x5227, 0x5227, 0x5227, 0x5227, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, 0x5229, 0x5229, 0x5229, 0x5229, 0x5229, 0x5229, 0x5229, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5235, 0x5235, 0x5235, 0x5235, 0x5235, 0x5235, 0x5235, 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523b, 0x523b, 0x523b, 0x523b, 0x523b, 0x523b, 0x523b, 0x523c, 0x523c, 0x523c, 0x523c, 0x523c, 0x523c, 0x523c, 0x523c, 0x523d, 0x523d, 0x523d, 0x523d, 0x523d, 0x523d, 0x523e, 0x523e, 0x523e, 0x523e, 0x523f, 0x523f, 0x523f, 0x523f, 0x523f, 0x5240, 0x5240, 0x5240, 0x5240, 0x5241, 0x5241, 0x5241, 0x5241, 0x5242, 0x5242, 0x5242, 0x5242, 0x5243, 0x5243, 0x5243, 0x5243, 0x5244, 0x5244, 0x5244, 0x5244, 0x5245, 0x5245, 0x5245, 0x5245, 0x5246, 0x5246, 0x5246, 0x5246, 0x5247, 0x5247, 0x5247, 0x5247, 0x5248, 0x5248, 0x5248, 0x5248, 0x5248, 0x5249, 0x5249, 0x5249, 0x5249, 0x524a, 0x524a, 0x524a, 0x524a, 0x524b, 0x524b, 0x524b, 0x524b, 0x524c, 0x524c, 0x524c, 0x524c, 0x524d, 0x524d, 0x524d, 0x524d, 0x524d, 0x524e, 0x524e, 0x524e, 0x524e, 0x524f, 0x524f, 0x524f, 0x524f, 0x5250, 0x5250, 0x5250, 0x5250, 0x5251, 0x5251, 0x5251, 0x5251, 0x5251, 0x5252, 0x5252, 0x5252, 0x5252, 0x5253, 0x5253, 0x5253, 0x5253, 0x5253, 0x5254, 0x5254, 0x5254, 0x5254, 0x5255, 0x5255, 0x5255, 0x5255, 0x5256, 0x5256, 0x5256, 0x5256, 0x5256, 0x5257, 0x5257, 0x5257, 0x5257, 0x5258, 0x5258, 0x5258, 0x5258, 0x5258, 0x5259, 0x5259, 0x5259, 0x5259, 0x525a, 0x525a, 0x525a, 0x525a, 0x525a, 0x525b, 0x525b, 0x525b, 0x525b, 0x525c, 0x525c, 0x525c, 0x525c, 0x525c, 0x525d, 0x525d, 0x525d, 0x525d, 0x525e, 0x525e, 0x525e, 0x525e, 0x525e, 0x525f, 0x525f, 0x525f, 0x525f, 0x5260, 0x5260, 0x5260, 0x5260, 0x5260, 0x5261, 0x5261, 0x5261, 0x5261, 0x5262, 0x5262, 0x5262, 0x5262, 0x5262, 0x5263, 0x5263, 0x5263, 0x5263, 0x5263, 0x5264, 0x5264, 0x5264, 0x5264, 0x5265, 0x5265, 0x5265, 0x5265, 0x5265, 0x5266, 0x5266, 0x5266, 0x5266, 0x5266, 0x5267, 0x5267, 0x5267, 0x5267, 0x5268, 0x5268, 0x5268, 0x5268, 0x5268, 0x5269, 0x5269, 0x5269, 0x5269, 0x5269, 0x526a, 0x526a, 0x526a, 0x526a, 0x526a, 0x526b, 0x526b, 0x526b, 0x526b, 0x526c, 0x526c, 0x526c, 0x526c, 0x526c, 0x526d, 0x526d, 0x526d, 0x526d, 0x526d, 0x526e, 0x526e, 0x526e, 0x526e, 0x526e, 0x526f, 0x526f, 0x526f, 0x526f, 0x526f, 0x5270, 0x5270, 0x5270, 0x5270, 0x5270, 0x5271, 0x5271, 0x5271, 0x5271, 0x5271, 0x5272, 0x5272, 0x5272, 0x5272, 0x5273, 0x5273, 0x5273, 0x5273, 0x5273, 0x5274, 0x5274, 0x5274, 0x5274, 0x5274, 0x5275, 0x5275, 0x5275, 0x5275, 0x5275, 0x5276, 0x5276, 0x5276, 0x5276, 0x5276, 0x5277, 0x5277, 0x5277, 0x5277, 0x5277, 0x5278, 0x5278, 0x5278, 0x5278, 0x5278, 0x5279, 0x5279, 0x5279, 0x5279, 0x5279, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527b, 0x527b, 0x527b, 0x527b, 0x527b, 0x527c, 0x527c, 0x527c, 0x527c, 0x527c, 0x527d, 0x527d, 0x527d, 0x527d, 0x527d, 0x527e, 0x527e, 0x527e, 0x527e, 0x527e, 0x527f, 0x527f, 0x527f, 0x527f, 0x527f, 0x5280, 0x5280, 0x5280, 0x5280, 0x5280, 0x5281, 0x5281, 0x5281, 0x5281, 0x5281, 0x5281, 0x5282, 0x5282, 0x5282, 0x5282, 0x5282, 0x5283, 0x5283, 0x5283, 0x5283, 0x5283, 0x5284, 0x5284, 0x5284, 0x5284, 0x5284, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, 0x5286, 0x5286, 0x5286, 0x5286, 0x5286, 0x5287, 0x5287, 0x5287, 0x5287, 0x5287, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, 0x5289, 0x5289, 0x5289, 0x5289, 0x5289, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, 0x528c, 0x528c, 0x528c, 0x528c, 0x528c, 0x528d, 0x528d, 0x528d, 0x528d, 0x528d, 0x528d, 0x528e, 0x528e, 0x528e, 0x528e, 0x528e, 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x5290, 0x5290, 0x5290, 0x5290, 0x5290, 0x5291, 0x5291, 0x5291, 0x5291, 0x5291, 0x5291, 0x5292, 0x5292, 0x5292, 0x5292, 0x5292, 0x5293, 0x5293, 0x5293, 0x5293, 0x5293, 0x5293, 0x5294, 0x5294, 0x5294, 0x5294, 0x5294, 0x5294, 0x5295, 0x5295, 0x5295, 0x5295, 0x5295, 0x5296, 0x5296, 0x5296, 0x5296, 0x5296, 0x5296, 0x5297, 0x5297, 0x5297, 0x5297, 0x5297, 0x5297, 0x5298, 0x5298, 0x5298, 0x5298, 0x5298, 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x529a, 0x529a, 0x529a, 0x529a, 0x529a, 0x529a, 0x529b, 0x529b, 0x529b, 0x529b, 0x529b, 0x529b, 0x529c, 0x529c, 0x529c, 0x529c, 0x529c, 0x529d, 0x529d, 0x529d, 0x529d, 0x529d, 0x529d, 0x529e, 0x529e, 0x529e, 0x529e, 0x529e, 0x529e, 0x529f, 0x529f, 0x529f, 0x529f, 0x529f, 0x529f, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a2, 0x52a2, 0x52a2, 0x52a2, 0x52a2, 0x52a2, 0x52a3, 0x52a3, 0x52a3, 0x52a3, 0x52a3, 0x52a3, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a6, 0x52a6, 0x52a6, 0x52a6, 0x52a6, 0x52a6, 0x52a7, 0x52a7, 0x52a7, 0x52a7, 0x52a7, 0x52a7, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52ab, 0x52ab, 0x52ab, 0x52ab, 0x52ab, 0x52ab, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ae, 0x52ae, 0x52ae, 0x52ae, 0x52ae, 0x52ae, 0x52af, 0x52af, 0x52af, 0x52af, 0x52af, 0x52af, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b3, 0x52b3, 0x52b3, 0x52b3, 0x52b3, 0x52b3, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b8, 0x52b8, 0x52b8, 0x52b8, 0x52b8, 0x52b8, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52be, 0x52be, 0x52be, 0x52be, 0x52be, 0x52be, 0x52be, 0x52bf, 0x52bf, 0x52bf, 0x52bf, 0x52bf, 0x52bf, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c4, 0x52c4, 0x52c4, 0x52c4, 0x52c4, 0x52c4, 0x52c4, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52cb, 0x52cb, 0x52cb, 0x52cb, 0x52cb, 0x52cb, 0x52cb, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d4, 0x52d4, 0x52d4, 0x52d4, 0x52d4, 0x52d4, 0x52d4, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52df, 0x52df, 0x52df, 0x52df, 0x52df, 0x52df, 0x52df, 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e1, 0x52e1, 0x52e1, 0x52e1, 0x52e1, 0x52e1, 0x52e1, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ef, 0x52ef, 0x52ef, 0x52ef, 0x52f0, 0x52f0, 0x52f0, 0x52f0, 0x52f1, 0x52f1, 0x52f1, 0x52f1, 0x52f2, 0x52f2, 0x52f2, 0x52f2, 0x52f3, 0x52f3, 0x52f3, 0x52f3, 0x52f4, 0x52f4, 0x52f4, 0x52f4, 0x52f5, 0x52f5, 0x52f5, 0x52f5, 0x52f6, 0x52f6, 0x52f6, 0x52f6, 0x52f7, 0x52f7, 0x52f7, 0x52f7, 0x52f8, 0x52f8, 0x52f8, 0x52f8, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52fa, 0x52fa, 0x52fa, 0x52fa, 0x52fb, 0x52fb, 0x52fb, 0x52fb, 0x52fc, 0x52fc, 0x52fc, 0x52fc, 0x52fd, 0x52fd, 0x52fd, 0x52fd, 0x52fe, 0x52fe, 0x52fe, 0x52fe, 0x52fe, 0x52ff, 0x52ff, 0x52ff, 0x52ff, 0x5300, 0x5300, 0x5300, 0x5300, 0x5301, 0x5301, 0x5301, 0x5301, 0x5301, 0x5302, 0x5302, 0x5302, 0x5302, 0x5303, 0x5303, 0x5303, 0x5303, 0x5304, 0x5304, 0x5304, 0x5304, 0x5304, 0x5305, 0x5305, 0x5305, 0x5305, 0x5306, 0x5306, 0x5306, 0x5306, 0x5307, 0x5307, 0x5307, 0x5307, 0x5307, 0x5308, 0x5308, 0x5308, 0x5308, 0x5309, 0x5309, 0x5309, 0x5309, 0x5309, 0x530a, 0x530a, 0x530a, 0x530a, 0x530b, 0x530b, 0x530b, 0x530b, 0x530b, 0x530c, 0x530c, 0x530c, 0x530c, 0x530d, 0x530d, 0x530d, 0x530d, 0x530d, 0x530e, 0x530e, 0x530e, 0x530e, 0x530f, 0x530f, 0x530f, 0x530f, 0x530f, 0x5310, 0x5310, 0x5310, 0x5310, 0x5311, 0x5311, 0x5311, 0x5311, 0x5311, 0x5312, 0x5312, 0x5312, 0x5312, 0x5313, 0x5313, 0x5313, 0x5313, 0x5313, 0x5314, 0x5314, 0x5314, 0x5314, 0x5314, 0x5315, 0x5315, 0x5315, 0x5315, 0x5316, 0x5316, 0x5316, 0x5316, 0x5316, 0x5317, 0x5317, 0x5317, 0x5317, 0x5317, 0x5318, 0x5318, 0x5318, 0x5318, 0x5319, 0x5319, 0x5319, 0x5319, 0x5319, 0x531a, 0x531a, 0x531a, 0x531a, 0x531a, 0x531b, 0x531b, 0x531b, 0x531b, 0x531c, 0x531c, 0x531c, 0x531c, 0x531c, 0x531d, 0x531d, 0x531d, 0x531d, 0x531d, 0x531e, 0x531e, 0x531e, 0x531e, 0x531e, 0x531f, 0x531f, 0x531f, 0x531f, 0x531f, 0x5320, 0x5320, 0x5320, 0x5320, 0x5320, 0x5321, 0x5321, 0x5321, 0x5321, 0x5322, 0x5322, 0x5322, 0x5322, 0x5322, 0x5323, 0x5323, 0x5323, 0x5323, 0x5323, 0x5324, 0x5324, 0x5324, 0x5324, 0x5324, 0x5325, 0x5325, 0x5325, 0x5325, 0x5325, 0x5326, 0x5326, 0x5326, 0x5326, 0x5326, 0x5327, 0x5327, 0x5327, 0x5327, 0x5327, 0x5328, 0x5328, 0x5328, 0x5328, 0x5328, 0x5329, 0x5329, 0x5329, 0x5329, 0x5329, 0x532a, 0x532a, 0x532a, 0x532a, 0x532a, 0x532b, 0x532b, 0x532b, 0x532b, 0x532b, 0x532c, 0x532c, 0x532c, 0x532c, 0x532c, 0x532d, 0x532d, 0x532d, 0x532d, 0x532d, 0x532e, 0x532e, 0x532e, 0x532e, 0x532e, 0x532e, 0x532f, 0x532f, 0x532f, 0x532f, 0x532f, 0x5330, 0x5330, 0x5330, 0x5330, 0x5330, 0x5331, 0x5331, 0x5331, 0x5331, 0x5331, 0x5332, 0x5332, 0x5332, 0x5332, 0x5332, 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5334, 0x5334, 0x5334, 0x5334, 0x5334, 0x5335, 0x5335, 0x5335, 0x5335, 0x5335, 0x5336, 0x5336, 0x5336, 0x5336, 0x5336, 0x5337, 0x5337, 0x5337, 0x5337, 0x5337, 0x5337, 0x5338, 0x5338, 0x5338, 0x5338, 0x5338, 0x5339, 0x5339, 0x5339, 0x5339, 0x5339, 0x533a, 0x533a, 0x533a, 0x533a, 0x533a, 0x533a, 0x533b, 0x533b, 0x533b, 0x533b, 0x533b, 0x533c, 0x533c, 0x533c, 0x533c, 0x533c, 0x533d, 0x533d, 0x533d, 0x533d, 0x533d, 0x533d, 0x533e, 0x533e, 0x533e, 0x533e, 0x533e, 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x5340, 0x5340, 0x5340, 0x5340, 0x5340, 0x5341, 0x5341, 0x5341, 0x5341, 0x5341, 0x5341, 0x5342, 0x5342, 0x5342, 0x5342, 0x5342, 0x5343, 0x5343, 0x5343, 0x5343, 0x5343, 0x5343, 0x5344, 0x5344, 0x5344, 0x5344, 0x5344, 0x5344, 0x5345, 0x5345, 0x5345, 0x5345, 0x5345, 0x5346, 0x5346, 0x5346, 0x5346, 0x5346, 0x5346, 0x5347, 0x5347, 0x5347, 0x5347, 0x5347, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x534a, 0x534a, 0x534a, 0x534a, 0x534a, 0x534a, 0x534b, 0x534b, 0x534b, 0x534b, 0x534b, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534d, 0x534d, 0x534d, 0x534d, 0x534d, 0x534d, 0x534e, 0x534e, 0x534e, 0x534e, 0x534e, 0x534e, 0x534f, 0x534f, 0x534f, 0x534f, 0x534f, 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5351, 0x5351, 0x5351, 0x5351, 0x5351, 0x5351, 0x5352, 0x5352, 0x5352, 0x5352, 0x5352, 0x5352, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5355, 0x5355, 0x5355, 0x5355, 0x5355, 0x5355, 0x5356, 0x5356, 0x5356, 0x5356, 0x5356, 0x5356, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5359, 0x5359, 0x5359, 0x5359, 0x5359, 0x5359, 0x535a, 0x535a, 0x535a, 0x535a, 0x535a, 0x535a, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535d, 0x535d, 0x535d, 0x535d, 0x535d, 0x535d, 0x535d, 0x535e, 0x535e, 0x535e, 0x535e, 0x535e, 0x535e, 0x535f, 0x535f, 0x535f, 0x535f, 0x535f, 0x535f, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5361, 0x5361, 0x5361, 0x5361, 0x5361, 0x5361, 0x5362, 0x5362, 0x5362, 0x5362, 0x5362, 0x5362, 0x5362, 0x5363, 0x5363, 0x5363, 0x5363, 0x5363, 0x5363, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5366, 0x5366, 0x5366, 0x5366, 0x5366, 0x5366, 0x5367, 0x5367, 0x5367, 0x5367, 0x5367, 0x5367, 0x5367, 0x5368, 0x5368, 0x5368, 0x5368, 0x5368, 0x5368, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536b, 0x536b, 0x536b, 0x536b, 0x536b, 0x536b, 0x536c, 0x536c, 0x536c, 0x536c, 0x536c, 0x536c, 0x536c, 0x536d, 0x536d, 0x536d, 0x536d, 0x536d, 0x536d, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5371, 0x5371, 0x5371, 0x5371, 0x5371, 0x5371, 0x5371, 0x5372, 0x5372, 0x5372, 0x5372, 0x5372, 0x5372, 0x5372, 0x5373, 0x5373, 0x5373, 0x5373, 0x5373, 0x5373, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5377, 0x5377, 0x5377, 0x5377, 0x5377, 0x5377, 0x5378, 0x5378, 0x5378, 0x5378, 0x5378, 0x5378, 0x5378, 0x5379, 0x5379, 0x5379, 0x5379, 0x5379, 0x5379, 0x5379, 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537f, 0x537f, 0x537f, 0x537f, 0x537f, 0x537f, 0x537f, 0x5380, 0x5380, 0x5380, 0x5380, 0x5380, 0x5380, 0x5380, 0x5381, 0x5381, 0x5381, 0x5381, 0x5381, 0x5381, 0x5381, 0x5382, 0x5382, 0x5382, 0x5382, 0x5382, 0x5382, 0x5382, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5389, 0x5389, 0x5389, 0x5389, 0x5389, 0x5389, 0x5389, 0x538a, 0x538a, 0x538a, 0x538a, 0x538a, 0x538a, 0x538a, 0x538b, 0x538b, 0x538b, 0x538b, 0x538b, 0x538b, 0x538b, 0x538b, 0x538c, 0x538c, 0x538c, 0x538c, 0x538c, 0x538c, 0x538c, 0x538d, 0x538d, 0x538d, 0x538d, 0x538d, 0x538d, 0x538d, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539c, 0x539c, 0x539c, 0x539c, 0x539c, 0x539c, 0x539c, 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x53a0, 0x53a0, 0x53a0, 0x53a0, 0x53a0, 0x53a0, 0x53a1, 0x53a1, 0x53a1, 0x53a1, 0x53a2, 0x53a2, 0x53a2, 0x53a2, 0x53a3, 0x53a3, 0x53a3, 0x53a3, 0x53a4, 0x53a4, 0x53a4, 0x53a4, 0x53a5, 0x53a5, 0x53a5, 0x53a5, 0x53a6, 0x53a6, 0x53a6, 0x53a6, 0x53a7, 0x53a7, 0x53a7, 0x53a7, 0x53a8, 0x53a8, 0x53a8, 0x53a8, 0x53a9, 0x53a9, 0x53a9, 0x53a9, 0x53a9, 0x53aa, 0x53aa, 0x53aa, 0x53aa, 0x53ab, 0x53ab, 0x53ab, 0x53ab, 0x53ac, 0x53ac, 0x53ac, 0x53ac, 0x53ad, 0x53ad, 0x53ad, 0x53ad, 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53af, 0x53af, 0x53af, 0x53af, 0x53b0, 0x53b0, 0x53b0, 0x53b0, 0x53b1, 0x53b1, 0x53b1, 0x53b1, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b3, 0x53b3, 0x53b3, 0x53b3, 0x53b4, 0x53b4, 0x53b4, 0x53b4, 0x53b5, 0x53b5, 0x53b5, 0x53b5, 0x53b5, 0x53b6, 0x53b6, 0x53b6, 0x53b6, 0x53b7, 0x53b7, 0x53b7, 0x53b7, 0x53b8, 0x53b8, 0x53b8, 0x53b8, 0x53b8, 0x53b9, 0x53b9, 0x53b9, 0x53b9, 0x53ba, 0x53ba, 0x53ba, 0x53ba, 0x53ba, 0x53bb, 0x53bb, 0x53bb, 0x53bb, 0x53bc, 0x53bc, 0x53bc, 0x53bc, 0x53bc, 0x53bd, 0x53bd, 0x53bd, 0x53bd, 0x53be, 0x53be, 0x53be, 0x53be, 0x53be, 0x53bf, 0x53bf, 0x53bf, 0x53bf, 0x53c0, 0x53c0, 0x53c0, 0x53c0, 0x53c0, 0x53c1, 0x53c1, 0x53c1, 0x53c1, 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c3, 0x53c3, 0x53c3, 0x53c3, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c5, 0x53c5, 0x53c5, 0x53c5, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c7, 0x53c7, 0x53c7, 0x53c7, 0x53c7, 0x53c8, 0x53c8, 0x53c8, 0x53c8, 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53ca, 0x53ca, 0x53ca, 0x53ca, 0x53ca, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cc, 0x53cc, 0x53cc, 0x53cc, 0x53cd, 0x53cd, 0x53cd, 0x53cd, 0x53cd, 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53cf, 0x53cf, 0x53cf, 0x53cf, 0x53cf, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d1, 0x53d1, 0x53d1, 0x53d1, 0x53d2, 0x53d2, 0x53d2, 0x53d2, 0x53d2, 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d4, 0x53d4, 0x53d4, 0x53d4, 0x53d4, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d6, 0x53d6, 0x53d6, 0x53d6, 0x53d6, 0x53d7, 0x53d7, 0x53d7, 0x53d7, 0x53d7, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d9, 0x53d9, 0x53d9, 0x53d9, 0x53d9, 0x53da, 0x53da, 0x53da, 0x53da, 0x53da, 0x53db, 0x53db, 0x53db, 0x53db, 0x53db, 0x53dc, 0x53dc, 0x53dc, 0x53dc, 0x53dc, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53de, 0x53de, 0x53de, 0x53de, 0x53de, 0x53df, 0x53df, 0x53df, 0x53df, 0x53df, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e1, 0x53e1, 0x53e1, 0x53e1, 0x53e1, 0x53e1, 0x53e2, 0x53e2, 0x53e2, 0x53e2, 0x53e2, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e4, 0x53e4, 0x53e4, 0x53e4, 0x53e4, 0x53e5, 0x53e5, 0x53e5, 0x53e5, 0x53e5, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e7, 0x53e7, 0x53e7, 0x53e7, 0x53e7, 0x53e8, 0x53e8, 0x53e8, 0x53e8, 0x53e8, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53ea, 0x53ea, 0x53ea, 0x53ea, 0x53ea, 0x53eb, 0x53eb, 0x53eb, 0x53eb, 0x53eb, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ed, 0x53ed, 0x53ed, 0x53ed, 0x53ed, 0x53ee, 0x53ee, 0x53ee, 0x53ee, 0x53ee, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53f0, 0x53f0, 0x53f0, 0x53f0, 0x53f0, 0x53f1, 0x53f1, 0x53f1, 0x53f1, 0x53f1, 0x53f1, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f3, 0x53f3, 0x53f3, 0x53f3, 0x53f3, 0x53f3, 0x53f4, 0x53f4, 0x53f4, 0x53f4, 0x53f4, 0x53f4, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f7, 0x53f7, 0x53f7, 0x53f7, 0x53f7, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53fa, 0x53fa, 0x53fa, 0x53fa, 0x53fa, 0x53fb, 0x53fb, 0x53fb, 0x53fb, 0x53fb, 0x53fb, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fd, 0x53fd, 0x53fd, 0x53fd, 0x53fd, 0x53fe, 0x53fe, 0x53fe, 0x53fe, 0x53fe, 0x53fe, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, 0x5435, 0x5435, 0x5435, 0x5435, 0x5435, 0x5435, 0x5435, 0x5435, 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54db, 0x54db, 0x54db, 0x54db, 0x54db, 0x54db, 0x54db, 0x54db, 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54de, 0x54de, 0x54de, 0x54de, 0x54de, 0x54de, 0x54de, 0x54de, 0x54df, 0x54df, 0x54df, 0x54df, 0x54df, 0x54df, 0x54df, 0x54df, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; openexr-2.5.7/OpenEXR/IlmImf/dwaLookups.cpp000066400000000000000000000424361406177042200205120ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009-2014 DreamWorks Animation LLC. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of DreamWorks Animation 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// // // A program to generate various acceleration lookup tables // for Imf::DwaCompressor // #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #endif #ifdef OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN #include #endif #include #include #include #include #include #include "ImfNamespace.h" using namespace OPENEXR_IMF_NAMESPACE; namespace { class LutHeaderWorker { public: class Runner : public ILMTHREAD_NAMESPACE::Thread { public: Runner(LutHeaderWorker &worker, bool output): ILMTHREAD_NAMESPACE::Thread(), _worker(worker), _output(output) { } virtual ~Runner() { _semaphore.wait(); } virtual void run() { _semaphore.post(); _worker.run(_output); } private: LutHeaderWorker &_worker; bool _output; ILMTHREAD_NAMESPACE::Semaphore _semaphore; }; // class LutHeaderWorker::Runner LutHeaderWorker(size_t startValue, size_t endValue): _lastCandidateCount(0), _startValue(startValue), _endValue(endValue), _numElements(0), _offset(new size_t[numValues()]), _elements(new unsigned short[1024*1024*2]) { } LutHeaderWorker(const LutHeaderWorker& other) = delete; LutHeaderWorker& operator = (const LutHeaderWorker& other) = delete; LutHeaderWorker(LutHeaderWorker&& other) = delete; LutHeaderWorker& operator = (LutHeaderWorker&& other) = delete; ~LutHeaderWorker() { delete[] _offset; delete[] _elements; } size_t lastCandidateCount() const { return _lastCandidateCount; } size_t numValues() const { return _endValue - _startValue; } size_t numElements() const { return _numElements; } const size_t* offset() const { return _offset; } const unsigned short* elements() const { return _elements; } void run(bool outputProgress) { half candidate[16]; int candidateCount = 0; for (size_t input=_startValue; input<_endValue; ++input) { if (outputProgress) { #ifdef __GNUC__ if (input % 100 == 0) { fprintf(stderr, " Building acceleration for DwaCompressor, %.2f %% %c", 100.*(float)input/(float)numValues(), 13); } #else if (input % 1000 == 0) { fprintf(stderr, " Building acceleration for DwaCompressor, %.2f %%\n", 100.*(float)input/(float)numValues()); } #endif } int numSetBits = countSetBits(input); half inputHalf, closestHalf; inputHalf.setBits(input); closestHalf.setBits(0); _offset[input - _startValue] = _numElements; // Gather candidates candidateCount = 0; for (int targetNumSetBits=numSetBits-1; targetNumSetBits>=0; --targetNumSetBits) { bool valueFound = false; for (int i=0; i<65536; ++i) { if (countSetBits(i) != targetNumSetBits) continue; if (!valueFound) { closestHalf.setBits(i); valueFound = true; } else { half tmpHalf; tmpHalf.setBits(i); if (fabs((float)inputHalf - (float)tmpHalf) < fabs((float)inputHalf - (float)closestHalf)) { closestHalf = tmpHalf; } } } if (valueFound == false) { fprintf(stderr, "bork bork bork!\n"); } candidate[candidateCount] = closestHalf; candidateCount++; } // Sort candidates by increasing number of bits set for (int i=0; i> 8]; } }; // class LutHeaderWorker } // namespace // // Generate a no-op LUT, to cut down in conditional branches // void generateNoop() { printf("const unsigned short dwaCompressorNoOp[] = \n"); printf("{"); for (int i=0; i<65536; ++i) { if (i % 8 == 0) { printf("\n "); } unsigned short dst; char *tmp = (char *)(&dst); unsigned short src = (unsigned short)i; Xdr::write (tmp, src); printf("0x%04x, ", dst); } printf("\n};\n"); } // // Nonlinearly encode luminance. For values below 1.0, we want // to use a gamma 2.2 function to match what is fairly common // for storing output referred. However, > 1, gamma functions blow up, // and log functions are much better behaved. We could use a log // function everywhere, but it tends to over-sample dark // regions and undersample the brighter regions, when // compared to the way real devices reproduce values. // // So, above 1, use a log function which is a smooth blend // into the gamma function. // // Nonlinear(linear) = // // linear^(1./2.2) / linear <= 1.0 // | // ln(linear)/ln(e^2.2) + 1 \ otherwise // // // toNonlinear[] needs to take in XDR format half float values, // and output NATIVE format float. // // toLinear[] does the opposite - takes in NATIVE half and // outputs XDR half values. // void generateToLinear() { unsigned short toLinear[65536]; toLinear[0] = 0; for (int i=1; i<65536; ++i) { half h; float sign = 1; float logBase = pow(2.7182818, 2.2); // map NaN and inf to 0 if ((i & 0x7c00) == 0x7c00) { toLinear[i] = 0; continue; } // // _toLinear - assume i is NATIVE, but our output needs // to get flipped to XDR // h.setBits(i); sign = 1; if ((float)h < 0) { sign = -1; } if ( fabs( (float)h) <= 1.0 ) { h = (half)(sign * pow((float)fabs((float)h), 2.2f)); } else { h = (half)(sign * pow(logBase, (float)(fabs((float)h) - 1.0))); } { char *tmp = (char *)(&toLinear[i]); Xdr::write ( tmp, h.bits()); } } printf("const unsigned short dwaCompressorToLinear[] = \n"); printf("{"); for (int i=0; i<65536; ++i) { if (i % 8 == 0) { printf("\n "); } printf("0x%04x, ", toLinear[i]); } printf("\n};\n"); } void generateToNonlinear() { unsigned short toNonlinear[65536]; toNonlinear[0] = 0; for (int i=1; i<65536; ++i) { unsigned short usNative, usXdr; half h; float sign = 1; float logBase = pow(2.7182818, 2.2); usXdr = i; { const char *tmp = (char *)(&usXdr); Xdr::read(tmp, usNative); } // map NaN and inf to 0 if ((usNative & 0x7c00) == 0x7c00) { toNonlinear[i] = 0; continue; } // // toNonlinear - assume i is XDR // h.setBits(usNative); sign = 1; if ((float)h < 0) { sign = -1; } if ( fabs( (float)h ) <= 1.0) { h = (half)(sign * pow(fabs((float)h), 1.f/2.2f)); } else { h = (half)(sign * ( log(fabs((float)h)) / log(logBase) + 1.0) ); } toNonlinear[i] = h.bits(); } printf("const unsigned short dwaCompressorToNonlinear[] = \n"); printf("{"); for (int i=0; i<65536; ++i) { if (i % 8 == 0) { printf("\n "); } printf("0x%04x, ", toNonlinear[i]); } printf("\n};\n"); } // // Attempt to get available CPUs in a somewhat portable way. // int cpuCount() { if (!ILMTHREAD_NAMESPACE::supportsThreads()) return 1; int cpuCount = 1; #if __cplusplus >= 201103L cpuCount = std::thread::hardware_concurrency(); #else #if defined (OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN) cpuCount = sysconf(_SC_NPROCESSORS_ONLN); #elif defined (_WIN32) SYSTEM_INFO sysinfo; GetSystemInfo( &sysinfo ); cpuCount = sysinfo.dwNumberOfProcessors; #endif #endif if (cpuCount < 1) cpuCount = 1; return cpuCount; } // // Generate acceleration luts for the quantization. // // For each possible input value, we want to find the closest numbers // which have one fewer bits set than before. // // This gives us num_bits(input)-1 values per input. If we alloc // space for everything, that's like a 2MB table. We can do better // by compressing all the values to be contigious and using offset // pointers. // // After we've found the candidates with fewer bits set, sort them // based on increasing numbers of bits set. This way, on quantize(), // we can scan through the list and halt once we find the first // candidate within the error range. For small values that can // be quantized to 0, 0 is the first value tested and the search // can exit fairly quickly. // void generateLutHeader() { std::vector workers; size_t numWorkers = cpuCount(); size_t workerInterval = 65536 / numWorkers; for (size_t i=0; i runners; for (size_t i=0; istart(); } for (size_t i=0; irun(i == 0); } } printf("const unsigned int closestDataOffset[] = {\n"); int offsetIdx = 0; int offsetPrev = 0; for (size_t i=0; inumValues(); ++value) { if (offsetIdx % 8 == 0) { printf(" "); } printf("%6lu, ", workers[i]->offset()[value] + offsetPrev); if (offsetIdx % 8 == 7) { printf("\n"); } offsetIdx++; } offsetPrev += workers[i]->offset()[workers[i]->numValues()-1] + workers[i]->lastCandidateCount(); } printf("};\n\n\n"); printf("const unsigned short closestData[] = {\n"); int elementIdx = 0; for (size_t i=0; inumElements(); ++element) { if (elementIdx % 8 == 0) { printf(" "); } printf("%5d, ", workers[i]->elements()[element]); if (elementIdx % 8 == 7) { printf("\n"); } elementIdx++; } } printf("};\n\n\n"); for (size_t i=0; i #include #include #include #include "namespaceAlias.h" using namespace IMF; using namespace std; namespace { float pw (float x, int y) { float p = 1; while (y) { if (y & 1) p *= x; x *= x; y >>= 1; } return p; } void sp (Array2D &px, int w, int h, float xc, float yc, float rc, float rd, float gn, float bl, float lm) { int x1 = int (max ((float) floor (xc - rc), 0.0f)); int x2 = int (min ((float) ceil (xc + rc), w - 1.0f)); int y1 = int (max ((float) floor (yc - rc), 0.0f)); int y2 = int (min ((float) ceil (yc + rc), h - 1.0f)); for (int y = y1; y <= y2; ++y) { for (int x = x1; x <= x2; ++x) { float xl = (x - xc) / rc; float yl = (y - yc) / rc; float r = sqrt (xl * xl + yl * yl); if (r >= 1) continue; float a = 1; if (r * rc > rc - 1) a = rc - r * rc; float zl = sqrt (1 - r * r); float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710; if (dl < 0) dl *= -0.1; float hl = pw (dl, 50) * 4; float dr = (dl + hl) * rd; float dg = (dl + hl) * gn; float db = (dl + hl) * bl; Rgba &p = px[y][x]; p.r = p.r * (1 - a) + dr * lm * a; p.g = p.g * (1 - a) + dg * lm * a; p.b = p.b * (1 - a) + db * lm * a; p.a = 1 - (1 - p.a) * (1 - a); } } } void zsp (Array2D &gpx, Array2D &zpx, int w, int h, float xc, float yc, float zc, float rc, float gn) { int x1 = int (max ((float) floor (xc - rc), 0.0f)); int x2 = int (min ((float) ceil (xc + rc), w - 1.0f)); int y1 = int (max ((float) floor (yc - rc), 0.0f)); int y2 = int (min ((float) ceil (yc + rc), h - 1.0f)); for (int x = x1; x <= x2; ++x) { for (int y = y1; y <= y2; ++y) { float xl = (x - xc) / rc; float yl = (y - yc) / rc; float r = sqrt (xl * xl + yl * yl); if (r >= 1) continue; float zl = sqrt (1 - r * r); float zp = zc - rc * zl; if (zp >= zpx[y][x]) continue; float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710; if (dl < 0) dl *= -0.1; float hl = pw (dl, 50) * 4; float dg = (dl + hl) * gn; gpx[y][x] = dg; zpx[y][x] = zp; } } } inline float z (float k) { k = 2 * (k - int (k)); return (k < 1)? k: 2 - k; } inline void clear (Rgba &color) { color.r = 0; color.g = 0; color.b = 0; } inline void clear (GZ &gz) { gz.g = 0; gz.z = 0; } void add (float k, Rgba &color) { color.a = k; k *= 4; color.r += 0.1f + 4 * z (k); color.g += 0.1f + 4 * z (k + .33333f); color.b += 0.1f + 4 * z (k + .66667f); } void add (float k, GZ &gz) { k *= 5; gz.g += 4 * z (k); gz.z = k; } inline void scale (float f, Rgba &color) { color.r *= f; color.g *= f; color.b *= f; color.a *= f; } inline void scale (float f, GZ &gz) { gz.g *= f; gz.z *= f; } template void mndl (Array2D

&px, int w, int h, int xMin, int xMax, int yMin, int yMax, int xSamples, int ySamples, double rMin, double rMax, double iMin, double aspect, double rSeed, double iSeed) { if (xSamples > 6) xSamples = 6; if (ySamples > 6) ySamples = 6; double iMax = iMin + aspect * (rMax - rMin) * h / w; double sx = double (rMax - rMin) / w; double sy = double (iMax - iMin) / h; double tx = 1.f / xSamples; double ty = 1.f / ySamples; float t = tx * ty; for (int y = yMin; y < yMax; ++y) { for (int x = xMin; x < xMax; ++x) { P &p = px[y - yMin][x - xMin]; clear (p); for (int i = 0; i < xSamples; ++i) { for (int j = 0; j < ySamples; ++j) { const double a = rMin + sx * (x + i * tx); const double b = iMin + sy * (y + j * ty); const double sMax = 100; const int kMax = 256; double r = rSeed; double i = iSeed; double s = 0; int k = 0; while (k < kMax && s < sMax) { s = r * r - i * i; i = 2 * r * i + b; r = s + a; k++; } add (k / float (kMax), p); } } scale (t, p); } } } } // namespace void drawImage1 (Array2D &px, int w, int h) { for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { Rgba &p = px[y][x]; p.r = 0; p.g = 0; p.b = 0; p.a = 0; } } int n = 5600; for (int i = 0; i < n; ++i) { float t = (i * 2.0 * M_PI) / n; float xp = sin (t * 2.0) + 0.2 * sin (t * 15.0); float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0); float r = float (i + 1) / float (n); float xq = xp + 0.3 * r * sin (t * 80.0); float yq = yp + 0.3 * r * cos (t * 80.0); float xr = xp + 0.3 * r * sin (t * 80.0 + M_PI / 2); float yr = yp + 0.3 * r * cos (t * 80.0 + M_PI / 2); if (i % 10 == 0) sp (px, w, h, xp * w / 3 + w / 2, yp * h / 3 + h / 2, w * 0.05 * r, 2.0, 0.8, 0.1, 0.5 * r * r); sp (px, w, h, xq * w / 3 + w / 2, yq * h / 3 + h / 2, w * 0.01 * r, 0.7, 0.2, 2.0, 0.5 * r * r); sp (px, w, h, xr * w / 3 + w / 2, yr * h / 3 + h / 2, w * 0.01 * r, 0.2, 1.5, 0.1, 0.5 * r * r); } } void drawImage2 (Array2D &gpx, Array2D &zpx, int w, int h) { for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { gpx[y][x] = 0; zpx[y][x] = FLT_MAX; } } int n = 2000; for (int i = 0; i < n; ++i) { float t = (i * 2.0 * M_PI) / n; float xp = sin (t * 4.0) + 0.2 * sin (t * 15.0); float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0); float zp = sin (t * 5.0); float rd = 0.7 + 0.3 * sin (t * 15.0); float gn = 0.5 - 0.5 * zp + 0.2; zsp (gpx, zpx, w, h, xp * w / 3 + w / 2, yp * h / 3 + h / 2, zp * w + 3 * w, w * rd * 0.05, 2.5 * gn * gn); } } void drawImage3 (Array2D &px, int w, int h, int xMin, int xMax, int yMin, int yMax, int xLevel, int yLevel) { mndl (px, w, h, xMin, xMax, yMin, yMax, (1 << xLevel), (1 << yLevel), 0.328, 0.369, 0.5, double (1 << yLevel) / double (1 << xLevel), -0.713, 0.9738); } void drawImage4 (Array2D &px, int w, int h, int xMin, int xMax, int yMin, int yMax, int xLevel, int yLevel) { mndl (px, w, h, xMin, xMax, yMin, yMax, (1 << xLevel), (1 << yLevel), 0.3247, 0.33348, 0.4346, double (1 << yLevel) / double (1 << xLevel), 0.4, -0.765); } void drawImage5 (Array2D &px, int w, int h, int xMin, int xMax, int yMin, int yMax, int xLevel, int yLevel) { mndl (px, w, h, xMin, xMax, yMin, yMax, (1 << xLevel), (1 << yLevel), 0.2839, 0.2852, 0.00961, double (1 << yLevel) / double (1 << xLevel), 0.25, 0.31); } void drawImage6 (Array2D &px, int w, int h) { mndl (px, w, h, 0, w, 0, h, 3, 3, -2.5, 1.0, -1.3333, 1, 0, 0); } void drawImage7 (Array &px, int w, int h, int y) { for (int x = 0; x < w; ++x) { float xc = x - w / 2; float yc = y - h / 2; float a = atan2 (xc, yc); float r = sqrt (xc * xc + yc * yc); Rgba &p = px[x]; p.r = sin (3.0f * a + 0.3f * sin (0.10f * r)) * 0.5f + 0.5f; p.g = sin (3.0f * a + 0.3f * sin (0.11f * r)) * 0.5f + 0.5f; p.b = sin (3.0f * a + 0.3f * sin (0.12f * r)) * 0.5f + 0.5f; p.a = 1; } } openexr-2.5.7/OpenEXR/IlmImfExamples/drawImage.h000066400000000000000000000056621406177042200214260ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include #include #include #include "namespaceAlias.h" struct GZ { half g; float z; }; void drawImage1 (IMF::Array2D &pixels, int width, int height); void drawImage2 (IMF::Array2D &gPixels, IMF::Array2D &zPixels, int width, int height); void drawImage3 (IMF::Array2D &pixels, int width, int height, int xMin, int xMax, int yMin, int yMax, int xLevel = 0, int yLevel = 0); void drawImage4 (IMF::Array2D &pixels, int width, int height, int xMin, int xMax, int yMin, int yMax, int xLevel = 0, int yLevel = 0); void drawImage5 (IMF::Array2D &pixels, int width, int height, int xMin, int xMax, int yMin, int yMax, int xLevel = 0, int yLevel = 0); void drawImage6 (IMF::Array2D &pixels, int width, int height); void drawImage7 (IMF::Array &pixels, int width, int height, int y); openexr-2.5.7/OpenEXR/IlmImfExamples/generalInterfaceExamples.cpp000066400000000000000000000217311406177042200250110ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how class InputFile and class OutputFile // can be used to read and write OpenEXR image files with an arbitrary // set of channels. // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include "drawImage.h" #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; void writeGZ1 (const char fileName[], const half *gPixels, const float *zPixels, int width, int height) { // // Write an image with only a G (green) and a Z (depth) channel, // using class OutputFile. // // - create a file header // - add G and Z channels to the header // - open the file, and store the header in the file // - describe the memory layout of the G anx Z pixels // - store the pixels in the file // Header header (width, height); header.channels().insert ("G", Channel (IMF::HALF)); header.channels().insert ("Z", Channel (IMF::FLOAT)); OutputFile file (fileName, header); FrameBuffer frameBuffer; frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) gPixels, // base sizeof (*gPixels) * 1, // xStride sizeof (*gPixels) * width)); // yStride frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) zPixels, // base sizeof (*zPixels) * 1, // xStride sizeof (*zPixels) * width)); // yStride file.setFrameBuffer (frameBuffer); file.writePixels (height); } void writeGZ2 (const char fileName[], const half *gPixels, const float *zPixels, int width, int height, const Box2i &dataWindow) { // // Write an image with only a G (green) and a Z (depth) channel, // using class OutputFile. Don't store the whole image in the // file, but crop it according to the given data window. // // - create a file header // - set the header's data window // - add G and Z channels to the header // - open the file, and store the header in the file // - describe the memory layout of the G anx Z pixels // - store the pixels in the file // Header header (width, height); header.dataWindow() = dataWindow; header.channels().insert ("G", Channel (IMF::HALF)); header.channels().insert ("Z", Channel (IMF::FLOAT)); OutputFile file (fileName, header); FrameBuffer frameBuffer; frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) gPixels, // base sizeof (*gPixels) * 1, // xStride sizeof (*gPixels) * width)); // yStride frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) zPixels, // base sizeof (*zPixels) * 1, // xStride sizeof (*zPixels) * width)); // yStride file.setFrameBuffer (frameBuffer); file.writePixels (dataWindow.max.y - dataWindow.min.y + 1); } void readGZ1 (const char fileName[], Array2D &rPixels, Array2D &gPixels, Array2D &zPixels, int &width, int &height) { // // Read an image using class InputFile. Try to read two // channels, R and G, of type HALF, and one channel, Z, // of type FLOAT. Store the R, G, and Z pixels in three // separate memory buffers. // If a channel is missing in the file, the buffer for that // channel will be filled with an appropriate default value. // // - open the file // - allocate memory for the pixels // - describe the layout of the R, G, and Z pixel buffers // - read the pixels from the file // InputFile file (fileName); Box2i dw = file.header().dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; rPixels.resizeErase (height, width); gPixels.resizeErase (height, width); zPixels.resizeErase (height, width); FrameBuffer frameBuffer; frameBuffer.insert ("R", // name Slice (IMF::HALF, // type (char *) (&rPixels[0][0] - // base dw.min.x - dw.min.y * width), sizeof (rPixels[0][0]) * 1, // xStride sizeof (rPixels[0][0]) * width, // yStride 1, 1, // x/y sampling 0.0)); // fillValue frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) (&gPixels[0][0] - // base dw.min.x - dw.min.y * width), sizeof (gPixels[0][0]) * 1, // xStride sizeof (gPixels[0][0]) * width, // yStride 1, 1, // x/y sampling 0.0)); // fillValue frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) (&zPixels[0][0] - // base dw.min.x - dw.min.y * width), sizeof (zPixels[0][0]) * 1, // xStride sizeof (zPixels[0][0]) * width, // yStride 1, 1, // x/y sampling FLT_MAX)); // fillValue file.setFrameBuffer (frameBuffer); file.readPixels (dw.min.y, dw.max.y); } void readGZ2 (const char fileName[], Array2D &pixels, int &width, int &height) { // // Read an image using class InputFile. Try to read one channel, // G, of type HALF, and one channel, Z, of type FLOAT. In memory, // the G and Z channels will be interleaved in a single buffer. // // - open the file // - allocate memory for the pixels // - describe the layout of the GZ pixel buffer // - read the pixels from the file // InputFile file (fileName); Box2i dw = file.header().dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; int dx = dw.min.x; int dy = dw.min.y; pixels.resizeErase (height, width); FrameBuffer frameBuffer; frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) &pixels[-dy][-dx].g, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) &pixels[-dy][-dx].z, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride file.setFrameBuffer (frameBuffer); file.readPixels (dw.min.y, dw.max.y); } void generalInterfaceExamples () { cout << "\nGZ (green, depth) images\n" << endl; cout << "drawing image" << endl; int w = 800; int h = 600; Array2D gp (h, w); Array2D zp (h, w); drawImage2 (gp, zp, w, h); cout << "writing entire image" << endl; writeGZ1 ("gz1.exr", &gp[0][0], &zp[0][0], w, h); cout << "writing cropped image" << endl; writeGZ2 ("gz2.exr", &gp[0][0], &zp[0][0], w, h, Box2i (V2i (w/6, h/6), V2i (w/2, h/2))); cout << "reading file into separate per-channel buffers" << endl; Array2D rp (1, 1); readGZ1 ("gz2.exr", rp, gp, zp, w, h); cout << "reading file into interleaved multi-channel buffer" << endl; Array2D gzp (1, 1); readGZ2 ("gz2.exr", gzp, w, h); } openexr-2.5.7/OpenEXR/IlmImfExamples/generalInterfaceExamples.h000066400000000000000000000034421406177042200244550ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void generalInterfaceExamples (); openexr-2.5.7/OpenEXR/IlmImfExamples/generalInterfaceTiledExamples.cpp000066400000000000000000000114251406177042200257720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how class TiledInputFile and // class TiledOutputFile can be used to read and write // OpenEXR image files with an arbitrary set of channels. // //----------------------------------------------------------------------------- #include #include #include #include #include #include #include "drawImage.h" #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; void writeTiled1 (const char fileName[], Array2D &pixels, int width, int height, int tileWidth, int tileHeight) { Header header (width, height); header.channels().insert ("G", Channel (IMF::HALF)); header.channels().insert ("Z", Channel (IMF::FLOAT)); header.setTileDescription (TileDescription (tileWidth, tileHeight, ONE_LEVEL)); TiledOutputFile out (fileName, header); FrameBuffer frameBuffer; frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) &pixels[0][0].g, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) &pixels[0][0].z, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride out.setFrameBuffer (frameBuffer); out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); } void readTiled1 (const char fileName[], Array2D &pixels, int &width, int &height) { TiledInputFile in (fileName); Box2i dw = in.header().dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; int dx = dw.min.x; int dy = dw.min.y; pixels.resizeErase (height, width); FrameBuffer frameBuffer; frameBuffer.insert ("G", // name Slice (IMF::HALF, // type (char *) &pixels[-dy][-dx].g, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride frameBuffer.insert ("Z", // name Slice (IMF::FLOAT, // type (char *) &pixels[-dy][-dx].z, // base sizeof (pixels[0][0]) * 1, // xStride sizeof (pixels[0][0]) * width)); // yStride in.setFrameBuffer (frameBuffer); in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); } void generalInterfaceTiledExamples () { cout << "\nGZ (green, depth) tiled files\n" << endl; cout << "drawing image" << endl; int w = 800; int h = 600; Array2D pixels (h, w); drawImage6 (pixels, w, h); cout << "writing file" << endl; writeTiled1 ("tiledgz1.exr", pixels, w, h, 64, 64); cout << "reading file" << endl; readTiled1 ("tiledgz1.exr", pixels, w, h); } openexr-2.5.7/OpenEXR/IlmImfExamples/generalInterfaceTiledExamples.h000066400000000000000000000034501406177042200254360ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void generalInterfaceTiledExamples (); openexr-2.5.7/OpenEXR/IlmImfExamples/lowLevelIoExamples.cpp000066400000000000000000000153561406177042200236420ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how implement custom low-level // file input and output for OpenEXR files: // // Classes C_IStream and C_OStream are derived from IlmImf's // abstract IStream and OStreamd classes. They allow OpenEXR // file input and output via C stdio files (FILE *). // //----------------------------------------------------------------------------- #include #include #include "Iex.h" #include "drawImage.h" #include #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; class C_IStream: public IStream { public: C_IStream (FILE *file, const char fileName[]): IStream (fileName), _file (file) {} virtual bool read (char c[/*n*/], int n); virtual Int64 tellg (); virtual void seekg (Int64 pos); virtual void clear (); private: FILE * _file; }; class C_OStream: public OStream { public: C_OStream (FILE *file, const char fileName[]): OStream (fileName), _file (file) {} virtual void write (const char c[/*n*/], int n); virtual Int64 tellp (); virtual void seekp (Int64 pos); private: FILE * _file; }; bool C_IStream::read (char c[/*n*/], int n) { if (n != static_cast(fread (c, 1, n, _file))) { // // fread() failed, but the return value does not distinguish // between I/O errors and end of file, so we call ferror() to // determine what happened. // if (ferror (_file)) IEX_NAMESPACE::throwErrnoExc(); else throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); } return feof (_file); } Int64 C_IStream::tellg () { return ftell (_file); } void C_IStream::seekg (Int64 pos) { clearerr (_file); fseek (_file, pos, SEEK_SET); } void C_IStream::clear () { clearerr (_file); } void C_OStream::write (const char c[/*n*/], int n) { clearerr (_file); if (n != static_cast(fwrite (c, 1, n, _file))) IEX_NAMESPACE::throwErrnoExc(); } Int64 C_OStream::tellp () { return ftell (_file); } void C_OStream::seekp (Int64 pos) { clearerr (_file); fseek (_file, pos, SEEK_SET); } void writeRgbaFILE (FILE *cfile, const char fileName[], const Rgba *pixels, int width, int height) { // // Store an RGBA image in a C stdio file that has already been opened: // // - create a C_OStream object for writing to the file // - create an RgbaOutputFile object, and attach it to the C_OStream // - describe the memory layout of the pixels // - store the pixels in the file // C_OStream ostr (cfile, fileName); RgbaOutputFile file (ostr, Header (width, height), WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (height); } void readRgbaFILE (FILE *cfile, const char fileName[], Array2D &pixels, int &width, int &height) { // // Read an RGBA image from a C stdio file that has already been opened: // // - create a C_IStream object for reading from the file // - create an RgbaInputFile object, and attach it to the C_IStream // - allocate memory for the pixels // - describe the memory layout of the pixels // - read the pixels from the file // C_IStream istr (cfile, fileName); RgbaInputFile file (istr); Box2i dw = file.dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; pixels.resizeErase (height, width); file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); file.readPixels (dw.min.y, dw.max.y); } void lowLevelIoExamples () { cout << "\nCustom low-level file I/O\n" << endl; cout << "drawing image" << endl; int w = 800; int h = 600; const char *fileName = "rgba4.exr"; Array2D p (h, w); drawImage1 (p, w, h); // // The following code is somewhat complicated because // fopen() returns 0 on error, but writeRgbaFILE() and // readRgbaFILE() throw exceptions. Also, if a FILE * // goes out of scope, the corresponding file is not // automatically closed. In order to avoid leaking // file descriptors, we have to make sure fclose() is // called in all cases. // cout << "writing image" << endl; { FILE *file = fopen (fileName, "wb"); if (file == 0) { THROW_ERRNO ("Cannot open file " << fileName << " (%T)."); } else { try { writeRgbaFILE (file, fileName, &p[0][0], w, h); } catch (...) { fclose (file); throw; } fclose (file); } } cout << "reading image" << endl; { FILE *file = fopen (fileName, "rb"); if (file == 0) { THROW_ERRNO ("Cannot open file " << fileName << " (%T)."); } else { try { readRgbaFILE (file, fileName, p, w, h); } catch (...) { fclose (file); throw; } fclose (file); } } } openexr-2.5.7/OpenEXR/IlmImfExamples/lowLevelIoExamples.h000066400000000000000000000034341406177042200233010ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void lowLevelIoExamples (); openexr-2.5.7/OpenEXR/IlmImfExamples/main.cpp000066400000000000000000000045661406177042200210070ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #include "rgbaInterfaceExamples.h" #include "rgbaInterfaceTiledExamples.h" #include "generalInterfaceExamples.h" #include "generalInterfaceTiledExamples.h" #include "lowLevelIoExamples.h" #include "previewImageExamples.h" #include #include int main (int argc, char *argv[]) { try { rgbaInterfaceExamples(); generalInterfaceExamples(); rgbaInterfaceTiledExamples(); generalInterfaceTiledExamples(); lowLevelIoExamples(); previewImageExamples(); } catch (const std::exception &exc) { std::cerr << exc.what() << std::endl; return 1; } return 0; } openexr-2.5.7/OpenEXR/IlmImfExamples/namespaceAlias.h000066400000000000000000000036261406177042200224320ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef NAMESPACEALIAS_H_ #define NAMESPACEALIAS_H_ #include namespace IMF = OPENEXR_IMF_NAMESPACE; #endif /* NAMESPACEALIAS_H_ */ openexr-2.5.7/OpenEXR/IlmImfExamples/previewImageExamples.cpp000066400000000000000000000147331406177042200242030ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how to add preview images // (also known as thumbnais) to OpenEXR image files. // //----------------------------------------------------------------------------- #include #include #include #include "ImathFun.h" #include "drawImage.h" #include #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; unsigned char gamma (float x) { // // Convert a floating-point pixel value to an 8-bit gamma-2.2 // preview pixel. (This routine is a simplified version of // how the exrdisplay program transforms floating-point pixel // values in order to display them on the screen.) // x = pow (5.5555f * max (0.f, x), 0.4545f) * 84.66f; return (unsigned char) IMATH_NAMESPACE::clamp (x, 0.f, 255.f); } void makePreviewImage (const Array2D &pixels, int width, int height, Array2D &previewPixels, int &previewWidth, int &previewHeight) { const int N = 8; previewWidth = width / N; previewHeight = height / N; previewPixels.resizeErase (previewHeight, previewWidth); for (int y = 0; y < previewHeight; ++y) { for (int x = 0; x < previewWidth; ++x) { const Rgba &inPixel = pixels[y * N][x * N]; PreviewRgba &outPixel = previewPixels[y][x]; outPixel.r = gamma (inPixel.r); outPixel.g = gamma (inPixel.g); outPixel.b = gamma (inPixel.b); outPixel.a = int (IMATH_NAMESPACE::clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f); } } } void writeRgbaWithPreview1 (const char fileName[], const Array2D &pixels, int width, int height) { // // Write an image file with a preview image, version 1: // // - generate the preview image by subsampling the main image // - generate a file header // - add the preview image to the file header // - open the file (this stores the header with the // preview image in the file) // - describe the memory layout of the main image's pixels // - store the main image's pixels in the file // Array2D previewPixels; int previewWidth; int previewHeight; makePreviewImage (pixels, width, height, previewPixels, previewWidth, previewHeight); Header header (width, height); header.setPreviewImage (PreviewImage (previewWidth, previewHeight, &previewPixels[0][0])); RgbaOutputFile file (fileName, header, WRITE_RGBA); file.setFrameBuffer (&pixels[0][0], 1, width); file.writePixels (height); } void writeRgbaWithPreview2 (const char fileName[], int width, int height) { // // Write an image file with a preview image, version 2: // // - generate a file header // - add a dummy preview image to the file header // - open the file (this stores the header with the dummy // preview image in the file) // - render the main image's pixels one scan line at a time, // and store each scan line in the file before rendering // the next scan line // - generate the preview image on the fly, while the main // image is being rendered // - once the main image has been rendered, store the preview // image in the file, overwriting the dummy preview // Array pixels (width); const int N = 8; int previewWidth = width / N; int previewHeight = height / N; Array2D previewPixels (previewHeight, previewWidth); Header header (width, height); header.setPreviewImage (PreviewImage (previewWidth, previewHeight)); RgbaOutputFile file (fileName, header, WRITE_RGBA); file.setFrameBuffer (pixels, 1, 0); for (int y = 0; y < height; ++y) { drawImage7 (pixels, width, height, y); file.writePixels (1); if (y % N == 0) { for (int x = 0; x < width; x += N) { const Rgba &inPixel = pixels[x]; PreviewRgba &outPixel = previewPixels[y / N][x / N]; outPixel.r = gamma (inPixel.r); outPixel.g = gamma (inPixel.g); outPixel.b = gamma (inPixel.b); outPixel.a = int (IMATH_NAMESPACE::clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f); } } } file.updatePreviewImage (&previewPixels[0][0]); } void previewImageExamples () { cout << "\nfiles with preview images\n" << endl; cout << "drawing image then writing file" << endl; int w = 800; int h = 600; Array2D p (h, w); drawImage1 (p, w, h); writeRgbaWithPreview1 ("rgbaWithPreview1.exr", p, w, h); cout << "drawing image while writing file" << endl; writeRgbaWithPreview2 ("rgbaWithPreview2.exr", w, h); cout << endl; } openexr-2.5.7/OpenEXR/IlmImfExamples/previewImageExamples.h000066400000000000000000000034361406177042200236460ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void previewImageExamples (); openexr-2.5.7/OpenEXR/IlmImfExamples/rgbaInterfaceExamples.cpp000066400000000000000000000164531406177042200243140ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how class RgbaInputFile and // class RgbaOutputFile can be used to read and write // OpenEXR image files with 16-bit floating-point red, // green, blue and alpha channels. // //----------------------------------------------------------------------------- #include #include #include #include #include "drawImage.h" #include #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; void writeRgba1 (const char fileName[], const Rgba *pixels, int width, int height) { // // Write an RGBA image using class RgbaOutputFile. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // RgbaOutputFile file (fileName, width, height, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (height); } void writeRgba2 (const char fileName[], const Rgba *pixels, int width, int height, const Box2i &dataWindow) { // // Write an RGBA image using class RgbaOutputFile. // Don't store the whole image in the file, but // crop it according to the given data window. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); RgbaOutputFile file (fileName, displayWindow, dataWindow, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (dataWindow.max.y - dataWindow.min.y + 1); } void writeRgba3 (const char fileName[], const Rgba *pixels, int width, int height, const char comments[], const M44f &cameraTransform) { // // Write an RGBA image using class RgbaOutputFile. // Store two extra attributes in the image header: // a string and a 4x4 transformation matrix. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // Header header (width, height); header.insert ("comments", StringAttribute (comments)); header.insert ("cameraTransform", M44fAttribute (cameraTransform)); RgbaOutputFile file (fileName, header, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (height); } void readRgba1 (const char fileName[], Array2D &pixels, int &width, int &height) { // // Read an RGBA image using class RgbaInputFile: // // - open the file // - allocate memory for the pixels // - describe the memory layout of the pixels // - read the pixels from the file // RgbaInputFile file (fileName); Box2i dw = file.dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; pixels.resizeErase (height, width); file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); file.readPixels (dw.min.y, dw.max.y); } void readRgba2 (const char fileName[]) { // // Read an RGBA image using class RgbaInputFile. // Read the pixels, 10 scan lines at a time, and // store the pixel data in a buffer that is just // large enough to hold 10 scan lines worth of data. // // - open the file // - allocate memory for the pixels // - for each block of 10 scan lines, // describe the memory layout of the pixels, // read the pixels from the file, // process the pixels and discard them // RgbaInputFile file (fileName); Box2i dw = file.dataWindow(); int width = dw.max.x - dw.min.x + 1; Array2D pixels (10, width); while (dw.min.y <= dw.max.y) { file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); file.readPixels (dw.min.y, min (dw.min.y + 9, dw.max.y)); // processPixels (pixels) dw.min.y += 10; } } void readHeader (const char fileName[]) { // // Read an image's header from a file, and if the header // contains comments and camera transformation attributes, // print the values of those attributes. // // - open the file // - get the file header // - look for the attributes // RgbaInputFile file (fileName); const StringAttribute *comments = file.header().findTypedAttribute ("comments"); const M44fAttribute *cameraTransform = file.header().findTypedAttribute ("cameraTransform"); if (comments) cout << "comments\n " << comments->value() << endl; if (cameraTransform) cout << "cameraTransform\n" << cameraTransform->value() << flush; } void rgbaInterfaceExamples () { cout << "\nRGBA images\n" << endl; cout << "drawing image" << endl; int w = 800; int h = 600; Array2D p (h, w); drawImage1 (p, w, h); cout << "writing entire image" << endl; writeRgba1 ("rgba1.exr", &p[0][0], w, h); cout << "writing cropped image" << endl; writeRgba2 ("rgba2.exr", &p[0][0], w, h, Box2i (V2i (w/6, h/6), V2i (w/2, h/2))); cout << "writing image with extra header attributes" << endl; writeRgba3 ("rgba3.exr", &p[0][0], w, h, "may contain peanuts", M44f()); cout << "reading rgba file" << endl; readRgba1 ("rgba2.exr", p, w, h); cout << "reading rgba file into 10-scanline buffer" << endl; readRgba2 ("rgba2.exr"); cout << "reading extra file header attributes" << endl; readHeader ("rgba3.exr"); } openexr-2.5.7/OpenEXR/IlmImfExamples/rgbaInterfaceExamples.h000066400000000000000000000034371406177042200237570ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void rgbaInterfaceExamples (); openexr-2.5.7/OpenEXR/IlmImfExamples/rgbaInterfaceTiledExamples.cpp000066400000000000000000000260211406177042200252660ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Code examples that show how class TiledRgbaInputFile and // class TiledRgbaOutputFile can be used to read and write // OpenEXR image files with 16-bit floating-point red, // green, blue and alpha channels. // //----------------------------------------------------------------------------- #include #include #include #include #include "drawImage.h" #include #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; void writeTiledRgbaONE1 (const char fileName[], const Rgba *pixels, int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with one level using an image-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size ONE_LEVEL, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file out.setFrameBuffer (pixels, 1, width); out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); } void writeTiledRgbaONE2 (const char fileName[], int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with one level using a tile-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size ONE_LEVEL, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file Array2D pixels (tileHeight, tileWidth); for (int tileY = 0; tileY < out.numYTiles (); ++tileY) { for (int tileX = 0; tileX < out.numXTiles (); ++tileX) { Box2i range = out.dataWindowForTile (tileX, tileY); drawImage3 (pixels, width, height, range.min.x, range.max.x + 1, range.min.y, range.max.y + 1, 0, 0); out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], 1, // xStride tileWidth); // yStride out.writeTile (tileX, tileY); } } } void writeTiledRgbaMIP1 (const char fileName[], int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with mipmap levels using an image-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size MIPMAP_LEVELS, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file Array2D pixels (height, width); out.setFrameBuffer (&pixels[0][0], 1, width); for (int level = 0; level < out.numLevels (); ++level) { drawImage4 (pixels, out.levelWidth (level), out.levelHeight (level), 0, out.levelWidth (level), 0, out.levelHeight (level), level, level); out.writeTiles (0, out.numXTiles (level) - 1, 0, out.numYTiles (level) - 1, level); } } void writeTiledRgbaMIP2 (const char fileName[], int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with mipmap levels using a tile-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size MIPMAP_LEVELS, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file Array2D pixels (tileHeight, tileWidth); for (int level = 0; level < out.numLevels (); ++level) { for (int tileY = 0; tileY < out.numYTiles (level); ++tileY) { for (int tileX = 0; tileX < out.numXTiles (level); ++tileX) { Box2i range = out.dataWindowForTile (tileX, tileY, level); drawImage4 (pixels, out.levelWidth (level), out.levelHeight (level), range.min.x, range.max.x + 1, range.min.y, range.max.y + 1, level, level); out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], 1, // xStride tileWidth); // yStride out.writeTile (tileX, tileY, level); } } } } void writeTiledRgbaRIP1 (const char fileName[], int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with ripmap levels using an image-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size RIPMAP_LEVELS, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file Array2D pixels (height, width); out.setFrameBuffer (&pixels[0][0], 1, width); for (int yLevel = 0; yLevel < out.numYLevels (); ++yLevel) { for (int xLevel = 0; xLevel < out.numXLevels (); ++xLevel) { drawImage5 (pixels, out.levelWidth (xLevel), out.levelHeight (yLevel), 0, out.levelWidth (xLevel), 0, out.levelHeight (yLevel), xLevel, yLevel); out.writeTiles (0, out.numXTiles (xLevel) - 1, 0, out.numYTiles (yLevel) - 1, xLevel, yLevel); } } } void writeTiledRgbaRIP2 (const char fileName[], int width, int height, int tileWidth, int tileHeight) { // // Write a tiled image with ripmap levels using a tile-sized framebuffer. // TiledRgbaOutputFile out (fileName, width, height, // image size tileWidth, tileHeight, // tile size RIPMAP_LEVELS, // level mode ROUND_DOWN, // rounding mode WRITE_RGBA); // channels in file Array2D pixels (tileHeight, tileWidth); for (int yLevel = 0; yLevel < out.numYLevels(); ++yLevel) { for (int xLevel = 0; xLevel < out.numXLevels(); ++xLevel) { for (int tileY = 0; tileY < out.numYTiles (yLevel); ++tileY) { for (int tileX = 0; tileX < out.numXTiles (xLevel); ++tileX) { Box2i range = out.dataWindowForTile (tileX, tileY, xLevel, yLevel); drawImage5 (pixels , out.levelWidth(xLevel), out.levelHeight(yLevel), range.min.x, range.max.x + 1, range.min.y, range.max.y + 1, xLevel, yLevel); out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], 1, // xStride tileWidth); // yStride out.writeTile (tileX, tileY, xLevel, yLevel); } } } } } void readTiledRgba1 (const char fileName[], Array2D &pixels, int &width, int &height) { TiledRgbaInputFile in (fileName); Box2i dw = in.dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; int dx = dw.min.x; int dy = dw.min.y; pixels.resizeErase (height, width); in.setFrameBuffer (&pixels[-dy][-dx], 1, width); in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); } void rgbaInterfaceTiledExamples () { cout << "\nRGBA tiled images\n" << endl; const int tw = 100; const int th = 75; int w = 600; int h = 400; cout << "writing tiled image with image-size framebuffer" << endl; Array2D pixels (h, w); drawImage3 (pixels, w, h, 0, w, 0, h, 0); writeTiledRgbaONE1 ("tiledrgba1.exr", &pixels[0][0], w, h, tw, th); cout << "writing tiled image with tile-size framebuffer" << endl; writeTiledRgbaONE2 ("tiledrgba2.exr", w, h, tw, th); cout << "writing tiled mipmap image with image-size framebuffer" << endl; writeTiledRgbaMIP1 ("tiledrgba3.exr", 512, 512, tw, th); cout << "writing tiled mipmap image with tile-size framebuffer" << endl; writeTiledRgbaMIP2 ("tiledrgba4.exr", 512, 512, tw, th); cout << "writing tiled ripmap image with image-size framebuffer" << endl; writeTiledRgbaRIP1 ("tiledrgba5.exr", 256, 256, tw, th); cout << "writing tiled ripmap image with tile-size framebuffer" << endl; writeTiledRgbaRIP2 ("tiledrgba6.exr", 256, 256, tw, th); cout << "reading tiled rgba file" << endl; readTiledRgba1 ("tiledrgba1.exr", pixels, w, h); } openexr-2.5.7/OpenEXR/IlmImfExamples/rgbaInterfaceTiledExamples.h000066400000000000000000000034451406177042200247400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void rgbaInterfaceTiledExamples (); openexr-2.5.7/OpenEXR/IlmImfFuzzTest/000077500000000000000000000000001406177042200173645ustar00rootroot00000000000000openexr-2.5.7/OpenEXR/IlmImfFuzzTest/CMakeLists.txt000066400000000000000000000015031406177042200221230ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. option(OPENEXR_RUN_FUZZ_TESTS "Controls whether to include the fuzz tests (slow) in default test cases, there is a custom fuzz target" OFF) if(OPENEXR_RUN_FUZZ_TESTS) add_executable( IlmImfFuzzTest fuzzFile.cpp main.cpp testFuzzDeepTiles.cpp testFuzzDeepScanLines.cpp testFuzzScanLines.cpp testFuzzTiles.cpp ) target_link_libraries(IlmImfFuzzTest OpenEXR::IlmImf) set_target_properties(IlmImfFuzzTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) add_test(NAME OpenEXR.ImfFuzz COMMAND $) set_tests_properties(OpenEXR.ImfFuzz PROPERTIES TIMEOUT 36000) add_custom_target(fuzz $) add_dependencies(fuzz IlmImfFuzzTest) endif() openexr-2.5.7/OpenEXR/IlmImfFuzzTest/Makefile.am000066400000000000000000000014441406177042200214230ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in if BUILD_IMFFUZZTEST check_PROGRAMS = IlmImfFuzzTest endif IlmImfFuzzTest_SOURCES = fuzzFile.cpp fuzzFile.h main.cpp tmpDir.h \ testFuzzScanLines.cpp testFuzzScanLines.h \ testFuzzDeepScanLines.cpp testFuzzDeepScanLines.h \ testFuzzDeepTiles.cpp testFuzzDeepTiles.h \ testFuzzTiles.cpp testFuzzTiles.h AM_CPPFLAGS = -I$(top_builddir) \ -I$(top_srcdir)/IlmImf \ -I$(top_srcdir)/config \ @ILMBASE_CXXFLAGS@ $(ILMBASE_CFLAGS) $(ZLIB_CFLAGS) LDADD = -L$(top_builddir)/IlmImf \ @ILMBASE_LDFLAGS@ $(ILMBASE_LIBS) \ -lIlmImf $(ZLIB_LIBS) if BUILD_IMFFUZZTEST TESTS = IlmImfFuzzTest endif EXTRA_DIST = CMakeLists.txt openexr-2.5.7/OpenEXR/IlmImfFuzzTest/fuzzFile.cpp000066400000000000000000000136311406177042200216720ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include #include #include "../IlmImfTest/TestUtilFStream.h" // Handle the case when the custom namespace is not exposed #include using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; using namespace std; using namespace IMATH_NAMESPACE; namespace { Int64 lengthOfFile (const char fileName[]) { ifstream ifs; testutil::OpenStreamWithUTF8Name ( ifs, fileName, ios::in | ios_base::binary); if (!ifs) return 0; ifs.seekg (0, ios_base::end); return ifs.tellg(); } void fuzzFile (const char goodFile[], const char brokenFile[], Int64 offset, Int64 windowSize, Rand48 &random, double fuzzAmount) { // // Read the input file. // ifstream ifs; testutil::OpenStreamWithUTF8Name ( ifs, goodFile, ios::in | ios_base::binary); if (!ifs) THROW_ERRNO ("Cannot open file " << goodFile << " (%T)."); ifs.seekg (0, ios_base::end); Int64 fileLength = ifs.tellg(); ifs.seekg (0, ios_base::beg); Array data (fileLength); ifs.read (data, fileLength); if (!ifs) THROW_ERRNO ("Cannot read file " << goodFile << " (%T)." << endl); // // Damage the contents of the file by overwriting some of the bytes // in a window of size windowSize, starting at the specified offset. // for (Int64 i = offset; i < offset + windowSize; ++i) { if (random.nextf() < fuzzAmount) data[i] = char (random.nexti()); } // // Save the damaged file contents in the output file. // ofstream ofs; testutil::OpenStreamWithUTF8Name ( ofs, brokenFile, ios::out | ios_base::binary); if (!ofs) THROW_ERRNO ("Cannot open file " << brokenFile << " (%T)." << endl); ofs.write (data, fileLength); if (!ofs) THROW_ERRNO ("Cannot write file " << brokenFile << " (%T)." << endl); } } // namespace void fuzzFile (const char goodFile[], const char brokenFile[], void (*readFile) (const char[]), int nSlidingWindow, int nFixedWindow, Rand48 &random) { // // We want to test how resilient the IlmImf library is with respect // to malformed OpenEXR input files. In order to do this we damage // a good input file by overwriting parts of it with random data. // We then call function readFile() to try and read the damaged file. // Provided the IlmImf library works as advertised, a try/catch(...) // block in readFile() should be able to handle all errors that could // possibly result from reading a broken OpenEXR file. We repeat // this damage/read cycle many times, overwriting different parts // of the file: // // First we slide a window along the file. The size of the window // is fileSize*2/nSlidingWindow bytes. In each damage/read cycle // we overwrite up to 10% of the bytes the window, try to read the // file, and advance the window by fileSize/nSlidingWindow bytes. // // Next we overwrite up to 10% of the file's first 2048 bytes and // try to read the file. We repeat this nFixedWindow times. // { Int64 fileSize = lengthOfFile (goodFile); Int64 windowSize = fileSize * 2 / nSlidingWindow; Int64 lastWindowOffset = fileSize - windowSize; cout << "sliding " << windowSize << "-byte window" << endl; for (int i = 0; i < nSlidingWindow; ++i) { if (i % 100 == 0) cout << i << "\r" << flush; Int64 offset = lastWindowOffset * i / (nSlidingWindow - 1); double fuzzAmount = random.nextf (0.0, 0.1); fuzzFile (goodFile, brokenFile, offset, windowSize, random, fuzzAmount); readFile (brokenFile); } cout << nSlidingWindow << endl; } { Int64 windowSize = 2048; cout << windowSize << "-byte window at start of file" << endl; for (int i = 0; i < nFixedWindow; ++i) { if (i % 100 == 0) cout << i << "\r" << flush; double fuzzAmount = random.nextf (0.0, 0.1); fuzzFile (goodFile, brokenFile, 0, windowSize, random, fuzzAmount); readFile (brokenFile); } cout << nFixedWindow << endl; } } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/fuzzFile.h000066400000000000000000000040421406177042200213330ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_FUZZ_FILE_H #define INCLUDED_FUZZ_FILE_H #include void fuzzFile (const char goodFile[], const char brokenFile[], void (*readFile) (const char[]), int nSlidingWindow, int nFixedWindow, IMATH_NAMESPACE::Rand48 &random); #endif openexr-2.5.7/OpenEXR/IlmImfFuzzTest/main.cpp000066400000000000000000000116501406177042200210170ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include "ImfNamespace.h" #include "OpenEXRConfigInternal.h" #include "testFuzzDeepScanLines.h" #include "testFuzzDeepTiles.h" #include "testFuzzScanLines.h" #include "testFuzzTiles.h" #include #include #include #include #include #ifdef OPENEXR_IMF_HAVE_LINUX_PROCFS #include #include #endif using std::set; using std::string; using std::cout; using std::endl; #define TEST(x) \ if (helpMode) \ { \ tests.insert(string(#x)); \ } \ else if (argc < 2 || !strcmp (argv[1], #x)) \ { \ testFound = true; \ x(argc==3 ? argv[2] : nullptr); \ } int main (int argc, char *argv[]) { bool helpMode = false; bool testFound = false; if( argc==2 && (strcmp(argv[1],"--help")==0 || strcmp(argv[1],"-h")==0)) { helpMode = true; } set tests; // // If there's a second argument, it's a test file, so make sure it // exists. // if (argc == 3 && access (argv[2], R_OK) != 0) { std::cout << "No such file: " << argv[2] << endl; exit (-1); } TEST (testFuzzScanLines); TEST (testFuzzTiles); TEST (testFuzzDeepScanLines); TEST (testFuzzDeepTiles); if(helpMode) { cout << "IlmImfFuzzTest tests how resilient the IlmImf library is with\n" "respect to broken input files: the program first damages\n" "OpenEXR files by partially overwriting them with random data;\n" "then it tries to read the damaged files. If all goes well,\n" "then the program doesn't crash.\n"; cout << "\n"; cout << "If IlmImfFuzzTest does crash, it will leave a file in the current\n" "directory, or /var/tmp. Running 'IlmImfFuzzTest test file' will\n" "usually quickly reproduce the issue by attempting to reload the file,\n" "(without running the normal tests) and is useful for debugging\n" "the exact cause of the crash or confirming a bug is fixed.\n"; cout << "\n"; cout << "usage:\n"; cout << " IlmImfFuzzTest : with no arguments, run all tests\n"; cout << " IlmImfFuzzTest TEST : run specific TEST only\n"; cout << " IlmImfFuzzTest TEST file : try to read 'file' with given TEST\n"; cout << "\n"; cout << "TEST can be one of the following:\n"; for ( auto i = tests.begin() ; i!= tests.end() ; ++i ) { cout << ' ' << *i << endl; } } else if (!testFound) { cout << "No such test: " << argv[1] << endl; } else { #ifdef OPENEXR_IMF_HAVE_LINUX_PROCFS // // Allow the user to check for file descriptor leaks // cout << "open file descriptors:" << endl; std::stringstream ss; ss << "ls -lG /proc/" << getpid() << "/fd"; system (ss.str().c_str()); #endif } return 0; } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzDeepScanLines.cpp000066400000000000000000000357561406177042200243440ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC and Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include "fuzzFile.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "tmpDir.h" // Handle the case when the custom namespace is not exposed #include #include #include #include #include #include namespace IMF = OPENEXR_IMF_NAMESPACE; using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; namespace { const int width = 90; const int height = 80; const int minX = 10; const int minY = 11; const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); Array2D sampleCount; void generateRandomFile(const char filename[], int channelCount,int parts , Compression compression) { cout << "generating file with " << parts << " parts and compression " << compression << flush; vector

headers(parts); headers[0] = Header(displayWindow, dataWindow, 1, IMATH_NAMESPACE::V2f (0, 0), 1, INCREASING_Y, compression); for (int i = 0; i < channelCount; i++) { stringstream ss; ss << i; string str = ss.str(); headers[0].channels().insert(str, Channel(IMF::FLOAT)); } headers[0].setType(DEEPSCANLINE); headers[0].setName("bob"); for(int p=1;p > data(channelCount); for (int i = 0; i < channelCount; i++) data[i].resizeErase(height, width); sampleCount.resizeErase(height, width); remove (filename); MultiPartOutputFile file(filename,&headers[0],parts); DeepFrameBuffer frameBuffer; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 (char *) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8 sizeof (unsigned int) * 1, // xStride// 9 sizeof (unsigned int) * width)); // yStride// 10 for (int i = 0; i < channelCount; i++) { PixelType type = IMF::FLOAT; stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof(char *); frameBuffer.insert (str, // name // 6 DeepSlice (type, // type // 7 (char *) (&data[i][0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8 pointerSize * 1, // xStride// 9 pointerSize * width, // yStride// 10 sampleSize)); // sampleStride } for(int p=0;p localSampleCount; localSampleCount.resizeErase(height, width); Array > data(channelCount); for (int i = 0; i < channelCount; i++) data[i].resizeErase(height, width); DeepFrameBuffer frameBuffer; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 (char *) (&localSampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8) sizeof (unsigned int) * 1, // xStride// 9 sizeof (unsigned int) * width)); // yStride// 10 vector read_channel(channelCount); for (int i = 0; i < channelCount; i++) { PixelType type = IMF::FLOAT; stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof (char *); frameBuffer.insert (str, DeepSlice (type, (char *) (&data[i][0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8) pointerSize * 1, // xStride// 9 pointerSize * width, // yStride// 10 sampleSize)); // sampleStride } file.setFrameBuffer(frameBuffer); file.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) { for (int j = 0; j < width; j++) { for (int k = 0; k < channelCount; k++) { data[k][i][j] = new float[localSampleCount[i][j]]; } } } try{ file.readPixels(dataWindow.min.y, dataWindow.max.y); }catch(...) { // if readPixels excepts we must clean up assert (true); } for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) for (int k = 0; k < channelCount; k++) { delete[] (float*) data[k][i][j]; } }catch(std::exception & e) { /* ... yeah, that's likely to happen a lot ... */ assert (true); } try{ MultiPartInputFile file(filename, 8); for(int p=0;p localSampleCount; localSampleCount.resizeErase(height, width); Array > data(channelCount); for (int i = 0; i < channelCount; i++) data[i].resizeErase(height, width); DeepFrameBuffer frameBuffer; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 (char *) (&localSampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8) sizeof (unsigned int) * 1, // xStride// 9 sizeof (unsigned int) * width)); // yStride// 10 vector read_channel(channelCount); for (int i = 0; i < channelCount; i++) { PixelType type = IMF::FLOAT; stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof (char *); frameBuffer.insert (str, DeepSlice (type, (char *) (&data[i][0][0] - dataWindow.min.x - dataWindow.min.y * width), // base // 8) pointerSize * 1, // xStride// 9 pointerSize * width, // yStride// 10 sampleSize)); // sampleStride } inpart.setFrameBuffer(frameBuffer); inpart.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) { for (int j = 0; j < width; j++) { for (int k = 0; k < channelCount; k++) { data[k][i][j] = new float[localSampleCount[i][j]]; } } } try{ inpart.readPixels(dataWindow.min.y, dataWindow.max.y); }catch(...) { assert (true); } for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { for (int k = 0; k < channelCount; k++) { delete[] (float*) data[k][i][j]; } } } } }catch(...) { // nothing assert (true); } } void fuzzDeepScanLines (int numThreads, Rand48 &random) { if (ILMTHREAD_NAMESPACE::supportsThreads()) { setGlobalThreadCount (numThreads); cout << "\nnumber of threads: " << globalThreadCount() << endl; } Header::setMaxImageSize (10000, 10000); const char *goodFile = IMF_TMP_DIR "imf_test_deep_scanline_file_fuzz_good.exr"; const char *brokenFile = IMF_TMP_DIR "imf_test_deep_scanline_file_fuzz_broken.exr"; // read file if it already exists: allows re-testing reading of broken file readFile(brokenFile); for(int parts=1 ; parts < 3 ; parts++) { for(int comp_method=0;comp_method<2;comp_method++) { generateRandomFile(goodFile,8,parts,comp_method==0 ? NO_COMPRESSION : ZIPS_COMPRESSION); fuzzFile (goodFile, brokenFile, readFile, 5000, 3000, random); } } remove (goodFile); remove (brokenFile); } } // namespace void testFuzzDeepScanLines (const char* file) { try { if(file) { readFile(file); } else { cout << "Testing deep scanline-based files " "with randomly inserted errors" << endl; Rand48 random (1); fuzzDeepScanLines (0, random); if (ILMTHREAD_NAMESPACE::supportsThreads()) fuzzDeepScanLines (2, random); cout << "ok\n" << endl; } } catch (const std::exception &e) { cerr << "ERROR -- caught exception: " << e.what() << endl; assert (false); } } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzDeepScanLines.h000066400000000000000000000035141406177042200237740ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC and Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFuzzDeepScanLines (const char* file); openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzDeepTiles.cpp000066400000000000000000000445561406177042200235430ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC and Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include "fuzzFile.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tmpDir.h" // Handle the case when the custom namespace is not exposed #include #include #include #include #include #include namespace IMF = OPENEXR_IMF_NAMESPACE; using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; namespace { const int width = 127; const int height = 46; const int minX = 10; const int minY = 11; const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); Array2D< Array2D > sampleCountWhole; Header header; void generateRandomFile(const char filename[], int channelCount, int parts , Compression compression) { vector
headers(parts); cout << "generating " << flush; headers[0] = Header(displayWindow, dataWindow, 1, IMATH_NAMESPACE::V2f (0, 0), 1, INCREASING_Y, compression ); cout << "compression " << compression << " " << flush; for (int i = 0; i < channelCount; i++) { ostringstream ss; ss << i; string str = ss.str(); headers[0].channels().insert(str, Channel(IMF::FLOAT)); } headers[0].setType(DEEPTILE); headers[0].setTileDescription( TileDescription(rand() % width + 1, rand() % height + 1, RIPMAP_LEVELS)); headers[0].setName("bob"); for(int p=1;p > data(channelCount); for (int i = 0; i < channelCount; i++) { data[i].resizeErase(height, width); } Array2D sampleCount; sampleCount.resizeErase(height, width); remove (filename); MultiPartOutputFile file(filename, &headers[0], parts); DeepTiledOutputPart part(file,0); cout << "tileSizeX " << part.tileXSize() << " tileSizeY " << part.tileYSize() << " "; sampleCountWhole.resizeErase(part.numYLevels(), part.numXLevels()); for (int i = 0; i < sampleCountWhole.height(); i++) { for (int j = 0; j < sampleCountWhole.width(); j++) { sampleCountWhole[i][j].resizeErase(height, width); } } DeepFrameBuffer frameBuffer; int memOffset = dataWindow.min.x + dataWindow.min.y * width; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, (char *) (&sampleCount[0][0] - memOffset), sizeof (unsigned int) * 1, sizeof (unsigned int) * width) ); for (int i = 0; i < channelCount; i++) { stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof (char *); frameBuffer.insert (str, DeepSlice (IMF::FLOAT, (char *) (&data[i][0][0] - memOffset), pointerSize * 1, pointerSize * width, sampleSize)); } for(int part=0;part( data[k][y][x] ); data[k][y][x]=0; } } } }// next level }//next level }//next part } void readFile(const char filename[]) { try { DeepTiledInputFile file(filename, 8); const Header& fileHeader = file.header(); Array2D localSampleCount; Box2i dataWindow = fileHeader.dataWindow(); int height = dataWindow.size().y+1; int width = dataWindow.size().x+1; localSampleCount.resizeErase(height, width); int channelCount=0; for(ChannelList::ConstIterator i=fileHeader.channels().begin();i!=fileHeader.channels().end();++i, channelCount++); Array > data(channelCount); for (int i = 0; i < channelCount; i++) { data[i].resizeErase(height, width); } DeepFrameBuffer frameBuffer; int memOffset = dataWindow.min.x + dataWindow.min.y * width; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, (char *) (&localSampleCount[0][0] - memOffset), sizeof (unsigned int) * 1, sizeof (unsigned int) * width) ); for (int i = 0; i < channelCount; i++) { stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof (char *); frameBuffer.insert (str, DeepSlice (IMF::FLOAT, (char *) (&data[i][0][0] - memOffset), pointerSize * 1, pointerSize * width, sampleSize) ); } file.setFrameBuffer(frameBuffer); for (int ly = 0; ly < file.numYLevels(); ly++) { for (int lx = 0; lx < file.numXLevels(); lx++) { Box2i dataWindowL = file.dataWindowForLevel(lx, ly); file.readPixelSampleCounts(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); for (int i = 0; i < file.numYTiles(ly); i++) { for (int j = 0; j < file.numXTiles(lx); j++) { Box2i box = file.dataWindowForTile(j, i, lx, ly); for (int y = box.min.y; y <= box.max.y; y++) for (int x = box.min.x; x <= box.max.x; x++) { int dwy = y - dataWindowL.min.y; int dwx = x - dataWindowL.min.x; for (int k = 0; k < channelCount; k++) { data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; } } } } try{ file.readTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); }catch(...) { // catch exceptions thrown by readTiles, clean up anyway assert (true); } for (int i = 0; i < file.levelHeight(ly); i++) { for (int j = 0; j < file.levelWidth(lx); j++) { for (int k = 0; k < channelCount; k++) { delete[] (float*) data[k][i][j]; } } } } } }catch(std::exception & e) { /* expect to get exceptions*/ assert (true); } // test multipart inputfile interface try { MultiPartInputFile file(filename, 8); for(int p=0;p localSampleCount; Box2i dataWindow = fileHeader.dataWindow(); int height = dataWindow.size().y+1; int width = dataWindow.size().x+1; localSampleCount.resizeErase(height, width); int channelCount=0; for(ChannelList::ConstIterator i=fileHeader.channels().begin();i!=fileHeader.channels().end();++i, channelCount++); Array > data(channelCount); for (int i = 0; i < channelCount; i++) { data[i].resizeErase(height, width); } DeepFrameBuffer frameBuffer; int memOffset = dataWindow.min.x + dataWindow.min.y * width; frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, (char *) (&localSampleCount[0][0] - memOffset), sizeof (unsigned int) * 1, sizeof (unsigned int) * width) ); for (int i = 0; i < channelCount; i++) { stringstream ss; ss << i; string str = ss.str(); int sampleSize = sizeof (float); int pointerSize = sizeof (char *); frameBuffer.insert (str, DeepSlice (IMF::FLOAT, (char *) (&data[i][0][0] - memOffset), pointerSize * 1, pointerSize * width, sampleSize) ); } part.setFrameBuffer(frameBuffer); for (int ly = 0; ly < part.numYLevels(); ly++) { for (int lx = 0; lx < part.numXLevels(); lx++) { Box2i dataWindowL = part.dataWindowForLevel(lx, ly); part.readPixelSampleCounts(0, part.numXTiles(lx) - 1, 0, part.numYTiles(ly) - 1, lx, ly); for (int i = 0; i < part.numYTiles(ly); i++) { for (int j = 0; j < part.numXTiles(lx); j++) { Box2i box = part.dataWindowForTile(j, i, lx, ly); for (int y = box.min.y; y <= box.max.y; y++) for (int x = box.min.x; x <= box.max.x; x++) { int dwy = y - dataWindowL.min.y; int dwx = x - dataWindowL.min.x; for (int k = 0; k < channelCount; k++) { data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; } } } } try{ part.readTiles(0, part.numXTiles(lx) - 1, 0, part.numYTiles(ly) - 1, lx, ly); }catch(...) { assert (true); } for (int i = 0; i < part.levelHeight(ly); i++) { for (int j = 0; j < part.levelWidth(lx); j++) { for (int k = 0; k < channelCount; k++) { delete[] (float*) data[k][i][j]; } } } } } } }catch(std::exception & e) { /* expect to get exceptions*/ assert (true); } } void fuzzDeepTiles (int numThreads, Rand48 &random) { if (ILMTHREAD_NAMESPACE::supportsThreads()) { setGlobalThreadCount (numThreads); cout << "\nnumber of threads: " << globalThreadCount() << endl; } Header::setMaxImageSize (10000, 10000); const char *goodFile = IMF_TMP_DIR "imf_test_deep_tile_file_fuzz_good.exr"; const char *brokenFile = IMF_TMP_DIR "imf_test_deel_tile_file_fuzz_broken.exr"; // read file if it already exists: allows re-testing reading of broken file readFile(brokenFile); for(int parts=1;parts<3;parts++) { for(int comp_method=0;comp_method<2;comp_method++) { generateRandomFile(goodFile,8,parts , comp_method==0 ? NO_COMPRESSION : ZIPS_COMPRESSION); fuzzFile (goodFile, brokenFile, readFile, 5000, 3000, random); } } remove (goodFile); remove (brokenFile); } } // namespace void testFuzzDeepTiles (const char* file) { try { if(file) { readFile(file); } else { cout << "Testing deep tile-based files " "with randomly inserted errors" << endl; Rand48 random (1); fuzzDeepTiles (0, random); if (ILMTHREAD_NAMESPACE::supportsThreads()) fuzzDeepTiles (2, random); cout << "ok\n" << endl; } } catch (const std::exception &e) { cerr << "ERROR -- caught exception: " << e.what() << endl; assert (false); } } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzDeepTiles.h000066400000000000000000000035101406177042200231710ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2013, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC and Weta Digital Ltd // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFuzzDeepTiles (const char* file); openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzScanLines.cpp000066400000000000000000000173541406177042200235400ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tmpDir.h" #include "fuzzFile.h" // Handle the case when the custom namespace is not exposed #include #include using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; using namespace std; using namespace IMATH_NAMESPACE; namespace { void fillPixels (Array2D &pixels, int w, int h) { for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { Rgba &p = pixels[y][x]; p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); p.a = (p.r + p.b + p.g) / 3.0; } } } void writeImage (const char fileName[], int width, int height, const Array2D &pixels, int parts, Compression comp) { // // Save the image with the specified compression. // cout << parts << " parts with compression: " << comp << endl; Header header (width, height); header.compression() = comp; if(parts==1) { RgbaOutputFile out (fileName, header, WRITE_RGBA); out.setFrameBuffer (&pixels[0][0], 1, width); out.writePixels (height); }else{ header.setType(SCANLINEIMAGE); header.channels().insert("R",Channel(HALF)); header.channels().insert("G",Channel(HALF)); header.channels().insert("B",Channel(HALF)); header.channels().insert("A",Channel(HALF)); vector
headers(parts); for(int i=0;i (1 << 24)) return; Array pixels (w); in.setFrameBuffer (&pixels[-dx], 1, 0); for (int y = dw.min.y; y <= dw.max.y; ++y) in.readPixels (y); }catch(...) { // expect exceptions assert (true); } try{ // now test Multipart interface (even for single part files) MultiPartInputFile file(fileName); for(int p=0;p (1 << 24)) return; Array pixels (w); FrameBuffer i; i.insert("R",Slice(HALF,(char *)&(pixels[-dx].r),sizeof(Rgba),0)); i.insert("G",Slice(HALF,(char *)&(pixels[-dx].g),sizeof(Rgba),0)); i.insert("B",Slice(HALF,(char *)&(pixels[-dx].b),sizeof(Rgba),0)); i.insert("A",Slice(HALF,(char *)&(pixels[-dx].a),sizeof(Rgba),0)); in.setFrameBuffer (i); for (int y = dw.min.y; y <= dw.max.y; ++y) in.readPixels (y); } } catch (...) { // empty assert (true); } } void fuzzScanLines (int numThreads, Rand48 &random) { if (ILMTHREAD_NAMESPACE::supportsThreads()) { setGlobalThreadCount (numThreads); cout << "\nnumber of threads: " << globalThreadCount() << endl; } Header::setMaxImageSize (10000, 10000); const int W = 217; const int H = 197; Array2D pixels (H, W); fillPixels (pixels, W, H); const char *goodFile = IMF_TMP_DIR "imf_test_scanline_file_fuzz_good.exr"; const char *brokenFile = IMF_TMP_DIR "imf_test_scanline_file_fuzz_broken.exr"; // re-attempt to read broken file if it still remains on disk from previous aborted run readImage(brokenFile); for (int parts = 1 ; parts<4 ; ++parts) { for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) { writeImage (goodFile, W, H, pixels, parts,Compression (comp)); fuzzFile (goodFile, brokenFile, readImage, 5000, 3000, random); } } remove (goodFile); remove (brokenFile); } } // namespace void testFuzzScanLines (const char* file) { try { if(file) { readImage(file); } else { cout << "Testing scanline-based files " "with randomly inserted errors" << endl; Rand48 random (1); fuzzScanLines (0, random); if (ILMTHREAD_NAMESPACE::supportsThreads()) fuzzScanLines (2, random); cout << "ok\n" << endl; } } catch (const std::exception &e) { cerr << "ERROR -- caught exception: " << e.what() << endl; assert (false); } } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzScanLines.h000066400000000000000000000034631406177042200232010ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFuzzScanLines (const char* file); openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzTiles.cpp000066400000000000000000000316241406177042200227350ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #ifdef NDEBUG # undef NDEBUG #endif #include #include #include #include #include #include #include #include #include #include #include // Handle the case when the custom namespace is not exposed #include #include #include #include #include #include #include using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; using namespace std; using namespace IMATH_NAMESPACE; namespace { void fillPixels (Array2D &pixels, int w, int h) { for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { Rgba &p = pixels[y][x]; p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); p.a = (p.r + p.b + p.g) / 3.0; } } } void writeImageONE (const char fileName[], int width, int height, int xSize, int ySize, int parts, Compression comp) { cout << "levelMode 0" << ", compression " << comp << " parts " << parts << endl; Header header (width, height); header.lineOrder() = INCREASING_Y; header.compression() = comp; Array2D pixels (height, width); fillPixels (pixels, width, height); if(parts==1) { TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, xSize, ySize, ONE_LEVEL); out.setFrameBuffer (&pixels[0][0], 1, width); out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); }else{ header.setTileDescription(TileDescription(xSize,ySize,ONE_LEVEL)); header.setType(TILEDIMAGE); header.channels().insert("R",Channel(HALF)); header.channels().insert("G",Channel(HALF)); header.channels().insert("B",Channel(HALF)); header.channels().insert("A",Channel(HALF)); FrameBuffer f; f.insert("R",Slice(HALF,(char *) &(pixels[0][0].r),sizeof(Rgba),width*sizeof(Rgba))); f.insert("G",Slice(HALF,(char *) &(pixels[0][0].g),sizeof(Rgba),width*sizeof(Rgba))); f.insert("B",Slice(HALF,(char *) &(pixels[0][0].b),sizeof(Rgba),width*sizeof(Rgba))); f.insert("A",Slice(HALF,(char *) &(pixels[0][0].a),sizeof(Rgba),width*sizeof(Rgba))); vector
headers(parts); for(int p=0;p pixels (h, w); in.setFrameBuffer (&pixels[-dwy][-dwx], 1, w); in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); } catch (...) { // empty assert (true); } try { // attempt MultiPart interface MultiPartInputFile in(fileName); for(int p=0;p pixels (h, w); FrameBuffer i; i.insert("R",Slice(HALF,(char *)&(pixels[-dwy][-dwx].r),sizeof(Rgba),w*sizeof(Rgba))); i.insert("G",Slice(HALF,(char *)&(pixels[-dwy][-dwx].g),sizeof(Rgba),w*sizeof(Rgba))); i.insert("B",Slice(HALF,(char *)&(pixels[-dwy][-dwx].b),sizeof(Rgba),w*sizeof(Rgba))); i.insert("A",Slice(HALF,(char *)&(pixels[-dwy][-dwx].a),sizeof(Rgba),w*sizeof(Rgba))); inpart.setFrameBuffer (i); inpart.readTiles (0, inpart.numXTiles() - 1, 0, inpart.numYTiles() - 1); } } catch (...) { // empty assert (true); } } void writeImageMIP (const char fileName[], int width, int height, int xSize, int ySize, int parts, ///\todo support multipart MIP files Compression comp) { cout << "levelMode 1" << ", compression " << comp << endl; Header header (width, height); header.lineOrder() = INCREASING_Y; header.compression() = comp; Array < Array2D > levels; TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, xSize, ySize, MIPMAP_LEVELS, ROUND_DOWN); int numLevels = out.numLevels(); levels.resizeErase (numLevels); for (int level = 0; level < out.numLevels(); ++level) { int levelWidth = out.levelWidth(level); int levelHeight = out.levelHeight(level); levels[level].resizeErase(levelHeight, levelWidth); fillPixels (levels[level], levelWidth, levelHeight); out.setFrameBuffer (&(levels[level])[0][0], 1, levelWidth); out.writeTiles (0, out.numXTiles(level) - 1, 0, out.numYTiles(level) - 1, level); } } void readImageMIP (const char fileName[]) { // // Try to read the specified mipmap file, which may be damaged. // Reading should either succeed or throw an exception, but it // should not cause a crash. // try { TiledRgbaInputFile in (fileName); const Box2i &dw = in.dataWindow(); int dwx = dw.min.x; int dwy = dw.min.y; int numLevels = in.numLevels(); Array < Array2D > levels2 (numLevels); for (int level = 0; level < numLevels; ++level) { int levelWidth = in.levelWidth(level); int levelHeight = in.levelHeight(level); levels2[level].resizeErase(levelHeight, levelWidth); in.setFrameBuffer (&(levels2[level])[-dwy][-dwx], 1, levelWidth); in.readTiles (0, in.numXTiles(level) - 1, 0, in.numYTiles(level) - 1, level); } } catch (...) { // empty assert (true); } } void writeImageRIP (const char fileName[], int width, int height, int xSize, int ySize, int parts, ///\todo support multipart RIP files Compression comp) { cout << "levelMode 2" << ", compression " << comp << endl; Header header (width, height); header.lineOrder() = INCREASING_Y; header.compression() = comp; Array2D < Array2D > levels; TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, xSize, ySize, RIPMAP_LEVELS, ROUND_UP); levels.resizeErase (out.numYLevels(), out.numXLevels()); for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) { for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) { int levelWidth = out.levelWidth(xlevel); int levelHeight = out.levelHeight(ylevel); levels[ylevel][xlevel].resizeErase(levelHeight, levelWidth); fillPixels (levels[ylevel][xlevel], levelWidth, levelHeight); out.setFrameBuffer (&(levels[ylevel][xlevel])[0][0], 1, levelWidth); out.writeTiles (0, out.numXTiles(xlevel) - 1, 0, out.numYTiles(ylevel) - 1, xlevel, ylevel); } } } void readImageRIP (const char fileName[]) { // // Try to read the specified ripmap file, which may be damaged. // Reading should either succeed or throw an exception, but it // should not cause a crash. // try { TiledRgbaInputFile in (fileName); const Box2i &dw = in.dataWindow(); int dwx = dw.min.x; int dwy = dw.min.y; int numXLevels = in.numXLevels(); int numYLevels = in.numYLevels(); Array2D < Array2D > levels2 (numYLevels, numXLevels); for (int ylevel = 0; ylevel < numYLevels; ++ylevel) { for (int xlevel = 0; xlevel < numXLevels; ++xlevel) { int levelWidth = in.levelWidth(xlevel); int levelHeight = in.levelHeight(ylevel); levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth); in.setFrameBuffer (&(levels2[ylevel][xlevel])[-dwy][-dwx], 1, levelWidth); in.readTiles (0, in.numXTiles(xlevel) - 1, 0, in.numYTiles(ylevel) - 1, xlevel, ylevel); } } } catch (...) { // empty assert (true); } } void fuzzTiles (int numThreads, Rand48 &random) { if (ILMTHREAD_NAMESPACE::supportsThreads()) { setGlobalThreadCount (numThreads); cout << "\nnumber of threads: " << globalThreadCount() << endl; } Header::setMaxImageSize (10000, 10000); Header::setMaxTileSize (10000, 10000); const int W = 217; const int H = 197; const int TW = 64; const int TH = 64; const char *goodFile = IMF_TMP_DIR "imf_test_tile_file_fuzz_good.exr"; const char *brokenFile = IMF_TMP_DIR "imf_test_tile_file_fuzz_broken.exr"; for (int parts = 1 ; parts < 3 ; parts++) { for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) { writeImageONE (goodFile, W, H, TW, TH, parts , Compression (comp)); fuzzFile (goodFile, brokenFile, readImageONE, 5000, 3000, random); if(parts==1) { writeImageMIP (goodFile, W, H, TW, TH, parts , Compression (comp)); fuzzFile (goodFile, brokenFile, readImageMIP, 5000, 3000, random); writeImageRIP (goodFile, W, H, TW, TH, parts , Compression (comp)); fuzzFile (goodFile, brokenFile, readImageRIP, 5000, 3000, random); } } } remove (goodFile); remove (brokenFile); } } // namespace void testFuzzTiles (const char* file) { try { if(file) { readImageONE(file); readImageMIP(file); readImageRIP(file); } else { cout << "Testing tile-based files " "with randomly inserted errors" << endl; Rand48 random (5); fuzzTiles (0, random); if (ILMTHREAD_NAMESPACE::supportsThreads()) fuzzTiles (2, random); cout << "ok\n" << endl; } } catch (const std::exception &e) { cerr << "ERROR -- caught exception: " << e.what() << endl; assert (false); } } openexr-2.5.7/OpenEXR/IlmImfFuzzTest/testFuzzTiles.h000066400000000000000000000034571406177042200224050ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// void testFuzzTiles (const char* file); openexr-2.5.7/OpenEXR/IlmImfFuzzTest/tmpDir.h000066400000000000000000000036201406177042200207750ustar00rootroot00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2007, Industrial Light & Magic, a division of Lucas // Digital Ltd. LLC // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Industrial Light & Magic 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 // OWNER 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. // /////////////////////////////////////////////////////////////////////////// #if defined(_WIN32) || defined(_WIN64) || defined(__ANDROID__) #define IMF_TMP_DIR "" #else #define IMF_TMP_DIR "/var/tmp/" #endif openexr-2.5.7/OpenEXR/IlmImfTest/000077500000000000000000000000001406177042200165055ustar00rootroot00000000000000openexr-2.5.7/OpenEXR/IlmImfTest/CMakeLists.txt000066400000000000000000000037251406177042200212540ustar00rootroot00000000000000# SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenEXR Project. add_executable(IlmImfTest compareB44.cpp compareDwa.cpp compareFloat.cpp main.cpp testAttributes.cpp testBackwardCompatibility.cpp testBadTypeAttributes.cpp testChannels.cpp testCompositeDeepScanLine.cpp testCompression.cpp testConversion.cpp testCopyDeepScanLine.cpp testCopyDeepTiled.cpp testCopyMultiPartFile.cpp testCopyPixels.cpp testCustomAttributes.cpp testDeepScanLineBasic.cpp testDeepScanLineHuge.cpp testDeepScanLineMultipleRead.cpp testDeepTiledBasic.cpp testDwaCompressorSimd.cpp testExistingStreams.cpp testFutureProofing.cpp testHuf.cpp testInputPart.cpp testIsComplete.cpp testLineOrder.cpp testLut.cpp testMagic.cpp testMalformedImages.cpp testMultiPartApi.cpp testMultiPartFileMixingBasic.cpp testMultiPartSharedAttributes.cpp testMultiPartThreading.cpp testMultiScanlinePartThreading.cpp testMultiTiledPartThreading.cpp testMultiView.cpp testNativeFormat.cpp testOptimized.cpp testOptimizedInterleavePatterns.cpp testPartHelper.cpp testPreviewImage.cpp testRgba.cpp testRgbaThreading.cpp testRle.cpp testSampleImages.cpp testScanLineApi.cpp testSharedFrameBuffer.cpp testStandardAttributes.cpp testTiledCompression.cpp testTiledCopyPixels.cpp testTiledLineOrder.cpp testTiledRgba.cpp testTiledYa.cpp testWav.cpp testXdr.cpp testYca.cpp testLargeDataWindowOffsets.cpp testB44ExpLogTable.cpp testDwaLookups.cpp random.cpp ) target_compile_definitions(IlmImfTest PRIVATE ILM_IMF_TEST_IMAGEDIR="${CMAKE_CURRENT_SOURCE_DIR}/") target_link_libraries(IlmImfTest OpenEXR::IlmImf) set_target_properties(IlmImfTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) if(WIN32 AND (BUILD_SHARED_LIBS OR OPENEXR_BUILD_BOTH_STATIC_SHARED)) target_compile_definitions(IlmImfTest PRIVATE OPENEXR_DLL) endif() add_test(NAME OpenEXR.IlmImf COMMAND $) openexr-2.5.7/OpenEXR/IlmImfTest/Makefile.am000066400000000000000000000107611406177042200205460ustar00rootroot00000000000000## ## SPDX-License-Identifier: BSD-3-Clause ## Copyright Contributors to the OpenEXR Project. ## ## Process this file with automake to produce Makefile.in check_PROGRAMS = IlmImfTest IlmImfTest_SOURCES = main.cpp tmpDir.h testAttributes.cpp testChannels.cpp \ testCompression.cpp testCopyPixels.cpp \ testCustomAttributes.cpp testHuf.cpp testLineOrder.cpp \ testMalformedImages.cpp \ testLut.cpp testRgba.cpp testRgbaThreading.cpp \ testSampleImages.cpp testSharedFrameBuffer.cpp \ testWav.cpp testXdr.cpp testAttributes.h testChannels.h \ testCompression.h testCopyPixels.h \ testCustomAttributes.h testHuf.h testLineOrder.h \ testLut.h testRgba.h testRgbaThreading.h \ testMalformedImages.h \ testSampleImages.h testWav.h testSharedFrameBuffer.h \ testXdr.h testConversion.cpp testConversion.h \ testNativeFormat.cpp testNativeFormat.h \ testPreviewImage.cpp testPreviewImage.h \ testMagic.cpp testMagic.h testStandardAttributes.cpp \ testStandardAttributes.h testExistingStreams.cpp \ testExistingStreams.h testScanLineApi.cpp \ testScanLineApi.h testTiledCompression.cpp \ testTiledCompression.h testTiledCopyPixels.cpp \ testTiledCopyPixels.h testTiledLineOrder.cpp \ testTiledLineOrder.h testTiledRgba.cpp \ testTiledRgba.h compareFloat.h compareFloat.cpp \ testTiledYa.cpp testTiledYa.h \ testYca.cpp testYca.h compareB44.h compareB44.cpp \ testMultiView.cpp testMultiView.h \ testIsComplete.cpp testIsComplete.h \ testMultiPartApi.cpp testMultiPartApi.h \ testMultiPartThreading.cpp testMultiPartThreading.h \ testMultiScanlinePartThreading.cpp testMultiScanlinePartThreading.h \ testMultiTiledPartThreading.cpp testMultiTiledPartThreading.h \ testDeepScanLineBasic.cpp testDeepScanLineBasic.h \ testDeepTiledBasic.cpp testDeepTiledBasic.h \ testMultiPartFileMixingBasic.cpp testMultiPartFileMixingBasic.h \ testMultiPartSharedAttributes.cpp testMultiPartSharedAttributes.h \ testBackwardCompatibility.cpp testBackwardCompatibility.h \ testCopyDeepScanLine.cpp testCopyDeepScanLine.h \ testCopyDeepTiled.cpp testCopyDeepTiled.h \ testCopyMultiPartFile.h testCopyMultiPartFile.cpp \ testCompositeDeepScanLine.h testCompositeDeepScanLine.cpp \ testInputPart.cpp testInputPart.h \ testDeepScanLineMultipleRead.h testDeepScanLineMultipleRead.cpp \ testPartHelper.h testPartHelper.cpp \ testOptimized.cpp testOptimized.h \ testOptimizedInterleavePatterns.cpp testOptimizedInterleavePatterns.h \ testBadTypeAttributes.cpp testBadTypeAttributes.h \ testFutureProofing.cpp testFutureProofing.h \ compareDwa.cpp compareDwa.h \ testDwaCompressorSimd.cpp testDwaCompressorSimd.h \ testLargeDataWindowOffsets.cpp testLargeDataWindowOffsets.h \ testRle.cpp testRle.h \ testB44ExpLogTable.cpp testB44ExpLogTable.h \ testDwaLookups.cpp testDwaLookups.h \ bswap_32.h random.cpp AM_CPPFLAGS = -DILM_IMF_TEST_IMAGEDIR=\"$(srcdir)/\" if BUILD_IMFHUGETEST IlmImfTest_SOURCES += testDeepScanLineHuge.cpp testDeepScanLineHuge.h AM_CPPFLAGS += -DENABLE_IMFHUGETEST endif AM_CPPFLAGS += -I$(top_builddir) \ -I$(top_srcdir)/IlmImf \ -I$(top_srcdir)/config \ @ILMBASE_CXXFLAGS@ $(ILMBASE_CFLAGS) $(ZLIB_CFLAGS) LDADD = -L$(top_builddir)/IlmImf \ @ILMBASE_LDFLAGS@ $(ILMBASE_LIBS) \ -lIlmImf $(ZLIB_LIBS) TESTS = IlmImfTest EXTRA_DIST = CMakeLists.txt \ comp_b44.exr \ comp_b44_piz.exr \ comp_bad_bounds_piz.exr \ comp_bad_neg_bounds_pxr24.exr \ comp_bad_pos_bounds_piz.exr \ comp_bad_pos_bounds_pxr24.exr \ comp_dwaa_piz.exr \ comp_dwaa_v1.exr \ comp_dwaa_v2.exr \ comp_dwab_piz.exr \ comp_dwab_v1.exr \ comp_dwab_v2.exr \ comp_early_eof_piz.exr \ comp_invalid_unknown.exr \ comp_none.exr \ comp_piz.exr \ comp_rle.exr \ comp_short_decode_piz.exr \ comp_zip.exr \ comp_zips.exr \ invalid.exr \ invalid_shared_attrs_multipart.exr \ lineOrder_decreasing.exr \ lineOrder_increasing.exr \ scanline_with_deepscanline_type.exr \ scanline_with_deeptiled_type.exr \ scanline_with_tiledimage_type.exr \ test_native1.exr \ test_native2.exr \ tiled.exr \ tiled_with_deepscanline_type.exr \ tiled_with_deeptile_type.exr \ tiled_with_scanlineimage_type.exr \ v1.7.test.1.exr \ v1.7.test.interleaved.exr \ v1.7.test.planar.exr \ v1.7.test.tiled.exr openexr-2.5.7/OpenEXR/IlmImfTest/TestUtilFStream.h000066400000000000000000000075251406177042200217260ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. #pragma once #ifndef INCLUDE_TestUtilFStream_h_ #define INCLUDE_TestUtilFStream_h_ 1 #include #include #ifdef _WIN32 # define VC_EXTRALEAN # include # include # include # include # include # include # include #endif namespace testutil { #ifdef _WIN32 inline std::wstring WidenFilename (const char* filename) { std::wstring ret; int fnlen = static_cast (strlen (filename)); int len = MultiByteToWideChar (CP_UTF8, 0, filename, fnlen, NULL, 0); if (len > 0) { ret.resize (len); MultiByteToWideChar (CP_UTF8, 0, filename, fnlen, &ret[0], len); } return ret; } // This is a big work around mechanism for compiling using mingw / gcc under windows // until mingw 9 where they add the wide filename version of open # if (defined(__GLIBCXX__) && !(defined(_GLIBCXX_HAVE_WFOPEN) && defined(_GLIBCXX_USE_WCHAR_T))) # define USE_WIDEN_FILEBUF 1 template class WidenFilebuf : public std::basic_filebuf { inline int mode_to_flags (std::ios_base::openmode mode) { int flags = 0; if (mode & std::ios_base::in) flags |= _O_RDONLY; if (mode & std::ios_base::out) { flags |= _O_WRONLY; flags |= _O_CREAT; if (mode & std::ios_base::app) flags |= _O_APPEND; if (mode & std::ios_base::trunc) flags |= _O_TRUNC; } if (mode & std::ios_base::binary) flags |= _O_BINARY; else flags |= _O_TEXT; return flags; } public: using base_filebuf = std::basic_filebuf; inline base_filebuf* wide_open (std::wstring& fn, std::ios_base::openmode m) { if (this->is_open () || fn.empty ()) return nullptr; int fd; errno_t e = _wsopen_s ( &fd, fn.c_str (), mode_to_flags (m), _SH_DENYNO, _S_IREAD | _S_IWRITE); if (e != 0) return nullptr; // sys_open will do an fdopen internally which will then clean up the fd upon close this->_M_file.sys_open (fd, m); if (this->is_open ()) { // reset the internal state, these members are consistent between gcc versions 4.3 - 9 // but at 9, the wfopen stuff should become available, such that this will no longer be // active this->_M_allocate_internal_buffer (); this->_M_mode = m; this->_M_reading = false; this->_M_writing = false; this->_M_set_buffer (-1); this->_M_state_last = this->_M_state_cur = this->_M_state_beg; if ((m & std::ios_base::ate) && this->seekoff (0, std::ios_base::end, m) == static_cast (-1)) { this->close (); return nullptr; } } return this; } }; # endif // __GLIBCXX__ #endif // _WIN32 template inline void OpenStreamWithUTF8Name ( StreamType& is, const char* filename, std::ios_base::openmode mode) { #ifdef _WIN32 std::wstring wfn = WidenFilename (filename); # ifdef USE_WIDEN_FILEBUF using CharT = typename StreamType::char_type; using TraitsT = typename StreamType::traits_type; using wbuf = WidenFilebuf; if (!static_cast (is.rdbuf ())->wide_open (wfn, mode)) is.setstate (std::ios_base::failbit); else is.clear (); # else is.rdbuf ()->open (wfn.c_str (), mode); # endif #else is.rdbuf ()->open (filename, mode); #endif } } // namespace testutil #endif // INCLUDE_TestUtilFStream_h_ openexr-2.5.7/OpenEXR/IlmImfTest/bswap_32.h000066400000000000000000000014131406177042200202750ustar00rootroot00000000000000// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. See LICENSE file for details. // #if defined(_WIN32) || defined(_WIN64) #include #define bswap_32(x) _byteswap_ulong(x) #elif defined(__APPLE__) #include #define bswap_32(x) OSSwapInt32(x) #elif defined(__sun) || defined(sun) #include #define bswap_32(x) BSWAP_32(x) #elif defined(__FreeBSD__) #include #define bswap_32(x) bswap32(x) #elif defined(__OpenBSD__) #include #define bswap_32(x) swap32(x) #elif defined(__NetBSD__) #include #include #if defined(__BSWAP_RENAME) && !defined(__bswap_32) #define bswap_32(x) bswap32(x) #endif #else #include #endif openexr-2.5.7/OpenEXR/IlmImfTest/comp_b44.exr000066400000000000000000017773071406177042200206620ustar00rootroot00000000000000v/1channelschlist9BYRYYcompressioncompressiondataWindowbox2iIdisplayWindowbox2iIlineOrderlineOrderpixelAspectRatiofloat?screenWindowCenterv2fscreenWindowWidthfloat?b[$˄;Fch)CKk #n/K`n7eHZyueadʧ<("rxie7~)e$vhYa;2Ȣm (X߼ [uaxycv'_'`8_cu' \r''}矊'ۉ7zߍF!螂 zIaޕ碼'y!(^H#e]`'}~~8d[v$}盂q#m袎_&q(#ކܼ'"q"z(`[H`8`}^}z8z!#z~Wzy!޼$n) }n'ފHa__v݆}'_~v'" 8}`di~8an7u޼ b8_b %z`v] ~ j$czzH޼ !zq}Gdz]n]]}}v ~G }Ƞz(uv[z #qǘ7df(޻8zGV &^uǜ~mjb&vx[}"]6ee}ɞHr7j yסr'[7܁vdfrGW"y6_7] VH؁id&'[em|,yi)r'(f(z}(' i uQuaƗf\~W໿'y蝁Zz`zH]棂$wv'磻݁`jH)g    Gee98ܻg]uPia5#n፹w`Y\ކXj 8 hʬlhi\nhuߖ(_u!7duݒbz H_qz(yנGݼ6߅cxbu!z7] ""HGu"eߎ6aq!!cb~^av߼'^ؠn7߼ r"YǤn b~a8_r'' d}~(Z_('}ۂ(\Fy }_)ޑz߼#7_^vW#!}(u#^߅n8܆(c]ݎ'#ȡz( 8 "}y^}!('! _}Vn r9e^ z'y_'(`Wq"ya z(yb7b瞉nۼ~} ~eޙa~8%za~H!v9"8_ߎ'qe!r߼"9^fa(`#r8"vǠ}_) ہy祉aIf"zGىgu]cuan&]兖^ڼy~Gm\G`}ߎVFd"b7ކ rHbעnX[eyq`g]}H\eS7(~EлU~ J%u]bh$ _޻yߚyw#pIuaWgr7[mHWngݻX _Y(" qƚh&"H"HyY}褻nyY(   \gz}feǛ8!Hg"zFvJ"8}^ף x"*"']hbyaHaeqx)X^'~ ^v#  ލ!z)ch 9^~)!] (!ccv9b((a}~נ"}衼'y"fi u$!zމe}ߎHv~!c\`$}cmcz)!ץz)a#Ǡأ~H~`qס~`Gm^~(cG!}H袼^}ע"~G]8\}\(W`auzG^^j8ai F$}_e ^} ۼ  z z8 7_b~H y柑!vW޼ Fށ~y ߆(vb7}! ܂a~7(矊'j7'޼_Gm'y~'ݻx^"~}`( y]a z(`'yW j_u Z`uw!xu}\!6}~݆7aWyn7i]'ۖf Xނ'}$h }ZhQ)`ߊ'`~wqYg}٘ibyןARh;j]rg ߂`?ɛv'7]D׼/Y(H=W`(޼D' zX$FVe(ycOf^8yؤO蠂(q碒O&   BHu`~8_@H'M]8Kqܼ.}zb,%z ~b+u[$uh沬+眼 $yۊH$x!}%y~bX]8ۉv'^''&ߊ  7\c߻VyG܍߻ȣvw}߻_~7`q #9~\Gv'ۂc (#z\'~^e߉uעܻ'`r8ٟh"'y$(]y~e(ނI夁^8ar'ڑ#7`覆]}dz~)܂7 ~67_~~I]j)yZ'#y(aar(d8Hdr(]]'d&q! !v _Ga_z(}֢ 'br ([߂~XzHu7d)nh\ȡ"gۅ&uנvG8}ؠX^j 磻~9r]~Xbvc'݅r!`߆ u޻dI("v^'}_8H&ܻ(݊(!yƢ^uǠ7}$ۊ#G_}c!߂a裻]r(d粚b~Hua/^i m_iƚq뱼H=Вg :(% _<7}נ]%.cJ!?~8 HD'z&(y蜼KvX"(╘M`%zx ۼM' yȤH(M(   D&yyA~I礚IH8et@QiX*(_u`,z a(_}^0m ["v0zIa%Xةz'8u ~z(6ZފvEqݚYdv'޻ԕcy\v86ԅbu蠻v}a~Y≷~h8_uvfߎ`Ti%`vWc`vݻx"a(]n'"7j~`ge}ڻG~&}b8"} ~X'؟(ayZav7!vv$j8߻G(߅bz }I$u砻q "i)``zuX݊'zWuȝd}('`zq\zic~^~(c(ڻ(#7Gqݖ8dn^7y硎܆~#}!ǜ9be7 cuz'z7ߖ9"c}蟻&z`r (%z([ڂg"m_(cr(aHZqȡg"} ܅޻~'݅$yaav(߻^u'ye(\q'`bpGy\ʭ/''ivIfoMDqD(aUyGݼ<~(a}_@qbMU/'eye7<Y߆8#Fy!(%H7^%yzx FwzdyK(%(z'O蠂   ?Ia}"z޼B$H$)MUt0mۼ)8`y^*"#r(!)y`5mvX^i9eݼ]0y砂8Ȣ8an޻^W߁#rX߻'݁f}' _zǢfH}ۻ(}ee)r"y((f߻f(#~~~7}r`7zn8!Wb*#}݆d)#mW`} Wa}ؠz}^~8'_W#~^ ^i$W蠊^ފ8`"] z7duםH!cGg8c}[z8נe)`v7rd!nI n ~b'z8ځe'ơH% ~7c}_rX^܎`z7 gz 7vr(aVerf؅a~޻F}ף}X 7}^(!vIq祻]~(b~XaG_}b y8ga:&wݻX[yuXaɟW]u()!^n[f~(aai_7ǣq$y`6߻zzdyr^~)&9&yY_u 1`idYUWeH6bLI \;؆8f_v'>HyȡMּ.icH !>(HA8))鞼F螊y'yK'u"YM(d y瞼O    x bii*K* !q G,$ & !qZ) , ( sQC,$ (4 I4K 4(I$K(, $G ,J`H a~Ie^#gy=$<"n9#Η޹ ,粀D Q hqa$,P (z,"xb A,Hq,҅h 0 $ a0H H((42 bI( ,E,r 8K0Aa8 aH(E$HQ0 $ G((b$(ab< QB $q,, z'  %I+C bM$Sa D< Iq b( %餉ǚjE $A$( Gb%$I qh&i&*$$P(E a(b4! $Z,("8 &J) bH (!0b E r $a$Q($O ,E ŜpǠy Ř * zi R8rH$ 똂fȞjH ,CZ $z$Y kC &唲 $Q "0AD(r aE(4Lq , i9&D a$bF(QK( qjj $ c ( e ˤ@䢲4qs x (K(xbL(!( qF$@X҆,B(h8$ 8I 0r r h(c4QP y %`(2,P,0(  F,1$(F,r ,1 ,r0H@$A,2J,JJ 4 D$, r4A *qǸK$RbHbF,R E 1(хR4RG 10H a(`LFr,a  AL4Ea(a(ҋ rD0RMBH 0 b xF F(," $ 訉斂Kp H$yȚH Qg(R(r xD(Q A@H,,p$b$4P (@(bK,bX G2((HIq 2$8G G$R8H F4r L4sK  b ,Hr D4qr$40 $qK$$I qrP(00(HaRL0q y皚@0(#8(Yd J4A  yeE bs #HY0d,*Igi_=qX d(&hq暤,(`  (ÂRH4F $ (a4 by斣 x H鮣),  (0 8 GJ Ih " jhl$x q暊* *ZHq4B(L҆"}y`X!!Ǣ8z౸}!'߱ybz߱ ?8 ~_O`l~a~^~}_~߅! z_v _z   z'y  پ~!~~_Ⱥv(y5"`}6z^7߱y''~ݱ{ǝ~gv uzGy v}޲uY}:eAm֝u[y`ybU\y~cr}E#y[qY܁קLЊ܎}\~G}"#8_}v(](}~8`u!'߻4[Ƞ}u}jh%܊aj]G#܂Wy݉`y`y q]cf]vu~(_~(ߖ8W8}b砻Ԋ b'vz7^~W^~b矻Wz}*dJyء7y`=Ɔ`H螻OzX_zu_IW$~z]zu_!6yȝq6]~9[(aq~}av"yr 7H[q$Xzףv(q^飕_rߑ߻qG"_}b7y$!8}ba߂8ye`"zX}[ ]7}ءbm!m&Hޕa]u砅$j'^9v'ۉ%r^vy~ #]c#Wrg_y磻ޕv~7ܻ ej8Y"v8$Hކ$!}$~7Vڻ(ޅ/ ~8a0i"iZuFQu(q޼; #~߼;ݍ7QE-99$y>"~(ar`AbX jdFȤIv''Hz#'m[H8"(vM'   ;}("_;i]vi%#AdMmvݼ_u`8_أ}עأi^9idջX}jH@ zv}j)_(!qv7߂8f[y^zu衻`n8bb֛"n(ݻ u#W_}_Xaz!eH^m_zgey/z7"8]_g.](b7Hd%٦z8u}Ǟ}7cdz_(^!q߉ܖbyr7ݎXc`zY uX_礻yށ]9ZnH#؞h݁ (aq ^ۻY!\b8vz!W~(uh$~')Z#r$v( Xrbyz&!'!e#z(߆#眻X_bHbښ(*~ y^Ȣ(_u`޻y(uz_yݻIa~߂ܻY`z8d# ~G`r $ $Hr^I^#"ٻy#b~7\9`~)%7߻_}'ށ !yFz[u8_"qaW_y])_(%uۖhgu_ [!v'8!`}"8^uצr7'.'u' +Y5a֙zHI$ڒ8vܼ;'`ס?uMTQ.^hid<#I~W`A8 z(bF z' K^ u%WK ( z(%QȠ   ('jHʰ8, K,h$ ,8( .˶ .p'%]vdK@Ғ<1E$ $J$rG(r 0 ,J(J(( $J$,(‡ a 8M,AGQ4H ,y(`I(c gi ꦫ+q碫( 1'( QG(L(0(# 0a8RG(0H 0 $JqF0( 0  H8b (0,rO(X8 P L$$$` !0cH  (x A0B0p a( (A(p$a80 8AC(pG$p  H hG$J H$x(( 4Jq(  $‰AH, (!(  8 b0 ar G$A 0 b0(0Q ,q$4(4bHI aI ($ˆF$$M$ rI0$RGI(bI0  $Q$(F,1(q$@ b($qI0$Hq$Fa0 (8b  8I(AEc  b ,( (b0@ c 8K†b(q0a ˆx  b8b qq0B A Š0x0q$ xÌ 8 C8bP0 1(PG( qH,P0` €P ("H   H !(a(I0 qrG(@FQH F q0  (  r( (H0a 8(" (( €0 G,R (I (b8qF$J0qr$ QȦ$I8Sb0B$$I1($O  ,( "i rL (iIq2p$ G&qD gaI G<1 rI4@ &QiŚK4`b G r (RI(G a Ac di,& 1(a,z*($hJ@((p 0bJ咒鞳p cʶ)$p #*J q̪ɜX "ij)XP $Zq  (2 G,$NB  ,N$b `( ia AĘygr ]iiz`y_}aXy_`W@vy`~"~`}X} !~_q PJ zމ曰&u4Nr,8 $**m*H߁^YE v(b_ 蟊X`8}9z.(!~8  G(bq(y@G,A0F aJH q A8B 48D0b $@bHhHӕY䤨LŠ4zJq"I 2gj ˺gʬ*igq8y=YiYSX ɮI(_ *8}! !U} !ׅ! l H[! 8  X! Ob! സ ! !i  m  ߴ6 !ߵ~ !}~?~ ߂  ߂}`ކ`_ (~~ߵ\ނ\޵ w~iye 0b a G y(z(݅ءjHJ~(`7}(} Hba}ם(z(beuמ (a蘊I0RG$H  r0(RJ( CKb $G$ F$PrH aE,qC 4S ( F, 02 (s $ G4b$2Lq  (0b 8K(H$a$M(r aH,8 8`0c B0I8 RE "0i(4 0 R0,$ ,A0c!`r0a P$ r(X 80X4b , @$I0b (FX0$G 8(aL(RF 0F$bQH@8C(A8  0qr$G Q(  0"  (rR ,0a0D $(p  # 840a,$ 1$ Er)r  i"i"Y $iy褁 hzr0yg& .*$Yɤyg"G8BGq, hJ( $ ).IE' 'Z &YH$b, (bqF(F,2 <201I(QK<x8Q (&"(J)xK($RX *ŠQFrx h&R b$sJ,aE`A4`$ SXD$F(J@ G$H 4 C ‡( ,biR 朩4h嘂0 (.Q9$e@LYEU I$.jy%( !Ye^}d8`X"F rɡ7 B("xyHqG9 K݁'(9"M`   ; yav9'qy݂H2 UeUQTPm)_!~(8_~8` d`YuT~8yj'~' arH}޼ ~~_! ~~_fOⅵ( ~_~  q( ~  }衂} ea}`蠻`~ r !~(~a Ճ~bP`  ! ȍ b N(zG  c Ă!" ꇂ~ ! $! K߆!  z $"z(# KH~0! ҂7"6U+9":d^6#7hf6~(d%6RH\jXּ Ƣ5xc7qYʩIu Hb,EaU{)ᶫ#]f }z+ l}%5 W1Duuػ݉!'yW"7vvE\*"e`cvX ug9r)#IjYCč݆("7_$~^(uƞ_U}Uc   *(A8!)Me8O!(S,uۻ~'} ]ucGfy߻_z8؝ r( u``'*$}ڻ(Ie`}eأ n- i9! oUUTmyלǣ~7庠3!~!Pk'Xm Wb]ߺ(8 ߂xK:!_~Z ~J( } :߂`~*}a *qz!ߺq8_}~߻;`}7z( 7~a}a+y߂_  ~_0tav_(!6z]( (7bp^ݼ/v  8_b   x"  `W   8'  Hץz(^_` dyem (b PWd妺gj(v8aU9m۸ E΂b`0'}08ǣYa S yu\v u!z``Xyzb 'ޭH]r}" !8ᭀX+8: te aq[رp h}Ɯ\ W}}߆߅(}a4Z m׮ YǝzaHq"]"$~` 4A1 ߡtϬ߽p^vȔb9} &P1% 4)rꚒE0qG,1` Yu4LP!}^R sqZ޺qZ08ZY hmZ5u&(*q瞮Ph 3k}\H $r(P  B(@ ,1G ,@  b((4rO0G0K ," (E4JR ,qP~ނ},h ~߾p^c߆H=߆,߆_` ߂ |&qu`Muum׈^kd~(pkH8aX:88`9!md8J~qڸ(`=ΊaHןvau8  EQA $qFH$B$x jq&Bpa~)}fT@ Gy$GHH0A B (睻,tq^u}qGxH}W~߰mylqh '&H q9 gAqȢj@">vjl_vaVyeiۉ]^Iܮ07_tUWنI*P6^(((t\ iH\١p nX ɨH掚hK4Q hFɨ(`}a4L@ )%%V_ai1(ei(Mvr}1hYgލޯ U9qמMxnqƙh (ApF0q$(bh$rR(X 4rG` a I@$J0b$X$qJ q $@($D 0H(b ( I$  (  A Q(†  $Q  Q`$`y^mMv0H=M PaA z($ &(( }YU$ɩ7I~ `"yM( h뭀 ~ Ia@ b(J4a p C0r r 8 r‚$ 1 ( x$TyY*' H$r̪hxH($((08 i&҉ig$j ir, ( $0 e&i KqEф,0 Þizm6& 8 Rp皉ĘF0Er00 NB,$   FO(i4x g, ,$0,H " ꨺, a$8 1#0I$L(K(@0,0 I "Iz )$&ª $묲밮X(zkyϬ , J,W peYQS (8 xia (!8I(b,  s (B P &p"q٨(L$G, 'zI&0 #rǎqI( 刊hYI ,, g" 0J$ ,8E$, $0F (J L($(JaB1 C (y iiٸ *G&$ KyFȠ8 $qȚɤ ( 0(QM44Ҍ( ggj($z'@A(CŠ 0 *JH "HbI8QAO$0 AEaB$D$ (K Q r$ $(L&y"h $B$‰, $K"#0,@$ Gqyg٨ ̢h) *zƞhIjz p Cr"(YX Ι](_`0$ ڈ R (q<` $q,1p(rI`$ ,sڈ* $Qh(1 E$ɩV."jd`݂(`ڐ@蠚j.p qƤBHr &Bh( C$j"IɢhgM$ӻpy8 u\MRAĀyܳ,ʸ98(_i"0im,0`M4/q0 z}!<㎳!(IE@Ϭ aGqP}݆Q8pIq9ڱuGbEիZ`Fr%rF `q~߂!P)e8!9qbͦ\Ė0 tZav]6Wx$q@E$`(H}Y imX z~D0ev0ŭ8'jgՎ&Y4}ߚY'>x(G1(1I$@ h rH 0QD4` iZ4 0邜e{9\" bӅHǚmE,圭q⸟ i"z b=iX߯bq("9G~ <7z`F6vb(߼?("_O_aMӢ }`Zz`~a\}~޼7 d~a)h "ߖ*_HYtF0)7ccLz_ \#Y"H }ȥ&(9#4]Eټ bfE3A (s}ڞ֞G""0i^i&dUsH b)׻lrS9-Uقf""m )f9Yfy Z+. Vu`7߿}xi"u}_&}cYd١7_u97Vi*VHwߕy" yY_'!&%y`^wݻH91UH_*nH_u޻8aZg}a0梜7iUٻW aFqؤv v}؉ۍfbFaMXaUZb!VrhyV\h7`hz&v)^q܁Ǥ(*zhm]   w^u壢Ie!)c'msX_ $X~8'ޝv(_vuv m8R GveWӻHHuɤhv %$% y朻fȡ袊$rgxz7'&jrgz ( iƤ%\&R f$HD$ފ(i"jH"ȜȜ *(aF ]H$h໽%ffZ)H(z#$iǢz(ɞ:`'`r(F"y"* H(i VZ(y"yEz(zHy'+GFYwEH`q"zG I q'i$0~Hky]!9aMM$Ñٜz qv`\mlnacڼ((nI7f3݂m&u8'~HEEX@DټܜY⹶BViߝئ᪉cg4ӼJAa*4㚪WmfMZۢb]إwU㡦7߻}Y~v#iZeㅖ.+h!αXawf6!e%~uㅷZbw"!Yۍנɝzfq7޻V"mXgۻܚ7zx"m޻`i%pYu[ynutڻ觖!m̻_ xA#a煘%fg("RXe\y"~_a5%fE׻"e]w`jH`eעz7yq$ RGi)%Fam   h]ߒVGM<(}ߎHc(`d'"}߼b]mǟueiǚD a+9g诊G$v8^Vey`gچW^⻮ݒH u`Hz'zec y^&价'"Ǡ(r )X&zܻxz\ uޖrh8H wj'a "z7 b~7ݦ蝻מbx) )r'"Gb x%z8yן zFyyۻ%e݊ y裻Ȟ$ q梻&iؚwz  ~'hqzG"Hr&~)" Gz+'efh,+Fකjqu^uӻd+i%(`d:m xQ'y](7I߼&LQ\qh J9f\y%\ ce~'ݼ8U%5w^H ub~(c;Dd]W76ܞvXaaQ߻|ykhi\Ӓi?Pf[[I#֎Y=x;hXquh6u b Ǧv'^iȢ6^c7qnh7vu&qanWi%i7~I&mY~(%ye\$ɻ(thDPǦ+\(9r^rd YecUGQ&޻'qZi߻5y rX~XX'$z#ii4Cag   ~b!wahvj  ힺ'b7a7"}֛8b9$y_z`i^b0L\}yq] 8 1߅X顒q$(Z zy()`#z)^~wݻ%y8#%zIXWXi衻"蠍㻷a"yr[܁bz7e们w`H]cXǟ+W$["\`~[נ}d袞)ar(໳_ zhm8"c9g^(蝂H%n'⻷z )c eIby蛒Hg )rH! f((}#"G8ziuH\H=R 2")h]&~HMݻ(ޢc'(&ߪ)(!Xxkj 8d}؆8`y^ \]^v `zn'HuX߼^q$ db}))h}+Kcbqi I1aɫ(_a#{cAܩdeZ%fuu]("ibme}ע}`v\ 7}_~\آiF܉!'ܑ&y8]}$x_rm  IbeٻZYiM5FhIQ̻ݧ,EAePȜ16ߖ8޻g^ȟGgriFfl`ufQEVKZau%Xۻ]a8a%؟}~z8) j޻qUcՊ!b   7( b~^7z_:YM5m(`7 ~9c~~)!UUh (88|HA qz_`cz݁!z~'z(]#9 }Wma!(!yy߼van( 睼 'cj((#yݼdj(~y螻q`ua}`nbvq~` 'y `~ W_y ~ g~_}~ x!} z  `  y` a }`z໨ y` ~ ~! _}砂 ٞ~~` }`~` _ !y ކ!~  {_ !q`i`yjw$yۖI ("-1iv_E$QI⦚(jga jr7!y \yg"v2'W%8=&OiOUgǖrlFym38;qY%tLAȼGY~pyb+JTǤ~Zc a8auǜ*6EWWG}F[(g 'z"YA&+#qH"y߻7"nGY.'~(߅ؤ!~(gdqۻ!zGۖ(עwcݑam޻ aam1Lj&.mI /]Eiƛ민F97Xcz'9_)dvݼ?n'ޅYE.7 98:" cvyb@]gz('A(("Hq砊( "M`y#Ybh$O   9~(9&b z8^~)"9 YuVTz'Hy߆ y %!(MDҪI((a++' YKܮy"uGYudH^a (uv޼^vߊ_7ai'߼az` 8(~`~''~"ݼx"߂_'ycގ8h~ `G蠼(܊$_~~}b~`q(ފ~!`v (߁ $z(cb'}~߼'݉#v^$آv~~c}!W!z_!z(_Y4,Yd @iVi'W[aDռ'_Amؚh#&J*e\QH Y_ZdJ^$fGAf'zjO(d^̦1]o Ԥ*%n9 "et؞Y5_xy߆(a^a~az #{]f7bzl~'׎7}dI~(}ǜuSQ$n蠻c '}^蚆"yezcz7XaǠ`u# `v(!W[Zb ('uř ev[iƚ .!=Xa쯼-g]aY)8 aUq|BQ6G#v:~" $ڼ<݊8%qYU/_Ig䎘!7((#H`A袆G}^D' q螒GFVy `'bK8($O(   9z"ۅ;z(mH:_YUVMuW}ۼ "v_'} (!߆8$(^bM$$`I%(  0ˢiwڼЅx~"'$yza zu]砂(}'`y[vbu`!8 zb'_'vݒ!v8޼`H u衂 '__uG޼7܁b}  z8_[cz8_`r}b~8"y7^v'؝H`]u!'bءz~(ޑb"v碂)!y߅!c)`u`~!8b}蟆G^z!QER<)a4ӎivye(+aae[(${]فa Qg!}HᒧZra~7^uY&xY ٙ&%~he5v(ܻ7k]bKʡ`~!v߼Y1uӼ)ay8a߆q(](_z߁('ؠHe8٫aؼ" i@P_Aga8 h'޻ua(Y"fJdu]'"y`"}ݻvu _8$UdUTUaMU~ᾙ,!]X_˯^]Vmy>ha$Vy_}7 G;']}en_idռ-ȣY䒈H_;ކ'`YXc>8 `#WHzrH%H砎Y⁶cMܪ\􁇧\ڂ   >cz^}~(:r(9(Ud]6zڼ#v 8#av^!&~U$ 9#y,r , qߊq,!'\y}ނhb^u(8]yv'߼}^z!a~)~8޼ !r z^a}!jܖ(` a}`u ߼("("z݂(c ~ ev`ݼGb`!} ]n7bأ_G`}br砼Fuנx_'`}ezܚߊ uH}]!'}\(ȟz8"}8F}x`X`!qbz!G߉ ^u_IeU첊8!AOYv؞Y_(LUeW7`mVX]ف` #Y^y죒֟J zԻG8߻fyxvYaH\~%y!W]}\Ƥiᦨb7vB($.8 ~[8^_zcz`y7&[o\DJEټI}!'e__iedIMaip޻88#y}`(ycݺ8u_q h$}ܚ'(vH`b]!mI5auν"MUՖ(۪3.QUӚIi , YEXmZ@bY6X'iZ5x[u%9dzHa/#j%hh7g]i8`@Gz޼B((X$H礂(ybxM"&e(   ( ( rG찫I04((J(, 4h '(* " I@0 ,J(8p((I,隂zI4&0F 4K0M( &뤪K 2"Z+` 6ir'ӎ8m< ( (8 /_]u*(րڦ8Ťʸ 0X0ƝU}HLÖZ֠ ^e%Z  }GقHed_8vj ո8`("qUHܖ(a,8Yՠ,qߑz8 yveְHহ(!P c1c#"נkW\rA.c'(bm#G oHiamh&x(k؈8z)!i$]n8݂(8XWn֠]]hi!mPr~(_߅qذ-~yk߂~`8hm#u5P`饂i z! $*](zـm%WوC`8_~ pSi}[h٘1f}_٨C߆(a~ٰ_y5&٨S"}`ޅ~)$yaXZc~g}"]^IRȅ$q~gay p܎)"aˊ(6Z'Rb~(`PV~~) ((e}a}Z ~' C'y`Ð~`HQ~)"(~8JEZgyexe! È im,H GQ !m\q L° M4pq0Q(a~ _}~UE˒)i I@0 uqj\憹9#W]e'\*Q5`,ZNIY5 K+z*!#p I),P `# !ifa #adx@]`mxY 7k+r:qg\-` v'(y pHuX֠ vg9dVָ ءu^0a$H$ ְ p O" FEJeHL]^v y# jl&Jfq ̉a(נ f5WX ͂5Sv;~ ~^jHZְ 9~6тK%)֘Uu#QWT]%}mGW ^r(j^$xS)%)p7^<Ï2 lָ7m0 È`iY]uˎ4 yEa=Ǥ  `I0aR$ +&z'8,r JȜiEp6DN݊I0 k$+2 h$)Τ,@G,rE4N0 (8C, I,ҍ80 $ʞGBK0(HK<8 ly䖲F鮦 -yb'g"`m,K@Kx((cu^=VXIf %  i1 jh $  Ë H$ < Kʲyʦ Q A iȘ!nieQHi &j:ha5" rY(֠VU!q)Dr'GG$YHv`֨ I$+X [Q!ֈ2zYH#(YFye1OQ=PYi]m}(a#HV^OI$qgeո=i$Yհ ˂YɲF(8wH#}]0 mʦ,Z'01G`ت$8 J6 ɢɠ̢88ke0AaY]uM4H k* ӎ40q}qÀ`UUpm @Ђa']i`aG"Ha*er 6e^y8zV]dү 3K^hۅכΦڴ~(ߊH(xןz9&zf j$j*" $Da(  1$r K,h!)IY$h]w▊( (RK$( A*Yg 礢g*Qvecʹ Te/yq#Xi -:]O±|1]UY)߲X=z0ᴸ rq$bDYVXYⲈH[y<`0G(cqמ0'f s0gH#߱Hǣ-z,.$Af4/. i `c(( 0"0rK4J a  F`8MU($P$I G, HrK(8R ,B $(8(J(R I$RHbGI$ q! D$ y}v㞺H e8ӎ4̲@ $rQgXa_QTAD"<ΎIc(ߊ'imXiiayIaǦi[eֆj8 $*&Yhb )a .Q朥 i&le EL"ey)Y#]HH 2 + Fiʩ *ꨦ JMy q螦8 k&ȢҊ"Jr(`8C  0qa 0i+dLg7`i%uh q !  b~(e@̤<  `x&}ci\bG~-n`z_}_~)cI'8!zہǠG_iw,r #my _n_A/bvȠj(rI"H r&)"(XHۂrI8iv[ZG d^vףz8~qȜvw^]rW`yy`໮X yH"WnIؠ}㻳[}jx ܻ!fW ~]:נv'#~ycrzX $8zbY\+8zxyzG⻵z(""8m`޻ny`!"7aߒnHxr&܁f^haHӏL)^7m׼fz`PtIJ[V(-b碻)]~Vܲ')^߼ z8e} _vyr`bu(AM'dy#Xz:$j'X" g~٭A$nFr9 qz8!^1r'ޕ' e!v(8&rnSvJbYIV暻dnH^٢'#'cqf؆( ~h(z6(aۆW#f)޻W_vFa}G zF畦ۆH^IgλA5R)n(^]TI[W`mW, ߲<-E4,}) f&qX!YY('q(pR$YTx\]dq։ #b ۅ#mqaiqg'!U$G h   ۵n"bZX6i9'/j`y}y蟼!W飖n^]i_qƻ ߮.u%ّr&e `H ~ 'r&$jHzI((y'  'r!xzH~q_i؟~'ȩH}$Ȣi"y"zG"yȢ梍v*&8H"zwyǠzIz)9z( '^H[q( WZ$y' q"'HY~((ܻq^z(b8i&#'ݻW)qF&m^($hiȢFu z(daZ^8bDM8^ im[z80MzH_`,}ۻ)橒" n^!(ce zegs ixy>I_6 7qydy~(Zme7aIH%^i;mbW ^b XiW^vءUƇ6 GGށ1 }^'}蜻Yz(y9$Q~W8ߍ}a}79'iơ`}[ފawz_u^r"v7 (`9% -iٻޢvG}ݻauv +nW'Pނ&~h"gr\H-vzH뮼ayv9UIN!iPmeZmuvYh\}q仿a GqX m^,pDzZ   e#7߉`u`v(uTȝ7n r(_u`I%H$ ' yY Y y݉\5vI":-#ס~%V.y4ܻڶ]~ܻ2}ۂ(\_鿉ǗG7GG#)?z zFǜi rF3bwț(b} jz)Wky餂8q韻 Fj)$yv(&)'9פH(qc&(z"j*޻(G yHڻ zG(眻VZ rgF bG Y($'Zu(ȟz'e]v'(㻰'yi! rH6a֝X!_E#.7XaZqݻdY t~%w!h~8_xx'} h'߅矼w_YeW߼ ]]ii}fUlJ5  UD #I!}d 5S}d&u9Zs_(^߼Se}瞁  %~_a2(` qڻ i\z5&q܍2chXj j ~UD֖bmcjG6f[fra}Yݻ'n8m\_Ǣuػ(h}'(wbIXhyar'ۻc9]1[J eWIga&](mV~wg/YU߾ ("yל=eyӻv\r8Zn;U]fqg[af'yHGaY栻'}XQDz߻    vi+ig֛qӻ(;x(zu]b9#Yc( 鞊xdJ* , }瞖Q#ƻ 7vfPn'u(Q'Ừ 9kpa(lƸ~X[a^8$UZ_[&uz(cx!9b'tş'wi޻#j)8}ػ d҇eכY$ FeA]M衻v\݊ߋJva'ݍ$V)Xa]ף*-ڣ]ȟ'ݻT aYܢ)v(me(nz()ziy" ney)nȟY`}vaq_YhjHWavΦzZ''axea$Hנ]IYIgJm#5zDH"(QܻG'02 *Ia'rYXڎ6V(uz^8mb ~_ؤa`6(Yٛ7QE8'ܼ e0t߻ *:('z y#v& ɣ ^Q5 ^Yܻ ,yǟ$ae(\8fehqF^ (v`8㻻Gyd{7~|RV]&fywr֠WycxwcY"irx}]wm%u\#ߊyaeUc)'j!a( hʊ*9%%#b!a'W؂(`(&W殹 beW[iUY*aRqU_^&i'! a}إn6лYy⻿)zX"~Hcj 'ӂ   >u~&}!6H!^!(@I&QeӅ`("y~~($'}מ`~`&~cQ뮼'ޒ9e}b. ,Îq:_}H^'a}'c"$z8_^ 'b`(!(}޼~(}"#'m!Y y!! qݎ8#y!(`'ey!I !'#~ra!^y az8^~(}ۆz_ ($v܁ zXv\(]X$\_v('߆ `}yX݂ y^aUdSqhb]$޼9!i]8w_<#vq`Y,8d9'99cXfuDv#~ܼFz( z(F' 8F)[Lr( g   >#u}n8b788a? U4Uy&au_)_(؟z'}q!"ݎ=$z#_Xu,dWZg^NR VYsnLp 馞R}F}f G`qc#!S諒G`m蟼#z#"`#ٛz裂 d8ځ~ [uȧ߼ޖz7# iX \'#^u~(#W%~W^r[G]~Ga`H V"d~^(#_מ `}_bzHy!~!baH~b#蝁v8(zނ܆e~ "~HUE\s  @@P`Hb MUFevevZ~߼ `eyu\gZdiܥ b#qX}gPY6 +3G$vA4^," (~8aYU0٦v$:)~(!9ނ 9)}y9$}םye3λXᅥMh7jq~1f/] iHf8-}~g47!m_&v)$z(q褻8'y8]i&`؝r#8`c)}"W޻&u"imUGMs{Hiy`,-_UUXn`aVe=YTH ]38^$X]m4hj'aEX,"H$*!878H!^?Gr8?(7I!8F `r xHݮ+ێ2 i   =!y]נ7<ycX@aYeQdq眼'^v"~8&~_za!G@ kY&(^L xv[$oOF~#EY-\nv5LzFSjumڼ ޯ)]LZw ܊(!޼ qev( Uy7ռ]9ZEj:and 7ݼ7wUYw]W8^ HX77m"Wqu!W蠒'\Wa'~H߼'Tv^$~Wێ 8b7YX$ }uYwU~)$~fzԎ%%[au%Gq}h߼ XXG^yv^He~c9זhq JY(ADMDҩ=5IE#aa5׆h (]u uma)a}^i`vx" a"!޼:Z%w:x 6ݍה%斻'_zh7 '`'z9QzBY(q߼Kwa]tG "zk]edӻ]MU~{i""`(I^-q}@y#]}Eqێ`u~Gyܻ#y瞖('`_ݻfݑ~'z ]~'#[Y$qȜrܻaQQ9_qE~8%.'YE8䢛kaee}>QU9#7ގ'^n(6(`$M)(ab6'Ya袼=蟎Hm衼A裂XFz"H"F gQ   G@ b8 $K*$ Ʀ+*$@ +0 &J" @0P  $, ,(M0$$p$,L,$ I(( $x "+, ,& )Mu\m(q*$EUQ0˱X(8]P |ۯH Ť)&iȤ( G ac0Јhj( Øqd&&($8 '\8 z &e$%ר 7))F zZv` 1mrzYf6ac&Yʪ du)&$\ָ Ӡ%mQx"z&*ֈ z (e_1h"x9R:Y~)+wMmQ褡%x fe'b֠  E R&l:j8SH"UW!Qز'nxc֘ꨕUQX!  C}Gke5gHIksp@BrH e5 lEFiءR6GH^w}g ΂8&iuֈ6i] Z( Ig& g z&$ָ d*H!bE ZzG_րu%Lڅ̖%Bְ r8#ְ Er(dԠ_֐~y觢i@Op TvhNm&Y]}Xq6Ԇ:u}aՐ܉Vb_vk Įgͨֈ=YԒָ Zy*pPaXrpvbbGV%aؠ@҂ 7:Ş&@ ɚǨrI6mךD3JJ$rG#M  0 *j(H zl",0 hbi&I,iX j iTM *-)., 8I(P 妢l( G<(08F< 0 I)z9hlh GuX14L7ۯQT4((}`!p Š: (hb[4VٯrI[=^ O0 m疉$iր H &8X.֘ ]_}l֘WZ:h^8գ֐ uq8` HgP ퟚi֘'XQr('h yٔim Ꜫhӥ(Ȣ n7*@ `$2 .( 3敷 Joj*lP aaלGm qۧ\^n( DaiRH Lkvxb*BQFp ܙiY 'rMǤ4^ ɷVz ր o~G\zJ`` >8ρRJ:@}+b$q 0H `8a0v 4uקyט Ny\,禶Y (ZJP䠁֘ Qc(1ɦ6v]g86ݖGa(֗ոJhݢm8e_蝒8]@啱Mz.6֐ #iy( `_eX  y2Z  Y3aɬyeIֈH!)1zuP i9a"ֈ4 J0b a˞9$Y& PvHuIe fp׀ $odhu]h deu Ҧ8M68a,qDP I75z}~x z*)$y .)ǂ8 ikaQՈRS rn2ՀLۂ88՘mi'ފh]ҒhXXX}摠:֨ )d": &⧠ b=Tf&V֠ 憉r ֈ]B(_ɶ"ְ%Ӛ9ru bha,0 mתpֈ 5ue`ɰyhX kXǤ8 3k) '1e## #2{Myk>q(xlyapl(0~:"ֈH'rWׅֈ5XN)j'4׍P#q,JA ]=5]3 I$Hy̸( ]\Ic$ UUUqm۹<`}൨`q_$K0m[Mu@H UM\U69 !^-,0 w]bMOuR^8YuמX(ߎb, @Y݂"86u9WQ1'jՙ'S@݅rfH}"X7Ǎbߴ@_^8.b('~!m~}ߴ}߁~^k(a( 5i(  0t~_yᴘVb߂^kXZ Ɏ)Py(_4u`zzE}YeP Xy ](Kzy'&yu׳qǤ8m>Qe8 ($D $PL 08 D a$P4b D00 (!YE0 ,$ $  1( (B 0 B (K ,r,A (Gj &i rC( A(E @ Ž0a ym4y_Y }!(UEUqm۹!AP~`u^~_$˳`mێaߎ9^D֚yaQ qcX`Ky kz8Q&P6' vuמ-޴矱59\#Km 0‚!h^@1Mp)(̯m~:إQ > Igױ(b}} ^f襴~y-z`*r!y~\@pǢq ~!~}!j8_iםq`3)!yvi٠eHq3Q!yמq^0qÎ(]vX#xKٰKHem5v/滥Ѱ YןeW}uxua}(ɢz9%` ri`(RJ$H0`$c q$h ,arI 0`(4Fp'_aQE,N( $q$ $(1҆4Da Q$  R$,$ r$r 8b }=28!aZ<AX zhm8z>!MEUQD@(~8ߢh}! /(ji!u= Q JaEEF&h$$! {F隑x $a (1$h0H(0X@z7&p (i( z((:iX ɲ. YŦhI<2 H $gi2x *ˢ'(,H$JBM$,  $ qh pQ 84X }0 7q[,IM7   4 r,X I̜I 4 0H H Ƣ (쨢ɬyUu,Ϋ8 'ʚh ɦ"&‹"$K0L P 00M,0 ,K,8'^H[ Qw<g@g;95䑯baZHߊXH_`a%͈ځE9ĘXauSۦܴJn `(&7yM^x}u r(Y~ ՠ` ~ ^`~`]`a~ 8`(ր ~`x Ԃ)+ֈaV~`ָ`u a8@`L~ ~ۂ`ְH~b`Hႂu#aG~(ށ_~ggN(Z~a#b`yx~~d^݂bh ac!P}a߂8_@Æae"v^v`"%Ă `&} !x~``!6!u!a dž"a 'a!}  8c 'Hau ֐7!a}8~ !ֈ _(`J m~ հGu X( !~ Ո(硂(ո ߂!ոy φ!}^(~`}a v }H֐~_9#Ԑ4á)a$4Z ]uM3]u0 Jq& _y~Ya _UUqm۹_<aߵ ^}_y$K_q d\n Qx Yj2Gu߽8נ_j9 ]!Gyu#ij:H$ 0̂(U'v`f9x @Me%UdP \uq!09:#8oؠa8L}h#!yu6r (Caz}!t`߳8`H^0R~z T8wDH`ߴH˵G@^yy~yp`<ЖHbUvXyqU&Hߩ[ʙ&d6ۉǠze.j )xXERbr:vj"j\ݲL0mZh gri& &XC4p01LG,h (b X!8Y$,Ӎ0 $aE L$@  0!(8A(B†(8 ! E 4qQG($ RI,(b@8H $qrG }߾㍶q֙848 ($@#, yUUVa=H(ߩ!ߢj۞5'뭦*`y\<a0b L$xHq pq$H ɤ皚YȲX0 8R$P($0 A =uڒH0 h$ikꞥ 6 @ &J2 $a$j E JRh$@(( g*6%@ H @J(iOiDUwd]E#˨zfI!yETʸy}`Y+~g7hiY%%hcy~ ٜU Q0$j8 @`]<]uX Ǩiql _}f8`QUqq!<Άa൸ `i_~c88b)"mUu } }_My}hN` ߴ bu!}םH,'Z[@GÔeݲ([}`-ஈ8 'ߖxHI"yGbaxx!8( ( @߾9~3`Zpq!qZ'iDSiެ6ڒI]8#)Lmƛx ‰4QH(  $q(CMJ( bH0q aI  (#D8LHH$1G0b $` B $a(K(XbF Q J(@$ R(,$P q G$$ $0(bK,q((! b8ˆ _}n]uM4 0P g{mQee8YeUAE 5S~87b'x #qq zߒD̻ǝv(gaٶyjؖ9&agH 5O .<\ۤȠeٮƘXvpTLO7[]&q\i"_n)zv^}[b%_7yZWcxZz9#u֠]_drz[ݻFRgߵ(_GzyVf_"y[G`۝eآW`jgY݆V nV}ȥ~&8 "iے ]z㖙#"yަ#9&}"ݎ)gm$ziD z%"%}޻rhyf߻zHnۻ&7'ۉܻazi)(j']uy餼( 9YQdV$1m] |U[޻ xVZ$ǜ8 ᪇_v-/m,eƗS1& u+ŗW.^'!1* IDXi`reHܻZn}ݚG(!u\d~vHa_x`UbzFY&]eVO#bYiQu,N7 k^5ϻ۲uFܻeXz$qb`)MZyga5ӻyNY)eՍfYfqr޻~'m)b>ٻ#   \z"޻ma]<1j߼_z~'⢙i) 88Y<1'")eEԻp y\AF qVv|/ZHiXXqqy, 9Zr8Xܻ'}_#} a}b]޻ wEf~WxVV( s=gbj)` R݆yڻ8Kv}죻$n(`^r'!G]ٗ(u)8mמ8^'(%r!z &螆G)H~&څ$( '^v ge\7y_`z7ݻ'^ן m顉}x֢p~Hzڕzfeٻ"yv&y6er)܃Yݻr^d㐼b8]y`#&SOaԩz$Yy\cfz)+ۻ(z:&8vۻ$jHc^LwSuށfؕhrb8&ed% Ƨi^`* 6%!jm x``c g\a_~ &( ( `Wm=BUi޻uuwXg"q id^g^ fXQtqhg܁܊G#$$vIyvHyWxfzDX6ګբzI'_yzjq ݎeܻ@ *y$^)ݭv(jX!i,v˫fQ$U YZ߻f቗fI6ZHg*ʩ h]WbbiuU]^&\hߞ(mEϻFq}ߺc~ r)ڊ7"n rVi   ~[Ʀi W^a'`~m-b `r7 (  9i8"Y9c8إH]0QUb4fYb^#i?yO]ؠz(b%  ^jY'cC9(:8 cy4 Kjަei() ji`fu? 2oٖջJ2Z)ֵQxDV_2&ux&jha8`)anԊH"%]iv9# fvَW%~I]x}f(h(م߆[Y7&x Ua&q#zfX\u!X)߅7[b^heNYwdǝEཹeb Iؤ~j"]y%#s8'de[/!huWښjI#qHٖ7)#u蠻߁^hv:c aId+0}"#n,1 몒UO~߻(f '.m }߻ $VzF(q!uz7r7^桻8"'^r(5#ef7"vNi޻!W }!a'r XUeZi ^Gyy\`iGcixsM&` H+rI#7ݎ7u߻H[ucu'</,pn(~_eIv0qEV۞{HIb|*^Ge(!\vfj ee癲 &e_eyb8"UU%ad!}e^)\-8$iYzgcXIdubq盻X nI!y"Ղ   @z]u<`~z8;)\i]uWi\$7߆z(yuמ'!m\8 i'ߢy} ( Q(uK 5"qؘ'c1)bL}ٻh`[Fbc ]}G_m~v f )d}_v*'&[ y4U7e>f[3r{vّ`7vH#}8"ha}uށc !q]wv( $q]Ze_uފY`q^a~YduxߎyzTջ}%'}$xe"wmڦi( Gߎv&}飻I6܎ ez(؊(܊U^v (|#5\&r5b`!aԪy&~m4M$ g}]#}~a`#z(]ށ#衂( ([z }a68!ӎyjhʩ9a-S?hh''W*_Yr= GjQNQ4һ'u]]6i% 8puَ!&ڕ7w>Gg3`Y0X(bJ'a~7'&~ I$9zg\'"qxW`bma~gezaaiH4aUZᾪ,])g]um[<=%MER*}6~z"28(!qauټ,"x#7!v8e~8^:8("}!HBz7~aB( z(!(H r(y^<   =cH~`:8^~ bAU5]Uy^(za(u!(~`m'߼$qǠ0ͪz' ]iq xP"̮nb xݗ,,4y%Q Aqe ui~au  e}ޚh (!(ae`٢i ڨjH!y߽M a!PǝAr- 4~U.|׻ٝU79!y\ޒXm8^]Y'v8`Xe׉}Yy*}8qহcnߚ(auQfޞi`cIeqvۻ7yݢ("~id暹b(y秼aeY(zH!i}~8ݻ(~(ycH}kg߉mۼء! ڝ(Di]]I(aieV8`}`vކ yߊa!`yc_y`~(}_biU\ ( &y)F~kp֦"P7*'B֩XDgzr ,VW? &ުh_9#Dֻev,l\a')w9%iew-]}`)c8N(`}Y#ءr7}\7]Xd %!H~8"'!I$}߂7aH^}abf 'uɞ!m֚]g+ Yw\'Z-U؞i%멼qq:=ٞYRzH"6z(y`c4uqe׼)霞8$i74)Gc?z8!z(_A]z8aA7}$8$FȞn( &HF   >%u:gzI"@UYEz((}v]&(bu]y"0jH"kX^o I%~Fۢ޽; MqrG棼 w-Uad &r8ہ%GbW_~_0~: ]Y z7 ^,gjڼ mp ea] a~yIvڻ !y~(# tzWz_aUX(8!Z$qݎ'߼'}c)#y߼}!qם'ayמ e[)Xaq֚bz(zޚ(!G^yb_y y'byy!r`b8H[مwϼ5Ouc}'c U⎇㮽.(ANy\h`mvI%\qUayyb蠆j b&`GH.3z;V~( y܊8衆8ڻku#8́"ɡF?O~Hc:wL :8'J&%3kmܮ]%a m"YrŠ(ȟ']}"ȠHyנ޼蟂y^iHy&dz}Ǟr8^"g޻9rWy][:u!_}a']v8Iu'mq뮼qfHUi,`YVڒye!eVi{;'IU8c}]4~ ~7މ"5z}"a׼&'IW~ _4!(aY!Ǡ:8>߂y`A؟}8'@G I"yB   @}]ua$AbuyXBaVXIU~\('ކ8}b'`e#q@ '(߾geچ&Ԇ_m=hy{ Q)by8W^qx'd_蠁裆Hy vUj߼gKHZY\k_ Tև!M^E XMFZS ۘe1iiU Hy׸m\vCڼ&˕a`$crmZ8fm^^(i  ۊY*u[^z8\imމǡr''bؠiّd`8aiټ_7vH_(`"m܂&z W)uނ('uǛiv_~]Y f7ߖHeta]-\ya8 z#~MvITѼd]fXe~)!'!u}" Ef} ߎe^Q[Di~ v(_[ujc  z(3g_!W\ucz(W]~(_}!qW (a~ (!袁^~]'y睊(a"qןyݻ(Q%T:~:#vHc"}޻`zY__Kmy#e۵uu碻h z)YaiYƕN io*caqm{<'"]UUaz27`H}5}afW)`8)b)$2"I`bz'9("z8! ?蝁磂I"޼>( ߁]I#Dz(!} (B%   X,pI 3P4K4R$ )m40H((0('ivY4)3 H$ .i8 g*$*.鮫B ,H<H $J, 0$rN,0K$ Ǣ)#7P eY)RbU48H((c(;D`YX-gܻx ͨmjŰzY&98IYRۋ ߟ|kx o9#A#( I\*'8M'` X=g~ 8L(!)%!8,߂ HO}ziЈ)~т_}Ǡ}]W] cW}ad0IɁИaaZ݂Y t)иty{(( ~3yۂ!(6_bv߂߁0)H)j~!} 4y皂z}#`}  p(}癆(bа( }!` `uX`)8y](aи!!}}畊(^Ш~o#Ш_I(8&~`s} yۂ!~ ~`xyI(y}aa)~ ~mР)y(`~}~^q("и 9"^uАgYd}r~&):~ "@/hutauY)cI4O  aXjNmЁ`矎Wmf!Z+ 9vmZ؀ ʭqb 0(qF R؈,ҋ۞uqH , iyrȪ0ְaj(v M$ QF9c( It؀ &禲)ظD,a0r 0pPYE (q0ذ`" r@X 1m}^؀ ǚ&Y覢&i9eزH^}$u^ب (*0ID@8*yB$Q(AG بPŖ9ظ  8BG}y !ѐ~Y̭aqA‹0 ~aY A "‹Yie JJ)"&bi (IӦ*XP$‡4G(X!߆(_5$Ԩh h_ 3 (E,Yl΀ImׅA eY,]3H Gyi$,a}Ha0  UUUqqܹ <φa !iǠyנ4̴7[۷9ݴ1 $H((RLQ( 8 0 Eb@ Z-$)(҈" Fz,4r,`E$ jalZ% ({ i rꠉ'~a,Iy'm0 M54'<ڒHߊae`L!8o4~&~&宰n~uԂ:܎_k+yayIa4qPXѮa I# H (Mez'(ad02G_"}]~x`Eς8UDh<u瞩(!¸]xAwbPazs %I뭨aU&HӬ{lr09hUߖ'߂aV8] 5>T]vMTYUxk'`mŘ";(} gy$*"j. imih qHظ h.ji1 * ~L6ؠ lhQƢI0(!蠊^$p!(M49 x[]]}(leDvk̸xTm觢[rE y)v)mee7΀hy瞚(@'yAF ʞL0qP %2ZqPa<jfm(R0b ب f&`h{)yؘO RA بI$4Yuؠ$a 0ظ j (h1|YؠbJ,0ظ!~(drDP`LuZ8h &FyĚl؈(]QUUD=r閂 0 ؠ G,P֨}ǞؘRI8Q(Dh`~# ȎixD0q R P kh"䢢Lآ, "ظ b)$‰uyB؈ &+.Ya&H ,b x'@»-tiX2,E,ƒ؀}}"Q׈.vep "$IiXeY,yؠaY5qx`eZM3<0 Iyq-6 r7b,M UUUqmܺ88~(߉ߊh#0@ h㭸"$p `C` ` [ex!?"`ZWVddF p~$}bG(a "ȤE1i車Ciǖ욳 hi8#Zމ⦪*Tհ ӁuvuuگaǡeayP8a@Ӓcu0H]f^-8-t…\Hᬸ~(z( ೠ&$va8hZet^eg8}!x #}\]gTFyāj)'yƟrWj98aUTX.q*$r ۍmy߬]QמHKesGઠ>u^8X3u^2]%[rmq ( a$r1, 8‰r(q 8GRq܊'8b/j%yמ<bM$Q@bH Lq,B(N rE&&bJD7}נ'aF MP*"y "~(`~uazڼ%^q^0⍢!z'ᚽ2n V~^bc)8s- R^O8$q(xdcr8\^ !8_X{# ]u}k#5AvX=#zxWqe(υxkvٛ ^8*1  ZEd]ټ8}bbq_zX_ןz(yق%'$IeuܻHy^i  ~H}!eY!(cH^q}矒8bH^v"(!'q[(9!8q\!}iv"y^}^h7ay]Ym޼`}\y^ε_=uߊH_}^}Q4Uf]dَi#Z}nmi.ܑ޻}au^cכ`yH!Wf(޻'ہv"m[ b^ujlRixQfr(c~F.ڻv('qGb»uךG܂)~u碉\}cᆉb}}b ( yuU7H -y%d} z'[9ge矻Wzv^Ƣ8߆IuW`u]aqvI޽qy*'QUYYʫavYiכ;]%4c_'1(ye,]rI(2'b!h9裂( ~=v `c>!!r7蟼Bav 'FZ   ?~d?a`(DUI5T}Y)7 !y'ǟv7}}ܼ$_m4ᚊ~ܶ:cx]uXi#e]g(Yau7X mv7db(d؟~([i^ } Md 赕ּ&*|Muvb ͦ7<52E‰ |_UYW# 裂jM$[uf(_8"aq[7y曂)"`e(y Hy݂)g!y"`m(ނ Hci`_!z 8 Ha}ߊeۆc9%y]y߼( u]I"  8aq`Hu_X"q睼mޅ׍p <ӎ(!`y}I%U )[eaXr qb8R~n衻܊Wף( jg楂Y~W}~ қz}bˊj`嚼2yd̊XJj"zI\mzy碆'_ɢ(\za7#Z%~^u}ڻ(]4ֶny`f~&v`]^u )%fZe'zȢ~W~آ]v(aa\}գjuamiV9$un8"g) aVX]qy] :YD(i瞼2}a߆G2'`]Yۼ$7XbI 07Ha!:؞H#ub#@ ~'yߎ?7yȣ_z(@~'߅!F?W   @'`!~8!B`vBH MU]r`*}~m^!haua"X`y0 ʩ Y%uǞm Hd=$8R뼎&v_jz#6 F6a"~_~i)5zHuz7a4ؼ aӝaDO (~y`# 7@բ&H 8e@䗼 Y,\jPt a8'z(cgj(8gm`h`x`~rܼcu_i`סz&'cz"}(W}(auءh]]ub7])%z'݅!Fu砉[ 'f[na8^zdz q $)!y `zm޾P@ݎ)#zmuQ%`MQ5e蠒7NR  ty"iw _y'v _dv7^ z6v1 +һ-PϼbU›--%ռ4 bY#=`qۻzzh`z&څ襻lry盼_6)q硎Xi ݒz)}ס~߼^uq`Ad0"h݅!'Z`zJ"ߎIg]}`vXߞ碆(y"^H $eۼ}a-zeǞ' ]آhzuq]/9(]ԊYdz߼/袎h!}]}e2`mmeW*v9(e8087z67]geߖxb<u衚hb@`rY%zA~7A   @("y`IbB"H"zHXYS=u* ~H޼,q߆9"`&)!}0Țz' aHae y܊נM d`vq ^X`BMh_y! ;~8aby^»!9)4gߍןa Ū_Qie VZ ߂X +,f _j) U%a ge`ʘ!*,_@t#]ߍ矼"}h^߼6衊 ~߁aa}^" 2y߂a q~hǠy <$~7} 6~^zay~( {b_zv(9b 78n%8^ފ(X_`v!_7(v}aumfdyaUcU<](蟎Q_ju6}ߊX[r azߊH ^ I? IX=E_!9—M'e!}aߊGi^dסݻfr( bv Wa~7"_m^(^"u\iYV*cv! ^G!~)}ݒh'}㆖܍]v qa~7~7cG!߆WimO_5"j %}؝(a`yu9']5X5u~`޼2(}]W$ I"Hb0Y"v(أ6 ~ߖ!q ; Ge>z8b'?7"^vB   x$,K(0 gik( G+R 8(;K#8"@iW@0I`A,4H (, D(0,( *4 0m 4 N,(ag P `Q44iI$Q<҆H 8i殻4g,Iz˜YiI"0JqQliYUUIWi&F~#iǨ 瞺}ϸ8 4 ymuiبF$c C$بHb80 (YLjϜ.!,eHeZ@آaf4ē`Ldqz( [dJU5mhv'vq|$Lja6̨j̲4ֈ'Y@xP`eV](c($(~ q0q^+i8_(ؠR G&؀C ($ $Hauؐ yyʲ`ގ8!0U5ShHL4Q,ؠ aH4( 8` Eк뮎)#ؘ F(QAؐޅbz8`a('a^wmY}ǝP j0r @mYu0؀G $Q(؈ AqI( Xy]ؐK"($RP7 1Gc`` rF(P Ҍ r 4׸YfqXA b(`_IeY 8 r,M,pH,Q$(_EѮ( 0Ȩa$ W_`H,p( 8P ih&jI8( [㾺ؘ aqQEx q< 1H4 (0p u" ADO` QEqq!=O"~ Wbqם$ƴ5Tiuǐ]CGh$'KU7@a_5Y78iʩbYmQXQH`I"nmZKX"z౰ yz$2(sI 1H ryàyD, (`D ` ime9U`=U]H$ayG$K8 ,X AC(8( h$a鞱X 1La008@00H@! _ e}cډ3S~Xaf~MWҁ7z0 &*QG$XDL ƨBL$F(h 0 1g ]I UV(a /,u_00#($,bDaG JPJ,0B>7 0HXIW! y%G-ͼ Ǧ]qi]偸b `#^'"H7}&bFi8_yj QUm](a z`zz9`7m^W}(b(}`X}袁أ 'eؠq~X$ yaeX ݚY)v^q "h]~ x_ݪ"$iavmZWbqס}ډݼ`7yEEen~]8$Ǜ}i٠W#a8a   ayZW"i^Qan~(\6_r!fYdYr^9^gz$zi(I'd8`"} q ~ zzݼb`z((z8^`H"}~Xz(`( 'u}' !7r8^_yc~\פ8 ޼Ȣn8蠂'u!~!~a ~(vH}_8r'_ (^~(}`#z(}ݻ98 ~ z!"z^_ؤXu'޼Gayb !7Fy\(# }c(Z ١z7 Y!݆vH݁!WdȟX _r"r]( }&)\z(8kY`3l'h!c8`.hay h(]nXS)Q5{c,_Z}yw Xpf+i\Ɨ, 6 yz߼b}Z7y uin& x⁕n(Iazh% W ~)a(d(bv((dy8%+  !u~ 3 3ݼ bqށY $a܅z(gdzXxv8މa8y_Xdun(` h_`z^_٨u= 㞉zGevY"'`u#ۊ8`} ) 'أEe\imyݼ\ifm֖8 zgQ}"('[ir "Im_6'   W\yI"u"]r'^qiٻ /;0袻F#)ygGߞٕeoJ(" aXn(#`8a} (b~#b G%Ȟu~h޼ y蠂G "z '}a8 ^u߆&[ ~7c߁8ߕ#qxY$H"}7Ȝ~(`_z'y_"}zݼ 7'y"#z `G#z(a_}מ 碁nb'߼[`^^bz(߁ Ibm޼(} 7zޅݼ`^H#y 8v ؟} nHe'h 8^vI``#~(zGH`衂9"'c%`ebH"} q֝N6r5'dzvH7~yq1)cG}r*TWb} }U=yV V ^ߦ#~z/ *u`TxuWݻ aIF]݉$* '4X~hقd Ib\b'ۼ g܁~G]r'm޼ ) zۨ#}w"eWx uFߍv7 7}")b I^ƛv" #fH_`"8vb~G袎`i^ bvGm}߼a7~IejZ@d`iיU'yx~X޼Jcz8!gqbjm0-giX]Ƙa׼9qYy\m^XeȢA\9aem$%zuf^H_am\r'XW   B(D'yȥ(xHX"]U8O-ra!,'bފu-`m[0ɞyzaHaY_00E)"W~GH(_$^ )!}"߂X ha~8cz b~8`q w(z} ! dz}a~ac'az8a %`}` #_'x~'ߍcw`)"HH_ y蟼g~}!h~!a~bbvW~`y^bXu矎"}_X(aa( h~_#}ݼv 7W`~!x`}!]za( q_~߂ xy^ y]}yr(_7u!q]ގxכr[:~ea u'" U}ԁS' '0Z'dR)6ņ]~6߻fz9~j(d~|ʻ*iǠZX+Hf~7a^߁#~"^yqi޻YіGZdu`yG`9]zX"%z8_8z'}ݻFc߁aWub(u8_yE%n(۪'7iUךIb`uu .:EeW8}0}z0za6W&`("Ic-`8!J%砼9!v)8arc:'ac~8!>z7!@~H!z7DȞ   F'#zyܼB("HyeM ITA}_-_z(߼*ނݒr\,(\u( :f aHh ,@A-}]7}]~ ~7!~߼}c_`y!z9z}`~H]'zf([~((!_~߼ל~(v]! ~}߆ ``^u`b!(`}  ǝ8~! ~'_!}'\}~vߊ_~7}߆~!a"az(}"vvyȢ}ǟzw!u\\m^}eL2Fy8&^}vk#t! jվ]8 )[n'b˜׼v 6#f:$Zj}sݻiւ)٭(^v߆+ +Ylъ b2G#8 Gμ ؆&즉u* z`]'` ~u߼'}``"~qyػMEWidi`zG߁߻(_]磎}# }]#zG^_םGqإ i^z7޻mUTr7^hl&aWYqם05HUU)~-z('!/Y&e~ i8#/"") b47(`(`}:`vbacA_ua$(\?袆(`z'D硂   Fiby'F'" c9$S"E5Q-ρ睼/~yu-y_.]V8MYg Xb8_<Ӑ`&y^f"X[cțzGZ u$z $[`zud~8y jFۍ)vW)#~ቷ n(^8""8"(Ǣ}Yy"_v( }}!v(~(]ނ' uޒ~aȜ7v`"ȘvG(y ]ez\~(aZ}"Y](#r`aGufaqނ߉~#X䅆my]G޻硆(q_(}z`~`y«$i4 m a}߻vx"~Xb&i* FԑebM➜2{<"\6$ Gii( ~gÁߒX m_z |_NlbyFۅ j[,a] q~!߼v~!y^yy֛`qYIf2jv56褻碎9cuڒzgߒr޻yaX\!`zg]x'ןnMIkavGޥ]q$aW&zj' iu4a("+'蟑"_1dz8}`au#睒H%y,ݎH#硒)5}b;z'`;ȡYa(=8bdܼ@!   D')$F' Yei&Q"EDq߼-z߂#+Ga} c޼-a<ʂH `9$8a8jiyz$ z"}H F!aފX"}qaGޑq(!qu(]^%z(~} H !v(az[x"}߻ء~]~!瞻qߞy$^n9a'f\!~ d7ۻށ^m`~(^mcI`qdzGc('vicסv8睅e_#ކ8qa!H_yd }X"&qh$&_Hv\ 8yǠ]}~ra~)[zG^!Gۍms`i,K~߆נ 9 褆h_vJK: %<`(aǩxG( 0cO0щ(A0H H$L, Ǡɦ'q잪 禙Ơq)"x rvhbls h,Cj ǞYW$P " &($M,h`8+a8$߂"q'~( Qd~!7}xgb߳~`z㳰a` ~vq'`v߂ab8(!(݆($8^(a'}"߂`aߴ0i~ _(g~'Y@%ya!ǡ~` 0h}`碂(*'#P#_~!P}_xl~ (]p,݆ഀo~"z޴}#b/a r0߆o_~ ` bs0~߂cz`!a :8 ` +~ ^c '\)b o~)")( 27cq&8 q!vX\@ îr8砒W޵0 ȡG߆!@ #ry硂I!@ 3z7܁cP rX_`:$qIX 3 _}_u!X ~8x pGu}h "~8}_p 5zh ( ^z( " 2vb77ݵp cu`'޵p S c~'޵p>(yQH e3~z %P ev7}}` d4礂X^` 4v8 '8bh 6}߆!p ~8bXᵀ X\!( yq߉ފG\bU'm܆)E6 E[!KyUf@߮d-f__"}[Hmucpny!ݴXa~J_` y֕} ~߳}^ zr(fuy@7}!v`!!z8vhv( #"b`(~ްx}yܰ)$iem UuԖY#Ybq6m碕a)"'r*h 0F $f Ig YǬ dxQ,E  ,@0@aBhB0R RG4H$0 ',iyȲH 0AC@J ̔(AQ Mtν(  R4( ,rFr$a $(B ( H$Q _!y]E  :aGz  01J0a (#q0F  bbR$x$N" hI4($aI ,M(`~yv M$Km (J.y1Ąx}a[,J=$~߁a~(a{@ 'n묣mu\<q A9&&薧 *Ɣ9&a`8a,r @@ GF9 'jK"I"Xb NۂZi  2ʊ Ǡm&zĢ .@ [0 ej H&&h JI ae) Hre +Hlہr8 c (.i(Q 'Zf,{ gYz8zg   h $F$@` h ( ).&HXiҪ1 -LA,Q$R 0J 4L,I , a GҊ,$QI$0aG08 \r_}p 4Ëhx@$C "(**  1ybh]z)#Z"n(d7*(#u~޲x{]d:v hc 4*Ǧ i7\u؟w )}.yWV H&i$)  *zb( mȠj)$ iȡ m j(Gݒ_` B'""(J8~Hx ꮊH$Y* ,ziHǤ ɠRh m,Gr $' +z)' ,a频 +*()z(( 4R $((N0J $r00b$0H(b,I$X00H0 $2L(x,G,R$$RI$$rF$A0J$N,G$(H A,H$ "Ƞ*$,H(rH( * (y N,( P(GB 4aD M  Nzg$&g (Q(G G$((r 4@,$,80$b(D P$0 X0rH ,pK,H$ 4bJq (x(q QK$I$p i*)qhX H"yH袵h "Ri ƜL0! qx$ (q( ,b R$4‡($ l&k  ((z zK(OrD4b (8qr0BX`Ye=uǜFx}cEfT8^._ F4)`#znh߉"Eqe_~ 쎋 H(_}]U%Z))kiyߊGܻÞyb}-Po]ߺ@waqEh"~)#za@(( ``:_~ീIaycya}Ҳh~(!8`H܆um ]uy yp7y ǠxkzKbh LRgygp acQGHps, $8 KfRE@ $yrP da &*6 iDA$Z& 0`8是X 6y睲GR $"H40bI,  4 D ,H4``y_=Rh f kqmם! a 0aF RG $  BaB  "p aX R Q (X Y"m37 U4ԏm +2:*&" X yi,[ iߩ H+;@( lyꮀ uAq A$r$ 쬧$QJ B ` s z8 iybJ@ $1ix [,y!ka *0 K* ) Ť rjBH<8 "& &zE<8B( eyJ2皧xbB0O, & A昧@ XjH*0 PBS8`FP(La, 9cˆ, .ɢ  H$4G(P GzI& &ƖfG )Y (PX$Q $,h0 80 q( ,$ ((0 bm4hEVLԖh@=84Er ȜijgX q)((FA 02G ,$a (c (Š(" H$B$ g"yǢ' z(px#Tya$H(G0c(((0($r(H R F H F0q XJRH$((H s(I0 p q((` 0 ,x  (†E(aR0xJ,F(a((8$r $ I$, 0C @ ( 8 0G, q4F8B0 q,r4L($q r!I0J$ $Ӈ( E( 4a$È((" (Fq4s $†`$"0I H 8BH $ $`(E,rL, Q `I$L8p$a$ „(  rJ r0 rG rK, $I $q H0RF q r(0 뚣qH&y蜵E La 8bD(b Q((p ,FKa0M0F AG$( $ I҉(Qa8,IP F0q G ,H q$q0`0r,1C ]eI#iH7`.YZ r0 $ &­2&X !|hg96Ma枰5,jyd[eV=^+*^gy=F[x"':"}`jkU)ߒH7T斁8uz &z8P[hx`7à(b}B P9]:Iz FH斒F ^笂 ~5ي DL@H^A`DӍ ,ZYi&i F"˴yIH"HC DzzJ βʊ \=NrA @ " 0 0A00L 0`GF,, G irɰ( `~'o < Š*`L# h,ҊI48,i(`LQF$,EH$r(((F4B2 0(  b( H$R aF, 0 rH(( r4H0(8 80@0(HE,r4X(„"`KrF0aF @$ (q q0r$x("8 x(`(( 0p0QJ($b0  a,qJ$ 0rHI 8 (( a00("  ( (,$, $( ,K$ c 0a( ( Ì0 (  b, H4G F,(qG,(PG1,0@(J 0X,A,4X(0b 8`FJ$q ,q}UM\`d!=Xg1IVEe/ (\/ 믂~#3YRdUqqę~'}זhbH} G }#~! f}Ǡ'ݎ96XiEri#djGٝa]y!rZaWv߅砼Xgّ!h`H^y硊cXy 8 #{W߼aj(eǛ߼*ck/7, X]8߼1 H]ǝ5ءy`zq\*'yj46IyYtq!]u^v(_uiyi׍`eyϊiavٻڝ   Ycr' xa\y j&#G8ffj""l8`\Xz] [c8}#by`v(a8( ]~X d}_}]  aX }"8v] 7߁v 8~(#'_ a}ay (Gvu޼ ށ~[# `7b~'_ "yȝy r#q! !v b~8 yۂ7ܼ yv ߁bHqb `#z(\ y\'# grh[% '}&__ ("~e8&97mg !H~[4Y:e~gy4![Xۊ8]*%} im}BElyNEH'~Ͽ{Fu.9v($"<K#vi:YWDlъF9gYS>W$yYrhdiڨꚲb)q%7{o`zR[^G_v'e -#P\bV 'sJ8y睼2)`}Da5#*(c^M#W_%ᙧdn8ڼ'8^dF3S5H-v^ldzqz gܼWxJY`^F n["Z95b8 ,u͊yأ&߅cya%j݊$8ܼ(zc~}#7_)!7(݊X\uc%܂v`!yfrXcz7#aae~}~8^7a}!~($r$ 0%٢~Y}硅!18"ˬa a˼+ha\'@H)"^@ ~qvz9impKA7iFj$ϼ)r%]Wyڼb}^y" qv݅ۼ8]mޑ"vǣN  YwXW   D(%HۼFۊx"(#jSL0yס.!}](z޼._yn(+'e,  $(Yc8㐚%ס v枻G)$z9_^uǝvX7؜X$߆!c'z霊G~y!}u9qr'Yy% nr'y_Hbuף7b^z y "bہ!r؟Xaȝy7'ۂ}]nHb\zGm Z~GdzW_y&߻Ȝz'8"؝rgmz`ѻci'ނw8חz5oqԠz(ءG}n \'_}v'vZf@a^9ю8܅d0e( z8c_ va^G=cW$<ʜ*x#uu뭕^_eE\"^W႗` i8Z8}gafIyqz^Gۑdv8 n_}myŚzyߖ(!z(Zuޒ$v(by衒G~"~']ua\Zi#7^i]iXz._`i2eH iy*'`]58#߂w蝊a&~YVY8)!y''9eW0z7ݼ4(bb&9z(!}؝=^'u$H޼?   F(ۂW`y"砼DG8)g)&U4S@ }^/߂~(/ނ8yǞ-`e0  ޒHbya)d 9Ϟiy8!zَ7$~X]}b}^7''qȢ8byX "([f( y ur(߆܂( q! !7V}ܻG\vm#'r'&I褂Guzqc!ɠ'z蠻rG!gm]bcy߆h`~(`7#^yb8߻!}]v^!}}zܑq!zQr٦6ػGι!NY+@p<µ]֗yq܁n}X]zc(" ee9$N(g}ݻ*h$b߶y维8%R }"dz7lzZܾuɚ nr}%׉ yۂDۦJx"[:+zkۻ -ny y]a}޼"n9 ءv(yeuۻG]]($b`( ydY]y&n!XZ}rxݻ7^ǡHu^]-(q[l_a uyǜ)Y׎(##'}$%~8}m6Wi(gI&(8,G~81((b;m褂g:'b`ydG>   F'"v' K&`e)$I&U"E4O,r.'݁c_("-_Gy.aaY4ӌH` "~ I#Eϖ9(_7bq7ܻyأ~X]"(ށǢr9"z~b(z8b܁(ע~!'V}ev'7~'ߍcr8_7ib)bv(#)^޻y7(za~~a'^v(`~8"Ƞv87)z!7_yfyzG~!vۉ&_9`jץ袉i ~Wzz nHQנfg ^yfTؖG>yt`#E^Cܼ v$vl)uV}4Sv\}u\%G  z&؛}(Zm֤]r ZX"&jJ]&#攼 ]rYwX$4 gjrM "!jb'bdHFH߼ l_#iUXZWG=~,*`>q楻&!cWY4 uƜi_=_u xhr9  y"c'ءh~}~Gۚ"qcHf]byiי{%(y\,(]Yez)&!yq]']aH~"a7y!(%ma_(i"8#"W`$Y -8%8޼3ފ7zb5X[H]9GGmbA_   HݍcvXybH y)$UE<qܼ/z碼-'ra.G_iZ8Nv 'c^Ib_8Ңe}  `Wy }矻bug m\!!r'(_bvWuyhz 8[蟆(עvH}`r9d}\v܉硎F}rߚj8޻(܆"Gu"}裑ۻH~آH^`(h#Zu$'z\7yc)G݅נ`u\9矂[Yn4xa)#לk hkՙr|1 v ~hugTX_ cdz8' C&~. 53a!#其#y(`ӻR#"ʼaKnU5W#y %M+fX=((Gr:ʻAuVlz` hߟ'j<& T(KVid ,6fGyޑ"z!zr'gޥ!~gv:޻ bx#qXۡ֡i\X #I"yہ礻^8Hۅ%~9 ݂'X`#y`zHfuܻa)a8bvHe}މٝg_~#I(܂G}b[Qcn7wύ3aؖIg`um%a׆)cޖGq!%$~)]yYIgIv9&ؠ8~H#,#)7~9/8(b~ "7Fq7<]~b(=   眒h2L.PqA ( HK( 蠢'(]DQ3Q 088E2 q0(0r,s (,$r FpF(a8 $ ^ybH`㝶  bJ ס~yGHI I(,hbbq$qK$ lzi‰ zGj.rq  F7`!0J8Q A p`!Ƹx߷LL궊pi&r(9H( Gj$*)& (rޝ!( a"~÷`]1w_eԳ[1%ۊ8aP Gg0K&Ii( 钚%"iH , yG$s h E(C# P#h ύz,},, s $,rI(0 rs $aH( (G$`8Fq ahL8k*P }~\ H I,, "iꢩ&I*  4ED  $Œ 0R$2a58!p ؒy6<ᱠ Ԋ8z* O7Tu瘱H$RR$H ea iqg ƞ$Qg1E`Zߢ498m斱pw_a񥢺HsٚϿw ^~H WQ]M衴 ,EG , (a~`8@TmU0̦ŵǐpa_[~7a B r)$Gr^8!8r\)fhP(}q$6&:2 wVyEM`0 ag$(rI8)ƹU8I4f'zZZOYy\"OeǥrڼDGqg8U"aUUEQ/8qmz޼H}m֡q(yךmqܼ}uuݻyMYڂ   ǦzI ("qiջrz:%}_h}M2I GqzX }\}y蠊8}_H%v(}Ȟv(޼]~af޼vH ۂ~c}"\H! _u`)߂( }~`#(y }߂`7 We'q ~Mv޼6ߕ!韕`.v( 'ݼ5_yzu^0)#~F1GDb Gލ 8"8 Hyǡ~bIߚy(b Xb֘!W& u}5ߊ9%fyX`4xj:md a(̂ eyXi{ih7W^HT<=i[hIgfxHZq#RZJ !^}皑`Qzߊ8(dtr WnZbJ]{7h[i[FTGE7^%͚lf erv(H% mW:)璛 H` qd ( ^n)#$~(~)Ǥvzi&'yvva"qr܍ay"~"vim_H br Y#''H`q~'ݼ' )묊b4qbF=_»/]0.Wau栦hU9IJbXuf%i`yH8,Z Ut]tY5P5fii}`$iuu!]]}7yu\#uuxV   '"zizGq ]VW 1}V`n'(؞}fݻڶ~8_`~&q~ }桂7us)rH_c,V`3yYzf'+bi]bݒG7amy%av8]ꊛ粙ᅸhe}⊈Z(a"zd !1F*}鞑vg4&jyrHHb48n#v^0w߁މ_0wߕ&HaEVj^8c}b&d'x]e ~Y'5 }q^C5a- 4^yu-& X_5 ;nܻі8&+ c8! ~bE}[}fB'Z۱ϪǞzbXȏcYfXؼ; & $}_n8-``՛GKU50ʼW|$Zbl xeR % m i^iwrH| vruiYaWjQiey1̼yyn `T"]z W%J` i _i"4Ӕm,Hm_^Y,q_}\i(!~$}&#xq}`$٠}硆W} 8`(c}ay]8 y'~'ߍ߼!'"ȝv zan %8פ-p&1\}d~߉߼>ޫ ](3H.'(%ז)S袮yr(UzuwS"i瞶Zb qv=5`]ռB"EvUyuۼ$)!uّYV%iy]jw`v&yțr([}}Ş   Ku"8%v[Fw"hzX#@-55qס~a0#z^/8eu8 X] 'q(EҪz(qczh^_q"fz)^W8}$z}fW~(G}蠻W[}z'~7u袻(آ'n_gxߕ_m(^( y  Wz' ~ }ס9$&u^8`uܻ z'u`蟻'߆$y瘎 .}rf}ء~^y`vG]$} 1mi((2y1eۼ* (*7ew WDj%*bz("vT`ˮr:v-7ifiI5Ie}zo#@vyt %f 'qu2ܧk].sQ VEƗ$$ ziռ(mŚU5UY'7)eZE )kZK)ef \UWe7razb~(`h8]؟7" ؠ')r8yazف#]_rx^~(^~(a7'yH((ߎ(c$`~H\y袅b_ua7_}޻[G ~֠i~Xwܙ]rd}ۻ~ "Y&6\'݁v'-u]Zjfuiﻼ' MfZ"7} G#݆cuU'i8#"a.#r_H'1)"y_H 6bv]7a">!qdx7?   K"u`8ނ(Mz( HIZ#1NYa^18ނe\2b~("}a3Y$Šb _8 qǜX'mۻ8^y_brG\^]}b8(`8a5qߢ_}z!6yb~H[u~G ]"z7߻7vW%r)7^qv#_'czcu!YWzDc<~GVV^gx^k7_q~H%czeHۻG߅a=1=9~(}^i$, ynw}b f+`~vxbf "Gu 斻%%Ϟh"a=U#-" QyW(q)la':+"`z Eػ (%)Wm :hLԻw(ݦ3HX֙*y$ H$Uf_nz^nE [um~'[`('ڻ'_auu_ފ]+juiu#}zgYת~ݻ%zIy"z "(!)#_\8ފލ"zG!d'vyd!~#fn9a'a`q`!zcbyכqv޻h`yMavyiY(}]ql$Yۖ(z݂'a~!٤"zqaȟHYY%#X7+#~X`` b0b b968ע<~W_!c@    K'c8 M"HIZkU8 M QaY4'uގ(]6Ȣj~(d5_MU0G ]dyަI$@iuݻ(m܁ya\mrG`(ߒ(dz8ǝߎXz#7"uz8y_""8ۉځ%r9V\Y7݁#~'mW(dIij{]s ,$bfnGqءG޼a(^Qch]Y.7z`}碊g )cb dH_GfY Yv$Xe)%qBey& v߂   M y"(O$y蠊HX("@LTr]6 qފ5'$ށy]4U$J8b  aqݖx83 yܻXecXrݍ砊'ڻ_"~I]y瞻~7ț X zq!tzy)}kGN |]&z硻-yۖnWeHcMZryblFenY`G9 )c8` #'uމ (ޅ_'_y dyge&*ah7r(8Xdy]~ `xz ђ)4 cz (!8"yցFov eA$OITвP Daר $yKH y!H2($s Őyh&z)P† C8H rHDA $ ц$8AK(PFA b h rI,x HrI†A露xD4r4rLp q(sL  xK(B,P `8" R rI p2F K0` g$jJ PF ,CIpS (I E(*zIz$ q4p$h(r$sA~Kv0:hC(J4p R 0Qh(1 &Q頂)* "zk$b(pCЂ2 pEqA$4P$ $bq hKrKF 8}%݂@&ڍ)ydFY#VbB,y*(! c BЃ2G z d(㘱A bQH #YfiG9蚰 PQ@4ӊMEu^ YFgL8yڥ-xPImG u!+q֘賈 IF8M$Ӊל9hne f}qyf*ha:c@,b9fv#›eh^ 0AI8gm'(adr@'\kg`HuUvhߞz`IW:;XGDS}H`0E%~H^'$Y9l߆iDeeگ8I!&!awx ͚b÷xyǢ᷈^z_Uꤵ'qUb:Yp\qh,% XG۲uƓeމ*zqz)0t~(yאuڱqȦjfɀ Ȥjg9}(: x`aaDYp9%жڥcD]5Iq Eq0I( ( +yg$ H4R$`0  0c  %qX=gaI(R P0 ߚX QȲb$h f$*r B04 J.QE*yh3H P,1@ c=X g ,,HK$RC0 *&&&`FG80X @SL0h Z(* Qc((rI8H(bH$b$QI @E$C$D(R !K Kcq( D$!$ qE E$0 0 1NQ[m۱Ii( J&ȢKx k*%X疧 HK$"ȴ Jf0A % *qa BI'i# q03 b4 E)ɆY" aM0  4 (R ,4L, r쨪PGܲj~7]ub &冹R,, H 4cpxUƹ_x $Y*i*$J 8 ikCA K( *@G& g*K%8RP, P !# I 'HR (8^i9'HG,BD ,qrH14 4cGA(h F0$x 4 A(rHD P4b @qD y( 4!(}i0 a(~!a`;-s(X!+$뮯]u8ӌ$ !D G0 20hF(Q,E`@8Ac H &Yah 1yܖh$0 zN$bi6) jyj)X ʦI 0Z"*YI E Q 6 qȠ e0QȤ Hq(Q,@@0c(q h 'q&i2h,0H(3Au{ ȼ0VM}u`fq!qr jHnh~XY$9%I&Iay!(f'v*0x(rI55ob}FyQWX)jgiǣm-VZ]_7֢j +z.8ٚi`(cK7}D౸\ަЎ\m%!82Aȣ~zyPyc%ȧ^qTAe"uQuد 3!z(xӑ5dI啷yKQ԰ a~Lgq׭XDZ6j:eQۮtU78 )2ǒAea J B8 *" iI, Rk$H G,!, YPp8av_uvZd jm` r, E R*&œ(( jd0( Ĝz.i"Db( F KI8D "J Ia眊I( (rI$C @ 0 iYG(zI(( ($0"c GE!,I0QJG RH(0 b" h bH B $PGa<@ cHH "1h"(,0,9QeU} 뜓"ƞY _m0 Qh7ߒ+L(H,[)_]u8$ɨRC1J 01 qpA 0@,1 @ ar(qF 4qb  kr2禒EpE$PL0x )zg h) "0b,FD iK*J &*(R* %h*j몧 )b1%H,"4 0"i(b jiF$h. *i  @` Hq($i\m'jvHv(~^^[~('~)ߦG ^)%z}Yꒉ~g^}}_X'Yq_H#&[r I ~z6ݼ^x(X証68^(_`(b}7޼"v)nHcx'ۖj"$*(ߎ#(4c$v'ق2uG9 ajI`:$8!7b(2Z"}j޼9b5i(hUUIq biZzdKn abn 7 եE( (! k8؟r7ỷ ])^yd7ceQHݥn' zQG'砊Y($aע}rxŮ1R51Iz~,8(:"r޼? 骉cna*y]x% "Al_޼f]7#x q޸ ( v# "hWun&Iu^r+qʵCv z)x)^I Hu` X^a8-$)}`,cb~zIa,!hmcb+uz޼*v!u߉&&"Hy}ݼ%y码z^h!ށ砆8#rZ mb~Hv_I`,ij3)\yy>l)r&@̼1#uȢzZ{Swiyy Zn`"MGy^-=xbYUvPH^BJ$ePYq!)']iU%y]֝ǡ aGQr(]&߻h   $iiǠ(Ȣzyef,rz#7ݥrԁ٨`j8݉zH%paH~"̪(!$e" '^!b(a7"'uțG}Wvp6!b~-(v8%ǧ%(8\hޢX늛)أj}g "i!H!Yh*wݎF<j;drކ9%.:HdH[5fޥbnw; "vu%B&$qz`?~)`v(@}i[aӼ"ma~(y ߞk')(y(ub&!iwN;V`z">H([anDd-0X^weȞz'\er& `\#^w `/>SACx'q&urҎ .*Y%בx.[`)e i8dZs szerWm R`Ϊ"j U I( zWnI[q$e8Z 7cIh!Cؼn]u d% ⍷X=9 Iu`߼1u*!,#Gޅ]c)x ^v~^+!mފ8`!(7~`}&%7מ~Ia'q_!v# ^!~`ڼy]}ȧ#sKm:"j&yB`)qY̼1g'U̱\ "em\zwX&];^iLXu^<]]X}a߼*mǜmeY܆X}v }%urzY]^   G"z(袒'^qM'_ s&9Ga(q%h[`7yavؠn;b'ip!f\eㅸ#I7fy"'jۑ"~Yݙ+R*d4&<7dۼ jʤ"޼+߆}8-fy 0ފ5e؎)߼-WYhye6%gzh߼<&$zxF9 rv]((5HnH`Aסiz86h׍nUH˼ cX%7_zٮ,آrXv(-Zm9g56U" `) r-\gfb7MgH&qȠ^yr%&Z'fT~'3SAh>iXD1=H-զ)}\6ݼ6 '䩂zbX. )6 Ҽ\廌庘7Yc8(Ƽ FقFن&^]m68v { cQʘ \]jߢ`zQg1V+ ]y-(I` `) nH)X X_9mD ۼ-hݕcr7/(ba!/meFz *'(ɖ}樼(I4}iyb $$#ޒ]+ru[z)$[vbߊb&`}Vyv' mҶ՞WZ6%~٢WaDvkq7a9"i֟a;mb秞fqǞv(eקeqm&^ȞU"kkrm'ETM5WiAeeށw,(qqj'ۉiּ }Ȟm8߉cbX\"    H"i޻rm[iEayjGua]YY߻` ( 靖Fmq!;q)uhb&޼ۙyhݼ&(߉X~Wu#iHajFռg^fl+ 0IIU]mؠ%X ߎ(bm$WI i+G(_vڼ/6ǡ!v.&HeYə/袆 ߅柼:$rg8b:U_ j)?`Jz%n#;`ub:@$dQ](]v8_abi«r'8]~H]'Hһ&iEݼ:n(cXc7o'\{mMSY gyh$\z z&`ȠM砕瞊J$Xז<9B憈'Y@U4qǥ$1 &I+&x༭#Xe'YV qן^ #yebe_rfa\U]Qb'7y׳Giph pb~(^褼Y̪vm稼jEjۼ8aO~; @  n܁Y\ .`\༢ $~9f[\4y]rG!2dbW,!vu؞1}7'љ蜼A2808sr \v I~uz` ~"߼a zd~3-lW7ySy 7ؠ$z_F%q$a5G$~ێ#-b榙qȦgișyvfHz'ZIzD|xMmWaS]SMKmYYfW0uax qZ_eƝ Gcbi]u) if礂   K(z "Q码"jxZ13LT֝6'u!6_`av߼9`A,rDH }a(#bj8_"y⚨aq %}!z' r8$⢖"U]ִqdz["~d)T8'9T`Ri\'iYvvŤ([Njdviz(&mzH)r%jg8"߆'߼ u! ~(^y_'!}ގ''z)"zUF#u$7ᅘX` y '!(ah`h` ,ӁFgfȖ3 ֟zچ4xHhFĦXɘ.vwH" "mv]r( }}8ݻ'WꝸYj^*^r܁ #M[%7$YF['6a(YlǠj#UYqݶGHa0؝iw'98]w^`&ڢ޻hY}cqƛI"\v(\~yޒXddIޖhނy u_~$}~ _!'"}Ǟ8]#H"z(7ޅ[~(^7^9'}}ܻzY!_uyry!!^r޻m`iyf$ msiv&H^qm"]vX _]~8(z}]Eּ7ފ7bi98]$(Ye. "8!(5ކ8a> yh!<8   Qy (S"zH(YX(LŽ=US:q皁&G]7$qǝ7`MUT9! 7bz# 灦ߒ7z('u"Fڻ%#v!I8b٦&Vd}毁Xgr)\!rD:¨]\UhAZI]vƬmx&)\("Yފ!} Hǣ7~ܼ v]va b} ~G`'}j r8y^ףH]Hcqd'ajY8&(^}'~^d~Y < Gi&egn ޻ܖq'  `~ށ ҸǠb( U[rQDu5i֟qZuav'ڻyf߁UvKi~q޻]&ۡdv(޻_v}dzI q#q߻`]~]"~i~Hyyn8]q#ȣ(rbY~Hf !hi7 j9~ ]7`zvxyzbqv_z`[}֢v9z!עd}"n7ٙ&)afya%bqȡQ9"yӻ9'ezXNz]i9 uy]/]Hyb" !z(b~7eUռ IXcI%#"X`(_'߆8!(8%/7z !6v7&5gc(?߂   OȠ( zH"Q蠒HyZD EEWy]7( 8a]q:`uu9"IH% u݉޼_1d׍ޒ`gޒhcy߻~7Wq`Xޖ'޼7ۉ9gXUFڱWh _"8ݻ6R/QY%z'y$"7_ޮyf޼ZO~F֬f e.*$v9~8 ؠzH 'avcu(!ߊz78v(! !y8[qTP)-ɕu_G} ',qGܕ vrw]ic߮g)m`z8_ya #}ߎ(isх!x`Hz^ zh( ށǩs wbH߅qS&U"'cUm{\nYqIqqqǢǜAcUZj!v'"z7nr} ' #3(EfGYwr &!杂HdQ(G)'}cyݻ'Zu#}a^drI&`瞦 ;+zic_ןj_`蠂Xy!޻r']U}&ڕ$}"jWr8eJS'vI)XY$jǧnW!m[q߻$09_bab9uۍaڞJ+yeqXqƟ>'aw7ߊ9!d7_#vavݞ(i$ia9W%7"0(("vH5'߁^'$:^ ~7dW=`   OzzH$Q 瞊I$zeZM4U9z98y~8<z}n߼;"MNe #u`(`',$ #(ݻk"xzcHx`}Z ߂(uu礼$znW6'hz "~7q"CEW}ffFނzekȜqbXb! #HމdH~H'^7~I! _(_(z"߼ `~(! ~h] M\R#ȜjY!}&z "!L6y]f(e8-v7flz7n߅עIQb86e]U`("(yǠz('"ǚj % :*|eXiإ}gnU[\ۧXFmX]ݻ-`FAȡI5n}(b !n ] Gߒ`Xb`ߞ!b'ފ(7HrX"(`uy$)vG i~kTQQY9fzi"iە߉}ކ(#auW`~'}袆8ێy'؞r_6褻Go}܎f'!X HywZ('(W^ rY$!ΡfFnؓm`E*t(aYVXiI# yq\_uۂ yvڒ(d%أzUe aj%H!Y$&`v(! -ۊH&z(a\5^z'ފY'7'~8靼@   (,c  ,KI0 &yǪY(,h bX`I5@Y (A (( , QH00 ((X$R,$h b (cHX _m眂 J( o M4 YF RG E 4-,'"H A5@HX |9M8%]1ZzyFWX I"Xh]ham,xuP7uee*{H%ޒjHWiJyܬ`i4G(2=!EU֥0$["( r(q$h܂` 7 xte0+)ص =,H -xJ!HH9u 䜝0X kUḴHR4JV#Y5&@q]^Qޫ]T5FIf[ @M6Zfڦ HQyƜ,4rGbG4 e6K q䖒 , b"& H%"" j̪JJ&0 ňgG(a 8%)(*8&"hIJ6(y}߯ FI"qA 1h i"8v{jv dנ">N}"}b}$mih$}g߮zUܷ+]ׯ8 \*'Z`7ݎGrܯv!zYv8 (0aH~p= r8WY)g9)cyH$ul(p $˽'o[p )gr: ϕr@4$Ug^ Pz޲_^fY]%yXfώ"}b miE4E&ݗxZfmIgh a$ayܭg\H $j`yE"an, p }唁dמt-beᭀ y֜Vxu_~my!Nj]]p~(bEq߭v4q -Weg8cuV%w<%uHmh( iq j Gb(0 A(rHP b"80 H y ($(ci#8 iJ, I,z'(!0jdKh " +"(Fb($‰ b(iG(q ( b 4H b(RG2L( $$Ia( $bH $QI,  'q&ah0" r FpDq sG(pF0 G H( D,Q((  bc(a zI WHiuU~8( I4rJ 8 }e8 (`'u( -3Pݮʮ%l5`Yu8(I2F 1 B`M h(" (a 0$aq H]Dˡ&9% k (I2ҋ0 ʘj g0 s(h qA0BL TzCm b (% ӊ`A0Š (iH rf"yF H&'0 ,caN,0 jAiDH &P Ť &  yj " ,I r , zH.N X G2뎬E=YW(, ( (Ì0(@ q( ,r80c8b8 r H y_Hp]4AK<2 ی@HH,Kr , ]6~( 6 MuٲZ\)ˈuk0&i{-^=Ja~Vۭ z5J9暭 ȐDEJq' )pRqG$Q\z]挑yqsiaha'955Yd_*!n[''[y֛y^m0pɢ~! )r %X,x:js*ugzP ێ¶sn 6\B g֔XefAT^n e]Q@HAxPaWqUOYdYVu`Y"QaŐ:+a Fy"Yʢh)"zHxCH ,фP Ah騚q嚦p iIjHb,,bK(P (h2"#uߟ  mƛq߯ qŠ9g I&gahi4IE8[`H~(㑦bHXTҵv۰a( ~!'~߂!r  ~!~ ay`~  7_~ a~ (!  '쬸X$N (g[x%8Jˌ\hx*hһoX ߌ](xzI() gע6ԉsA1d_5'IHCTeha0X^( naa؞^(aa '}!89Xzގ8~d'ߎ"g]abzzH vz $'#^@ v'Z$H` }g HX Ԗ~}؅\HFbH&(h ~ZrȠx Dz p8~(` ͖HiYp Imuƛ&X w gy`@ E"ૐ Vu\n)!P'jmqe$V6YY8uX( ` (K,(r0 Ä 048ҋ 8 gQ&I!Qe 9" 08(c8 J&&a$j)H H:g`$b B %2J X (qX$ K,$p0q a pEaG , rI ` 0A0b rI0p8c ‚ C$yIyjP4EF,XF r0aP A bE( 8G(FDA,$$BF   '2 %(c 1%蜱8M(rG qD$8ae4 ,1kbg֫Hq-tHr ]U4(`@r08!0bp ((bQ$X, !$E0HQH($ p _j &)"ڬ&{ p,cL,,N$ h O (A#Zx $qD0(҂ ie"zڪ $5^|PDȩIdM u]wjwyTHZr }e6 <q  D(G  H,SH .ihJf DzJzhs. y ul -Z'&i l*f* @(&ZX,,br x1,!4QF @iǘ{Ha M4 'YzgQ S q8 4B _iZ,Yvx 81Jц $ 0C_m](auT߂݂Mhea X_眂=߁߆, uPs()H؞:`,/+(({n8xI2J0{p+Z))w aHY}SD$  F]=Wn}#YڊWnM08L"9!9!h+%XX( $]ן\mE8 $h$q(s 8  jHb 4 ל~"ys *$e  a$ H, B (B S  P0,1 (aJ(Qr,cH((0B($2I$ (Aa涋3H^9+DʹXevyLeq (F$RD,,aMQV 4x-y!fѪ pE$<(  "ȚB'aXF (rp$h iaf!VaJ _*}㱀0q $G$C(0BG b,R(p,Qp C x q b , 8H!Y`š y dYG,YUݯV ir( 2af aɌf8j" }(h!_8 _(Gz`z(~ޭ(g]݂^&baYe >c8` hI9 y]e( %3KZ,mS ' "mM5x6iJ(oUeV80˨ C  $r A$,BaI aɚgX(R ! 0DY'i`JI$ǰP ,ˮhɔ .G0 gŜa,R & ,% $ BK 8 F(i(h圧 %$X0Kr %( hYX * p` qhqL8 q$h J $!H$PE bE H(b " 0(yO`pX~)0W }݉@!rQ(šP$kq8_~`ߨ, ~_- `}ߨ,߂~>a}瞨P/<ߊ]IꥠVhe7Pvwh$鱀 /ni7nc H #QE`']fW, צ<zYjH,m4 ˊ .ζYuW80̨0(AQ(aJRC pE bEHr7ټ-)q_rh`'*iqȜ]G)ZqqiW(yz%^G.ㅨudۧ0ǟf`z* #h]yub+8ܚ$z8v"3#yVI8,#hv!$:#Rkf7e0*^6Y#~89W8Y$;*z&ە)D z$KyQctƐV-(2e%9b^yذzyh(_zW"~}߼)`}ǣ5H0&rUq$¬7>i'\&bi`y Zz*"z\ކ"(_udM2'bqOI 'vo87_e7emqu(D՞vy5G7z83 ׹ h2 3~ze~#W=6 j܎7a#yra`؁oV[MV U(!8 q瞞eģs.8V@x'| z 8X缷몂Xh nY(f c@ 9u΅6!r'vb/yb]# _v ~ Y~[L iY}}߼' {朁. In} Z3鶒Yc٘[X5aLitz9h;gmb%zۼKf qyu:r|-ir f()e)砂$⁺U` b%ki]5U`fѼK'mvVUq^6m`ZZ6qmuڼލdruW ']qǞy_   G *G^zWivUif^2h!)h[~')z }c9ggj`nG^8AWI!Ecmټ"]~6amy昼"W^,ކn)r8`'YyxX8(+z}`M^(g~]y/ټ1\)ܭ)&x\"H"j\wz\8aDNAx)HYh )y%Lf՘Lڱ=Y$g*c ߊ!w_C ! dv3f(j8('m"#Uh(yQV̼ O}!~` Y zhVfꖩg7 ]pjUZ_,ߖia [,y֙ @Ʒڦ{o+6Z傩e*% +8U$Ny]"?麂:v &9&8̩H%z8AX(!z ~azvvvrz'߼ }ן(%ҎvݼTznn\]9aT]u9$= }V݁aMH"ƺUuQ$7I^jGwr"r)'puyyje $v)˼4miMQU׼MdQmm54zWiȟy!iށf)q}ۼ ^zfm^y^   蠂(7bh[iuYD  (Wݻ%(jX'r a˭Lq n($yۚ޼ VJ('#vVZ~9#gUߖ6H0}Hb82'uiwb)(&uwu^.'rX_z)7 u ܼ+[z:+~#ڼ+&uy5r()&4z')yئ:מ7}~g=8vhZ ?_}#F"IhIZe<\}vMdݼ&ئua%%)^IcG].Iegau޼&yb!v׼+ f矆V 9)yٜer˱S)oW`^^I''Z( )"袼bN,:YbOg$ 鞖ا`kdrD.E(a༭^XB %}byty꼛yb`e Y ץz]]fJz͠eyXy'j7S,X z נ'`,Lz X#"jmF #Mآ8ݼiHYM ZR ́ H_~ݼ4uءUⲘ'" .a 0H"`. qhb`7 RKv ܁v|,%feVbfּ| bZeifX 2`ֺmVO`,L=$PI";'c$ufIQ(ygC˼>`}zZͶkyu蠂vșreYǞkq4lv]T!tʁ4K'uUa\e 4aّ_f'c]X]]}[]Z7)偖q޼(   W襂H eejaE#/yfH#hgn߁ܑ]Heiܻ^,r y߼Uw\`M9&~7}ܦ)8Z}jfh#u Zb`81(bi%yס0!bzz(.$zGf(1y`gf'޼3 y!$X.,Yue!7ru6܎ih7g=^iޑ}';g~ cvD߁Gede,}[e w7H} 'xb?~6~ ei9ފ}:7f{y9j`Z^}f?VM 4Ӿ&$Qw`W H`Ur8"'`)`_v(Uu2Ҽ6ʬ୶`mU ^Z/'Wtzb'bX鼆ɚEn{4*Y Z)ώ/\X h ;X)mM.ۼe\ ooFֽ Z%`ZZ `%#` 0 ߼k )!~)bWݼ ބLa+j{h |bx\Y"Gd㖨ݑc"7 0Y nX* J~(Xˊ~)'v [^X ]=](#bX+ ˮ ǽl vXzӁe z~_bYT]w"(A'a]QxqaS2E=zH`mtފv`[X#pg"x%mWbeG$vY0-v ^qR9T5vD֢y5mcy2W a}ؼ#]uu]m8m ~evb)!   M($z("Q螂( 枹'Z'"DM衼<~ }9! ;`=#$v Y<.zHۼ((eg_}(a~8 zY(] 7j,ia^}ޢ`x!V$z&u$~' W<0Ejhx#UםG:!fi#qnd!ZXg`!u#X Wa8y '_b(" ~"~ `zRg2.8!qV~۝ay睻يg ~6߻8#9`Z'igyrhfqTǘ($}ݎ8^yנy" ~a` 7lB]sZ癪҂+h[u*r H 砉݉\ ؙvІݼ[Q}R)uq^IX'i'`fw裂)zHZUE( z Ǥz(h !I$z%sN#]qam}v'y$_8`[ry&`G$^vH` ~xmߖW%Za^8'_Dލw2M[Ug䉸_v\g3yrH^Zg c3ڻI%i9biUHu~,bez`abv'\(uY]8'W9Hg"8^9"~!(*_(c'߆Ic5uߒ X#5 ~ގi!e>   O$I r'OG$蠊I"yeZ'DQWuנ:ٞ~W߉ y97ar( ;`Eˉ+k8Uu "}Wg՗EBnHXnFtue%Hm!#zH']v9b`y1̻8i$݆j"'zY}b vgdX%^Ic*ټz)w9I^! ߊfuH$ b`~("u蠼!z7^`! 88a!~^UX!)ؒF"UhZ}!!~(&n' wf!zr8ۻI*6#߉&w 95}qףqx ]yyǠhy  }`v㕶Yr6y"HH܂HYX}[qv &am^(\j֙i_V%~Gix"e4zG87~ ܆`78#G܉ށWj'ǚ)$y&h`jeG~ '~ mVf~X߻כy^~8$(gt}RE d#}acaؤ}؝gm_U]~ $_\uj~Iv6'zzGb#jXbQG$➫%iEVᎉiw3ae*Hei^uzi8dv }`(݊_qeټ HYXݎ&h#`Hz)b+'_'_8`2` zW9"v~h;"   Oz $"Q "d)XUQUn?`am:G}u\<`A#rG8] q9gYE 'iY 7j~XYʒ&aЅbzg}$veפ֫YtIyYe6fj!#~*y!"!%7xc8߉` H}ǝc zH#Ǟ ؞v((` Hcz7 ~!z7ە e3$v7ګdz#aG9 X G E 飂)"br`"e7ux# {*z~Nx`ɻ=ig u݆7"'qȦg ) xq (_"Gn7_v'V`߼矂'm޻m_^eW&Uu}`}yy`]"z'GX#}_jFiǢf}c7߂HauYۻ'ava~(Lv(i$V=dmbYʰ~Ѕ\'z~(bx&U+^%E a z7n(Y_z( $~8"m:#nߑf,蠒`rW)z8ar88 rcXh;9%PW$huZ?"e'9bY[}]VWH$y~ߎ7'y^]W bzg(ch8`(z8#a9a(*bXߊ("3}`8 4ކ(" d;螂   Sj袚(O'(&)yX A3a%Ղ9ݍa_< }}b<_A(G87 W8 a~uYXO @kv(}֡^mu]߲I'm-ZXc!zix%n9i]'aX 袊`c8#ڼ ~ }!v' 6}`y݆7 W_yc(! 8_ȣ7y] 7bz }rqX"YH yz8 ]X 8ǡyz(_ (^'! }餎H !WH]&f&9ʦQm黵v) yU !ln6jxǟ#~9(H}`v}נ}y]mފ'8m#qD]h eygy`H'm([g_c d'Zz(y]v"z""u`'(ܻ_}dz߻Yl pyֻ9mX~ ^~w`Xb砚[}a#~~'ށc#m$}޻uv(&v'_ǤH x!gYf)qm蠻89i9ZIz &ܒwMtCZ&u<Y8!W#yn_6mfَ)"r'(zd؞v'}aa Y8c(((7餼'~ ]"z(-bhbu"^3؟v(G$5'~ $9 7'   H 8L$ I$r $G$ 88 &í2 @ 8䎧 )A&"L$bN,QG0DO4q G Bb 8( b ]mƚ0& qY @ێq~ڨ0 ~+~;E#L$Kj'@%yؠ]d;"}acڤ@?hmqYzPMtreۖߤ09yȞ7Gˆ♭8rdJz~87aI#y٦ qwu㣀|2~ #I݊@,X(kIhyh%m#xqejH d haX\us ئae([Y}ꬖ U4VHNcJ.!h$ K*I2' dj*@ Q"`"4Q J<  &, (i*a(!0 id)QX,$ 8(#qO@(!K$Q41C Jje  `4BG$h 0bq,p .Ӌ P  .K0Ǟ0 a `$$K0 Š *"1J ȌYǔ **qʠ ʎ(b(j(, 0aÒۯ _4M EeEiלކ(ayLs$04EeQ&Ire qvg'Y $]ªgqv#\r j-p~Irj3i`曖ᥐoe#"8=6Ѣ( Xv)[hm}UaEQTOQ{g``=w'թp n!1]z U'^YS8Z]hI taՔae7*[8&YG%Fugy_&=E}Yw$إmqv rJV"y&'^مFd!ܥ $a,q릤 F8瞉q$BR0s$ j瘤 ¦y z+&j k&L$y_(b xa_pf}@zM)& nZ_ ;We(I`9w 8zy}_} qՠ~YU,Cu ' r&p (C (`"irHqܦ)}ВDfaϨ7_"y :fHI1[(_ +RKok- !` \W9LP\һup*n}aT=ة \ IuUmF`0 }_^#aav8a~acw8ޢ@zmIa^Hd M4$$( H&똪(ȆՒWւ āZ\H}%qq@wi^mi_0 & nNf_V6㪘2c%x'!buu jb(!n" {ɼE PgexƩ$qhka(bx=w!iמ)b ޷Yq ㇂#u$ &˰  y` ~yƨܹYQe8[ުlM筰YiAFqCѬ gY9iD aH SHa @fBzJY吪Zb+ꚛ]wZ2ޱ$F$HF0, $j('0H( F $_AMDy] I^'`'XߊW^~H~Y`9}Gz} !kh>& x^y"hv'نHybx ~#Y߬$ `ϭ%⦷8YXQz)_z)jiٰp^iأ(`` Q1Ch ~], (]=B[H蠒(a]8 h$li &h(YUW<, $1QHE 9Ȟqd$r2L(  X hqǞ')&"0I8x ,8G B4 & zIzF8@$C B yq&` 2& a  )I&i&p -A" h$aM,K$$p f(Fqǚ HȦi)fKM$  H 0$X '$ r 2" ʪ(h 71aF0ɧx ,L 0p qŨ "qe$ q$ Ȥy,f jH4 QmXLT9$Puߥx 8=s  dIh y}#}Ǥ`.^}\{'\[:z7V7h3''[9 Z!~X~9 Ne[j^u]qgߧb"}ע8Z fu敤0qdI ꨸]yaW@ b'=Ӂe9b)d ,.!A( {)(IA  QU8YMzM1JܱA`ye%)Q׎" e:wfɆFg=WF*]@ >SvHaDm " &8 40Q$<$†q 0A(H b( hYpȢ ie&ƔBh JaBA,aΩ!VX抚`Dղ{{\,jr)h池&Vڣ#}h qgZr*,Yd]~xaj'=5Pɡmg7vxy~PHǓYEX-qߦ08a=t}8H׆(_ 8NJW}碊(V]K6}Z$[g}^` E+lp7f !Yh I(k, iH]5g pY4aRMfݨg$ \=Dp 7\}YQG`ᧀg8떌Kܪ) * z݂UW8Ս极}aXqWmi䫰zaZbefxY"Xa(᪸iߖ'8h ނ#$(݂X砬 h bH [Uy(eX y'  rܪa^(xH`~`p杉~bF} 'r`Ya8db5Awފ$` j"Yƚl&h Š/(Ͽw~!  Ge֯1VaaY"ƉYa4Ҭ8U2]竘IqdeX߫(bJJ0I0"C$ 'Z9H@]ޢyd ߦy0~"Aa$B hǮq>uy(3 ~ #i~'ް@_fgݧ Hhކ ޮy瞉砯(h¥֜ǟ5yz\7`@UVn)]0snai] u#m`}^(<݊Wh yhfjr= Xzzh$R pPy^aY, íǤeP_o]2(i@ae94LHR @a qpDB$(R (a$$QQ`$R @pD⑑ݚYX r$J E"Asr &zqƠ ʠF$q )gbH Ȩ厢*r.D1 p8 J"c$y蚧 "iqFQpB8 P(( GyIia B IҩQ%r<  pFrp,)রW(Xa9hU8Z隽-0WY2$VX'+$e^ sul9` V튊b:ފsHjZdl;4f(H`}Ͷ4M ($)iߦ e)f Om[kgYC kƤ G^]Xdc ҕzz7 !g8%yq鲧( WƢQX VҎXhae uЋ +$He(fy"g@ nWi` ̎(~'ax$z"r*x ,gq蜨DJ0 !iɨG qǠhȢrbK(bG( –yŞq )&Ej ᠒*)y0 Rb( r01G}߯X "R a0J bmZSVުۖ)Yq^(s~~ 頂߂ '~(^7ު@v'vvH7]ߪ[v஀\NU劊ޅpB\ i}yuެD~ނ!}@Tyv~૰Y7au衬06`8_5Xn(VbV ]yhqP=r}̆@ IErGHijiD( hY˘Iƨ RF9묧 ")BX H @B$`ڪ,`-58XQD $ uau0Œ H" yf)d\X 4ڬH ]<, )FA8R $r01 Fx0QGa Q$H &r qy砧HG'HFzIg 妊+簧P ꪖQ$ 80H "2K(%&:KhÒXjI ʬ9*" eqH z) 0 ڋ& Qd8F4pL,B ,b蔉" $A a   I4b0,$r0,h GL**. Ŝ)춊^ aK8 Dyhz*i0H(K hEAM00@@ (&X A$$J$ 1YE z7I8 J\h|~5"]YSNu٤p3uaj(ߣ# #a]8pف#8ai Њ !Xe&KinQ%f@ghh6\T_mA\X41 (9OxTaV]K0, 'e%T} Ha8jiH EIy뎪ޒu QV aM9U]DTt1u K*” #Q9`C(J(r i(j( z &a  g0҉$j .@ (Pj)ybsJ( *rK< @ FʚzdG*h i J (h"PqbIH ҍ^yZYE` bݳ{" [h! x 1׺m UIW!M蟥@9F q1$  0a 8L8Hrr,F$qNA( 'H*zI&I,A,ÉrI J  , R 8Ah _uמ}ݕ ^uTYhFUl]]ym (]e@ ݁v!H&K*,o -hH`yJDŭV]5Vquন I&GH J Vu y$qD,20r,  (  $8$H$rHFp a ($ &p g*( zj GLH + 0$ * & Eɧq$` ɠQhڇ b` r&( )b% e $ͦ )r즚, s ( )g&z*0 arG$($ HaA0 H z i"H rL,ӌ,` '} vZ~)ec*dpie ԓux eYǞ}4s*ȝ0}mDmu@3em_uǟciiqHŜqq ~ 5q^faǡf(_ BYirG&)hZG Gz&G $yǠbFzP֙v_h ` rf+"h z(&y騩xy覉ǘRh` ĎXahٚ(_h P'9_4tڧɞqĚb "( +Qjh yye "$!&4AQG$p B(08_}M1hƩi(8G@ A }]0ͫ h $ y*yf( =5=sX ͸-($`a8,K  RJ$C$q$b x a0QFP ("b0F$ar PGX' i ,ɢq%@ .O0jf qk*re '*gJ x1, pL x <H$h8a$ I$ "X fjzg0ɦX hAHH PC!(, (z qQE,ц  8 Ž(b 0b,0J$p I0褩 i Ǧ $r q ɔD$bLI@ ,@zꠧ( "k#" ( %uގ'(@'cL]$DnXh 8ь]Z'Ie,1x`U]M~G{j )\ucu"}\֟~ZI}y'8_ݢw7)c調ia" Û)`^ %Y0uƕMXӞ#~)dli` $A 6P V[n؛0 '  rK* H[[b\=8& PUT'  if&p 椚%$I [(aݣ cu*}+ݤ $-* 0 $zre `i ye j0i!&YJ x^aHz XSAEbP(,I.( ybj'bU( q]ޒ5 . $4P fHL.ɤ Gª ,AFM,4 B I0ч8r  4DFE$I ADr((I0‰RK, r 8R 80c 0rKQ < }1˾Zrey7 ފ8agu`;7" *(=9bz8}ۼD&&y`j8 >8` *&y @JbLԦUJ("f[S(9h)ZdQ-8ܼO^r"icX80tۥɹ#n{ÂIӼT byvGhvԌe& ς _ꥒ)MH.%XUJ nYLX o en%XAma^y 5O~` '`]qݼzdJ{ټe=e  ``M ) ~'~ $μ 65߆'!eFq频 @ՅvH!BF߉z~F!zqyD)/rvm!O$@ՂhS*`6qv8R88cu34{'^ZK b'Z #ߎGm%e>LJygJ{tȑ[V]Gm}iXvrhἩ&8Ï^j9#aeY&S,a䪊kovpW_ּަjzw ~Ib)] )lh~(Y =Qb㼐 L#mj Vt9ˣآz.y`uVXym[ z͆v!@8f crI`Fh{&z缑 ii%q. )]vּFઘ)F e c3yYXr [.[v؂X% 8 b,IEX:ai")aQ^Y0ԋ;ֆu֖tYe`z\m"y j']f۪j+yfHUTEM`f%iY4u^mib u]׊ݼev8avؼ ~}`yHW   %q(]x`iaf_ q*؟zG_z)d߻(dvI߻`۫nGUH?vjHr:vv`@GيJbz'>h^d"D'Ym6Mϼ1"(y+k\Uyw)[Vx)i*DkJ^FXsŒ@QB ݭ~-l㊊ezI#LcMi58.KM(  id )iڼ{uuo~偹&b 'ނ'߂7߼ p~]'i]O뙸ܕ7߼^"Y`X_ Yva" ,ymNrۛ{Y jh7༶WYecY T $t(ꟼG rHٖr %7yZ҂3y`V^v we|ہ%q&U&ۼ 4lJeiƝ6nXjFYV2ּau< /h\!؞A7yw 3`][bY$)Ygxw&q"`q)m/r(]UwMӼK[euQW#2⍸v\]Z#e]qٖ8e~'v(_y 7y}e   頪H$b(mƠqeUv^ء pR_* hkXffD&\52ij=XUV\M8,dv_i8\i@ l㦚'[u0R [=FZYl5x!.鱆Q 2(`  8ܼ+a r(ἒ'v'n8aj %y$z)zX!V vGq^v + i 3:iIW [r Ye`l]*` ( ZX mde4\%Ry*d5e' i= eH6nG o `ԼZX%L %vbUVTYՈ5mnV# E<1Ez/"}W66ajdV[%.~9h}צdX)rXeQ&Nz 'Qr\{iUUYUӁcܼHij]f׼6yby$[y_Y}_ F[}cW"qvނ   O"$HQ ( XJdZ( 93 ]Y >azau޼=bu;(848ǧUR bggT_&ڻ7$eb(%}jefH_G7_"Yq}!rH_}W(]Xc߼ dv`I `~8( X]}aI 8b &Fu( u&ܒGu"Gu z݁7$HaHa~ ! ؟v`~`_uy_! 韂ކ7~^ '_}%b[n ֘0Ğh}ܻgi"j $&yuuZ 諂ͮ]נW`߆(֝Vx&n^0 zyۂ߼~J"~^M}\z8yL}6b$X^vAuuֲtaGhHYӡ)Wmئ\)#uHbz8deY~GXQCJ\@ɖY08ZHpVGvHbi %~((z_8(uw~8!(v7uؤ#KfIdmۻ -<[w#)emWy_"rH"exYYי I(~6dV9Uz 80)Ueq|izhI"%m~8a~ȠaG}(c~)ނ(YFW a)hߢ8( Hx%~H$ d(_-蝑nYc8"3b(a7b~i`8$<]   UǠry( Q'zkZ"MOIU A!m_瞼@r\?4$G;iH#0ؼXEq_'["~7zwa\ s&u}$؂I!uݼagI喊ay aq c8yV裆XȤ~(}硼 b(a~` va  ށ& !u^a 8_ }ך]eZ7}`'ߒ' ߉`~ b^z` cy`&ݼ  ~&y` ؟~^_za a~ފI#y1 e+^uw f\Hz" _q}鳒쨼vfdm(_7ء~G'bi r~ w $9cYCΆ޼Fdiem[iMsf8bla^}V߻Z߂7}LMp䥊bm Fj6 &zeqH]'I^ ߚIdmN) lUE`xs|[g7;5a&Xjqơ7g)#]ם}HrW X'(eZ j7z"^r'(!~^yd ޖ`hb\^Y$mu 'r"y""6XRf8̨n:Xp(!n]q("]UW8~yb-Hmtچ8y޼^zG"#v(aETּ  ^hI#)'~'(e"7$)b+\gab%0W_^'84WX ":c   O (SȢrI( Y^5Mǔƞ=X} vh]=("~"<(c@N( }ǟ&榛e $QW ȡ<ڼߎ8^v ^!_i__Hv_UA߉ɠ&("fg} z_}rv܎(~! H"߂&wn`} (~G}" H~] Srh~h 'v# 9!e7vޕ vc'`#xa Eu}I ߎbz v~(_($uX  a~DX!8me *+Θ`!8!uJ' K`j'@Ӎ'⁷eǜӝ Wq߾1C b<8b8%Qe=#M[خ.]hri}mi ) lazU_`~fޞ8)!x_ 85[ۧeE! zc`9fX#ꎇ^݉`JXRF" ,^:fqɊลw,BaE2SBnR)bzh$}X$q&u[_#va#]v}a8!eן'ۻ8vj߻eiǝ !(y뱼eUSګ`GuyH!ev8`q($a8߼$7iaUV )#d*&礎I}yb"a( 'g#9!~`1 d 9 z8^~8c<    Qz" )Q("yg^X$^q;(z'iW'עi hr(zܻ\nx eqx㑷rFOaAr&ui}樁Qf86%z}!]hy߆ ۱(iXHc"!~7_~(b'bqYEh%)Yd8"Ia!%'߂,Z$(3qގH6݂cqפ)c:ނ   F($J,r(Q(@D00K,x LkiX,I q$B<r(G Fc ɠ j嚂-(蠦 I‡ q)*0 G ǠJ&ꇖX HbA Ӌ AY .@'(a8L8 ފ(檚~3H =7!MrGۤ(K^]iuQh(K֎`vBV_][R "XuuamcyݥXm[}ڥՆ֛u} mib :[`_TX] 25%PD$4 Diڭ eh8, cY#˜E!R$P D"qG hy0 j0bf R0AjP# ̦{ 2D8 Im)) 䌂 j묣gUVi!y6h ˰8`r%e fYnj\ m_v }+ $b 2L]̢. *Z dQ˲-2y g0 $(p zk.‡B,a 2(q@paL((`` H(`0II,I h4Fb r , G眤Pb$HGP4(a hIK,hG(Iq x '( ~L8֭0W<#aޭg4];pc) q ]d۞g!傽.) (KLX%fui)f(8Y 'HI*!fNtIb}N!֟ d"a:h22&飤 ɲj0y(zX@ *Q ɪ nzm&.8~{b~)if~*݅@>}f~ؽ~ (pɊ(HC!0 (&k  G6̤GBQ$a (L$ZJ)$8B bCE, yĚ zi(zɒƪ0 b"hri@ GZ8 f&ʚiHh(Z(HI#ԙJ&H }O ݞ^)+ei:bT^)8_ںq&( I CL(4H "Hyh xaC ! HB(D G0$,K$bL$( $K802F@ a q㜤 m. f$8$  (rXHrL0F,h SGq P ~'_ "8$ !yUm5jHZ@,ni q=h5PI`I,19o= XSW-vX^5c:I I'1) Z'~ {T|ЊE15Fݕj*F)e]ݥhqSwYk [yqѦmy^ Pۖwۖ9 [U Tmߪ M皊ik U ]eH!!ס߁WH~7^^v'\h 6Gəjc C G I $p ,Ǫ"q,F$bbI$q &{)$YI $줂'Y墦H"(F< ǤaXM5Y~^~H0e(a@ $08 ށ~Ia˜ިNd}KyڨHIYQOP }~ ( k!}r"iq Ǩ8 JigX & qzb0 ߅מiqf3vgI8 x r(! @ g8j}!rǭx^Ai]n8kZ'_ާg (\7z }( hq.+$Y%:]z'i]ic "em{ǩ'"g^]ڱp gx Xa݆Z`:_%]rXy(e+@ %"z+1$qaI_yYe<(NeS܊qH\m .k.L,^YUW0AΨ$†R ,ALR H RG0Q,QE J$1A88 ~ c$ *K$b x iIQh2 b 4҉xApD<@ J*,p FKzk2 qbbg ")98 K $a. &yX fyy%9& ` ,  IqE J0rF j * X1H$K,Ì0 蚺h(a`YuTUEA٦ ɠ0 0 s$ц(0$b 8L4r(<(YX g 0ۋx6b< r,ۢ,׌LzPE&80mee]mh3z~_gފ_ Gu&Hݤ81"8`8`ly[vHXm8Tyu}Pc}/u'mxxUebݡ@ `i(H B]rZl Iq2p ^8vl wURLܢ g"AiR xŰɥh iF h($D F"+0z ֲHe)f aɪh $I"L"Ŭ kX&y"A& $cb/. q2F E*&2J* -Jf9e}g ]1Fcf'#s + $&︲騑0D A 8IG 4b $( HR($ y賉g 㔂Jyi$J8Q  $" p í$G$ӊ$B$A4 y! i3,v9tYv0ApH,r(X2I$D h QYE (@G(` &ZʔH V=Rf&SK4$ ,,48 I"†rk$((,1bx P qH,@ &Q&XB,J, 0 碢Ba#8 , ghj0Q( :h JzH$aD &x蚂  ,p  ( %&(0 ǚyf((&X "+a0 ^0a 2J L C(j%4$ i(y )" ( P(L K$ (9 `0 GICi(*҉*8 8!a r(pH 8"M@Pƙ]Ʒߦaz_H!}`8`z   #ݖH`hZ uȠ~`zPhj rI" 8G(dc8B7,P54P7a9DQAVaۡ  .Y$ u_ &H av-g߆Id d%lҪ ((1'Hh( 'hq$첢p bI ( i +$z6ŠFAG,Yn$ %Ji$ 4i"x , Ŗ0p /y䠁蠫 , * Ȯ('"`fKC/:j $Af0㒢 }ah]v֢d,{ r 4ZqTUۂܢh ] p *z.$ҍ,(rH a&&jG( Da00$s  Gaʢ&& GIǤJ& *[j阣 0垊kf ,J#" eiIy jw^z!\# i Ir( 0 0B ⨘YP# vlyڸݭ 4i_uߦp)z Y" ,a$bJ6))f04q E[P U1H Y,*I$Zg(qގH8 L֩cުxߒɒWUqV8mƜ8 H Q0ҋ& ^vX^۱(mP!91<ӧh䳻ydtLߧ.qEDʥdi!  !뜩rȤ( +4{ wg੘^aa8 )W)("h%̅cU.`F:r,4ةxeӏ8xV\jCVJ";mci`y#!֟ަp}ۂ y4~G )f(yuE]Y$}߭ o~[(#,䙉\(}zگsQ$E_9ਠ æai&h qeKTz'ݒII8 a3agy^yb} }~J!H u봂GUmf[IP0Ag_YǡYY[mOn(7Qcq#Uu 0R,qu]ީ쑷_u2iIX X$mށ"e fv"9!m9ަ@ fzHhl* $w[}5zIv hJ(1Dh:~7uѦX&[aT n7#'ڎ# a„ 8yM5@󐪘 IE&禪@!I! j0J&0!Uu$IP r&&ih@Jr8$ jIjj"r(0bD$K ]$Z#H ,*ɦ` i (I ȝG(e(lg)z@4A$ bB$F4J$(sN  Kr hy` qG$Y.ad eb j& Fz*   pBY ꎪ.ygrȠ  `Eど^e mr(qջ؞|z'q睻8\'9bHVbڤj''g_. t!Hb~!q]mzGTت0jZ $+}fV*(硂(`vb$g8߼,($m(&0yWeܼ+8~7u9&, 8` ' .'(a %:9v8!xו磼>`g` !8&b?dj6?NHib^<z%[U)~F'8tra׭],b騜Q_=R7^5߼00nx_i9ے?j#~)wyW"D蠞)e4P9q=w#FTuMr mjCH -%ۚ`gIa)f4G-rʕX\^+]ޒHt>2e!_鳾؎G YU5ƙ'|'"~(㼂ƘG`Ἅe޼(&!㼚!y(n༑5ں( :\ ~if~:' $JH㲫.׌Y-'^$-)**Y)Ι\5x) n^ wX dHNnnX* '(`|"aI㼣 Fb} ^[֩%Xn*m yY7vݽWYh$Yf6f`A` `xؼ} N$_)Wْ#u"73aZ5 $jU۪9`H^Y"u F^F "uaWd@Z~&MN-^MM4uv;Yיm-`my uyr8Z7q`^n)d[u]}^^   uݎGu㻗( rǠHMy~(\yhyuak( 8] FhY i[&\67ua-[Xz#ۼ2qv)܎\+FݖY}#1bq d1\}ފ7ݎ'h2_j dq4cjY }!.GG蠼7_]ߒW޼.7ڊG5#HgFEቨbrbiF5avhhV<`iA)y砚iBxgV8'Hj ueH9"a zzDznF~ }UKvMԼjʊ >hUQ'&q8`+Y+N&W)%TMid!HbqFz)b,bע|$ZUW)癦` G&͚;-iWbj(u]@ (hݼ5(أ8C?a8("N y*M W "~UyY &[}څ[;3[ i hcG"^( &Y)HY޼^UJZ(msdԢ^N!ǁ3Qn림VH9H)MX#inEܼמ6nG^[[dl SGJWf mޝ)Ume5Ѽ 4K!+$ u]n(im9Raybf(9"jx`}!9w_va8"yۼ5{QUaXauY0Yieס޼$m؞ƣm &^ru\ 7!u[~]az qa &   Xv`)zdiVie[( 0hy߻F%蝞vxgYv(`_/ky^(^u_9"}ǜ}z+jH%}cv]~':b''r8*9j6v))*(9qݎX%+v^yY*K !g`zI߼+*a' ev߼1) +n4gzGI$ڼ1Ǥy磖ic3)b(8cj9$8!i#(:Hm^Gz*7 Dea}_;/r9my e~'ކ c~$+ ߆(^މM`~'e($H#R guu蠼- 7m޼-/+ucXדmjyDGAw?i[X#8ˊXT(۝d! i mڒ;(Er U/Ҟ]ii9Q 5uEi!=7DZ\pezay#^7o)yz\ X8b! Ce~(!( gyq _u_~ z #n Q6Y^;jn¨w8"uܼXrI F缄n'qU~K}vHu 8`f)l8yJ]Y&p¥Ԗ mIUT$U$ !ywy؞Z`)`ls$]ՠ5(6i5༕XY]\ y#=3)N!( _r8_qX蚞XmEu\6 r#uל(uGܼ,a~q_'^;*AeUWYaf$]!y\߆^}٢mr!ia 盅jS}'qbc   qI"zHqreU5ULd(a)_WZ) F i9c^6Ly #n(]bء>fG߼7j^j\/gb:兩f碼@H$]8ۼ:(; &`N4 u^~e99bX9$瞼@ ~Ei藅z`;)^60) 臼;9͂!V,fBz蝼=DQ_crW:gz t”r'l#XcGvG'޼5j~&ނNw:qG$n)$(V&d١ܝݼ<ͣ#VW7;.Vh(^UZ(\`jO7r&ݚWz'C䙊6uy Ozk$GqVVFlW',i&Z"g\) y&rg _a $vj*H UY% ۼ9:fcb]e ('f)ٞ`uBb9_cX9]Gb[Gߊfz޼hvޭb^$iVג˲ 8X!qv@MKHz(feC ~~M86 L"(~d'޼-܆H܊$~X"+ :\(8cI X!(|DjO]Teҝ)& u^א(߆ 5|zSyWJLzւH缤@:߂( 輫 7 袆( ׏~y}߼ TI=Ղ)݆zG_aFT6܍ieێWuiV "u_x!v z'_"y\k2aiVu!aڅi ee(Y~}`E՞)fXuvgwVF\   Q"z"S"I٩^G Ga   SX䁶y瞼QH b8%`~ֈ린 _Lz8!( Z2ΰ e%x [ *~vVI\#Vf9bڄ憸Y!UZJ0[}av`$ RzUkr c5Ͱp 'c

i夨 90 i&P j!h8,kp`1avm]ゼr7֥\` mߣ@vHi׫I]XzI袺mq Iqi׍{eeAyb8P<7$aeV[0 A׮{@$8XU`e 1FM4Ԥܒ!e~gIG rqvPkn'\@ ̼Y$Ŧ8v8'yfh:5~X ]c@8nI`vH 8 -ŠP4ǝ(y硥h)1H[]e~8X 6Ǣh 6iȞhagX8 BH0x arHr9MJ L[I1 _H\A5_L8p(c}X)Ԥyd 'qbaڥ #Ý0e& rɒj (d`jA1Q(`H< )V\( i8fIqgx,L(aD ڷ?rz%["m H Ja"3` dZ)(P X 碤(RB 2 P q٣zݤ( H2fȎk $AMA<,2Q HLB  HQ`嘣Hq殫)` )% 䞒"(l@0 b nY^m \g`)< f aA& ǎ) & yYe݂(}YZ nzvq^8]VwXy]#My kn0瞖)as,8U$H Ǽw~Ϥ8 Y+]kjeDO yIku@h+nzK<ѧy$Q (סMq$ȡv$8 yys`epXz-X0r{rhi`zyy`}=I5[ ɟdXeeAڢp vNs@z'z8.^_( h H} Xx!~ކax]}Ǡ(! ןb(`yT7a~`~!7`a!}` `vyab u~ r_``-~^`~ߣ'~yףx8p8ZW iW^]ߥ8 zjI,0q(B L s <0 (a(bH (1 ` bÇ,Kp Öq螪Ha(h‰H8b `@ GQH$1(` % aEYhbh 8 {](@wP7LY瞦(2T4>iݢfԤ }xv g2x}}yHyru7x%(rJ#(~@ 㚉Z2& )e_PФh2e$נ "k Ǝ QH.HY& !I!_!ry"jXCe#y{#h@yɨ@ ʢ1(】 0( b(Y8 PE(Fr ^!' 2 fҍ2"]Uq8㎦0 He1j"0"PƢ(0 $҆ b(( ǘy AB@IS^y@ h$Y*H (4"‹,a(Œ  f˪P qGqˬ#0p$ 4 I蠃 p"h J@枂D (rP撺%hA( ,@Fh ae(yf霦Pq (a 0 $  (,ɨiP0RI$҉s ` h.6 $GgA'7 EADΥ$J4B  E.H!H rg D0  0Ěb$j(x $]'( J9i֛ $j0D(qZ1$M$*&D AA Der) ٍq")% 2 Hg&H ^jjh"Y8 rÒ+"k h}ĕ9 v+/`(i0ͦ0J,e,*P PȠQf@ "JjjFX$0SJ$ e1a*x ) f覡 %y0bLG gzI0ǜ$M4p E҇00y$  420! H)"*)D e0ҍ,1'X E,ibJx-8;" ,e١#I`H`  @G]I"I"80((^ ňφ@劂~_  ! !a 0!a~ !!y~!F z"~"}cHrd}#y$hVbm"]@im q୐imyǠPm}W",_W 4W9x0PmdO` Z]]M@ x'Id8ďiX=(9$A#٧`ة vUJx&ae0ӌ7zj &uZY  ]a0ܿ7`u~:} `"-`[~7] ``q e e]ǡy $S蟆(agY ~)cuMMa` ^eqb~y 8 ƊAdr H8Xܦ~ fv(#SyqǢ]#u`rp ` yy#x Au }u ŎymWMd~a~(}袊8#zc yح~I qj H& d" z"Ey$'@B‡J* u)bX'iڦb㚊+0Uk1k gHyƚu0 al/P Hq, Ǣ"΍چ(aV[ j$'82 y vi bRIyע8 ӓeX\~` bPn$'uH bRr}n ۑ aښ^H$8 R`V\z($ ]Y!8 Zge\h8 mu((A,Pzj8 )!jޒI”y梡Ǣr 蚎W z7eڡF"SN$ `z !gqĦhyHRk*(QH jG$j鮑H:̴i jjQ,q=4H⫈ k2[*H hyg6c .]T4 8_QE=%( *.$9r zlr'qe.8 zIJ&&~5օ` #&i(9{H (‰1G$ i&Ƙ)hqQPע"'HZ1y"v`H diЎѣv'َ`b8!u*z_HYq2Yu08_戠f`^iǠ褧:HUy}/y认  }dy}uuOp~^^}ᡨ=}ߡ ~8<}~|݆~ߢ麆0 '8)1#h 0S( P]y]e,$A 0 y=2 '.4鮢K,pYeQ0M0aS $  bE$I (`KEqG8 I"9 QGq I˪j h"Jɬ@ ƜG)鲥 G R (_~`&޼;zU/r.=&IK+ߒzx JX\yUV`yuTeeҒKwU8(iәY%N kmZ!"rZ}߼"zx`c'G~(ܼYnWu'za} ޼I\m"yQz d~ M~7V$" &q{`^x ']؟z8bf7rzPWdy'm(abgFiuhQ)iaYv6%,'Z}X؊"[u~'_DmȥY8Uvcm)rH߻hZZ݊eOz&F2Չ8mQD[ ޞi1Ycǡv8](q]u~r`慨!%'}c܊ܑ݂}}!8by矼"n "Zy'a 3S_ۉZ~aa}Zm߼v^rYݼv4q'"}c~8߻8b,Yi"~9f]I a}br9"HHe!~H^fu[)ޢ8 AEayٖ8v4d}$< iby+bhAzZ%:HX=] ^) j~~6v]rXށڻ\vH$+88dy:$'UDԾ-i[}~_m:]X08#_~2ahiM5Y$iJc'3aXv8ؤ:b d~(߅砼>^~Fߊ')bAr~?"z'bD   Xץm xXcv)"^"MTMMv\F z("蠊G F砂 $y D'0(z auي'}מ }\~'ae((bu[~_Gq!`GZg_uv9]y\i_r'}& !%Q(ݻdqǠ $V''&j( r8y &)&蠻G袵禖'ci ! ~GHzG '~(d~~w*y]  ~_^ $}~an9z}qhak Cn VdeywėmtH\=mcqX zDG 'yن$X_ ؓeh7j*! 7߁נ~"X8%xdeӼZHvG^枙ouGԼGd~'a _Vvk)zH E.y&؊ןz6y(! &Ib$ j^$Oށښmaμ( *IUU #%y_ $~Hy^W^f8cc}hc9e\6N ,ۅ!&vV z)ZJn&7aƚynGN9!maqٞyzW8b deb7)(k7eu$Uu-a[߆ a];]uYhZ6aq`'~)_6caǡUU'H█$4'8yȞh9(ނ7$>7aߍ禂(޼B'b`7Dv~ B'c   X&'m`Z[n7 &`'$YL.8d~*qgXXʪ( Q!_Q H!LYX ` H eK j^'K qG}8KH_~yLu H_(̂8y͎'qߩ8OmנߎH x5ݎ8_u"pW[mmלMq!}ޒܨ mߢe!eՓD"],r9#Җu"Y] Rv"i!eE@#aYUv<\b zb RK&ÚaǢ:+Qƞ Ip,C@ e` f GQ).8$s `AZCqq F qR6 , Y"(!h!$v b꒖Hc砤 Dzj$J"0갣P8&}!`0vAvXᆈ*f~&X(߂9e}l]xߒy*b7gfHW%aa0(]aM-!Pawqw_g~~6}P)z*;) iv$ybjY'`@q]}H 0yן]v,JD0qDAh _<  <&l$P`YeQQ, `r Q $Pˆ BX$$2G PQFb $x GbI"ǚH k몤 ,,M((DA Q6) oQhy՜Xvqa!euyzz'~ԵŊ߸}}ߵU^mme!06Qa m`r`z!n_ .k Zgi饉_ ŌqŜQpwu\)2 Mf8 f;ƤꌆGvb^Ǚz(AdH@GmOkJ&x [_ybŖ !_Hy``~ɧd( 틫3:.qțL  璚*2r)H$0,҅$ H_!Z䪰a(8Sqآ kHǪ1Hi\pq[+q!umSS} @ %c*iPk'py5ih g}TYY͠D,( {+aYGh`K8SH @#L1 p ]sºm_"Hҍ楤1.yvbl0ߊHq,8n/Y]ۆآHljb٥a}_~G !da&fI ~$yZK~_p j8eve)8vlxIWF~gѡpDu^ygciޠ@zX !~GSX _f("}]l\p_]v'~L0RE( %*)q ^1eAx$!i.Jj(a( F Y &z: qB :I.ayuߖڲ8מ,nHࠨahƝnW&H8v~&H ˼&aj (hC(D8\(jpJ EabLh j"z j$HH$0 aHנ 8a0Gb(a_Hv)~)~bhFyקI6_ 9)~ah j~~ wuoydȧ fi(jX8a,sL FR*0gq(8(!H i,b( -Hm\z8$q(Q$aya, 1O,QF@!(=2 (+*(UEQ(K0Jq((IPD (Q { (aBP &AJm(cG( 8  2jh0A( $ , (!,4p "j$覓(F04! a") p cG 08F$h0 pFG B( $1   ( giĊpŘI( ʈ ,h0 (b 0(P(H4 =$=$if[X$qB c @ I'zr,`r x(a0a`aq M4P GadH疊F r'ri jGk/z%V]w HGiǨX!UUAPm۝p 9zH(P q4k` D1H,i #.AZJP j.AFfzoZʏ0΍7i( ʢf! E/2@8 haZٺijq$䒃k:"h". mʈ@gV-`HWM0 Tvp7gmy( jʴȜh +g"9 @yb~]uug=2}x(``9(~'( ؅N_}F_yw8TYeeHQ!q }!0)]Un_ :c*"%*aII0ڞ'7 rQKqzyf YGFR) 榪(*qY& qGYQ%}:, M}Ff$֣5\U] X⷏YܣH42+}cz&(}CY Ƙ˫.k8y*x4qK<$r(ߚjޣ8aGH`bJ KX CLv8x_#ijנ\)S(_/bY~Z!y-Vi&}Bգ(\I#y瞩b M4$`axi^:jmʧ8ɠ0 dz*d,qQGB(bAP0Q(P8L(2h}uaMڞ96牔Y'~a]v\%RnWXbMdH$n蛟_yb~X wc˰Qwiޤ ǨzIhH$H8q4( Ii"Ȱ0cH q0I C24҈48ߎ`8awޒ`HjKbmby'h΁ح# sFآVז`jKaO~f0Gz&(gx}!a,G@)iVbh,qQ p0y]u 0"(B@ )< G$.LMDQ$  A P$  c`b ‚ B  HS 0r( %$y몊g8 P ⫨ʇ Ǟhʤ벥 4 $H0G0 4D$ab 0 h zh jg jZꦊ+* 2$QEa$` "jb$y I QB(`<(P((pbP,1F,@,    Y%a$ (q(($s(O0,8  q$aajWݼܖy `.]VZrMeeii dek)o y-{5U`=$t򂴗qZ`uw)mV"6*[y9`Mj\Xm`^]x/m fXynXgkօpmt5}7iڨ~](to}}QF`6hո%9upnh(蠂G'vdver)[YV^l`\Hƞu#gEe\"`thKdOy`= 㬦i9Z\HyPgDVdh\Wba޼Xge省8׼0 `ڟ-)X.iB!y&_ךzNa$Hahafb`ic}aZmu~`F($X_r`H ]UjHydS$}r("fIk{G$Zr5׼ ,@ Ɩih)݊'eb a]uƜ{{%V&ݝռ֦R ق "{iIsiXeG)$nlg Hv~8>-qrhO h edOHǩIu\S%i +zMHG5cjyMz bQZ`zYrQ!A$Oa}9[eDO'yf0rh( (a(Hл8Xgqf~)#f/%y5awXc v$}ah$f}aVeX( y~}Š   "qiƦ jFEU|,pY'` %*(y枊"(\0}1yȤyd֟r*b +[ gi$yiZkz).X+tڞW)A*kxuޕӠ0MмvSvX7&e]U#XyI{uE{&Xb"SYiբ܁YۼZ<^Jn/bN(&5`Fz-٨M. Wx'mټQJ`"m'XH"mw&zZ^DjIeUOI'zƦO%$ b`z{wq虼^vqma3ȼ# u벛y4%\R1R.} v'i]`(GMwy'm^)f\&&u GH)^}vXd %+'n6vyZ7'#|m"b)q$Zk ټu}) (@„QU9"( ~=P (}y }`]藞ޚIмB8'yś`cy'@v%y"8 X^ 9 H!'QǨ)vg y頼U&q I\ڼQzbaMg$HܼMh$ Qu`qyǢh$HVr"vQ'4qZ~]X4Nx!"@dvm(_"Eλ)Ggۉlj rX^5]iz4tqIuqU6]فfyܻ6!j)Yg&iI:"}vgef!i睊WFȚHq$'$   gqi$G$a`UV|"0i#޻ jGJ z(%)ihG+[iqe( --n6KXvkrq;UYra(X%i%i렿k]{%jx)Ef'x  jU׮eT׼vg֙I9Z`X ]{^EҼxiIcmT@K-&ډQyي:`j`')eV`M)N[d޼O"%εh ^z))^%ټM#EZfZ\fur]p<U`tj蚧I>mNYeVWv^ɽjܗ%'\( x!Qg#i[q܁`QGz8UVrZMר?Yf AM  `v(b:Tځ _h垼6\q߼!}\r'߼y 7ܼ_}#޼8ݍi$'$~ޙaH`cye}眆 Z%yݼ#]G}uŎV Ȟi-qߊ^# z8ފ8 vg% xrH`eUj''ۼMקqU"M"F HeB hnY0YKzfnXz]f剦U Q&$izQ y G)QzGƢ +MH砂ةMH& y朼O%b%O@Re[#ey4̻ Y@Luj ߆'}Aކq޺ڻșygUZuim%ύ8ά]A]ԻU}ہ_7V:!a`ycaZz绿( q暉y\9&^hz'   XGuwx\ $e[13qmeH7gقe砼Kn8z[F, $BX8_muz  ` xmלB~v_wa^DNy)zixU9`j'lwU<zgi2݁eb)!tٻxX~}ۻ ^n^eG7ꞕ}b"bXa}"/z8!v:ۻ `V ts}ɎlaHUufMZbl| #eakc~Wܼ swbd捻8Y#uػ(hyhrW#jRnY7,`r(dUrb 9"Vamg%Yb%bZ\*mw&f19"3ؼEa2y fٍ ؟zG!6uYǥ)&v7C}&_Z`8H}_#[Dy!H"uD㉆a/iajak~8ކ)ihYD U]~d'+9 ]#RfmW'r)!(e\%f9 b%zټFf!!etҊY)E)%uջw^g!Y'r((~(6a}$_ؤ֞]~Xdauۻc#q皪F)i砕֥ټI5"J:a8},o$8a$ -$_'<ZW徻/%E aߊM]z,v$Ȟem7Y9盂Z7_91Yfe磻uay]'"u}UL1 ^rY}geXmZcYH 酲bz)!$z'ݑG%y^m!}Ƞ"(( }`'yZH^qHz߼<`v(_עz`<F}i^YN+ݎIf( $5(߆!>&)"~$BG"y瞒 &螼FȠrI"W`FzޑbzHFX    Zz '( Z'z($kiȤ= Uf"H'7 "K&uށ`z(K $rD!(_e' `u duZDN S]ǠA %% uWqX7`}֡d6vy:Hc6Zv#"%#q8`_ey؂g$v$m^ ߆_yd4(%x"]A~zWα ųzH\rj;3b5 *wފHzA$ 1}چ9Y t#٥A-֭ufػ]W\'hnxf(|4$Vץ'7ex Y_uǤf9~h晸ؚx Znۅw͊az8'U 7pb)b#eq"}te'%}Nu0a9e杂Xۂ #u~(8~H]蟒Z v`}#֟~u!9] " z  b~'g8p~_硼#ءUt0P)$!ibef52xYMTJ#X׼!܅z}䚼$ ~܆!va Sb棆## CeYǢjH'w(*UvH^vG^^d%^݂8jqy移GaWvGb'Ta7܆X`r8cw%wy_Y'0 O8_Hy,q%`UUGa~)d]߼Dy؝zF %(z8 F$YeټKc    1I0E &I.2  (H '",*X XLMe8L$Hr,@ID(J 4( F$RJ E$X,HaJ r0P(@8h F$ DPŘ  qi"n ,f(a0xQE(JY$e^udߚ])~In]窉anhdF㉦en ' I*^%mmvFy#z(z(])F ʪj)mi (Jm&؛X 8!ݛ_"~!ߍDߧMUygh [zHrhMWԉٵeFMG^T]Q_Yǟp=%BMgSޢN'_u(jȍj(aqeqSuy4qJvYvQV6~~h|e~} Ei}~fPjq0[l:ԠH#~ߠe#cyGCi(}h=Ɂg}k`vb[z(uYrIkkP8*#u^ Ǎk皩 U`*\ Ӭ-TX z$'0]@vH^~GlIϥ~[ڢHY+.X'z:smܑ8u]X*ybmסǡ8u݉֡(Z8a_(^( x׹(FHbX ї %ly 㨡j vgx c"Jˬ&( םϜ¬wpZWaE`ş!rMy(ȡ]j+^3e@M4 8g͞8~` E[ y f&B)0 Fi$bI z(!G}rh7cYꤰ%t{y_m-~'y(!Hm(^~ +9_b\"9\}alHqT!Hm8^Gݥ|}!l~x܎ah~ y!xL~ }ߦg˂"߂\u߂ߧHCߧ(p }ƞ0tQ[68e,eu"0 # n8ʩ@ *bn( 8BP yM$$Π hyI cH G) 8 *GC ,(Z KjuZ}u^} d9a}"שviq* /RUY Uɞ~ #+k%D^bZ Gafj `I$Q$ BQ 4"D P(A(Yr q K4瞃,",ӏ8ɎHWeg &IB≦(i 9:Si!~^ a)2byB0]~5ݡ<ؑn)q"(Ƹ`ƈv#Z 5)"^aeu#lfp$EG#I0`ؖHHކ( W]X(xRǨ"z9Zg]X{!ia%}`vi㖊a eh9 ʲ%ap 2ae[}$ "P QgJ( Ŝg)# 'ʧJHz . a$$8}9f H"ɤu WazaĐ! au~[*! n:1׾ iaF*㫨 z;5yߪ hAg{y Gag)q㖪 fY# %#"a_}ep viled8chv(qbcPym"9d.bjn:f\ymZqܩ LbI9EVQ}OhҦiigWZ s yUR}Þexܟ C d(fz f$KI g""js 2ie`y gY#y@0aHq,h``u֗r M0䒆JY꬞ $uh 44aE@ ahJ;mߞxrXݞ'qΞ@Tz&ުX~'2(9~$c"0춚z঩~(|~h_YmE$(byݣH eqZ,"y r'.䖣x ivmp Ai`z6ޅ(.:+8( DH j IzNr icͤ(0 G$hr,Xz(a+bD g$Q) eP GɬiH8KA  ,Qj>,9~)~h<:%yhP9fI cޚ("mS@(!ώ9" i9`\gf:`n9>iv!Lax!81~9f~fH⪈*1}b~8`)#X|8X~fx*b8(!``8㫐I#7᫨lh9)P-ێHeqjHܫ.WU~i^Ҩݭ" ޖ)) I03ySJiYya٬(!ra ()g^a}yX 7}C}f`x~Z~(Z)"؍n5̝(~8,ppaRp r rgY4%ѥ0Up f@"䜫 h'q5~(p/}잘! ! _Xzh_8L܂gޒ7ߤ80ǝƝמ}qu b.ue#f\7%Ձqu%'`( ! M ZB {C$yh$FJ,r8 (.zZM¦ ))$0˶9厢F" j&gPᠢ 0ziy j,Q 210a  ( %Zh쪢 zz鬢L]u (X1Bj X(P(Q <#uZQEH0G$N(2D0z!< Ȧl(Ab, ! @ €0 Æ0SD, , g$@ EdM*8 G̲G i&" ɦH($s4,†rG ,x f aGJ*2X(a M r4P&}"G_ #P j(( I P`$s $8(rH0(aGPJ$CG<( E&잂 G   &$:h ,b (ji@4`K J,H ɜiz'9 9aUmZ 4b (Ip$‡$ (Ga (r08C`4, 2J @DIiX '( $zM0IG7 Zgy4 QEU4 ] EVh[Yݚ~LrG; H(l\&Nݚ v*,Z ^"e9b\i囒 Wvcὥ-k$ ꁣM f,"Q*x`z0r4dX g'Yorᜈ ,Y$uf0 {v\h j(e` q蜜0 J $$aC F(a "x Cze' p*H0<1u]9 00١zovR06naJY2-JP>~}nqeӞG` ( 㢲aF&y( D((䘁 hfn]!P,`_GGݣ(qxI[ܦsy#P!֪% ΆIhWqe]_Gl_qv}݁˂% ߞCv ˧eOǝG+z{rxXr(zIXHz8zKX~ZeY偩.XZexޡgVGzh^"& & mjjXzeXYdaށ}݂[08Hzસ(dMMƚS zF4J) )a8`(@즞IW֪g8)cWroP }hog\V*!m)pB9[ƕ @ h$ nH]}yƗ`h~0hE8"`']Q%mf fgNd& ר}v'H )$B(&)C 8YRIh FYF0ኬ} ,aexogi0a^(M9'@.u~ ~Xz8J騈Pqu+(}1"UX`iߤpcMzx__PZH7ޚ'ߧG @]]yBuq]eמpmi]yמXqǠu]qݪHAq]m]iV}}e \QDխ׮8mVMgQ^Xe\AMǞj+ 7$l^c f!&` (r *j-"! FF&kC He+ ("b$ņ̤ f a($ ,#:*Q ,RF 0 fѧJ( '"a0db" 6" % 뚁(H0 @C(a _("Mt]t q6T=vr^@ r `m]M5@ 4r$rEh]u H뮂!I%P$I4cI QF$L,$RMÍ$BH 9%,=rƻ,( l)*˦J$8$R  ҇,X@4Q,Q$@(K(!I 8 bE,08 j(rK 8JB,0( J(q$P,Q A 0( 頚(F*X Q4 $  H  rLy뎹. HJ((zlR 408 (G(q$)E"@Yq(a(((0 !(8psH(S 0(C$ B$ ( A!YGb(p ' 6` MYy 8 jg'( QD, a֚\qC~Z"eEl^9i$Cu\V̂騚Ha5r g꒚5\] 5vꝛ 4E{rl &0 *+ shC EG4MQWۛ fmp[h( uGJz Vz'tu) J!ITwOP bBai؟0 ZhuFa' WnIyITyٝ}vK )M `M_zf a%&zսaO洡WVall3Jhh kBaF GyD"R)` ٛ!UF,s?3$ygxz bi&N 40X I)HRi']yec@Gdޭ!@ݦUƔ qGd(x c8^X_XP~ mQbTPnx%TFdegWP㙈a!Fy#  .8m!9ezmغt ޷ )~ Ǯ̒(*'u\Ң΢83mΈ$vj֡-AX0uSƨߢ~:׍t r 0 *Iɢ$``e mמۊ8}ȣQWJb$Yc!`uO k ~'Rh a,$," "8 **Ȯp 5vܢVCmHt슗 A4a˔x$2x"׏:jP_߆x Ϭ*rʞ*)iyǜVeJXeaY/m卅 Z <~IH'' ~䭀ay$a!eO@(tVqA#QȜJ89`X\xh$ߤ@.l+ Z7ޖ'ߎުE^ǠM}]y]2im^q眬dOmmu_`Vqq`yߨXyay~ m^}u瞦Hq]nu!P 2anY _~8!܂َg[Ay^QFEh0V9U]yݠ c]9im&vH؟0ȞrG`W-( juؚu *1 r(N b H#a) ).kf aj(a yHGij 'Z 6QȘ ƦeK[H ƨ"!` K*EH bfQ̬ i& 욂'(*^8cM4Mu MSJeer9`bI4Q$qUE ($ , "  ]sh Ʀ K&<$  H,rG4$1I4KB8 G,, dhb q Q4h@$4K40 *"gD$I(L,(L c 0J Xɢrq J)J L82L@ f`ØK(H01(04 $H4 I(H(b 0@(RNa40D0B ,(0  `W`($ q UTUx ,qI$~ỢG h"h$( &i(j$,qbeu' ~H㭖[RKڞ(M&'Npbkpt ފKvU8 YzqYZۃIex)멼U `HI[mx iv}䁘!5vS+aX)QF \ aSK"қ^J]4ލnXXbe䮙qeU7k܂IU6ޕubziܼiy΃ z(ӼvFi!rxZ^.z#e{'y\t`{*buSMs U<efV]i,(7!~~6g)%^Ib6Wda!#amjG_iZiYZv'q%zGbhf7jvƦzX}*gu߂Y igv\ ~i\u"fV6eG$#QǢ6Gqݻ (3>#hfyךмB)EqFQłz'A!`~H*OV|%v))F)󊙫,bZ"Ie "t'+zyN Q q砚H aȜM ')X"uqM)q9"K"m$()"S"aK('yge]Dq !~74 <.4/  ~!U˻J~'%uZ6ߝ$û"Aiu]R8]u޻qdmܞ]i Ǟwuʞz q q hq蜻   r&z $砻 b`IVx 08cF%j*$G&yI& &\3}!$'W(!0z^B%x) MnnNauW`flevzgy[Oo-%YsJf[+\uwBTx+SUIeW{G2qyu8daּZUFoٶ(&OMq Irv] zFUf)׼^褊r( q6^ bqz$ 0^`z˧t'O >&`dr'v)hS *i\⼆rVj\W.iVҼ}XqdaT(qm^e:(r*#*XJlaI=5Uyآv׎8c:#'7 /fWyaz޼%XizfiR8a7ږ8ig'qGg_^(6nuX"j!`hz ! z*.)caoa HY!Q` }WXz'>yXciۛGm3o:fvSjOgH_ၵb`}Tamףmɝ`aQ`^(_jD$ki%fQI)qUigYnMyhȢO'& jGHw*"i׼H`XGgiƜH8K]ey }eI#i^. -`y߆8`zryyH`~ ۉa YM%m[Z'^y&yinۻjyjFjuۍ觻uGǢ   q q 7\eUTUt蠿0I$r)H#")GȠU kΆutmehyj4}ݼ`[v'\vG߉Aʯwm _ Z}dڂW i@Ӌ7bmϼv<:Zc.pz).Ihw 9 ']J0icߢW^לu*9Yy)(ݥݦI*biv'$GZ~))3%$jXd5ݑ\z3&ᆘZ7ƥ}١g4vvW߼9_W`v86v]}G^;Tm&Y9^آH9SEgZ"A I$(F5YqF~(؞ V qdYv7<Ֆ BQZ$H ܍頙 ׼Q r5O粊9( F޼K')%WyO [zczH9g'y^)%Obqcu蝦WMށWnXSXۂ'j]蜼M^w%K9u^}\v b~@ Xi]TI `݆a(b 7Ijr byhǤi|"q؜-5ջjF\x"a$Xa vW^I'滰 Ƣf) H砉Ơa蚻    X v'I$Z鞚gH{kk !iZO"z(z("Oq"yK`0 q͆(8q  }zuټQ&KiizdWF)zHV\Fdr&eUn3Yqgm1Guަ[+y♶YG na2v瞼)re~),衆')&i^j޼8bA9b+vW_ ]7G(wo HI]}*}gv xq\hd($"l)Xzi)vᇼ 9^g*]df 䛫b"zG Xd}##炗eH}:%զjQ(u_҅(TU8ݻ~ Zp yY`Hݻ2z$~V#r䦻$xzJ}[+$zzw)) N!r(_n޻T~)#z~g{ ~W`7ލb׊^f]Ȥۑ. Xnu5硻r8熸H!xmaۂ5Wzzֻl3m#QL^_H^}7X$`Xa`Hbi_裒juh(}Š*#Hvg#z(eh}Xjgbg~8#Yܻ"fަ)duټDQUiIc}Ɵ,*^IDMQD (zAa砼:߉^v'b9'rQQ-&:$8&78)c8`'Dקz \WB'( )zWFr''9"HY HX    XG 袒H"y \ y+gEL]TzM zH$M"zH$yK&(}iH b  gu\H+z Z]9Pz&'(Q]-Ỉ;^ruVb<z8HU8ڼ:'Hu(ּ;h!aZ;`ry~'"Ɲ3'"]jc'2fWdV& e[;jQhbj_+anyjxݖ8 qG8r`'iĚ"˟޻"zT%Q|YޤI9(d}ף'^v"m_X~(_h}aa޼anqݡh٣YYXX 'fhۅX$ 8\~'據)(awbW xWxq7 v#Yf'!j&(eV%yX(_W_'݆(zڼXႺ }V^Ίw"yފ(!I陪ys'A]ȢÛkI$xU|q~HN %؆qh}GwX$j8c۩ G~&}"PݙYq8ގ'z'nFQGݼ(]w֨e8i؆8e(ݍG}$7YyߖH&[j'!H[uߊ vu4Nik8y=2#8eU4M$ӻ]磆HzA`a֛a<(`z)!>}\uIDV-]'y# f9(hX@#8]z(`D(''H#')v`KX zzK(   X)Gy褼\'"I"zk)qvyO"z'螼M "z(Mc bHȆX!^y܆7v _}6jZv1'UGeاz[M \ i/^M.ytǥSNF)p`KsڂE7H=ezGOIr&䙦YQA6Ui>șZe4Yiߞ&%9]#rBɼʣx`qټXX*[a ~نu] U酆} b;9rx& E<0lySيS]-"YYyW]zf*crA},u_Kg_~h`nڼuRhf9dj7`y֘hK^hs#$ }gr 8NrVu\:-bWdx`aGnY)_y 6 yۖ9jnWj6zu%Y`#Ye閻_yeu؛'my()d (Xy&X5Vr:Lerl)  6c$_\a$bg܁瞻 ݚ[rXyelebn*6ezFFۼ`eU% [vhwۖ8!rX磻V&9] uf &g8bb~ha)WYכ(_Li( 8q=2'MeQr(@'i9g(<_v`(_?_u7U&0`ha?"8 HaB'c(bzD(")e^ K"v`(Hx I" O螂   \$z& \ hei'"<]O& ȠzGM("zI$ǢM $BG"~'~)i ~qT}]}{+(8eWoYǛq`` Y'[m qbz#c 9蝒Gas~5zOYc]IU雑cqY+q j筑GU ~7suѼC IW}  au~ۼ zGcf! Iri`bmKZeyZq߻˞!Zc< 膉m%-3>Muqd'ibxfۼ+'iJv, ^q=SVi-v$\&~8du!`u蜂VߎX!WUFi6}܆fY\vHr.W8y""Azh~9vG_rDػ_j&Z f}[_qcߍ$Wޅץ)G%i}xui"֞ibYZ 7y r![bqw瞼 Wyئga2j{&$vHZI$k}rI%}^qdޖ)^z% ]U]Hzf }bF9柅ػyh} ^XGz^}fv%}h)bzDӐeٮ'ul3(ؠIU\EP z(zD"e؉a(#@$~(\>~W[LQ0'%!X?a8Dxz(8F( 9c'uK("آzWS$U(O   Jfk  R(L2E$q$$0 (G(qPI#QEVmۥ aq b$( (aHrE4$ K (F K($C(0 a ` q碊' M8 븂 $x"h Hqɚ†iMD, ]EP HvuaPc W v,{WRۚl8ؚX $I{x !!YT` ūwf TfX4ŭr9 ح[K*rPz q(PuⅉH ,p"fK[}giW*q㩶a:&;Hy}w 8e!J}ށ݂Ymֈ_H_H^z~Jd{\(r=~SqH Pybvs:]`Hamhf^fW0Т]׍f%#{8#e\J p6Pz7~dX?LߦuW']VQo@qu\xyأ%EI(<ȊI~ YG˜Ǩ 4 qq. )"{,  Zl*A&0* j"H ij&ayꬢ .Jy "My'E q") "ah*`03s0 &y斳 aDPR(P i~81p & Y' r J A  qםED,L,M$ ,! (`-=4p 'ʈ),ÌAEEP $1p,P$p `,1,HPG, H P 瞁ez IGK2룘 벪Ih(< H ,‰,G( 0B(,!IF 8 0  J皢$9M, ($G I<,SQ0D !0   H .y h 霒l"($aƦ8K< ؠX"qb]4Mb10 mL( bJ$҆QE,AN0  80 b ( @ (&IQ(}^8Ძ10 ]¹Qh 'q ME,HWޮp᝙`w!]8i{vis_ u3a.,UP}'egwG~YTfԅ=qد[lPjY'gImL,gؙ=eQ7ޮg}%ϭ } }`"ihAYԠ*u\N+zg _q}%O%܆'?\G]yEhm$xw?h}xѴ8V~ݪIްКZ ^9Oq"}iaNyH} zIdu=4ԥ`Y"( ŐY0i$ꞣ Z' z0 G,3 DYg|h D8 &zaq関 &)H*jɎ rlq$ Eb,q"<b$ &ɞi0Yc 6jC C $yg!Y8q0  aDh$BR$_u=0ɧ Ǟz RdH㮻-<` g"‹*(I 0NaͮPμnϒ6% g/ٖi{&,vJϾV6pKu_m*``_Y1Ҧ1p I*iۑ6!F6'tQv  rh&f)mF *j!* ,JGHH2<)SZg0bJIf f J $縰 e9'ک!pe}48]Zʬ$4׌ np ^v#RH 鶛rɶ` 1㔪Rxٍeܒix0I"ҚPH'$riP)ݖ]Vh֝HI  8 㢊 q$ 20 Ī** #hٚH"κiÞY!XitmDٶciV=`8 ~(vc`}i$ne'ގ_7BlP.Pa'Y~'ZP|!V`vI@ ^}$vb q#qWL)UC8}` 㴹)'. (bH D p8q J r(A $)h2 ) '& H LsG  Q"(FC p, E8 Ǣ&1)( HbI,sK0  Y8 p@ )( 碭 hrG(y㎭`yIP$ʧ (jjq (ʫMsX ,6!4LaD<Ϥ@80 H(R, Q0b c (J ,@ ע~\z$4O 1<μ \갖IcyP(L$, <(C0$ ɢɦ'I 0sN,8qQ zi 0I@$, ‡(r0,1K$1$ ,Hq礊 h 9 J$  `HƠj   e rYUUx ,(^ g'bj+^H v7 ms 0޻Ygb hIF?m5Gb(d[MԱ(Z<= X⑙~cl M[`GYDLЊgguez idw"Zf yu]b "u)޽6ZQW`^'߼dYq>߼5iXGM `Li`!Bm_ޢ! ԂG`-)}߁Ơ8ἠ Vd8g*>xUYLY޼y )m"~G "~hm߼ a`u T h]#/6fXi*֠qx^v%$!u硼^~ކ #$~9 ~'f])vޅ薇[')bi`3z&(nX3z rG4nߖaz $. "#n7"蛼/8"Zi3&by$z_6f2%Z߉h66ٞh`u>M٠&OHhG'"X ގ&}YdKeY3fHHT蠕y\HS(ZvI CrH\q FAyG]Hb|' y׼MzfZDYq瞚H)F'"%zXFɞ)g&SYfF'杂(ezzHSq&F]=dǞm޼_v' 8(ᦉHђya~^(H˫})ZzIefIdrXάJvWUEuuVT~`a&Vj&y_z) u'&y瘒 z( Hy皊蜊GY礂   H $rq  qu]EUQt' df#蠂(c yG`=qס $ ߁`("HnGaEYjc83ˣdq$HH[bah4E#bi[n9KW m`r(ܼ7b8dz`],݊X$zQe'Ȣ~ubj8$#nnx(}b^gם!yqdX~& _W#"r^!'^8bF 蟒'_a &)\|HXMTւU[7I_av_8 +q~_-VqF)`zi䍷ݲX߼"}ȨzH}$fYZYj'^d&]u zW %Wuar)!&b~9u]%"n8#X Xgd.qH؍֤-6g\j}衼.b}%i[$7؝y~(!n%2_d%܂h 4va^~'4}bm頎Z.#֎ 2'恖Yh;fiGi_"uءqލdퟎ'Z#y!㚉v_b}^.l ] lD n iܼF]卙H8$i qD鞦z(#m蛼Dw^`bFrI`f:K&Y mx;c4~6]]W\%#],˻曶Z$3ކ! rIܢuٍ馻gWu(֤vέvi'be`]a'HNf]g&Eϻqz( rg i袁ȠF     r yw qXEUYt )#`$r}ږY``zX ~I" ߝzkqZiۆ)}ZY؟(!q G$b~~ !!i_(][~'a]ga}hڼ߆8\i[nufjxۆqh8a_wziu )ٍŝ8&v((v(ܑ6:a؁bb`j:eavx⑘^ug犈jHbX'߆8 '۞6cHH'iuWzq/ Ye߁ۼzWh7`u要qnI]G~7]}ǡ8߅)e"ɜX z6ލ`&u}vnJ%j7!Z$^(bn%~ '8~W'eu$d~ ^,vԅ詼-'7ݚ)u3!*eܒ߼5ɝvHZ~߼5GȚncٟ6ZzX"Z7WmW(a<hvG";8yߍ!A`~e`7a[hi]\:`y!<E䅹q7^7bȣzW7fg9炈y!>(}e~yޚF观z۝cYdFW^&zbEM zH Ǟf Mz&`qDJ؉$zܽ蝼H `y瞊']]ܼF'8v($q砼?quۼ ܂ޒ(aXI$ή)7_} RCg }}瞻vidy6ܻyˍq^eeayȜNFbr)&G}'yH"眻g(q(暻y r'"(   'iǜɠF|$uYaeQx蠻 H!)(9d^mg!'`_;omXh#n#x&x_ _'zaW Wih*蜼 Gy#晲#ؠdViY%v77܍'z(dazHȤbgq眉ghrhaq WMSJa!qeߚH F:}a} s  ~8~Hzۼ v=Y-Sq#YVme&aEt օb=߅l[r(wy֎(ߎܼߦHu$z~'[_ f'$~Hv($\z89 )q(-h'"ufwܼ0H}أmټ5蝂gmZ4qcZWe3႙}#4'IbvX`;8}砉"68[H<\$vVe;rIh7:h^8`f>HE瞈?%z~d=c~7]܆DcbFݑx`zz`?~9"v';G)\Dn'!8D蝦ifKeuyYjZMHyz) Kނw WK(](vx"Oqق)dcH'r)^y[؜:(A m\"f'ߒ'^0# yH)uמ'qFȢHzh蠻H$Yh HGY n{h}ewYǚh }ٍ蜂 Hj&eyj % iaǤz( j(   ZhqǤ\H"¹m qvQz'z$ǞO蠂(Hx, 0yfz~Wn(0}Tr ~IYz6`vɖ z7ZzMvPFuἍeX:a +S]Vua #ЊYGrW&Ia>!{ }a*_ jW _IP ܡ͸H!Rrv řn7_i_5CHzW]r gB (yՆx Y4 ,~u\EEQyʱ9f yކW^z 63ӂW`_yA)9fx\_xv'aVӎgb f\]q#Svaح=ӻcfj8i'mf~w!euaH#n}h7'I^R֛[,z mgGg])e18av(ہ-EU"r'z'_&_j9"a^~9":V}#y' 'qa]L*q؝~F j~ՊYD碻س&ۅ^i"q${YFuj'` '2!nrێ(_ MXm]bufdv'`!i G^׻*e]u`ܻmz7ܻ)]~ڂ!,f [nּa= mު)bm֠Ms&UTӌ1=N8 !8F'euY b8By#vWDmUS48cZ#If>FIǠKנv eyxH#7)m#O'q""(OyG$O    ^ y砂(^'H$i"1a&SȠzy袂M($yGM!, (`'a}z  _h!e#Mߕntyb'`y`tqf7bUFa_6)J'^ZUxV%9S^)[ZX 0' EF9$%cmI^H^Aܙ X"UYv!_(]mټ ^8&}ڂHu!z6aVy[~b7"_}TM#΢H߻3Ij qY^ aךނN8D`efz&une͈daaX^bh$RW^6J^qQ\iu_iervy&qm؟izhvxZ ֻvuW呉%\O9Tv!u]ejIX"a`E^םbHb,m6hnێy߻ouȐ\ez&gvXyXkv8zaTcŧi}`߼VfxGgg2ye}v`u$uy^Jj(zGicYzz8mi$P)mhbW~'rYeyfǣz݆_vu%XjFz`~h'Eg4v(9$q]L(dUUMDʻ!(8~Fi~Hr A!v`@H眂($Lּ5(iWa: A\Wz "FU٥9Kc b("yM'y瞂 H$MH礒G Q   ^("瞊( gxV()k 4e܁ȢM( ) Q$z'y OȞA1# }r7"ai*IQVݼ ٥uj&e՜ٖ7Yek& '_I)uW 9~rn\f&֝ W]*X^~)_^m߼ `V(Xv 6`uvu&"uǝQʪF dj}֝aD`"]]޼ ~y%rWneբ'u- Fԕ#u]졻1DHfz$ zczS} ]n(mV钙bXZ9YbWaYav߻ؑvx~$qګgyUtN\gh]܊XfܻngJ%q9b%Vq-^Wmzӻ7wJ]X#fWf#ɥi枻5Y&:}կ՘bY9ކ7_%vy%nDj ߻vX"}xfeuX_\u$⡊d(uZ _9nH`ziܻZwm(i7O]2*qᑥ]vz(`Y$9U[9agm&hܑ朻#:#q~fwǟIq!~x!}׊%nY&q'0͂h(yM*؛ETWӎ@ 衂8 (=K Yfh&?X" G޼De`( D䑼6cyXbB~I'rI`FW`m8Ke)zI M(ǤiQ z($ Q   ` q瞊)"`y pk Hyu^y螼M(z"Mh q$瞼MEO]u׆(`v (yd`"Z f']Wy%j" 8Z}!]_f5衊Y-ZWaF_ݭe٧FZZ7S-qmc)μ8R&r6^ 2yri$7! Xe}Q}vQ)@~6z8 ̂b&%# #'yǣ7% Jru 4%7օc7cux<+  cr_d 0zug`VrK Wqbiy~&Uy]Ed-9VG UjWՊg7}'iV(z fV[ir 'uhg*N|ɵi^ڻZjZV!+dIed;vfg_$nX( Yz!ujuY9B׻Ǡ8V(୆Y8%!buhVr)`W&iٞEaeۻ')Tԍ8ujiۻ %Z_IAc!啑%zWieu#J&]ܕ=C& `@ mPz*#r(\8W֕$Mɠ'_f}!6!vXz'ލfdvcu8 "8qms*aQ5T=yl VE'g fBV8yb]o`_aE ~]y۞8@ BFZʖܰpNC݁>m :W>$ڰxr :#h M$g*$@9YH'ź d;z)mcE蓰8\ކʞ5guYetf\ڈݢ׆ 9ʸk}&&ee uYiԱ(3Z}8 A^V(ߞqib̳}&HHb}(砙˿zYd~_}*p1nX'8 '~7ۛ8n]vI#7=yۉkH/~'ע7q%heilsۗθ!8y!ϴy܂xZ禘ࢨmi#:Fޢaw8Phn f;#q@_u+0VxQuRՙ(aH`bH!}ފ`XH ߅0(bߤpt li-)wu 'vo*ʣ^\0g& jn+/Y(d8q䒸Y"f6c[[?>\ީbat hljvqẹ7r̫ngm}U֯`wdH IA%zбQ1(gI5آyV#vW\cyʣxXbfD頕Ǥ $% nrZk88 c"&㬄h7'iv# w=qA` B紒 !*H U%("Vd ($b7߮Tڰ8S\h Ĉ&i.X$jz7x*zORPp *ؙםe A$ikncX Ŕ٪8P &[i6db*zp Z.o;h֒P`Q<ySXxz܂\h~~V$y!w+bjh@Õz~B9dHGFyXeŘr)(@K}j8߯% XRrq栮!ށ~ q"Ԣyufu&lifb~(᥸r"qף0˭zŎ~ ($a I( D:hh"H (`0 (jHrKe " $Y)(ǒĖ g9r颲( 0q$cK *RjJ *ɐ,J0bH 6zY "zk((( z(9h7<~߭ A ( mE#(ͧ 'Š"y*9Gx^(=1h 皪ɪkʤ, AAPH("KE,r   $!8HRF$a0 jf*0 .Iy=T΢ ڜmZzPgxzyP$ <(C$ 4r 0F$p$D# (K,qI4a  (A K(I, @( ,Œ,E`(1(qD( (0@$8  A"J̲@ k  y瞉^a`- b0BLmJ,Ƞ 1$G(J0rIQ(H J G$FFb0a , "I,8 uaHlh &II$yH,N4`QEW -pv}ǧ9q٢[Ibqdo>7 J-h;r~8z^'ߘ;~(eydi!.78Yyݘ)bڊ(*zcy益']?sX[}Xd?nj8bX%'mݜ=mH֣!rhM0cx牖ݝcPJl9^ [b9f8!y a7^ecya^8iz9#+.UZ0kykzfUڢ*i5bF־54>qe:#0 umhRH]H@ >TV͕pjYz)p磤0kTihj}іvw.VrFί(Sy%v0Fp0ВH~ޣ 1 B $A0H ǪrD"PX g0Ȟ2G` C8"qJ G( fRjR-*g pgi2ɚ Le&r* zd$ 'DRh ƤRiY $jL"9#h cH3I(`imX]sQm Ha4Bq4 m<( h{I4z Y@(m<`  j6 .`( ,J BEF$Iq ,c &hy,R" ɖl()" ݊(cR@sҢ weכǼ*h ʜ*4P hzJ4(C$B,Ӈ(A 4 $AG$M$sH$ҥ͑Ͱ I]ʿW>bEY9G\agu9ݰCg,!n{7qsކjz)#HqQ\ӱDښ6hر[jjfy iQ) $r&SPX}itgjf~58H+8rѨjgYjpvlzD$8U0 %UTxE&M:n[ A:a^fU\ 1ʊgDZ#dy_nd(8ii5Ih ^YYaYXVJ@I zPXD۰ kƳx inL˰[Vq&fXmdaqX (*YPOzzс &lm@QAx 2Zr#eXc=ۭf8)Z&n;U8'3r.Fciˍ<#`^ާZm|&[qT}JyE㧘DYv!|$ FYe#5X!G1jc)oXwxt(dya`zPvGۊզ%EFi uٟDW8c}oo\8jelv 觞mu?}&ܩH0~(~a(bKzHy_NWܳ(+0n (}k ^F u}߭#FfHi*Ld](Wje%\%)` }i卋'jVk腨Tyqf ;vURe~8r(Y'je(KiY m[\Wc~7Zm(1tBm(yZŷaaZX^(Xͪc` ef r涮koZ9Nyר0^^&ۊv'ٱ!me祲P9dq& x*ajfxm#8Fi!..-2T-HZnJk +Ba ܞ}Bۣ<+I#gՍr%Ī8 ɝRwQ &g\wj[h۲%}rEGgp vb4hu䂞 fF۱ :*r) \αxc\Hyr7F(\QTpwnfb}Y Œ(Ȱ40 $訊*i$GQH r$Q 0,$Q ( bH 0 eIPb' $q4‹$,pE,q bH(M, 4qArH0 (1$ (  `  ʲȤrk( #h%ap H,92 bm$҇H=TYV_H 2 0$J!,rK 8B 0,rM I (AD҉( 0 qHf]0p ")e)"(J4 c<0 (!6ƪPuYۍYe~edH< [y8|4^x^ THeiW楈jW]Y.^X`{xlQZe84wYHk^[jag~f@+mR!jh.v [Qdsy,h8 gW6`zVgX(0%EOHIj) HqVZy j;b(k`1aĮvK'u~ t 0)1vKǾXp~kn(&pb p k}88=~X^zXXώ7݊]^XL^`^Xԅןמx}}yǟyױuuiz[whVW5HAG~8㟐hhYh$(biH mu~ˎ.Nr]cydբ7!j @ߪX _X!z9az*!v!E}}ااj&`躆{eŜ~0x:YI~ɡlǒMvEd]V"™V 0܏Rs 9{UlzRh(}~-[4&)oRSQ_on48\H"̟f("Zy_H@{YQ5^Q ݢJI ))NwJv^y`(_':dEȲ[=6R粀B%Z!Ti(ym&'f%xޠ"ZXt"8ף})cΒ泠VI˷ﻲl]c[T \m#n&mf*$"يg(}]049j*س@ 3::?jspPQG]9Pfi\ya1#UgpƲ8 ~ɻv]F ;YWr߱yN'Q*_8È! vW{ jY\fP%RD zOq顾& xaヵ#[۱w8v(QIC аhl UZH`:AQbW4ꅈ_bmw ~X'Pr  *ˇtUT`e»iurױrzV$qǥ8‰9%ޣa,j媩 A䜡$QǨp r QH(QB` ZzI& beaj ȠIR$vyGO j*`#rrԅ  Y"zI4x0K$B ZȠâjp R*-$mأ_r^=%u"~W95h'7m>z"$޼<'!8v7Au⁈jgb@g}!W߼?(qB]qx#gxF蠂Iby`眼Fۖ&v&y%DH:ong&螼Hh"z' Mg"mzܼO qv"Kg$exM8rX$mH ^8$QEٞWFQ^q$ayc҃ai"MDЦzl_y!ࢊa#e 瑨 &\'qbީ,eW=yܻע~ q霻rq礉"FzGgr)'($grX7\   &hq | fq`UUt"'~r}םb'(q騢'%Ϟ1 mhZXǡ~%M3睆a,g$([).f_(`yټ1hZi砊7ݼ2#rY"4+}zI0 yfWѼ^0vHqKDvbG M,fWrHZn(X:旖 v9}f9aX6n'$zd}wf5^yY[ ^1閦z(;6 iw8[5y"_v)߼6ثx}ۂY<%e z6 d7"v Z4(ɟ?em ^^I<颙 jIץ?yX?d~(~#BFޑvf9niAK%iY"F[F`z瞼H5y٨8[F)rH$yXټ>h'(M G$y袊(H צy)z'$ey"Q$i+zO稊(]"$QG]r"OeꕔfXAaM]Ěcyߍ$`Yd@Ѷ ' Ixfm܁f8r $'I{g`ExށU(qHZ'&GyG"jrGq#G"(y~b螻䁹#v8r( v   ( r y|G$u\qUQx" 08v(`'n"g\mz''ێ{-}ݼ8܆ޒ=ȓLvq'~!:yi7:`~8'];~Gfb}y"5 [(g(Gؼ<W}hr6)58!"v7[;978am`B$}z8Yڼ2FXyh#1ھ&_w'`Qfjy߂WE/8Hݞ;[w&iܼ5ڡv85hnY>`]"z7_;viyZ ?~}(?a%hX;W偷]z*#7; Xq视(޼=xcyu'A8`*VbDf]%7A bI&rWBܙ)yyMzWnhWHٖ/"Q"H%G UU灙(iM'( ȠUq݁#M\"\FXH$y# "Dˉ!Quۼ8~\er螆HQm _}D&8'&y皁&z* &7K G"i&aeנyVz(i"r z'qv(`y~('"#n8   \ (r'^('z8¼-k4]Wz"Qr'y S"i"jiqUO=RaU(`z'袼 (`reݼ uTy7 Ɓ*azF_ ؀u&j( v ܚ(oyZ$u}ܼ}(gPr a y,2)!q qݼ jHjG7 ~8#\  fL~Brs A_iۻ *n7c )H"yfݵB jCբR q%vL#0ӝϕEUbvX^xd( MRjԕibg$!qԦG~rGS:ջْZ$,Ywkwv"XЍn|ǧ*vzHYeogZIצwd}6ѷ$V{fiJzbz&yFWXIىdؒ䍸b;gc%Y똪Umj^Y׎8AgX)fz ܻ#!Ev:(y%~x`Vvheڞh嚩wbS*n(!k]]֛e -iFЂ8kx_z7eYW%偗r de蟚$m\8fh ]~ȢzGf}!ga74͎H$Iy M(^QT^, bXH8 aW\Fz($眒(H")"=s9' %XB(Hz%Mn(HO 'y"'MHQ)"z'U"   `r($HǤbz7 箺+k'$4e7h"MHjQq"HM^DUcuߒY  (@)]diIhvi[|!R&Z!wUWhXbWm]qV ؞]f97Tafۼce~8yϼ '}I)\ | FYvټ ۆyEPr5 !:}\ZNy[ ٦fߡ_!Z&8!v Yߞ%nxd xǓp-)iE3 U (bF< r\dyȯvUY v_ #uޒG'r)rfq鞞aߡb`u'6H*Iza^yqa]m weg;7^et[Z5]ۻFmy{uf:"ZW#uל( YՕi[zݻ.*Վ%ᙨ&*XZ$O>Jax]yzg9j^Y&ǟf:_x`򚅟e7`j)m]&]j'Ui ^~xVQd8_jlǩ~ j&ddbު9! ITNuގunޅga\^ng[$'a] bHv8] &$ Yi%]HqמM5'YVRm(̻(^ e}MFUW[( H `yH%H8#v6Q$̼7)]W~("BGY`v#HX$(蠂(Q瞂(ǞzH"O(zGUr(z(Q(    \(  z "eץv8k4f'ȞM("(q蠼Oq 'yK( @㑂78au۞71꩑ݻ3R,`X WW]c馻zNwyX߻ibɫFX޻eҊby޻eY77<= ~:bw&*]'WZD9s y}!zJZ_ '!a_y(V㉷*ن7w(]墮Hhls} . N7i~'ca_?%eRYhv%i5h95 V\I'^d& zky (}huz6S$fzEvZscyaBq`#8ivg];7~u_ԕ#ؖWgB8U ]CnIgj)v'nXzRvw&8ْ*)Uby^f~$m#R j%曝xnY]'+eQITui}u}`%}%7Ie%}yײ,a y+jmT'mיmʡٻF} ॶ_WbW}w_H%Diޖhɣr_q\r}7`ab ǟ~(e~ueu[zH8ʢGrV_ ,I9YX`yǝ}*cIEy8(!9#M'mY8vF(ݖ6f)HW袚("=4м>!~9#I"F (n8bOr8(("MG Sr ȞO((( UǤ   bȞr'""`X$i k'(i) Qzy砒($OzhyKECavW"I$rj) =ҢY_}7v#uaAFԷ)vZ#ej& yZczɯrY (iwR=۲puZkܱ }$ߦƛ{XXcmܲX'xԊ沎) }[XUa2~r (,n'~`QbHVUbFٕ f ]E͕lx}$H_` bڲV+r.}ZyǥhE( F)&")"H]֙܎Y 'gHy$ y( 8 i"q:` &YEi䎢,sKb 0 0ȤrĔ1 D0Aj ɤ"1ɤ 蠺dk"!Jps((@I0r$R`C m<' 0g$4R bI$ m4Ӎ4O diJ(X0!I%P JyɈ f9cy jIh殊 $8I 'y:ǞiJB,a0pBP8a KI(`F q ` ( Ǟ8A& QBa$  m0Í8㏧H (iQ)%mLqH $K(k({ X`0 AAѣ -,H{ . (i! ri I$礀RI 1ygubuA I'4/H_&{p 0ӎ8҈$ &iK* F(0$, J,‰P,aAH8( rQ$ AHa$ 4 b I @F ,N,b(r  #,bK+4a8e9M "rk0n"ǤIzQ ^M$q8A 08 (`0"((C("$q ,x (& (hjQ2L(8b ev sH dqIhGP (b*9! qi8a8 ,T bR(ar(a*Td6ۡ` F YDɖ@qI9P UW` 9ܟx Hجen]( Ĩ8~'A' ˬ9gXiGehvڛ2)XD pL--QE85ru,Ҫ`Yuߜzɔ` FgۍLL0X(bHɣkf l-wcjmAP拂ܞV$z%Il'60X#f"w$`$@`Z!"~(!>}^_ v':drXF z( GDzP ˶&&x D&yl)"A  *&Yf 0訉H$ ~ߢ`!\!i#Ʒ߶(`(`]̠\>PWeHڴ ${\uf <REgPNY`Fל=5עi:GWrV/YZ)gVz:uwc&b(u8(hIY_Fx!F^McVb(m\']yZ %ȴݤ,X袦UhAƙ]Uhqű:hyִX ơj1s^ZóXD=Co ҳVA=R u1`F*u`(4,fq<9Mr)I} uz"ԫ"f($ʹ陲nn9pag`'e٦}c eb39@nh$PfYMٚ((!ILc,LYeߣ jx rDZ) r%a䨑$02 r& HÔg 'j.yƤ G`Ʀ랢 pz.  Aq, r& Ei r Ĝ D9:&H &+2Ej@$B, 0y `E4u~p(,1H Pq<4M,3 4J1"I"ۭ<@ ˦,h`$I1M$Q Kˆiz jF(袠& h6Jiz & q izihf Q4&(᮫nqFu喹š 0 , ` FkȞIH HJ =OaH Qb$ $I @,p (B(! Ä8p00Ah H0QI$XcmXߝH jYŌ誥 $ A \li!(a@%}y z)} UEz減 i=] )_YI﶐ƪv"IP]C_ p maf8uaR6_Xzɪ $4bWڶ)-z 8 MIe8u"}" r~ `~Y]~#7Vڕ֝ƠXbYh!QY 2i㦖֡ hdIP icIG bqhIg]u眂}ױ9~p ~b"l!`X`ߧ!a (j'&٩H 奊(yivJ+u]$Yx Ez4V;nVW\EŜGU\ܡ~JGVEi秵P'}_ES(ɡ(aSL4uX cmU-ēauS` .vh܂ n"`( 8`x t}أ'rmy!}^}yFY7WǠ8⢉cƙ氀XͪQ0RI~ xI$+$~[%Pg!XXfarf I~ٶVڂ)2T$&Pm&2ȫZl$vZ <F('ҝ㖵0  a&R}mj8ގG`5P8˜ej`fXgr ^F G>͈m㰰%aW}F^ɒu8܉B\`9+crwŘݵ܂]_~<}'h 8^8c@ (ǒa JGM#8 `>}-޴&mUkVd`eaֳQ7rZ%nu 2(b[Ňg^6RM(,D׳3垸({~kūȌ}g (j=ߊ=Դ@芕M*VhZ7ֶ':a 8@i%,'%g<\WZZirK`{-Y,|Xsnh":\98Uu %zb+ U#9Ϯ8 ӎIxz%B:`d\MI)z _ q_8ݦ(x1E!~\癪HvZHޙ+E H7`'%q^Qx9jGyv\KEޢ)ii YQwzxqx'Kn5ׁyzHDG y"x"(ܼAX}$idTۑ[e2$35}!M"^9(;H}Tj=袂*ݷmw91z&Dn'& $HǢj(ȞFFzi^&q D)`zYX'D`w'eBeہVE #݆-i K~yqּK(%s=k&Y=YzHY@(HWqYi鑶YF^f9"("枼DH% Bbh"^v&F'y]ŠDG"9)qB*`H 6Y>iݢw^)eey"H \n:^Knz8Dwe(XۼHVbn8"޼HzGy`Q($ HS"'b$S-iؗ]bQ\zH]"qD(i+ ?'6}~'=e1E4az^យf< _z9ͻg *hꞒǜzG$Y hکIeܻ%qY斉$HȞz&ֻy5qceY`%ػ"Ibbڙ   GiȝEy$ qe]EMxX8#'$zJ"xiȞ֢Z$ߎkm'}W`yeꦘռUSm&~k-h`!`U`?i_TX2"vFtCj7Z'vbSfUdGWYmP*9Z;y7b j)"VA]b7bǛBZvfGټMv#e硊 b&H&zؖWH5Ҏ'^eۥOr&n GH7^z'f Z)F",/ۂ]'!X lM"ہ(e($K[]ȣM): _9r Q e(9OF zؼ"Fw^F z) Ȥ&S$bn Dy&IYO"z'%zVL}2FyX޼/Ir4qq J = }$Tx[/avX⑨ v(ĒvܻHmyǓb)jrUȠ' u6&kU[a("m ` 桻5ԁ5`jjieJz₧ub^M)*YZnYuܙi[vG'zi_bvGUi&yۻ$\/yZ7Ի 7,b!(߼ؠ9u܆(uu[bnc*XX')׻(iXxXn8%#"i (f"Jii Hy]u) MU۾8ڡچi]}߻7g}baf ayM)0 c8]uY  $qzc_[V' uky{Gs:Y"޻ `Q8b͊I v'ܶHcݑvi`q삘U#ew# պeuaػ]mx_yƟ]]% avu Wuuټ @hܻ$}xej晎w}奊 cؕyٚaB6Y܍cy"wmrjqNաd~i&8#}HgG\ia蚑$c}&fHq_h܊G_U^y)֥}~w" (Ge%r~fn*|= _E3e!#(nX`Vu!ؠIcaߎݻ`襗~&[IS]%)ihy}*'iV[ˎyp !( oQiv^8"zK$ٜv6HK(" H=4 >'ai^n)%A8x(ݼK%W( MG$ "Q ( ȤQ' ɤ(z&\S'   `zYgۼb"xm,]v(O蠂' M(܂)`rO04ÎH_8 06%ݻ؅"~1ނ7"4bk1Jf6z(滌 wv؍NwΪ{y^ yg k ykshq\A v(%gdNg]yuY9I޻yՅ_e'鞻}vDꪻ}fERwU&~ ƨQa(d)(`* r:}a\1wQ}&l5۲' dzy_7 7軁K~  MA"_eg &=uIycUu_;%܉(Z6r(VަJzi Y[u]FY.r) fib8"F/(rJ^;ǂ7e(uؤU8)zyuXFvgir"{  Qm9iZ&$U(g7!}ea^IbĢiHZYEyrj$yw[a`gfZj'#_Mo 9u߅hbj[}]fX(rY]bnX߆8dvHu^z)'e`zgi&70bHʩ%8}}9,_MeW덷1 ca 0O'yz(M f'bM`yHHR@ HyF袊H9cv'H `X"n'"M( ( (Qgz$U"y("(S"   `'yh`( Xk 4JuZr"O$'zMn("q M @C,~'aY$قY, i2y]m噺y]軮:~6M&L9(#Ya \ecN!9ݻu3ЂY(y}ٰx7v~'}( #u&'X׻,g],yT"b_&ƜizvWae*GaYncjusٻn:g=(axqʥ hۢy$qۼE,)' aV= aפeb 'W5 ʙN8VaGad 3YQ]# r')K_mzj(ۖb}ۻρ8a75߆á!ݎe}ށw\Iwqfnm޻ܾEEy% ZD`' w"Jmabo\I۱vzimfaXf7m`waz9砖G)޻9՚UzdF[i#$+} 1ػ|~#+inY(* 7Vm֜*^Hbevwa $wێia]8hih`7v9 X`~' ƪzHb(⁷ߝ-QE}a }8S&iȘzHƞM"zO' =4ϼ=7(a)b%B) ( zZdKH zQǢzI$r(Q蠊(z Q螂Hz S'   rykH4I( ̮g xz&a( b(KQ$Om]0q((B$a0(p$ (1$hb$(,8 b @$0( QlH &1(HIj&b u6LWw_gX\!:!I!ꆹg0P*~*vyz .u&TA&VYo Trukh=c ^XwPf`( Uz&)!ߵ R}Z~*7uJ8]Vs&&Ơy ~=3b!Ua] Q`V!`K^v۠ $zgP ci y^mء U}Luj%}c~X"2 #by #9_8aߚ ( רkR=X]5+i@wOo EKJ.F ^}3x(k7IN (ͧvh$ٶ _wǶ g$yKx`@vec(FUj z j`RhXeu؞]4aCqdS~H"aˬƺ)ߵ3ҝy(m*r PEiԡTa~8 -Ea6XV(*Ẃev'`DzA%5ej9ڲX!k%5V;&+]FQd̲8DfܙYU O*z,vFirH蓚X]xP56ڑ禉WWIYxVuH%m_H'ނ4^i[,e@ ؍$rfh޲X TP]Z*k h률.*(7=QJ_~8 @P<8ya$r RJ$DB40bh iYJ2D a ɤaiR"}喚[oK DaiB*Zx d("zx i&HP i$ gC` jAȎi"8L(F r(0Q,OSD!=4ߍie iZgXaI(rF ,X_m0z.ٶK*H" j+4 ,i&x RJ$G,H(IabFJ4C 0F` Î  ($ (( ,q(QH 2NC(qI  arBa,( #0  ` )"‹8 a(04 f$yl"XY@  LY5Vq\x8@ 8! (p$s ,4x 蠒 $rbG`$bEa 8 iDfZ ֟aG)vz# a  (PJ (ڊ5NZF͡HEAl/):m0,Ś#'͟E۶r/=yn0sy̅VOVf%gls塘j[vɒ4ܑ'$hiFֳrȖgf[-D~ 8z((0e'ޕݶXjqRyf( ~ aX, I)Y#ڣkP R9u]`b}+}/,%~"WH(_ ՒJ(z( % Gn֛5p [.2g] Iw: s "RW^}cd)A ܴ;ovޭHٵNvہY㴘EWj޴Y;, mQYfc` ;gN6RK!7Pybn`ab90ZX^b}HF aUEVm[`zjUHEBI˙H^ 2z9/Uza1Py#V[chi$(DƈҴ -=-ݧ!i'dTvfQEII\5FMpmwu枅x2q^Gء걡ܕ]ڤ/]fn(+hY0!, $v\7Rݳ8e=yI\lw9iְneDP+%Aeײ8j噘D},[Uu}س8'UEY³ tvF۫i=9p ƪ6ihх䳨J : 8E'l~yQtUhX,JMDu^nyWر)a^z emݑVu 5Y`Fxd)^8ZX4 ar5_i8'5QUEl,kHz'u@O}qa h}Yyڂdv_5vQxqƐrH[}椰ta+z P'`n\ kZbfXxZgʊ(0 */@C盙bъ`y83J~}쮰ԉaBåp6%߁mVzDGP N[m渡R9"f` ~! ک8("~IaaM~m#3u}۰Ln8]}[xc i6w۰Su`a裭V݂'&_Ù}['yx5 n)yn᫸uq\]}x(v^ug1q z9j~I9ref("ٱ~z)"z~"Xެ,i亸0٫^_yWiWvZ |\ږgYd;ץ$zcUYUV޲yEu&` ^iZ;ǚY\rnyZvb%aυh^'^ ƟIVa%" VE2ۈ`uZ=npM$'|R< FiY/laV\ni$ $=IhTP)hJitqHden{`pedieHZ(TغAQVUK5Ʃh*C5?Vc`9eܲ OɫZm\ m2YQlʱ٣8bY!b8ގ8ca@ P'$b }Ȣ` ($0R(* +$zS , Eiiz FAZˆ H(cO J) r&p8cх X d(JqH ɢ0 [(iI0 锉er$8( iE1zh`y,8p &QCyy$((@ (8e0EЦ qaϦ!?0(N(M4ӊ8` QDh ƘA2)i$p *Y'9隣8 礑Ǭk ` ƬQH v8!auY$x%Ύ:%嶺(k$Ψj (l&jF 2hIR$J(G4 ryJhI,Bp,xL,,` DH0b$ L(JE(AFI 1HFqWi"3jaYeF)1:"`K&iU'idzWeX\לV XFZu"vZ%`m%XZ`z'`vzqX nH9qנU8Id S%nw(U蜂(8UvؼSvZ`視WUxy7 z&W(X"(XզfZ"S ]։j( OܑעzS W^WxQILyN*VQ'r( OrGMǜ(UrG(X bf%Gj8= fmgݼ@`Znd!;AWw8iפBמf uAzqW`H&:H\ފ ayAFrj#qzh1Q[MVu_=ϻ7i5= y0ᙪz砻$ygG蘺Ȧﻳ) FmWIFjIq)z$y໠z(zibex )bgy$(    (e$iyw$U5SUx' 9c"(yǪ'I$Ȣri rHb٪߼'uga7W `}Cۻ ٕ6jf8.V[y6ۼ"} ~8߂8`ߊ`ݼLZ˓٢l:eQr9w"X$vI蠊WSY+^Yq`M)'hqfQǝzhr'OH"i`瞼SWyzy`yZU6 beImS6$NZw袼D( gVؼMv\z V$ KzhmdSV$in"Ocybnz^dS'z zU5[YY '&OEVrZjz(ӼMْVbm7 O&(zU($Nh Oe'[\wfqJgUq蝂jH)OHȫzhQFq H)Xv z&icSفׂ)+gQw$U XמHQ"zG)IQ "rz&^Qi-v7"yZK\(n"S"zH"qO&(# y觼OzzH/F(XjfKHނ+SH'QrJdi M( &hU<[^8[磼A^m` A%]V޼6W䅈`bڼ;\reۼ:zW`qnF2)]6mZY,(}aVqƗ_~_8ջ^8}u `~߂0 g)&zFI&J'"r'$*ʳrfUqȦqƘVK=hy\މ_y~(ކg`仜'amfy՚)e($(Q໋J   gz n'e ("ygH8ёi O'ǢzzHMHy 'M_M#Uv_ Gb !ޒ)d 9ɷ]项nF"Zi~Wܖ X6zp%Ymg_]'!9$)H ^b7HWz zOȦ( j( Qr)"码"Q 'z S碂   by$(#7e`)cHʻomVb bq"yǜQ r HQyzz KEa"I}Ŗ5 -=y\^Q[qӑvS>h'ߗ{.%z #Wu`qw[yw\PR_ޢhZT Z T v'ށ祼 #M'aƦ~W!!i uyy Vzayi q8y!^fX8erV&]iZv7*f)#jyiڦ$=yi' y' ^N :I$8d5栻F r("Ȣ!(i#ř(]yvrڻ $&i螻"j $nXcI YȭƷn8&YX쎄~)+ؙbzfRy "YU ($e\:}T!nk7bH7&wieyxYjg]ףf+&b&wjvGriǦrK%iZ ui#z #I,~XzXr 8!F^#7g9~7}ǠaVyG䎩[e'z$܆X_z^nX}]zh Ųڭ}!a8yێ,`e׍ 8 qSqz Sr'y ) QqȨE4IBze"H y蠊Ib7M'zH#M('qǢQ蠂( Q rHQ    b8 נ `e $$Jm,mr(MH( q O(y"HywH q@` 7IYVWK1 l|uHQFh(>Wڼ.Y֝E'+ XMD2G}}m&]WCVgW~HbjH≷b]Z &zHܭyb+!f,vI&HGhfJޕeIry`~5eǣdRߒE)Ǥv $J\hջB uhdYgi8 z$ Uu'6控\Ɯٮ衻U߻۾_2-$fWA'ݻhb(I+a b^zg&i#_]}^($' rg&Xj&6}X"u(z) qyf$ (a蜩eۖ\nJ"iת'j(瞕Ȣ wVyv滿z+K%nKaGg &9rei⻻H訍"Et-qת)阮.aFyH뚨zwY֪9E"aƝ^Z`m<' Mȝ(6v)cY#rzޕi$"( ~ (#砼y !X`WcqZjh' Ʋ߻d(y ׎+qIN `(oUY((IM""r('M") *k@LB~X}$)F(8$ K("z' M( z 砼O( yǠH$S"qr(Q   `"z e)`I .k yq砼Qj("K"H( K' @Q!dYui0y_AK-=ʟ:nfVe)q+uف#}Zꫭ̓Pufhy؟fX^& ijz&qǛ i$qzYbz7:^ifIv'0韻]w໽wamqdMڦa`~~!GzY#椻jniiq`!h}Ǟy9Y(vHzH!V7Pͤ Zmb\⻷,r[j2XaVYמ)rfdq$Y#aEzf.I.(cfzHj*]XFfG2VȚ"9fYݻg^'X#H%!Ni(z)-yߢ`ɤGQ袻b٢') }qfz ƮzKܚH⻽H[zFqꦻZf&*}Ɨ$1GSXizۉchv IW"f ㎘,XYVF$Evwi(gb6hz`H 7 yaHⅇj7ټ'y8~' ruz(!$E/y߻'a(۝-m.E$ `( QFi z&Qqȝx(Q")"53˼Ah F'"XgQiZI`]"QȠr'z("O'$y$(O(z(Q   aɞp iˮ. )Q0l(Y($u`fl]R0tj&[qgih]TdXuP13u }hl q7j `z*`abyk}(8J1}ע^(] r~8`!+ rIynڥﶖ\%~y霊waF⨘Yw~ )^ޥc8v_[ u&@_ߊ8mS(_V_qv$([uކނ`(kvhf)`9}ia'Maw&0-Jb%VAݪ(`$IemjTdzH'&]E٩H9gyHǬ(emy}! B٤*ia}EPRIZ dHjq$Yz8b)^8!"j&7ˎ۫8!!a8` _uZW\5s@V(gozgYx춆۳Ҫb.jVӹfHaeXZn+th"G*L (R"tU(*(W3Xղ xd?\ΐ̳ ;X~Z Pc)PcާU1H^(u)miأxQ\fز]։ȡ'؅ש hg[HuPgIYX[R5UP FS'TKP:[De8c5gyz]  qQ^c_*ƚ,/e߲(nj 5x`!mlW\q96iaʮvH 8UQ$ucߛ$ 9GMz0sW4ӛ -2HKx%uߕP uz/-HvW8YW/n`A՝maTܟ$8V3gWR,/6٨ (a)m^8 1ffzTf9g窆p vxJ$nH[aDhJ+`Xbh_@ӍH$Lʥ}ܣ8 *džL8 ^tX^m祢 Xz, YƲ9" Ȩi銣G`c4` ) *i8 ɨK"X  h( Iz)0)ㄡ CYkFRJ j F F Gyfm0 fz(&!` b &!撑"Ȣ I @F( i(@Ц a]#զ!g1 &,$K^ q I4R4rM8, (Kem4 "i&ɜ9 If$f $( n'qƜ1Hh -k 4l,* 6& *&'H, QI$H h ,QL$$  ,DaG( HI, q1((a0BprE $ bG H K,hL$  i ŜiX 箪+ZjyD rh&aImM3@(^@Lavmݤ8 0 (P8C! 0 @rG(c(0 K(HC 0$(FI0(#H3La8H矆"Y# GƠ@z0a 0 qUD  nWvz*z@$-pw)ʧ (3~rlHIf-%Ud0zWms{8ǽ='7kbc*)'\z7+kH")ma E6m-+~%Axr~"uǜ1uYri rX߬U6`zI(a#0<#Hn8)&ۭi&bv8%c~ ް00J(!xf8zu)Uf$fI厉ٰn]־שHUq7,9p A,&U#zgH =Y![rz9mNXۢtUviܰ twHpSa"~pZWz@UDlyiqh!ɏR9%P}tkvX ;C 7"`x4hՊWլ(&yv(eT)ժ@iw4^@*`Y$斒Y%eHIfZfEY'즐!EUF9jnfnUjk],k1Y⭈J *'xڱ ku[;ءO<#]ڂ%n賐uw`[]fmԑݳpZWyjm[n+aq&sj0LDγ݅aj=Zh<覵G]~&H \& / 7P8a*`Jchzd_B\3Td9ciєx p%lxjxUug=[%H$Z8 `{ !1#(_^4u^X͖큶&ѤPM0XheI;iHJXS$Feڮr% iz*h.̥}f)QS[K`鲀#*A)^Rcy@Zґv(q` QeD(\Xb}ḆQt=dS(u *Kneяw\uVB[4@zYf cxW`Ʒ_huzIYz9/G⮵zq's"~_,Σa4Š9j~( (&I% ĜqY&i㞢x4r 0p(A4 R)0ZE` gDqg J :`jJ"a @  9,J璱(0A$ (`qI 4z iC Y嶊 b )( zF)!`ᄎ(h *Xfji8 x" H8eZ(H8 ˌ,0Bjf o 鰢)&,aM4 D&z+x$ц,2F "  i*":G& a%&)Vcq]i 1Hݪʯ]YWI'$ i.)$g"0(҈N8LX$q$ $`$($ I$$aJ p0 0bb $ 0(H4A R 8A`H$r $$p (G q$R  P 2r*g H,aƤQC " *bL0k4(bYMD( 93ade8FpER@(bL,b0G $G,(8" 0(I0K`(F ARIgyǢY&m$AD`R$K8 qQEUГp;̎(єHp#Xf+P()cɡc"~j&a#QwPXTa zעjꑈ m'}Wf0/:,g"+kk$(zz+jg~'lbZhrimʡP6c+1aXWYh%e[ bI]ji7ժM78ݜ ܶq^9(ƚ,ښZ1*uǤ޳`Gp -BݱqI&8eػe(ibMnh8`ᅧ(_}$Aؙp~_aױ (h‰$(Ȗ7Tp =a!d'ïXٴچ$}ٰwifPrj08Ԕh7]u @1!3.(u(ۉ`W;QoYTY %Yd}ՙZ_qvp%5r8XR9ҭ h%MHfbii^*ڬx\$zdQiYPz5X8@\{ar)(z ڥjWYsƫ=Ϊ!J;#)bp#VKe걀 'lqU߱(yaip O)iaNbp 4FRղ @g*&d^yօH zܳ Y h'ig])`앎wתC]w  hwX ^ [c,X- guǑVp Yqc~꟞)8mukEy4Y`iMPcpiߝf\^_e$%˱6fz]^#^n`Ƨig߲ }k XxfXVۍ)]qY z'~f=6ߞR7! r'Y8@TQ~ t!f9ti uyhGڊڲH~ Uy$%}Ivv!`[ ZQE^Aw(܊U[]WM{!xp 9v\aL ftV/)Uqߚۢ  lҪJׅdtqX& lMJe =`qH dJM#V 0˰flaש@ނy`8N(d z"iޢ Y*Ki y(9"[o@h"x8܂(pmg ]ۿ17YIYP䠰X );iJ^;IKZgҞm2p q=w9u#]x"L0+QV%]qe~Vh`t֪~9鋭yyudib.⮹ɨH5jaeW~e=cԱ DX1{- ʠJ2p߭}X#9ޱHBV0 fَjiۀp rMh G'jY x;ܲ`uzJa'\ f>+'p+τϲ E6(΃ =6MT`uRu$y5Mgw4r X h EW(Ij fGJ)}zղPf_yב Vg]d1mױGܪ ibh 9U!=њgxrP)h\#'Q^vVY2 &ٲ 6BmKLP[8܊WxC(XQڱ@8E',[UVYe5 daf!ɥ\ǢtZḆH4897s Gj_xuɠ~"p \E:%خPI HyS[-ZxEշmAU`IijxP 6Ih`E3U#; &SF$呫 N1ňt(wՊ{zXb i8-f5k^(~0̣8(PJj(qǟ $1 M"Zx $(J, "$ b $zM4P 0rG "yG &iEISK(  $rc+G XF0(L 'ii  iF(2*I Ib&@,aha;m! (,QHr 0 i$JA "+$&蠞( Ơ2.r E$ (gq &&yZ0南m>,f)`HUlYu(VQ|]0fph4$8F`Rg!xU#p I$g_< SUI'^u#jƷ'fi!z0(gf%Z684Tvz(Y'VcDZ"H *uqݱX ajVgS<JFHbpgUuE^a=h^X ۛVnv\mo4H מy`8Σ( f jqEbh  q8 $c $H a ydX ! 0r  Yq& irI"2$ 2 "bJ b,GI0p$A B A$ h,C20 (,IPJ h=,aX(bCb,r(8 S($0!eW$I@ +,yǖ0dx j' H0묫 a @M$Ӣ mYg IzȠ!Ė*2@( 8hq" )nbi ( נ]{ G0뎶¬, + $K* H$J4K F P\IxSɣ+(`ybaG 0ba0A8ˆp ,(b$aJF4(xMRER RbI0x$r(HP   >"e w۪ɥ PY &(*\v[PU4@NeOmaXa8c!00( XJ$crF8I b, @,bI b `,d՚Ha団0}ގx 2 !I$q Q0 zG K0 uQU$ P$QE<<> f%h( 4Fno74hVn;虠ƟeF ҜU90P]Z$޸7ޡց]]f^=%iTmq~r_8Vf_,/ )Hjي;H hY2)h#aa_ h_70Ҥhi%!#^9,^9 b,jI c}b5 ǜQ$)d]`i0zӍNÛi܉ b`^ʉaqfu^\T!p#Wey01dğڵc8 (0gY{!NliuvҮ8S"简ԙRRetօ֠e٥p&fIvۮx iW9 E%) DG ݶYRZ69YDqVڨi (l]iXrvozڐ_$_z%aUgZH殈$@g`UHqۖY' MX g 6Mښ7ࣸ8H~#ו6}tj}40[ȒXh'=6V jՆQviOv5xDATb()f;Si&U θ+)†h ܮ+ʉ x& ׫&M) p-K^F bHٞO Ɗ~y֤rf bHJݝHqyYu4 J8ԉm V5jѰUydyy(ٱ~b'r#E)n" ԙr(G eqzԕ8Hr7߰&Sܑ,ر( =4t0&yW!M`xij( .^]]  ֣'%̴xXz $a]\"]͏y8Gv|h%aP`n%ԒT09 (\Qmx f=tkEԱZg;2Y%٥r,#iWN6KHq0 d-oG}If.p(GY'-hUQcB fijQW~H\4[5QΎY#qa@P$H 0!JP iB螢8 PȢÉ8朢 I iͤz@ Ö)F(誙,"8҇ Œ< "a sA$I"C`,2C` @(IS H(8 qH䌣 <,߭xŠa(k,r'0$KD  avX$J=Ϧ g6c &.*_ A$Q G$j$aI10҉1$ @Ya& z(jhaa]9QΪJ m.* Șn>hJ$@(J, `,H((mV(gc*8!Hq(x,,F`F$a$ @<<`@>@@ B@<@501@470898`0`@` `` ``` ``@@ @ `@`@ @@@`` `@`@` @@ @@ @ @@`@@ @@ `@ ```0@` @ $ !@% ) ) '@(*,@)'))@,@,@-,@.` 2@5`4 72)8888888888 9 9787 8@8`8`8`8888`8`88889888888898& &%%%&&&x&h&&&&&@&%(%$@$ $8$8$@$8$0$ $ $H$ $8$P$ $0$0$($8$($0$P$P$$##h#0##(# $$$$$$$$$$`#08X pPx8pp"H`"8$!00 8P #)/11h11112821h11p11H111000`1 181111@10P110X0(0P0000H0X0//p000(0/ 0@/.h////0/0//H/(0//(.-X. /....-- ..(/8.-h.x....--H.--.../.H.-h-- .(..---x-./.-.--x.-@.-,X--X.-h--...p.P.0.--.8..-..8/8/...@.....-H//X/P.--/P/h.@/P.p--X.`///@///..//h00h//X//80P0//00h0h0 0/0H/@//x//x00x0/0180/0@00100 00010`1110P0H00081000P000000X1@100@010x0x00010X000000@1(100 100@00H1p11100X0P000001x0000@00 10011x1P101 1@00@110000101111@1000@0 0001081111111000(00010(10+p# "X"H"`"`"("@"8"0"!" "0"("P"0" """!""!!!!p!!!!!!!!!!!!`!X!p!x!P!P!!! !! 0!H!8! ! #*----0-0-h-`-X-0-,+()8'&&&&&H'H) +++ ,P,+($"""##"""#"""""""""""`!!8!"x"""`#P#### $ $ $@$@$P$p$X$$#@$$$$$$x$$`$H$$h$$p$p$p$x$$p$p$p$p$$$h$X$h$`$P$h$$`$P$x&&%%% &h&&&p&&&&&H&%%$X$8$@$($0$P$0$ $0$0$0$@$8$ $8$8$$ $$@$`$H$#p#H#8#0##0#8$$$$$$$$$$# P@8`H8 `hh8 `pXX "0"%$! #(#((xx $8-81p111H11x22211h1111 1@1(101p1h1X111100X00H0@0p00P0x000P0/X00H000/h///X../.p//./p/0(0x/@.`-x.....@.----..---x..-.h.@.-.8.-./H..-.------ -H------x--8-p-..----P-P--x.X.`..(. .---P.--@... ..-x--.-.p.h/0/.h.-- . .X-..-...////`/`/../h0@0/ 0//0p0//P/80X00/X/000000000X001`0800H00(100.@000011100H00100X0x0000/0000//h1P11(1100/ /`0@101`1@11P11(1 10@001110000X101010(000P0(081100(1P181011h10@00 110 08000 1H1111000P0x0./80@1810 1111p1000000H010+P#"P""X"X"`"H"""0"" "H"""!!!!8"("""!"!!!!!!!!x!x!X!P!`!p!!@!P!H!! (! !0!! $ +-`-,,(-8-X-P-H-P-,,8)'&&&h&`&X'X)+++,p,+($P#"""""#""""#"""""""p"! X!!("H"" #P#h##$($$0$0$@$H$P$P$$$p$p$$x$$$$$p$h$$x$$`$x$h$`$h$x$$x$X$$$X$X$H$x$@$X$h$p$`$openexr-2.5.7/OpenEXR/IlmImfTest/comp_b44_piz.exr000066400000000000000000052445061406177042200215360ustar00rootroot00000000000000v/1channelschlist7BGRcompressioncompressiondataWindowbox2iIdisplayWindowbox2iIlineOrderlineOrderpixelAspectRatiofloat?screenWindowCenterv2fscreenWindowWidthfloat?:06 4 w3J|-ZBB.@7O!*@`6ȖG>mۓwU7q޴=kϹ??>߄vB` m,@hQ(aaaaaqqqr  $I$I$I$(((,, 0 , ,L0 0M8M4L4ӎ4M4M<8@8948888<;8@9@8?Ð9<P@=88@<<8A;8<88A@<CA@AP<1C@@A̐P5;CSC  ?<C? C?HCΐ%PԐ)P) ̐}AȐ }C7CT?C?@;C?C$?Cd=CP-P̐PĐmPPA͐ Cd>ACT? Cd=C1ĐA;CACAC?@C;@C;@<@@AC<-͏/OA6sU6ÕJ{_! '",59X F8q6作Pc*7*#%F͹?H]RJ̙L÷mU@y9NBU-*>cxL:N@)0)(#}0SJ-<Er=ˈ*8 ]AnQ#>Ql}=zQ؅Yl`3! `b(x `!* 8D\X7^kޗ*r^rb'ߚ;"[akb(z6T>JP8SWQ3X䷊Ng̯e᤾mRM\"p;"~=nÜiRa"@ŇX:dBm/9:,6#9Nt! #)\p)w/.O_H5"**,=$ +$ yS>L=eTk#A}v)HRR|퉁p9.BT cZ$g9RA8maxބB*-x&|"^]MNbOa'FQ jO%Km~QbwDrmdffhqMRi!xݾDAJ7 SIUbVzP6brz>ќ[\ٺik*oRe9I%A}HS+O0fuދRFbq9e z Nv6`C̡ t}Og](EEu)*yn.w0X U-ߏ3o|H*mfs |.mQ+_5ch=T(JWFuOnXtK*6>la#ī~9-Z4\p`@|ϞgRwb +I+"gG*rC˫lTj(E;2䳾W%@Ã(J? ,:kE߱>{"rwVj~BJ1 ȬnaO ^Bz/[]},0859c>LRȱ?〿qxo䓵)olj떧O%JsmǙ~,l<C@  N7;r@s0ɓ3׹{Hyۿ^}v[Ӥ'25!6\ #.:t,\wmq,!Bq,CP&<ɰhFesL:Sa57A-s'C{vN>pY?xL!hC%$nG_N$jxl|!D tH>%x!̻IrȴXF] K/"eJ)+cU>`cw+ȉ x(X<&(d;6(bFB% oHT(%|J.XW]-Wxu: oPҲiRRvwWjGI fH/jA!i+jr V/scWGsKIQ9LZWZTȇzx|pIR..ca1 \@W~ :DY*W4Tc4+S7٩ep;xRV lH- . Sy= E0u7 Hy1?G;p}cHۄ Bq r4wa@ҧ;s2Y7(۳$EM@]xM=fd%-C͏.b .N8}z.𚡉o-1䂽lVK5SJ*,=#j#E ͈wF6Di|x@ !˙!pZ[b 5Yr, -Qak①Ծn(QD'rx’2e'<6#HIQ;⭄])B}*̃*TgrG AZseڝDrDDTug9%I!F=) z%H!`@܌4v!qN~Q'fC9W;DX1'_@M>_ :\XŘo63Zv0ԁC#JE 9!c3dtϢiǏ-JCx⚉BțLPL2VU0g Qfrȉʡgvy9}cN6c4&MJQtHx)G$5NƐ1~P [ϯ.99z;D]KZRS$ϜfoOٳ_8&n7//:'\^g;e$j@CyTs# yrvb%'q0W.-<:1F_~"b@ls)(î4C q=//Vo`W!T) /!_By @6 Y!Cj9fD(%jfLlJUީhY9l5$b;)lHؐceղ*O8H lc]bdbkŧ&3lPցne;߱6LP"/e8rQ~H\Yx_%!]-.Uކ8pnJGm,uh~PryLf&ē8<׼J*Hl5W` AW,3xᙱËԌ|& &d(Is@r,*-#t.]2 T}~Lj,"\FlV)b dF=RNLi~٣?DHb1y!2Z6^x)>?<x< P% $m!58lw-3>ѥ M":Ao/NGk&G<@qI,)Sѵs/|8HyTaɹ@-rqho]cF&:09/m}jFtyD8lD}zˌDaa B 2ѢC/0X©F ; $ޏ#f_F׈␷"R}-YCcK81_斔U,v؝rQn"CGb5|$&/Lat'GM;QWfq7$XKHYyv*1K盫pKi4T23!K'\٣*KF`,F'|o,_0܁:RՐ^!!G!Ķxpˬ*tI vzF4Bs .spJ4\ {Aۃu₵:M[z?.<|Ύ烶pPzqExAFLWgI{xNgޖ;gd%}ű$(5O8!f:&@A9f_馯9dky;crkaD rA  VЇ0r/9!!3 tHx?a6ŀ,Xpxp-]U2OE!$:!2;dLyMRh4\FRP_qѨa0hç;[gM8ؙڞTdऍ򒔏y[q4cK)AQM)S#@ N#3wb|G4 *(({-X,v=y`lUqja" 0J pEbD\;:مP%sZ:$d5=d_o7VbJK_!dp3/W)ayJbI$F6ֵlg TMg[*vL)=7yZ[r%f"RLJfD*4RX]ړ#!MGrRb? l[@xBh}Ȃ!_qTt.ժBs:8D9R]Ɉh)sulVfU)XI)jUoLJ&H$ G[)n<7)@~DQt~6^Q|cJS'#ͱʼnzq=dqÅ-\In"@YE>C.ɣfNFzY=gU GNy_ ~6AFQp ԪZ^J&~.X2:Ҷ?A$\pMXr KNOtK$7vvwxA?ϰU8'}-dM6%ҁs.J!c#8.D;d?r,,⺑$!4q/RME0["&$ cX@nS{C#i5=:Ӹ8j"1aͿp=ՆQ/&`1xYJۑ^فC&8)}."57 [uYWB_Z8Q]bWmf#Dta|b$I , I])THF)U`g-&ܐv YF~ S5)JGfۦ'C¡h"iPj !A~i Yު\>\Fo4^L)4!Ԙ ,H(i5K3x:PΊ+!R>?3$>2f7V׺6,ұOƌ'G?\xU˵Ij]@@@w6vďwl](K{Eu68hrD"@RL8ƣh'Lݪ`tE r_[-r>J*&:0-lD q֛Ҙ*f~K!ݕT1)"0#6hUv%cQK]Y9tRppp\ĵs{zև''A}I8vh:a0} ;@_M/)t2Sk)7]D~wLꑨKZ|:*Ӹ9 f uWTa\f~TP;6 15o;K/5̹.U0Fw nA Bmu88#@p(4 !㈍"~L 5ne#&))cU1n<V/Z1*]ҽZ'DjUBLy--\6a¡ ϥEp-m|۱]~AjFKݑPP%읏#jGBS/a nP)5n: n}z&CR+pժTݷ=֮(dPBE0!N0Q{tBy}2[yE]-(fWʡ֜a(a[<e!w*x9EuF{^P)t=!!E&´|h|-*&zklqX .GQ⹼~mEҟ!8Mj'P̬=8&ol ɇ3j EGNsu& EĮ_H`ʒe.:Ahglxm@:Z6֨Y37]Ii|5!NS6$t8nMrGAR@]A7lO2Zʏ Wb A>l^#*24}$9 < d`Ϻ-Oc^f} 7bںn}t4K֋sk>jУDITOe@9;vwO=dvlE'- \PlBaԕOSO2%8] cu@&ȷ> H=5>)QXN*d_KDs!8Y a&xsC4gSl˄f ^kyL\#)5 }1s$Ru/8^;d/!R Ҋ W< !:r !a *@uxmq' 'PHsCD10/ڃH!p^RX+ R@HA'#8nt ̔71 \`p ր` `)¨*d,_\H X6D HX r6Ѽ%N|yNEJ&E"ti}G#&(@zv"d֋&%FP-/FXq1=Q2AɆ-J'iIDNjWhpE E= BX-$y'䫒܄gy¯xhHGX]H5I~%GEj Q|I8#Ie'Q^Eucʉ;G{=03TZ)kYhn袤(* 1{\҅/ʷfܨ5DLOu}XqtWH <'tJU\EYb\u8ĩ=&1w]MF^Pr@A5ohfvinj."cIL6ᵐpR,xjMX-Z) 0hBtV( NiIHProЦ*4[{QE 91leRaB58/ I7Y*db\>G*mtEiṞWe64Zkupvyk;sӑr_49omɉOb-.LA"(r {Bƀ Y/>m DB@8wmr^W^9ѧdTdQOӟ~b$}e3PgIjM^vi^17ͮw un.]bYt\V<9j-LW1{(N3_̤aPo=LwMt "&cLYi@5VhM6g' >Oz\('&tuDݖ9:!ܸ^r:4 ` i1 FA Ef180,)\+P f( S )t [pA 1nB:@cA Йl8M &4r-UDZ!3"jNA!)"1CA M!Z؄ZZ+E(K!cqW%h#C̑HJeW(?nBSh}V{a\d터{^ry[\Z-piq[rhpoЯ-B;SϮ},ݒl9J26sajeSRRg Khx؝51fĉ!8r}ao^46-nGڈvDxr2[/2eo9zB\FbAWhY2bD!xd˯U7Z!:+8,>ͨ3u z}C:tXޝj>/jRϲ\z*ջ{iFbE/jG*'E>Ad^=S!]m%0F 6wpzӫHT Q9x/I@RK+ٱQ g=@H!E?RNx[UL(r~8:-"Ӏ/HDRl &:&%Z=aĝ# @À rXțr<}BJɊ1f=8s[{Mxe !p6PDp\/A;s fQh7 PZV(Œ;BF!Kg@td\AHGXtP\ 4ȅ9+P(DwCӐ:J\KaJbR7mv;֖?i䓎k3A$zFsѵ_#3~[i+&Dܙ7DMr[ltX35o[~!7adN6,&QsW6ᳪ:Z=rxfDm[E,E[3P>M(MĴBM zyۿETAi8t$J gt^x3ܐT`Qj`ITB|H>Bqh'Z@S[8NL !5σt'nı5jəOe'Zd  ThFV(G9c] Q_dV #'8\pf,c2[PRBf +%"$90<90.0#iXf: dd"@(㐩 fl0 B h q(;@Zg@kgMVZPF两p*ScM=5n62΁ˣQRnu=NB@>ݛrf}9'IV``;8ٛw-]xz; 4. ߈慈|O3A] x+A0y3˚:ی`{l~z?g]dUN͢ tpF+q1ue~L Ըqj9E) Ů"fiyWM7gyd cE>eETT,C\l1Awjx0iPar&) v1MY>4z2/U C"{n}sz#,h}`gıy%TCKhaіQ vZ%`uQFЄ eRAK,v6yXhJ&" E<:Kvd"FYXeܢpy`~M6!b-XVf7dn(@4f(:"  ߋ0!*ǃE(B:a@IA,-: xeQVxئg] ,N6Bz2q2Ԏ82+= rg:BtOan3i t iy_H0n eE=иre) mfq)5ߡMTPG?8⼏5s\ߘ u*y~x pͦ[b럯WQo?*ƿ#Ju=Ï5pZ& 썗)Ű'm9쳰Ww?ݭˍ׵-ٱBΜgAJ̥EH*_ar]X^6JC{+7`p80B T(' P"дHXBSa.n2 PwP2Ь%%lL×Cʨ@( FUA\1^ab <)U2$>Nd!.?r|hw#P|u`4&w%]@ 27h6`9 ]$5J?9>_XeAI899Jt< y Mrl`mp@˘0K.To5މ>SאK,H,/%꽐X@S0y_2fjfPf:FCиǟgL9}uj߄oxIv׏k#n|q %{g.2(ɮh{ǫtP(4!ۆ%κZ[1p0&I"pfDTEf}9ˁsߦ K1ew2 NT k._1ҧ^VfFDs7}j62w-LJ0 G8I| J@g{"0Rxc்&(BBWA D*AQ p po59,l8Qh+!ˁ@AL0 !4[+'$E܃AZB6X>b7lidcu8mF37usfGk|XCϋ&P"uRB נ_j%Cqiўe](Pa?ӫ%^20@>5 32<P&8~Pk6[- /]!#``!K8:-jO־l"}0.k) @.'[2+4xgnuo.u46{ӡn l3oL5Q_V$̎^þ3|~.a,o!lܾwmW߶S F6M *N ԗ%TG,maArmKh`NwǠ I}TtWG 0>)޿ "'8Eg]﯊'=z|䖏Mg¯TʩiWex׶`v[J x-zgأēYݚ@)=)fIb_FCM7%ReuV(g펰 ɢAaM|J C`P0`\<|.!T'#K6(epb X5~4n{Lyqi1eӵ+sbmhJ~†S7ғDf!<}b I>/@ΒN^iz_InI;LU8իfT6E@ʁˤ&ˤ?wK*'EۜH?RCyJpgJĹSYk(:5T-u__<ߤܜ4cH6El!= =t<ُGaA &Gcw=mj=n4_4Mt"تq<093h^v?؟`4}齱 z3Kj2vj{>J|rH81doҋN63sba!X* jho2;"?2)Xj(EӺ/}m4QG޴ / R_>]Cl=Yk#f /AFW ~(PIeR-EhqKk eh[..}5eX|q[b&^OjcT\V>3Eo @!Ô˫:>4@q& ]GѬ`md~ӦVQ7ڬ+NiutyPm\L=. ×hD kCMMB}_O2Cnkg;Yj9OpSji5H ^U-7ۼݹSĖG}I5X'r0O: /_@J`}n]yNt.xӶ2̪AB5gXI83ւd[TK6_ټ"ѽˬ8 ̽Ѐ2vLdl_S{z!NC6CbԧI[v(F2 _6qK,%I0P58Cja%y( (' -&. lVn0WBOPA>JTHT4ҮFƃ{Rê ]0ʻZ,'t"Rv؊\k }$H9}L8HIeFQjϫ:tSӢ2G^P-xZjfѴɅa(gpU!bXl ~AAiktOyxCml>k#,ϧ:妊CPlN~61K :[.޲HϢ-ŹBۏSa7d'04wOh/[V"Ƥ@ytQcƑ7gvz⊁,F8Vl,nNK(ycoߓr0q3ǭ$cx}Nm呸!/{* l=~Bur /Gɪ, OTP;f;@:mFg'$9n/1% ;^K2e3x[Q[Īa[% zp#ޡjQbkl0\TF+}h h!SEq^^>b_^ !oVG郷Q]=9Ue#}*cڕQ/q6꫻Q׷]Lqh߾8 ]y7+;us'M͟q 8ýT `57 䑽@@ \ 26 0YA{'5K&@RƆnyjEqpN=?wU~k@!e&v 45鋤y휝;͉2 \x$DхLԲU[E/k7@gZIA]-&FĨ Ҋŕd~ϻL>ݴ_’RBAiica3O%l&ﷁHwBJL,z%4kP*_aϜDHH % $(p_QI#^ԤwP'; #:&iȜ&\# u ]1߬gp{um-l%$s1& OϜ޷  A뢗UY.%$c"?5܁ˆd'6Q=4)] }$/V%3.ײf#ggl>:2t3fim`X~9Q5iWKᇓ>L=Cg;)1A?כ )se3(AJ GVLf̤7u̾6%Ry \],{4ϤO'FԁF>fI~- }/+\[xDp{=Ҍ?oEj "~PeH$G{/SFA)=2TB͒=F^ټpPn|E4&S=bZi)#s8R >t=5eSS\󇟄,=K;QGǍ8hxqC3YĶ.rykARHlDTuMO ;Wb_iFBn֥Ϋ?fadP2 &xfSgW=懣~+;27N@gtVwJ^ul誮ffqV Qgfjo~MH 8 ҡR@.ñ 5 ؚw:eG0SM;*_U vw&f{qҶts,Ȗ4*S$LڎQ>4b-QzdXG4ٟ9Y܅y)=pweH)p蠈܉cjBr{8<1~$DZDDs,[\cQNnHۤ 7dW\dd'S5yJkm$Tsx\]gM]Z)PaԤ4;CGH=Ѳ=:S#[|A]I:mL@W۝1!;cX/Q$Q[rIӉNmzdo˩qzUV=)D4oy?p `Ƨ˚CkK#ryam+3ӕ2yEvrɥ:Vu ui/F5%ܘ4iEn}шKl|2~17v̸(voDX KPvX z( B9 hzbcS^s@zGe9*+m/0Skb^*sگ}qVEChUk:<бz!d =__"@h;90j '`_O:(O${U? ܿղmgcsgX| @9Jiot0_d+Ij%pS-*kOꏧnѥ$]L)9` jVi` ocv۬K[ ތ@;om!\۵& 7հ/'%N 4pn~l@P9>v0Dt~gQ=ߑ ?e?݉4fosW ٛ;tB%,?gwNEϿ/Nz)EwIl')tN48GaK`ɷ1akLB&UPR)prCKݙNH,ttV9 <З6zL Uq60ʳ9/AoCWM/H5НY@?[[(/JR٥Z`P0cSZ 5SiI#Mm\<ГU<ђvy3YTE[h5+\Qk+lFG ng</_,vMY\E؟&*:^}ZE1;>tQJ_9!GwlTS-|pB΍Ջs%6O}rA!TcvyQFMqBHIQnHVI[Q1w8N;#!'}88ϗ:US}fߺO^@O$T>'D߃%s}L'`yW4c >Kݩ(f {*$~_+$hq;ϵ.;Y3"*L7IѵZTzjZJ)<~\p!E֒rh$m]CI>}j+wuqP؟7:lRv]7I#qqPxd0FG%ZިqAs V_y"Bm\Y:}̐}*T.]a|ڻv޸(٧>Z"IGzvI,Ȧs)Hpz~d9"jڷ!WKqi9l9tWVzXӴ_|J1*xtmH\V>ހ& X۳UuT_R&4AaDԁ-s-g!VZ09%yGl:$zӹ;#>gƛXm|MhGtrx:1o<ݬ{rBz-=SYufcWA:ûEbok(~؈I^UwdmAO >tޓp |] \6ʝ^d_*Ddݢt!l^xặ)S1? BKQ 1`Zmɵzh^5;]F4HT%uÓ?k֐ZW/)f&lS蠉iS\G nbYf:ޯ:c3>n~iP6r=:.XRw=8F_}úVjTjxP鈊U{,Z9_Hy,Ca wOFzkg&'3(3zTh[K<[W Ti ~tEueggR>𩸒T2$F i 99בA.|M^pz=9Q/Ӌ,.jPD̲aCʳ3#gJAÄdO\r|dNT!c+Jqirxf|rBfGAE Pd$tg陱sΎ:$C!sH]wҋ}G:rE$o_k Z=L:![ tAs9V%,˼ܚ8;̦=*H5$A.pGL'P,6^B^HgRyPb+7$,/P?4Hlq7?zߍزǺJZkU\r"He31:gEΡׂ赣zG619#0oh5O6j/hLiV?ʢtFq拹XHKޅKЗqHPq? Mg+ w]c46cz&>/)Z&HfȾs5mLʕvvܡ)TACSN<]/ܒ } z&703†2i+\J6Z3#7XXjtYzPk{b*z3e@iLS i0I@X9|V}`Ykr﷭`Px^[p=O ; Y̍|G/, (EGb?ҚaES51'ӚlWeC.Zf `9U4#.pQ<ʢ|TiŽ,4* v@.߂¤9JDb9_jO2?nJ<%|t c] Uw/~ߑA7)2XR:LtBJEX4_(T_h8C Ŀd09^=e`gb_ERBE;R_Z!%\ G!;eDtA3+жAl4[qЦ0j\ \ƏY:f"ynhVkT뛉ZϺ|f_/qpl9ٞ?knn'kDŴ=w ϡ\<&gcs܇v -#xhy,=zpR9 [/4H{+$%nQv_S**j\?L?`}'`9*stj_=(MO&qUqTEUkzA/>'$#= 2QgeE{CÖ@8R(ߐMfΣ9E(W6ermVWNxe 7 XxHD$ 7م!* @o 8SlO:9BD!KGӖA׈ u}K$KryZE*a3HtlhDܽw>:}PnՕ~%7gO6JC T1Y"OtEͿ9" у;_ +o5gxɳ,:(~!4K"j#r\l̙K|B* \2G! -e0Yae3? jWkHlF4PO ^(!rmvNIYMBA6fvctފWXE#!K:5HFZ W>AB(PmmqH'ΎZV2=yʹèK}e>5z,*y'߿xz@hŎ92XNI8J{&|NfpwsM'11G‡t%JN}ͺ»!BG#gdLٕ$=UwAFjօ[Ϯ2Vj(憹uyD:u f#”'wOzmpG wEtd=ˁBwop]d5h/3J"GGٕgduccFO )ܤ܆mNp~9/Ω+Q$ңӛ908@`S9YS FGjF̵9_;AQ vy}ǯSt;DhxWʞd|XELj_]6E[HtGi,& do;S v2V|SMbhبԩ^1E/ yBʎw~|3&X]U7$Itv I9Tc:7E@RJ6]JQ39I6RE0ie"-ţLi+<S4ۜSqI)'$DUJhDOTjD\)zX($QP\jYHy̓ ҉CItҖ?B@H3[ OC#Cp&('ERu+ o|YeD$ȕySNX(fZaǯ}ܑ%{Q2_懈[LӵCBKȺ/ѓzܓiAϔd4_5ѫS&9n>mpQVqȵu|a# 149# ]TF);۲W?o+@Q6x Ud7PR&!qPa!sTQzw Tr~>:Md ̰x r ]Y?j&:=شYP9&9jGcŠ-T57 фn`w+g8S)8o'7$ABCGE CS$:_?+x'yǗ.W3C0r8 i(箈ߧaƀ5 Aof{"1L'Շ_,N\2x%xSyNeD,C''#_C9?gGܤ%CNC#fr/&(g,lZ/?6E/u78BIG$X Dm!E$zu!Cʢ$EzW2 CWgi |; QafQ~Ÿ'BKW1I~ ZND9wp5>d) v[Ҹ!ҀQfd.WʾkECꃍy5y --qcrBdȤԂEE˯GI&mo00ɿ $6vP ? ]-.hO 8AT (u-?VT2 $MFQ /}ʆ@k*l{@}){&ZEp#9;7M?E~'2'> \(m߀"1b0c`5T su%V0s3{;6T6(ocćȽ\Uѣ \%]dF$|?D S)MˤzEc6,{ፙJ#}LC7-Fs Foh.aZ|":/{bQFyhf/׆:Z~|;}{~T!~Һ%dUm8%VyrIpsG96>'Vf/& :߫x%A}F'}^m ldM x\s pi5 wu-Z6"PL8S3Q zݿa ÜP S(HUE>6⟷' v뿢ޱ*SoT*;n.soxyo- a"04 hfB U Π [ V p* g NNv 値 !.@WjhQ5{#@ .3m1D[Q:D>UB7@Ix5?“Nhe$:"Zo'P?Bg樾Pt8^D5W+n(N^賄IDŮ <4EE]Lcs 0O椈Q3M(_!^HjF? OP2.Pn%D P(%6EshS[zI ,⟎ Wb-p >9fDWME# XZ<鵬*K`Y $.7ㅽ5z/5Jʈ< ij-\ TQlxUtZ#t@x`\@SSzʹ0d&^4@_Bt2 B mk_|}M|-3=pC(=}z7 Ʒ 2wٻq| d=RƖ1;H.>rBl<}`n%VS0P6<0=FP.][\NሯhZ4(a@{v&Wkgn*ʒxW*Ls5ܾmN0&c~d"d ^iv^].NnFay]4sv"G[=E0phVsHś.{3:~~LƶOfW1jMN9Z:s=3/;Qu.m~.`iJ ^'k, \6t+R| Far" mRª!Ch U?IK-@6`)ff - 2큫Z  ѐFDuCD`P-贳oSHl6 K0T@*G[)}$lQJG o'!q["wiϢK!ndESVYTb)F]Zh+'p-H V$ehxIӡv(R.k!X;I{!N,TyH)HTQa( Vtz|tp(0)'9ֳx8i?V[Ol}}2DDxNRFױ&,Rd:#VBҷ:N݋e< ꯖ&iˌc@=Dͷg \Z\׺J U]۾*ں^ݳGU2Pqiw3y/3vnEF哏 ϻ^Y5zfw˪lҙ6huȡڅz}I7|v dSͷe7`Y)l,=9G~pAD9z@~tST'\xG]O>^-y! Kīᮢӭ'а) ((8A`#  t dj`;/#P~ 0V,<5f10g.ǖHYB\~pͧ0d= mo4Zjյ\ՓcDiYZ2҄[S*VLcњk:?Þ_2裆ta,:{tg64[\9dm3Edixۗ$3U1waNݕ4rU]Z2m鞙~կb.¦+LEYSu;5sS;?t!lZEϼ˃u0)4~MS٧v:eh黆7!&`;vВD`p7`X Ln{$ɀ~j B$A+JׂOAT3 h1b@6TxA`HH9NƓ)hO"a="r 'tOQPQaO( ts!S]  U!HTAx~!B i6 LA*A|BZ6+0 ȋC J>fXmfE B]/*ǻ4~2ɳ^A~1/1l<"lAsuqRffPƒc\= IςM܂_;*yx cURIG_Fς_lN- Tي֘ao#MҐn/ }HfE{EhXa2Ѓ<*A cIdI!E(' " neuySO @k. ؁ ȅB;z=aqfz_.{cG'ȅe[ӬVzݿekdZGT߀t1Y| ^+ߒ猼zV,t_"{3q$ܻ4]3nk622mˈCNG-ɷӜ!{[)eKAo+7SnY[v{[ ɧ{s7A׏|q@!c6۹_oO#|^El53@W !:`,4WCHA:B q@@GIKh%P+@p"~ 62$!?yp< $z!z@<r| BwH`.'Ƭ( #x̰]PWՉu7vuw9z璇f98}n0qNjp2; ={>ƶ95FuNoGEN^g{ŮZPחvĻ6ڝpbZc<,GH Vz3]!OMѬPGx+z=.km<섎;j6GF>ϽN"vm~#~/z[9.J=gg>{r==.dU?~7vE=C7q^ϺxP>㦽y ӝ17w~\>`kG[jXl,HP,{8#“@g?K .GI.NUKB FNxYl'Nnp|HX5ΧA/dd )0,J 3V WHʠ]ȅoU 52bT[L @ ~'p|H^J(Pxqr' e5fz E{G.G  ݴeDzct-I|,YX2&Mkiw 44i+_Cj4ϴ$I:5MGE05*M~1* ODdm-D3d}:Ӗo?̤W ƥ͑AwQ|̦9^<ۓo5swM=lguOg[Eɫѽ÷7HYgBE_|(juBÑ^/{=Ԛ3Ó6R(S*n[OCDgXvN{]5$撼= Օ=p4ݿ֡$-؍kv!#¹`+>X~hMB&pd20PS`F?O'7L؂ C xДE7@N9RZ P\12$1Ŝ<:A˗N"Mj rwJj|[fwsuí/õ:ׂ1<͑+&|.ڌ;OɛDʠR-̕M\bf'-ykvD=?[ 5k_)^(&" np ` T@;d0 ֆc=AnF&(xfǘn {i 5"eYbw Yf`ot^h;BltL}p7k*8zw C'H_ٝqGlqkMpl,OJnLRB.gӿZt2ԓX ܟ$Coj_O,g=ik(Nޫx@rіTGjh26V۠hq _Lr\Lm T[kQTFK俥|6 ϋnқ';n,}OYٶLre=KI |:^p!O4T?eqoo `+؊( `(<$ Y.`9@9@JC]<ns {b+)09x`Pή>-KXgϭ ?ҀEѱ/E#/V'mŊIZD\ճtBO#;; gVbHq-`Ha 2wN鿗\қԾ /h*d5qqղ^cf73/9UO/IdD2.1FAP_a^q @Vx(~B2crWyAF7!}b9sR\1Ajng΢mb]8!Ho>QvlӚ:HBيᎊ!ڿ5<_.tԤ`^F'g1L]RaDXq[6wD#I2̱~Nʑ.rpgU50s=?lL`%{V\>j,A!3riNe\_%dc??{<;d[vo&#j wC9OPqsۼKx$XcFeڑi7U$&csvk"0#GOCqNbaQx4zvBݚH#Ȯ.0:5ԓ>!xvy=# BblѠ u8DmS"O ;➨JnݜG2wπ镴1UpM^NU>^_}0K=@FsEi`LզS%pXC׼ l5=觑ӉBp GK D\'^ S\-wl`TQ1ϣJcVlPBJ'ŝ=;vz$Ҿy7=?DmYww]pܾgcB~5/ʛtF^]o CLg9k{8At%9s96852;{PI^}jYA 7f C)5Y5:p M KEq6h\  mǝfׁ']&*NWCHם3{XmMdzm&=# MEIX ( q*nnƖX{ %)n9a2tYnr9P9ft(hd;-v|O0*a!go۬hm̫U7\%RAgP=H.w04J1(8w@Ee~R/q\|XH)%[ 5ˌVQQwj|Vp-"eU϶I쾑2(S 4P<;h5CS[ X%̣[J<)̌t/1KK=Kz&%hjrNa-P~g5z46~/3 C90q{!,?PE oK߮D=d~<1ShnNG\h<0SCA$PsHkliXOȜYEg3 D.y"9_t߫gIfE?#dSK8ly?}⿐UWJk _?aawSutA, }̓r$}(ϷW$ךhcE~z5#XJR pI>~ Op(17QRɞa&zCP9}jHj7g]ӗn>H'Ou'Q^pEUo;f&Æ[R%rBʐÝ;X0JYNgqMnϸHvtTlQC" Hمxhj7`Y[RUe@)`+sHn ޲wQ"TA ˑd熾ܛPV |qot:F->HLwqJ:4`jc9s@R$\e:4N PhD17)&=֧ܴi俛i`ڣ{|G40[am俳>|˔we֩K3ʽJ{YE\ HuHPGu.C_SOO=:C]K-^=ll- gfr~ U y{6`YW3?MgfF)dW? >!!dZ>Lb&9>76y)e%:o?D* ۲/o`%6Bk,1oِ+{V:-pߺ礥G/HţX0ǐ5QIkҐQ'L~*,uŹESX߭wd}q=ĒmU+U+~D/Y W04;=zq/DX@^G'!gXDWH҄ݳD9 ^k5g|ԑWr/k}.q ,D|*Nʒ,w@qn掘==5CW4=8隔A{y \!] r})+)?rT})4rӢѨޯ_3J<&4;>h q\X E/G.\;w?稛%puAitwno^"dŝZvS }׵Kwh_`%@$P:-5!_hGY";q%do{L*BɱC 92`5|IJjoiyf[K=hgEQ3g- ~d3zdxC4B^f!\EljCx!&Lf:̎Q"nT>Ow5kkנ#q"q=u9N#Dprp%?S%uR(2"=+óH+Bvx̏h*nWLJ~{<©Z#!7أ:>H~/?uzǹ/JuanY"9F(~ǟUId"|:spQBSCa[ΤLΒJpi584|#ϤM폞 4GlU4V-4ۏOٿLKO!c6>gsd$UXA{ 9D#auedM,ń7xhh.G2(t۾Z U[8 `.a;퓿F%92p|@ +Pjp<Goӽ9m)Ѷ:=C[ 6Hp㪦 @2|^SǮ`-zY G*e}8N=t@GNK96"ݛ3H~!gQa'Z?.X%},?ÎŊ3uU1\Sŝ#njp3yԠ D\H9߂P`31 J4ie"HmZLj.}% t8e‘Ul]٣ĀBq a[Mu=J.A}> (̒3vjANp?TIb!%(ŒkNm!׽w;0Тo8 L"׻IiYQ]ķ\H‰fzfamVҙӄiQWc=ש<ڌ;6)&_c%_:pjw5h2s7/Pؖ3T'neϧ/u-G!Rx;*%?jMWu.u\Ey„8pj-c{-GJMS:h߉]nT*pa]{y, Zzȫ$UVB73~Z{ Uۧ;跎1_yx<P鮁 dYaX bu͠éϥ|QinQC ŊڈJQ!{ٞiqD$EQ[dc%x8us(x(Ȗ< ˚R֒ r43 ' `rloft[H#ػԄ6F[;<8"xy* "Ww+$ssh+L_[FTDs^3;=3]]k:!}JE#D^[oK6A#rXĦҴC5TiEsR.}{i_9s['a g M@Ԃ ˟rYfĎj$'󓘐 $`(|)Z;UL4ǏBI d\s3DuR)ǚH gZN|#q̏@&lpl<ń7jmه0a#pƸyziu !j.ۢ/ʣ3}/[wLf\YMD D<~i$CH<{v7$!N<(x$"I1Xo^iEDb|҃"sOD ?oBmA5}\ANNFʚɾ4%?>!rY% "ң )M1i͉ RrEuSJP^Lx џI94f(nxc#RY1V%=Js$t`p?2ⱼy23Fn|fHv Z,k[碽[F~4ȯ^;fyYu _`!ԫ ^ɱPzkݫ^Ii[O8z_v܎(VNƜk8YCS{N$eqcNr۳.ɛzckmY ?~HԱē}7q=Ŷt}QR玑,k:=*N^nIԃIʚ㥧G1,'i{2&oޚYƜhPz6$h}UxW'M>pt K+ @6B^a hLX@sdt4+k_f*I n簢()5tcì=>/qG 1 ڤI&߷aP``z[S'Pr47$QϚʼnVob:|;kV PiKUN~cϜמ(C ,/ ";cgC%y)a %yKGy9;7a{/} :۰jqXHjmU}D Hp_Aݰ'|ut0@`5)p[)[sIwH,E)/~l8́:tZ⌖RvҬ6QWj&of$2MQkH׽ 2i3=G}r2K (5^vwж!z^h:HjB =2 e䴁cmK7"a@!$A.|^|TA;Xt8o3DǍ]yS4_%䢳߸}5Wfxd3b DSa'nЊ?"y]TJ$jSd_zoB0^J,܀!=T5WTI͍|mjNn_SH}6?ħNkGϠ;> HAw" EO*yRAbΜMn.]cW!5'r+SUhe%GE"Ӥ~yFkR)qDqqy@lp@U*hDJ|de7^r'~>*&b"= '_fbE)& WT.:/MPFUjF|,+dHuå |O n92#[7 IgepRI:Cm@~iM"x{#\Xu,:3}@fCH#EbmQM`\^sm\ja!x ~ #A/TYcHOK5N\JQ҄UNbHX0+?\Ѳ9}J H,Q㕐xa~PovI` ;Rv,q+UNӰlcK$G"B>@]H\O״ Lԉ>Kӵ[~e*Ďc^PQQȍHogRU8DuAgPFI[G}LIÊJ3H$oe%̌\y,v 4NI :5X2RxҾoDiϗ`1W7N^\'!da_x0BUvrk/OYQ4OOn58Vfߔ; 53p#&-"nOɗ3ҁVЋ 4I}<:qCw%Y ߮^L>>{uwWNη@+AoEGtmr|佶ŦrկN})L ^Dj\m?k.vkYHy(UxՌc[Sʈt]lqa^QMAWL&D|$XBVGQt +r~L <֣E:Ԣ)#Y^%VOb#ZB{%FP$³{D?2ˀ 7aȤ:wo;NK^1F=znT-@'<~~7J[duQPs JgE(!+菓= G1_xѼl([+S;~j;bC(~j;|Ohj067W2bߜ&&G&`87fiY&њ鲧2ao00"hڐ,r}3Մﯪgr/357C 3V).Wp[jΠu:=5'sO`18f{?yQ$Ŝ u|Y­q۟S~;Яoѫ[,MO ϊ5"HC[Q@n*U3#q'\&,*xcW4-S_vjH}߉hG;'RMβ\WӺݘ  I3@UZ?lWh`$u6h,qh{.FQrmR켔:B$n~-K ĸx{Zĩ|q$wk;:f4!',o c`@̂8-\ڋiPJ̛\ S9'QR˥NXD}J]bu`Ow&K4$dבd^~bz"Hgz!YWژ^z*-lp&b^Ȣ آ ɜBI۪g"A]m/98V t4j(hh;(kwnӹJW5G)ssg]nY z}4 0Ў r]InB>HB~Kc̈viȯQ]o/E#ג²aCnkSw!13kP_1 %J4(.HH $564 ߑwdq7#u/Q_I_yLW Bqb{}PmM W>'Lp!`k& ep` ~6ܣFy0|S~̊}ȧ9R #gxjEۋ<ۗG0܀寠鼰 Mէgz hٲ-SExe ^הQP/XO]b 4|C?=*[`v/M8`-a@'C 4-{!v’ 6 ?£cq6 K'=%` %C;e}=`#',–ȃni39tycϘy2?zB#rx;s}뢘3=l_l-6(ZvHOjcL 4%cvЀy57?]Tx a6 6> a]ϡx$ .N?O'KL~9gp !K.ΖfTxv/5{0.˰0#1JnWH;F^>r9) 8z@ubgHAs<|߁u a(hls*`v΂"tA Q87J4? *PT..8&d]SbD Ā[$)B}IRgc5ksGD9Z?!RCxS FA!?;!/Io.jPz:/̄Ԧ7LAFEWhu#?b|1<١:B[E)L8@kr1TIBso4T9LX8 8:+?<b{;Y_kAƘT._8c7yWfaCNe>}l/;acPŐ$ QY@*4B {r8 bs{+lkg<*8[B 5r42`eVC݂nLw@N"6PԌs+db\ Q(ؔ`Wt1TVc{<aKi`Ev|#+vW>`7u4yM&UI=uR\\Ą8Vx~,ٻĦN';K#J:nD5`⢆3_a^F b1XpEF#k[4⡆c/ҙF[VLJud]ϳ'lu:.x d[+#8!e - IyZh &FfT^zQB@@ս"tت"2Wx:JTb73{M_֢1#mWh˷~&jc92(!1+3Dar+GXT[ݰhV^qxv-Ըg~\f\!0N|k' 93F gF|pT8Q V]/ >:RZ`j= @_fDcp`֬d 6AR+fC^Hl cpa*t ҀbFv |A(H} ٳ?LZLH͢!NE9QaΠ{20~)Lbʑ+;Q릂LCKXLFʹ.:IBՕ_HGiG ^{D|RDf[ltN-[.6L$TIpNYCddS;68ud;%G|!*Pzd%PܸD EL9 ?Ljr O)ӋwBElU `;l 6<'{1g dxZ":Zd>8~JyIdޛ?ǥL[v0L8ɳϛ3roM@npc\ٹ{TڮUCAœBjB,~2\`=0lpͬz:.Gq{.sRs,Gt}< D g J'C`ɾ,qLȌ]0'=. n;#8 JUWϩ:>ifjJYHmIvLCX.xB #I[h6O ]Sq%՞: v{nNH0!&N[3Ώ~ghOl{G%~ކ8^Zml:I1rotzj-/pyyyxu®}wo> GW5_t?M##6Ύ0֍dE6t;X~2+JM/Ϭ1ڔx.FC5C`=4iA$@1FZfpz!9e"{Ea!A7 h\I S.XE1|1˭KqewUSÊ<]DABne_\iĉ]u|`V`e-1P uy?,}R#c"h`;݀a0.$alkT%..PY yWoRm(`ALU_VNsආFYzO&[\x5 H%Jj- rf ȸ/UF sZӂҰOf@P`+U " ;p_sA1Pm2# &" `SXux*TU5bu&Dd3,U=N_+=%l/VjQ(S%SIyAnIrC%  ̀{=}'ݯFOp{W U9b>#>:e-MaE٩n;΋]Wt;>$l?N#=wŇDM3 x _%i88#}AErK$4orgkPXp }Yx>b.'E@p c0$9J-LWJ V!zxVF9C.cT#Յ(Ԓ6$YъYŔO2kPa؉ وeX|iDT=t#)U5 s<?b=ϨO`t+I’nC?,`Vp*^x*NAZƒ *0J:Ny0R0N$: #!?ΎBA6XƢxG`)w#3V|${Xp#tl@:GKAy:d Φ1{ yN_Gg.wn{c| d#"4ފ%bk|"EӰأ aכ821fSPk.3R^+ cIuٛ "(!/ŠVEPRo(dPh&s'[s+M[P9R)a<$GXe1|^; 06Uxbdp=ZXF<`j"e,iSAQX0e`1D/)F!HVfl"1QTrU; zQ(!MB@CedN-FӆDCYpO6B>%?\|cH\NM|0b5w̕.cTcayVL!Xq>Ս_Mq;cRk35X^&%x8a`o ;EĨx>h1f\c xP(g! A.c) @^ a5"ճ뼁'/h>KV7 AV(ˍ)xi$p'}*~%^PnV6v_:5.sUGcbl_q] dE^қ'aF泄K lx)``^=6\5Nx'ry$ӡ7:Ujj~2,D>nw;y;m-q-H-}-7=vqoÙ97Q\;t=P㦦9_3ijN!{V‘hl@`)JB}M,LbsLt} x=j(z[ RICBb&ddpm.E@NE:P4<J(KAEAnh \`/$]~ p0qn "h` B dQtfwZa|bơC *Q=>q:wJ1Yz!F EB%$arcs۹nI{kC"!ԃ1Q] k2|#nf| RԽq qӗϰmAU~c9򥻢s6g]LOZ,:W/,-WĴb@jaNU 'QRy x|0स U W-{˓RSQ!DrFD?G=rM[w7rނ~J"q7ٝ\5D?J3:Ŧsѕ1#)Cdx]i_j{}{Ϳk _ۆzyi޹;՛oxtk2StKþ]dMGLʻ:0#)]:׳!zq9(Ƣ')ASQr*:: BSMpymN%>0`LՁyXMMD.RCM (@ mKdl q@3`hm,Cq'q3GGgHA'`%$j::9\x@ 6$=RklL9jXoy:PSKDHꑜCS&]?Y%OvSϸ#Ϝ㒕^@K/[;6y Eh3.K4p3j 4mif)|~"   /]o>Asޯ}lϗO/l?_]~ᅰ)5([mOލ7^|{}}}Kz.n%m}g#ywut=w.+ѣ.M=o˛]og_?{>~vj7i?_u}6;bf \D) A(D`_#p4 "@$A(CEK!t'H(/{ |aaaqqqq r  $I$I$I$J(((,,(,, 0 0 0 4 4 0M4L0L4M0 4 0 0M4Ӎ48M8M8N4N848M4Ӎ8884Ӑ8@8<Ï<988Ӎ=@A??$C@?@A==@<<C;CӐACCT<AC=CC;AC@AC;@<AP@C@C?CA=AP?;<;C'5tsifʙyжjKsitJ#NkqBj5 %oDF{iG$WIԴ9{G2KHi7K՞&4e,N3HGP7$tГ%oo]D?jJdWϑ@&qZ uVZ\(B I'7jrz>'kj~ާΑQئ,@CcLd( ZAU/7@AȃqTJB'fЇAz4I X*dm(hJROQGҡF$lwo0lLcZIg^^hq_lDLlC5Œa- Ju/5j{ #rhV! (%=?#˽Öc8Ox7ͨ#F}M/@nB~W49TGu:"A.-HیctۻF)JG5S#2f.mK57U5oJ q(A$h1]FGk,;z`w?QWoT/N=JӼ]߸tgm<αZLI/NjӸOҴI51U2n.-7<]fHyV8dRxlBiQF5+NO9Ɇ !]ڹ6O$26 b v` y,@WʘbC巓EJ>)"vV2OlxϸV6Tnدo{>TP$x_]lwƖ(kld? O%of_բ];yuW[>fS])t3Ioz^{J6j, (&dPf 0Ze`P'nӷl*B% nM{IK?=ؠ; (*j4s"$ePUu!{m#;IRF[ѣ&ohfF:C6+^`7C{eޛx2zzB{C-sO_o_RҬ2>Uβjew{h:5~Av=^BICxpnuNӓ/B=溨VO.C_ڪϳw2Lr*W%k [ʘAtL>*ɇ7Ƌ `\,yS6,~\uzw]gg}qv4DF;hDSP改c5&*bԂxaR6_ҚNu?gf*+ Q9룅TIxh)T-5;ŕmbiIDm~1S!W?E.p[\x\`}7õ)I2K N%5B-ʨYe*ԙi$DE1+I]+PP%,X 9 hºEVn- EȎBMCnt( #. 6E}B( LEҏ35PVǵ%[_uN`}[7)܈yđhý ?ry(čwyr݂Uv~a^l xbJ|e)]8yiUL=G|0iQw M}-w2I.*))Wϯww E}IͷberX*zt.uWIquI>~^. ?jgS ix8lj^dP RyVz=$A]&>ζ-2䇺/ܰ+H=ȱW_ce 'ḙ)%C4sb!tqTRڇ3E_r@g쟴yYhMH[?On&=Pmj X2#CJVuiz<Ít#p15<$/s{Al ?9sNVph.rM耍p0H>j|t=ĄBS,gA+$rKizAaGІD=LۘTeG^TG,CUI +Tܥq't)dങ.e](=|V>^KBt'!`w`Ui#ͺ*O"Y &񐻂 p=-X{d3ovgP삥Q[Qs̡!((yw[lxpOQM;=,N^\):ENL?oMUfᴙ5I0^p§h'?*,^J;~#XZg"skJYb2ߛ<@$;阔ӗd{ae1U`sF"8YjPjPӗ#,WAh +CQHGX Kdr $9)@g LS=hSݍWMM7 \p٢=Ɏh&KNhv 4W.)wϚb{Ap`Y_M2dxH:ʎOKiB2G*]ep3+R !.ZֱޒX/;쇢7 fܿMs^"..*tEbv綕] sWb-ϗ-=`rd\?Wm!S[O4֧"Q!1R(yRl/UA.k;pGﲟWߪRzHI0S+߮5Tzg;'(¸N*W]] QDZ bh[|G=feJ} )r4څFxj G}" $2{_mJfG)KLx([j$u*<1 3ݞ1`?EA)m y $&_<^0K͢Q=}" Ӗ7OV! `ẃF3A轝uUI$N\Yu){XOz {Y(h[gA+OEQD~/s߯U 6}|S @9)#c`m޷㎌,tDdOSdVWE+c:Nja},Vk/!mw_q8Œ7Fk/Rz?M:W, O*q]3ByK .M2窥N7YY8Ι"Il4A CHR¹> Th0 q1dQiO"Lh\I 26-%VH',FX7BBȄH 8?bH=;nZfAd%A,0 pnFG bGS?oo&jZ:!'*\g+iDes=Cu/wy%$~+AWL$DEIφl |D+\̬QTe{{E)!G_VY-jY7K8n_nIf>&$&D ?BwɑZzN Yн iX|q̤ؽ@q@|迉v`2#="00(E b^t2K,c*>\&ҙp|N9 E@Kiu=E0ᚮxAzi jlY!41HU&GnjtPM)`>35Yt1xhbA,`'Q;`RQ0\bڕ7;\ᥧ%^H|׼" iR>ō2-Hcoެss-auB7E2,x̋vv8\ G=l吴.\tŢ::b5"d*6d?t+̰AVIzM˦5^/-,H /ojL߿yB02ҹSR3>{,ϣZ(<|2-=L2 cZq<(m7 r3Vh ^4*v E̐3)m ] `_?a?R&)%OW[6]p~b(%f6f>{Ȟ+ QrI%!Է+IWpa aN4tkVh}Ʈ^^Jr;>O\qqB^ aFQߌlGHE-tsq B9rcGƑK>w::[R=2Bp>guk:.6xvU$RXɜ2tД1wk@J;α^"k.GK{U=q-AqM:tp/.@|=;1 v3N4X^,Dq#ؑGk/WT8 bzVbqL#4-:ő}qDQZ$I_"Oި*Fy;ļT.*8"0*1W-u?G{ńnPRbؘ_(|;n0Xr(k׬F j.O&eؑܯd[lNv}EQw3~Q ;L9}so}ܷ6n=&H>L 6&˔[j1^;4baGK[1QW2HyAՁ!o^j9p$B[wl.ʚ:!.z|KLy]#?jC~jy"_&Iwx=4IKFNM+Pf[5uVo) zg2F5C$|ףl)Mvыuw#RnWeJJ&KIZf:h`Cى ?/J>XN(Y(g@!ld UaRD8/c=7YYDby'd9!:v9D,dv8ڽ)2EXp@<_nTlM3)*p#${YFb"D,wYc4SIaC8rSɔҘ{^+WNRUi2cb+TłSڮ2U JHVo)v.luQ mD`$uE?%^5-(b!ؗpq[H-"0!=MIyJl/;(AHwppx(ǃ̭ Mދi"%fCyq%]8I1u0xj4bK+JƼ$U29!2q.^Ǣ*ޡLޗ<sҖRa7Ui#isa0vuma#b'7[_XuDŚgrj\F2qm2ux^nF y̿Xrg68Z@tN0 ;>_w0QcXN%AT*A(a\I!jz%)1J׸0}`9}V9طӟ mqTI4'pXsէGώW2 ʶkZL$/a7ϸܻĦx0¥iqΟOL74]ڧ*/"6,913RˤV lFEfˢDT3 ؂b,8T>8Hki.0aXL7?-NS,D= L RMB ق>BOPV^/'lJE]$I"M9駇 ֒(\J_NI9йkQdL}ptw U{c2;Z{FQ G4IX^dpW,&r瘷ѾZH)qGTX\/&u81|T~WI$v:z/wY$b(L4mD.ag?4CΞ]q_]lSi"i?03vش># xu*U@0t`݄!E [F?dK11Ҷ3UmXn')62stMU([oUy-(Bv΃VjG|9wtbZ_:esE\l`-Dø9H/UVN4񎂩W I)J]NzZ<۳%뽩8vzNw{/W9 e!0jA >SZJ164U X`n & a <|P! ҡ2WA ?G^l*hM +\{W&A0;X)+G F * |-AbE.#501*x$Db02qCDG_mPt+!72PHSwSNg"Zg~ 9f&[K\u%l1W)7 %F?O{tw lz%ՙcl4~09ҧ**Y _&r?`><2v)f%JBQ:Bh5:22J!Y8lbبq?2* U( c}-uzf#BE"'{pC佪9ߪ=zʘhw{*P(Pǩ30~z F"Z8m^_~NZ1 `#`߇itxQ$+܎Q0Wg XYAF) PFE6$_9t dbOMetG,Fo+0 ~HCN0łp:b ,Lql)g;qLXf%!Z<~!a*'}7C8XF 0 r*d PQ8-xg61T$n_%I#PHQɲc̨ii?ns`]ϕɭL1NdY?"6"UM؇I󮗩Δ iQqxwUILZ^;pᙧgs~`e!rr4rʬ?mRNI: &1u mrm&<pIF(g}!7!0g#0^Tdh]̙:wxa0 0GEr drAIޗ&f*чaV_g%By%5ܕӢ_ L>CfgBB9jG9*ºQ$l W{ 0B( z*$Qz H  Ӱ\ȗ` EDD4U(&5`go mA D{"r9TGSX("k@ܐhvS6i^”(HS?YV6Z[>Ď=G,agT8V|(!~!Y,=̕"WUC=e&V54žO}#56D&oCcht&׸ {3j>!WG*|!ѲՒE F^91"FP- ThMR Ɩ(ز㒑0e3> 6=i IZ,4vʕd!1Lo_j֞4ꑟI-Cr qL p+rN@'_f>mu|0[Z!.Al b^ ,dki^ 2\ LPcrqN榅RNlL=tI„"a"'̡kنaA Y۶35&2u;0AH蒬z1Hdh&AsaPYPK g%%xD69v`1AZ}NL+=/3OLƇ^>({ s;)t}&,5ю]* +A%a=5ő#^n…HSřE6Pl2| AsQ;)ԉ@@~4h  lav4ABO~2lOڸXf y PWCr&zL A [!: \B4G#tQ ׁ@p\!>xIDsXhº#(z ʐT" mP@Ac%*Tt۹VAzJ35f%ԙ&mZ#ѭf+=]L1vS)s|H,gCȇrܥAQAkHXOy>t2>]iVGq0̼D=bUQ"5iʝ>za z=n91 'DqD&BaF7 ~Ѱ`^= 'xc7H>>ttDI ~K(B> q:ٚq?09&w(hh5ωP09+TC+&O[7ώ K1T-<oeE^Čw$% >V4ƕPDԵEŁF(:jE cz[@3Zdq IK MԆ.2`M} lM@<0sݢrZ;@(ӒA_ )jvLv`  %1 0`>JEЪ:# !$@8MERP]{X騆W}Q-s_5D0p@մ\uU dHd$H5 *Ml&M_ǟGunvg<֝&/=`ZFި)3CrlA ( `HFi:_jc1݆;:HK*y34,@`P0B I7@VRdW~H3~桒t3cN!ukn'j@M%qȥ!4 (LW" h"<]f`m7NPEЌ߄q FVig0B#@2L۰EO|:L,Q q|*/IxAJebB) ИD:ch)3If;M=xH`;?n } $d#J{)BS*gaF: AT2|a7OG߆bo Z~7uJasK朩K埧l"T%ޅ{ R&90\X $iv0H /Y_%trLTRNzcq7;#V"&2s9wFG+2-{$y$WD >E1/eg6 +TuUkmH2lhǧdpr-y6ѦK>Iq%)8~E䡑n6C+`AK+M оuh{<1n?9tƅd 4=0LIH Kѥ<+/duwsԟJ6l"'Gz si}]0*/x['ª {G/3U ߪy䕝n^lh"'$z~p&j&i*z0ܝ^ LNE29տ5q/+ݣxY*9.6`P JJ *kX4 )LZa2GR0&3L rgփQ2"tuddMi&)!4&r`.M{UtPi[,U-˛0k$`:_9!J)Uy@zt :hp1sQ-7εWfJ:#ytfP0BbO/ !>À, aV hTA` q1Qò8'&Xb $C0$)3=NACSChz2{:tXG??mE0> Q{s ^+J]C/Z (&)ٺɤTY+zSfdd^ڰHYٙ,ΧpJʚ1U Vsvf;OBiWkq&o1<=>m}#)X?Zz0 Gsx1 E$!-D`DJX wAzF "}3@Ĩ NdlB,mj!;qbz>@K r`I")p58GuXH>R1=>|)ĆÃ9`h\Dep|b) /@Ȝ._D @{pL."% o`3p [wԺ=##3(/,쨞aرGnx1xanLYDtJD`xI$cXoaP>yH( P ~8zhIr MKg*=GХM_x)0%м(2vsDƱaqIǨ<}]!DA}2+S10ABb!r~ޔFy6c"* sf/A7RA (v%@*SUrɐU* %&9tR*\8k"{֔ҏsۆajS͡#GG()xiTOn1D+2{&7i#ʡ?g^?2G·>TFb1/!|(sIe߶6I*BMjCަa"b^d[vK AӦ!eBp!w !ĐLeL|m΁%0& iB#D 19B ŅIY#E@~VcM@uq"CaJ!}Vٸ<@9_RNQٰU ޾0 \T!%%CXj FT"ctB!^ZLM/ѧGa~p@DdMQ3[TB>;"3l.37Ac2";T[ӕ#fu{+#S΢nET(Uձq"eKDǯBvM0% zvj4+j VY$5Db, ³P,fUkC Lj}~Y@~%L"eV~9l0'fHT5Eī&A{ԏ$C-''ZAYcM8J݊).̈7 C~BՃUb<(ͬѓVa# &z6y7;ɭ'GN-i )_4{rb+L-5w`lLH_{fH؉/[W@Rafx0*:+%Z1QX̤^~bG0ebRf(,5Ռ50lUbb[w}& $EnWdhЂ- %^5ZAUT*Ԭ`!cCaf18flL1hIQUx+%/Qؠbx1vJK02Tk%"n 4`[35 B`G@S""d PD@&0X{:Z}%'@PgW%p(Cz YA`dP?6CSp!@ d's^Ѕ jJ RaTs 8C$tX-,lS.Zs +<`VxKAJ HRQ}T `+Z%СVri#@)T6 3AIKozj#dbDtbl+sfrȹqm1R3v=G~˒G9`ǸXNVk 3qP=WW(<:Ua%s~;n!:6;nv2.1^'ԟ?qahs +DM7*/5}LB"Qv_A?t?^봞"O%K^"00Xn&ߦg!)3D (yd4iDN⋵H:D*@\#KSØA9| TchzHGD?~3*H}>ؽFb)9]>)`^ nJ~8&Ӭz=y̱wGܥxy..0 퇟[㩏&kxeR(M~$/P$q+8}<);I0Z̓T~I_W?tJsȈ'Uu{:O=LEtaݺݗtgl3Ar򟌡##GW=q7xOoP1z5>ItW37m~U~ta<8hVX[آYOKUR􌟆`#ԍ6Jl"w_WQUF,$o9է}7ӈS"*mw٫:m\vR=UKݩQ%cʧX^-!N::ʖp>Fd= ,aSG$|xM&&+ѓ`mZ QiF˦#OJŮ96Pl=!t$a_ XSvAuL,(3YFCNN t#zRqT92Wؤj$bbӭoÒLkUmO>Mn]^Y לּ*߮N”za_U:Dn"D}i_ߚw"?i~hY c$EFAOn߬cqh_E]NAo nSMPTZMoo:BKۯ~X<垼{̾tkS6IdvgI/E@L|cq]^mDe?I쩤kY`w駒N~SyDn}Tx{e.G_Y3ʧTs$yH*Nmӽ:sʞ^ױĉ8>MǍ M kn,/,9׻xk49?Xf*]+ÎJgMVo%vR+JGFi+{Vu)4U6sQb+v0EW͂נ=}eHX?dr+\qR[ SC" BC .Mkd"DⰍǴ94ЎDZSPho\[+Ǫ'I_ ¦՚#gMڬ:g9 )P^?pWspf .zCVuDU_?[^~q%jn:B3;!~ߟěQL-ϴ-_iUm' Uͻ6?C 8V}H%LVGo.0Ü44]0x1rY_Ϭ:d\)MsQVRGkx%HTb!}cSZzue,%K SǏXnx9s$yŠqM dNRA9EqT`~wYVOvnGfC|i])dr=F2r\~XqTddA븴 K/G,֌-nY3\ 쒬9DpmOKC.0F)LV&}خ$t#(XOԱ8w4(h]>%:вԶjULtܪ'hm'ӭT*"'" T]Ga4VT}DlZU=}/oW)!xS9[SԳ=2sZAɤ/KqI{ڈ ⯖aۤȝ~Ky~5_w.ORI|F;@ҩOpW8^VKOV/*i9󤅴g7H^OK-*HIK^mr•vK'|ؚ]Ie/!]rkz;L pO95ttiֻCL~dpD_ f^/Q<%T-16o3 Q jqMNl:'q Ѩ?TwR[%<ĤWw__S<%]+yDi5H0ŴP9*έ(Kl1?Za^$l}M W :I!i$]*|Q8"V͑Y&5mj:~=:*}9#J}[av.V PQt߯@.9Iy|@gUs(. {D-4JgONfԔB߿nsD MooM3 yJkXX6r D&[dό%ol8NhY3a8oӫGE%蜜"Tc=fZ`ZDdBC>2頤ePoNz*fN6Rm] &}Ѵr~dw!Q&?^-e-oq;TS'0w٤??eb; +ߥ5=~aIqAL O*fP2[VE;ڇNtYZs`g]Ƨ,عM[+IzDީ |sFI&Qq4{sG~ges6ÅD72Syny~sT,8ZoűsX닮^_V,a.Tmky7D *ۚu̻c7e ٓ'tS b?6ί'paRDz0X4)Vj ^GҝL)(fK_ML_.2v~@B-DzB&+,%u:^l1[|9*&scEHt//Zk٫B.|HiV)2 m!O nt9.#Tx"ϴ.%."0頟tbR4la#Q~mI4j՜Ew)f&3bD!MEP,ZDƻLg0Զ )?y\$|Qϻ8}U8HZ/ Ⱥ 4~бۼ ^JtSeIyLej[VOl SX?z*Nc~Fv6yJIMs8m,yhW4wR )s鋙lS)+~رxw:Dq5+N6GMo3HܩYgdVłsM5f{+G+p= ?`*,A\As rM@<4|Sd\Mg}G]1R3!4?aOn]8cdX(}n u"li=8l'ȑ xj&!J[\LisH[8 Gk5)Sʝ=8YWat(QW>G[ϥ㳔wrHo~C]-|q[u^O&=s-jg=Afg-"<pN*Ͻvoͮ79uw 72t:FO,Q*L_]^1"$[ 8QVgm6m*XJ;ݩYB "UI:Yhrb|qBE )ͫGeJKNݓωs O]rYփ Ljs D f~v+(/KB[}Kw 'اfJin ˜^GH<o0&ԡQ=siwq+ dzꦉ֝mVg"¸2vk9ϲM њw'rӌ}qE:˚˶YͫCxn4|P/5ꅴnϘH\f{J۞CFM=ÇUxgNO<] oIs͞Z?0pL>HMCcGa1IƗC/D7Ml鼝RCF*2|m?KvX59[ Xiܯ&r+aʤmvǖ1]W׼P]N0͠8h%"fK&lZizmbpY:ݞ;Zgj} . \(w~#>!yK&:CLdu&b[GyjmPl ,(ppǚi}aݗK&q ?!_."x>d/r}~R~XF~瘞ǫqO_NW=4~N&~zdrg평W;Wb׉`,G:ֵ} 4%.#pXB$zNi06%̋Ew!G"(Лg!vZro1쪬n}aDSɔ,\xargѝt'LF Wq~p/M0b0@95 ]sXAmY;y|qD&9c,9u[ 2G]^cJ~y#fP;nzW`u}S2VG O,AjDDyJohE5*{{?UFc8#AZU T bC8iV5a6w8Jr+Yr*p^ , %|Q-̸xErTX7\$@`GEOvԱ67l7IՏuÝJ0*>[s.ëMRM9i-},'_P5OyȩSZ"%5sd-KejgDޥ4? 9o]{?עaSZPs4|W-SޫOe2#M Cyg樬3%?|d~a'6/ce1yg5Q&,{^ybkyZO($=HQ$)aIdkIJl*čOnr(L߂6 H,{Gjd5ib$@:%ޜ!>.\D x=låj?SK1Z1s|X}R7X+5LXO\c:z!EEHC7!Bk`Yi`eجK Ur469&/zKQ5F7x?pn`+N$9s'qk=?_2KOٜ((._͘mr!T5R[3c\(wRwO]MJ^;c3=CO+,qS4 |qicPL̻tR0?k| 9}O#״&uoVGhBq*?l›GAy-ÎEH;"ޢU&iS{zz%K6uga^OȨZhY5E:^KдY?1{ʎ,?W4S)7ױKEh)Dx̛%_(i}o W3|=KK-V«>iJʵ_yğ~s3>I5ZV0R,x!G BRFf6lbSz! $eA/u,TϺuS,\L]Ze?/=8 E-0!mcޣv:w3jsrYXBbZ"(&h; ^Ag]eBe}WΞ}*οXګ!Y2-7s϶DXv>5{1rc]=GlKukU^'=8Xi:E87zm>krD˩'&jH/u⡋jTC TDiRI鷷U(R*sa285|ĸiks(4x5#"᧛XIHGsؿUɖ=_0K-L*R6ܦA$DD5a{c kDg!96]}~{?+ W\94"gb׾WTl+#Oa)f\ xB8]}U?ȁĔJC"{6+* iY!" AiQ/wA3j˿r3\t)u (j@|w@(೯P̈́\i6K^/5O485P7Hy3qQ%KZ3-lU-rC/cT#43g]a䭦4PvF2/BdNO2I'zV}}e_Ed)e5 Ğ}99;C/6:xMhN_IItEt;`eW!*gt}PwH{5׵L?MW #CFe͒zVdizC#yHR'娴p;&~cMRe"7:TJڕI&ӵjBŒDMZ7X胄|~by".0= 5dP>a ,AW\+JD3q 6ʔ_w)?W\ |a5_XR\@f2$7,1! ˟m` Ͼ8Ucx܆o`D;gCN+ Э98_1yN,n8y[xr:7k3}N<4BfZ bhK/HNq .r@9:YhBl&T!`eO!L.,8 I~d%3h@Gё0n` M(f4#h7T2/` chyJb(/L@4 Q耪#TcMv =ku6G/lBØŲ}|M9ZY^6/RaZJ焝'PXdyPvk. ћ>sC[.0e rCWzRM'(I(s^{WSe&n ԙ/HM<,GyW{U(?7:@t8PK]ؙPHjaJN8};}᎜~!˥[/mc4#)9Vq/Kc  !Q09o3|! b a"9 -nO>1;i((;uf`(h+(!һE(mTTW ?wA^:;pd2>'*if9nD `T)qKՆ6c 0?2Q@%~ 06CR(&S!xY(2`^7#HG$f ~XZ Gl G!QLf %<_leUXDMcdQqر;x;)U']-:~|;gcvGw0a,lr Ul{'-YMXWᑄ{M?E-]<6eYgsiԪ %"!y1hi\Bi8!|@\=J`@n{i.?q%!Guzw 8^w-bfI(w,X$ _j67s}Y !5دocEUG-pBB*р$"0doș&N:!MKMbbEfK9@Ў`ơ"l!P@# <_bdy ,@#C5h;p~L@ 8#MLx ~6:66NxdPTMyѸnD0JCHHCH@Q@ƀ8*=H  bI"B@ @ ;Bi; 2oBBU6GQ(d"W|+BlUTTI?I$n7sh&4"KO<% BI?lb|(m3% L c^ 4a$vqG$OS6o3'cAsMd)A(@8B ' XG"Zb C` -y`oP.) MKٌZ_l!nK94~Eŵ Sy8ݾ_=ZB9޹;%~i)B>q f}riM`R˴r3W) )9U/񍻐6vާNEl\O ? :Tl1O[ѹk=عZśa˷#\% ѝ9/k vg+kcD܀+DضSlUd"cSR.w'>A8-/<C.]7[' -$ARѕXl OUǛ3m&Z 61Pn3ER1v= GE@(~Y Z ])#^At4@  l(H18~pX7>TpQC>!$ 6: =io 6b (0BA_)Ѽ 葆l L{H=(? D`X2&' o j&(C6 B@a$(h@GNCHw:EQp /T(ˁlD To( 4 NHJa\v9FyG2O#)yxۤcɄ[1Mn9i6?( -5H!LAth?V+5f4%k] Eyс OLEnȮQ7_q4R}oǃ2jc2"ng4(JĒkW^[ya*`[9wǤxlܕLgȂ`(b `eVx]|W%? d ֮!:&Lg\D'N2c7#m oorD4~LKE*+SaW x.} o+MWZ m 1b#|lI½0}`' h}U)&)J:|ZJ`ܔsdt!{ɺX%:,Zr)n~:\ 1hnF1lI1bj_G 0JCZ+Lb|y!e &KceRc[51 y/ ZY !fVK-Xh=I/DIU$ ,ag ]t4zL2Rc#zuaІx6Sǀ* 6"d* w- `*oؖ))uK9G3"Āx!۴R"4_ZvgAsHW yu>2ۚ~##w3oT$@mh)NJ fw- ̾%s".9e$3Hf84:܊x cy}?mHzL9|IH dr!T,M@ f%!+^M%n}c ae`u $~B`q=lzVʀs9>049ZCw9 DEZߒݤ6u׷Uhv\P41 6B c;R8"7lɭ$W#K09usom`Ǫr9X|vN6>1Fđt_6xqYzveR)EnϘ!6e1e=$vi p$ `tU?:P\P[B #f *a\@d&!<<| F ]R@ô;C0O5 <} ]ja! &~7V]!ȵE?BYI B03q8(^dNn)fS.M&>`g[1oRYڑs*៦G4l"/&>7lSqJC a2OCIpB3 x\y#Z2 8b'D f/<FC(Bld&6L}kw(cI$= l s ߋvN)$8QH>`"|&܎IA#We9"qT(>I@&@7^XGZ ,2#d1PTV<3Clc{ ZTOWߦ$gI {7Y\c5y9ZuLʊӦXVXͱ '6DU&*TNGA ,kd"󢫴6P{j\~1w[3Qz&"c |h02kB^L»vɠ/|]g/I©iMWPUJ+L~&4Nkq\F c_) 0JPQ H?9^#D&f1V[2*1k5cbULL0erXl$#vZB"bgI^ C/Q7,RZe^6d`9[嚩UQЀӥܱTIkb@K>PN5}h%2Зۧ9k-p#%I`"=[Ssl:w|Ҵ">8wȨ#n9;㟞w²ȗ?.c/D5vC9%jH!A}4G"|63˧|e#;?-[`[*b,&l'h3MD3@w&)(B)hDl2P  80f6@F(&x]cp[#`WaV5 <)1'}}$,YM_  )@[*€YcZ0~b蠐"eTг Yp:R #~cr))$Ԑ#NOIq4R_6̣R$1u*k( lG2},D_ uNd'KZ?wi|( NLUtx [uܗ-Ǜjzu_"Vy M0W#^ ;^h&YjbCJIp)c@Tm.W[9 d,H$H\ Jx!aT I>30:$>ɔ#s5Ua Aٲ?ay_J/сt9y+/3x/ABE惺-6~@cL?ٱrOop1@Orڹ.@a brҁ8̘D!s/qt_ ʐëɶ&}j*F8e@555W[X=L0O: ( PO 3 bL9TbqC"w# `s7JIOûרm bqD'EFI­UȈ{e̵bhZZCZfnE7i% p; >C6G~O"JcE=R_촠t/1u'A+`]ž)HQqHfW%s0SC?f \r BIèj b@,)S^w # `P^9@"*nL@}̀&M6w";`4Q#AA\"A` 1@amo@Yf 'L&&f3pQ(`j PAGD(82dPT`Q˜0tp\>}B}ߝ;0t>ӎqH5D2 xP?)A@<ҼGAY&n ޻Jh7# w?52xj{Lg>s(ȗ'Z{IETtG(E(+,".{GsoPv[r- VLOgy7.Va<*[GReÒYrf٪ڭYoσSC4j1̐* Gd=JFS@LCe xA@B*goUؙmhoC6hZ0!|;Lbgȑp#!790]͚!PVP#ݺ]۸[n,C|B-X%y^ fq -n\\D8{$A؝K̫Όnqץ/J{.gCVF#veh`*9c'Ǚ&Tut]2%O4Q6oTRzw5/SE*BS4r|߽]I>VߪNj\B0Hj)R_N>}{"}X~?ҍHh( V9ɐXBZU&vܿOE=ayaV֐G-1\ё}-Df$Ѥg[ ߶1n^$tOS-aKUWw2ky* 3KF Hc\ jH&q2@j!ر #$3@=ySWvS! bs""zued/C D<۵Y&Vљ[2UZI>?KˋM׊lkR㩻{f.Z]EwDkK03hj\;3qXl -b%3~4PmEk-s&=Qܴ3Еm)dٶQ()[ɺKxx'6 iU%E*3W7G=V#X]hmwZ6-T%:vm6:yե׌Oԣ$|yPԤ M&'2H«l`TAn{%jR$=?|o !3s3EןYdb NOYG#&ī8eo8h^W71/i% ;JDڠQ>voAxfZ##X?ܾ%MJ -M~Ø=A2DG<֜! P"!jA]}V#TUyA-U?Ɣh"%r,aU+j1e JTQ7u1t]~; =FkOr6]$dB '_DdP;GCUR&-Z3=s'j$9xM:]@N&HBsg?\#/:K$;mi]X޷w>.il!ҧO\Sl حL6nY] 貪ĿBʆw108",44{W+.u3o(tGTjݫ֎bTۥ)9 O} ۔Kz%(>M O iKa.Fo$6)[޹efDA'#x^ΐqDJ燺#%PFJ{Iٴ7.tI\t3.E{O #u*7^ɆH_#:˸6>[eKgܞ4j9zu 4%#L8,胚b#{zu q4~VA"T6CdMDp3 4VL|Z$BK 0:}{l;[^_Ȉn 2D<\Qƨ>;Rr@J7ܔBC&{rA i&:oCߪV/JńN' 3kHL9\hq*+0̘”"1( Y_A^]xo2Ձ@ٕ1wb8kxfͦY@ fLqr,uv闏=lV -\!$z@*+rqazLQ`F?Ķ]gL8H ZG:_?ʊ!0hVKsI,7^xIӍ3FlQy]PaX-j'{ߪ4TG?G%OY L-H0Q;;['K>ewYZ] &Pp&~f5fN30ׅ5ȄdD"ZA<\jlDZ崊FDL [TC[sb1`Yn_UxCJtv}Q$|1o&3j} rǀö4Pشy}0FݥHW0y 5(MG 2= +SQO›NfNPHWRapr/; -BG,vy#?fOI}NcU2JJJz"Q.e$m_V\K$)RZcV5i 6\Hد ob$S .V,Wmqʱ1q- K6%'Z|_NŌΓRJ!DE R!T|W⟽9tU~gV~8Rɪ`coT4@b@*̓~/eC>$ kҷ;ۆUQA}ў.Gq A"|;$Ĉo%O diCMǢ(myl{i$o%vqĘ8Ws}($ ߪUA1\ʢ-yEWa\ei˄d1T+]Ņ-D>B-(Q}vyj7Nʑ_!UInl >(OZb?HxTbI `c 由+(!_(Fë?h%3kYQMqb#c]:rtD Lc x_8 *ɒ|~'HJrgpa+BNA%B.ڠ/7W)KYXYrIwR}򥪑?s7l4kel~7_u)]쩎!VuPS9Mn(8yV_)n[Kީ 2 e<\ݜ;UR}ݶ9BjVaǼa7c NOZKɫWs$ [:e -aSLK Nq"rE_^Jbv,Z? TRC"J`/54#4KR5rXG0266&}שpN=3_aьY՞Ճlkworh!6zwٖj@˞:ݤN0HI/]qX1>k[Kw24DM07I.7/ Qۺѝ"8c!1/^P7{r0dĩZfっMH%F'5/t|\j H̔caO91sGp]Ov;L4=#%Y:ْ!2^ }MiY:g#\Z̽S*KZ…**7#YGYZ_^oDO2vHMw5ڪ8=8L؂\i_S-otϣd[㭻9˴z'B$U\LD~ACR71(%"܍ʗ߇S'rݙ?]R$$h{d&QbAd 萣kTgfσ`h"4G `5ig,Y3: tNTENƲ_w䵽+|E\5r; 47>y%Px"tV,Ul~D4߹xʯ*#B•ptR'0,Kҋ>^7HZߚ=N10v?,#kjWA4-&ݍwwugڄxa:IiQ-WJ+jYW$K2@sXSwM_iy߱U6\}"f󡖈\`AF36򔵭%^i1aPV¥)w'٢ҴU'*"e{ޜD:)y:aoZ4@%遅T? k+|% jstFOq]YqŰum;$ ;+\PxA(GbJGqImx"b&#cO]<;@ۣJmQv3HL{4_vu_o%בdJi8#rPFx^73]Z7F6oKxw ŮS#N3&\ׅ:&̝废&B&֮XwIO7fa &][^Y%gIPO+5J~U [oڣy9`!ݯpsqzG\Hnsi'%26ҳyg!<物ei}Nz y9ĆLBAXRHs5Hɼ1zPfs gN?6)+"]e$^5M"9LL~5>sH:dNHOR~a ͧ0ҒX;g~ _ncq%("X^_/A.tWh}>\Ł dBĤM6G}]EU|]|6Y$_3|lmf gb4'9[ 18mٰ;oto),K ej/pG-:@x3Wu5m\/w^qc^\Iת^etoS#ؠeCIu)fwm)6sɔS;F,7՚+K89^a|9'AoY;Bj`M8~:]I 2w&]e@f\nM4]%V>NoKArC1RiOЃYxG)kܿn/?VqJ u8-m:|@@A/Vm)b2•[pcch)P>4XI,kXHZ`#k&O$E:5˟Ew\+&K2y7m,gn$|&>ad8Ie8ƽS (q^v7a?{&~-8)T=9y}ҶXﲼ ^AxKuҋ"ߦGn3IP ޑS.p6T1[u$_67NƴUa,d!WzC'xL B? L!$#Rѵ ^ 3rv](!|0 Jh0Qo9DUIfh`aױ=I#\X5AjQT>DS.a{Xyr K᪝໑jb ;G9pV+azahC<^V0dKWq۫V $R\K,h;>T&#Jnl?fcX[7jfl} eѼC Bc%ĎUqNײ)"H~|)@QKSu s0<ņIFT/=ܭ+<Ϗ,!O*,ƦmM9#x't >(yeR*@x? M@p&v0J|P(@M +ZDi gD@,BA y Mm ^L!y@C#IF"r "A K&\t*Va\*,NY=1C_r'J9_H\jj &oߪqtߪ*s”.MiU5Yޱ|u=&9?J_GQI>SU|\|䒝έJl1z68/+(Hz0$]Efט: /.1JWCs֤Fmyo+rw`A}uį8-OweߨY*vݒt\&c CzD)^m+}M4D#𾂣x3{3 9y: !}T`5Zj[,x<% MlP}ЪꟐ<>) jϛ} oW "^h qj^aUYz1d|!p@7KhXq#|>.~A%ih? 7bp!t5kIAh0@iOA38(ā0  !8Ԑ lm8 @:Ə`2ch " H @3x8X'=L0&S)2u= Q-"UBGk!€; nA3VCVy x1捪r #HΧ.ˈKUnLR^|TR+[YrQ].CֹLV[TR㙬D jfBPxv.vfXc51lw̐;>3) rC"PQN=V:BlHBbJӤtӚrCNgye (2̶4'za%g$+4H;>Eֺ4=yZ^Kђ\AvZKi$v(j/a eKE\$4Em˴< [}Ӫ|RmGO3uˢ Aؿ';aH-n'*˾"Ⱦ HPTgU п Lw >zG#X^\lqmz#8WU7B?Ї:G-w|`(9D8w'Tgے_$6g7pDxv=x_Y"%FyUڒ&a1?\eɑ鄎v6"lLu"HyBqїA@PpZ04cAD$;7Ax$IEeC@s2/ Y3@2b#@M- v->bH d,}%΋'h0-)`[LV@ (Uv54%ف+lPq\ke[栏l]@K+?QQ/FPB'"k0#0N!$IMp#fAduIǰcnw\m}oEsEȭ&v8P[3B-Ĭ/ ?es-ʼ$(b\zA=D|JP.bGġDT3R?.(FQB0292̺Bbeia1L=<:*Y q5t^8f_UER/O]ܦqzvPIx(W@#Х5VG,Fn->"Zg>Е #\訔E qk+top;v׼ZѢ)%ikw_01DƑD?bwmߐ5PS=]Z6"q#ԧpj~l Ȓd>oIrP~1Y"/Ԃ\T^\*^-»@/g("CE̘%lr71j!}9E,1裌b/ fQ *kǐ&9:>50D WM~λG&["Hߤ_ˆ$AQXf!A H1@(b&]C, ,=? /V_&{L,Ś21-np% ey:BMPBW^ҵO /{O M"[KiYZݽ17;:EM>dN7q?w?:!yEK\=)yr<Pmze٭mH0F4 A (M)P EWSt/;J%OdP`)]QKLQ)xKWw^Dձ|aK hz^+21f'rPy 5"@ 7Pfz%_I.ŁLQӁd< 0,%$dD}?yJB܂h4 V%L SU OytUp`,6T LƢPڀO\Nhb(ocmN+HlǣeLRȊBĖI*!PH0p7])#=6nzKmЏȝYk:^T5c{yyXagv?}Q+x@8j,Ӊ.7mMܐCHlAN0GAc|'dUKBT Vw.r:"Tu7'q~V@kpRc& 3 1p,燡70܃BqF(- K@`዁!0%=CG`oH%N-yKӕ=OPayS8۰0&xC.!Fn26RCoV9DOW]p'!;"WU![bwCGI.oݭbR2޿_.uRhb-qjZNVh[{0[a J÷u#f(<9] LsKX05b)EV!Rt'H"f0g )@$Q.(%?J)'F;Ai0i|0k{NJ oa 0707PÎW\XAXor4%pajC}^Aܼ$Px-R,06.%5dpjI!.&"?K Z.YΌ Ȯ.Ab]pȰ>3Ś噟mYQ{'Y5IܨWn _4)PuR 'L=?mLf?딝gu@F7q1<4E7޾{q5{fR-ʼn dا"؋AV&c1`U(U&0R ߢ`4Kx9&K'A+,0ExM`a5TjiNf(Imܷ9Ÿ U*I?~^>xL ڊ5Ԋ +"LM$@j_HC1]­f4ZDEAjia 8{^<>i7u+e0L^B,ZLճRnĘY8L4#E1G$S{Hї$!Q5XUl.}ۖz77  ߉\sJ*7C򺙤Jorʀ^2:ھy YBiޫ/)c~i蒍aUA^SP?f֎fPs9=gbtx,rL" APDs[%H jC<"j7ZAG]Sdft~cc>]ա );sy?䆡Llxdy}ͯ0Qpq3?2x[L|P̙-  }!KJQ{reB~͡cwCxnZ՝8zA[\/ؓbj:;$ER_B$FD45Vw7r78 ~%`~ ˵Q鉒̧U\ML5X:Q26ьV*y&7{0/k ej+Q_WL\<9 >skln`F\Ĝ/"D@ C8\=Cx h_ 9a1'p 9OۂKN([3H@- "; /)^5n,'BHvȳ(ꔵhhݞO Dqj$DΑ/utTt- :E*P )I-`Pzqs:R~^鍠@T(=`Xق6+b V~+,%as - ʽY5hW5%afS6[8 nqUi9?s z'z=wG29wݏU;U 6~RM,)NDN^{\?g,v1SEmu^GO]2oZXz @3ZZ Zgp SC/Ëf~lz"ߌ cX ʊ!@/\Wg"dec)F6gR8VWܣ\Qt֙ v7QLI̸do&{wq) OKb6F(ku͇4a,`Z2np$ DI!$7~Rd;32Ǥ+. v r` xv h S4j Q3.t& 'R'&!f8t PIh ` !58 R*'!1 Rm49C?Jj}a 9S(-!}Cxd ڠj AG"@cÐ0xTL@0.`1 `XW <`Va4$O!%"5!SQ$R&S\'a=\@[dBv}qd3R:b*ψ8?B' Y7w;nT8.;8pZr^,Qi|ML:JS*_6m cPֶ07k Ez$yH%JγC0/(Vz f8} dJyAm:+M\q='>C>mAb/hR·Qd~Q~լs ~`%Fjl152A $QM(wSFY@@ s $eebsF@*Uex(-ݠ@7 'Xߞ~"gS^̞N<:K}ےk߽{wo|O_:/1uʛq4K8qby8u{eH/*~T"`iQ"cNO^G1}^o{]Tovn֟m2߾L~} z_۪[߆竧̓{~;{ݿOfn!Tzc%ikZe)(HeT}m0kO( 0!RFSՈC bL|x|-EWYDi8#F` ͼBܜ=~XJ=M^UĈ{~^ydECﺊn{Va-r.-\%O =aۯ[ݹjfݮݷf|guuc޹r?umoy|1MU~%i5~q_tGhuǷ&瞞gOX/EݿpRYVXQZo}roXPߤ>?R@[k~~f{H~ww;-zs7Eyܯ80b.3͖S^`,pΥBT-VR|k}oŜ+D H @ r٩aqqqqq    $$I$I$I$I$I$J$(((((((((,,,,,0,, ,00 00 0 00 00 0 , ,L0 0 0 ,0L0 0 4 0L4 0 0 0 0L0L0 0Ì0 0 0L4M4L0P0 4 4 4 44 4N4ӎ4N4M4M0M4M0 4L8M?A@@=PA C@CP@?C?C?AP>CPCAC  PC;C=@;C=A ?= P?#CTCC<@?Cd?C=C?=?$@??>CCC@@??;A)?=C4?C?A>@CAC>CC>CCC>C>@@?C$C?AP  CCC?C<@CT;AC? @?CT=C;C=C?C?CC=C?C?CD?AOPPC>C$NC?C4?@??C$;@CTCAC@A;?@A<CA@A8<;A??;@@C;A<=<?@@@@@A@AP==8=@@;C@<dyvM囑XApw)dpHR497ژWMp {xڳ|<˰ ^=n3L4|8S8%$t&D5\k<:~@UƚjBEe^63n0TɅmǭ?SѕTw9{%{bBZi6g}82<"&h%8(!U^0;h!+4Y&.K ]L3Rr|upce&!yiCY=+dMgzwVOT7O_;2~ƾ՚bĤ*iwdF<]3)3n=:*+<$qC< XKơ 1hc]BRgT~HWkZ Xaen1BAZ.p+= 8 9H.5hOTj!Tˍ `)M!sؘN0.$ɱ )^ ^a* 8]lԤ@Ū,6I`""W ZdhrRO~^Gwj]Z7Ԏ??VI&cw/Kj2R߳ CJcoJcޝn{;;vDuM닇q^ȣI~wT'i' ڙ1m.n*D]1͏.\JL;lB5f#ْtz?DBwE7muRdiɂ <,5Z"38Qn}6d]hå(*9+rX:J2po3; f# p^1/F຤\YHe$F8eWB;nX9]zpV5>ixHE7fO1gqh]{|/ ¡>A_Iʪ݄y"9'Ti9=jYA' %c6LH*S@݃o>+ȀV҇uD[;h.ÎƱܵ2ꏉ!> UW)8W5d!ZJUyL#I]'?.:md'OpКO@/[m75aV+[5{ U%oiu!&#'3,2s_̦v+T|*3YV*fCN,&itY/YlZQ>`6yrwkOdz9B/O=7$<ԛ~ +P.(uGnƆI`"Pha|ę/dFKFsǦ+"h =/bE^\`L@0+U k L~}`>4U@0`l -lAbZ+*AU "DMQZl0c)d}']GH\ eN W `W@,A_aC5 #Y5ASI/G4r6R%&j㎳ o`ՃզO7ËQe۳>R̔KRdY'{sDDgw =5@x̽E]ێvWdߜvD>5:[?ɳPjhl{z۱02&P@>r^Α+K$ldUܹk(!ú ,פK\ɐ7+Z4-'l7'knQEUqw>vtvg'NE%\Ss4S^,Y)]W4_L~Q^8n& wK/}:Ye>A >ifRl$Vn'wXT& ީ-/a:@KP)$8Q4}39`}% %̃o ᆢ;4âXQxPWQLrD;oGم6]vũ칊{] 9vCt5iըN˴V;Q +i78O0￞ QӋl2Š,̀'}uUceqD q"G ϶=Z*{q~xv. J-ś 3tzrcQ-n?sQݻʒwI;s8yKM {9cst$@/ y5g8F^mC&x2^vȦtZ9<$kcw^xe9+samRls[ELc8>"ƒ /+'#'\!̤/XL=Ÿ&^9'(`X=#RSHg :$ RHE#䝠ҳ瀚r~ȵb P`Aq v$4Ujf %6  =ThH *cz51@c"' 3402A2zn5GԨ]xI: Y^w^}7( ZkA?`zKHmmT6VYUĴo^o0ӣ `JÊDb7k24!4! M䣍qbt[)n9L"&$Oaf l_'"*eA>g4r\%gT4%mI\,uɇ5.3T!߻(EƦ]aAr&9i$l}L:sd<3GX;KR/h0pFvDW8#>LKy 򊰊 l ]*pZBgB#1071PC֔r'O' gLW#/ӂj&--i'Ks FPދoB{ ^zrd 09!+uVKqDzs(U8%w&Fgux$՟m.љSM9V脊FlN_)y,[o__nIoIxab0~|l." n͘TX`/bamvU\VHȶ{,!zaa"QFI^RU]KqM\?6dr5{ ah.L&;c^\2K-1)tx,X9:m{_4F Wzgc#O%tmJ %/RNGA|˲kXH|.I!^(<0 SJYEK.dˊ>:^'H\.Go| պӄ ^`49hEtf8e[ruYQ+a*B3뤓@ apS !14%+%0QF\_::)Ԭ Lfyu D'FPrwӴ9e3ZK$ c1|+ 0Q@ WE rKiL'dCLw6fj/ uJA= r9ކ9\C )r4oW}amKj? ["dqId\ ;L}ggGx냄 qGXIdsE<)c5/j( FXh^ƿ0G L^tHJ~~[*Atk7_JLoc֥h4C7 ceL# HXaI#l/eOD:&U0leLǙ7{#˵궪vAӋR=ټ=#dۏ;n){qt~TwS>Tp߻Ykyw',5tvl7[tTan x(ˈIe-&{ôwAT }# ⌈\HԡHDC.Ra& LΌ@JnaD_Y@HvPS~qS5ywYLfdyXC4!6.Y!qI"ddu ]?i ]cj7Z BAN/X+]ĭQs y6V4OQ ?Rl |(oi>بR+bVViCCTk-U6c0cbf m@Gѓ%*=N,=bBܙΣmK YRoNXM~=<␰ۃ.k hiwR:p7?6 35$/LY`fE'밯2\ ީ# JO<;Hx: D*[|0X+̲"[0@%nXe p j1.&* !j ? JAPaMTHB"v&2]WHJt, 19xpG %>~}Z`~Q[}=19N@S:rU0;<-5p!#jtZŽBsD6)9Y\)4tXdP-W8,iCV.˲s=;~7KB8焑bhAj(X]c,NbYԅSi*d6U6Ne.S:7q`>xfb4.E䌛ߖ2fi4A~K' t ;Z*oLA7y& oTDd@`F?8?T1D vmH44K]`̆ʄ|ۅK#"sB oOoARy^>섍8x!e&3bH2 GwՎN8)xc~2]6#;BDztq&U >gSVo'Cd=Y%B%^7v1ۃMn&23]OF̜5<ߩncKD t@1Sm`'N'H, H#<lG*(1{"S"  Us g^(̎!Ø.I $PH96`% >1 7PE M4ɪ# J4F"2@O|uj*RDH:[MI;g)9WA ml_L@$X8'=c7$ysNM>R9?p7  %@+dL[QIHcA#MO2WHR5G5R?G&:z:$W">Xy ;IX;Gb2/ ;DΓ+Fx*Ԯyĝϛw3DxJ>Mbٿg|uƒ!D6dfلʵ%{#>w;2sa9!_M-AuI:^͈Q'1ezQ  UCq(C8Vdٖv&HV+cfE# ]dB|BA%f*CP!F_2y$ C'?gZ?HӜFg&>,L3&oVe_Jg4Dk>y<8Yqi h`ޙ4ṳWgvuS-^+mb,jBoo_vZn FIJ͐Km0tB@R.4ѡ$m[M:he;T~vkX(^A-,/O B t}NGgxdJ]Ҡ̘YIc$1އ؛hIbɠ쥿n!Ų-I.AD2(r(#{tw)j%ns@mDWF'Z6aN/ }A%:pY R)PjWk!}U.F$"̐@2r  641サPq ,:NPlKh(pbdn"7 Ș2Zxbiև^5n>&QIj\_/L!14<%4"ͫGySO;E‘2xquDG"U Fl @bcM*o*OZGWAW‡ TyMp$m>U!X0RsekeP[cy חcw=sw Q0 4kKN 1󠦘)F61^ _v{U<ЬQ>%{Mkd];lk} [-]QNw!?n7L[u/Q2 OT+b[D#t+O'tVE~:hlU[ehO");S c^_ n+VL8680uV@E: JNp=B-pvF p؁nWJI^Aܛ@% Ɉؓv $̆w@0P @_ʰ/9ouTLV^< ( T04vB! F5 m4"8'o@ c(H <"x*)pw 8 66=51tPN0뒁 ʁ~l[4cA8)p(%PG%#hE(Pt6oG:uPMПE†j^,9&|M9ћ&0b,H_gB)5Yw+K)ȺRf>&/ .;GrAXKG ۼd KFq=$$~x?s9fM |w]2x@`[H-ko% x ,N`Oz)DiH ߀PF'r+k2L# :Fy1~I8,$6+ylA](2Y^6פF NlFm@ LpD?H7MD*J@"@iC~ ?#8UmoɁ'չ1//(6GɏoNk!nj!Ργi#a/dIL81U2-_H N_y?+{$໊㒳Oc?zڟk_?(VQtAE5s/.ur=|1v(fu/Isp߾G4;/6=fz9*SGSKD3f} NUʀv84qس  l1c*M $G^zM/[RrTrLw}y7QV\%-4Ggx~'ݒБ:%NbGEz8ݣ%~'V8ח>ғt#bIYg[IM;^Ҡ.@L%J`M2TLԖPj":"{r̎QNb&&d@> ހ3JzX5C1 )Y|XUd̊IĔ仮 ٫۟op$p؝' N]¬'υ,OE 2FkhSf@/0AKbQ"hyP! H0AJAu[6HM]-BgS湓1*͏\dl$2~RŢGȦ_wGiՂF}y#3fdK' mҢIφdnNMm}7CTj~w|g*6>Zm*Kėh/nHeuǦXӐ~7gxO7/V3"1˚Pk`]hqD~r"L1R'#KyY]6[0 '(NюQ@@D` BOj% SPUNB`F@h. Y/9 /!24U' {,i>${gP] BxYKYiyɵ+H<⬆஁cK>~sZ'\0 *5/=7kԬϛ<ٓO-2*ʛۓ!n Z{h X VzØ P7jx[zדaPR'AD7)|}:؉@݆f'POYL2İNǁT3L=]KZ:R.jAO j~S )X 22G zCG,>9FKg?MT3Nɯ^4v#P;jXHE5' a3Po<{E3 v\ye,B(3BDZײ˳;RM>4L ] 㺴3Z`GֲM9i+%1Ln#GWԐ!C&PZ DYBj͐:9@zM;`Y.*p5ѿ ܍B*69vV>9byi;<9=J2lBiRT]"n^؋3>*ێq#*?QaQw+C i7$qv6hRp-s2@Uӫ5w_@J(3 tȔvK|%Հcqg-S&y钮Lz"kOYn\K nO<$>_h|?o,Iz.TXmߋUh7ے+_z=yY\zgcF5+:MEOllㅒM$L 5aZW,?ak e 1 +RoD 3]g" a\*唛 ߗgw{vNߠܦמո^x:F2({ +[\a_sn]ާn+:X?ُϕx'fpRkOTl`:lŃ~4Zͷ\u4(7H%{[s#;BX]`[T;w{IB-cO ; -R F $R5@@dQaaZm iaк DP $Yb~ XGuC'%ntz<h p+RH5bH30P+ pd^{R7YV\y v#J7xjPF[H[>T\N^z6+MRq^z/u(ˏE7Z wNKM^h:ѥdڭ&# +B|F<>.א}I @~,.d~iA X!'@FFB>U B 8t΁ i3qn'#wB\v~19zXGEӳ v"Gυy\jDDYRJf%,~vIGJِ_pk}>"zGufc6}4d7o5ʀ"G̬ƃl_؎h;</&9pw<˵FAz{Fle{YY}LiꪵkBm2J]>sHM>svkO@3 (I\"b&9GE7yOz̵p3ޤ54 /Y< XވQ֔tHRŀ=xGnW;oYo #h= T ꊜJ`1M#Z~DUxN1AF"P yArN>">A*Sc>bE|+pGf  `gD`8j>'1Zn$‖&y5 n?Nf1C(]F<@aĻdMClySщ DR7EZC w$&9XZª6`*^hb] NfɖTZ`TIgp88T$`b6`%r# @/莭V\6٭.}Y̪}0f;w(N2y3F\=ZYK0H gϚNLmCV$sؑ(Do  uyUˈYI:e/l*=^S3snNefmS=f֗,J6E\TgH6DMV:}l}7-7o}h Л鋷˿l]8xJ_Vy\~=gTmV-dbjR̅hElg#ӁٯR/"d6B0tGrXi!1` VC-N \!7la|%Ɤǰ@]bӫOz9\[+0d5PsrZnT4LqҒH8F`#Nֆ#$.{8u{SKɋ-M}sTÃZp5W<<&f17+]AC'v3},lU]20 D-V,%ҵ>^TІr Ԇ@08<VmbhSmR)/ .BʬkøuFi⫃P=@/MaS E68'Њfuc$^Aae p H2'-xw'ԸdGJV_M閗νunIEJ6v>JCs/10p̆LjK,2jH/wZSlA5e&+,RV gؽM~疄~8ǶKغl7~|ۏtNo;<4v=lt3 xVVh;3]s1űɚՎ!8I wUū=UcL4?OJ0UK ІRڣ&\? w:w,[xQqeL  Wǖil毓QB{ÿ;n".T3\r/l% ÓS?]5,% 7ѯ 3Y^fٕ_qՑהd _%EuS.k4⍐?B?'(6Bmɽ.S4[P+4WtywnwV _z/6B&@A*L64!> )[D! ƦK&ʢWi)n&Bn5yG@3_|>e 쵌&7T›:,a_P(h@D.~XSV'۫|f_x)m.^coц&zs[FC,V:Ox׺NqZLMIVEif-;n"]Mt\NõHۙ[ |Xv?uL,r\#2ayG/aMto6/=,ׇWǐ"h)ésiqUWwD ac^z{XqA>/u٪!4F3u0a<(e\%v9ϏUUj9y%϶ܾƲs'KH&.ӳɓ!B xdg\q^<*sɽ w B$ ~I2ےcLULj0=8Ug:o᪎:;>MC:}IԾ!Kazt32g箲c~JҺ(iTUk:Tv%VD>슊]5L԰k}5yvm=j}.D]|Z0.lfN93XnCV\z~\,bUf9EK\+XQr1G|.PpjrZƝBV!Μvy,0TiQ4JuSj1R[#o7~\QnHfܼƩPKC# 8虊w"vd*b\m f|qS?ql~uE3}Gw캶/j!u-1M& W } FҺ= s4oX`ё% q5fZ|G`[΃J1zex`"5Ӯų^;>"|RĽ]AO2C)E`p:+ϋtسzwZuתlU#[#=}_$'NCGK*jh}SY z "0F$bl:UH ж[ @X tIb/ICWes=׍Vm:C}#$(̥JXxWYQLK]4 "g YIcĮw{/,ͼ:1BULᛰG2H[7m ~/L#ڸxwcMXe͛3òϢeS3LN9*1qqg3;gVd= '}ƑKd09:DظїV x{3îfǐz*sAP1?_j2h@LCP7i/8GZ1ŠΜ-+_ +]BY+0"o%f5xDu\U11 71GpZ::n]>WыNҙ3m]~F#^j)k/|:.b՟)ΰZ*:Mamvo%^rosdLri_f:+3|T0hѷ -S6Q-IQb '~ےJZ2L5IȬ c0Q؃@GDU9Hl0#¾$@^#wAcI%>| Q%hO1]B#z7x=}BJS wbsAIA8M5 cdQMχ1-)HB_9_=2ipV9WN:̤lubS ^^A˄oCb^`0.+>0{o"u6 [ ##جTOKݶG 7`dspnlE9`oS5inW֊TO͂4y_9m]Z9{ QH RPƸ$^i d2kMH20em 2hcP 0n.N 02ü^ʡxȴy-8WiOx SAPrt$YC>DԋIͶK:TF[nё.aA˿T6xc0}kAs%qq5el* 㶴R|;Q].Z59Snv[5 1/0^<_b3ߓ+W OGLҩa笚-u|ћ;I+r<)eW3È'#[p] &|QJ!G3kr{ڤVB_)CY{?D/0M~BKttC S~%c-ԅ{4CDDnĉ1k\ݪLT%/7>>^ ]*n#~:\Î<}'kX *ZnzT3l}On  dpO*>=jl:Wh^ԟnvz1S\h*clɩϦ+o`*s_qݒ+~6%H>js)PFO~ZK]-)<[;~1EJBm$Aaq|mHot4q !m\L' Wˀ m|1c%a(Pśt^еk&Q8;jmLч ՙ°a!oa|f ຽ Y,bP܉NLD$Da2i1Uٳ u K.VڒH4 vsvEMϑK̩)v7E7^JKAM3yi{",\tr5:cT8M;pz"K;;dSf蝘exsSLt^-PD׹ChgWzD~IǏhrlV[=IMNU_RG*^ML͊G=XwĎIIڡ ߷T2F6cӋF n҂m1ҷAYen?E8/;4"#vo59\W$p`H/}$䶬1{Չi@M 'iC = g4ݺ#;kX3٢C3Jy5>= ã;!f{>;"V ;Xxv> ߛV‰I {Jj:A9Mgz%Nl '>!wP;OH޴3nFfIBh@vĽhTSPF§6&st(:,w"f:RCbD~A7:Q<нՄ]HNJ=<{@æI==h0z0-8Mx :'}"#BmWk ͒״R7V%ؚ_$!S9 ѫ)ϗd$~Y~qw}rzKNLj-t /Zr1Z6>-,ޛx4`!mZPP&0I,^$5ZQ+s2]lyO|;R`D vwgI~7ݕME+E(Fm YWrT(/KtGB̈́+ѿ@6@Vk[.`a0b2d EaQ!ܡ#/@ſP\8A|0琳Y"ĉx◌*u7512$֒w-í9&'VKsӗpG^ƌ޴&^K/$kX\<IJ!1:㹑!{#EJ?oF5+9%Qq"Q" M=6qϨp-sR(Ho"_BsOȧ\u84]Rxׯgv^CV?X;fڼx;Ns#֚ J7^!eIf"̥r/@h^9gtQdО0\ "!L3(YuM='Vtˇh3rNw\qS6O+Ts[0Tw{>pB J876ˤNzmd^:uīQaQHG}eno\i5oE?.;!H1ܓu F7*׻6q:A}X/8H5 L1o &U!<CF䝓:%G^4]a)=.1܍\> \:Wt~3YY26ZݮlfW埔K^&&4Uge\;S.X5Skv 5$M,f>M^b>no:Ʋlq̓<Ɠ2[{|.^)2Qwi |Fq.c#g#HF> 'y[&?$'/ɅLu v LSAPoOԂjaxl/tOi~ՕOFJTadA3KpgU-xr; xN6$81f7jc1h K17p@KeK3l!7"(zTӰj,jh9PCM&O᮲g꺶_Ś` Ryǿ Nr{fΪ.Fs־psyPn貇X$#y 1(#P/ ȃBzfrFRDB.EiHPqȌR4ó9YHS 8rRVB_!4%dZd"D:Hn!ؑ-2Hҁe#9dE8g)~y <Gẍ~+Dk SPew}}?ݿ ?`Վ\hit=+Y,IJVx6_H^itC|7ѺNqL yՎ 3{ x% ,# ] 鴡>{-1¨P ]{, BTGw|{B8/#ϺEq3"h؉iS~xnv>9Ύxvg/TCub-`glB3;_NkGV@"IakjEu9%C2[y/oăsy aTdb&~(b0/,i^\^6dNJ حRXO%o?k 8Y~.$])Od36gᕋq3{ܐQ~/dhIYh+-i>2_i1 ab!hI`E2NFɿtI h!7 '^y"."&,T@QݎЫF<98MO)6CEגW_ SRxt;) 3Q}.75IF5U 2faLa.TpLʘOW;xH\&CpLHFf(O􌄥3b"9I v"QUU6Dz72:AQyH#/0!T\ pDC6-Ù;;3\Mx9_rvid)|8\kl>QӺ뫶65_\`)p q\V5Ddw,,|Y-'moyTsqs\ {O (zvd[;ۻ-oX?g/(">E{ug6ÞtHckԘ:BREJ( 2 H H ُuM1G6@Zn\Z59Qe(]s5Brs[USS|];.鲪nn'_{ܙ7dGJ"'B|3HR" 3 r5&o䀚N3@4(T˘YS9Z=Kg@|yrHTvC}rb)5ӻo99b,\_Uxؓ8Dԅ;0/9=ɉfmє/fwu}P Ā!l[ G$ae a#"f`H3"*avBT `Šbȋ͌L99 DbUߐ(9\G#<ܚ܈֥M$);ɃT.b~ l)IƑcP,7dgⳲWiW6-z/uO]̆N*6*7k_Y>*KzBuFڤ$ke?N;XܒgJC\+!3. %c@k0Ik,yq$Ԁ&o wN&.`/10 # r #2 2-(/!(†YhA 7@o@8QIR}B`O"48)vKqw*8G`pCҏ mqV'jɶZ!Ғ8C"9 z~@7J ZsR`@]ت&JI<֡ `Q02?W-e" !rcj`֖Q Jukʑ'A.)SeR9qf.|I=nZ2(:SīU ^4aȧjw5Z$'JoiYkN_O o/+^lwrGh˹oEۺʮ,&\'BhḢ{% wT@Bĝ^Ͳ4v% Xq,n'5 (N0b!.e@W 9:4>0Qx:Pq^ ;O H ^@!hhK@@N 7 /f/T@-` _dw!pAs/A(PHg?@/0' Ec!A`{g4 i U?1@:0Y(@ЦYB@f w <\~K*)#c-hGywOg<4E\!CZw$-snf]4h͍wCt>#GU::WjY-}NinMI7r0ӥA]zQ(4iE2Y}>HYX^^8A3un U,uXy(t4;E3DX_MulwtUs, ZQG"uױ*yA{Q%ugEK'nLg4ʇL%m"e>Q_Z0*oa1.7Z)ȣېs;rWኾ}Bz+|b=ۘHGJ[=FAҿH^hȣ"]e|[հP/U/];=䏿g^;U&d|⪝/2;RWlӊ94&mW3>˄*IU3eund"!'q.~ 'ޕ3S CQc8JÀ`7ރ{9D:渎DK(z#ZNQ40+b_SEMH*#x^3{n"AG`xcK#zn,b3JHZ>EHZ`' |9eE|УYE4 ) B/^@ T<@+@q+0 (P )>]1`0#.A1\ 7NN(oG~);X⿪,bE8/Ԟqe9 y*]_K_8j֪V%&?& Ai!JDJpC+p+D5e,+ ̌J.~Zb3D*c! dVi77q?a.xx':ލm{:U7~iy9UϗM0gjj A9Sj6]MdOzum_mޡfcSGkH/ƭ:lGa"b'2Q?EpDujڨ̩^xtɣ /4f&?\e' cu0.q"!ԗ`xv-GL(cTU3~P.c `A ]x-'g z2]yu12K¤'/Gu)2IaXufSBz>'_"kc{K^l?oƵ/'mrDfTSLjY[*xe6ݾm\TI] $v,K\ϰhZ>uLŊ jCױW=ÏGV_NOD"=#1 a I+sQ=2 KH0pPʍVf<;&|ՖfE9YSz{,5wİgAIkºnJUah! F1(u*]z򓍗j?beiO3fHf (CnZg $:5_2K;xwpYɵDB%M@`~NvA $#@!&69>]mΠޖ{}?]Pxb)6.8~}R4󏁦_ɴɹìn5>cҿ|OO~1:_ve~w?Bt?&;L& *r!H@NP*gugihX{JK)GI(J3H|RۉC/_!u#Zd蘐+0U2C\>K0Ϟ?\q#>Jn ڿf\\4jXFZmQ76z妁Ki=P7t$?~ou=yqS֎lubAB( pq wWp>`%3hC\L("O%,6^q2[0beX?-+Z 42tIge'~ zEJF,̵)rMeؐ(ь8IHFᆉO%Nc"y =5Kjw ޺ͰƸh kA#_Ga?$$, hԵ`KޡSh=tqL5bY{$h# 4G>v#rtҚPOzCXEƱ>5~V!p<Ԍ߮m_}۵hv4DF}-ro{?],gvWd[oW>;ǃsk.RmavxcTiO-/Xie'6N$9 ?~_PIv 0o `;A!y#AaN8D'<'搌yDa88A(z߈Db#/DH|; q8_>!)gDȀZ}AE pbE[|k2B"8!zpC9bObhvG_$u2G(6HS;UCS]h2H=#OmGԩ!, KHv&o@>=0BjvW~+,V,4nT7^W?Vtk(7(V5*8Nv ^]^Lp,BLFwVs>ޤlgQ=˺ӗXhm6VDb.|F0ɟf\3#HvӇ=Ù[ ی~vط7r*?UВ͠N(;p.-x0 WZ*'= M<.eyP*YC-_Y;X;\2Uɠ-Bh@ 8 b ?(]d<%ʌenu7S}+a)tb-8z tADIUt/nǩUw$:GNHFXS&cN\dA=",Ԑ>3*Pu e<Fr'K;TVMV@NDUu5yd*2'BV}> [pLFQk w 1AiNq  x4/'t-7ُ761SO336F$0RGL{o~^Z7ϑnc[ .'??Saf6u ճvO)m(ZCZܩE1#,-TO87Sl*YOiU erNtDxJ(ɜX#wq,?8ovP@3#W Ԯ#g $ $<w! NRx:ST g֕pOWdV$b=rA Ģ vZ 9eA@!B0Q60a}(} 0;aAzGQctJ {MP\U ds>2AGg~NPL^ANE"/qo2V OԱ~iJ ΍ I -Fݱ*y{8KG%;Xݏ9Ug@D8I?)VE/_rXԭKS33謓@hy=A.SE#=3k<b "v>0,Ua6 h"%JpF6YsC'"%[NyiJ XKpKlg>uSKKEͲSɃn@*Tٷ ̯g]>53]ߩ5"rђ :6q>zrԟU8Q6O-)~-8'*J/:.fr2uͬ?n1HHs4Y-T[{g=I{b„5e/*i 2)6p>C6ڻA~>z)g' d%g3,|a0FD2li]I pHBDsE@f8,-=HU:. ;p$NHw׌A}0 h R:#24æ v8vЏ@=K)JE3T?hքY=Ԅ> M'%(HUb+gH|[xYbIwkonA(bUPNY/_t*ScǠLqHp܋70n6#n(KKM|k&4ۤdϾ6UD\yOz?f^ˍ+!Eni-]Ug')'elz7Aoדi{Zmes[(ő׌$wwks>K7zE %.;NP]ZJAkVR-cR$"`|""||%A [{PU?[|*W>eǦZh$n>{0>̧~2fom^F*_bD'݈^~K)щSfaO&}֯(Ddc 5R3e Fw!k gW;-D> 2kG s*e3M.O/fnfZ\u]h:yGqǞjgW/yTIiO]c G5zIF5Y6~MA{\3H}‹]+،Qi qJbX CC.#]j)~~i~RKuNcl;T>y,6f-ː}^M(.ȜYsw#'fD:ea痞kձу>x%Tp*-&%\YxJ:e++JnUݶPVRyݲ,mūW]Ui3Ч6 6eq9e L @;%I#,lDX9'fS &wJtQ.3RHHcɮ YV_( iꢆ]6\;@x[{{]tH^UpꠔIozO%SAPI1t4CZ?< O2nit:5㆔UY K*%zf"AD<n'8\Bzam?,ӛ'pU%s:yY`\Mez\sZI G@-Kݝ#5H%e!K-Iy,g 9lJB+m_,K'|ܩa2p2vn4sZ%⢀δ7}v~ NN0Ն/' JgBcݬzRqp[&~mM50v#e:)޺+ޘg.D]Õ?87I)( |U>24zƘ5Bdckk"Zb~P-N*Z X|αZ7mlW׮$GuC>d qϮz;\mILADҪāaXi1ִMġz(]u)0ޫ{fݰQJ7_Qi&!7hfx$ |1̖U]cs"BnT4`]08 7!B8&=@Q$MeMBvVl>3 vzY^N݌ .w7$e [4m`nQK׵dZr4<:DŲ[4SOOi%WHƺ2% iHX%?c8򐪈~C悔u>Yt\5> $y~ynjW|^pYoϗf~Yԑ&97&їÃt$xdCū'6:;辑f{&+˩fwb2`x-v`8G{jw^19D:I^x'J)pQdq&?h<2LY.un }9vTArCu >R^|;wZגZL& 'SAyfwDs}1/Hkymsfl'h>-԰MRcֵTv;v YU;9+6 ;#}&^]ns_4N1?Qc)EOi[&=B-H@CUɐ.-|"F #Na6̡q= oHfýon5k󍒐Y+RN: o VMɮN< L8gL!"pB2bM0(JsT?/"hxŗp`HXFs.Raen]ʙH%2–!G}gJ-zY+5PjR5ZW1o3Rnj~x+Ɖ| $iIGvM6i2SHGs)ʺu%|y3XSԺ'GtV)kN65}]<{ᦔdg٩܌֒9Iw-uf~uw;svĘ/Tւ#ȷk+~g27+{Jĩf*(Q]5Gy>U?#$ttpOw둔B5UᏇcmB1ND&ThBXpt8Y|G&VF؍E%5E++7<)< rg }o=OսUY4-2f 5'iOjtj1H<*4y,J} [8aS[/YN0&֭]fswC3$jthۮ#͈ ~?ڢf+:^6-e YLS!E'f!$o?!J N@c7"[-,PW)jт̐ Y8[Ǯ\G=_ԻGm.nmG;|.W0l>p?jSX3Z5g0nҢ{X56k'vkM4f5J;]\ gI}6nS'W+u1}8܎/MTF1Q#cXb/M53Wv4B9 Itrm|yگk: m#r)ϊӖ5]ˊj/ ܵҮM eg3v?^6q*fOʧ̳wu)k=$G\LIim$FQ~ZMO'ΒחOeMNyU=9263YÝ6m\ᘓbv%Jx8B.AQšeZ!uWʦqQeY$s  i͆x̘8,]1cnӗF~ΟO =(n Is//kPƍ'Bg[rXZS!xaVE&l}^21F+#2HIѰ Uc@]P҇`- 0搽u/֑nP𷴋< 8W/)LɕLI.1R+Cd e O)$<뗲-I*BZ0 ![hT8Ճ9O&e&s0&3KWFj {?dl0]#F:ޭ*zrz|L 0߅0Z摋2&8Qm10f_JVBQC6~j6%!> {S| `Clav kYi ΀/lȓ66/@ y8]e^axX$.R8 [ ^a`˺ nn,q7QS>%D&-Y"40닄ۋ 8[D[Xr~"4 ]tf[>Ͱ&G~ktmSAeH<~>_>͸ʓqfqZ7C|ݖ;v^صZfWZTO `ԟIj6X60'ַMrJQ4m: @uE|._gMרf¬iz^=Ud%}aU A"MdD)DEmmrRicH鏙N(KxN]@̨&ӡBZ5V![TD(9IX36 +8["O/7jO.˼1 ȱup88AէQk:Qsbe*^؎xaJqڌ-5..NLխ'AbX ,TԿy8tMJ7/Ee!soHdPo[?i|eI^=7$|Q.;_3W&{=NŪ4!㞧Ol֫1eP=94S6~(Nj`9֡bʊFf*F8y[vJˢs6' S5 .aQRtG$w_TrǸPKz̑74c-DR=/׶N^JUӛ[ ȓA  <^;,قDqD̾W+Xp.@\.Bo$X/ƱX &gDJ؈Q"j:5S#>Ro& sF!߉QD9I>t[nŋR]H`~.L h-fcS %Rbp3_)@jA6 x`%,vJ*е%h~i{ā5zk(:5³1}jԃJzxKzmŪaR6lE-l9 JvMGt"!D!!|jb,S#M-Х#^/#Xy*sJ%*.RO0p7Nep9-g.ȇ_YpL-S7d!όтBW )E2 e̬4d"{ N/4뭐4iMEuGvՕ8%8e.+kL|o?9yߵ~g6[n7b/vCwXGWK)b[CRm+ X L6XG &;S2S-p"{bSwWp@:UB/K ' X4AC9Pb ] gVN˼:%6ж%Ed[wJՃŗ4 $_*ym:v Q|IuU}_#;g^W  K7X6L!"Lr2Kg1o̿;q+]alk?HlO##q8Z„9 }! HTc^4x&srjfFvL.qNmg۝zʽ_BZ}u#FzsSW!}Ҫ$\ [)٨+w*Mv4h'Cn&R\AGa/5qp YRTۗkSMx'W{aYxpl̷+{QSQ;sc(!S,ѣ(Nlg4^,|X t^A@2MlݻSB(M|&yճϸ;&bo>O>sΣ >o7AVN&A=?`|'ie\׭7?ͬ>3tiIKNlMbluwdfE#`h+(.h}?$Ӏ '<.ry/WK?vY &R!0>|•[Mf5 2W-ڻ9Xkիm.Vт-{f4m5v{獶B6.]5_ZLsUes'vnNI3 tV_"r& /IVM*[:F$f"jZF% F/]:dOL!G<t 4(xdnc1 ؄ eLaҽ!&mbBT!ӓK] C O>+ 4Cq2'Z"d^j([߇mG}#A7Z|ݨ9~?UiV!aX狋Y+k}^~rYmgH4듛v:"T(jpgxٮo{?|RhRᏛ}N;}3T$Z1.<êGM-fI-\p gAeJ6Ev[Z[E;!W@9hAM$^%lh Ip u 9j@pA\<9QC&Њ0!J@xoC\ r6k+Lh,M%"Ds JnkG)L.@87\ԡLM41 bFk}%6{N&g{\K}xcU>uU`Vq%/܀LCZIU UxF@M1,$a\= Pkp1g$WsL" +v;34{oDm Ԭ L0]T ,f` N/\ PJ xwd\Lr wFА~*/ `8)=pӁaIpGr e ̤VZ^^oPK&PKlɕvI.dXXtMn@`- }VU5 C6Qc9S(k,%o*fP,DTkDޖ8-jJO6.h> V ȑ)yL^Dޤ]6Ȑfak 72Hv೙ZR Yג /H̪ du]R= N2n'jN`Ԙ#DąS'.UoDUzu{8bXAF `s#/#Svp=v׿z{'ߝ;d2d<풥uu`3/J2&~2N[hJWh<:ÍoUtψ{gʧz24|l!E)$r*\qS!x`%KZɨdy8Y0@͠6t(p ɝ1 (I_&$Qcddܲ<Ƈz`AA`!h:v2Cd<(rqH? Qu|6?`ىR#xى}h8xdAw/! PGH YBHw zhh[c[ V`pK-Pu@.v\DK$~WOm 蚥ޫ @ DtT6 `KMNꊯJ0k D2έǺt&]mmD+?(6|2| <:N|f\${|"${A/ZmWx:m R74]8g]xrv&5JRZ+bSČqa^t0dl+e!;<TYKM/޴ `Na1= h7QB -&nvPl#7hr\2X /Ptɀ#f"lo,0!B@ bX$`u>acæ*L`͏ Um0Pc<+<zJ$1sG]K -xF,D=#=`ڲx:$Հ@9&."GoP& Lsn|Ix f)$Kf&QD ŁCi Cq& 2.)('eKF- |:ȣT>X@a6lL6 ЯdD 0.8U*DN&93S[8h% XFcp!R@4sxNx7Kʐ%bSP$3E= "㶉+Æ.Ҹjc4.*x2Zvt3Tj[;FayAcy:C"Lb|+/ XUHyH|54o_u<<.d!1;S q,?HO'\W<-0Q4 {' Tїtz m xߦsqϧ荭ڒ{Ti6]%&$I${aj9bO[Su0hJ|hd;;W,WkT7y/~9mw.[|dϡE3\;݊g ZbkZ=gQ ?d%Vb2cQt}K骆 ]]+7~`iSJezb<Ƅ7|γ=Y{sH6u:~Iᅪk0nO#њfڲG紹B/fLlH\uᑋW%;{sY܊cH(OP/^2Fn5hN00PI rWǸ7?:t lH >DN'!0(~h8bb$ =/`dXlM`ICUpЪƠ2P.luV nMM@Y`$j eib=8Yn|tL%ɤlއsCN;aBNa";ƶL#!0D"b+RZli3яT3{6\uί]i^1 Dȏ( f t_Ŏ&1f掔FJ( @bgy,۱'e {0#܏42cM[Oɕvk|QPRRqcv#(FmCp#tDU}#dx~c_> z&̷GR!A5(\J֊}=Ǣdh (:nD/a@t"K032d}ͬCiiG d@Pˁo`p+9a_@2 u u(`u 0ةKDZ$'bmWf}sD BSXuT D)d*v`V[ KlE: vL¼KH 2c) kpC$$2XY2jI`P<= Yb`77Lf4U%=u / RQ~|Y'],Duk:Zmο㷫nמw`HsiQwgѿ5ƻqNa_ZחI9N"}grFwZJ wBnٳ5o|ulyV^E/﷥12:k%#DPf=}3r8xR^Iy}E8Րu:,N hu xpoB>CU1B:E8'Tyo.jᛑ2nշCU2?2l!e(!D= :FZi}P$j,9dDY 68'RWpU /nj3O ץx'ܒB`xÏq)NlD˴l_i[^l-z <"-;tˌDe̢xd8F&n2@z:LfbjD|/cɴ "[ExKl";NQߓP`"bk7vY ~DCs/HΝ:&!+w"q/G),5"D4[='IF=qz)r HB= ױ ꁕ\̽.G/Dr45`C#a tnEv@,B .!!mUǔ\eF۫Zȉ?U9pw5!uOo&]Z# 3/J;qK Nٗ aԉWRzC~ (vZ;nYˑ38[& & ^[b*45巍y5p߄*fr_ᝥ.%:,pBɋ(4jzcQ#O5L( ]kT8 SV4>p@3& JÈUCX9d"*: 20Hk$X ʬP3Anl2F)knA 'C @xz;Դ y= u,fS\n, |AЈŒ`Gw!!:@Pq_똔D;D9@ B`WŤ+F@Jo#aGRPm8Ca36G`f͢:1`&t28KFgKê"ɯ|Ka̗B5cG~ YL+1LR7_Ixi\'QQl,'߬òuC# a/\2Cٮ;!SH+8DNЮջ><Ϲ}.`ēr)v\$UpRit[޴c^ɖH>릠.mGƯ7=Gcb>v[SFuMZd g +reF)1s\Ԡ"?"h'2%5yn1 2yHOC=QM!6=GCTɢNgҜt%E_spw=DPo]..1F8J iVnu'ǐ(XMy#LgNS{O4%L` T/3̠MQzu!B"r:r] ʛ(ws<6i7^@=;&cG1S4 -zU.&KKP/zLFvY!K#- zR^3uѡFʘ^"j#bN&ˌ|,Z"Q4$܈8Mag$q$eA~#젠G4} lzjHR/Q̐-*/߾$U96 (G#ܩݺ K5jE2ߺ,% _/)Bą>: uTf#N _}<qj sKqn?ٞZI[&ëX>}q= dتwj{ni2s&lW|:x,ѡlLw]vީƿ:xSgE}::kvnmu BϊKel"}fѹW6ObqJקfV8U mlrrI4ܵZH~E怶眦y` >sP шjŜ|0ÓL2)=-;堜Ƨ6a]m*@F׵d5]3 "f,&CC,Py%P$ VbQG,(0WTVYNL<~9(!f怂y_ jD*'O ,R{w=fIq,lF̰@ 8sSu0Ag;$!g 4 8AR|6TEy"$NwЫ,D7r)玿=r˜{ຢ#i|:{H Rx*Xˍ[%Bh$[c[O(G' vq0&(p'z{p sC*dDQޠe=~RPn1IpMQ0 LXt㉰;{~.ϫ7=dWeNi- r"s4L3I9=?v|wޚotd߃1l5.~wh'`@cϗ&;>ӄ^z-_m䦍W=9*E fqyF\nQZm詄U-=^_ PxWyz6V<)ԕ]Mb:05Z߇5Ijk4sϼfq* -EG_WT^7Yw?k)ĤG 1!n)@REw)$hvSdGq5F7S`}Yx xaP#&P$@̀!6nP=8yN ` :yXˁ.(($4W+.D.-ɥN8׈ȄIz=JyJDoXfQ[ i{b睳77Wz>g}eD*4Zq[ gqibPhҚXID4B~WG2pq'zkOqWu*g훇ͽSgr$Uɦv^Lkk;:rzC,鵃BM|BIx":557ɦMcL^ZMkBξ2s( ?۸diz5In 6ѷH?,U@eŢX$y+>B vy)0AA @GV@ڀ.Ո ?;5@cp2DLDLy)c?IH &R4aWE6a1 KY'zuJ0[q>!q46qȳN۔"Պ h5#k"D8.fs®$SiNA!Ff۽Jx撞\Z͑gYqMj#,ȦOGMu hhc?&@ lx[2l&A_&QfX`W ɪ&D7`߁^*Ak'MR> z3yVM]JY_M;vםK֕Zn׬ڠڜc7F~4Z*W"]5ŏ1 X'<4Inc/cX;#|tO]xn#,rhCb<|eqDf+qAmWãfŏ;/=Ky;AX\7z雳X]Q ?8eJ5V[6@763h"z .+a2:<5\O0>JNJzU죓ZK9"V-Đ[:^y[MMfմO۾gi`h.qk<~`V" Eay)bz;N&L;:3xon'|o`[odQW;ފ~m/<5@w#- ~<-2o">eRVVW[fgv|po{_sӞydkmWٞq?Bo9SgWͻ{#DŽzO j^2Obxz̹2lȴfhL7$p0C^ v( +Ò(x1N 4&+ suCc·\.͖rm!ZZe[Rnet%63t5&ryxwwڏg\OF+{:a1mۺk1̻ +_W.o.MW[tuӗ5 ÎGm. ,RCI5NJ)k|k_-WpHx,Q8#mD@)QdpJ: IT0 $ӥۛZꉔDQFLAB.Ō@/r<&Tm'ڴ zN/ĕZ@6KT~#wj!EVɡR"CɨDIM3P3>Zvf-ЩNp2JIdP@h6 )==(OZuP4Ѥ*ͽͧu.{+VlhvD :Q+@p0M<5{/ASXS7ʫ ԶB2O7fi#Li)cU;~\ڌŊFaljir7ϓi^lj5rՋUכ]% ]xM=Z.'FMiW\㘫c, yܮ/o'o{Y>okX<7L}^>mXة~БkJ|NM۶IޒS:[Xd/K[VX hR:~) c3Mw{A֩,4ƣz#oڡ٥T|=x5SK񥥲=fs vQ:68JJvR}H$2#+50j5"Xrʦ/;Z ֛[A< (of dzcJzH]hg w ONK9d$Aj\ ЙdMkvjk Um\Eg`q E8(Ā/ y" ku}T}Ɇ.[D{`v{ߍoOI}7eV_a_('DN io9fКY`v.|iav 5p ׇ:b,lڍj6jnu o2qg.uyb[d͚-IJw'eV2p1 #=v>e1tFNJ `Gb-*MJPNGBE ++l-I ".-me(_Mn:4Ǧ-)/.V1tc"=Tr+聩q5g߸Of|ݶ|zG^nikY5dŃ_,{2{$L"& $Sy>265:,ܚq%K_>9il~n<1u1A+lfP\*pe3,l!o*"qJ*FMdB ٛ\iy!A;U $hLhn޵(LF;`&(  r]VZ\͹In'4QbGd50n55%~ T6$$L]$RsZeĂ&"z+\]pOe$:ղz̏L2gSu#R{\JPӲwބ Hak%0D A \6VbqK[c;AI#0bɖ_RHvBcĒZىdOo=v٢ͱ]Ol?&yeUnjgqFk{Ȇ%JRGc\%jęHaV=FhU)MSͥe0}obVȩŤsKB9iA+ŸiT/SW;Եc)K- a!AqEBB*r1q~xi|̃^SR:f%2Lw>l9UɰpN&^|ˡd^ZO#l)1)~i]FFUE%} 9Exm-.bk1ԁN[ltqj)ɑ7S-6'fU >-g:[n|GZy $lQ$E_ Ti}Zr߂"H%HZm:|e" ܅xRbgD=Y"3`q^O½<&"%"t/ד5)ݮ< ٘Gjs\˄y7 tT1ڈJ[Hg[1 o#""ZTzƗ)?I4kx/>rΑk o7M|/|9Bɟ3_l_g3. u8r»O-zρIm)clmw.FKrUح0f['c6g\Yi]2QA'@`#]5AU b(3>ARU+=$Nx}x% J9YdI?}J?BK+r_4Vo㣣pgחl#/~]%#>ٖ>hMI\PgZ,4J3;R[T|oj¡҃5>6{Uë;`ٔއU!")t'%8yF-{YOV#T!T_i RnHsn(f 2ka!F2KAh*D@(mo\xOޛ(y ȱhw#X:i/,ဎ-e[ї2QeOw4[NzdA4 ;h՚6,51^CS\DN<3Z=BT#Ԕq՗,l=(f`[ \LUi ˑɆA蕨#Y줮fIq^:׉. QUѡy;K:TQiu.&V^'N;+)5xiɞ>67kDYfWep=:7EN7&8Z|^[4si*0G:m[fEZ4Z`d @@@@@H"@ !h(PBb` h &@0@ 4C  *ľ}m/z_՟_CwW@*0 uw xbN g<4~{s?_~p^{ލGeg/`} ( %!09u `f$`D,HK @@ @C!I,).`h-'(E@$ TH "$  i"h A(30\:]7NUY£><+&FF LP\*c#2(  @T` "@Iû%o35QAU 4e!CWDI>D`Pj_2hA;\,oM7շ[a ZjUQrD( XX@4qU )@8 QT BA V@ $DIK;|@H0@A+0` @$ 6E CF# @"$ t qwP@[g] oVDy֑.@$(  $đ Q_ޝ+4A Ma)*yws' On̠*J " EJ0VfBIDPPX @H DHB 0$@ @$X ƀLJ`ǙWaҗ=~#62' AJ' ;0uM V̓0D:@؄6 IAsK9D@00@  $@hQ"(0P0V  @@O [Laqqqqqqq   I  I$I$I$I$I$I$I(I(((((((,(,,,,,,( ,,0,0,0 , , 0 0 0 0 0 0 0 0 0 4L0 0 04 4 0 0 0 0L0L4Ӎ4Í4N4 4O0M8M4 0L44M0M4ӎ8M0M8M4M4N4ӎ4O<48 4Ӎ44M4N48N8N4ӎ@ 88M8Ӎ8OAC@;@?CPCCT?C=AP?C>@C?C>C?CC?C1Ð@;@;ACd=CA?@  P=@;=;?@@;=۸O8Hu@1(p6ZU|֪ml78R{=b8л*vfBI_Me%-:ġZe=4<.ժ$v"e V Z˷cΛ۱pݱB:ݾo+HZ͞䟍sAlq~?PA3M0Uo5>b*@A|?#=1 (X,(c=T"f`Ч D R #O=Z 힄$[.VDzȤMf uuBdȅLT*Ȭv>(;  !τ 8FZA\US"SLPA{JrPo-B㜅?` :Nx])ں-L$`3 x p@Q5: PSJ (0F"<x]}}k/KhK4 i}~wT~Ӛ?<.0UVG3Bz" ˑ֧W꧙D^g}`*4WCOEF(oR?eܶݕ͂kEjĿ< !Q^#ءmUIROҔKT]gAioj)u@A.A*BQw%Ł2kQs2\8)sbb;"!,P79$ AX>: %$_+af H7]̉@cnMZoKfN$DЩEDmX(!^[1H,c5\v!*O eAF d :fR ps|ZC ;W Mqm@L5N7JūU.ΣH}B $o3BrV(7:Ȁzx ,+&&r'嚐BZ>;Rp]9-~ì{|+=V WB֭Խi遼浹KmMIME͉=omՅʪHӭ'}Q"_2(*^Ie*"ss=VxQkrs" #TDH 2lc]Zs]NV,B*8` q^,APAۧJg̈љ #MvD/a! 5Ve9NgPw|T>w L.0yg^ELmڱ('$$%ysE*5RrEs+{wWsU-U컒Hql;kĈtQZC M,ћ7=`9dUJt∛m64}߽U|8RuQĥ>=N|v>΅8.LZq>S~)FEg$%C 98q;T>n**77|ׅ#jBa7]{aVn+? /9 (XE7>Qg!szɁ}@3zIZ JrW JR5 w<>+xjAdPڔb˜R$zC;55AY$:Yqp2(B( ;#l MYNslIhr.' zfb>Zc2ލ[=R',k-B eGXVx@mJVtI3ߓ|'p)5zDD276gCt P<zDB: ]6fٴ`o>[.:/<$ǙB>vjOo)`aN 0enC\`wIvF&b6mW~ye,$p@!bM~Ѫ}T">N0MGͰVeqCTKmjFYx9,@k~~D\˴%\?E%V A2y)poQ<&Dd"m0O'U\Rj׳.H5|aa~A+p<Ǎ e@P e AUF 0UAVH>^(2ОÒҩJ*mD?Ȇ4O_ j5;*lۿ;탧*<Ӭ+lq}{?T|7a^c=I[k^BlfS z c'(Գg~uU8C罊Շ)^o]mAQQ)[۔Ǿ %[BpR ̀HAt: *ήk{J4@x`(v|~qŒiV<#OInmDc `P+c$BCh#Dlj*[GIUH\0o@6^߆͹2nu_.{u=sm ri(!_笻[QSttTwUٟC这_n4y|#Rș5yNI.TWnGeYꏥg_xQiVَ~Ds-k% Y 4b$:v2G,DTb^('yB tƷ ]e ʱ3sބQ.90szB|[4tÊrⲒUvK\O$Fm~[r8&<7ihkrsMi}j/o|Lέ)LvB98U%[QYYy=vKWl(gYFyBg%;5zGfя 9-eӫ)^NisH|cCpgf<ɢe-c3mxɀ˟gJa9k%#=gm Ǚ\D d{K&,+\T*2!躒؄ރ}W'Osk4Tڋ|w8O}sA|ʓjL x{!ȓ%-RF)}@>FU!UgDиC!0u#s ikGU$.q]oF%.:< wܖ/K!a xsE5Xˑ1g?E&3nkʰ5J@`sA(X1{ljeB#a;kO )ϵFغ-ЛΗ zLWD䴿g5xD&^V{-V9*~ЦqʇŽtmQ1^lV 6{5z$ST~Nx78/*EJPHtou$_Yc[1N~oιξ +bNqdAZ-!NEdm,ҡnTvyc^7_-/2|Ϧa߸ǹ'$%E*rcWbuܓƟE)pgcg.otc qkvoº钣Sybdt5e#L"QPB̸PTi%]Ã^-?5}*f0s1=Izi-ͩVZ(T:;T6lPcy&2î6 aj;3@3aPr Z$Ug1[gnyll%Zl+ĸ zL-C݈]BH05dۋ2TP[u^3 d% vtS`Kar)A&+L⬆mn:kV<9-TK7dz[ȲxP## ,]w򆂸)39BI<[ rWF*D$8/R8Uf,ccԤ&Va`n Ld5N@_ miM tcş;hU;d~.c7l6rŞOG׍rҰNPСW5'N+.gT8Ѩ>HO+G.U뭱ȃEu}>#FrRuڴ46=`lXq_G v5q}l4TfG{hu'Vʪ*|\zCT9gozj$vQ,/ݻ*nOU {-Fa}[<ڮuPl;rl×TẶ.?"&O؎ n8?^ D\Id˺ Y(J '*.#iՐ-)0W¶)G'HRD|>-U#ppD|3Ĝ~ ,|^Fhd HR`FbJ|rG KZoíq x4`rKiC*bt7DY-u Kى.N4O:}=uP屷>|yBn޸~߽b*r"C\tG_ p~mmK3f˕V{2~m\sX%Tb *1r&hT {=M"CPBh)E j#Ѩ1&>;b\ b!W Q-H^2I/noDe3&A~*p&>B#UDWDRY=cZݟ&We'_ #r/SZ6N2@SEADR͐z_(OXSE(Ld%M:4G^ ]ݑ {e2h|c_Vr9`-A_xZEx[`Jg1S|!1`^l;je(lNf* DzT J QF⟄Y F 'B>quL%0(qL C״>P@Cv"Y S4>X8 BJC*Dk,c0,&D;W 7oO<@1&vݣoZJb>]qɃ]: ~#  UV1&}AE>·#3KG/@o1 Et9\l~id8VKaz<.]f.CNL~4oa؆|fbc+Og\v;h;iz[7<|$CW5uP}[ו;歷lVOygqq.2^.-mn&Z}YRU"]?Q&ju \9l+'6:mX5M[Du;su $VZVv埧d9F?=;œՁe2#R1+?J! \Hvʊ% `t\~(5\;hdd6&҅m9Tp,7Dc0@AHB+9iS>"G|__;ʃ-6Ih Ĝ:&E zHy[+beR>93/xux쿛7Y.Q|(Q`=G$ +&#w&9B9N2* ZghE~ނ`9@tp^Ey+ƠXD7A|*Wy 2mcݣ d*ɾJ0ndבfvG,uW4Yj2Kx([c&5o:H҃knFzW%E>Mӿ=uL!3ѐ0᥷-66U]d=fBwLӅ23N',ƒq%$DVRi yJy\ @N\M9/!PB#4) x[?4vC24d)><[-|1hd\䓰9ȕtۊFUƤ p.x(җN䌸!!X$BuM@!8l@W.\a)RLaOG6/̛[е*N}\\=;ы][۸,]%2'#B։hZG$K,cCJ2y3$3Yh'bE<4}-P"T'熟:KLĪS$SIH`Nd;)+,{\479RVErIL*xW U:iqSA!A]:{W$3Xx>=hԯacZJ\6*ݗYz`8,^eZ1oY 19`O̠r*іjR>]&Rtuu& Rj[5Hpu GxHXN̉9RT-vxCr Yfq-z,L>FV1T7rP/`Q'>?h#~&]! Hy.^V#=% Ic{xB"D縡"+M&xn͂ 437+};x!Eɵ:ї׶:iެϊ ƕ򁅲۴cj^s*nPRђ~d,f?v7jҧ$;U'TC&5D\+t'CgmϜEZַOV 斩Wb>Z-(V8gq 5[x#l^M&byiB}.mq[nKsޣ!mE# Ukt+TgܑW^O7+BHY[H} ſ @?75ŶLf0pΝld;*⁞6\^= >trw_¶2ɼ %6W.֗ MqݼzerچT.r/ =vB[@~n9b{ K@G(2xhbªzS,5B!$0b :)47i,~2u79s-.n0o~:Do :.UG; 9cUQ/.ʁuXWj+=h~9׼y#Ƒ&>0Xg{d"([9y^gG;R*Ex2vj3}[iNxJrWSNcƲ~B+HZ Bg- C@bVهŀq[ǝ%E:Й癊67ݜ'*5N%D{}{ Ȫffޑ G(;C;X_7XJ ǮNkT+ F2Hu5Љ~QODTкы̵ bG,3|.d1y >*BlD*?(pP{y65ˆ/{B!CT+J]PTۙ}8yZ)kf ^++ks7ߎg(cۢ'.ڷ0A 2ŃTUsBZԏhliqgFܘg Nh?Eo,Ôx?؞.nxsG}#2#R*7G,&td_%f/:s#m L.X%9v7:QUw;/ z,j\N)Bam?S*[COY&v-d)\tFdZ[(P̵bkHSq+-v19wtΜҕ 21//΅}w13r!,<W \O`9F##W/Ͱ(~'gu ̧%M2VsYaYjEٱ {p>6$@hRpDaKa_,W'9WoӮk#x@vJ/v)(ibIMV0u-gQ/!J71Y{; ֺ|\Kjʃ77,- mSfيqc%{+9P n.|Ό{,nq+Л_hQp$TIEf:ݠXW$QYG wANs-ǧb ln #/L7(|>8+@a:qK8@ |гDd8Q3ۦJNcAqQ>| DkEyA 3)*PdP+))P A{uiL#^0%;gӳw^1d߼ aIrhdz~~rzB#K L8nkl!~ÌyQzUuITsz'Vg.%yFGN _;v˯.2ZeEKG ^|1*)bϱ.GwvjYy#N/yzzFkbqPyߜ5ޓHLB= Khu xK)kOɤVc%E틭hB2qU'Cޕ¾ōhzZgj-*BB2?i#{A3בSRFjZ 9= P0TsһtƂAWNR7h>RE4!2ZꌶZ9]<7@#y9GҼ;d pq-ev{˛ Xtjyz=S̿zLF؁N#'ָD= c?H@%n Տ&kx$DRKUvdp-m7~촐&.ddt.4LIv|oFn%u6{+G_$SB;o0e%YB32{ܕ4n,C٪VrWt*>}t>8 Fǔ]O&09/}Vga/T`+[7=Cv;DRNrm/ p4QX;@O1Y QRW< #1HB2'QQĥQŬ#.(zmD pmP]FX\EH 'J`d:Jh„ A!#p\86htL<qaHt~N+BP;8 䚔` S稼o%#dqu^4P뇾*d~Y!sG}yvp3mNJ2_NJGgzjHnT,da5D|}QSVnh}c.|~z_I;TQuwp#O8N4$nynCoA@[tB.AeEE.Dd񖛶:<'5J L-[5Gu6'*};)am&t>Go9pԧh|vXfq@Zb:YuAU ^'܍Ή>õ+ yZ7vxRL~[ȝmM3u _a~N@EudfP rSrM:ZjE3Kkj|pl( nꋧžSnx4; (˪]dmJ+/zGfb:`K! Q#2.tR8b{w獞>W?BJ5f-vY2Y7l9#ɗoeu9=8n6ޙfrK4_t:wNGwZ͖D_w_u?ǒwQ-M{oyfץ^D4wTs'm\whg23jȥ_m-8xŠ+lg A+dkXWU/ZrFaٚg;/U 9ׅVgB5 >-)SW%/f@ped;dQ j !phC RB Մ"[\n6 j &yJ֖11P uʃoP@03w wQ5Ȁ.%aDțA6Iylj`5r2u4wG *Ae$cȸAp+B$9umҕ _}W24imH"d%=dZX6$("vwXD dU# r֞wo%N֬Ms]:ɫTsmV~L)rgٝM'?)ovݚ̈GK;N,ϓe~uՂ=y|;Xw'(ֺsWos^1kx; Ҵvkأ݌]2|Vmy}hov=SِZ?U|>$sDT9baD:Ge픆\C:>V{XΕ.s OW_%f6^-Z\ê?Cf ʨVyH 'X E۩QVit|mj_n{|YzLw쎏FgVt˲zIXgiz=]?&2=λwF͸ zFL/ozp֤!k{8|.KnJc}mJmx8]m`uyr('ȕJbS TS!;8lb?#yx#VY@Y cA7BoSQ940I3%ۀO#‹2V p<7W /h*l< Ol˳g|e=X,K߫pӘZOI8&#r͌ӻh3ioB=vQ=_UW}hEK JrI҆lǞV|b .zÇ ~SQ h}]ȀG(I*)(A j1v$t\q@7~(9b[& Y;č#͌ ٠s+dhL&$#d-|^V pl-@p 99Ũ+! ؔ ΀5B,L1_uJ^C`It>l$t"OxF-Hl"`o,$NVd!.#4n @`W[}e2AYLOϯ9Orge)Ǜ춅<Ջ :KHhA/J wMyw}浜m[J?+:c\ZUzgѩ%pε&dN3;9*6w{u(S l+'.&3Br/ 7To5!⃊vc"Tr:-E;ARuKd@%"/hrE/u6}u l|ے-__|/R);s=nM /C,g.}JRN/4pXGAXՂ( ,9q-3Si[YX!\诒-q Vl*/_w+TݺŻB2tJBff9nGЍK~hbÄSNix!4ŕ{Nú/ݰMrr^8zE*}Ip­u 54Ir㠶 c i2o(3xu҃n?>A{*ӈmh]_Z`ш[kb8VWYˢ#P.o6 ͉}I0qbkڞn!ZNQ/҅Ńd몵y%r>P?sr_,vQr"]ICG=[5Ӡqf6YCgӐiסQ{02 j7Dsd UόNt<F6d$tWBbʅWLgs1'v(l31kW7~C5c]b\ 4M2.NgT4ڨA uxocvMH*N0C1A %SyD(+C˨K@ۋ0S7ކ+*^nPmF.  FH0b xc'Xc7NkBβ8?BKoX`5hBBT ~P!hOo985f߰]X?ef>0]g\\w^UXVenl_UAcIIIrXxyFZC%6BDm?M''(!J[jhAg\xӈnQd{de{طע:lqx.{UўnpvS5v $+Ҫ㌅Z l*_A*TDߥ =+;5B8!'[ii),a D}HQǐvh_8 %K`zE.U5zNF,P Yrvt$+8YR8~kkm=x9uQpٻЯ ޗWi&vec;A{v$rsўErxGR+|j!g8uB*7M] V?bP; N0v7;xv1 iExб}^̯&x-`b7^BRh$ G.F7C D\d5tZWc5Nk`fC<~X-;Փ`16;:AB;Dž3Hb@SY%ˬ\93k0UEXOȎÊs~  T-jm2y5<L)('IǩW:p -҉ ݎOX_cc~R]>hj,W&F-q$0Bp9H2@ 9vJn X&˄p]RX 0;lӺ oeg:%@T AhtLjSZ hXs(֎2s [N.$ u}pVDn+Ct, IO,5(Uw8-WnxM E4$Q$+eR/|f5x҈'qL3{Yq¾*+n3K_H~qd0!%Eh0`vREA3RѤZfؘHzQ evV5 a}73KJY9b@M֌ #~dnд7躪 T6t֔}Ieu(KE~o0V4ڦ,,2-+~n H :C6z FZ34k 0D5.$n @a 8n 4(.0e*,X$TUx @h4ѫ@̖:Ƙ,\Ŀ0-*hWၢst\d0c yJ[*!S `('DRuxX[%iYB8 PZ1#w {ۋoQs Hs4fK̺x<דVTxZﳞhWٹ}LJ3B ] d*_$Im#KB҈MmLsLU\i+##_ A^ Z}z hжx?\,a$A hȞ;0d-E\E~n<jM"?#!VٶdyG#\cj/0N!׸[ V;^3C pApl",|@S*@ڧyp'N I'|ApZ~=t 0|0:%T ke t?}9W _0jF1,AX!sRRR`'8JŨqIBh*$0gcH]TVppS3o,~_L󢅳.>f Dc!eZeA[^"ЋH'/\R m"9̟9D6'aP#p0b0y ^ QSpOL A%F` Ӏ$B! 1<4]K4WޛhoGhv?J>^䋴s |;vg@&~$)ab#hO@5܊XGWR߯otw;<<2`\)^O\Ÿ]/mw[?nײֹܵO&jVM4xH S"ڿ7sJWnD5A\_ZRp{;r 29J={e U,4=)JP1u"L@c5gsu:P8z9$DHCCJryt6*CqcD9!Qäks:&a&E'yLϣ?Qj;S57ZuU‚ykIz*&!`>J%SA0ϕPİY{ |p2+`aj7Lc<հl`hYh":DĆqJ3ӭh~c_@|4^~@sH|0BuH3S{X1  <8-u sy]R;ы{gJ'd5ݫn*0Gȓ F&Mw/Ss7YϕUPP4))w~x uߑfY,7b7ɝÞZy;6j\=:mFϽqU 9. r;y?ޱx>ąMYehr^˫QYjV ̻5q!uTU\jQ~mB}wͱq'ݻQ aU#t `/"ǃ}@M&Tt PK bLdGY\ѥջCzPH,}yG q29#k-)9#kH/EOQi:ZcRKV+9*TсQҹrL9xqV{Fw_FI84|DIJ< ?>w=+,}zxn IK]c,q9f53jVr FGДX9|>>%.#m2E#vgdY"b203nKP[@g>2%VI Ր'pt5.FX-Ik A) mY eeD\; )Vf?L%Hp0 cy_G6}d"[iHO 1> ޲󈛅<=(=l{] i=gOX=Bf_ć/O2a66A &`9p 1h1ЬI&96Nw[Э׳Jufq|W7<;'?E}FD*ȱkm}2&, vk_c͏q?zYs>mM;3E&ݮ@nCR-[u%H[2#MtyJm{2?#MhAеZ'Jv`fz2&d"aB3@Z!N0] tH^ pZh~uUsAX}sTztY 4 ?es6B"C,Qz<&tv啇g&q>ѐ2IPCVRt IJލ^C`_yTxd;cHSTExؔjbK{)s{ͳH2ػԛ^ja8;|L "h7I-+}dh8AN  !>Bdp y:Eų>_ oK%$7ytз#,)'G!d @*"GB!LH b^X.VK&۳h]zD0ҡAo"ɡ]4玹_>EcwUE<^>ƛ3ǞTå;"DwrVG}Yߏy](V:zDd6-쐳6|[/:\1ߜ@b\j\Lrb'oql3`rD&<;¿/tŷ߄>K勭8{:?ǚ'l>6!c1rװt  [?X'ab+8:TŹ$Aۙ])J&m1Y$j <X^R|cQQjxܪUJ#YY)n;TRzn؂('5?Q!v©, aWIU"Ұ TF 4 aH>KRjOBw:h+{{VR%u2[q`̞U|nB=W x𤶖?1ۤ:N 'a*ٱ\a{>qLx 3S'={vn&HiÄ7'/j'uXDbQ `"dYr Rg1-N%*]Uj e-7tH_)"S)41PYQl#/ e :xPз.v$ -Z7he:ODYǗF\a %6'xO븇k I*Ɯ]iuVPyKO:QqQ-¯z jC=0_=}**nvs^4Rd=u9|S%6Y6Qz@3rnw73[9m9]oxwA/!! \M@s@nQNWuZC)Uk\&\m(k$'Yu}2dnh:;Yhw)pX4LšJƸU +-#(Srnw!K|4NIxy5L7""WW.?7VC)͗/+iq#8)~z"E\6׵N"G8=kDgUȸχMX)SF`b3>K{! r$Q\Q`ɖ%dhX P!?iMBY3l"*-B:)uH0ØVQ@ , p7c,\?y@\ x|KDHͩ 14|M3dP|8sΤI^eOHRdVW$K%^$QLJ'(!Roxyk3919{G~;3LO&4T |B;p} G7U@8 tFdBP6Z45wCeƝ  rfO9/Ѫ6q~Z^ndC#$k* VH({Աˮ˹fgzّex'HV1A,0Q>^XS'5ФYAwcw_]DraKN>E/<$N\ᛢ< *pBм[!=A~ EVΥ>FFQWHdsO:W2=&XV.w%*\I1" 56= K"O2RKb3|G:E"G'"@abtR9d3DR *;c!j~O/p s@+£ x6Qd)c:8–1 6hw/l @4k42.T)  ]JK>%<ȩM# bL7IuXܛQTH/`-1DSt~뻧FWdLؽv4RD?b#V&~'L=7EM[e^S%UArΚr.1؞s2pWfqsf-2KuK(&J6، nxҷx, |ceϬdD' wȼ'Uwc(K7(Ia!mD*`]ፍtm3 e0d]E4.q$)@um1?(Z mcUW!JѦ= 7m )Oxd-}Seo ( 1dkoȡ҂I9 XSn{˳GQi;`|P-s0#Y0 &Q؄JP.PYW2e)EH<{B!:q8qnD]#etx%a@ Ei -/uAJ% ^Lj,pqD =aIr=&me9_~ww/7ʓx-5:niIս&;-(7e@2(Zh+\tp Pa6oaЬE(QIp#K Yj3%vJ΂bPx^l}q(R¯Gk/JVT/飪e@F.Y YR%0"Ȼb=k 'fq Q#,,ن ^NqS@3ihK-4h->3]QF5:UB#)oAz%U/h)SSV~ŧmDd<鼵A@jG/u/!ژQ&HUiuV cjhN)ܥ'PaGIPm{a#!B(P:9t:uHA).*ɮTոQ^w] C *w+Pw)6{VL8#O3l9Oi _NI87l琇)UE{B9MAymC{5ZheС]yi<đ삐9^Hb~w: dEa.]/1,}]T5[IWG2xPSAmX]Q|4(OsTPto˧yTEqi?6}WA~`iv.LrulVS"=Ŏ!w ſn>P?PXAg~ۓfŚ鸮?{x3J,Yiᾗ۩UbS7kd5]^vW`#Ʒ⾘vG(g.~QT9a2nb~$ʵ$|opx}6r{aYRBe)f)''-!&t%ԋd"nUK6ԃ8llX'FU֟~e?R~?纞'^?+. ċA#C+hXrX@;THN0R03rozduy_c2_E\^mw2\ fj)[F`WpY qcaW*\7pwNBvЋ bcVMI. @WNACLB j H7@NkrA7hlAD!G#I Y.iLpE+Şˢ) 9m@q !a D$HД-*?H}p*}=<6.Q3y 2<}%8?aB*D$M䀌K:a76^2T•P5?ٞ jjTPw&^xǘ{yfUzH9Yh9{Ӷn!-((!a7ժ!"W PGdB*@3| ;W Qp2HY*1} %ciN Rilm$jƶ>>v1;v' z'NEGKcSj޴hT^(8sQF(tB ˊp>8d!p\6b.j'Zn R׾K/f?1nȅ&w?>/lK a+b?`R&%El(7eXԥi=w6#z&ZH| 찢Y݂CO{F p鿸32,OJr9K7_ϖ&^_#Sdt잛=n q.Og+âV\'^}!YXQh7dT"fIZm`+K ,~h)zu:AlwO(ṔCO٠|OĈ:]&&q/"̾F*6 ,xzmc;NQ\}pt(Re0i%i8fOI3<6#nc7D%,"#vJF$_M+.=>i7}SdXԧޟrk3SsȰ{~rjko>k멢w1"VV*!7D.ceCxD >`zsBhyf"6PC.MFD!J7\5ׄ Y`C O'8vۃ;/@r{KF{AuUi'7 Q'Fd"r[]94OzxG%4dPGZ][v.3h|}Z(I?"fcɭӛ 5. 4=0zqw/Q[f&f uBx[E ]Bi~'D >加eLA8%ڌx~!kO|3|3HX1TVgdz|K7>E"V~ju)p)IlܤѶnJ(ܜ90xMX+RԑKDuJYtN.Yo0rĂNF6/y/#Rl $rJFLQE}aQC(Woi37녴~iA D)fP7S҈<'10$"wK߿W M$KjP%:"5XW?G? 0Dv(!8?dL(~J&fHԃZ`6S`Ϯ7ayp@U  0sd28ZWLV/;p*"J `Z$@IZKpB:,cՙ)կ|0p}7 oI$#gg#}xY2u˦ߪz{#}|n/h3\vy߰ٞ4Q!.\!; #Bb!.󩏟[~& 5:b]zxzk=tF_Sx矶]Rߟbl+Am-+ !~^EDGF7MɞUE!8[?+aXR'$P>VBT vTԁE<"?iY(&KːE<|*[#it7u$O%8+=v@G 9 R+l(6 b]l]=!C~V$DW,&["V'2[qд8p;PJ5d6ˇ*I]}[ P<&Q(}: I@_: ,°. 1 *Uů}; \'WgׂfH#;Ƣ2MbXi%hnAq#oRB@Pܟ7Z.6BI !9R$ ;IBb*[ Oz).6'J)Xoxbk~y+]`m|-Z hwp6y@%a{g}9Opk #;F϶L eݜ dOxΛީ7OWBA {>[=H@ kb{/z}&9<ȰF۝u!oeSx\[)W9iDINISpp9MolҢIFh&x,܇#x|G$PNh)$u9H~/L tG?顈oyV4'X o16,贚 w sV>"›CbX.k^ ,l}g{0.3(biA{UEv˒iGI~HH5E(UP!R4%VP1A .P};XfJ] j)]αz/gHt6!t ӠX'A1GXixDWX*/=Y6PQGnL4̡F\/*ځ^f0UP^n `>x݇DZl"o٢i5.pY8λ&C|fM.X/;"Z2V|KsEk&}^_͂<ply 5>.wn^gjE~u݄ `Hc*hݞ 3-kb*tBHCq2{u`1㸫$P>r#,74 @ PURxUH =B=KQu' 8d=yUj Vq)ګQκB` Ǣn-B$N`*Hbԩh,M9-!9 x4%E]9VKW"[xƐ8b*Q/QL"{;sJq&i@ՀoB!`F3n3, FtBߪ^kWY>7#kJ4xATYDD,f*%VR!gl-JP]$ e"2wDmhkG5'z<0~QO!)B~DKyʆv,ՙr;֗vb^;Lzq~ɡ7^Z P_uV<.å 1C?9`c,1ǑРreѽ,'n3Ǯ|?jVXֻ?|TWRdR3zJշڏ{}}5Edmݸ>p62(ۆL W("VN=⺶#!C9M}{Wr9["8j7z4Q-6₤:JiqI⛔,C 5Qd I*cS LJqG Yx f2` AAZ%*SIһ@`G'apd _Mkſ%16w25[ >J Rry{ZYDk/() (ǃܵB%H갘Rfrull#N2=Dnt pU+;qKkm"TEMBwP)-(CEf!X!ShE(5bNJXy O˶Dg.HPF62J5JG87DI=#UwoЧuBbFk* ~ Եr-?D3B 4Z"dQXĮEy:bbdHnsW5Z}ߊG9s}z +oa=-D"VIc*CZV}}~op[&;K{JoRbe\dEu(I fF (zR6ƣܜgUQ`4u`tY< ]mEGMk*Ko:‘|ܼMCkaoOX( LM׬LJ=K0b#:[,&Wr~ ׁzNP^xg!W|~=.;Ł|y݆LC(40C%Vl/2ק$rM +^OjܽTl6_\]f_1/.?0KDLOw6w^s?D?dϤiI淲ѕk# z@Oi" ܗ7e(W s!eM.IٕHPѫ(pft5.~S'}<W1e6C- o*Ę%"f*^ǯ/V@TW. (633(C @a0#Єld2@҆|jB LF%pz8+̃./(>A!  9abU7#$6 O,3l^d. #f(r*k 4Vp*JZCR!w̷ f]qoeÄ<v`eB՚~7{}Ә\+7c#ԁ/} =.kD' l[+_,>7ߙ?|+Ry>bF^y9`~ZFْa}f)'ez\zTkCQ";`ͱy>MU[ݚfw^4Dz/-UY><ɽ"io27>8 "VGR5C^LNuf#{WGa n(ȍiM0s;JMnҚgϊ8-GZQ-Ţw Oer3ԓ% F*iu֞B^b% :Ya d21.&Lf[[P:>Qn1x9B)!K"/:r"Nv| OQ ( ܵAI<,lȰb= %PLH|p 82Ӏ G$IEQ] `z ly'Ofb>`#PV۵iޣz߇ҧt`ݒ̾'@9d*6nft髾iyIY'Gx΀YÙa[ܼ]԰{˥l%$~Hy$ʓ޺]Ub_~jFTMG]՝G{r^m:jn]׊Uˮ0v,ΰUXjɽ|v[u_JKu^(. M Y:.ZK9WSXSWyJ4PO~'~)-m]4d<9g cN58gRM:$oиesyt&̓Nܣ񗱈SvFM1Li|qCC䯪:Nx>$MM{O0*di)V/Y: Bހ(ax)U͸%ZBD8Mڐt:Ò(!+ 5O|BI78i -NjC&.+% S EaJcih }ޜb`(9I8eve\tlǢaO%odaU-jLOV0H!!q'r@̅gs}2 {ȡFAM5KL;(>ŀ) 2Ó&V>U< b+v?i%ý}:n7/@d:(>B `@:4HCo&+r@Jh_zsEb'gA%(BD&&lCgJ-X D(P{(A5 Qo"}^c q.rxLv]ޢ:b`t}ُ4Xƭd.[j-8`b:J_̀k3KgmWzwL Ei\Rx-oTZ*lªދ3l9&J3(JO%wr u2W/7ñ`sB'L>vpQ=H99ť:nnOrթm D@ n^]);|384Ʀ6N%/hEV/y›"vǏ:SP&-ٺͿ=w.,E1r=Au }6joYټ+8s3&+3T(PnN4XLbȤR+B'otNʙ D2c̱fz1hƟ7ݦ2*FMp*e瞳Ee>#.Ԫh*UZNTzN)v0 '=ED[1dU5dj喡U4(k#0@-%0 6E8ahD4@QVB 8  \m"rMM B$G4(g|΍Qt0%5 QêP X @m2n:f48A]O6T@A{DG,y9eݩ0$Aood H)o'qVjr@_9N>L *V+@a>•>۷鯉5VkYT95HZ拺4hiϺV ZWԽ;`K.hԡ ZŖVedPd6d+yu*Y V]ilOrPcGv]~e-QPLo֣X|z ̓ g/[ T[4$xiNTYhbBeǭf:ӥ㫂u]=jQ#DOWP[, h5B9ШtHSxH7Ȇ1B`)H RN4PJDfmujG'R@U6|h0{<6fXLG~Qcj˺a88C"7Y%@dx@}l2x$rT!;SVгJU2" %wt 2ϊS8H&D4 Rf?aK4;o9`xjl&r~Λ8㻔ku`'X\t"oNL.Mv02حY#ם߭x3˹p>ݡ,ׇ ߶P:ϿuY{8oŸL,t"Gsu~;{`L\V`0!ɇ:WwK7eV_wh]BP (Zdj"\)u!*4=g^}f]3V=q?92](G%3sU]M~ҙ>SfUy7~,ݐ},0,HڦEEG>n걱aYw8 SL7'N%խb0p(]DT):/Ȉƪ4ޛDɅTSjWIL>MP‹VkʤRq c7zRK`tȞXrFiZ؜ձ嗯Э-v1 P `\ GEk B eAg) I(?݊4^O)v!Lsdhe%'$ 7N.HP=$+CGe>W{O|'Z Cq6K'iۢMk:};|}Gt*RRzUN-$54.U,6~ݭ RX$" HP4T J "#F>GmT8WjpN7wUl)¬ߔH%!3CAy" >$0) $%km-͞E; 7Wӧz7=lH5+λkz|c2PIxJ>0*06(A?],S%p] o[닕Lݙfّ;.х6qd,*yMUV}[!W€# :r\Y!30@vtV㟛p7*IprSp1@M2$*16jr륃LD#! =@7k%HljVjBEƦ)p0anN 2Q;jxRez-G"4?C!g\; 6e%& OՕ]u` W0.[DrrbRE^yy\kG"_`"ˢJP'W mI+h6eAK7e"nWj17gwy aܺ`QoQ @Bi "NzdS 9 0G[`G5, k%܆ncDr,.}˿rδu,Rg~s%.W1NzrFv XJIJmƐ2Ȕ0R1"M}|HEpG!"Hx6D$L⌨UB{b hA[P ׍{kE9y$!d1C@')-V V 7^ A&Y ЀGH ^B GXT"M0B\77.X_뻞M00W:HhRI3l6,[Lbe>9{5$= AKs!C$>g>|EFl? n0E'P\M_3Լ~/-Rsn5*;pE.9.~ʅkOzO2|Mg;̥~r3hO<vٗWu0]BZ(ZH4$cg=*Τb()rRHAU N MK٘YdZk:Bցim$! E2~j%8n䓩ԏ\1αasܐѧט}ʯpu~mY5ײE3 Xq E.#7Zgv?N \Id,O0N@]¸4Ƒj@%B'E \Hh%"9 ~(sE8)s4&}hZw8 Ҕ㦽'K#Y3/}cz GC :k2+' =Q?pm#>fCS(CpӫLX\$Ÿxi"'ZctE5&1ڳ>ϣE*@ѭ:E|pTecVr9;Iy O+=jo溞7a6;`KAn1 oAX T (UvzK~:qHq^e'\;x=%{/XgCxաo?_2TRRYLy`f6 _5s`sTy^Za# (鍺5 (]@M҂,bj_r>KUƼ"JW¢_    qKldxPco&`Ɓ,І8-9"4$Q"B3&c~|SxkD;22%`lmdH s"탎+ g(9op(DD*>u\#tӫ աwW9`/AӒ4tվ&i㺜^ӵvWcw"@3 l>]2x,clt64 вd]TW8aY|1Kܔ S p83ߧ+uy X^b&vyWkKR( ]Zcaי\{L&S̵}ft~Ď]i>qGJ˸ezsRruJeJT"":ؐ‡0yPv{ *4c;*!|XW9"!)bQ8>hNiS^r6`ym4-Lj#)ol6? xh ѵUIZo?+8mC 'N>1 hRC@ HF* ~Afٞ`MAT`;QGRz8ʍ"}bHKrGx`.8cQOb-xHyuAJ`*P? UkE<-lCqj9IKIyw~}a\ Am< 9&% \ ^"}{yB{xzysoM}#hF)gGQCB(\ #sfUE\LslZϻsK%L'2(q.pnlqhL.5]AA񏲃Է^zC`ȰdP Kљ&\Ca: C 6g94+X 6rHFU$cqscT$ 4P PrNOxDc T]bav!-W #9sdgKoFzExU3AgotH?\t YWG7=PD0"q9X3C\JtKK}%`" Ma47&~ȠrðYQ4J\'9qfP10ğ$ehSm3JBI"CZ/M nNxWwtah 8ˏ<|zK o#Dϡvf@PrLH |0 nn UűqE/DD+ܸw͋o}ʓzBoA3w.qf~?fZ/Z)+0u[U $'8uv~f 0w<0@9r{@wa4`K]$Ո'5BZ`{W5Tt(Y P2*U.{#7-&j 놘m4!n0EA`(3*chhΔMsв_JCE?e.p)PUQ[;פԳISEKɂ<JD2<6W?=*1jH{0+`@|С~y GX:hJ㖲iQĎf.wv[v8(iC)1A0"p xjԔ D8>) #eP? $W.jpaW'f=$Nl`~|d}ۖ*'(Ҽ#QRiyxBnG>t0nR`S!|q|PTUTwF6TCΡm8`&xmP g @@ ;+[z.u{f9#3=E;_ܧكm"fIndD)ufL*;_d*tG_n7zF~JXddžɧ Wa֌#vt;s]#d8ؠ>PAh02 HF4$ӨŐr .gQuv3Nw¤ZFNwpm07a9`/Y6!pPrBX*.P $ Kڦw_-ߥdl mMC3sRwUpH[_߷^/'K ` @ #o2D/-PGJx!c\-?#zwkJ\l5ڌ(;agN<8LlVa,\B FYk{/H6T'*+1\R`_]ҷȪÇl/sjYLm5I\'eY?_NVyjzWbYO*hR8kev>w[ɊhJp*֐\34BPD}A-&cS`\OpЌ&j&=$|0mBT4E 7Ȱg'd`#s!3e"HYx#ϣLފb-$:jfw}nG\rzu$:a{⌤rRx/4() 6+xuD5q׮4^K:\y'){/Хqt#p_$W};vs&h] zKTe 0߄I'F@5qs<[,;v.ujũ=/9./xJyw0Sl({Q+u8oV 1³c󯕚^lGz=|?tq/7.T]K-$'N!*+#e\Wߟyr R dZ2Ѧ#yKxG-9Sa~גU8e:.]5F.Pmӿgn9t#n=]k>?ⴚ#1 u꒭c~ӝ۱bOY%3΅.Y LL 0& L%-I+@U,`.HBY޷Yp<뉫XQX$Ojgџ%mY /$Sd9TWaVL׀=q> >at!=TNBj'Ɏ|;#<*q / !8-En^&rr? i:h|@o<9]H@kKX+S@I <*@^@U4LA6 2d ā,|>т,* BL 2/"RU k.kY1atC"\뎮c!`EvH[Gd>BN3]& R^a̞,S_%r8>LT8s`5Vymb|NN.]:T>R N "8[;(̓=A_ Hky6P.r^yb\2˧*el@ۣW˗ܾcMO2Bq0 s+ `ޏ ׂY4M>7y0g`耥yϲqc)]׋+\j@9- Ā !Xu+nR}(樻{ޘ3}RPNjp\)MzM+')|.αsV$TҊejҜD:Tl1fj'n `+Y*5EҲюNH5\j*rcy=ʃfdvAG|*Nb )̇/sDs?f[iF;޽=p5Il "Y A "3RP?)!>Cʀ#u "UyP@OJ0FW҄d #ܐ7{Ձ'Rgy*3vXy9}/vV~n8xFqV`D O?Z 2=lM+>8‘001XcRg+L=;9򩻖;xzR?n2Oqsܿ3sz=2IB n֖xQ߻ӀoOcnA/)Nq{>4Eqti,yd6/L:UػVt :Pխ|jGtULAHN#{~LV{rv$/@`xz |R~v'PFvURVE%>czDkJU ]JSj..i+ЈyKs2j&(ՠ~F)Mu}sB6״iumv(d}~v*eN~^ ձdcFfTq`ŪwUmW#v9yZT^Dß^/H]ƒ X12Ӿܧ/-$K࿉Z> 9͗W8NʌDa=<XO %"# r-G4vSuJ! 矎E&i\6 .<4aB)$J3  Pn[mEZ0dƸ.aNB6U } EFC/Cu‰Þ;NFE86 4FKMŔIv3۟9RdLn  _kw`(NB4ip:!z$!`%$:6FhQft\40?ŭyFJ>z`4>rݰíq-@l*X?Z|8*(;9gR Jj^4m[aڷ?}((ٞ2g}/vFL~hxeC7I2$eX9Q窓K3,}O2xvH`~ WO3q=~%=Wlsc\~F:U?Д@ v)C3qR#wBYaIbz]xc443W##{2M4sB>lX2Xp;r2+:S)`oXӳxlCP#y:Gw2rX6\> vylA>Y퐼.*:'K)LD; ~oϽTuP[9pfG)m=qwikgCGCdCX|ʰ=@Bi!Yw<ߚjEuwpDX[n{׎qD,1 ik*ZJx̢x5]SW'P|h3nBv+ˈW*MBj)?RPƸ3'5y䘚;y7?9l|iJ\) /ٿQ%',v>6g}ǒe;,5H{'n[SgvqZE [*zK:~ZKh۾77/a6(qW#_jj@> ?H~c}iu͏N sHY-# $xXii;3 FX?a}1vN3[JgΏdQ3}tw"/Ҝ4{ѣ+B)e m(H6.Ci BG煒񈱀`;|XVU Qn32;3˻PR\{^]?3rz?眇BK Qu ֦_s|(âAB! A Vo-0f  ,Nhh4yq\*, 8.>DB=@ńX,tst.Uc**t;:bt3!Q-Neҫ;vB),s /rxV,E 60TNlj%g8(cKR4ZI yVtҏU緂`~[u翬N;|oWM㳙 T3P>eɨ]HV?bI6 [%:LjBSe$q`d/ }0{ɛxM]ZzSXĸ~ (h \#fv1oױ0ZAaN 0=jCuo [CǙ>w*<⼤>gXq_3SqI$lgéfEaU&O4jNO|om=zl:hZ`vhV46rۯ !$ EP]g%Bny?|o?ݙ& zڟ/O<)pFE~^=m< ֟ ?N2m犛X'`dK!Q8``x6!2g_|Vyw?'OݕN jQiUaѳ.o Q֏|tðF4Y?0kPˉGY4y )K>QsH[P@uf,UA=#${J>{!0:8R$[^0g|nY~7cWVZ@* OH]6"yT7ϩ8`&k&PW4& Fz:PRE̒#-yc p&Gд ؅hӘbEڡ-1/Dh35ݷ'5>@l@` :yL@%>x$՚XEf0mH(CTKfHbKb -! $[1qcaP<Hlk/+rt]$ʏqN iv.qJ/8w ~x;FwmRAm5@ `%}G9ZB&;9r:a 1n;Uxw+=TU&wsu#ņM?gl$|  ng }a폥gn`,4R/H>dSKZ߳N֛S"TcGWzKe)#,'azmT!/PV{8ͺ<$qZޓpWgv\QvzW3MAha% UܨW%M!wlpQ8bG݇LNU=>Õ6t˪L~z_[&qNɉڂ帝q5Bg͓R!g;6Eo NW(y)L͂qW?#QRqSgޫ{qy<ʼ`L@[/Lfwrxk6̔~un^Ne숨ibNyjy{DU&%Ϯp_$$+#`pHjgQk廱)&ۖJ6h4sd\\Mpٔ4S݈|d+QzN' T .Q"tLeLZ,˄cu J#hki„GG,+d>N+JcՀg/i O@:]E1&̤dX})9%*RG! G4d 'P!f|vh~J?Q:q~q SC6YP4¬=x)# @X"5v_ d4` 3rD@.+7$`mA#H<'F#K<͔UӶ3B'tfnXPy kFb5^>} AaY7 FeLf<}.t¤  xqL)=5LXwXYR~H8o 5%ڛ;<8˚;y sf_ꡚ Kd^+9]neJC4YVLY)nPbvP姲1P6&=׵&t )A*<Uq PD^.)q:CqlPS]KبʃdKN! zV`Zp}]}͵}r-Υ*Q*l0K1% aZ)Yţ9 !\2B,jNl(sN)S<} Op-@Â?͇q=&@ZTk`¯ V (حe.^+@ay<=[AG.s()#oog؏jAs;倧< O՛GˬX01%Ino.iZ{~o/DL{d:X*{O9Ux70T=y3?N*{;s;Rq0ڮUil)BWl`<[*   @@HD`D " HZ,S!@e``7 *8N   H @$2F!@y @H#IkT!_9oKAQsI.fQk~L#MĔu3g;*}7>{oOy6WN*VĐ# 1P E D H~"`,\0 @ );1Q|aJB0bb X ;7(|$W BDƈ  0 m,-@8ah m *(f%Z$ڄ@m dPIYXG3EISi( L į.!@q$"Q$`B@@` )0D@H 4`@0 @( @ "Se3@ 4 @A@FNRhDfȖuhPEsoOַ3Es1yt2P 1 F14`vT2Hc8o/!:Pw\]i9wXo~DhQpb$B0 M` (FWKQ }lk 9Kux?w]t߿7ow߿o}om_￯/LnwkDw/mf,37ZecoD 9-|k L˞}~o׭˿}.@<d qqqqqq     $I$I$I$I$I$I$$((((((((((,,,,,,,,,, ,,,000,0 0 0 0 04 0 0 0 0 0 0 0 0 0 0 4 0 0 , 4L4N4 0L4 4 0L0L0M0M0N4L8 4M4M4M4L0L0 0Ӎ0 0L4M4M4O4ӌ4M8M4M0M4 4M8M4M4L8M8M4M4M48M4N4P4Ӎ<Ӎ48N4N8O444ӎ4M84@N@@=A@OA9;A8C;<;A@C@AAC@A8C;<@;9CA=<?=AA?@@CC@@AP@;A?ÐAC=@&z%$.N6 ?]3VP.4ܛT1mfa~L,k@: 5Jc9gap< 7"1O|9`~Q D]w>7䢄EhNHAޗ.C`>H@t)6ob@{>G%I&AC lP :+0wA9 p-U4dzO9,uUNO PfviSEU'oyɭ$r`[ x- {$oC'&8 u%蘷GLNzpb/rRmdJSw'Ёळ…aYbP_՗>)<6C5j)Қ!#3guߟ'N7W5+;ZΪ a_;dJ[aa-Py'+[c@ܒu3:!R~++Úw,40k RHd%=dY3{JR s!$Z㊴d%8ok]v zɜ<\`νFk 鸅E6O[bֲ?c-3s͐ޒR y7[k U9NL=<$,IʼV\z95fm\Ѷ6aݖf'Tĸ,8h_'"O)"Y"IB6du;y sPCcL&PݯjFnrsw' +vxy^ Cb 0(IU y(GI|yNω(^&m30F@$@H0[S{Ŏ5j.suڳd.խ@ iDn=_#OqW.:yԧiꞣ—Q}O)7uVW2.8wqmXr]},瓣C$W L++y#4L1yVď;+"U/[ݏ mY: T0ivStW^3DΑS/iK l\E,GcӲOeJX(0Y(#^a" Jae8^og〨>&zzw6lHKx4̻#nK!< r a! Ta>~!|%L>J^iѼB`[!@ړ]+$#^eKO "R Gnu$qʦJ&@t5Ịm^S%7%-˳ROe3G[FVrG awu Fkh Xw!'li)G{e)/GB8,;{~T$wL<Ox7Nn.&CgWm6דӫ5$}Z`iQJ[Tۗ=wt#s,AtVXq{/{M2UoPha9j.6-ɑx$Lw‹ ԷXL%>o'g=~t?, m0n{x`YWOydǒİ$ xZ r'jpN-f':9,^7JgXlrmlE7kV;Y ;yȩV((8&W<"a>yTA(ObdS Er(Sm]TotٙIKw?}2̓Tko|:D^k(A bN!]j,[-%/V6bhq >|NMFgZ>Zpf+1@<@ȍa) ГLXHE ǹO嬔5oSEv# YEeDbo(w p{9VB.JɇfI}y[g*c%r|Z̿W>sb\WMp/tn}>e{wOڤ0G!R0٠4̗|3bZ-,S0AIΗ[v} s}{};Ĩ-볶AhxYeX6.GqIkԻ64r,̨`(3hL 6]OE(oŽ4J{\%(?ER?.x\RF\ #l^WmE sm?z xW=L?rRoTOS<=ө:6<*t-mgo2Ƶp=핬j׃AO U*rw' &wt198IYٴ&j=e2z5.t.0jIGih8Eu$ʰo1;s>?ACA*܃+o-Sđ' }%5F,y8=C~G-"$B)r[fOؼ_-c;6! C?/?PxB\ nz H̭^KrǞ6`3.~#pW9Vy9f^7"\xTП˜,ʖZju$͑GvؿSk v{+|cdGE iv/"C\}'q"ؐoT(\ @aYg8tC/EXWm,dbSKuC KeBzߤ"F<Ɵ A|#d?;d*$SsAt)`2j^=of*,Jz '@C17/b`QpUR:[rO}}YM$LiN)6],R:h~knuirl;+-<ʹD$Út6 .i+@A1]Z.¨.ՋXOz20n69>yR4ѫӧOT򭢛U6rw<䙏. %S%G[]MO/|+aVI[URDLVK"8`A3wߪR'JX*.)nGz;|*f@լc79,rnV 8ۛc>xPv{tr_]u:;~{VM5{zz[/[UFQI7"ye43gV҃S N/;!OW v]CuKQQ^9/$DHdio,2>68ҁ,;W*-]OJ~zʜ'mT继k.ϕ]o:}Qz @mQpfp\8$L"6mhQ{J\=YƷΖr5TAKmy ,  b7 LȾ>#\ukU*$:1v8yxhHlߊ>xߔ!T>c$i+.Oܫ&kO:i^JO>[=t *Jqכl"]MF͗YҞ;7Y U>WJ~;L^*Jյ *Ѡ3pˑnˬ;Yj2LűrMDĮ6g޾IogUXOJ#ވJ#~I;H}ÇcwUMe&ʲЧpp}ȿ@q@:: ίIaBM\OsRwѕe 9e9kᐭ>pG5jMxhja}yWܒ Gti~+꣼tN|+=p&]9XY NwSHdkqû`W)]; H_@ i\W$BŖ*jDD^KAy'(Y%\l D Q"e2yݧ[?޶=]:q㌼;s)?_w0\;1O#Vj2l4ZY "i ZkwIֻ;4bG:݅6VF7ɔasuT7eI}}j|CmO0yޝY3g_ V*ЗFJYrIaV¦{|fFUb;i|_߲:~20=2ŮΜ9Li 27;8tn+Z z|:=dUfs,7jSj=1gkDh9εg?+f$@dֈhgqD3a SF+k[ud2lt"~+ZN:WVђ!K͵r_?eћKozX'.&zRMlLHg=^5DqEKi3\͍ ]BW] hҼsG3_/W!&OZ]XlK)r\W v.K=12]Gy\aR纪|*FxFowاO;YӎXU;%Z@ȜtDѥ?I v"#{-֗baH5TdyͶǏ68e tN ɋ1}Yv-\\l^CžCF˜!'BҶ3p<ݵ_ϛY|n#A施4ϫ-{8sʰwsZtjȺT!Nۼ3X#=.CYpc5f KiǔҙȏI%p5.;>aߛ:^60ݮ.~w~o׵QQ]dSZ 9^NQa^Rޯe[emWoXA;QxXm^DGOz:,OcZ씌=q e=90C(v[TF,j> hAC0H̷Y.hc#W.L0nz}JחgfQ/MNq1yZ¤256i,y~%SUj,[2R \2 7-X4^䭡G~-lڦM`(vnr̛rgٯbsXycݭJO% I?eǫ.<ERwM{әS/pi3x:Q$|4S<B@+}38Y,w-y=Ɏx"| Pqʑ#'tJst\T*Hk$3Ps T7̎H˟8OH"!?!VE|Hf[DHiBSy6*$88ժdDw('G.{[&fқm̲{ۯ(jcʓmq_,COIл$#G* $~-'j8TJ2~q&yӆd6}Ʈi5Yhs?Nעj92Srq'6XNYm6?ӿwCK\f6MrKWp_ ]S؝U碈]EpBh|URhDPn@j Ṫ𱊉ƄcN㿋vH7xtXSZҖ]g$NIR]bE_Q3-Mg2Z?64u]PY7ajG]PRڕᬝ)ޫu$Iٽ؄OcS6bm֦PeNw[Q嘬0\ܚV,r;jT;G,jF6iE3H5(e'eD:!'f0+O`?DŀM=g +h8 9`-;pש-4;:k}F4NsYuҕQ;1h~J%8\HڍԵi1 I2U'‘bpNeB~zk+)d|=/p=YŞ.hY~˳'*V57y; l\?QyɣMJcz h ɿz<a Bu]*##r.1G~F?0DRN4 䥄L<Zj4>H.[ .G8 5H@7bk.w`e{6WEZ 3]b}>z0u [aVä1 V;4qC_$t 8zf|4=Ի@{@Եݥo+_;o ҧ_3eej:\R!}V=:k]ϕ"&]z39.֋ڂ1gH ޮt|yOYN<19*eH Ik9_Ԣ/9{[#ϕU)aiWR\569x{&'KݫMҳ*괕H-^(f aKQߩrJP,'Ϸj\sHW6漯;|{]vӲT,ٶO6l>wR>%F:돞jQ:]< hxz}k7sfIَ\2~muFsҫ?8KogBw᣽;λ~6mT޲ZB$E#Ůbֻoo7?x25d l= 3Ga DpƊ,U*(tㄲ)#1AqS;0ԏԾlqoґll}woΩ8bTF6MP<+- &#KȤ)DwrȟmQv`{}[avU 6_Oz[N\XD*{Xezâ|)n=FPc)^Wz?t?;_8*3 gK럊l͚U t*rjW8_ai 8-'A_,.\Dc\Hj ]FV5%"Iz?u5 0=Ó辜ihl j4V|89x89ahRآ/˓JF6НaSDO$&,\ew8e5ÝZ۷Nܶr2z)fn~-hHH%x+=ck_Ӧ )Y?~%d9KR L9u,Xgm=V['*iDX:M_cɚ}ՍOh><6MKKc_ˌ-N~#;OSƪVij^uhp*&B o\ot¤0u?et, @ ĩ> P xo%K1W}2)W^r}SתRk6:NXT8㈝uI ~>k)&e_i͟ݣ@'p ȁѐ6,2^˾;(n?\*qv7^9e[|Lȩ/i)]fyn~O$^[o G՚qCFl3;=1tj]yMw=ϧ Ϝc\:ksƟW-dgz+˦A !> ),MÈq>uk|VK`",$KLYʴn`I'Iۮ;:]u vՉ#u!}'*7)T@Qrr$N̤C?|S}&(<``I+-q_UKR¦-jA)JDUL(A[Cmɛ$2#4DȖ z{:9oR|qǽxőƷ:ZjB37ަGU.r~R̽U%o,;|lBWOZpObϛunpso<<-J4"UƇt%q@x۸,t ߃ \g":y3sBBqI1~zFAAB5Htyosx{=k@5L`n`u,`b|9㨀#U>\Iv}2SA5=L޼D%/'yߴ5 yof1kLh٪6R  _XryDr֜`6GUGfn_3eԲ72sȄMp{Q&E2ԡ>߫u[g|tZ[◘^lE&3T0ݓ0X#$qNGmY3Phs{DR: ԅBMrVNM#`B!N':$@]{=߄(aќ(fzGkMIce(^#Wko(޿;|~?n:es.*j;.:Q^zлݩCMٽ+TȦ^YomPRZѷ) s3|v9R[(yY#$jgi\;KCG7+:[#trJVC4Owj3#괯zؤAbUgT e$OVr7'A^Oȁ6K*htK((l\WĒXÚ 4>.p/=lҔ` $@1߀םE/ *) >UNC_ ZPt$ȱ7<)%S@)zK@ kblpN~%AxbGk7q&NVDէZ*1n:vΘ|}v>i0Өvp@D+ SI+CaL@EнSʂQIu42n+gFR$3SUaJyq5+RfG!h1nn j24Ȝ5\Z–.3QnHJd=. Ju'T Q.:BFflQ 4bkbD>-1$HR{BIHIE.`~wN L~V:4/M$,ݭ޶\*ϴ Q2;}Y(ucH(J<~mJ@ZP>*mHF#uF?]zߍJ]>༮ܧ'C},޻܀=AoݺJ/eq¥6_Su5N6/,Bu=ʬ2s+eN!EMX'4?-p(! x\!.hG_bF\HaFĮ=^*gv̮f¤+H ftϸQk{)nb#hh NP x1E:_DҥU)XhP8΀oe@B_X6P TE*XSxJͤa-.UP?[gny)4q?µ<+޳6׃ymGlVvwn|g 74|QK Y~;%+9S;-&Kն#&X9扮#:3o?ƿ%<߶.H`vPW只4TY܆ݔhI]ҫַa9C/ *,sA0>A{HC )"A H<#PGJ&rkR%?.fHZ\?N /,3Fi7ZGuFd'szznv4gMڊ3&2H[̀3[P"T3hIGI)I7C 9@ %̙nsBgaQ " ydSFY H æԔ!=( 3Q,9tLPmKC=(I<3 aM@*D `?`w +@'sAM!H%:i䶀C35,R oҘT,28 $\X2*& :!GH!QA9sQbKMVjf;`h@2p"H8V /@Wz@@ę\147XÄ)" !ah */1t\լi.=ز >겹n/-k{F*^KX6 ] XƯض txdD=L6+`BwkO߶+{k6Srok ;Q句)rOelw>HE_nLmg'P) 4ݣ;} Y\b{A>*η[ {:s)ymMS7mzrM[Ui T& $Qo+"GK-^h,.H1)TMpL T?(z?3H]J1G~Ma#CF2%eIbIדAM"&5HbfK(/H4X@Oc?|NoF@{a |50» e,| {i"LAk"EHoۏ_yнY³m-}؄uvk>F;9w3NnvArlC|p_4\&>">53}\6mB7JRRH2X)" " h0KH-DNF8 ɳ;#pFlsC9quI%5;zwiE[0"hP_ʳoUÝTV0 `RS"s 4P?8 Ipux)^#cSeȣUO{РdX>!d J5cWovX g+bκq RB?+qM ~I'<\vGZo4.':ӻNb2-$W["|/d11`FB$6 *(.fg$  A}iÑ_5'wt16VC 4wD(2DʨA]0_ 7]YfP36bK:M'XAG4ÀZhvj"5)W grTk!LC=s E¸, ]J؏ +`R/{ղ=m ݵ 0V_q:~绅^&f lBD<—EldX>ZYV@3({`8]^롫TN|3|~ݻRgȍ϶+P߳nm]jJ'Kon?j.<higOTϷgTfJTJ%:a(qr_<<@g$@(! f:l J258lji3 C1޲=OLt` ׹ ۘ1s@Cq+m"$ Z:M Jy#J!>0cc|eW.LbM+u"lbST!+C,֤4 @ۓJik(8j}(ñ[)*6iQb$mi#s”ioqGaQ );!ewBpM_ nIW#' H*; #1șr&܏rN֍^B5hk fg˝#ۍ, F9h*"C Kiv01| ojst`mPNb(n1AeU5TTo$;Q8e 2pՈdÔkLluCܲ/oJj3*dzt\;1>Z.sO{޵+mu:՜`5hRc^|j|E4#yw%&)e+4SS7@m뮌da]ri-X}'p"Ճhvz\#F>d/5E2-q5J"CoF )칎X/w@t@ #I\`,1@)b~2l8!}&iQ?FWT*Qym\g}JGOXÈ L*%?G"WBS#..szrF:Bۤ8,EIKJ꾼?hۑu n@=Q#GUṽ0Uh̏.4PFpO*Xf W![xٞe‹0\4y&G+5%B*qX8sv?!}b%/EquV3-^; PB.Ĥ]ڭ!?D is)C]zC7WRuTZ7T& hi|$N Klv(9 Oz\$ZLB#}s(3- C;Z  y`ޡag X`qGTDr TH5*)㶷}^ՍJ[[b8l嵲2;cy{w} 45xC,X2a{ws3@B{̋g6ݒnoIsW{jX975uҸspBnint2^=CD߽\TKN?iOosםuVOxO^8ѱg{w(LlX'^I=DD`݈ahq` x&)e\Q,plf*3/&nA_E5z4 K-^OGi,=) &ٸ)1Q~FMQg6FiE*X&tuFih#yĄ\x#` N*G ` 1$OR'Ep1`2#D4,CMkb",ZiSؼ [ gT#SC ^G;!\zW P-UJb hO`ɒAn$q ,?V [ ճ/کTNxaCE/~2cWj}q]/uSeIHmY"1w Rj84!" 7F`B<Lax8Xqʧ<1ӖгFt"ieFjQUj/.3Η}ͷbj[Y/=o]l''Om*|wZ3Z75lcdqz[R]-4WqYH͇dhݯJ?R}g덎֥jVnJ>]#kGM-N) 9KYJ '$e)5B[^Gh> K ݊ @> j%,r4, i6`<; EN}R|pE?0iA]z0XT'diM AԙS%k B2=05%RHa*.0R#UO<bӢM! @ڑH)=9B3ҷ1uYSqtLAo6n@`= b\ _U2V|ɵ7!TGܢbQ# D3Ye 7 &`w߂O Ez*~P&₩ZdL5={LӼ q;iiLPm tO,%V ^sxP 0 i*R3!0GNi3B l,]vF|Î,RNeYw/GW Re@<3}(gw>~˳ZIrKBC$0YWz %Cz0_HK(;/\#2؏ϻtor vߺ+&x0xp]Qw-\+uf]{5xsGzì 'W9)U`9i.lRVM:bYFi";($bct5l;K%fyo7b?l|SkټhGgEX;m }Ү~+Nw-wϔMB o;(5>޷QS|͇ w~5x+#g逹9rЎG14)K 0'|!&Fw.Pww8[L,t#v pSFX+O= pi_PfE/+ܠY9:68-оί:uVՍZPSx^`fnkHSVber#Ry! >LIXnnUk4lookK;>:qpOCr)񤈭aRE;dj|ό<0nrC}\g_+n@r%EΌ/i QT,00N/HV MvJ`l, rfA/ 8p5!Veߖa _8YuWH4ɼc3EVt> oVI.:ҒmC6> pă|BFb*sr5+?>K02J#|'B Fd&s$2HTelFIRNr B@!K\"ƦTcA;kKQIys˝Wn\[y%U SeO}Y:8 9[4YCC>$~?(di:LἭo~.k,͈[#`?;vtM ӄX0w腽ސ75u\s(5{FiۣX o\%ҷ# ~mm#VӇL.\}^F(Qb:*Q*mtf2w M'HV^OCHKx#aգKJo>[6|8R`hNlfj6rQ\%G6SVVRx硋Un]۶uNjjNooIliߔ8A9j_-gQK)͏32qCRjqʜ}67N_z$ S¬ 4K!M9駒O^S):{RŹbONGٹ-[>ٚ\;7죂" k10Ɵ@BB4" ]fDžDqmĄK,hoܝTXZs`!C(X3ByTP}NkPgG,b  NLh`=D (Lr U6jzc.SiYMY ڱ#:3:nvxdZ˄(<8KcjQܖzIMrWN{R̒u˫X8RBxR申(ߑ/E/?\gܟ~Oo<^\?~zdӕ|#+5bL:TZ9P:d/zllzq֓:_:2ӪNTn)0S%r:x:)Vr""-)u+)^=pCT:DG88=`+Fp'j(=pW|Lh`dqq J3#U&Q7¨now3p( BFTQed6%kRn71UF5Dfc5>,%HMd%_2 H=k%;Ү 28\4rA #Z+=نh \pФNV%A^)m4Y \L}wC9xO7Lt/S}~aQUſX#CNaps_y-sA:C[㼹%^!x m *}!Wf|^նv>\.Nך}~Z-OxQklƯ51ګ=O;׶|js.wxq{l׾y Ʈ{L6xI9*JaiNf'4X4J -2n+~7AW ;Xv)SpvATT1Ǧvô`@@+o2RGBhwnnƭOEx(^np3q^ӕ|#E!v3.gS~=lwX%^C^MsS@*#th0.7[OD) 삶S\[ݛw%6L)H oNۛyIDH:9'TexR~~&/N!ņRSlTJ>;iڴOOr3#ҽJ3tMJnv;MfXIJ2%6I1fjM+YϷ[6nGg54U[<Әyk7ȖaOsE|/BXPU3{-F=,]!$2j aR .ʌhzɨx ifH8(X!!`T 0x(D8/z<ꌱIXaF pprkvG L~p]g Ԡɠ_e*tғZ<9tqj3R]C.›Fj8`9@]4 K徹\i7 ?Yۜ!b]u$p:~j}ɻp~@B=ٕ@ 8gs v*!<GKv RBzi?&y ж:2jRh }a}ۥ [~`/;e W:>3x'Y>T(+?*{n..#5ZgDs-/zMkzNEOol.0 a>v0*˳YP|4m#4aeAsy*%ظwcG~JۭU;p[Vɢ~S" n+dN dzY(ϪUbrKU*w/( ۪R#JP=%Ԯ)k5l3c5AR6lW.R_4mMߒUݹmQ|NƤn/&fHĪӒ@D ū6`eLd@-HRw(XPWM0S vŎK wRE%KIWJ܇6Lqpk(lѨ`1l+k=C1 krZfPIIz`^GVG4Cu>o5k1^uf\C&MK]yﴕW[l~~ilFzϽG7)F]y b׽ 3usENϬٸ4[3#ckk{xn$d +T&svEt9Tc+];5'NPaUAɎzqZ4Pxi^Ɲ2Nkb8Uϯӹp:X֒(I6ClNԊ=M\o,u;.oDF.VR/-u;zҭC)jS]6ӧ hFvKיf8K(z^w"u5Xd+6ݓN6zf :S!>haRP(1> 谁($[<&A[ֹtcjBba!@ې-q pVreJy(bU+$9Vh@iHcz&!-7lA>b& xp NJ5NP$h6Ժ]㵼풞@8o3k3lt*3yqykauY1i] kz*ȄDy57Eݎ 3൸#_׵=8tDžV梽!͙46e :Of8pFRC\k>Է+[=jËjϳuoS]j>nNdjo%qe{W\ j5vb=k'%y;⎝ҎoBĩ+@K֚ ԟe; |E;%+˒:MҬAkWi|9} WfC'qmm&MѣdġdՅy9hA/PNj΢by)(/$JW٤x/c{`s(@M^1oyTj3>䜮} +p1k N#{$3/\X=!X=QhUfXnrhVCj(9 !zCѴ<4X1kwӐjAF̓5f*Q0\ q"ZĈ5̯pɦݛ8\ػP$}4E  )O,T`vBzMI?NC'_Q4_N,-#4+(܄R%[(.fE\*u>돗]Ξxi3Wk6=GZ^;h;>uj}/+IvM3 =.FMRbrT_D8o>3 H&ijfm9FTyZR*?IK0C@Ͻ'c)Ь!=/TH 91z,U鶽Ymo~şlSnyT&(UkQ$ hI!2meSE*s$/r)?Y.T/P|s5/Mø۩+fBx/t~V޳hWΝbYOu=MAP?F?NK%h&.9|7n~[-[uї+m{P2!j7y.[z~yݷLH(^}Z<ٯ|hI n-1k}coZdQUQH:a:WsE󌋳;%Mfңy|]j;8Kku姄&RrgeY3nl+Ϸ MS62Tփ;!^6sB'$ZMynj\RN-Y3hʪ*O|Q>ywuZ= ~G1U6ax]_mwߒj=qAݢ5Yk2PjE P,{ "0"lsE%q%Ye0"'2ciHAevef_v* h<'ၭ%s5j_'YGOF1v2ȥb=YG *RN ;>E" md[tonvEv{U*:49qe(+ G}wY3n?3pq眾9K}4.;oދqv6uoUTQa/w_&Sժo~FBn ѲE+yaP}o6`jqztUXf*-P0߻Iun&N>HʥZ(dPE(@U$j J4='5:;vrY'k!SeR rw3\Ʋ=%RZOmdQ6Wn7}OxB\TlvըHU㕪K({?m4`mT;3Pܾy/gllrf_W\, ͺcẃ#QgRҨ ]ў}Jd}K֠S{_Tּ_9}O&>y)7_UگvebE5P5zd;W 3kKUׁhJ JYoTM 4oݶ4R2cHfI D٢_ Ut>bDL't9Z/''깟mut贯iҶpN|l=UcXz+SuP\peGoV -%ģu-|{MݳLz 󍀕-醔Fk1R#xKf-ɖڏ 932uPl#(,.A]3J\Ubw1m\.o~/`Db_ :p2 @T5fȌWJuKu ~?@<]-#J(J@+R-`Jc@HGTAm/ҼITJ[GsxIR H>ɳ L]&|)[z#唻2vvr->Zp3d’:'}lv\&ٓ˜6S\l=eӲ+#w/|tĢFLiP) 6 mF bg<%X-+=Dתs4 aҰVFѪ20%kG-`XBf:^x\ظ~daN>ɵ *%Sߗ}>X+׍s2{sk.{S^ޫW1樓8G*Gb9Fd8K@է5:uSh1NAWiD42|%SRMjV=) ҏܕ7e@k'WM KI'~cR]Y~F>)Jؑ}(F;dKO0'Rr]~jd/ 7fSf⋍ qԧ=[6BrZOUEZuS[ɪB3Za]$;Mɓtt8D?@sIqv!s/RNJ|\L5HH|qd8O%+ G_үSf1\%BZ7"rZ4x+Hz5܈jEXѡLa X/㬉ŽDYav2J8 6 WQQ$&ӌ'ۄVqփqL7Izzek {K?qz>YB#LK.d6d*x nNllRrQJ6kIB`r_lLt.Ԧ s%2:A^ibvoʊkhL组&޴.R=`9/hn-ޯLcN^k5U76Tio*-M+QDPO$9IOAORA0{ƭyoIعu"bK\Cu=kبSN"G6NQ\%"at[ɢ_g]: P!P0oկƺqdK{޳2X8Ik*5LS5R j.}!1S֧˗arti Di(pCh]\6cDsWMMlo| VR)-i~+E:Զ0twpO+62Tmk9Q,8[ ;z!hf*E2؄~dѪxD#j`Hݾvق(-q] 7FqVAI21+ 7c,K>=77 ;wܨlއ\>'}mөvmR.ﺤ7|J않vΥtn4֑!cO)mGv9ge>֘Iأů[Npwiʐ8ASt-f[vJ;O73(^6en]yT{nmLpV-kBz=ҌG`Bq*J`U`,BXؽ:@yr.0S( Y~w*Oi NU4HE+N*@P\9MSSct ª8 ]om&:ܞKKD U ;kd~)V좚3n)=iqJI񼛇xJ|A&2EQZֿl/JX%0q5Y+΀yК9Gs}Cm LG @a*ׂ3 : :<b(8XCnTo`гeVfl+]C-L`5#e$Adž <<gͣAJ-L$9B;oG pևZ5\\N(X3wh.mNǎMy/DuTrCg=OW|iq UUޏ2BW?E niādiqǾEگ@dG3Ua?۽3vH-UĨiVIw8ni*@w:,3xwn~ E'ja%PK{AKQ7dQVZ Db&eykF8A%T{aFf5T\uT6J b *!hxQ$Gl]XZAeHcNrO'Pt (ȇ5WgƸ~JVkC22Rkɣb4v{>,X'kgy_20?{3Mc`5Ė'Z)fIrZ$KA&tG seXb$L%oF'X>W(u.snRfέ{}_?tyv]]8՗I?қ}S2SyMl׿tqMϦ|K9͝k|T-{%ǫʹiQV=Vlґ1E=W&]Sn<F{\;dXm,.v[𫪨Aj<r5 $mC V1$f F@BHOi+` ̘`Ih71, i>Mys\]e>; vPM;wN s͌U]@9 6mt"6n\JK$e)1P<RH&,Ya&dHVUxK 495pfrtW\aZG`h]Aʞč*,Q`m)pvbla6 @.;{9GꠓTS.]b;\:Ĕpc'lYbǃTmx; 37"טqR 1%[rr Srpm!ȣւhI Q10IsmF,CN>(@oap)PːpQ(%hm]گԗf%fٞv߼ųYﶥ+O*huI+U*Y+"h$ʡ[ל=z|nPIk}6ʎbIXo]5Gnb:XUAOlR.ymu*σyuS6~%nr:_ J}Nr‡Gp,LJr CAw%3?( LƇW>d(#Lhy%2ZݵD!!ݵ(3! u<y72 0 % =(49"@&@ bS4LY.S)Sn vL T W7#' T<cC0%WSu>ՀJIˆC$2 @#ojl('0Rh",?ziy 9A߁ |2` k0"l_J0"4'Bu~rὶnQPx.=s;8֕ۀƞw*^sDӬPNт ̄ t] -pNqy, M#~b` l"# qU@>lp#`C KV=GX82D?GĿ&;Zb*cֽR7))E½9;CuF_TU7I$J$C"6p!s [)k5D?,ɪ<[VƬ p8B!M4AK{ cB\Dw ‚&uT@^= N-Ee[ "#0Ҁo 4!Ei䮤%į͛Y-L6>zs}QS+RVtꓫWߊ֛Yd@^%P` eSK[AB;ַl7ɕKCJBІiz?f.zkkka3QN5ۧ_ y.rNwv*;i\?et~83:a6+ M.}՛xo~Vc0!#nZb4NMTanX0bfT8*I(` wWMbfM9&:x,q,BV) FWHfF䛑2vBI9I=jI/-Cȭ7&vxFN#1cY- 4lumHI(1InLkh}FpVy3R3G|H7P>Y4Z)t}7)*9cJ9#N]񩓳=ݵ  ľ/A<hk - c#0Glb0WlPwy7{7_رy]3L^.c%ofh1qjt."FBEcr0 A +g8Nv^JE p#ň(EJ 'zme+rɎyb&EhrHY=#x8mٚgPmೕG{d . ]г[ݓ@.jW`"fmy.fr7R/ 7mִ /ԭӯ_}쩥w;0ylmˆTUn{[)ʳ6KSd%[6j=<f_ eZy2xAc$CeO`ab;$jna_l { x\ÖSX ( OOm1[9" -%Hjkc ,kF@(Z AD. b D04\eJel:~:R_`Px!є+VL@Ar!rg!yRs/S? i_QrN~+c-Ų=.a!鬒xg"_1#i;Bq$uI@9a&F&01/U$|(*hO)FCc~"|}Rױ/PS EJG]1in}Cv{a"^]aPvîc7JҜ , + `W>5Ґc*oCCTh!-V0bfnp" Q(8:}_eϡ7zc-̲!졂m!ODh`W=<'PG@ۆ b 8dO҉B^x]nd{la0 CM0#oo"g Gug,] ņ-c2YD&R,:(ӫP; BF0 c^qcBFF'ŒF B(͏7HAighmU^(iE2eJ #,da&p)_QJG٪:%qNi`<9_"!#pTffaThjL@#b_fh~?2Uga܏"*No|+:61}&Ti OdEs:#XR a9D8b?|PQ  G ]eved<ƴ: 5!T)-(r]- =u{~rgڱiiꃍ闥į[ϗZn]Ya4};˟km6[q۝*N-|uU;}s䥫m64jlh_8UTTs3V4yϼ>3W:L >}Moc3uON\Su g,ZlWҎ)e))W0L:K 8T0 ځ5! |99=hxxlH#_ 7d}3@Lb˖n]PeuxW4 ><)/v9Mg:CN)2SPU.3F#==w*?7\_@$ع{B_^=yOz 3lo(ЬF"M ~B*3&^ǒ h 2/ӓ"XzMgN^@ !o!tiΌW+9%rzJ<``ipTHA 0Q{|s/Ab?j؎w$H̪T}G~faT uɮ &fժ4 YPxZzi@.O`ZcDZpJ:2B"MDBbBCÿ<Mk@_kNP4!$*Z uu3/ԝYWwTjVnxF޺שWJǙklʟk39+ŤL0L!!teLy` %+3IUD'Ќu^w(?b#{S{^.iKb|˧^,zn)EW^کqw֘SSTbs?x*}60{?q-Ŷ~)%ZnX.`~A$HeT!!yb/ \}N bߍ`\4复1M l>F^ih+dH.ɩT3vqaD).Bw(ƣ6&zF~䢮8['$C93 D'icBx$~Jʱ1H0ǖّErkPb/c"ab1LӢ[VoWkd틍;Ml2_bcɜ1#l.#·glXUҷ5]-VZom{vpʞj8q}A^e׫Yv_ѾCuaѾ֪6#\Nn ;Hh?gf ڴğd꤈w&Fg\#fLNB="R*mD\UU xjA.6!B C䱅19T$jv]Dq&n ):yw()$_'RنD4 6"il\-Daא#RCl69} S1L`1xYφ!4dpA8MUG4ck\/E^Y 辉-|آ- ="BEU̟9YL__U$ⰙBRKrl4(IW*@Ry7o+%㋔yr۞,~-mqCDnt'_:}ѥms~/F׳?y'ԻEY`#m]oIڭN{Ts'J{ޣeӢ2=QQHVW8\f|6q?seI4%:m+9rZqjIf XB@\t,R{e-CD,, nXj`Mm#S*lv]I4ei8N_(G%zI 95wa>$MG/cjQ19NMdDg1f&,HrIW4 ,'/Lhq)7ST8Ҿ)b=MXs3")BA4R[aUFO2jc\Us~jm#oU.Mmuȉ 9X[èNNc&9|Gޓ pK>MeOa h˓3H4!xrb)U{~Ne< (p A<_ݑӻȤXn^~68J[3my3mledG1e|{inSԿm}UߥeY`<&髪Yr?lW )>`g+JSsK!deyԘ@j@e~l雹c1YFBQ!!ĭ*f#Ta 1l,@Hne|2c g59r&Pl]\܇sv|Y֨cP>B̥]}Q'?%:3ĥ jQ<%,h'^FtrU6'Brq;$0Y\L\%nʒ=n?~:pE{G|RUunUڗ_t%o4jk=-WfI|oSԝß) g' ,ҚZ)Zۯ[J4aԎNj\s%vKKﹼwV@E ҌlfHNpb_H;ce,Pf!u1bvxQBNiR"J7QȍBzNkأpK [l"*/{!; kp7OBC} HQ1k`d$Ws۳ =nXMAjƉ=I]WpH]\\0S7qj l3dlUD})SpWv] ^pDB# pe߀5348=]h6XŠ&426]|rWl(uZ E*F* {&.~|g _:dMFA&L#NjX.n<~tFn^:SGZ=3~.+)9BL`X6 (4\}3cfSҒW%29[zvUMn'YM5nisR /]Zrݾѣja͒'%g8Stvȸ>Z2\#19k;-gl \R&|!G%bLЩk\? zۚ(i))&[xKs/\)?Puƶh U:/*b.ݖqd_Bp-AQitMZӾ *)*6&e5Pq!ndd!2Vq%ŷ|Hanт) t:_ZmQʯ_K1G0( ,, RLD:t~B,(gXL~6yeUTK s9_Nvy+:zߧ?7 _!U?*qƺCORQԵEQ.~غ8vvZu\26MŴi񿧵Xf} 0<]6xRUMXC!x|L,LO yAԨ:Z0m->O3ÞuOxZIYKp;b\/t9Əb4rGJ61ګuLzS]Z>~|}6*Ur0P 45&9Gj^=,m`;Mu3!& BFOhE<,h[i*HI?(`fFd&"QrX?HXanL x 2|>eFgLz!D~S-v bUveƼٞfyxgqϔTϣݺ=X\}G5;=QqOf)i@Eksթե;Mq:kL{1cŊNm?sKޤU]>nLj֜E1^Qqzhsm8nK{#{ԝ :F< te]dcՁa1tlϚ=3tT}M &дܪ)+I}㹩Y 1,`:LzFzWMKc)>hTX'͏c5;PFͬШnSը_S5՚6TVQrU̙ɇ¸+f YDk1|J|ЬNi\&KGÁrNL[>.Own4hCV|8 ,P*&ibAAm9oS bK( oE.D,uPv!^&KkpV!l",+0( __w_y=UoesZq|UtUI>6")d]l׫u?z5}pJAlJ/^Τ_;%{2\Ӻ]Q~ ~D[ I}s)UT% @u^S!;2-zCj}f@F39А[ap9~yptu7GzxQKf' ͝4OJqD25H6h61JZ$9Ԡfuzw4uBKI$f31ɭC @'t[S$GO l*bXbdU5Qٯcu=/xJ=OrykV<72n#:Smw65ͪSv[NY،tSt/fǃ9ܶsБ´瞭f`OjKӸ.מ3(Vh)o #{Wwt8,Q4 ī;[ӨvSNKrY9ڜb^Ʀ\ iWꋹbb`B[w6ʘ?/aM`Tg\⺦;s'ܝ nĥ+Nt`]>y;3_"H{kXNgȸEFX9߽QܟZytMUq01.9hB{nWF(.*HcRWMn%$2>Cx3 //¬'  8 ?0A-W@AMHh 3e`[ALq_, 0d1Gd..F Y)1a >$&Lؒ0cL/ JD4-c躝k7CfJa|V7VQ{Z\ٷBz|7D3 ?EUN h;Z>2#+j_gv*ݰ6<&s8Wql/;RNNc[jgݺWh/~GJbܺ=ԯR#YF!m;IQReWϘTrDu Hź\)Bb3;_]Aˬ0fg̒9Ƭ= }WD]ҍ. Ӥ pz~ʇȋS IߝS=VZ hĨR-)LxKϵyz(# '߷ri2z41: L;zLaazCh(Ɓ]aU/[]N~q:n(+XR쉁BDjWUFh8WW*YX;L="a Ua !֎X\_WzB.L5TdUᏝU2=am4p#wT<48[NC)[0!RJCU; ;8QVȣG?;4 @}--G,{D̬Ƚ ġ:&54#U;a~<1 PjAR *˖s )نX7yZcz~n_w]Z[go]cB={TU&ޝ7=;Jb\*%WQ|;/($./AWW3Tzsfr )u(x0tOS/o,25Wn>pC6ڒ3tʧ2f9G ܹӝ_2bl(aigaNA+jեFZN'CS](!FGL冩",!_42A srxs_4 0ϡ͔Õ)6Rֻ\[n?YXErvkZ1J)chgZ#ЧOǟCR WIhyCo_[UE:.kl1)Dt;fK%Fڂ{ZQFS8RH4t=sREk.h}odv̭{6gY?Ֆ[JeqEPʪ\ {1db{NA XAweS>P7 @ 0t(~%٦xWź7Oڟs_mS+P[$dFnn}릪i~2קrQ_݃jjı |.hN4xȞ_C*O7hupt&f`A[?EÆuuȜ/@¡ztNvji$P&撲A=)޴ ]ڬi-rKWg8IӿU;RnS6t^.XnJ2ӝ_5',=ԡ=,WԨf_WNѹaIo _ys\};Ƈ CRm_h=瑄뺄nO_d}?#mՏ7^.~T6|Αv ^VDC1'{ fKmv'vܳ(R',5d\"WV>AUE$uE|PyO 쐋1eWUpOYൟ QGux /:j&q[6 tST2Z%::q:2^(.&kԪ4YCAURԔCѺv=F$ILƈ4%aoӒih:eloj_}"cVE~B2ΐ9xi{=HP2UJkh1j'iL~`y<,DZ:#>uy1۬ڮ5\ ,z0"}##}{#I~'b47+ݙS>H ,"ZRKL1`K49/nv >,۔Es6\=!ܳRG=΁=qT;H5 S'yˤܦͣW.J^?{_NrlN:xM1gcT)3{`}6w+}}NrS%%}=r,=;s`:ENAhoIC׫?a˛Q%Րo_*萷v}ʸb3t+uW9*z<7ז7 Τ ց1AHOOwkB}!|˭.j,vo3tOhtnek6E8;H֔+qez`o#Y!JRw Hg=,u}"xZ,q# ?KgIĪܴKK hK2|j*q|v7wTbZg?TqgE >F J%v4GleH+ a7zgF;nku&V8^Z⫱{䶥+јLd<{pѾddGE28܃ mJLm&yn4$-Hj\Œ0^YBRNH. a9(GƓ@秣<9-ԠKHƿ:[S>ͷT-Nz UI_>HƸp ~Osr*⧣(KqjcgmݾS˵/k ٞwQKK|y=BZV1KQQnxa? , Xx\aͰgaw*OYD$@!ar[(J\O#f s@rs*؛Rmh _" yWdR(Pn6fљfS3M^? 8RcD v VZ jB#L` 8S*6{7E b=j-9d#*IjlC?B3G-q5}OBԨ'Y+͋e*.;ˎZ[333-lؽ~>)7yӶ-ʢ V'~5-Pe4<apViZJBvΦP^= O6l&ֻFꥢPw#±`p5‹ZƲC[ơ-c[>)7tF?>^YU}XyJog'a۵:Ghtvg՜w, AP1'1||WʑHM ;0+V[[luvE$vL}UԩMcemI8[/SUTZgS~䦍nCtSk/~Q_ˉl64NfScSc|##"0^"n^^.CV d1 7)7 B:P d}5Aܴ<ү_^ jkƍn'ήt'՟g{]>Jnƍi [yg;Q~s}YG\~a~r:~j8ݡEjL:5Z_;㴬_ϛf0be[gb̈їaW}ԣRvه&(?f"Kx;Őhf#] |]e* ;2K; lfW^쏥/H%.!\SgKHQ,vwв F%,uSt0MeĻaN2(]i%I?6T4agYANI9`t>J!s@_3F:ȝF BC۴rԛwnHˉ}<cQc(\4g*}ϦQ.8 mZ$%9[EAR .ƙt!v`bSN'!Qd $X-{FDY`Y(x\4jPljWmx3Y.yW-GC͖P!Ѝago*L$pa#t a =nYd~4W5_9Îi\v&A:pgʾ^N㳓_:'NI_E)f!r9qFvFUU)"b7ElwN,o}'ѿG}w!ok0]û߿77RӅzw8Rݩ[j*nQ?[޲lu)Im<R0fM2&10A : y/4 yA DZ+4:AV=XQrF]>h]mco'AMw,=:;,v)~{U{[϶  @cWTPltdbTIDⴴyQql5T1ryz`VSx/Z%mxxLRf]O<]D jy#ʍm|H3UN㾞t޶?8칲'K@ Tgۢ`υ5є`F[lP%Rl'F8jѢJ-r{1It55YI)fId )kRZSN '4t܏ȶSX.UYu?;r6iN}&b֙?}y̓}j=@~siC*6T /XirlO__WZ.U(d{^=]pE 0QPZutrx{I(w_v!%Q(;!TeD<\PC`ͮ3ed Ԋ@[D)<M1 I!#Tig3 ] 6TLC~3^=m@i &"cͫ"8 .0\,Id8Тx8j ,/! 1ѓ`+y8ZV36lǟܗdC^<5.xvrɓy@Nbh ȜZ5 J,\';5'qF;=s9p^;ƃYn!^Io^Fl5{+G䤬Lݾ@Ux%D٪ݘu7w2+Y̱jMѳ&{Gvi8Mvȋ#S `L1D]W2=$3 G%xHҡD&ACF>-'tx= %k~]>W<AN&߉X2@:yZUgDtM':(2!6sW{&"6K$ǩv661)r%ѺTp7վʩ4uŦSa(>6aڤi7>_Ix[TeO>t5ܖK|W;ܨ>|AUl*p-NePzZ&"2{)"wySMs/5⅋"OWᅰ# n `|/Ç~8'qHGzE͡u]5KH68!p[,!2[2ҷ7'|{:S<9Rcenkͽ3Vp窣 1sz좞~=sd;|)KHirԻYGfAQn1D8;hLľDg a#D 1l\BC]t!F-s -`D58"> jDV[bukQrjT\`]8d2&#ɀVO9k\)7 ֔w !($1g.&(ĵNvh AϜ WT(!ε~?@"G1;j*F- UmQ]G0hGv׼gUnHid.!Km=NBhi>ƃxes$J\mcS9]_? © U']7d"L&hZ'&bR}d(&bBپ |\9fP7 1w`<o@-0oDR;x\Z>EHtf 60Fue,D3cv7T 18 䗂迊Xc?Ac.wܵ(}ڃO]?7M/N9d]Rn>ujKԵj# BuraN'RZJ}G6?45ml^znIͯ>/jqt{oQw*?OʹKYse:sck^S y`3m>89_)+Nx;NZ %@MQd, yA1(Xځ҆1A hb2/sP4G?5Z0wჷ@@BSe@ }DG )(p"> P !XO`NEt(wp)QDZYmTX qKJO $A7$K0M NP h$D) LK OpJ0%jZP)`(!4tQ|}P_ %X VK)Sa$$`W %"H"%X Cp!-„(pF= Z(Y^kOU_7s6&h2za5{zr zn+s0Ȑ^$4"T$A%J@Vw?P׌-p@ vdT@%ĬЊ@KmcV; py,1u.&ϓ-K;RФK;FMnW^;zf=ҿŚ5ϛao|k]UnX+9rbj"3voe 7wv- [y̧kl5kXhE7?sullV,ސ _| Jry22/V}[Y B|lWT~bݕ~G&tj=-/ѣh-_0+ Qq -St%2& p:[ôK.0)0& @Q`mDLGDH:sQ|} ggSa/@BJ e$bXX?>{Evt jHN1հ,ňd č,*8hAI&Yb"ANc8$wƛ./aW@)CPlо3gƐw^{*SҠà-2`ZHL΄|xX1 0n17!K) k@BMQ0 (?D)*(dYI"MP1h\d-JHauF-ق'DP&1^j"!ю )6`zuGsٰ-CƗgٗZrur]$83!Oۓ$Β9(x1k*Md\-Tx$dE!ESjнO@lK `TP|@QR YP* *S-:v( TPrIp Ja :vo,y#_)ޭ8aǿZ n~O͙Teݧ n͓nw̍8x`pՍ!Ұhw3fyoٓY:_8*:N℟In{G-rM<:ĺpwJ]+T֯[Q5l";n^Ӓ]duxIQn;Vd:dg^oq4Zq}N 8PS4Gd` iBď{c] *S"0I$(r.~JHµGZC6 *B8%eIޓz a)"*H%`F# " \'xu8`@{- wY!1FށY-aHr@PHׁ}lT`ġ 2/&cm&BGGBc9}gݯq޾*`$?`~ |(֤kreJL65HՏtE@җDw4$=D9ko2YMes.'\FIEtL5(qdG36@UFT2lspm("Y%L pRÌ ʅ/,! v5{Қ\D>OޭٸG\lmGe]6s7?ӹƌ.6+˧z6R@=-F=Gm[\%;6>qiU/ .zj۔sʷ:tU*y-p++ Og5ۂϪv}g_jb0eƝ-(͗6;o.Mr: Ad+F (ᒀKD &v4X-6$6'fxTX{"/v@0jR8g Fa FCn":4 > \]9 3򦙼 Y2^<-"ɚIձ*Gb1H8ARJv:A3ޤ18f%PUu p ϸ` wXi !Xlf G@,Qw~I} Pְ_U67W,+*w"yBQ\\4˫h7M" y J펊Шb PО`U.JBP)$԰@A+ʸr$Pχdx/AwB>|]DHepqmzZ;4}৾0LJp|ѱSyfW;\N'@o4`2h/%e9P4D:rtNh+ьI Y%+Y6&xN0>` 2H!Q3"?'䌯: MYaXl"%U2t)3׷-8f1h?$L:?0S2՞3T].t\`T`]>zPuhAAaso0g%,rNǾ5Q׿7}B >d[Sz~O ;x߰hytY`Gklj!>D#歵fJϐlfm|#ɹgEQ}ruIapLv7nGJ,fX2K`$I)j+r}aON?$_Mñ7ɶ]y$/jd|%̈́͹T4ef8M#ܠĆ3Ű{ k1z%.Ȗ&uM2OFqA & d]ȑ1<bG?rLKɍ &DRrH;d|zтt%&p" 0IabCA%&,[@TE==I pi"8I%4{M~[CĒ є^ln[tQ'~M3;eהM 7/"W̆[b){J=&4)EȺ5ؿeq4+9+@ p5z 0= <헕0ǡl7'f4ꍓP  ѢG#]j~2;mUމ6ӌYu[k6QS_U| Ek?RJOkg[61=lx׻fyt6|G:ug>Uן$}Skd,T'Ot&w}B9GM LF2eŴ8-o}fØy H]il_ 6XTdp_ 2}&C6fk*"-GŗW .:,l;0pL %.};zP9l{Z ꌎ;K,N>{Qj驷2N)ګ2$pg7ڨ 6xS;X3C \rT$}P='㺧{`L(U?9- ^CxƁCu!8u+dKp-߼ioOox{*:?7wvoY Y<8P=n욃<}ո+LSrs[o~ꮿƇ 8޿qZl懤ޚ3pF?V> .Hzۛ/oӠIH!Qխ;ҩ:Ynw0e/Q.k~:=9̪AQs9[#7jᛣ[E\6Y19Lp$~J,%Xd\QAPTxViA&;i =lJEZv$Z/3Q$mN`-F?1:Rw"qrg󂘜gczgGUiY8H'ZWq9(v ތw8脗[Rowc}Q%/._g _gxlNmLN_tu۴b*K~~s?j-\<,vVC 9Yq6 -8tYGڼ\?VKߗ55kL?V@{-7 *M Gq<0hg y v.{Mvzow_Go?oFuO;{oe?<5#xmb[K %:2W0"GcQr 6AG$/ឿ鎹 /R[{=wޱf)G,h/4k|yoo~]]Vvmv~^w}{-eRf;Y)y}Wi}ߺtޛEw|Am_rϯ{m7?~y|2Z{]|?ZY <7{hVz۵:m^~eM:˳jhbo*gL9?k8zM c_֙=7*0i3 @`{TpCNpaC{ ?ف˝( D(zshqbfSxdИDb8<ަlpUP"`Y Ŝ HR@pU\0cU+b  BP խz<~}ow~p3W_Ivv13ȿ{}w_߿?]{X6-9DQRUH``ȋ t[ gvz^J f߰^io}n?woKwŴ}hbL !P H@A@ @QD 0 )A0@JAYhDi "(I@@  "A<" ገUb@8 P B@K aqqqqqq   $I$I$I$I$J$(((((,(,,,,,,,,, ,, , ,, , 000 , 0 , , 0,0 0 , 4L, 0 0 0 4 0 4 0 0 4 0 0 0 0 0M0 4 0 4 0 0 0L0 4 0 0 4 4L4 4 0 4L0L4L4Í0 4L0M4M4N8M0 0L4L4M4M4M0 0M4M4M0L4M4M4M0N4M0L@M0M5M4Ӑ4M4Ӎ4M0M8O8Ӎ4Ӎ8 4M4P888N4N8O4@<ӏ4O44@A4N88Ӎ8<484N889<448N8N@48 84<48< 89 <8N9@;@889N@4<ӎ8@<88P8M= < 88N@8M8<@ӏ84<8<89=4<<=<98@NA4@O@N<9<Ӏ8<@=884<<@@8@8<=@98A@@MA=CACCACA;;@AAC;<P?4?A<CCA;C?APC$C?C#@>CA P;CCC?Cd>@?C? Cd?@P@AC@@?CA;C;C=CCA@PCCRzLA9Jx06ŏD4hP#Np:2i|˶ BxfonB.RYEK)5::%;_7@ w $|<'uZMEYpmr艫ҝRNP5ù)ڈZ6!Y` @S5!\+~Ώ((RH5`Ħ=͑Zڛou_oDZ,*9T.&rKviIO x #>"#dFo%oF^, D8q:Ü 1 PTay tpNF!!\2gFN^w$ڿ&7K gѥW n/Ҭg=:o Uk 7쫖²uVcǍg~)INAľhY̐.t(CT@P4$#Ad A&:^>q<ǴV X yx(S փ)!<αO&l;P#AO*4`y BY-Hy_Co!P{J>tL'.+F2 a F/<"?N]^-DŽc㇖O${(>&6b UR]& Fd:s^j̋LovctLJ9C(iuJDLY 'TN(WїN y>!^M&w8%~}afɚ[x>b8kρ=]es~MnSNZs1.ogPWวU6d'j}SԞgeRrs|Kz RcfLOpr?;I݉F!5+88f;>ȥsYOU2p (I ,i‰4@ 0(=0y;X% &ѐ_,S{u77Fi %/qve UD, TɸKKx 9 XL.n4aE \oB">dnMÊ{Np!,gq7R>"0I ¥F8(dF=ea{vq0CEk('ys244 (CˀV)n7Yʻf^CV+M>8d+h}憎ڌF,{^Z7k?vxtХNhcgYAҋt$5S\2Vd9 )E x=rgHHكI蕢ϑ  ].B!ne~ A :/8JUI#}̰(1 A8ںٲο;DR%x dr*$ɣ.>]$*fW:;+Ei|RdhuD>mb`^VN4p޼pMo\#rC\RɄ{}n9ٳ;CJsMWѧ=*yG{5+xq7Io܆rlm<6=<X wSf="nrWd\ ._&2.t.|i*Cj2їS8*ib " bE ӎH] #H(&j{BIT$T+1`q @W^ᡑb(Wl2cAijBm6W3]pA B5j 7TTZ.ZX$0ϓ0ߐpŴ14/'B.:16#_{C03QIKhC0R Yh|M͵Ms'9HFǾQW3Z?Ks lR]X4r>+&F]h5 :軛Gy#D3BB7(>bo!rb ,LSk硆g]^i2?ACLĚ <#zB Q7^LY~3]}- r%(/N-Y]=/z[yONѵM_. Ko.3{C2R56~rD!Yr5^3KfɧXHS7|A&>|)$ouH㭀 ǜ :ۂyd*34 yU+έ(8B"Tzm!y$k5b'EHT#7nh܇1IaHA%$8f澺CE\RmWgHIup0AggQreFA;*MJ@$>Z{bX))-,Ë$CC;XɆʰWZՂ?dq?Ui@/cϼ Pk]*,ў龨Y#I| ^5q0h%5r Lq!n` @\T X,/N "~ G YJqmI?12/}\҈pFA}!5 t +jvI?oX4zؓ5Mb :}ci&oqT AaZ2nJHMRa8l"U /!4 A ]"2As)ND<#aj !Ik0N6.GlpE,ݭ+LPWw$ɸA$'M;<б 0"9 MClFjF/Iew.63Wzi;8MXƓL *hһM~ӗ\[_zdO6v%j_uT7IvA+VԒ)J'ڑ&g -hAk CȚƊ)YpGЇOȖ`n8l] Oe Ljؓ.%JvFKN24)n۩X[xN F+?;@ԱUf@-ʗiY=ՠ(eJϥȻ\E%[Uw8C5!%mT HTHVT>Ϧ!vLDbYpfcjDfyLdK10H唐ئPcG38g1DܧkSuU`舟S[Wtkˍ|/4!'5ժ!x ص50<2BĬucSlL:qBa7#|k`H +v8nOj!#{GM7NibT¾hG;,Bv>tjϔ5X@(=~.nY9סMCN'- ӓ\n]Ye_Fج_Ry٧aUg]ϩ;oNto&,Y2e,:N3j{=}>S [/,u͕{\K ^ 9ؖA>.@: 1q x4/BA#R2&Y*q'0~&*K;b@[iS(x9z]h<x;WSYx@P#H>305gN&3,f]3h44El^q>hYw`m*>A-CRe \! B{vӶG45v&+Y?9a$C\] 97_ƴ~E+L9pQ8&n#$Bn7! |Mc1A{o_'X(wYxNcQsv{Ɖ_rj=iqBژ~U {uŻ䢊yY'Kء-Y*k!P p 3*>5]FZ+$$QHWDi,08K.֛) iH3ZMV=SlH퐢X[[LtOimѿX$n&?MƄh?b'4?̭) Xpl8-jTvA06D+ld:e5޼WvSY8ג#\Mv}hxZrj5`lMxέp'W鑛K]S|tORAqTNH~iW=w[j։ӢmS=eCBnʃ`tdFTT ANr,B8 ¢zfß\`hS3$-8N)Շd%E$(V;E?P.\\)f6A4LV5ј?j-m* t#U:';,Ϧgczc ewIm3yJ< DLb$@V,#]gH"rP>XwHnh?LMJ?Ok}56j'r9 +<łfZ %;=Tq M(9r ăJb;~ "F `A ~8mRq$BsҖ W R Nz 5:GnjѾpxwfo GU¹ Ȋ8 s#F|FJ,Y3d9cujYo&kPOJ4n9%E\Es|]Jvu^Rkgoו[-W8nƌcIzpQ_u׬o25nmksW*s cx2,3- X̀ C2|:wFMV8,䭶T:C#`31 p2$ j7r܅T_Q-}0(t,n`9C,tFo n:09Q]g%o_l 45noRia]|@3A (MofޢD޼=B/*tBֲ]:IPc-2;ڍjG*&m9v m{ヮ/M+=,)qceK_M Hפhdt%]'E+r ~mHZrz`$}VTҳREE1@Gh!XJoZ͑Fws$Tnytպ>ݷPm+1w[ylK~=36N/i ލ1j45N+s㧛ȽS9sږ'zSTkyRة:(@SƟ Mq/(ϧJcKG1?רwxQ:t5?,|^g|ܥĵQ0sT%x)x> 36v$p)2>{@a;^,yAn[v.넦%Ÿ)fiy[&" г@JEt6 DH.+dHa(0,bMD*ɀT1 FPt2VH`ؔ"3#kIֱJB*thSAIaɢR0(ܣ\Hq鸌C)?C/5Hȹ^121D*ϙ\ѮhNЋٶE&dc+΅^̉6ȒÙZ$b%3O$ԗGO"$dZ(ag=iuYSӛvlT I,W秚3e'ieNT"BH')"P1 c7\?PtzR5ٺ#й?̎LX|Lth;y)\`=Jzߢs8nǖj+T+O.$;x\VhOCo#GH:<_y%L`Gd^dAR.Sw)b+/"ؔ8\ޚ?/vqݲ{=r]n< /uV75Sfk#wӻK.O"URxB鬱ʅK>.!d?G,LAAd5a!PS&ExB;7Q=LKs٧[R=S@J]zE}4lY ^i0`ՑP0Y)4.'2[0q TQ9;v5Il_Q3f~7'M//+_~ynjWpͯt0TT&MSVgSԤo6h*U],#/ 5" wۚhz-S+Yd_B)Iʯ;~CndKQNQSؔlhy>$Fup^UXz63'mVTI)ʊn9K$o見2F@B*g3ZVe(Pd 5EK.#8]c"`|P>u9$Mc5Vٯy"GɆf}7j6U>o 7921Xu}/-}13?Y-jLTV^Q"%;Dsnw!3º}8o7 wɨt|8ӗ;h>fY"l5l\ir|MXxPzh|kC2a+*"MJa3/ŐsO`p/h At bj,2B grl<' d!`\ dZ @+|Ml`]"EAeJxz%N>T$z0}CE+#S,V]ı_̱SI=uprcvGT&r.l *>1,@ˏ34?0ђrlHP3 n5OײbTWGpC${y fC!֠)8^ 9a R.>H 䒥G,5d]͛UXƒc ! LznGl4[L#PGH=`R)0䂋x'ܻzeTx08z'1TIJp\Hvq%lq;",_ 0cKh~8^g }lIl>*f+|xݻR݊Q\%HѦiKH$wЬyK|b፨R w'znJ|^-YPߩ !2h}|nފ;֝*G3mpȶhgi{ذiÏYplOti#ZvlSw67ˏWځDpy:;%@F!YGpR]H7遃Ȗe+=iv*jG`=w{qXQ)W-ak;* GIv?\3y>6n TM 2I ՍfhqAѦűQ3u>w#jfˢ[S_?O>7n{X&{~zbMn]hx]߇c%MjuN)ԍiP׶_:k%Yi߽WE憗9`ܶf_͜:ٻmQV >:oz?noJ| DK(,q6!jBoG"pa{ P &m s#2e'2C?WĮk 'ѓ}o@, hkZH*N C&SK`@5M:"j17Un/b5\|҇LiUS롸X3 [gi觟46@vHi1 iO*t*䞆F)E/)YS>[leO. bP]| 2KXҔ-\Ah!(;DlS@}v}V]ZSxPZMM=U^<2;\].(n7k+C-dz\ d81&~vjk mQߜ'Fiևoϝ8<)XwcW|F:hC&0KKJDio>~Ok#{I.txTfłp3$ +D`ŒIۅBnƦ25b+eMrł5h.,`l,AXÅވ*`qM远G,b6N7Uק*e~!Z~fm_{2 F /z U%akQ2+)8պvsb%==Ū7b7O*'AN!`K/ -d YU)(N^#׋OpS@|M:A+c=Gʍy r@vD 5xl'7 7 #n{FPP~oz !( ;aƌlٌ?'<=ca /z'&ԧ^S)(">Bxb&BO#V dd H0c0 .$@ \i3}z+1U`%/0+.ڝ'8EzfM\865ytjke%ՕY~Šsm0tܩv=CӺŌ݁I (3h$ .Bx`Hk9 g:F[bREtiUvj<yb b~pF*i=#o>%@J#LJ<!1PFl%=) ouTbT0{ l0L(&O:zM7ivJGPQxHilW/[}+MQq{}zmM<⾏`l&SB xk -a?:=Wy7Hx+ C<֘zR oYz\o{/<S\(Eθ[fsgsr 5[6x?Fp h? qoɁG(S 똞(C|WaiF y0,#"xHPj(]Q!Qa«o]@33!B OࣉLp x-B6g$ lR;‚41t ޸ BMb#KZ#Joe$b*XuA^.AF#ox5SYh"ouEkV8݄WĿJYR9{C#ڧ{-ҥ#׏! G(mwË^&"FކY/bZay>03`Io؏ p'1 +͍TgkWh,|&ac+A H5'0AG<hGXR+v$9t!B8"5.SHqD|x?v"24R- mJkwtj(R~O{;/d@07N&D+ \j1lͦ| '+H?sbJLh2cU89Yp2! O{~V\St\g^>l KJ;7#~{x{{ 8 W?| $V#Z%~_]m|{ ƏJi5fAȊ h2,H @Av 17u)d 35Gf/O:ү90#1@Q)G)R> @dƆ|I?b3@"l2pr&uJЧΰQΘѼMhzM%3<">L5`ɮYY&8Tq0|2܎#;DX)siqmc5ލlkd(R}a XGk 4O&ah/2= cT52W&uG9C|Fl#;0L!cɪ#E@qR!E+bzj}1ɋR}ǴY-!j+2J0".^ ƖL,~U0Z$_, HHzsy26d{JrӵJ{>M"ں>\SI=6u~uLPmyd<5& D?P*EFKtk2܏S"~NQKH9U6\Q>~ N2:ޝLX|kMmUYn^9Rgʞ;J_/I3FicyPxx bՍ#\}"X*q,HihLc+Y x#e" +IK_ <:11֥h6J^jքA2b3y<8%ǖ xTF Z8Ʈ @IɌ*^'mWj ^0n BC543ZL ! ,=yh$2 A n,e|4!ҋu= i l^6?hӃ^NyZ7+Vj"dͪ-I- Y'EVY2B"oHGQ@0 iGO0/׼ڧ ezM tzkEVJ5\gNj* Kgb +;I]~z=(V6DU8ag,b:+>P!H(1j ۹~4^+O痧7]M(o/F+G;5jEyW5(efrCAgG\n]3shӷ}vɳuG1t HZ&伍9X޳a})s @b*TRxKȌb/ 0mDtp@ . Мl((B qDPk8 b;:du(eK$Lxܶ㣓SM)R"Sog#Ȟ7}Swb4 ƥ.@#EVvO7.&"{ɲ!e6}9r)tK{UxѢ _ ۛQ ;˩꛽WɑVm߲Nkpǣ[bjlj:x9孒+;؛&CTzYp_2VJ Fe$ۗQ41 P-?9zj;}U^B=Q|/zƒwCk޲G mqP|=*#N:x.U̽^4Csc܀ќt&ív <:ũ";5U‡(lp]bfT1uփlKGM"È(9#jC2EVE5lݫ|F8q!`+$n50%[ᰰȣA b^Aa 6b/t tߋsѱLj7y{ە4|t/>:wt'pMieSb=iN5ҀEXhxՍ.(hn.C?Z).ů%n&&,#GG /…_e|+}'3!ZS\(0[37Eb$xD TUi$i%N!,c 4*'\rpigڃ R>1$ T  ?ӵSM]_<; vT8MJs ^iaSߵR q~ch 2vfLa0 d v!/s" Q0o"ϐl` pQ"ïL֎Pal"#'8%)jΤWT]>>`iAI +Ey oRی\4ܜ>Ylɒ=IhdX0Xv_yTC mĵgMfC@?btc3Dp,ܭ 0SOk)pQ.&:zW{+Hb1) >/K&R_s`;A (2~) ,X6ulTs2$|0Cˠ]&%L'&# hU E_$G2٬ Ո\}v;i,{%q.n" |쐌E],VP@J"o4p$8(p:(ڰ+^QK@<>aFA&y90XEF<8X8p?K ZuҠ$?7ll?3zLZK?шD|pJC>֢ t6c9*qYA[++RJ}J\Mk3.qvSk4>@Б6 1&6H%̥d@T=pc {fVO,Tq['e RC~B3dn%t$66vXɢϜǼ) t[T~l+WFce"{{ۚ祻Y2~x/s?Ƭy_kLF'_]rCJՈnivcΙJ3{A/0$/ `}pF D᱌(8 9ὓ k$RmEgTp" z_8fk&*qpy{Lf?~ 9l7Fk#&$N+k@S%<'0IRaݚJxYgȿ1cuv}xM5A N*$,jR&Kfmլh@XPBcCf_)zyvKʗ/.ێ0 Axd$;ȳ̃R!7'`C:ν>ȿ`'oڞJLKXb _GLFAB0y3*C(pd,1\5d!Rr\Crچ B"󉋚,Mǽ a~EN"4SB6;pzύJ\RGsn\#I9l--|񇤒Ԃ*R5d,+L r8nLO[WVLiEV 3S~B A"e{R&9`܂f#Ώ`Q`*-ƇWT WSvJVE3U`uK jiLY̨fUë=}1%L^;Ko1,0+&m{{Ë ы1@h/X{ <ಹ/(0'M6^Xʤҳ|@ø^UCM݋ET:U,wM`C(AU 倌*TK't@-qCC C, eZ͢Os7=^L8b'/n) */XJ9Šm;~sͽp֜WQf5 ٣}AҼo|.1KxfXpbѼg3vtFZ; \gSST'yH_j'a#f)d1酎ُsPCS쁞ָ:P"| >y"tWa:h0B>E!8Ex#~t~p ݕBJEڰ lHȜU 6tBc  idAM>rUL]\mYon엠7:,fo ڮg3xoc|!߸V/=^D]=F ~Y>azܠFԞGN|g%.D _="F1/E4}rْ9FFJ>F9}Iϓd)4_b2ӷv\ɡc^Mۋf藟P^ šp `A %|&q d톲fgszV3Fy@1N *OE82@Tddn{oIH3Ia0&C @M yI#d0 %Ex ӧ&b2fcHr ]&\ wnxq4v_('ܙȿ4m,'3 OmLtI/6cmOsb F'Zc9,Eæ5T쟤 q vh|)ײ,(1LBIR/{TE:$☖EmU$A e&=Y$V"p$AA0?G;o{_5NFlL{y6QJ ^I `M`{{~ 4cwEHoTemu:~q4M~G1 1qt˳,~|nlr락7P"sba> T3 2?H dgtOPfmg.zV+Zx,!á!—9J !t%T;bđgx04tLZyxg:N̻f25WU+gfB).P ,qR~p]ʣ}ۭ3lD`=O5:-W=8R"JlbLSyfoksRT3̲,*x1+TKNl=g~]a&*|A׻e넿NxgH{e&Nk|x-UJ[gK?*‹Ld_[#GL}k9(R̳ݏ[>'-gm-GXj~Rf6>);b6SUr/xfXMu!-С+ߦSYٞnU}~_X_%ܘ>?kSd $Kb-h-]dRIɈ-熗4c< }ia``$n$e&(͢U`Q I?ލc ǹ=; 頜->!?H= |1H2w'1Ν-D8QFe!p‡QxoET55,vtЫPn0hv<|ύ#*i)ȔEd,"pPDЂqw*0 h%k4o0%`Dt)<EWPke숮vwgМ0 ՛,wod{gLY(*ƍ!fUfrOh=kPt݈ZX|q}ͣL5++F-񛭍mOnQ(K6 FQ2ߵ}" !(7j[8^ʴ N`{:rAQL=əL ?UD bm3d@6E(lyWL&Goruݞ7P~JQ*jD-;;To*]Y-qjͿTo^ƩMQ|zj?^f*#T3Y"=^ƹO㣛~J**'eiȝǍ?ICކW4;*/Te|hb0٤ŭPR?$~xb.C-n2`\E-Cx\0K3W_[Sc(KAmLI!U * ;fd.h 5 P C!R: ܇Gy)&Stuեj p>w/f,s#.R$lPwH4 >J%xB4+\B5gPa+D$x(~][~0nC`bue c0kؑ6I(tJ8Ŵe!YD:d9#)or8"BU(g>qΝƣ6#Ow^n;"T2(@[FЗB%uMk0KҀ3$FP_Ȗ*~`.!=*<玽s3%5g&?;D*\ zkN'RsߛSoQkwK[^X4~v6 Y됎½,HoHj@*g2B$0ai%CXA/B0/졀Fx .Na#=TDHG"ɆRf-( jJ̤4ҕ!f¬)CAd\_=@EdB 퀽[k+g椮ȍn1¥j>oËV0y'I["`0Apq`=L5V)kawnB$}I3:DoAn4Y%FG7*[J~a$s |Afa;_x+#"pDȖ`/V:1|z4~O I#LiET qe.˷RVTOcʗ8I!Ci)zI_|i1 䇠Նq;Gȡ(V Yu(npTI"F utI%н@b 9 i!{a03t?(kwr z~M6l;̾zKjOW U.0X FM4h$KZZ4쨐R%yAǜ^~m7̾lCҿcO#0PaA oa@F4 Iȉ%SKællOIa^[򇞱 |`D:?% φ{}x=I|[=DAZ1|5*ܑEd0L0 6on딟HvԚrc*/3#O1;U Y'$R#>?;-V"uN0HhA0`p[ p:m'1"v+ 흓H}0ŒI c'nж"%r' 3Ul\͛7#SDfѳ_6~벖IRz(#f粱b;pKظ?MB{\R34Ҳ $opǸzlke]Ll'9sY%<+8ᑏr+iյoě˵Z7{33Mօf̤͎ FmS rHf) .22"XDFTZA7[%ХkPy`hu}9P wxlM p݈f,zәj @ Uf h3ANm$;Nqf%չMN5]͖D?E^(SoƷ縵#NbuOr[kgjrc^}? K&@5ƙq~BqNBN[SM<[Fi${Hޫ%4 bO<;c_ġ)nθs:ʗ#ɟo%;|G13>2 k䠞R6p_A;#Mr`8pHä7'8(F'kϻAد]V1&Ri#Ð/A~uшbh,7g9.MY{nka)U#-ۻ&f:>;u3 Jj$?H &9⟊Y !!tVۓqV;V'^ A1u٪T=Re,;^lPwBvETÛ֫yfC%dVqt:Dc?ȑu[UcTtK#-(y.;ȩJlMl hcY+Fj:j?ViQHAD8Q"&H]DQnYOIծ¿ʺ3dDԪd^=h鮵_GM5]+eo8@470hȱ>mOoƖ62͖o?݃10R\R+lTkemx~/,Ք7]6?-*YWq(U`4j\L*r#Z@A"W#'#W1XH0T/Z%h?hSH"%tiEW |TvCoYNi~c]aGub&*nq՗j{Nq#Ȝ7B֟t^5b2r2lllTZ-ϰg]ʯM\, 6?0@I- u)!pA]=uáq_QB c߶UهِR4Qh mCM;H-BNHy NZk$#x |:FD҅GJ 2ܚi$&B(Y D9ҭB5BNj3ykX|蠄 n֑ʄJTU*L]/?CdiLzb{hwĜ8鿷c]< [%piY@6NIP2\xRUȫ !Kl# hB? Tƫs-D9 h#tD0 ,y p5٨k^qNמ|qw㶆'uy./|=oѢ$3 4#1\3%G(%=#!P!5pUd@"4 t(e)3 1ot> *SQ2$ nIckg|^I"k 6ay:Qnb9T7zק;J<1oٛC3]{\ΐXT['9)EF++&V>Xkj\Dob7m͛d:oQgcW-!zpU]>=Zw0R2ʫҿu=#bվcfLM%"b' $^! >! d4D}߼:,{r'P+NRFy,&bb"E0J*E~p#kw{5c{{aw;sVm0wK-utNs1,~!gTݜ*quTNr Otyei՛6-?GKh\]B H8ɜ%+C+PN ؓfwo#0*-ArAtȫR_k0!A>^ 6l}qZ+̹֝cL7]q;;NOc\ʽeiVm"r9<2wKz=}-!mCJmh{4ahwg yIѸ&q^u5St4>bQZ[ 9/ҍ3ïd!My:e䫚GC" dP;"E7PRQX M47Yu*S R\YU/#o`SGdB/c88DV43$tomWo#.бmSĸf;~ӻ֞!vo9/ü瑅 rx…k>3:tRTo 9*@1= XB]<Ή̑_"H ( L馸5Uz,L #p eP:4 -@ZJn M\ ,.qOя_LneHHBeuQY;:}JVFU ui#FYDAF||7V"V$1Ӡfu4q\~J`   80RkHI:  (Fa+0NUƬyY" lŋ:VX|\8xl6Givw#QӦlO;y=;Tg]pYjn KQĭm"MIIVcFY)ii Zߦ+_M'F2N_pooSooXl>HmNLE^ִ;t+/ 5,a-EN7ewS)ʟ.parSRY}8>X7ZX)h i/Ps) a/r|mCGlC3z1Ռ5ACg'@ 5kፑc $hλJ#5نǑwk7Wz"-hkb#T;eַW\l JdVڞ/Ό=}ZOi}0Ojܝs M-2p϶ W3Kxǧ~:h0EJ}k{eHel<1sC0Ud)17)_OdTୱeGU(G"MP)$"$L3VuJDFbKEJ^' ѶDcV}3쾽yBG\@wxžj5зKbʀI4f2c Oι,l C~~+zk*v爦I3._m>, G!ךݶ7706T/|b^PDfErEuwru v{V>l* v@*}fseLgwtЅ(VS 2jSgv@Qx.ݲPz7aƘJZu2lmI_Qi,`u\Mb$\.oRG֑p~@QdiġiLovA- ~r6N;sllg]4ܺgX<]t]!E;+|%DUi1Mn qAp˒yYP6+!G£ T6xCTp7`ΒEO• :~g *MPLrq,Qy-.>pu?TsdEҚH'WhxxffϮ)._տTBݘKj7R&s|{^9[-N<8zݣt7Sw^؆^S0l38m:F-]62$7.Lu{.T'׬S9݁}SBU\sS5pCB-B 8  Ni.sǛ/8=iW.1:bSW[&FGMnq&$'"H2BCG^2PO I| Sfu3'ة{ϯ(gth;ƆhS%_OϽgRwCZmbۜ>у&еErC:Ƀ;ԨY:.kK֨H_j&xo4əJ+o`NJMQ)fP"^O!<3¹#rNcJ0%Eh`$ F H"Jr)ob^( xJ.- ƾ!M.*|£i@ )Z`P^8 ̀-oI X YWD3{rx/m3XmmhW%L-Xo~zϘJc_, }͡zUg_CXg UXlqxU}z)yvbˆ^D;W l>RMxQ5R􉾬5oTrPTʭ37>vz/BSJGLf2-FKݺHa8zS P%ކ ,0rW:Gi8 mIplAoa˙/"*XzWڧUiH@N TR`tJ#o#:3#~i1%p?y>oBFHH(kѳ`ʊ@dV&1N^ ;BL//byB)Ӭ1K=vJnZǖ=V5mH UW+Kzl+Z)z8B==IfJQá(^Ҫ H¥t D(P,TKƄ{B /j2$7ŔpdƄ@?7|hPDBXwA5|/ЮӰm)6sY;i)ı:yrN$=c.n2d@nlXBx0])-K,вQGGߜ\puhZQVB*;JTFHB 1@a@;+RtoU2eCDzP #p|7pSJzK9CJ210 ɥN2m.8G1N^li۸ //i}N7ml߫[y'kMQuE KkXmm2G֯ :}[ ꙲hQCkCY9fLιdB?"C7W~xkosk>؝7uߚ՟<+FHOmb>CKrZT-1qNqf ]6VI08-~3'/2K gNPe g0P? 0:j<};:Cf[>)м(|2e)\v=9snͮ 33 V]+N|gp^'wg}-z+v-W"tFҶ 4][QXiݸ0ػ熌]HNDT(!Md53!(H*d,dw׆ۃsԞ_yE1,h7u$N* u 3zG'S!Q| ( J21_@`$s 0lD^ @(ƚ@Ox:~ lH[m`Sm4/' %*!R 6$=C~RYSMXjĩR6a$~ MKtn~p'މ;'ZfK \EhϰrՃ]EnKǧv'L}"$$Nm+P>dT1ۓEb]T@4JQWxX{;UKys~$\d V!fAr%|!(93@if: 蘇)X` fH͢bNTp+&{50,/Ỵv}Ffoi2?9u_>4'eZ4ݼ7W$lTO^D1hR36O"}]Q 9}3 :;]z'/ FfۼYmS0"ɽQ?N6tfu?_t},z"}QunࡑVS1\RT5+x~?&H| 5 4q+]qB^ ~S@Q@!7@6[NXf@0)DM`z:x:&Q aיsuͿPޔ=0umk7>T3G6Ym!AV)?҅T/ݡ.N_ mٍq[&+KD͟Ch. PUܠEFv1%s-R\༒+PB/{Ľ6O@4h5x^$f7>Xx{*23(4"O*%ͽ f̤d/g $ AH(UF\[F,4rtz*里JK9)9O!u;lGFG=3Z*63+){6RhH2w=۟"2W:HՊRЋFN/2͵Dog>~+M+LV$mmS^ FyQ, ?bʘ]q@L,Q SA-76kXNH5F*d4`ZNڒD`$tx@_Bx=7Cj;W!p:"Pn`MAU#$aWᇈ Ch 8`آʠo``&y%H˷&>BZ<㏐488n߶sM IQ7l{JŎ'.~-8H0)/Q=J_ɩ&d ' ]m:4ɳ,Wb(H:A"or3*]ȿkU4]7 \XƛH"W %=),z4G<妹 L $jb`[\vᐇFlD@  Hq`?@B=N=X@DŽNd/y:!5chx,&5q?2W#Hp P IHsS<+MNڙ7]P ˿ D%dP1u* q' %PA_6յd§pYFvٙ ^,MĈn|D/2yY#&R%E8҃iۨI6I\q%;ɞetv"Vk" X뒝['4TТ&j>?QrțwD:2:xP\H n ! A ;b&bh$qpQC oDh3`qĐiT Pv |j|s> S{-C-ea: R_0?% [:ɩ&$&A"'EU!k<@dEcf҄N I W["gltMxCvu}Bܪo$>e ^"2UbNo(ֻM/TD2թab CT{Xsjd'\Q~2]њWa7\+t{Mjnv5UD2s&wv٧"y1h&QgXC~a!o+GWw9k#P:Dҿ0vE}4+ Ja_B :pO>C*w @\VCQi(iYP49Zq@Z+rn; 2ρ(:jU W"PwJ0$ E`F # OY>k\5|/=p% vk{W8_}/yC¦Xޮ 7z;8SF[^hBH[?]1bqud%Q=,zD>,:8kϏ_H{"@S^ճJGRxP\PY;ku +VqV&caĞ△ HfH ̣P?1iJ󜦓0?Hu+QHB #Đ .G@i #ivP;G?p%h@V*83gs"ZǴWlGjU`H{YK߻`ϼ[k@pԳ#n"+]n2p*tVYQAi{JxP޸~Ɠ$;?>.}wr9Ι=ɋn~K͙bVw$z;xxWfpcT?~~cXE8BaP5.01SO`1E|Rpbo w^[Ҳ8M3-*y"!<2dDN2 ?u"ӤZ(Y@"A1eB  !/7LNt0 rr0Vs9x4#epm=;GTb'~G4ics:h^*o 9ĦVZF~"c:JBw@bI\ei2<<̮9 jɄK `DlD!tH]!֥ ОEtMEy3hZJjmC!n"4~,01@ t[4%vJq{`HU𙰽m5ġڤhiXm;Tǐ<̊tTU)T7 rG?|]Zʨ X2`7?vϭ;)t{i2&q@o/FWl[Jv\{]O,[&Tez!FF2"u#ɨؖPt[,%7DRA_kuj Sc"M2[:6bEٟnoFCO>7?mҙ}ף.~R*S݄e$2wr;eT1 y.R—Ee>D{C(a `j}ʍ3B:$rgQpfT^\| 8;.[ac7zMɻt@sO̷ lkq.ަm<ĮG{KrwϦo|;gNgfV7D bgTw#널_]Z]?nPx߰Pw6?c^*SS7*2~`m8_ 8ڹB<56h~ϩ}|5W+#H`Nc~-V(" aF"M!"$b{%P Ne\إd@6v[F]v+ süu7FR;@lh`+O`TH6ce ADAg$e{Q]Ҁ[c(U]: *,[Y}粒դ?b}\@k6-xR?>(TX,]'}Cȿ/eTyOp<7@^"HB0 oµ!0(0D~Sxesڮcl6y<{.ˤU,#AƑ]\JpzuA H -.nfIV##i!:Y<6OjdpZ@3UftNXeو]+O˱M -=SPŝӬu]͒Uȿ{WO&\iGe 9 Y)ђ2 ^2wtz)Փ1"KE˦m>X36q$7>;Z&=/H-={ڹ2떖5,6^\LvkJ|XoROe=֋fdVy3'?[[5OW=)0+DB_-hf\Ȇ}fL&WksRdKG("%qq@Nɓ01yWcš>gln'aQ!J4 :;)Z/8@> jIh mQ͇NWEg?;?5޻At`so:<12v7,1ܫ;qe(Ҿn7/Z]fQ<~7Ȧ O+^"켏O6N5&p!uB=+Tr`4nS^#GxoSXu͙-2^;}M .H.76}#kR[E9t>h 䖘80KwU>$Dh _bMԹTH0A2a420WCq7l A&ŽY 񀄞F@C\W 0!St He  O1d")9yf: H4Kgl,<؊MG~4\DGZd 4]{e0fߩ{EF81g%ɣF%5?rmhؗ>꿉odytgq" $jx^DsJ$@R`GDOE$ z H4ZEYe"A )* l$F\Ω!P˅[ӱc|ywJ4gUIX}/&Uw2 CDǏ7et3HΊ}c<(q-n^po*F 'tR@;惩rkcf#U^%S pʐӖ -k_K4{\=wmvj eX/f%F/I 8F(ͺc֒I8Keeo3btlb~oѩo6x,{|^YjvjGi]޽=oc2[wy>F4x%Oݷm6gwAX[+#$ow Yz)x\ $ x۹Tҽi]"'p-+w\.d^ӐPHh'Q:C(TU tK X MSSD2#αų>ݾxE\bO*;>̝=wyL}+2lljhe篼ٺĊOϵ4~?wа\FZ.}U2ʮ%yocǿ4mӚ^wdC_GWykOg7ZiwhD!}: yh-CgU",Dr !۸v4PD2NBuWyckht3J<GdyEQ J05HpT35=xKˡgdmΓPoև֊磾uJ3z,Ӎܑ=VDz7ڼ6ʳFy3C }kFu\f5Y-xcϞε6|6LǎvKtn ݺ8idilQmhKܼϧvN9]AcRXCzy8Z^jqhT(*C'3v'*'V[Tu@2IPd}BQ,.fj͌ ޹WƤޔyJ\yvng<KX:#2NL 40@<) 0iW$i@CzQCN 1Lv[UKEi1 gz{.7_G!UݜfӉi%G_z0Խ ij6-;n!!qTD5jK4fQ[ײ-%Me>P*"P4yf=Wj?*̏[G}"%7괧GQS&VA(3I))AxL:cbKU K$c4Y D64θa } |+Rs*O ]Rp40r'ܪϋg&k9K,.|ΙO_$zC_d?u1?"uyj]o TaO:% |Vu)̫](-o3nZ+BXFϥ|bY7qU~nR}IN6yiבߡ>tflp[,̽D,1IBN =sdj$?)s~;1%`$fQ$tgms7vM2iZuO(R>WzVhJ>~$Y~Z뼴z!Ğ*J8NGt28d#'H(zQIlzQ9ݏoF/\&}<m \*cjZQ`?Q9af[UkGHKQ22$Q1BN?(@r=8'oj j>.7p[:1o`NiJL64)(T= t^GuzHq:D80.v؄~pj⥷ 9K)&8t*8AB`&h hA!z/(U!A?G6'&-$FIʨ/~$מU#VfX03( Fd\$aG rUG6FgKTX]&|u`q(ޜ,2!FI=̨Dc8v0x3 _>Ii$h"LQFV!*2|n 7ͲwJOYhG[F°w#}*q $F:,39 M(!bISlMB"p$T@ͅP, #sLb][%J -`٠(0"Yv q\To8 Rܞ|!3s[DWNU*/ v ⒚<)ތ%D9N(Ђ,1A[`AJ%J*GvLK:!7ԮzsL%.{1P}/hQtdsZnbYmh֓GwO.hK^\<99-~ՎDGw0N01j ާ%GWɝ+j {Z#o^^< (yq *)w<#&R-%蟕?2EC25NɠwҝcCʐH 42| ` &[ٖqBu|G'6<h6ePxMt㏙iVՕM#6|Wɧ5r-V2c{_~-[PϧR)<3H/ELؤK O==hVVO= ?Ϻ08NkYӍwM=VCIizK7^zmDgB/ݧvoR9-mSg7yiXQGR $aC< sp,Gɋhhi+ Dh2ƒ <,N&0b[:'&P0ΨU7-  (qpV- / HHnXier g4 9qEh(4GϡfS V,J=ʗm%!-NJ4v \6B6d c`[:$YULԞc:%2^Ȗ!w^AK퀚6ɲl"JGdĥ:ed:%rPS!_rJ쬚`I (zNES+dnr[FѪ6 tKJU MOPP1^UpnB r5=GjEZ)|$"Ò?1 F` gtIN|+'v!MC:QX2!66bī`Ӎ3髾B\zD7Ko<ԟWCx$s^w[{Ǯmq;Bb9i ^@|20k@Wu Jxy`ڧr[81j=ޠ~C\xs"LoF,1U 2cL0jLVNvI.<ڌU3_S 1q2QҔ[*;PRLoawf B%FP{"QE(l4: ޠPRA0|5PHgSAcb$*,x,B0Ї-T< 9b*ʂHW,QjB -J V.\hOcSW,  [h*pjH8e2g-j3aq}4p: @7br aQCB 房ۆ3ظSg0AÌXKFǞUL+Ǿtbn7yݵ=G+wiK(0njEM5 +p2FqIM۹晜_#AzطGR:Dp1=\0#AU4 A&&;υ\N9K-"+pJyƺL7ŇC^SM /g5mVvPjSa3e?ފ<7*Jn-_tPhotŒֺJ\u{O̡9ij<$I1}Ȩ{.[ۗ.)\U䄐q|*Em;VV4p ^%5R Tc,b"4p^(r& "nDH g@7KoQF m۽0A ?!(G\@ W!1`W ZH,e *`ǁ5`n٠.V"/ځ&a6]2Bߧ"F#[Eq -w 䏩J"rAjm$![S S/dɄ k"t@C̜C( vVŌx?C6zM{G:˲ѣF]Kykf߱SЭ QܚA TKI:PLML̦9rW+]3xJV"1Z$21!sKgiE$f@Գ5Ĉb<&62ZUT[fɫ 1BUيئW\ڔOҍFË< QΩV=! q ?R+%4^4z(eϗ  qT9׵T=(vPRZ?iKmc9[KR4.؏׵D:;$\2! ;<8bXGEm "%b0֏2اd#9?c$Bw==ڗTM{m8SxٴB~#m)הD[fIc{OUs*F'o}OaҟE2/*!%p"F s Ih p 2\jvK傞uZK/}7FFAByYbHGiYFS?^ohτzބOy|zb} _<$eJ~i[("0N/f 9#)>,3|}&  |Zje+,:c5&,yq3DP*M\u5T ĜP;Fd =l?XMlL*z'8A})KSxS6 P" }*7' Kc]@p97$]Ea /jϰR~1ͼ}kA&iGIHaN_LJ{:FI˜^\qgAP0)zg\jRXI22@}hS @WF}?pxN\/F{߉$6hm&q;RZ\w D1f5IQrw|Y E$Ǵ/A:JQb?c6ԡQCT(OD09ԩO<oO(ZfܶC}c}'%TE_O~{a;R* +ZْlUup;# HёyqѼ6kbD 0E p/hW9֚PPŐvIM8%(h@*`qKġAmpR7yG˜h^Q{eI:οlᇡ0Ҿ.ワ:G 9[fw߳Ϟ͞Ic<'e*<5Fp"^/w2iH9Hk$ .3W֦]meOy3n{7O&Fޕ5oZ볿{ycq^mMjxΓCJ1wsk6C]LR|Kn6{{&j`'Hʿ-FA/%u k&\E ݎXD|A/|˴diRg^6gU_ع:82 O<@$ya gd:;Fd拙Ɲw!#Ӛc{K\4+uݎfٲ?5A7|5긧r_̤gۯ[Z?k}anS.#k6%%>6t14qlr!-ǵlJȌ ޠlTiLND΍ <4c貆w egɛjۭ ,Q4'5w_?%)C=+MANSrO@ p#8#7d a\ 5+Ǽ l<ݛۗo^im|TvRN-BxexnAax uX[HIGV$) gprÅRB8τmc[SC$IO 0Қc#A#Bp{J@v|t*^%Æ4LS1#OM0` s7|gV`DpG~ U噝7*WR qƙ&P(&fd69CV cv sW$3 $d<:VdL_X;85'4UXBwR20ĔFX|F((y!*ma(#&{͉4>]'n*!9|1VueI]D7A#)@>#X=!RɁ jvZ xgV@ZоE )R3ٍ[`4^:RT}i0\WFwJ&!V69w;Fg"mJ:Y4sð3s//T%bϠ"HvXҋ|Cc^0, ]2ZC)`$r (-n<}FBm?\_iۺߑkL]қ.ȵW>03gCVDA>af8yJ90^|Dl|NZDR0xj"bB8ąjAM2Lm.OEtN]>|ԕ֬yrdA0Mj'>c?Jr'In1<` &w/>f׾PNWAٯO8mLţ e뾿G08jڵ:qޡҴ.sqWC}ng%JvۅN}K$ 4K( s@ BN?$dFȫ;Pסd;jLS7Ԇ'?}7b#+3TpbG]!b)6l$ 6 [ qP{鉻JţDc<{ێgPVF?U}|OnDy =Q] {;,"-[1SR,exbeq{wf왫EG+|7I/sǩ}OE$F^vl݃gڟ53rܘb3O sA51,uIfނ-TfQP`%:Gڣ\vzQB4{Mj17Y)v8_ndq*4镫ݼ?'=[ $҉׆ntЂ*^rtFIO|0yg)&vȪxa_Lߠ eEpOsH__ʾ%4c$+<ud.OJzOeExdehC}PX*$玲uB+Vw~4uձ 8賀B[h9w .c*A׆,xO@aVImNzTx@FE<3wy pK84xS{ Vn%aȭh2>qTx 3vԷqbj>b \XPe{Qs[$oӆ`KU/fY[ Xqj'w>xPj`dIz\}@''HdEtNQ: vt:O~EXP@V0gI"(QO"ոJA.O{bRp<_GՉU,zK~n\hEFR "gd؃HR SM-!1:Ix ;qe > 4чŔ=Փ ANj8{ ` Sd/R L$L:AOۆ(<%_7'Kz_"~=>$OƫoSwi``kS @󂙥?_` /z (L>S ^pjWh8|Zr%O,/}g}難=ش=v/ (?Z^X'ˆxOr& 3a٢v˺\Z2

zOc/aD J Zh]`_i]E*po0zڶKN.EC7 @ q9Xk#Jy_CF[&cb|s, zWUZGrV.fNߒhu' GQ> hȼI3Gh*\鋳AYإLĸNsvB.ho\81)q!{PQ\Cj<|!v ޙlͺ#$G*ɌCE$=Tڣ) <SDV. gL|a#M&] 2`ns4I4_G3v{M:ks ԡsd]S7zsߒ^cѫm:Eyb2US`R:tY^Tʚq߯㞼ޫ߳ շO ҥOr~2˖םjénS8+a}u83my}v7nQ&C/$6è)!)h>h? iXAi-+BR[G}a@F2ڍ=6WlCX[D{M\1"cVX H ;/l]Nz)b MMCtwbt[3^6ekd(M_B^ЇKS)};1VGk0r6 j5ςUr |eKvU1IѢ>t$B,: Vი DM%ܢN|w%*O2S)IP E(GFrK[_c}!ڡRq1ۯl|.Zv~K\oY(a !t9K૞ّo5Z&(@5,Fis_i q< >`#f\1.AHxfVJ PvY;IU2(w} _[r:_:`+=9uFT\ȀM 36%% I`/ >|x~Ͷ58ƫG'+;N\pbG/4nnQ^cwX-y>>*!Wɷ#f. [7*eNW^tno~rVc=ľ{q3⽲괈8a"H2}g!ӒzKG`zhvϗɫ[X]x&{dmEL/X@5& PhP_(ANK@ 8X6 k L ȕ{_c! d'qBDdp-TGT|y  8:H}O7daV (l 5BP-W$z5~*;uA0=^"N8"R$ȏk]#uXEmC%QO}sXz Pb G(K-[c{=¯~q4 4x/ "pnhcɣU,` TtJ 4$ea/Ny"'C\i (ĨwxcMg"!h&W)${NRaJ\-N,0p%Ҳ"@;>} lfcם|lw1ZQ!Q;kb> /Q*4 'Jytuv!Y4}ja:5[ݞlG<|^z|L@ˌ뵛:f{Rf;iʪ$5`[#Q<ط &)5591CT&g]߷f69fr+-һ#"El?[A;f7\uhgeכd]&ɻe"Z4i0\b-7eWChgX]x9=>M"l4-GdȖ%z#Z[cf"Y}V I1C_A{z0 q  Hnc~|@; EV-I1+&){B4Ugdĩc8x"̡'KӋp4߁&myE9dݦ"a{['/BF߾)7N7עC=?/9Ԉ"cj'-8z~bz**d)SN[h[tbP72M (H5GMG0CSԡ<-)lfGBxSaS* 8%@ * aŋZW&덠W(UZAB$pC1H q'fX3t?ѣQqg uĄB밤5n[<0"C1o\7V&Fo:ԦEWťZ%=`w5wgN,캤E.|cC9>d;o]x$#4<;c7UD!IUc6$A"k'!i{3uU%6G.BeXG \2V誠B+>T@ 88riIc,Σ``gCsW^[rlX&. ,Δܞ._0*|j=>RVI4#uɄ5Ov9)|vey }R>]TPJ }$l.wLnDƿz_Mo-J94~ygV.&@_ѳDNc()Q'ԏ2W.LN‡^ [߿2ݛv޸ߣFgT؆\aC+V!xepEҊOUcvx[ڏ"Z P@̤j|a =AU4x _1@`.sj>yxyyg~=cpiЍovƀ_~H>w!%yMA)oE+`mD80lC@psw d@ 0ж+_%)G lhe*{6Np؏)0^@ia"h  dD8M@b:ُ?#7h i& k gFyZN^3zy<@^IՍD]D2d:8x\CR !*ւ}ir}6:`f$A *s~'3@tV=rQ}^_: '?Œ"Տ5xl @3wO~j#-兌ҧfr:H2iG,7![eOJh|[b!3 #6K*q>VǔꨗS0%jfg&X̖ 0迄xQhM`{ᮄ{MPj BN5D}:ᥕqW' )J#_"!G[6bۜ+Ϳlq&^Mox}!EO.WH̵:44!@־5ͮ3jXr=&i?y^G3{sTmqKHa&gqnUh1B8LLg1(!tJtqDG:' DDR+:4ĤFbE!CI҄AApH} }$ Sh1;xKd8_2H裡By9K?-܏^,ڽfn Wu|zWGeofw<32VDSWfy*>{RPͫ@ǿ6l7;lVF%>*!~Rg/6eܳK(LA#Egl#a|%;M}F0q#4Q'߀*'PX&\mP @wN.Z `-+{##),\`qF؉=Q)lyQ;dSj^}#ˆyۼox%vc6I7ZP}gQT]Ͼ)Q!rÐfn ~I^F,_{i(o]yӏV5JmfExc_9)5/F'}#g{~Ǎɹun =f4m5sNHɗEkI_rެ'1pDX~гSDPj2hk9FB[T}YvI (3z_6K`X%wR h.Vm͙'``l"&hJHD2oq#(W(Bwʿ,r⏯Z#9hz!6o \7b$<]h2G+{{FmjϊUD!r5 /dh&7vZܴBҾ-ܓӟ}2en& Ͼ|\_.O&"3l3_bОEXeJ6)ijz&' ڸcͅmtK֭F:GJEddeŃ SC }J]"|f% *HG8{KDp`}PAJL@pp+!"d\ADe(H:D<$Vw(^0' JPr'@K<QM)O1_Q4 raBʫ/-%VGvSR">>H$J9r)s;شп$ǦypIomGL J:ue]e)*-@dQ+ 1 %x۽1N=\ ;DWu"lahD-xAx01N+ ̏n!"TV:B-A`6CjO  !!x XGM.[Gݡ?㱤DhA4ç܍SSAs"ؽ1+\ZȹzL`נpn}~O4k9f|J&y4gAR)F^qU.ͼDDZ= t9; {>l7., 0]>N#!5wѓxJPCf\kje cpNfK,*P|JE -%O3/%'*F,n,m_(8Z3&{j̏cҊ"lcVjcdDbȔx-bF8HSkW洫vIoXTZVfA*X4eM|l(tӰB ,i4(TϤiL FT)i_H8T@ٔCJ9(,G+z,n¹_ԓvD6Ҋ`HTܾTC$ޱ01RW(v2h4Ё= 2BH@pFwD]n{[=L*x/J"W2 A<]Y*~v6S )'5` QLC_wTfoHئt4޻q@#uW` ]6!@2u4lr )F o 3]?BfZ (&eKlPV!4 :D=HC.APM0:PCf_E~FA^^P\blژG+οD=.N\>69;T=Gy㋗SO5=gwbԋr}A8b;r:d$PP^- ' 3Qj+]@96͈'2NY\ɾڃ|L2˟4=k\cn$7d pLt2 sw* rHs Ɵeq|'I[LGpe 3=WSl2"ϦCkٯG;TM!s!wKv&D^ Ra0ܴK/uIO:g~ѵ0i<4PF^~;;-u=d'VE\j[d|wK߳b#7Oi:hQ/+zBsQ!$_v#7%BE_ Ga)?L.sm33>'r]4DLPvJlTM喫ڠtXB 9PF$0z9YCaLpNFgȯz|N(-XV#{#,;Pw,ܱ闓cSMŠʤ޳sp.ʜ3 \;^M=kNTg>}2軥h^aLNrS\#WIN=Tf,N 3@K$R:G퍤7C-I2:+7BlN9OEc\{zN67qCyI.6P.ǕEx d3mj7 I8~RFn^M=EQ:&;cH|U PiH{:qdѢL=sWaƽI772@OonSpRLͻ]ARSm/k6E9wir#ly|WN.ßڴ|v^?,AQ%Y ~_R;H,@jQ$WfF!_jmbƑv>T? @UK#CH  p)M  a/@$FaD)aݨWdxK`B4!FiݎthzG%) 1o3,C%R.c0^-lI)1qؼܩL@=!…'k/u:"ig68C' V0w#v@-92;lk6/ tE 1\kqsM8342}!Fޘꁄ}]03f]6IRWUu6qnZh{QGԺF`UO:dO]р.`ePX4# C ;ȥ|+ӻcV (VL# .wKxx~냃/]ً2-uӓmFS޻{E*8ꭙ"L#;Gސg<gQynjY[L"7c@~ÐFm;BCI:X7]';!h~8 S"Ϊލjr!q">9< @e؛1X%M!a׮?[\HdmE]C*F:v/O ]}egBf^l$'Y)RXƟ#̉ϳҿڱE0}+LtU)wWW _J;fo@McG۩EJ8.V?k!})07W{y Ne徏zNWjr?%WE/YO"J"E19gu?vMR3*82oaV%Y`09ɑ ` ˀOP瀒A\.: 1D_/!A TJhq oH0)jrG6=^\5zjeAD Or\#CWj(T{8iV|Wĩ*Ӝ}!9a Ǥa&dAve1HD僜T!RT'-, u'?ZRQ $dA):le7%^ Of |AMD4"5ib‰Q:|$t>=6Q޷nD!zfDrnA:b!Zʁb^~K^ՠfFcM!Pw49}q~/橞&{&@ADC@T*Ǯվi`=Z&jэ<L@zVِDBQv߾6oz;1BG\k]ɪ <{Q"6q]*Ω%e"j{LO7Z)wuwU.OW(猿U2[olN2//Pq%.0 O"bP Qр'R1u aV%FkJ%.XeN`[ ⋘Yv[ Il-"(хJCzTj0T@@6_#;rw9rqN4Dي FJyhٛ:xGl59Aϲb wzy{z}BCOxpDgZhrsٗ LU4<ؐ[D&"Q (31΋͜Zס:NQA /{ ;:8*n}~w߻s?9{ {t[ڿu۲x}?+/}rw{Ovߵ}[_n߿߿U;~7iy_~_oo}/\迟N;w}97{/qqp6v]\2fnY4]μ;ީ7D0D0q-_~_޿oOg|cXS_u[m;zk]ۻgn?ҝX$$D`@@;haqqqqqq    I$I$I$I$I(J$(((((,,,,,,,,,, ,,0,0,0 0 0 0 0 0, 0 4L0L4 0 0K0 4 0 0 4 0 4 0 0 0L0 0L4 0L0 4L0M0M0L4 0M0 0N0 0M4M4M4 0 0 4M00L0L4M0L0L4 0N0L4M0L4M4M4M0N4 4 4M0M88M0 4M4N0N5N5N0M0ӌ4M8M44L4M0M4N8M4Î8M4LC;C=P@=A@C<@@A<<@C8CA=AAAA@=?@=A=A@C;C@>A?C#Ct>C@?A ?4C;@;C?C>@?C?>C=C?CAP?? =C;A C;C? C?C4?A?<?C$>Ct>?>@>C$>C>A PP!PƐP19aÐCt\yʐ? Ct?6C?C=PʐÐ$?"C$?C?CD?%C?ېԐ5iC?C?8C?5C@>CA ;A@P>CC=<APCAPC@=@P@AO<CCACO=(na\zmzzx3Mq U~IZ/L,te+0Ufz#]uY$@K\(Vlx!B@20ʟ](K~@rY~*hjO0x D@@!_H1^UFh\&r6 @hEP~@t= !K< ~L 4P~C @@F,inhK&AB 1=pklY$d@(qIEA6U<%|%2zXDV܂X,UƉ~I\وP*r, 6ݣc&JOsɮ1.2N`6.4}-`0RȒyB#90?&:~N ;9 :ٞE9&Ǻ}7*%`3bXM}>ۣ֗StrOFi'NUN8Hm_X@G*<ɥW[LlT&~Cԛ JYvr/a [+BNYOuڬ:2,)yGfYpdw#jm 1-i@>Ssϩ#-YnL8A $ hყiqZ l/^dA@:0UD AG'ޗ۫׆PhQ[GR#B~yW{bV'ڕ}hjW'S"$*Tl;pXBN+M9PN?ͬeBW92ZT]1ם,b4AMQ (!D[5rtơ9:ֱOw )|U!joE[E ȦOlmBHC .!2sWe䦵@aK~CR.1EL+tžiCω彍kܺeG*M'N ;_abdۂ/2aӻ /&K)6K.i/u^@P;3W:55'Qzҋ\_˛cmHmMe>)y0V\# Q0PQҘSz@~죓ⰶKYo^u5Z֣XC:$B_w*_cN#ӯϏ8Huf\vIl֑F'JϚB>m,Ә3CM|Z{0((|cdRCq*"ҳ-9pi-?b֤#"v3j;z70-̍J0T^a2.6ɑ>InulʞuSU݄ڪ[Vm6X\6 }dwUW+Y^gc05-Z퇚ݮ:MNfN,ʵ P``ӂH3r_e_d/(Q!8GmcA+%ʢ$X]n޺$e4:#c&i\^7E@"&/Hn=S!CB$PB=#8}G82~e~ô!"*J[ WܲҔX:*4I] 9REZVox +t]|6y t/-Zp~ӛ$8I}$l=dDNPZn-Sܗ릺 o^lmVX0(0u`wd<9&.8*voz KpOѲHMKFށN2%$0x4^ϧ)k]RN!"F'$tSm917 O-*C::9Ct(9 vE "_ Ɵ !AEc{ӊdr=G6б@* P-=2>s:G{=W(`v%3ch6=ĸ_xw v9GQf4p!#D੯> .cugk\_-Hzk|zQ wC>;r9C*Tnɿ&BNrd%a5F jFKH,)l:JvpH4 捌`(( LBHwM24lRS,,y0m 5@NAmưuAe`j}ctn6GX yםrHPs7ӏg|zlPH lL'$O+lkYa=DV]L j'ҏ7_8tͯZՖ`ba濔ȔS){G$6WʖbƏEuW{/iv?:m6/=Swy9TviyjNr5;*_Rێ}׌~Ro.|''ˉ )Nhb|"JR x+TA2F@hqWXN1rgaLW(4N, $ = (sv/eBr61$v8DQv21nGZ6h0qC`|Imuӯy 6:Ab΀-235%Agtwb$&Qt~Q苏XV5T+rSIs oK5dQŘIyK @ädZc%c6&c)`8_m#@Ӂ'gHDw0yW}]?insH :ru _=ks4296gEFT"tVoۛҼ;5$XNhJK /CL(Hr}Vr(ɡۑ91G#rq3D~ӷTЇ#^@PI0SYRB졯dULxDl>2#*V9z#Ǐ*I;>cC ' *5|EUVIkiהudġW94qiBG-Z5S9t1dvJfy3>L!c'Pstx3E Uy%ڊC 9'1=n_h)Adl6^+/SN  S| 4F:>" x{P/5*AԇH |9 oesCv3&` K $$h.szix2+//=gՍzJs|'IZE9ƣs $}}+DJeS(6N:bLklk7*~kEqʒG~y3qX蘧4<䍹 ߶>\jtUl!Gd@7DzD  'Wl?9m"Y6?xTvmfKV-߱=Ȁ6"V(L8/XļgzsWo=¼"/NpSz ؒ2YW19)huV{|`R- -s:*(>.͞,czQ+(TBw;.!_G~0slR]Ov`Š(Se/'HŮ)\gJNKEQy.d^Mc=c?GrRoҳQw.%Jѓ:8I}wUN>dsF@4ˍi3QAY @AK"D#$g MALO@='3o9nT?fR"9k)+X]x!I fB> $K . (؞_wa-FksQt%,n!vX* $&)c@r#"m幙4fvvFxd;wc=D7Z/P2kO5X'9QTqK#}7ٹQ9ٌ؋`|V/Zc:fay|Xyu7vīfo} )[:sN0O iCY65'%~ MxЄ "rW!Q ^C&̔ +=*7X!~ fMDOc`A`tG?IR Ĭq t4CP { ؗ" Aq+ C2h>wo=DV1m,z7KWtKn*>#LofSfHa|X(1ir`n7mցr@,h:RFsfgਉ&ґ#Z[e hϱ祋-֝sf+kC6~mGǀ<#[LYYXeV$Fq%Y('`,$3|҉ESLQI|6fN nPjlO hNDH"8I10Ÿ('"qf#W~unlkC! Pza8͏'%`[X*x 5BҸuá $Up\0IA( xKݐ `'` &Dq`nP5r>SU5J^2S҇cSe5l?cL݉(1 /nN\6|M+q6$]HJ)!&9 sGB-WB%猪OŦ A/?7F&!Z'gߙH"R eFl'`-ƣ;HAL g% x)J3Zvc/#BlU4=FqҟbNu2ױkmt哦7JQJ^z4ETE`&m ۖgvڭ}aniݙ5v1tYe^;&mq~]o)ʼnQjr{Y޲r{4mwd:0[B "#D:>vׁ5ґk;XUޝj0N3f;6V/hy~"jmo3so-*S1ܫ95p|Rb/ &fy}hlt=~ 3*[|i)sx]o;C|d'9Zb$ڭw~}!ȵhR~l'*mMYmQRrޟkˬ5R"̺ q&[J_^7mWmhcdAOG]jkMWoӯ5U;W003*:' !7 6PCRM4~P*MDjZeLrW e'T0HL%6x%F H&@('O1!?fdQB=8 0sOj'zF*B}dV ~cmn ŭpKE w/Œ\L]Xnʆ~+brB2q)$o jk?gv,C~i,lV%,P raM(IX>{ K!; Ob]'ꛞPմLᵲ5&02:ln+?*YIbDvYY-_z{R44 QۙH6<OUA0śz4S Yh7 4/!F &aVBhC턂IBfdA%E𒙧YDz[ՂHP5 # @[y]C; ij'*@D<ބ;aďGs@ rL@UA p$hDP;w#KC,e %,$#TdaRQalp.eC%jGYG'U$NBKRAQrBU|oFQּLzV ;|Ap-$[JŁDk=n h09!,sn<)ю <!:;Z d-&B.ʻ[rT0됽pk_5$߅1m'?m5y[YIq1-^mO!*ӵq'\HH#1I<%<ӝ*ܶy?Dtvͫ eCx0S"fy ~Qˡ+nxH^ASvg<*&l4Zqh&uV[(hUK[|\m SԌ>Tt70i@aT R*'61ua 5dGG s6HdPe"g'T<. ǽ#WQgC{=fDpqQP΋_LUK;VΌ91"f\e}u{-&u۶edt5Wທ`8!!o F-Oy!q,q(ha)_)GD)6Wk䨲mCeχ!اD轒r!R$9 GnF2`w;FFzƢ9A GH 0-h*A`gzD룁v$xw98\( X{\, A>؇"/ g 8- O /[-xL8A0 0>D@jsU)dTZ[Ϋ6Anu<-%FeLPpǁg~fp| 6=6SoqPܠr`]ʷ.Rf4:d>D,dSTOclrs f3IΜ qn-N{K̀WehW಺$mvÈT{zL[+{y՜*o̺*'ú@3":4:)r n6KL{Tc9P:v'P=L);Y2~Frjj;)#xȥ#%}N{m>Poێo6$P|QxvSmVyn|q},sR u|jv(=( ^^ }~HAu Cl.yycI䇊2MNf{Wo$weBAj̟~ҞtS)Jᑮ,*[ܮ c}4=nͰ/ҙ_Uv&fXw0M$D "Pzc7 h4Q+UAGLg'fǖϫzpLPiGPD 0@I(}d*0, ACHƂ!8k`#< ΁ +C:3ҝ76V@ȧ\"2"K=֍Rs;?/ )$D*>0l R-?gcFMz>]껙.l hUMrtO86`%*K0&S*^W.w5\G;Xohe?Yco /ȟzy'j&Zع᫭mF5<ЅpQ%X)4As {KJ@U'Q˵McGTz7$Ld6 %  mI{oxePX+nX> ߮v^;7ʹOSO]_*tNȍׯ)9S1݃'_eH[o91k(ض㓞55mqխWw潒. 4=}-:_#£tzY݈1ʝt3&|Qm'_2PFdk'KHeq%"?_u/g#uPeí?bP ,"ѷA1ІR>\t/I43ȎgS~Ld ` hW(@GgL/BXY7,j&q؝^@Ft %j V8 'SMo) i$aԙ) -y*B=LʿpT@Cev0ysDٹJiڲ[Q5~4'ӕ@ngHVc Rpr 9@Xɀ6⻘Dj.$XJ \4PzB55I"RG؍-hPeC xCEKh_~J Y肫;Km$LC* cS!{(Ia'ERZ?NEpHAD$r؇|a].EfOg5b.bwlbWcHWA-KFT&ZRx5J9iP@PiA'΍904e/?;}*]d8avQ7! >28@FVr DkS3YUߊ7FB33AvIB胐^T2D:G,ʔ\1"c~i犭V-3˖.Ǒfv78dӖ%ie%{|'-UTQI OFCg%ޏlӁ܊ΎadpT"~Hę^)9_c oPV-&Wv| \^,*m"%ȋIrÀo MZ1c613{OCI+ P1,l0ʑ@\t.n/ETXn0F-8(zv\E,z'"^ g!=)Ri%P䚇 13*Nuu3+wIR>*ٴ[Z6cuF+Gi]gUnERgD٘18S?xY뇉YX #:5δ u)3?PFD$E5E꛵rRf}zw]\ $X1?xՓ83rx=OB| I̘#I?>v ;k3Y&QҷXX&wB%\g꩓~u؎vזE7ԽudQ!7دrWٗ#:a; Dc2," sirޅ,x&lϜݶ*i 27j<^ecR8'k⯀z+ }:#zzyNPnlMI _Uױ T뙒qI@Bj,Pe9o t0$ DF@$31Z5C 1.%Q$FBdbe< L jjiDNP:vFF1M1xF`!a ׹2D V^o`mfҨ ! Fd0>ca]گl65`+bv2- cQR [n [3İ^p](|9a :&C$Mhفe\%YN|ITUlMa]U+_ ,Ѓc)#ZmOW}i&騋;).cn'ۭ,ѧԜSqChUsg6AJ{4mZŗTոYap"`xI8:Ppf1b-PP(BcvFtm'OyBhMh̕6D &d@4^u1 gxCڮMhsD1)2 ^k#-$t'F;z|'BtO T WdOȠbSL˃)d4Y/XFХ6{Yz (f:Э^X*H^0 2eIEPL.N[C09J MOKeB*TSoT ]$Qh*ltDɘlo+s?}PW-s/Ip܈FnǑ6|r&XSI4r^]։"f[TY 6r0eg+79Ur*Z6hA4DL qN b^.MwbZ^@MUO`⾡ 57'wG\Ȯ׸ƣ'VXx[Ǎc!G77T8/@e zߔNd/XOwR@Rv\d3W:R=cn:/" ~rVq~uU]Q>翷jq̨F}n̗3 0䇄#W[N 35$[RsmYDdDL,(Q(@TCt0LA$HhRH7AT7N3 ,x (pGd!~!T=%^1d`Q dG #.2 \Nb5oYw֎S2Q\G2 g# Ű6 ekZvi(P*61i1OpPI-7nF/]䆒/,igZb#-!2t5=X+/B0%,@`pN\U"DPBH"HQh|2pૺZ*w7n5pS@-ͷ! wކ 9%\J P[z ]CYM >B{4l Q-%`eLuW<jM9-01/l^;jIBFҽYt׻P^BΛP%T˷'wa9WB$B+|<%_0Fm '[tIo:ϣ?uGݱkbsMxwdYߒo.U(zK*8`h۷_g O,,WtN&[gۅR#^3ICMUn=)ͣ_\ |p.H0 pb5x=TSM\vR"Ÿxy*o$ 5~$#_ @('Vf |Iٌ69,.Eq êq2 (_Q )F@~w LXwi"uE!'+HFB R=#F#lbS1(r@St=ghs[Rc=Q!ADt#q[p2H[-9,rp,VeM׹Eo]1uiH ~yFB\ۋo:V;w =,5n= ڟWwRn| -.Tl$ńjO:kMЉA7_{Wbvy#qYYӄ|q}GFնL7D͞ _ӑhdM}K]xܹ\vpN:^mŲ47oTv24قrYbG. 9 )6sVX@DěK$lt|(H t?0ڨ ֳ<kl h$c"Έ hr G=_,wĸ.@Z' Cd X3u#V-r̒2 G`\y.R jT i^ZV*&Xv&eKeY-HN=8)NZR4PO5ũ=0[XF+;rBsKQ4`#K88A!3u;D5yz(b`Ɲ`\KDhtD zmAg/s!ŐxYF#aE&>q)7,|Ot%~ڤȺȋGm/̊o5u r|x閝GE֍obDzWih{;-PvaJÝNZTQ1pLd1.F7q͓)#D`kā^a>v3ڨ3GY2[(I Ll5L`Ƈ!^gU5{eOP]&g0*4TS94P̨K!ED/^Ā8goZR^|HxJ@س!] PP?PRρ @ TCӰ;ȏ O853Rdd}u"={~԰^s(NiHNX_@efg5||%h(D*+?*Mn{@qz" ^J$tLBjOP6oFtzypV;6Xtoz (drϢP%c~ҝlh'!0V$#(uQmԊDw1 (-zh]zA )oS~['f_Jv?J8*p^vڒ<[odƟ5:R=>8f>\aziw>;veEy~%S~,fź~`c NFv\ys!B*VEۚg*8c=W~J"(iϝ,{i9r7, <)H⮎$#3Xn]!褤*-pÇj*`D

݈͇ODE ]1- d!33|(Ez>#rl0¢dC*+CI=V, &t{h>4nF=Sc׉"8bWF/\pۚ? XLApOMsV h'XcDrf'z۳g zhɁHڶxU>&^?+e}͖&w^i2cF al-מ]8ȭ;Mj;7d׶7"Zqli~6WZn-h&XDd"x 1 k [P@ }" ZH<)i N RIHsrp'QB\sIIM!1+-I|AMnau=Z 0My8ZϘS"pY}#p$BUwQ>d%Poc RuI='T 0Yp`b\)ISbj+0& ^)Dd*LK#hŰhewҵK jQڏ&mm6otym/jeUhV š&yS>SMhiu ,Ct.ax>R6=1H#5?MmKZҚ!ѝHGnڲ3ɏq:}Wq&^y$\3~X`gxGWU17R}QTmʋ<"Lح-L*5Bs1Ҩ.5dO% 8Vi;C%?mS bC3 =+ `{A426ilƠ>pjJE ' p0 YXXXcf28\rآQa(d+ YLAs i^5N CXc8,?#]?O ߅.:#/4`&`Sc 6"EC`c:X7UԤW(K=΁% 'pI0#F:hP?j1NRJR/ JwT8[&xh6 ?RK[S9hnbU]R bW^[MmI&-Z&n;K_ʈq皁,#U ٮh=+YZ0?"[[j> oJ൰CoY{vftJon9X.r(se5Uw=yO[qGh~A|DVmxv1AL fYȌ>S:HFdŔ_,$Tw8s;29_|l7ۘٺ7,H6r#pmNK.,upN {4ߜskV\s͠/ 67cMhSMgj/~ m,++HY:Ap=}&u9"1sQ!IhH77jd2g|%G>QR~=6n5{ u)' ʧ9A%g[Fy8%)rϱF~ê=1AX P}]uҀfϘv1Y  7f`0h !jH@aN@~;jH;@]NXuk4:~`@\PlbzA h;`c Q%0>@g660` *fTS}:7F`c j@ \ \qBYq +V@}=P>(#˜!M^bg~UAL|\!h5Ѣ `TֆNZ(Aj'"|L7,0;@2 PPt0 eX2"xA ӿL^DhXe ԙ H\ (|eDQHK'shJ>*iEԒ0*'[Iދ$2!I]SJ"=%[T=ʧv>koZƧVF Rrcw2g]{}];4JdbD&B7fSk| >6$nbۛL:ylz\2[g$!0} PܢDLtvrflZ¯'1Z|w³9h^cH?׆s'f9R}7kj96EA N0z'uk"+x "r'I*Wd+w1G%ccم0sG#~5*Ȗt)@G%/2Yxh@$J'1%%,3`r:aㄍ< Zw t9XHC'\qш"X@GrGðAމTClG΁!ۣ'N6VsKeV@"50X`CE&ög~W 4=dZh@=yw_iX\oVZsI^ShTq{/lB_DߠG pXy1 C_8rw,6XN&eYL:( kUy@4g ůƈ>3f o5 \[[4y\صϼl\rv]Whm?0:3|3ˌ<0vOOZ͗TchI 6JNu^Y']n7nxtfu]>""'N&1ք@qc :A)DѾ /L?3.V)Η3G 4lu}nHZ8ZZ~|ӑ4ff*?7ڳ.%60`7jxWxkK] TjDV"O* qMjA8PPX?K-)V??.q't#wV֏,WwwAVJQk cvjgGZ?;Ҿ:uX.ɥ+V{gGiFŠMno<4Xm:(@plRɮ8fb.,&cAj-u4ݑYK v$aw' $,CR. g1D(>nגs)QzG$Ȇi06K1lscƧijbd`YL T_T@O+o|_Uu٥Gߠ>Ŧ}[zƝyI,r/]"϶{)(6T-o4#dIlQnmqw?] !֦UYBcϷsG7p;ްKѳ^*-R3š;f! P/^kJ9,Ty}ƥѷ刺CF^$tZ-FEj>w͎v=٭p]GzI{7: 6K\q<@CfO<洎Q;YƯ_/(헤-n: S-lϓ,ιSk[ӹ^3R*KNڭ"8esy"Zo_zɳ=if#9ٿYSXR]vma׫y@AwrH#p)`>$@Ȓ$^55xX9Pp|W qJS{qFEa5Н@APOTp{\RZI, 1>U@'bIBAc!yo*?O T6`a"sQtكN_gjx> ^l3:\+tA5~}b#_:JwWh\ퟬ50.еؐێ= _lZ'rfթ$>ey"d䲴XNڼ~ggHc;.iA>,m4Jְ e/۟Wn#ޔcSi M]UV#<}Z䪋ioOQ: *M?gыВw{m[-pFf A8_^~sˑO#j5ƦŚ"KIt$?CpŚ\ꙮҼ4OUs\ӡnz< ޒ^nսJ|7yx+ \oϾKꑹ[zz (zqw,Qn^pJu=_oKP $)&VD3G  )j.Ep&1 D [41ڐ 0!6eArmX'̠|" =u`o@r\V 0*EJ 0.Zp3P CpER4^_gԏ@# @+!5XHgwX;t+3_]ΟșV2]7Ɋn3GzzB,l`<2i[h peB+H-3P21qPRtE (v~#WZ0Kg@ad69fyJr~B~7@57a8e,`Ot?Q,DȾHWMht72`@ǥ7w>.m!W 爚Y4jETz|T֞%.,hqijtE*Ta),ܽ)M^/[jPB׻Lg6vEO+^~j=o^Se[|ӎυDnq3ďnpbe{JŃ?+qNT\lzJ%uė5$#Dhx߂IJC3o`B@yg"49dlC 2p8L/@xF1,AK4REQg/Y6,|@ dPE1q H+nbNuG?yZH$jÃλ^.`:Fi05ڋD?~w\~#Bś\@Rö5E.G޿}mxyA*G,!D/98CR)LQD)kϧՐ.eX-[4(ǴِLlC$prǚ3;m;c?\kהUu%\%'r7OioNórz3ϥ~fq>/ȱgKOt jMsAax",VzK&T͓KBhSi娹τ2ܷÊpGBa f,.IUVIcsP%3{ .]lq/On ^iͷnW(*z]i&E|W^FCu$8Z#[w7JS8ϗ]BYI1\V=@]C͉筼? b (0j =N D#w2ovZ}{ri/;  |ȑjxr 4h3_ιoZ҅ӟuo _>vYڜ>G7Uw'siI%RpYRC܍Sm7dTc+b*??}M@>2|TkSֶJ$DEяenӍ4=)>ޔNS;&לJ'q odFMf˥>sb3l+SKO~=hx~ΜWnz=4k؞Ĥտ;Q ǝz5CVw'8\v#.Iry2y_whgţ34tX:RG#"cJ ϯ$$>IR^%\aѝif׉бa[*hپ=>\BNh##?bNH C6:=ʶ%M&8AF<o p000KP 2jBC^T L=I20`›7A ,-?Y5Ai*ӎVB02I2 rJc&!\v+${ݍjhŇ]rY2Z NJALIQBYF Fm^ tP28@B "-%s}Х/3*!],b"(”3;9D3Dڊ;; GC)hf~5-fh"? <18RZNg'%$x!j#3nQAq uٷR7lIwೞmA8k|D2T;+da;3yw~3ɤ^U}8/ω .&Ѥ>R/W'Mެ0Ƿn5?SV]r0h:#7q "KpC2w2r*pO_Ubvi]] ?GO$,AA;=m;AStedU3ߋ(9Ɂ᎘b$`M ?HyȀY#\%:>"I/+ G-XVO*-&7bfض%%~Wwӗ; ,oNqջ(8p̺]kpz=/,qU8u+WTc'+Tê}8 x -fcӧb-{lm( iY{j9f9f*0NOT޲vBPe5T|](K4:iVD RZC}Xj9,2k%\bAv4{=HF9r[τXؾWm+56;$e_yScW`]!( Fr`Fid`lvFH@fH 0@8Gt!C,puh $Ā 0(r UU̱ Ů@p62gzᅼ0w+>.o+=BA_ oP=Gq'TӞ3t[Pe] r eݱfQgNOa2KkkzǑs!clڬ |513PjW1QTt7W Xme+ (٠Rۋ^qjٝG_J~|h;SUJll|ɜ4DpTe&SZCm[4mO}=?pǤwXb@Œ3*[,*Y66#B=6ц_)ӐD0Jl|`ܞ.z<Z>5\ߵ묆v^#Ӿ ]cܩHdypT~F/iAqiC}Yz6{k_;ۗs5FMn_Q"YlyqBLoϸMH zA#?pPɐHs @-GqPY~f[ŃEڎ^\Cl Gq7jF-`AA)Y6|6/fhM B6Ѓ"`|W D!Ա'z2AOk_oP>zӍ-OJzm=]U)#}9㖫%ɥ45v=i/H;L; i;*(R]9zt+#nqE6uloQG,$_T?$nT:>qt>w|q~2>"㡳KUmsW}ntPm`0`L8EBC@NfE鿏 5G[1BwR?SZ~pg'{ٗD $[=st+$Nqrٙ\C0j e\3@2Nyqu$@m-9帙 h!xJ!\Hd+C=]Ct~JRHZv*N:pZ(&+s54Vm'cl?W|p?.~eC~o3)3w{ў^KaD`7X\}.#>R6)[z ~ŭ#n+>Q@%613H#WbMZ36RlX/KłN".ͼ,XhvxCJRaPo'Mg$x'9'acI5QB)IVa&FcckeU_* Mo9CbTCVTfXR]_ċܤi6/_{K&ƗjLБ3o;_?a:Pѽ묬${DXb =ĞmOjZ2gĆ&H`5$ -ч%deMyvt7,j(‡:.5"]5MD;zW)؜@a;ET&jľ#< B"@Fps# LTm1siUѺ3cȾl lKoT&/+eKפS۬+c%?\؋g&%UL*,DOy1r#t?ʶ= ~%ӍA$+/||?/KʾO}9EߡwOB#5YPv{B H<Ţqg"M/](I&4ͳMK׏ePT_$xb@|z۴;_)4p-`Lt/^c3=1I4ʒz|D"8}1 ݩt }1)p"Pb2^ePFl2(&k GNux_ߏf8ճ~ΫId՗֝=_/w6qB룢%xnhD)׎}PDWEw:,2 w J):V68%͓U7!R'kT9doKPN"3) yic)c* qP9_lw({~po,Bi tL%E+C$`B7/y.QՂ4@k$(>D "tPua 6CP0^ T+ev~ax˽6WO6fFm/#cxx+5J7T7QlH`NAj 1n)24J,F/Z1]0%HL\}{Aw{`ik?V-ܗ$6sDT?CsLGfx_-O wN4c5UU9;gЏS%a?Q|`nu|3|8?}vyNE(Q׷`Y֢o[}+p~Vv:bC3Қ벰QC$LLY>'ٗuI)ʖnz~;Q*фj󏸊&MOȘ=x & pa C +IrB+jpuq $%FQn k #!%R 1v݌kFY%wdЌ)Q "ϥ s@O]Qo9Oz'$T$Z6Z:|P_ l"[)J3RK=8hE>CV,!DGwԖ#1fR 0 mݼ8_IP\^KЗ&>X&҉cKr#3LaR|cN V MJQfR:KUnQr&>x"92I^ ׿E_' $Oqp=2ܕ}asBi7«gJN}Eyߎe%džK6LqjG5yEUN)TC77NbiLdHea]OAA_#4 (]\@c UxDHa"agwC>U'^eaΑtwPtbGl׸L0ܦV4j<49N&5Mik{p@"T x?Pxb?8prAT- 0q(D8yf]I8g`@8A. 2!2 ($5Զ ,\3qFKIY("9h(Z9C *1C]3mY^.T׊xP­ )k QbCE;TBg޼,S[Ⓟ)8M(tiV<a&I@ "K$?EJSBvKģN4%Dnε4X)Iչ"Q|jMdζT_H7CZ)jk7=#q/hK"y>wvi{bg>LL Xed\7ݦt["NËx)*s)5Tc׋B 1ڎ18Ay |*Iz݊:6Zܗ״]4'LЇPk\=ako^fY[wn̡m4:M4!#ǯ%>Z{Ji6CzzMOXmG:ٟ*{ަn,m0Q$!ɟ&gEKCWXL w޴}^~SCxP'blIo:d Lړh1 ȶ΁- -/1 R=0?13b@L1uf C1>Q.%K&1ȼ'cw><YPRN ZDu(") A3!O J1p44KHI6 F`a<o 9]{UeUӊBIn0=)5o+T$ŘJ6Zs!ڛkjtf⏥N߷aw篹+e?b}V~~/YڹisQ1\ n}g4 HӉPiPVJcg@ڋ]0E`T.*(!THJV0R h#,Y)3/[vS"QY"?CSν 2)@jUOh%#İ"Xʚ, a'R(ʑZtQ Z]U^r{+p.*n<6Hᄲ_#b>./X P o/!@ ҆Qx! @3 } ?i. R @3cx887oR XuK }#ƧFt?k9dЦ]1ۢ;r^w噷 $~Y#7Ul.,5ބM xzxƲ=.#DOH?rL+>lB7b\ 1hFw9U_7t{ ƅiE=3] q2bxc)=l%f3"EXCA41ptO: KV4]s/yrk>#,v`jC\΋7.)%":gcP}?ջ=t)w|fծԥ955f82U/>l? [e׽2=8Z%蟛TLKpr1'+AғD*俈h 'ܧK'oX`P0KpH\d1&XqsLܘ鈖K;Zmh}M#QkOFtiŬ.~ m{e<ge6[eiic!9Hs:',/ݔi9dSڧ? BKe72cӅ 5"Ƒ \?bx0\rFxʴ#qT}F= "g-`]C(u9qmC隑!6S3EZ8$̒?4W)̛9_L 1C/"W+˾vD\D%#8^3bQzB |o]&=-FS=뚞O46-1_R!P` &V%MߓBf\O~(p8\TB7BrSYEV-L 3gS1bg8(==}Gp$'I#s:9b?uL[B (2P: fF<dStkP8BׇRa,2pBV?xptj!⋝Z- 6̫:Œ,S"jW)dܟN3\\Z^u&mm5HQm.EĀ %"R!c?F!BuBG`ƛ*(Xx.(| .%d#ƦuԍjeO7-`TVn6Gd/==Ui5lq@~rv;W:4E2=CM=7GkBH(P.0yZaw(tnTgh"Tֆ} 3fsd7 H_lH?8 9tyY}'Nd{$`n"0rAbH&7ʲemÔxͅpeeJ{ͰF?D\NAHQH7#Q5-o6$7c a L@[$:(X@FvJ*Eܪ,C! l~14x oX0` ,a0363t*R5c/h($/Oz 𼼅Ѝ^}7(2O/*z0^7B6%K~&hYԬ"wĔ kMוq7~Lj7F?o>aE~~E@F ZL&@Kl@jl^J8Ia`XA 9ԎHY11껶 uSQ}j#[O Ue ;dxjLFS}6~c$+;5ǽX"N[Y_d̦XO^mDŽuPmx{)db̮JeN~ȩ߳T7\R lf/(SҪN[;E7ZCܢ1J<3tCҟ"|{w|֮jhN~#0y9[UEZq[#ۄ/>oCի]Z l}Gꑴs7<vɽJF]Y L)< 4͍qm{DŃM)+>@;zҗ1)AŽU<o`ݓ`J~AUx/Wh=oȖK~pХ єWWPH_ <4|la)4n^:uڼVwpR5gʅԾ9=9nez`cQ?؁ua4pWkmtT ~(2/Կ"4'ܱ|/5WAU #Q9zĮ}3RTAVwuu :BRS]^M >6Ϊ'u΂7>ZvʓTn?E0<]Dd.yR|/>UP"QlbUPw𛶟ϵ~4S^Ȉ~?X7:+{D&sUQTO{10 :}O:?ޝhqmtM:'(y7I 3DЫ^<[aYQORhnhd qĹʎgClm^YQgRZڬAHwI 8rX P(>\cjüLߓ :4t:(7DP7{lPȔN I3pcSMA Bx0_2-\C2B{;6w;0jmq:|^@n|"en_oz@iö68@qs a@uõ8vu,W@ <jC8AUv0uE6"6e6`\z arR6X§Lϻ#﹩.^y]k; &noyU>^9bOy퉣.VIKDz:xNb:?fv͹ cb[%^oӣ+dk]tܢ#Tzf[Lsͺk#t eLWvc_t tFuyڦY?:_AM%~&.<;í5?H{eFt"Nk.Lo)=z'g!!-s悀ߡxZ`&c'rV<̀P z ]ذn,sjVv΂L*o) ?6fPB0'󨐅V)|FH܍g*|xS$uw? d_RI홧˯M&jY[xV萤_Wwͨ(ɑ\k4GF*r,gk,0P}; #R -YVn.Ou t;Wtq;0)Y%MtLᴉ̘۴^F^gy=V"σƔ Y z2y$Q[3m;כ:<8/wq`eh1.9=Ɩ}Zf5#wAОȺE;x G>ZT:6g z)M|sTQ6Chpղ,]3cs[+lKoKeV<{s&S{yS^K~9ìwW2<5ߧ~0-t$gfw}1H,|p"i(N r0\f\TS"/ 1REmzM~[Jd=+X\vxG-1 x9!06c)`BLDhÀz!%: DiƐJR]!y<5b;@ĉS Ǝ$U*ptJ"}~yu՗,EqǬ1TXn@SYy=7q@$er۽kV{jz%x'N O;pp }<4XC 2pE$Ao %Ú3.;Iw2ЀC_0 %ç!|,ӶYx_6j*4bK9*/`nepਛ!R13?kYdžԝ s`^Z3fM۟ҨZTQtv:_R_sVY"{4kgDIB+>ݺ૞KVgQLnNWKϙ,gT|Q@LE8@}Ay `F@`b5/rE _bKbHv}oo\ِtA&/.0&@S WSHjyKCm e&1e4y!'O0~'ǂ.3Km)3&XĚ-[D={L&唭@rb+PyϔueUh K) <cW$Q_$0J Jn0+")Ԃ34߱i%icמƴEQHF&kRɟ#,ڥh/Q^sm JܟP OWx7 M,L(D>PɗU%uЭEbas!*)nB8t7zqg^NvOloERfYG*g\y3r T.QD/Djݿ= b:lvLO} iӦEV@aFVLwe׫e3m}4noGY<޷(Y4%]f_.oxtl8H랣lH@fW Wš$#iDX DEA׮OΖyhRbܹuvlx PU<`>@8+`PCi301 @$8D)ހ~7A,< M"xup7rqfdtK_: G`9Wz-8E>iߝ>m90ģrLf֜UEys1ॽFdHN,2h^՚g 0jA"/⵮f{;${5*MAؖ锘EGKM}O-aЍz¥ɕ -KbI O\s8O=s;ňΟon0#[+*ܿ&B&#FM̥RCdƺLm=(Z_o6/?ΧO(GoS 7 !p8btVJu2G1~T;~=\}+5en [VvkpG.8{BGSN;v~I[d;E OQWl񞆊J+)QFn'`@Ч4Xk00%qm I$E.',2|&q6ژʇ):E^B 5@X;sh˫gBG &N鑚aZea;oDF8CC(b>u~?ޒD΃ ?0T`A>J_1(5\\}ƒ(r]hEYv:WN;QirSq듽o_4I޵/ZUmO??ܪlftMdEF|#*q 0KUDtAE^L'39~Qg+^